From ff5f75dc108cfbb2fb566cb9df9b33ac743b682d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C3=ABl=20De=20Boey?= Date: Mon, 10 Jan 2022 01:18:21 +0100 Subject: [PATCH 001/233] fix: pin `colors` to `1.4.0` (#11274) --- packages/playwright-test/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/playwright-test/package.json b/packages/playwright-test/package.json index 30528659e265b..05bb0a9d4b78d 100644 --- a/packages/playwright-test/package.json +++ b/packages/playwright-test/package.json @@ -46,7 +46,7 @@ "@babel/plugin-transform-react-jsx": "^7.14.5", "@babel/preset-typescript": "^7.14.5", "babel-plugin-module-resolver": "^4.1.0", - "colors": "^1.4.0", + "colors": "1.4.0", "commander": "^8.2.0", "debug": "^4.1.1", "expect": "=27.2.5", From 4ffca363a90370e39dbd0be07a1225e800d9507f Mon Sep 17 00:00:00 2001 From: Pavel Feldman Date: Sun, 9 Jan 2022 16:21:16 -0800 Subject: [PATCH 002/233] chore: follow up to pin, update package-lock.json --- package-lock.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6bf8ae384f076..d57d2775d93a9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9152,7 +9152,7 @@ "@babel/plugin-transform-react-jsx": "^7.14.5", "@babel/preset-typescript": "^7.14.5", "babel-plugin-module-resolver": "^4.1.0", - "colors": "^1.4.0", + "colors": "1.4.0", "commander": "^8.2.0", "debug": "^4.1.1", "expect": "=27.2.5", @@ -9966,7 +9966,7 @@ "@babel/plugin-transform-react-jsx": "^7.14.5", "@babel/preset-typescript": "^7.14.5", "babel-plugin-module-resolver": "^4.1.0", - "colors": "^1.4.0", + "colors": "1.4.0", "commander": "^8.2.0", "debug": "^4.1.1", "expect": "=27.2.5", From a423a4a9ede13dfa7b842a0ca0e4ff587bb149d9 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 9 Jan 2022 20:44:07 -0500 Subject: [PATCH 003/233] feat(chromium): roll to r956323 (#11268) Co-authored-by: github-actions <41898282+github-actions[bot]@users.noreply.github.com> --- README.md | 4 +- packages/playwright-core/browsers.json | 4 +- .../src/server/chromium/protocol.d.ts | 1 + .../src/server/deviceDescriptorsSource.json | 92 +++++++++---------- packages/playwright-core/types/protocol.d.ts | 1 + 5 files changed, 52 insertions(+), 50 deletions(-) diff --git a/README.md b/README.md index 0861c631c6241..8fd018da820c2 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # 🎭 Playwright -[![npm version](https://img.shields.io/npm/v/playwright.svg?style=flat)](https://www.npmjs.com/package/playwright) [![Chromium version](https://img.shields.io/badge/chromium-99.0.4804.0-blue.svg?logo=google-chrome)](https://www.chromium.org/Home) [![Firefox version](https://img.shields.io/badge/firefox-95.0-blue.svg?logo=mozilla-firefox)](https://www.mozilla.org/en-US/firefox/new/) [![WebKit version](https://img.shields.io/badge/webkit-15.4-blue.svg?logo=safari)](https://webkit.org/) +[![npm version](https://img.shields.io/npm/v/playwright.svg?style=flat)](https://www.npmjs.com/package/playwright) [![Chromium version](https://img.shields.io/badge/chromium-99.0.4812.0-blue.svg?logo=google-chrome)](https://www.chromium.org/Home) [![Firefox version](https://img.shields.io/badge/firefox-95.0-blue.svg?logo=mozilla-firefox)](https://www.mozilla.org/en-US/firefox/new/) [![WebKit version](https://img.shields.io/badge/webkit-15.4-blue.svg?logo=safari)](https://webkit.org/) ## [Documentation](https://playwright.dev) | [API reference](https://playwright.dev/docs/api/class-playwright/) @@ -8,7 +8,7 @@ Playwright is a framework for Web Testing and Automation. It allows testing [Chr | | Linux | macOS | Windows | | :--- | :---: | :---: | :---: | -| Chromium 99.0.4804.0 | :white_check_mark: | :white_check_mark: | :white_check_mark: | +| Chromium 99.0.4812.0 | :white_check_mark: | :white_check_mark: | :white_check_mark: | | WebKit 15.4 | :white_check_mark: | :white_check_mark: | :white_check_mark: | | Firefox 95.0 | :white_check_mark: | :white_check_mark: | :white_check_mark: | diff --git a/packages/playwright-core/browsers.json b/packages/playwright-core/browsers.json index 32748fc1ae3bb..f0594f0565288 100644 --- a/packages/playwright-core/browsers.json +++ b/packages/playwright-core/browsers.json @@ -3,12 +3,12 @@ "browsers": [ { "name": "chromium", - "revision": "954870", + "revision": "956323", "installByDefault": true }, { "name": "chromium-with-symbols", - "revision": "954870", + "revision": "956323", "installByDefault": false }, { diff --git a/packages/playwright-core/src/server/chromium/protocol.d.ts b/packages/playwright-core/src/server/chromium/protocol.d.ts index 642347b4be532..1df89e52972f1 100644 --- a/packages/playwright-core/src/server/chromium/protocol.d.ts +++ b/packages/playwright-core/src/server/chromium/protocol.d.ts @@ -877,6 +877,7 @@ instead. This standard was abandoned in January, 1970. See https://www.chromestatus.com/feature/5684870116278272 for more details." */ message?: string; + deprecationType: string; } export type ClientHintIssueReason = "MetaTagAllowListInvalidOrigin"|"MetaTagModifiedHTML"; /** diff --git a/packages/playwright-core/src/server/deviceDescriptorsSource.json b/packages/playwright-core/src/server/deviceDescriptorsSource.json index b3fa19b13a70a..487d2e08255e0 100644 --- a/packages/playwright-core/src/server/deviceDescriptorsSource.json +++ b/packages/playwright-core/src/server/deviceDescriptorsSource.json @@ -110,7 +110,7 @@ "defaultBrowserType": "webkit" }, "Galaxy S5": { - "userAgent": "Mozilla/5.0 (Linux; Android 5.0; SM-G900P Build/LRX21T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4804.0 Mobile Safari/537.36", + "userAgent": "Mozilla/5.0 (Linux; Android 5.0; SM-G900P Build/LRX21T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4812.0 Mobile Safari/537.36", "viewport": { "width": 360, "height": 640 @@ -121,7 +121,7 @@ "defaultBrowserType": "chromium" }, "Galaxy S5 landscape": { - "userAgent": "Mozilla/5.0 (Linux; Android 5.0; SM-G900P Build/LRX21T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4804.0 Mobile Safari/537.36", + "userAgent": "Mozilla/5.0 (Linux; Android 5.0; SM-G900P Build/LRX21T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4812.0 Mobile Safari/537.36", "viewport": { "width": 640, "height": 360 @@ -132,7 +132,7 @@ "defaultBrowserType": "chromium" }, "Galaxy S8": { - "userAgent": "Mozilla/5.0 (Linux; Android 7.0; SM-G950U Build/NRD90M) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4804.0 Mobile Safari/537.36", + "userAgent": "Mozilla/5.0 (Linux; Android 7.0; SM-G950U Build/NRD90M) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4812.0 Mobile Safari/537.36", "viewport": { "width": 360, "height": 740 @@ -143,7 +143,7 @@ "defaultBrowserType": "chromium" }, "Galaxy S8 landscape": { - "userAgent": "Mozilla/5.0 (Linux; Android 7.0; SM-G950U Build/NRD90M) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4804.0 Mobile Safari/537.36", + "userAgent": "Mozilla/5.0 (Linux; Android 7.0; SM-G950U Build/NRD90M) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4812.0 Mobile Safari/537.36", "viewport": { "width": 740, "height": 360 @@ -154,7 +154,7 @@ "defaultBrowserType": "chromium" }, "Galaxy S9+": { - "userAgent": "Mozilla/5.0 (Linux; Android 8.0.0; SM-G965U Build/R16NW) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4804.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/99.0.4812.0 Mobile Safari/537.36", "viewport": { "width": 320, "height": 658 @@ -165,7 +165,7 @@ "defaultBrowserType": "chromium" }, "Galaxy S9+ landscape": { - "userAgent": "Mozilla/5.0 (Linux; Android 8.0.0; SM-G965U Build/R16NW) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4804.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/99.0.4812.0 Mobile Safari/537.36", "viewport": { "width": 658, "height": 320 @@ -176,7 +176,7 @@ "defaultBrowserType": "chromium" }, "Galaxy Tab S4": { - "userAgent": "Mozilla/5.0 (Linux; Android 8.1.0; SM-T837A) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4804.0 Safari/537.36", + "userAgent": "Mozilla/5.0 (Linux; Android 8.1.0; SM-T837A) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4812.0 Safari/537.36", "viewport": { "width": 712, "height": 1138 @@ -187,7 +187,7 @@ "defaultBrowserType": "chromium" }, "Galaxy Tab S4 landscape": { - "userAgent": "Mozilla/5.0 (Linux; Android 8.1.0; SM-T837A) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4804.0 Safari/537.36", + "userAgent": "Mozilla/5.0 (Linux; Android 8.1.0; SM-T837A) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4812.0 Safari/537.36", "viewport": { "width": 1138, "height": 712 @@ -828,7 +828,7 @@ "defaultBrowserType": "webkit" }, "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/99.0.4804.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/99.0.4812.0 Mobile Safari/537.36", "viewport": { "width": 384, "height": 640 @@ -839,7 +839,7 @@ "defaultBrowserType": "chromium" }, "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/99.0.4804.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/99.0.4812.0 Mobile Safari/537.36", "viewport": { "width": 640, "height": 384 @@ -850,7 +850,7 @@ "defaultBrowserType": "chromium" }, "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/99.0.4804.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/99.0.4812.0 Mobile Safari/537.36 Edge/14.14263", "viewport": { "width": 640, "height": 360 @@ -861,7 +861,7 @@ "defaultBrowserType": "chromium" }, "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/99.0.4804.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/99.0.4812.0 Mobile Safari/537.36 Edge/14.14263", "viewport": { "width": 360, "height": 640 @@ -872,7 +872,7 @@ "defaultBrowserType": "chromium" }, "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/99.0.4804.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/99.0.4812.0 Mobile Safari/537.36 Edge/14.14263", "viewport": { "width": 360, "height": 640 @@ -883,7 +883,7 @@ "defaultBrowserType": "chromium" }, "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/99.0.4804.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/99.0.4812.0 Mobile Safari/537.36 Edge/14.14263", "viewport": { "width": 640, "height": 360 @@ -894,7 +894,7 @@ "defaultBrowserType": "chromium" }, "Nexus 10": { - "userAgent": "Mozilla/5.0 (Linux; Android 6.0.1; Nexus 10 Build/MOB31T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4804.0 Safari/537.36", + "userAgent": "Mozilla/5.0 (Linux; Android 6.0.1; Nexus 10 Build/MOB31T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4812.0 Safari/537.36", "viewport": { "width": 800, "height": 1280 @@ -905,7 +905,7 @@ "defaultBrowserType": "chromium" }, "Nexus 10 landscape": { - "userAgent": "Mozilla/5.0 (Linux; Android 6.0.1; Nexus 10 Build/MOB31T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4804.0 Safari/537.36", + "userAgent": "Mozilla/5.0 (Linux; Android 6.0.1; Nexus 10 Build/MOB31T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4812.0 Safari/537.36", "viewport": { "width": 1280, "height": 800 @@ -916,7 +916,7 @@ "defaultBrowserType": "chromium" }, "Nexus 4": { - "userAgent": "Mozilla/5.0 (Linux; Android 4.4.2; Nexus 4 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4804.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/99.0.4812.0 Mobile Safari/537.36", "viewport": { "width": 384, "height": 640 @@ -927,7 +927,7 @@ "defaultBrowserType": "chromium" }, "Nexus 4 landscape": { - "userAgent": "Mozilla/5.0 (Linux; Android 4.4.2; Nexus 4 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4804.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/99.0.4812.0 Mobile Safari/537.36", "viewport": { "width": 640, "height": 384 @@ -938,7 +938,7 @@ "defaultBrowserType": "chromium" }, "Nexus 5": { - "userAgent": "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4804.0 Mobile Safari/537.36", + "userAgent": "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4812.0 Mobile Safari/537.36", "viewport": { "width": 360, "height": 640 @@ -949,7 +949,7 @@ "defaultBrowserType": "chromium" }, "Nexus 5 landscape": { - "userAgent": "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4804.0 Mobile Safari/537.36", + "userAgent": "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4812.0 Mobile Safari/537.36", "viewport": { "width": 640, "height": 360 @@ -960,7 +960,7 @@ "defaultBrowserType": "chromium" }, "Nexus 5X": { - "userAgent": "Mozilla/5.0 (Linux; Android 8.0.0; Nexus 5X Build/OPR4.170623.006) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4804.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/99.0.4812.0 Mobile Safari/537.36", "viewport": { "width": 412, "height": 732 @@ -971,7 +971,7 @@ "defaultBrowserType": "chromium" }, "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/99.0.4804.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/99.0.4812.0 Mobile Safari/537.36", "viewport": { "width": 732, "height": 412 @@ -982,7 +982,7 @@ "defaultBrowserType": "chromium" }, "Nexus 6": { - "userAgent": "Mozilla/5.0 (Linux; Android 7.1.1; Nexus 6 Build/N6F26U) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4804.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/99.0.4812.0 Mobile Safari/537.36", "viewport": { "width": 412, "height": 732 @@ -993,7 +993,7 @@ "defaultBrowserType": "chromium" }, "Nexus 6 landscape": { - "userAgent": "Mozilla/5.0 (Linux; Android 7.1.1; Nexus 6 Build/N6F26U) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4804.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/99.0.4812.0 Mobile Safari/537.36", "viewport": { "width": 732, "height": 412 @@ -1004,7 +1004,7 @@ "defaultBrowserType": "chromium" }, "Nexus 6P": { - "userAgent": "Mozilla/5.0 (Linux; Android 8.0.0; Nexus 6P Build/OPP3.170518.006) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4804.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/99.0.4812.0 Mobile Safari/537.36", "viewport": { "width": 412, "height": 732 @@ -1015,7 +1015,7 @@ "defaultBrowserType": "chromium" }, "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/99.0.4804.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/99.0.4812.0 Mobile Safari/537.36", "viewport": { "width": 732, "height": 412 @@ -1026,7 +1026,7 @@ "defaultBrowserType": "chromium" }, "Nexus 7": { - "userAgent": "Mozilla/5.0 (Linux; Android 6.0.1; Nexus 7 Build/MOB30X) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4804.0 Safari/537.36", + "userAgent": "Mozilla/5.0 (Linux; Android 6.0.1; Nexus 7 Build/MOB30X) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4812.0 Safari/537.36", "viewport": { "width": 600, "height": 960 @@ -1037,7 +1037,7 @@ "defaultBrowserType": "chromium" }, "Nexus 7 landscape": { - "userAgent": "Mozilla/5.0 (Linux; Android 6.0.1; Nexus 7 Build/MOB30X) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4804.0 Safari/537.36", + "userAgent": "Mozilla/5.0 (Linux; Android 6.0.1; Nexus 7 Build/MOB30X) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4812.0 Safari/537.36", "viewport": { "width": 960, "height": 600 @@ -1092,7 +1092,7 @@ "defaultBrowserType": "webkit" }, "Pixel 2": { - "userAgent": "Mozilla/5.0 (Linux; Android 8.0; Pixel 2 Build/OPD3.170816.012) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4804.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/99.0.4812.0 Mobile Safari/537.36", "viewport": { "width": 411, "height": 731 @@ -1103,7 +1103,7 @@ "defaultBrowserType": "chromium" }, "Pixel 2 landscape": { - "userAgent": "Mozilla/5.0 (Linux; Android 8.0; Pixel 2 Build/OPD3.170816.012) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4804.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/99.0.4812.0 Mobile Safari/537.36", "viewport": { "width": 731, "height": 411 @@ -1114,7 +1114,7 @@ "defaultBrowserType": "chromium" }, "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/99.0.4804.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/99.0.4812.0 Mobile Safari/537.36", "viewport": { "width": 411, "height": 823 @@ -1125,7 +1125,7 @@ "defaultBrowserType": "chromium" }, "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/99.0.4804.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/99.0.4812.0 Mobile Safari/537.36", "viewport": { "width": 823, "height": 411 @@ -1136,7 +1136,7 @@ "defaultBrowserType": "chromium" }, "Pixel 3": { - "userAgent": "Mozilla/5.0 (Linux; Android 9; Pixel 3 Build/PQ1A.181105.017.A1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4804.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/99.0.4812.0 Mobile Safari/537.36", "viewport": { "width": 393, "height": 786 @@ -1147,7 +1147,7 @@ "defaultBrowserType": "chromium" }, "Pixel 3 landscape": { - "userAgent": "Mozilla/5.0 (Linux; Android 9; Pixel 3 Build/PQ1A.181105.017.A1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4804.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/99.0.4812.0 Mobile Safari/537.36", "viewport": { "width": 786, "height": 393 @@ -1158,7 +1158,7 @@ "defaultBrowserType": "chromium" }, "Pixel 4": { - "userAgent": "Mozilla/5.0 (Linux; Android 10; Pixel 4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4804.0 Mobile Safari/537.36", + "userAgent": "Mozilla/5.0 (Linux; Android 10; Pixel 4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4812.0 Mobile Safari/537.36", "viewport": { "width": 353, "height": 745 @@ -1169,7 +1169,7 @@ "defaultBrowserType": "chromium" }, "Pixel 4 landscape": { - "userAgent": "Mozilla/5.0 (Linux; Android 10; Pixel 4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4804.0 Mobile Safari/537.36", + "userAgent": "Mozilla/5.0 (Linux; Android 10; Pixel 4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4812.0 Mobile Safari/537.36", "viewport": { "width": 745, "height": 353 @@ -1180,7 +1180,7 @@ "defaultBrowserType": "chromium" }, "Pixel 4a (5G)": { - "userAgent": "Mozilla/5.0 (Linux; Android 11; Pixel 4a (5G)) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4804.0 Mobile Safari/537.36", + "userAgent": "Mozilla/5.0 (Linux; Android 11; Pixel 4a (5G)) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4812.0 Mobile Safari/537.36", "screen": { "width": 412, "height": 892 @@ -1195,7 +1195,7 @@ "defaultBrowserType": "chromium" }, "Pixel 4a (5G) landscape": { - "userAgent": "Mozilla/5.0 (Linux; Android 11; Pixel 4a (5G)) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4804.0 Mobile Safari/537.36", + "userAgent": "Mozilla/5.0 (Linux; Android 11; Pixel 4a (5G)) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4812.0 Mobile Safari/537.36", "screen": { "height": 892, "width": 412 @@ -1210,7 +1210,7 @@ "defaultBrowserType": "chromium" }, "Pixel 5": { - "userAgent": "Mozilla/5.0 (Linux; Android 11; Pixel 5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4804.0 Mobile Safari/537.36", + "userAgent": "Mozilla/5.0 (Linux; Android 11; Pixel 5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4812.0 Mobile Safari/537.36", "screen": { "width": 393, "height": 851 @@ -1225,7 +1225,7 @@ "defaultBrowserType": "chromium" }, "Pixel 5 landscape": { - "userAgent": "Mozilla/5.0 (Linux; Android 11; Pixel 5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4804.0 Mobile Safari/537.36", + "userAgent": "Mozilla/5.0 (Linux; Android 11; Pixel 5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4812.0 Mobile Safari/537.36", "screen": { "width": 851, "height": 393 @@ -1240,7 +1240,7 @@ "defaultBrowserType": "chromium" }, "Moto G4": { - "userAgent": "Mozilla/5.0 (Linux; Android 7.0; Moto G (4)) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4804.0 Mobile Safari/537.36", + "userAgent": "Mozilla/5.0 (Linux; Android 7.0; Moto G (4)) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4812.0 Mobile Safari/537.36", "viewport": { "width": 360, "height": 640 @@ -1251,7 +1251,7 @@ "defaultBrowserType": "chromium" }, "Moto G4 landscape": { - "userAgent": "Mozilla/5.0 (Linux; Android 7.0; Moto G (4)) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4804.0 Mobile Safari/537.36", + "userAgent": "Mozilla/5.0 (Linux; Android 7.0; Moto G (4)) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4812.0 Mobile Safari/537.36", "viewport": { "width": 640, "height": 360 @@ -1262,7 +1262,7 @@ "defaultBrowserType": "chromium" }, "Desktop Chrome HiDPI": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4804.0 Safari/537.36", + "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4812.0 Safari/537.36", "screen": { "width": 1792, "height": 1120 @@ -1277,7 +1277,7 @@ "defaultBrowserType": "chromium" }, "Desktop Edge HiDPI": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4804.0 Safari/537.36 Edg/99.0.4804.0", + "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4812.0 Safari/537.36 Edg/99.0.4812.0", "screen": { "width": 1792, "height": 1120 @@ -1322,7 +1322,7 @@ "defaultBrowserType": "webkit" }, "Desktop Chrome": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4804.0 Safari/537.36", + "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4812.0 Safari/537.36", "screen": { "width": 1920, "height": 1080 @@ -1337,7 +1337,7 @@ "defaultBrowserType": "chromium" }, "Desktop Edge": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4804.0 Safari/537.36 Edg/99.0.4804.0", + "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4812.0 Safari/537.36 Edg/99.0.4812.0", "screen": { "width": 1920, "height": 1080 diff --git a/packages/playwright-core/types/protocol.d.ts b/packages/playwright-core/types/protocol.d.ts index 642347b4be532..1df89e52972f1 100644 --- a/packages/playwright-core/types/protocol.d.ts +++ b/packages/playwright-core/types/protocol.d.ts @@ -877,6 +877,7 @@ instead. This standard was abandoned in January, 1970. See https://www.chromestatus.com/feature/5684870116278272 for more details." */ message?: string; + deprecationType: string; } export type ClientHintIssueReason = "MetaTagAllowListInvalidOrigin"|"MetaTagModifiedHTML"; /** From c0366803fd69839ed98a0526cbdb9d02af54900e Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 10 Jan 2022 03:24:58 -0800 Subject: [PATCH 004/233] feat(firefox): roll to r1313 (#11270) Co-authored-by: github-actions <41898282+github-actions[bot]@users.noreply.github.com> --- packages/playwright-core/browsers.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/playwright-core/browsers.json b/packages/playwright-core/browsers.json index f0594f0565288..6579da0d75adc 100644 --- a/packages/playwright-core/browsers.json +++ b/packages/playwright-core/browsers.json @@ -13,7 +13,7 @@ }, { "name": "firefox", - "revision": "1312", + "revision": "1313", "installByDefault": true }, { From 1dbf1c287d3305f5870372ea874e77b454f51259 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 10 Jan 2022 03:25:52 -0800 Subject: [PATCH 005/233] feat(firefox-beta): roll to r1314 (#11271) Co-authored-by: github-actions <41898282+github-actions[bot]@users.noreply.github.com> --- packages/playwright-core/browsers.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/playwright-core/browsers.json b/packages/playwright-core/browsers.json index 6579da0d75adc..44cdc32239a28 100644 --- a/packages/playwright-core/browsers.json +++ b/packages/playwright-core/browsers.json @@ -18,7 +18,7 @@ }, { "name": "firefox-beta", - "revision": "1313", + "revision": "1314", "installByDefault": false }, { From 5a325a5a1dc2dbdcfae75bc37d36c1c6f94b7cb1 Mon Sep 17 00:00:00 2001 From: Andrey Lushnikov Date: Mon, 10 Jan 2022 04:56:50 -0700 Subject: [PATCH 006/233] test(gardening): disable mp4 capabilities test on firefox (#11289) Firefox is unhappy with our mp4 file and crashes / moves to faulty state. Upstream bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1697004 --- tests/capabilities.spec.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/capabilities.spec.ts b/tests/capabilities.spec.ts index 20e70304dd0d6..4a743fdb260ef 100644 --- a/tests/capabilities.spec.ts +++ b/tests/capabilities.spec.ts @@ -119,6 +119,7 @@ it('should support webgl 2 #smoke', async ({ page, browserName, headless }) => { it('should not crash on page with mp4 #smoke', async ({ page, server, platform, browserName }) => { it.fixme(browserName === 'webkit' && platform === 'win32', 'https://github.com/microsoft/playwright/issues/11009, times out in setContent'); + it.fixme(browserName === 'firefox', 'https://bugzilla.mozilla.org/show_bug.cgi?id=1697004'); await page.setContent(``); await page.waitForTimeout(1000); }); From 2a975e2475e07cf7a18d3698233c6fddb7d3e104 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 10 Jan 2022 07:08:25 -0500 Subject: [PATCH 007/233] browser(chromium): roll to r956935 (#11284) Co-authored-by: github-actions <41898282+github-actions[bot]@users.noreply.github.com> --- browser_patches/chromium/BUILD_NUMBER | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/browser_patches/chromium/BUILD_NUMBER b/browser_patches/chromium/BUILD_NUMBER index 535574cad5d1e..b58faf14d252f 100644 --- a/browser_patches/chromium/BUILD_NUMBER +++ b/browser_patches/chromium/BUILD_NUMBER @@ -1 +1 @@ -956323 +956935 From d31f13468aaaa968b96be6568b9fe8de349c4130 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 10 Jan 2022 05:02:07 -0800 Subject: [PATCH 008/233] feat(webkit): roll to r1592 (#11261) Co-authored-by: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Andrey Lushnikov --- packages/playwright-core/browsers.json | 2 +- .../src/server/webkit/protocol.d.ts | 34 ------------------- tests/page/elementhandle-bounding-box.spec.ts | 2 +- 3 files changed, 2 insertions(+), 36 deletions(-) diff --git a/packages/playwright-core/browsers.json b/packages/playwright-core/browsers.json index 44cdc32239a28..8e339c00ff365 100644 --- a/packages/playwright-core/browsers.json +++ b/packages/playwright-core/browsers.json @@ -23,7 +23,7 @@ }, { "name": "webkit", - "revision": "1588", + "revision": "1592", "installByDefault": true, "revisionOverrides": { "mac10.14": "1446" diff --git a/packages/playwright-core/src/server/webkit/protocol.d.ts b/packages/playwright-core/src/server/webkit/protocol.d.ts index 9c0d62ebd6a53..8ca718ddd2925 100644 --- a/packages/playwright-core/src/server/webkit/protocol.d.ts +++ b/packages/playwright-core/src/server/webkit/protocol.d.ts @@ -7256,36 +7256,6 @@ the top of the viewport and Y increases as it proceeds towards the bottom of the } export type deleteAllCookiesReturnValue = { } - /** - * Returns all local storage data in the given browser context. - */ - export type getLocalStorageDataParameters = { - /** - * Browser context id. - */ - browserContextId?: ContextID; - } - export type getLocalStorageDataReturnValue = { - /** - * Local storage data. - */ - origins: OriginStorage[]; - } - /** - * Populates local storage data in the given browser context. - */ - export type setLocalStorageDataParameters = { - /** - * Browser context id. - */ - browserContextId?: ContextID; - /** - * Local storage data. - */ - origins: OriginStorage[]; - } - export type setLocalStorageDataReturnValue = { - } /** * Overrides the geolocation position or error. */ @@ -9068,8 +9038,6 @@ the top of the viewport and Y increases as it proceeds towards the bottom of the "Playwright.getAllCookies": Playwright.getAllCookiesParameters; "Playwright.setCookies": Playwright.setCookiesParameters; "Playwright.deleteAllCookies": Playwright.deleteAllCookiesParameters; - "Playwright.getLocalStorageData": Playwright.getLocalStorageDataParameters; - "Playwright.setLocalStorageData": Playwright.setLocalStorageDataParameters; "Playwright.setGeolocationOverride": Playwright.setGeolocationOverrideParameters; "Playwright.setLanguages": Playwright.setLanguagesParameters; "Playwright.setDownloadBehavior": Playwright.setDownloadBehaviorParameters; @@ -9368,8 +9336,6 @@ the top of the viewport and Y increases as it proceeds towards the bottom of the "Playwright.getAllCookies": Playwright.getAllCookiesReturnValue; "Playwright.setCookies": Playwright.setCookiesReturnValue; "Playwright.deleteAllCookies": Playwright.deleteAllCookiesReturnValue; - "Playwright.getLocalStorageData": Playwright.getLocalStorageDataReturnValue; - "Playwright.setLocalStorageData": Playwright.setLocalStorageDataReturnValue; "Playwright.setGeolocationOverride": Playwright.setGeolocationOverrideReturnValue; "Playwright.setLanguages": Playwright.setLanguagesReturnValue; "Playwright.setDownloadBehavior": Playwright.setDownloadBehaviorReturnValue; diff --git a/tests/page/elementhandle-bounding-box.spec.ts b/tests/page/elementhandle-bounding-box.spec.ts index ceea022bc7df6..35426f1b3d639 100644 --- a/tests/page/elementhandle-bounding-box.spec.ts +++ b/tests/page/elementhandle-bounding-box.spec.ts @@ -39,7 +39,7 @@ it('should handle nested frames', async ({ page, server }) => { }); it('should get frame box', async ({ page, browserName }) => { - it.fail(browserName === 'webkit', 'https://github.com/microsoft/playwright/issues/10977'); + it.info().annotations.push({ type: 'issue', description: 'https://github.com/microsoft/playwright/issues/10977' }); await page.setViewportSize({ width: 200, height: 200 }); await page.setContent(` + +
+
+ Drop here +
+
+ Drag me +
+
+ + diff --git a/tests/hit-target.spec.ts b/tests/hit-target.spec.ts index 479cade2e8bf1..e6f3eb5fa032c 100644 --- a/tests/hit-target.spec.ts +++ b/tests/hit-target.spec.ts @@ -178,3 +178,9 @@ it('should work with mui select', async ({ page, server }) => { await page.click('div.MuiFormControl-root:has-text("Age")'); await expect(page.locator('text=Thirty')).toBeVisible(); }); + +it('should work with drag and drop that moves the element under cursor', async ({ page, server }) => { + await page.goto(server.PREFIX + '/input/drag-n-drop-manual.html'); + await page.dragAndDrop('#from', '#to'); + await expect(page.locator('#to')).toHaveText('Dropped'); +}); From 1dc0ddffceb1cb899d75c64ebd4e75e1132d6da3 Mon Sep 17 00:00:00 2001 From: Andrey Lushnikov Date: Mon, 31 Jan 2022 17:36:15 -0700 Subject: [PATCH 162/233] browser(chromium): roll Chromium to an upstream fix (#11762) References #11754 --- browser_patches/chromium/BUILD_NUMBER | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/browser_patches/chromium/BUILD_NUMBER b/browser_patches/chromium/BUILD_NUMBER index 9336df06d7cd8..e42c7cc212b2c 100644 --- a/browser_patches/chromium/BUILD_NUMBER +++ b/browser_patches/chromium/BUILD_NUMBER @@ -1 +1 @@ -965044 +965416 From 2b55adaafac0109c16a10a8b52dad822c43e7e34 Mon Sep 17 00:00:00 2001 From: Pavel Feldman Date: Mon, 31 Jan 2022 17:09:04 -0800 Subject: [PATCH 163/233] feat(breaking): always report onBegin/onEnd, report file errors (#11758) --- docs/src/test-reporter-api/class-suite.md | 5 + packages/playwright-test/src/fixtures.ts | 4 +- packages/playwright-test/src/loader.ts | 18 +- .../src/reporters/multiplexer.ts | 22 +- packages/playwright-test/src/runner.ts | 342 ++++++++++-------- packages/playwright-test/src/test.ts | 1 + packages/playwright-test/src/util.ts | 4 - packages/playwright-test/src/workerRunner.ts | 2 +- .../playwright-test/types/testReporter.d.ts | 4 + tests/playwright-test/global-setup.spec.ts | 30 +- .../overrides-testReporter.d.ts | 1 + 11 files changed, 233 insertions(+), 200 deletions(-) diff --git a/docs/src/test-reporter-api/class-suite.md b/docs/src/test-reporter-api/class-suite.md index b0b3d74c9e834..db76fcc25be5b 100644 --- a/docs/src/test-reporter-api/class-suite.md +++ b/docs/src/test-reporter-api/class-suite.md @@ -24,6 +24,11 @@ Reporter is given a root suite in the [`method: Reporter.onBegin`] method. Returns the list of all test cases in this suite and its descendants, as opposite to [`property: Suite.tests`]. +## property: Suite.loadError +- type: <[void]|[TestError]> + +For file suites, contains errors that occurred while loading this file. + ## property: Suite.location - type: <[void]|[Location]> diff --git a/packages/playwright-test/src/fixtures.ts b/packages/playwright-test/src/fixtures.ts index bc3ada3fa15c0..f0886bbd8d662 100644 --- a/packages/playwright-test/src/fixtures.ts +++ b/packages/playwright-test/src/fixtures.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { formatLocation, wrapInPromise, debugTest } from './util'; +import { formatLocation, debugTest } from './util'; import * as crypto from 'crypto'; import { FixturesWithLocation, Location, WorkerInfo, TestInfo } from './types'; import { ManualPromise } from 'playwright-core/lib/utils/async'; @@ -78,7 +78,7 @@ class Fixture { await this._useFuncFinished; }; const info = this.registration.scope === 'worker' ? workerInfo : testInfo; - this._selfTeardownComplete = wrapInPromise(this.registration.fn(params, useFunc, info)).catch((e: any) => { + this._selfTeardownComplete = Promise.resolve().then(() => this.registration.fn(params, useFunc, info)).catch((e: any) => { if (!useFuncStarted.isDone()) useFuncStarted.reject(e); else diff --git a/packages/playwright-test/src/loader.ts b/packages/playwright-test/src/loader.ts index 100f9617d79d2..f65341434dbef 100644 --- a/packages/playwright-test/src/loader.ts +++ b/packages/playwright-test/src/loader.ts @@ -27,6 +27,7 @@ import { ProjectImpl } from './project'; import { Reporter } from '../types/testReporter'; import { BuiltInReporter, builtInReporters } from './runner'; import { isRegExp } from 'playwright-core/lib/utils/utils'; +import { serializeError } from './util'; // To allow multiple loaders in the same process without clearing require cache, // we make these maps global. @@ -113,20 +114,25 @@ export class Loader { this._fullConfig.projects = this._projects.map(p => p.config); } - async loadTestFile(file: string) { + async loadTestFile(file: string, environment: 'runner' | 'worker') { if (cachedFileSuites.has(file)) return cachedFileSuites.get(file)!; + const suite = new Suite(path.relative(this._fullConfig.rootDir, file) || path.basename(file)); + suite._requireFile = file; + suite.location = { file, line: 0, column: 0 }; + + setCurrentlyLoadingFileSuite(suite); try { - const suite = new Suite(path.relative(this._fullConfig.rootDir, file) || path.basename(file)); - suite._requireFile = file; - suite.location = { file, line: 0, column: 0 }; - setCurrentlyLoadingFileSuite(suite); await this._requireOrImport(file); cachedFileSuites.set(file, suite); - return suite; + } catch (e) { + if (environment === 'worker') + throw e; + suite.loadError = serializeError(e); } finally { setCurrentlyLoadingFileSuite(undefined); } + return suite; } async loadGlobalHook(file: string, name: string): Promise<(config: FullConfig) => any> { diff --git a/packages/playwright-test/src/reporters/multiplexer.ts b/packages/playwright-test/src/reporters/multiplexer.ts index f841033a9c6c4..71a3e62f3b9dd 100644 --- a/packages/playwright-test/src/reporters/multiplexer.ts +++ b/packages/playwright-test/src/reporters/multiplexer.ts @@ -34,37 +34,37 @@ export class Multiplexer implements Reporter { onTestBegin(test: TestCase, result: TestResult) { for (const reporter of this._reporters) - reporter.onTestBegin?.(test, result); + wrap(() => reporter.onTestBegin?.(test, result)); } onStdOut(chunk: string | Buffer, test?: TestCase, result?: TestResult) { for (const reporter of this._reporters) - reporter.onStdOut?.(chunk, test, result); + wrap(() => reporter.onStdOut?.(chunk, test, result)); } onStdErr(chunk: string | Buffer, test?: TestCase, result?: TestResult) { for (const reporter of this._reporters) - reporter.onStdErr?.(chunk, test, result); + wrap(() => reporter.onStdErr?.(chunk, test, result)); } onTestEnd(test: TestCase, result: TestResult) { for (const reporter of this._reporters) - reporter.onTestEnd?.(test, result); + wrap(() => reporter.onTestEnd?.(test, result)); } async onEnd(result: FullResult) { for (const reporter of this._reporters) - await reporter.onEnd?.(result); + await Promise.resolve().then(() => reporter.onEnd?.(result)).catch(e => console.error('Error in reporter', e)); } onError(error: TestError) { for (const reporter of this._reporters) - reporter.onError?.(error); + wrap(() => reporter.onError?.(error)); } onStepBegin(test: TestCase, result: TestResult, step: TestStep) { for (const reporter of this._reporters) - (reporter as any).onStepBegin?.(test, result, step); + wrap(() => (reporter as any).onStepBegin?.(test, result, step)); } onStepEnd(test: TestCase, result: TestResult, step: TestStep) { @@ -72,3 +72,11 @@ export class Multiplexer implements Reporter { (reporter as any).onStepEnd?.(test, result, step); } } + +function wrap(callback: () => void) { + try { + callback(); + } catch (e) { + console.error('Error in reporter', e); + } +} diff --git a/packages/playwright-test/src/runner.ts b/packages/playwright-test/src/runner.ts index 32c04ad5b8b27..5485f68701f7e 100644 --- a/packages/playwright-test/src/runner.ts +++ b/packages/playwright-test/src/runner.ts @@ -20,7 +20,7 @@ import * as fs from 'fs'; import * as path from 'path'; import { promisify } from 'util'; import { Dispatcher, TestGroup } from './dispatcher'; -import { createFileMatcher, createTitleMatcher, FilePatternFilter, serializeError } from './util'; +import { createFileMatcher, createTitleMatcher, FilePatternFilter } from './util'; import { TestCase, Suite } from './test'; import { Loader } from './loader'; import { FullResult, Reporter, TestError } from '../types/testReporter'; @@ -39,6 +39,7 @@ import { Config, FullConfig } from './types'; import { WebServer } from './webServer'; import { raceAgainstTimeout } from 'playwright-core/lib/utils/async'; import { SigIntWatcher } from 'playwright-core/lib/utils/utils'; +import { serializeError } from './util'; const removeFolderAsync = promisify(rimraf); const readDirAsync = promisify(fs.readdir); @@ -56,7 +57,6 @@ type RunOptions = { export class Runner { private _loader: Loader; private _reporter!: Reporter; - private _didBegin = false; private _internalGlobalSetups: Array = []; constructor(configOverrides: Config, options: { defaultConfig?: Config } = {}) { @@ -135,34 +135,24 @@ export class Runner { async runAllTests(options: RunOptions = {}): Promise { this._reporter = await this._createReporter(!!options.listOnly); - try { - const config = this._loader.fullConfig(); - const result = await raceAgainstTimeout(() => this._run(!!options.listOnly, options.filePatternFilter || [], options.projectFilter), config.globalTimeout); - if (result.timedOut) { - const actualResult: FullResult = { status: 'timedout' }; - if (this._didBegin) - await this._reporter.onEnd?.(actualResult); - else - this._reporter.onError?.(createStacklessError(`Timed out waiting ${config.globalTimeout / 1000}s for the entire test run`)); - return actualResult; - } else if (this._didBegin) { - await this._reporter.onEnd?.(result.result); - } - return result.result; - } catch (e) { - const result: FullResult = { status: 'failed' }; - try { - this._reporter.onError?.(serializeError(e)); - } catch (ignored) { - } - return result; - } finally { - // Calling process.exit() might truncate large stdout/stderr output. - // See https://github.com/nodejs/node/issues/6456. - // See https://github.com/nodejs/node/issues/12921 - await new Promise(resolve => process.stdout.write('', () => resolve())); - await new Promise(resolve => process.stderr.write('', () => resolve())); + const config = this._loader.fullConfig(); + const result = await raceAgainstTimeout(() => this._run(!!options.listOnly, options.filePatternFilter || [], options.projectFilter), config.globalTimeout); + let fullResult: FullResult; + if (result.timedOut) { + this._reporter.onError?.(createStacklessError(`Timed out waiting ${config.globalTimeout / 1000}s for the entire test run`)); + fullResult = { status: 'timedout' }; + } else { + fullResult = result.result; } + await this._reporter.onEnd?.(fullResult); + + // Calling process.exit() might truncate large stdout/stderr output. + // See https://github.com/nodejs/node/issues/6456. + // See https://github.com/nodejs/node/issues/12921 + await new Promise(resolve => process.stdout.write('', () => resolve())); + await new Promise(resolve => process.stderr.write('', () => resolve())); + + return fullResult; } async listAllTestFiles(config: Config, projectNames: string[] | undefined): Promise { @@ -237,148 +227,194 @@ export class Runner { files.forEach(file => allTestFiles.add(file)); const config = this._loader.fullConfig(); - const internalGlobalTeardowns: (() => Promise)[] = []; - if (!list) { - for (const internalGlobalSetup of this._internalGlobalSetups) - internalGlobalTeardowns.push(await internalGlobalSetup()); + + const fatalErrors: TestError[] = []; + + // 1. Add all tests. + const preprocessRoot = new Suite(''); + for (const file of allTestFiles) { + const fileSuite = await this._loader.loadTestFile(file, 'runner'); + if (fileSuite.loadError) + fatalErrors.push(fileSuite.loadError); + preprocessRoot._addSuite(fileSuite); } - const webServer = (!list && config.webServer) ? await WebServer.create(config.webServer) : undefined; - let globalSetupResult: any; - if (config.globalSetup && !list) - globalSetupResult = await (await this._loader.loadGlobalHook(config.globalSetup, 'globalSetup'))(this._loader.fullConfig()); - try { - // 1. Add all tests. - const preprocessRoot = new Suite(''); - for (const file of allTestFiles) - preprocessRoot._addSuite(await this._loader.loadTestFile(file)); - - // 2. Filter tests to respect column filter. - filterByFocusedLine(preprocessRoot, testFileReFilters); - - // 3. Complain about only. - if (config.forbidOnly) { - const onlyTestsAndSuites = preprocessRoot._getOnlyItems(); - if (onlyTestsAndSuites.length > 0) { - this._reporter.onError?.(createForbidOnlyError(config, onlyTestsAndSuites)); - return { status: 'failed' }; - } - } - // 4. Filter only - if (!list) - filterOnly(preprocessRoot); + // 2. Filter tests to respect column filter. + filterByFocusedLine(preprocessRoot, testFileReFilters); - // 5. Complain about clashing. - const clashingTests = getClashingTestsPerSuite(preprocessRoot); - if (clashingTests.size > 0) { - this._reporter.onError?.(createDuplicateTitlesError(config, clashingTests)); - return { status: 'failed' }; - } + // 3. Complain about only. + if (config.forbidOnly) { + const onlyTestsAndSuites = preprocessRoot._getOnlyItems(); + if (onlyTestsAndSuites.length > 0) + fatalErrors.push(createForbidOnlyError(config, onlyTestsAndSuites)); + } + + // 4. Filter only + if (!list) + filterOnly(preprocessRoot); - const fileSuites = new Map(); - for (const fileSuite of preprocessRoot.suites) - fileSuites.set(fileSuite._requireFile, fileSuite); - - const outputDirs = new Set(); - const grepMatcher = createTitleMatcher(config.grep); - const grepInvertMatcher = config.grepInvert ? createTitleMatcher(config.grepInvert) : null; - const rootSuite = new Suite(''); - for (const [project, files] of filesByProject) { - const projectSuite = new Suite(project.config.name); - projectSuite._projectConfig = project.config; - rootSuite._addSuite(projectSuite); - for (const file of files) { - const fileSuite = fileSuites.get(file); - if (!fileSuite) - continue; - for (let repeatEachIndex = 0; repeatEachIndex < project.config.repeatEach; repeatEachIndex++) { - const cloned = project.cloneFileSuite(fileSuite, repeatEachIndex, test => { - const grepTitle = test.titlePath().join(' '); - if (grepInvertMatcher?.(grepTitle)) - return false; - return grepMatcher(grepTitle); - }); - if (cloned) - projectSuite._addSuite(cloned); - } + // 5. Complain about clashing. + const clashingTests = getClashingTestsPerSuite(preprocessRoot); + if (clashingTests.size > 0) + fatalErrors.push(createDuplicateTitlesError(config, clashingTests)); + + // 6. Generate projects. + const fileSuites = new Map(); + for (const fileSuite of preprocessRoot.suites) + fileSuites.set(fileSuite._requireFile, fileSuite); + + const outputDirs = new Set(); + const grepMatcher = createTitleMatcher(config.grep); + const grepInvertMatcher = config.grepInvert ? createTitleMatcher(config.grepInvert) : null; + const rootSuite = new Suite(''); + for (const [project, files] of filesByProject) { + const projectSuite = new Suite(project.config.name); + projectSuite._projectConfig = project.config; + rootSuite._addSuite(projectSuite); + for (const file of files) { + const fileSuite = fileSuites.get(file); + if (!fileSuite) + continue; + for (let repeatEachIndex = 0; repeatEachIndex < project.config.repeatEach; repeatEachIndex++) { + const cloned = project.cloneFileSuite(fileSuite, repeatEachIndex, test => { + const grepTitle = test.titlePath().join(' '); + if (grepInvertMatcher?.(grepTitle)) + return false; + return grepMatcher(grepTitle); + }); + if (cloned) + projectSuite._addSuite(cloned); } - outputDirs.add(project.config.outputDir); } + outputDirs.add(project.config.outputDir); + } - let total = rootSuite.allTests().length; - if (!total) { - this._reporter.onError?.(createNoTestsError()); - return { status: 'failed' }; + // 7. Fail when no tests. + let total = rootSuite.allTests().length; + if (!total) + fatalErrors.push(createNoTestsError()); + + // 8. Fail when output fails. + await Promise.all(Array.from(outputDirs).map(outputDir => removeFolderAsync(outputDir).catch(e => { + fatalErrors.push(serializeError(e)); + }))); + + // 9. Compute shards. + let testGroups = createTestGroups(rootSuite); + + const shard = config.shard; + if (shard) { + const shardGroups: TestGroup[] = []; + const shardTests = new Set(); + + // Each shard gets some tests. + const shardSize = Math.floor(total / shard.total); + // First few shards get one more test each. + const extraOne = total - shardSize * shard.total; + + const currentShard = shard.current - 1; // Make it zero-based for calculations. + const from = shardSize * currentShard + Math.min(extraOne, currentShard); + const to = from + shardSize + (currentShard < extraOne ? 1 : 0); + let current = 0; + for (const group of testGroups) { + // Any test group goes to the shard that contains the first test of this group. + // So, this shard gets any group that starts at [from; to) + if (current >= from && current < to) { + shardGroups.push(group); + for (const test of group.tests) + shardTests.add(test); + } + current += group.tests.length; } - await Promise.all(Array.from(outputDirs).map(outputDir => removeFolderAsync(outputDir).catch(e => {}))); - - let testGroups = createTestGroups(rootSuite); - - const shard = config.shard; - if (shard) { - const shardGroups: TestGroup[] = []; - const shardTests = new Set(); - - // Each shard gets some tests. - const shardSize = Math.floor(total / shard.total); - // First few shards get one more test each. - const extraOne = total - shardSize * shard.total; - - const currentShard = shard.current - 1; // Make it zero-based for calculations. - const from = shardSize * currentShard + Math.min(extraOne, currentShard); - const to = from + shardSize + (currentShard < extraOne ? 1 : 0); - let current = 0; - for (const group of testGroups) { - // Any test group goes to the shard that contains the first test of this group. - // So, this shard gets any group that starts at [from; to) - if (current >= from && current < to) { - shardGroups.push(group); - for (const test of group.tests) - shardTests.add(test); - } - current += group.tests.length; - } + testGroups = shardGroups; + filterSuiteWithOnlySemantics(rootSuite, () => false, test => shardTests.has(test)); + total = rootSuite.allTests().length; + } + (config as any).__testGroupsCount = testGroups.length; - testGroups = shardGroups; - filterSuiteWithOnlySemantics(rootSuite, () => false, test => shardTests.has(test)); - total = rootSuite.allTests().length; - } - (config as any).__testGroupsCount = testGroups.length; + // 10. Report begin + this._reporter.onBegin?.(config, rootSuite); + + // 11. Bail out on errors prior to running global setup. + if (fatalErrors.length) { + for (const error of fatalErrors) + this._reporter.onError?.(error); + return { status: 'failed' }; + } + + // 12. Bail out if list mode only, don't do any work. + if (list) + return { status: 'passed' }; + + // 13. Declare global setup to tear down in finally. + const internalGlobalTeardowns: (() => Promise)[] = []; + let webServer: WebServer | undefined; + let globalSetupResult: any; + + const result: FullResult = { status: 'passed' }; + + try { + // 14. Perform global setup. + for (const internalGlobalSetup of this._internalGlobalSetups) + internalGlobalTeardowns.push(await internalGlobalSetup()); + webServer = config.webServer ? await WebServer.create(config.webServer) : undefined; + if (config.globalSetup) + globalSetupResult = await (await this._loader.loadGlobalHook(config.globalSetup, 'globalSetup'))(this._loader.fullConfig()); const sigintWatcher = new SigIntWatcher(); - this._reporter.onBegin?.(config, rootSuite); - this._didBegin = true; let hasWorkerErrors = false; - if (!list) { - const dispatcher = new Dispatcher(this._loader, testGroups, this._reporter); - await Promise.race([dispatcher.run(), sigintWatcher.promise()]); - if (!sigintWatcher.hadSignal()) { - // We know for sure there was no Ctrl+C, so we remove custom SIGINT handler - // as soon as we can. - sigintWatcher.disarm(); - } - await dispatcher.stop(); - hasWorkerErrors = dispatcher.hasWorkerErrors(); + const dispatcher = new Dispatcher(this._loader, testGroups, this._reporter); + await Promise.race([dispatcher.run(), sigintWatcher.promise()]); + if (!sigintWatcher.hadSignal()) { + // We know for sure there was no Ctrl+C, so we remove custom SIGINT handler + // as soon as we can. + sigintWatcher.disarm(); } + await dispatcher.stop(); + hasWorkerErrors = dispatcher.hasWorkerErrors(); - if (sigintWatcher.hadSignal()) { - const result: FullResult = { status: 'interrupted' }; - return result; + if (!sigintWatcher.hadSignal()) { + const failed = hasWorkerErrors || rootSuite.allTests().some(test => !test.ok()); + result.status = failed ? 'failed' : 'passed'; + } else { + result.status = 'interrupted'; } - - const failed = hasWorkerErrors || rootSuite.allTests().some(test => !test.ok()); - const result: FullResult = { status: failed ? 'failed' : 'passed' }; - return result; + } catch (e) { + this._reporter.onError?.(serializeError(e)); + return { status: 'failed' }; } finally { - if (globalSetupResult && typeof globalSetupResult === 'function') - await globalSetupResult(this._loader.fullConfig()); - if (config.globalTeardown && !list) - await (await this._loader.loadGlobalHook(config.globalTeardown, 'globalTeardown'))(this._loader.fullConfig()); - await webServer?.kill(); - for (const internalGlobalTeardown of internalGlobalTeardowns) - await internalGlobalTeardown(); + + await this._runAndAssignError(async () => { + if (globalSetupResult && typeof globalSetupResult === 'function') + await globalSetupResult(this._loader.fullConfig()); + }, result); + + await this._runAndAssignError(async () => { + if (config.globalTeardown) + await (await this._loader.loadGlobalHook(config.globalTeardown, 'globalTeardown'))(this._loader.fullConfig()); + }, result); + + await this._runAndAssignError(async () => { + await webServer?.kill(); + }, result); + + await this._runAndAssignError(async () => { + for (const internalGlobalTeardown of internalGlobalTeardowns) + await internalGlobalTeardown(); + }, result); + } + return result; + } + + private async _runAndAssignError(callback: () => Promise, result: FullResult) { + try { + await callback(); + } catch (e) { + if (result.status === 'passed') + result.status = 'failed'; + this._reporter.onError?.(serializeError(e)); } } } diff --git a/packages/playwright-test/src/test.ts b/packages/playwright-test/src/test.ts index a2cff97b63416..441b3a932d543 100644 --- a/packages/playwright-test/src/test.ts +++ b/packages/playwright-test/src/test.ts @@ -40,6 +40,7 @@ export type Modifier = { export class Suite extends Base implements reporterTypes.Suite { suites: Suite[] = []; tests: TestCase[] = []; + loadError?: reporterTypes.TestError; location?: Location; parent?: Suite; _use: FixturesWithLocation[] = []; diff --git a/packages/playwright-test/src/util.ts b/packages/playwright-test/src/util.ts index d868c4d08d42b..2549b3d454060 100644 --- a/packages/playwright-test/src/util.ts +++ b/packages/playwright-test/src/util.ts @@ -106,10 +106,6 @@ export function mergeObjects(a: A | undefine return result as any; } -export async function wrapInPromise(value: any) { - return value; -} - export function forceRegExp(pattern: string): RegExp { const match = pattern.match(/^\/(.*)\/([gi]*)$/); if (match) diff --git a/packages/playwright-test/src/workerRunner.ts b/packages/playwright-test/src/workerRunner.ts index 2ac6b1bb7d48d..9f46d915a5fbf 100644 --- a/packages/playwright-test/src/workerRunner.ts +++ b/packages/playwright-test/src/workerRunner.ts @@ -125,7 +125,7 @@ export class WorkerRunner extends EventEmitter { try { this._entries = new Map(runPayload.entries.map(e => [ e.testId, e ])); await this._loadIfNeeded(); - const fileSuite = await this._loader.loadTestFile(runPayload.file); + const fileSuite = await this._loader.loadTestFile(runPayload.file, 'worker'); const suite = this._project.cloneFileSuite(fileSuite, this._params.repeatEachIndex, test => { if (!this._entries.has(test._id)) return false; diff --git a/packages/playwright-test/types/testReporter.d.ts b/packages/playwright-test/types/testReporter.d.ts index 18f92b26fcce8..0dfe58b4d05bf 100644 --- a/packages/playwright-test/types/testReporter.d.ts +++ b/packages/playwright-test/types/testReporter.d.ts @@ -70,6 +70,10 @@ export interface Suite { * group suite. */ title: string; + /** + * For file suites, contains errors that occurred while loading this file. + */ + loadError?: TestError; /** * Location in the source where the suite is defined. Missing for root and project suites. */ diff --git a/tests/playwright-test/global-setup.spec.ts b/tests/playwright-test/global-setup.spec.ts index a1df956393a58..24822c9dd11cb 100644 --- a/tests/playwright-test/global-setup.spec.ts +++ b/tests/playwright-test/global-setup.spec.ts @@ -106,38 +106,14 @@ test('globalTeardown does not run when globalSetup times out', async ({ runInlin }); `, }); - // We did not collect tests, so everything should be zero. - expect(result.skipped).toBe(0); + // We did not run tests, so we should only have 1 skipped test. + expect(result.skipped).toBe(1); expect(result.passed).toBe(0); expect(result.failed).toBe(0); expect(result.exitCode).toBe(1); expect(result.output).not.toContain('teardown='); }); -test('globalSetup should be run before requiring tests', async ({ runInlineTest }) => { - const { passed } = await runInlineTest({ - 'playwright.config.ts': ` - import * as path from 'path'; - module.exports = { - globalSetup: './globalSetup.ts', - }; - `, - 'globalSetup.ts': ` - module.exports = async () => { - process.env.FOO = JSON.stringify({ foo: 'bar' }); - }; - `, - 'a.test.js': ` - const { test } = pwt; - let value = JSON.parse(process.env.FOO); - test('should work', async ({}) => { - expect(value).toEqual({ foo: 'bar' }); - }); - `, - }); - expect(passed).toBe(1); -}); - test('globalSetup should work with sync function', async ({ runInlineTest }) => { const { passed } = await runInlineTest({ 'playwright.config.ts': ` @@ -153,8 +129,8 @@ test('globalSetup should work with sync function', async ({ runInlineTest }) => `, 'a.test.js': ` const { test } = pwt; - let value = JSON.parse(process.env.FOO); test('should work', async ({}) => { + const value = JSON.parse(process.env.FOO); expect(value).toEqual({ foo: 'bar' }); }); `, diff --git a/utils/generate_types/overrides-testReporter.d.ts b/utils/generate_types/overrides-testReporter.d.ts index af511e8ab1c0c..9c7a9dafee218 100644 --- a/utils/generate_types/overrides-testReporter.d.ts +++ b/utils/generate_types/overrides-testReporter.d.ts @@ -26,6 +26,7 @@ export interface Location { export interface Suite { parent?: Suite; title: string; + loadError?: TestError; location?: Location; suites: Suite[]; tests: TestCase[]; From 2336692e8aadd84dea44298f5c7a47a90989624f Mon Sep 17 00:00:00 2001 From: Andrey Lushnikov Date: Mon, 31 Jan 2022 18:14:59 -0700 Subject: [PATCH 164/233] feat: support clarification message for expect (#11735) The clarification message is displayed in the HTML report as the name of the step: ![image](https://user-images.githubusercontent.com/746130/151852652-48194140-5ea4-439d-afee-12583a8caf71.png) It is also shown in terminal output: ![image](https://user-images.githubusercontent.com/746130/151852666-5c956ef1-6e94-4bc2-8e55-b58688dfc7e0.png) Fixes #7816 --- docs/src/test-assertions-js.md | 6 ++ packages/playwright-core/src/utils/utils.ts | 1 + packages/playwright-test/src/expect.ts | 66 ++++++++++++++++++- .../playwright-test/src/reporters/base.ts | 8 +-- .../playwright-test/src/reporters/junit.ts | 3 +- .../playwright-test/types/testExpect.d.ts | 2 +- tests/playwright-test/basic.spec.ts | 6 +- tests/playwright-test/exit-code.spec.ts | 4 +- tests/playwright-test/expect.spec.ts | 63 +++++++++++++++++- tests/playwright-test/fixture-errors.spec.ts | 4 +- tests/playwright-test/golden.spec.ts | 14 ++-- tests/playwright-test/hooks.spec.ts | 14 ++-- tests/playwright-test/max-failures.spec.ts | 4 +- .../playwright-test-fixtures.ts | 2 +- .../playwright.expect.misc.spec.ts | 22 +++---- .../playwright.expect.text.spec.ts | 26 ++++---- .../playwright.expect.true.spec.ts | 8 +-- tests/playwright-test/playwright.spec.ts | 10 +-- .../playwright-test/playwright.trace.spec.ts | 6 +- .../reporter-attachment.spec.ts | 20 +++--- tests/playwright-test/reporter-base.spec.ts | 28 ++++---- tests/playwright-test/reporter-dot.spec.ts | 6 +- tests/playwright-test/reporter-github.spec.ts | 10 +-- tests/playwright-test/reporter-json.spec.ts | 4 +- tests/playwright-test/reporter-line.spec.ts | 8 +-- tests/playwright-test/reporter-list.spec.ts | 10 +-- tests/playwright-test/retry.spec.ts | 14 ++-- tests/playwright-test/runner.spec.ts | 4 +- tests/playwright-test/test-info.spec.ts | 4 +- tests/playwright-test/test-modifiers.spec.ts | 4 +- 30 files changed, 254 insertions(+), 127 deletions(-) diff --git a/docs/src/test-assertions-js.md b/docs/src/test-assertions-js.md index 0bb53da7eb885..cd541bc31e14d 100644 --- a/docs/src/test-assertions-js.md +++ b/docs/src/test-assertions-js.md @@ -19,6 +19,12 @@ expect(value).not.toEqual(0); await expect(locator).not.toContainText("some text"); ``` +You can also specify a custom error message as a second argument to the `expect` function, for example: + +```js +expect(value, 'my custom error message').toBe(42); +``` + - [`method: LocatorAssertions.toBeChecked`] - [`method: LocatorAssertions.toBeDisabled`] diff --git a/packages/playwright-core/src/utils/utils.ts b/packages/playwright-core/src/utils/utils.ts index ab06bf399d3fc..683f39c156dbb 100644 --- a/packages/playwright-core/src/utils/utils.ts +++ b/packages/playwright-core/src/utils/utils.ts @@ -619,3 +619,4 @@ export class SigIntWatcher { process.off('SIGINT', this._sigintHandler); } } + diff --git a/packages/playwright-test/src/expect.ts b/packages/playwright-test/src/expect.ts index 6a5638ad1645c..4524848567463 100644 --- a/packages/playwright-test/src/expect.ts +++ b/packages/playwright-test/src/expect.ts @@ -92,7 +92,15 @@ export const printReceivedStringContainExpectedResult = ( // #endregion -export const expect: Expect = expectLibrary as any; +export const expect: Expect = new Proxy(expectLibrary as any, { + apply: function(target: any, thisArg: any, argumentsList: [actual: unknown, message: string|undefined]) { + const message = argumentsList[1]; + if (message !== undefined && typeof message !== 'string') + throw new Error('expect(actual, optionalErrorMessage): optional error message must be a string.'); + return new Proxy(expectLibrary.call(thisArg, argumentsList[0]), new ExpectMetaInfoProxyHandler(message || '')); + } +}); + expectLibrary.setState({ expand: false }); const customMatchers = { toBeChecked, @@ -118,23 +126,56 @@ const customMatchers = { toMatchSnapshot, }; +type ExpectMetaInfo = { + message: string; +}; + +let expectCallMetaInfo: undefined|ExpectMetaInfo = undefined; + +class ExpectMetaInfoProxyHandler { + private _message: string; + + constructor(message: string) { + this._message = message; + } + + get(target: any, prop: any, receiver: any): any { + const value = Reflect.get(target, prop, receiver); + if (typeof value !== 'function') + return new Proxy(value, this); + return (...args: any[]) => { + try { + expectCallMetaInfo = { + message: this._message, + }; + const result = value.call(target, ...args); + return result; + } finally { + expectCallMetaInfo = undefined; + } + }; + } +} + function wrap(matcherName: string, matcher: any) { const result = function(this: any, ...args: any[]) { const testInfo = currentTestInfo(); if (!testInfo) return matcher.call(this, ...args); - const INTERNAL_STACK_LENGTH = 3; + const INTERNAL_STACK_LENGTH = 4; // at Object.__PWTRAP__[expect.toHaveText] (...) // at __EXTERNAL_MATCHER_TRAP__ (...) // at Object.throwingMatcher [as toHaveText] (...) + // at Proxy. // at (...) const stackLines = new Error().stack!.split('\n').slice(INTERNAL_STACK_LENGTH + 1); const frame = stackLines[0] ? stackUtils.parseLine(stackLines[0]) : undefined; + const customMessage = expectCallMetaInfo?.message ?? ''; const step = testInfo._addStep({ location: frame && frame.file ? { file: path.resolve(process.cwd(), frame.file), line: frame.line || 0, column: frame.column || 0 } : undefined, category: 'expect', - title: `expect${this.isNot ? '.not' : ''}.${matcherName}`, + title: customMessage || `expect${this.isNot ? '.not' : ''}.${matcherName}`, canHaveChildren: true, forceNoParent: false }); @@ -145,6 +186,25 @@ function wrap(matcherName: string, matcher: any) { if (!success) { const message = result.message(); error = { message, stack: message + '\n' + stackLines.join('\n') }; + if (customMessage) { + const messageLines = message.split('\n'); + // Jest adds something like the following error to all errors: + // expect(received).toBe(expected); // Object.is equality + const uselessMatcherLineIndex = messageLines.findIndex((line: string) => /expect.*\(.*received.*\)/.test(line)); + if (uselessMatcherLineIndex !== -1) { + // if there's a newline after the matcher text, then remove it as well. + if (uselessMatcherLineIndex + 1 < messageLines.length && messageLines[uselessMatcherLineIndex + 1].trim() === '') + messageLines.splice(uselessMatcherLineIndex, 2); + else + messageLines.splice(uselessMatcherLineIndex, 1); + } + const newMessage = [ + customMessage, + '', + ...messageLines, + ].join('\n'); + result.message = () => newMessage; + } } step.complete(error); return result; diff --git a/packages/playwright-test/src/reporters/base.ts b/packages/playwright-test/src/reporters/base.ts index 8d4a52d38ceba..4371c5ca1485e 100644 --- a/packages/playwright-test/src/reporters/base.ts +++ b/packages/playwright-test/src/reporters/base.ts @@ -419,9 +419,9 @@ function monotonicTime(): number { return seconds * 1000 + (nanoseconds / 1000000 | 0); } -const asciiRegex = new RegExp('[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:[a-zA-Z\\d]*(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)|(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-ntqry=><~]))', 'g'); +const ansiRegex = new RegExp('[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:[a-zA-Z\\d]*(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)|(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-ntqry=><~]))', 'g'); export function stripAnsiEscapes(str: string): string { - return str.replace(asciiRegex, ''); + return str.replace(ansiRegex, ''); } // Leaves enough space for the "suffix" to also fit. @@ -432,8 +432,8 @@ export function fitToScreen(line: string, width: number, suffix?: string): strin return line; let m; let ansiLen = 0; - asciiRegex.lastIndex = 0; - while ((m = asciiRegex.exec(line)) !== null) { + ansiRegex.lastIndex = 0; + while ((m = ansiRegex.exec(line)) !== null) { const visibleLen = m.index - ansiLen; if (visibleLen >= width) break; diff --git a/packages/playwright-test/src/reporters/junit.ts b/packages/playwright-test/src/reporters/junit.ts index a4fa9bc5e214e..c53081bae08c6 100644 --- a/packages/playwright-test/src/reporters/junit.ts +++ b/packages/playwright-test/src/reporters/junit.ts @@ -197,11 +197,10 @@ function serializeXML(entry: XMLEntry, tokens: string[], stripANSIControlSequenc // See https://en.wikipedia.org/wiki/Valid_characters_in_XML const discouragedXMLCharacters = /[\u0001-\u0008\u000b-\u000c\u000e-\u001f\u007f-\u0084\u0086-\u009f]/g; -const ansiControlSequence = new RegExp('[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:[a-zA-Z\\d]*(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)|(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-ntqry=><~]))', 'g'); function escape(text: string, stripANSIControlSequences: boolean, isCharacterData: boolean): string { if (stripANSIControlSequences) - text = text.replace(ansiControlSequence, ''); + text = stripAnsiEscapes(text); const escapeRe = isCharacterData ? /[&<]/g : /[&"<>]/g; text = text.replace(escapeRe, c => ({ '&': '&', '"': '"', '<': '<', '>': '>' }[c]!)); if (isCharacterData) diff --git a/packages/playwright-test/types/testExpect.d.ts b/packages/playwright-test/types/testExpect.d.ts index 03ddc17685d19..76b0417b9fd9e 100644 --- a/packages/playwright-test/types/testExpect.d.ts +++ b/packages/playwright-test/types/testExpect.d.ts @@ -28,7 +28,7 @@ type MakeMatchers = PlaywrightTest.Matchers & ExtraMatchers export declare type Expect = { - (actual: T): MakeMatchers; + (actual: T, message?: string): MakeMatchers; // Sourced from node_modules/expect/build/types.d.ts assertions(arg0: number): void; diff --git a/tests/playwright-test/basic.spec.ts b/tests/playwright-test/basic.spec.ts index 4a292db233635..074a409896207 100644 --- a/tests/playwright-test/basic.spec.ts +++ b/tests/playwright-test/basic.spec.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { test, expect, stripAscii } from './playwright-test-fixtures'; +import { test, expect, stripAnsi } from './playwright-test-fixtures'; test('should fail', async ({ runInlineTest }) => { const result = await runInlineTest({ @@ -286,7 +286,7 @@ test('should work with test wrapper', async ({ runInlineTest }) => { }, { workers: 1, reporter: 'line' }); expect(result.passed).toBe(4); expect(result.exitCode).toBe(0); - expect(stripAscii(result.output).split('\n').filter(line => line.startsWith('%%'))).toEqual([ + expect(stripAnsi(result.output).split('\n').filter(line => line.startsWith('%%'))).toEqual([ '%%a.spec', '%%helper', '%%b.spec', @@ -335,7 +335,7 @@ test('should work with test helper', async ({ runInlineTest }) => { }, { workers: 1, reporter: 'line' }); expect(result.passed).toBe(4); expect(result.exitCode).toBe(0); - expect(stripAscii(result.output).split('\n').filter(line => line.startsWith('%%'))).toEqual([ + expect(stripAnsi(result.output).split('\n').filter(line => line.startsWith('%%'))).toEqual([ '%%a.spec', '%%helper-a', '%%b.spec', diff --git a/tests/playwright-test/exit-code.spec.ts b/tests/playwright-test/exit-code.spec.ts index 40c366f853721..7c7577e26e19c 100644 --- a/tests/playwright-test/exit-code.spec.ts +++ b/tests/playwright-test/exit-code.spec.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { test, expect, stripAscii } from './playwright-test-fixtures'; +import { test, expect, stripAnsi } from './playwright-test-fixtures'; function monotonicTime(): number { const [seconds, nanoseconds] = process.hrtime(); @@ -46,7 +46,7 @@ test('should work with not defined errors', async ({ runInlineTest }) => { foo(); ` }); - expect(stripAscii(result.output)).toContain('foo is not defined'); + expect(stripAnsi(result.output)).toContain('foo is not defined'); expect(result.exitCode).toBe(1); }); diff --git a/tests/playwright-test/expect.spec.ts b/tests/playwright-test/expect.spec.ts index 08df44249ee67..f91c2c3fc61f5 100644 --- a/tests/playwright-test/expect.spec.ts +++ b/tests/playwright-test/expect.spec.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { test, expect } from './playwright-test-fixtures'; +import { test, expect, stripAnsi } from './playwright-test-fixtures'; test('should be able to call expect.extend in config', async ({ runInlineTest }) => { const result = await runInlineTest({ @@ -67,6 +67,57 @@ test('should not expand huge arrays', async ({ runInlineTest }) => { expect(result.output.length).toBeLessThan(100000); }); +test('should fail when passed `null` instead of message', async ({ runInlineTest }) => { + const result = await runInlineTest({ + 'expect-test.spec.ts': ` + const { test } = pwt; + test('custom expect message', () => { + test.expect(1+1, null).toEqual(3); + }); + ` + }); + expect(result.exitCode).toBe(1); + expect(result.passed).toBe(0); + expect(stripAnsi(result.output)).toContain(`optional error message must be a string.`); +}); + +test('should include custom error message', async ({ runInlineTest }) => { + const result = await runInlineTest({ + 'expect-test.spec.ts': ` + const { test } = pwt; + test('custom expect message', () => { + test.expect(1+1, 'one plus one is two!').toEqual(3); + }); + ` + }); + expect(result.exitCode).toBe(1); + expect(result.passed).toBe(0); + expect(stripAnsi(result.output)).toContain([ + ` Error: one plus one is two!`, + ``, + ` Expected: 3`, + ` Received: 2`, + ].join('\n')); +}); + +test('should include custom error message with web-first assertions', async ({ runInlineTest }) => { + const result = await runInlineTest({ + 'expect-test.spec.ts': ` + const { test } = pwt; + test('custom expect message', async ({page}) => { + await expect(page.locator('x-foo'), 'x-foo must be visible').toBeVisible({timeout: 1}); + }); + ` + }); + expect(result.exitCode).toBe(1); + expect(result.passed).toBe(0); + expect(result.output).toContain([ + ` Error: x-foo must be visible`, + ``, + ` Call log:`, + ].join('\n')); +}); + test('should work with default expect prototype functions', async ({ runTSC }) => { const result = await runTSC({ 'a.spec.ts': ` @@ -90,6 +141,16 @@ test('should work with default expect matchers', async ({ runTSC }) => { expect(result.exitCode).toBe(0); }); +test('should work with expect message', async ({ runTSC }) => { + const result = await runTSC({ + 'a.spec.ts': ` + const { test } = pwt; + test.expect(42, 'this is expect message').toBe(42); + ` + }); + expect(result.exitCode).toBe(0); +}); + test('should work with default expect matchers and esModuleInterop=false', async ({ runTSC }) => { const result = await runTSC({ 'a.spec.ts': ` diff --git a/tests/playwright-test/fixture-errors.spec.ts b/tests/playwright-test/fixture-errors.spec.ts index 22800c099975b..4b108d4ce1eb1 100644 --- a/tests/playwright-test/fixture-errors.spec.ts +++ b/tests/playwright-test/fixture-errors.spec.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { test, expect, countTimes, stripAscii } from './playwright-test-fixtures'; +import { test, expect, countTimes, stripAnsi } from './playwright-test-fixtures'; test('should handle fixture timeout', async ({ runInlineTest }) => { const result = await runInlineTest({ @@ -452,6 +452,6 @@ test('should not report fixture teardown error twice', async ({ runInlineTest }) expect(result.exitCode).toBe(1); expect(result.failed).toBe(1); expect(result.output).toContain('Error: Oh my error'); - expect(stripAscii(result.output)).toContain(`throw new Error('Oh my error')`); + expect(stripAnsi(result.output)).toContain(`throw new Error('Oh my error')`); expect(countTimes(result.output, 'Oh my error')).toBe(2); }); diff --git a/tests/playwright-test/golden.spec.ts b/tests/playwright-test/golden.spec.ts index c1800bade0efd..e1dfba4920663 100644 --- a/tests/playwright-test/golden.spec.ts +++ b/tests/playwright-test/golden.spec.ts @@ -17,7 +17,7 @@ import colors from 'colors/safe'; import * as fs from 'fs'; import * as path from 'path'; -import { test, expect, stripAscii } from './playwright-test-fixtures'; +import { test, expect, stripAnsi } from './playwright-test-fixtures'; const files = { 'helper.ts': ` @@ -91,7 +91,7 @@ test('should write detailed failure result to an output folder', async ({ runInl }); expect(result.exitCode).toBe(1); - const outputText = stripAscii(result.output); + const outputText = stripAnsi(result.output); expect(outputText).toContain('Snapshot comparison failed:'); const expectedSnapshotArtifactPath = testInfo.outputPath('test-results', 'a-is-a-test', 'snapshot-expected.txt'); const actualSnapshotArtifactPath = testInfo.outputPath('test-results', 'a-is-a-test', 'snapshot-actual.txt'); @@ -114,7 +114,7 @@ test("doesn\'t create comparison artifacts in an output folder for passed negate }); expect(result.exitCode).toBe(0); - const outputText = stripAscii(result.output); + const outputText = stripAnsi(result.output); const expectedSnapshotArtifactPath = testInfo.outputPath('test-results', 'a-is-a-test', 'snapshot-expected.txt'); const actualSnapshotArtifactPath = testInfo.outputPath('test-results', 'a-is-a-test', 'snapshot-actual.txt'); expect(outputText).not.toContain(`Expected: ${expectedSnapshotArtifactPath}`); @@ -406,7 +406,7 @@ test('should compare different PNG images', async ({ runInlineTest }, testInfo) ` }); - const outputText = stripAscii(result.output); + const outputText = stripAnsi(result.output); expect(result.exitCode).toBe(1); expect(outputText).toContain('Snapshot comparison failed:'); const expectedSnapshotArtifactPath = testInfo.outputPath('test-results', 'a-is-a-test', 'snapshot-expected.png'); @@ -636,7 +636,7 @@ test('should attach expected/actual/diff with snapshot path', async ({ runInline ` }); - const outputText = stripAscii(result.output); + const outputText = stripAnsi(result.output); const attachments = outputText.split('\n').filter(l => l.startsWith('## ')).map(l => l.substring(3)).map(l => JSON.parse(l))[0]; for (const attachment of attachments) attachment.path = attachment.path.replace(/\\/g, '/').replace(/.*test-results\//, ''); @@ -675,7 +675,7 @@ test('should attach expected/actual/diff', async ({ runInlineTest }, testInfo) = ` }); - const outputText = stripAscii(result.output); + const outputText = stripAnsi(result.output); const attachments = outputText.split('\n').filter(l => l.startsWith('## ')).map(l => l.substring(3)).map(l => JSON.parse(l))[0]; for (const attachment of attachments) attachment.path = attachment.path.replace(/\\/g, '/').replace(/.*test-results\//, ''); @@ -714,7 +714,7 @@ test('should attach expected/actual and no diff', async ({ runInlineTest }, test ` }); - const outputText = stripAscii(result.output); + const outputText = stripAnsi(result.output); expect(outputText).toContain('Sizes differ; expected image 2px X 2px, but got 1px X 1px.'); const attachments = outputText.split('\n').filter(l => l.startsWith('## ')).map(l => l.substring(3)).map(l => JSON.parse(l))[0]; for (const attachment of attachments) diff --git a/tests/playwright-test/hooks.spec.ts b/tests/playwright-test/hooks.spec.ts index 47593c7a1723a..03cd189a727cc 100644 --- a/tests/playwright-test/hooks.spec.ts +++ b/tests/playwright-test/hooks.spec.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { test, expect, stripAscii } from './playwright-test-fixtures'; +import { test, expect, stripAnsi } from './playwright-test-fixtures'; test('hooks should work with fixtures', async ({ runInlineTest }) => { const { results } = await runInlineTest({ @@ -546,8 +546,8 @@ test('uncaught error in beforeEach should not be masked by another error', async }); expect(result.exitCode).toBe(1); expect(result.failed).toBe(1); - expect(stripAscii(result.output)).toContain('Expected: 2'); - expect(stripAscii(result.output)).toContain('Received: 1'); + expect(stripAnsi(result.output)).toContain('Expected: 2'); + expect(stripAnsi(result.output)).toContain('Received: 1'); }); test('should report error from fixture teardown when beforeAll times out', async ({ runInlineTest }) => { @@ -569,8 +569,8 @@ test('should report error from fixture teardown when beforeAll times out', async }, { timeout: 1000 }); expect(result.exitCode).toBe(1); expect(result.failed).toBe(1); - expect(stripAscii(result.output)).toContain('Timeout of 1000ms exceeded in beforeAll hook.'); - expect(stripAscii(result.output)).toContain('Error: Oh my!'); + expect(stripAnsi(result.output)).toContain('Timeout of 1000ms exceeded in beforeAll hook.'); + expect(stripAnsi(result.output)).toContain('Error: Oh my!'); }); test('should not hang and report results when worker process suddenly exits during afterAll', async ({ runInlineTest }) => { @@ -584,6 +584,6 @@ test('should not hang and report results when worker process suddenly exits duri expect(result.exitCode).toBe(1); expect(result.passed).toBe(1); expect(result.output).toContain('Worker process exited unexpectedly'); - expect(stripAscii(result.output)).toContain('[1/1] a.spec.js:6:7 › passed'); - expect(stripAscii(result.output)).toContain('[1/1] a.spec.js:7:12 › afterAll'); + expect(stripAnsi(result.output)).toContain('[1/1] a.spec.js:6:7 › passed'); + expect(stripAnsi(result.output)).toContain('[1/1] a.spec.js:7:12 › afterAll'); }); diff --git a/tests/playwright-test/max-failures.spec.ts b/tests/playwright-test/max-failures.spec.ts index 7f67e9181c19f..b6463eb5f80f7 100644 --- a/tests/playwright-test/max-failures.spec.ts +++ b/tests/playwright-test/max-failures.spec.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { test, expect, stripAscii } from './playwright-test-fixtures'; +import { test, expect, stripAnsi } from './playwright-test-fixtures'; test('max-failures should work', async ({ runInlineTest }) => { const result = await runInlineTest({ @@ -143,5 +143,5 @@ test('max-failures should properly shutdown', async ({ runInlineTest }) => { }, { workers: 1 }); expect(result.exitCode).toBe(1); expect(result.failed).toBe(1); - expect(stripAscii(result.output)).toContain('expect(false).toBeTruthy()'); + expect(stripAnsi(result.output)).toContain('expect(false).toBeTruthy()'); }); diff --git a/tests/playwright-test/playwright-test-fixtures.ts b/tests/playwright-test/playwright-test-fixtures.ts index 092309204259d..79030894e95f8 100644 --- a/tests/playwright-test/playwright-test-fixtures.ts +++ b/tests/playwright-test/playwright-test-fixtures.ts @@ -243,7 +243,7 @@ const TSCONFIG = { export { expect } from './stable-test-runner'; const asciiRegex = new RegExp('[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:[a-zA-Z\\d]*(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)|(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-ntqry=><~]))', 'g'); -export function stripAscii(str: string): string { +export function stripAnsi(str: string): string { return str.replace(asciiRegex, ''); } diff --git a/tests/playwright-test/playwright.expect.misc.spec.ts b/tests/playwright-test/playwright.expect.misc.spec.ts index 7c1c4e9ac9550..5af9c06875a22 100644 --- a/tests/playwright-test/playwright.expect.misc.spec.ts +++ b/tests/playwright-test/playwright.expect.misc.spec.ts @@ -15,7 +15,7 @@ */ import path from 'path'; -import { test, expect, stripAscii } from './playwright-test-fixtures'; +import { test, expect, stripAnsi } from './playwright-test-fixtures'; test('should support toHaveCount', async ({ runInlineTest }) => { const result = await runInlineTest({ @@ -80,7 +80,7 @@ test('should support toHaveCount', async ({ runInlineTest }) => { }); `, }, { workers: 1 }); - const output = stripAscii(result.output); + const output = stripAnsi(result.output); expect(result.passed).toBe(5); expect(result.failed).toBe(2); expect(result.exitCode).toBe(1); @@ -109,7 +109,7 @@ test('should support toHaveJSProperty', async ({ runInlineTest }) => { }); `, }, { workers: 1 }); - const output = stripAscii(result.output); + const output = stripAnsi(result.output); expect(output).toContain('- "c"'); expect(result.passed).toBe(1); expect(result.failed).toBe(1); @@ -165,7 +165,7 @@ test('should support toHaveJSProperty with builtin types', async ({ runInlineTes }); `, }, { workers: 1 }); - const output = stripAscii(result.output); + const output = stripAnsi(result.output); expect(result.passed).toBe(3); expect(result.failed).toBe(3); expect(result.exitCode).toBe(1); @@ -196,7 +196,7 @@ test('should support toHaveClass', async ({ runInlineTest }) => { }); `, }, { workers: 1 }); - const output = stripAscii(result.output); + const output = stripAnsi(result.output); expect(output).toContain('expect(locator).toHaveClass'); expect(output).toContain('Expected string: \"foo bar baz\"'); expect(result.passed).toBe(1); @@ -222,7 +222,7 @@ test('should support toHaveClass w/ array', async ({ runInlineTest }) => { }); `, }, { workers: 1 }); - const output = stripAscii(result.output); + const output = stripAnsi(result.output); expect(output).toContain('expect(received).toHaveClass(expected)'); expect(output).toContain('- /[a-z]az/,'); expect(result.passed).toBe(1); @@ -246,7 +246,7 @@ test('should support toHaveTitle', async ({ runInlineTest }) => { }); `, }, { workers: 1 }); - const output = stripAscii(result.output); + const output = stripAnsi(result.output); expect(output).toContain('expect(page).toHaveTitle'); expect(output).toContain('Expected string: \"Hello\"'); expect(result.passed).toBe(1); @@ -270,7 +270,7 @@ test('should support toHaveURL', async ({ runInlineTest }) => { }); `, }, { workers: 1 }); - const output = stripAscii(result.output); + const output = stripAnsi(result.output); expect(output).toContain('expect(page).toHaveURL'); expect(output).toContain('Expected string: \"wrong\"'); expect(result.passed).toBe(1); @@ -304,7 +304,7 @@ test('should support toHaveURL with baseURL from webServer', async ({ runInlineT }; `, }, { workers: 1 }); - const output = stripAscii(result.output); + const output = stripAnsi(result.output); expect(output).toContain('expect(page).toHaveURL'); expect(output).toContain(`Expected string: \"http://localhost:${port}/kek\"`); expect(result.passed).toBe(1); @@ -327,7 +327,7 @@ test('should respect expect.timeout', async ({ runInlineTest }) => { }); `, }, { workers: 1 }); - const output = stripAscii(result.output); + const output = stripAnsi(result.output); expect(output).toContain('expect(received).toHaveURL(expected)'); expect(output).toContain('expect.toHaveURL with timeout 1000ms'); expect(result.failed).toBe(1); @@ -345,7 +345,7 @@ test('should log scale the time', async ({ runInlineTest }) => { }); `, }, { workers: 1 }); - const output = stripAscii(result.output); + const output = stripAnsi(result.output); const tokens = output.split('unexpected value'); // Log scale: 0, 100, 250, 500, 1000, 1000, should be less than 8. expect(tokens.length).toBeGreaterThan(1); diff --git a/tests/playwright-test/playwright.expect.text.spec.ts b/tests/playwright-test/playwright.expect.text.spec.ts index 5908eb6690049..02c942556c53d 100644 --- a/tests/playwright-test/playwright.expect.text.spec.ts +++ b/tests/playwright-test/playwright.expect.text.spec.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { test, expect, stripAscii } from './playwright-test-fixtures'; +import { test, expect, stripAnsi } from './playwright-test-fixtures'; test('should support toHaveText w/ regex', async ({ runInlineTest }) => { const result = await runInlineTest({ @@ -37,7 +37,7 @@ test('should support toHaveText w/ regex', async ({ runInlineTest }) => { }); `, }, { workers: 1 }); - const output = stripAscii(result.output); + const output = stripAnsi(result.output); expect(output).toContain('Error: expect(received).toHaveText(expected)'); expect(output).toContain('Expected pattern: /Text 2/'); expect(output).toContain('Received string: "Text content"'); @@ -68,7 +68,7 @@ test('should support toContainText w/ regex', async ({ runInlineTest }) => { }); `, }, { workers: 1 }); - const output = stripAscii(result.output); + const output = stripAnsi(result.output); expect(output).toContain('Error: expect(received).toContainText(expected)'); expect(output).toContain('Expected pattern: /ex2/'); expect(output).toContain('Received string: "Text content"'); @@ -107,7 +107,7 @@ test('should support toHaveText w/ text', async ({ runInlineTest }) => { }); `, }, { workers: 1 }); - const output = stripAscii(result.output); + const output = stripAnsi(result.output); expect(output).toContain('Error: expect(received).toHaveText(expected)'); expect(output).toContain('Expected string: "Text"'); expect(output).toContain('Received string: "Text content"'); @@ -135,7 +135,7 @@ test('should support toHaveText w/ not', async ({ runInlineTest }) => { }); `, }, { workers: 1 }); - const output = stripAscii(result.output); + const output = stripAnsi(result.output); expect(output).toContain('Error: expect(received).not.toHaveText(expected)'); expect(output).toContain('Expected string: not "Text content"'); expect(output).toContain('Received string: "Text content'); @@ -208,7 +208,7 @@ test('should support toHaveText w/ array', async ({ runInlineTest }) => { }); `, }, { workers: 1 }); - const output = stripAscii(result.output); + const output = stripAnsi(result.output); expect(output).toContain('Error: expect(received).toHaveText(expected) // deep equality'); expect(output).toContain('await expect(locator).toHaveText'); expect(output).toContain('- "Extra"'); @@ -237,7 +237,7 @@ test('should support toContainText w/ array', async ({ runInlineTest }) => { }); `, }, { workers: 1 }); - const output = stripAscii(result.output); + const output = stripAnsi(result.output); expect(output).toContain('Error: expect(received).toContainText(expected)'); expect(output).toContain('await expect(locator).toContainText'); expect(output).toContain('- "Text 2"'); @@ -403,8 +403,8 @@ test('should print expected/received before timeout', async ({ runInlineTest }) expect(result.passed).toBe(0); expect(result.failed).toBe(1); expect(result.output).toContain('Timeout of 2000ms exceeded.'); - expect(stripAscii(result.output)).toContain('Expected string: "Text 2"'); - expect(stripAscii(result.output)).toContain('Received string: "Text content"'); + expect(stripAnsi(result.output)).toContain('Expected string: "Text 2"'); + expect(stripAnsi(result.output)).toContain('Received string: "Text content"'); }); test('should print nice error for toHaveText', async ({ runInlineTest }) => { @@ -420,7 +420,7 @@ test('should print nice error for toHaveText', async ({ runInlineTest }) => { }, { workers: 1, timeout: 2000 }); expect(result.failed).toBe(1); expect(result.exitCode).toBe(1); - const output = stripAscii(result.output); + const output = stripAnsi(result.output); expect(output).toContain('Pending operations:'); expect(output).toContain('Error: expect(received).toHaveText(expected)'); expect(output).toContain('Expected string: "Text"'); @@ -447,8 +447,8 @@ test('should print expected/received on Ctrl+C', async ({ runInlineTest }) => { expect(result.exitCode).toBe(130); expect(result.passed).toBe(0); expect(result.skipped).toBe(1); - expect(stripAscii(result.output)).toContain('Expected string: "Text 2"'); - expect(stripAscii(result.output)).toContain('Received string: "Text content"'); + expect(stripAnsi(result.output)).toContain('Expected string: "Text 2"'); + expect(stripAnsi(result.output)).toContain('Received string: "Text content"'); }); test('should support not.toHaveText when selector does not match', async ({ runInlineTest }) => { @@ -465,7 +465,7 @@ test('should support not.toHaveText when selector does not match', async ({ runI expect(result.exitCode).toBe(1); expect(result.passed).toBe(0); expect(result.failed).toBe(1); - const output = stripAscii(result.output); + const output = stripAnsi(result.output); expect(output).toContain('Expected string: not "hello"'); expect(output).toContain('Received string: ""'); expect(output).toContain('waiting for selector "span"'); diff --git a/tests/playwright-test/playwright.expect.true.spec.ts b/tests/playwright-test/playwright.expect.true.spec.ts index e80fb6d01e6e1..0328e4bf34b1c 100644 --- a/tests/playwright-test/playwright.expect.true.spec.ts +++ b/tests/playwright-test/playwright.expect.true.spec.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { test, expect, stripAscii } from './playwright-test-fixtures'; +import { test, expect, stripAnsi } from './playwright-test-fixtures'; test('should support toBeChecked', async ({ runInlineTest }) => { const result = await runInlineTest({ @@ -46,7 +46,7 @@ test('should support toBeChecked', async ({ runInlineTest }) => { }); `, }, { workers: 1 }); - const output = stripAscii(result.output); + const output = stripAnsi(result.output); expect(output).toContain('Error: expect(received).toBeChecked()'); expect(output).toContain('expect(locator).toBeChecked'); expect(result.passed).toBe(3); @@ -90,7 +90,7 @@ test('should support toBeChecked w/ not', async ({ runInlineTest }) => { }); `, }, { workers: 1 }); - const output = stripAscii(result.output); + const output = stripAnsi(result.output); expect(result.passed).toBe(2); expect(result.failed).toBe(3); expect(result.exitCode).toBe(1); @@ -172,7 +172,7 @@ test('should support toBeEditable, toBeEnabled, toBeDisabled, toBeEmpty', async expect(result.passed).toBe(8); expect(result.failed).toBe(1); expect(result.exitCode).toBe(1); - const output = stripAscii(result.output); + const output = stripAnsi(result.output); expect(output).toContain('expect(locator).toBeEnabled({ timeout: 500 }'); }); diff --git a/tests/playwright-test/playwright.spec.ts b/tests/playwright-test/playwright.spec.ts index 1c1cdde31f81b..8a14eb4a116fd 100644 --- a/tests/playwright-test/playwright.spec.ts +++ b/tests/playwright-test/playwright.spec.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { test, expect, stripAscii } from './playwright-test-fixtures'; +import { test, expect, stripAnsi } from './playwright-test-fixtures'; import fs from 'fs'; import path from 'path'; import { spawnSync } from 'child_process'; @@ -306,7 +306,7 @@ test('should report error and pending operations on timeout', async ({ runInline expect(result.output).toContain('- page.click at a.test.ts:9:16'); expect(result.output).toContain('- page.textContent at a.test.ts:10:16'); expect(result.output).toContain('waiting for selector'); - expect(stripAscii(result.output)).toContain(`10 | page.textContent('text=More missing'),`); + expect(stripAnsi(result.output)).toContain(`10 | page.textContent('text=More missing'),`); }); test('should report error on timeout with shared page', async ({ runInlineTest }, testInfo) => { @@ -330,7 +330,7 @@ test('should report error on timeout with shared page', async ({ runInlineTest } expect(result.passed).toBe(1); expect(result.failed).toBe(1); expect(result.output).toContain('waiting for selector "text=Missing"'); - expect(stripAscii(result.output)).toContain(`14 | await page.click('text=Missing');`); + expect(stripAnsi(result.output)).toContain(`14 | await page.click('text=Missing');`); }); test('should report error and pending operations from beforeAll timeout', async ({ runInlineTest }, testInfo) => { @@ -357,7 +357,7 @@ test('should report error and pending operations from beforeAll timeout', async expect(result.output).toContain('- page.click at a.test.ts:10:16'); expect(result.output).toContain('- page.textContent at a.test.ts:11:16'); expect(result.output).toContain('waiting for selector'); - expect(stripAscii(result.output)).toContain(`11 | page.textContent('text=More missing'),`); + expect(stripAnsi(result.output)).toContain(`11 | page.textContent('text=More missing'),`); }); test('should not report waitForEventInfo as pending', async ({ runInlineTest }, testInfo) => { @@ -417,7 +417,7 @@ test('should report click error on sigint', async ({ runInlineTest }) => { expect(result.passed).toBe(0); expect(result.failed).toBe(0); expect(result.skipped).toBe(1); - expect(stripAscii(result.output)).toContain(`8 | const promise = page.click('text=Missing');`); + expect(stripAnsi(result.output)).toContain(`8 | const promise = page.click('text=Missing');`); }); test('should work with video: retain-on-failure', async ({ runInlineTest }, testInfo) => { diff --git a/tests/playwright-test/playwright.trace.spec.ts b/tests/playwright-test/playwright.trace.spec.ts index 4206991472c37..4b2ae28fb75ca 100644 --- a/tests/playwright-test/playwright.trace.spec.ts +++ b/tests/playwright-test/playwright.trace.spec.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { test, expect, stripAscii } from './playwright-test-fixtures'; +import { test, expect, stripAnsi } from './playwright-test-fixtures'; import { ZipFileSystem } from '../../packages/playwright-core/lib/utils/vfs'; import fs from 'fs'; @@ -108,8 +108,8 @@ test('should not throw with trace and timeouts', async ({ runInlineTest }, testI }, { workers: 2 }); expect(result.exitCode).toBe(1); - expect(stripAscii(result.output)).not.toContain('tracing.stopChunk:'); - expect(stripAscii(result.output)).not.toContain('tracing.stop:'); + expect(stripAnsi(result.output)).not.toContain('tracing.stopChunk:'); + expect(stripAnsi(result.output)).not.toContain('tracing.stop:'); }); test('should save sources when requested', async ({ runInlineTest }, testInfo) => { diff --git a/tests/playwright-test/reporter-attachment.spec.ts b/tests/playwright-test/reporter-attachment.spec.ts index ade6795ba6349..bfc12005e83f4 100644 --- a/tests/playwright-test/reporter-attachment.spec.ts +++ b/tests/playwright-test/reporter-attachment.spec.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { test, expect, stripAscii } from './playwright-test-fixtures'; +import { test, expect, stripAnsi } from './playwright-test-fixtures'; test('render text attachment', async ({ runInlineTest }) => { const result = await runInlineTest({ @@ -30,7 +30,7 @@ test('render text attachment', async ({ runInlineTest }) => { }); `, }, { reporter: 'line' }); - const text = stripAscii(result.output); + const text = stripAnsi(result.output); expect(text).toContain(' attachment #1: attachment (text/plain) ---------------------------------------------------------'); expect(text).toContain(' Hello world'); expect(text).toContain(' ------------------------------------------------------------------------------------------------'); @@ -51,7 +51,7 @@ test('render screenshot attachment', async ({ runInlineTest }) => { }); `, }, { reporter: 'line' }); - const text = stripAscii(result.output).replace(/\\/g, '/'); + const text = stripAnsi(result.output).replace(/\\/g, '/'); expect(text).toContain(' attachment #1: screenshot (image/png) ----------------------------------------------------------'); expect(text).toContain(' test-results/a-one/some/path.png'); expect(text).toContain(' ------------------------------------------------------------------------------------------------'); @@ -72,7 +72,7 @@ test('render trace attachment', async ({ runInlineTest }) => { }); `, }, { reporter: 'line' }); - const text = stripAscii(result.output).replace(/\\/g, '/'); + const text = stripAnsi(result.output).replace(/\\/g, '/'); expect(text).toContain(' attachment #1: trace (application/zip) ---------------------------------------------------------'); expect(text).toContain(' test-results/a-one/trace.zip'); expect(text).toContain('npx playwright show-trace test-results/a-one/trace.zip'); @@ -95,7 +95,7 @@ test(`testInfo.attach errors`, async ({ runInlineTest }) => { }); `, }, { reporter: 'line', workers: 1 }); - const text = stripAscii(result.output).replace(/\\/g, '/'); + const text = stripAnsi(result.output).replace(/\\/g, '/'); expect(text).toMatch(/Error: ENOENT: no such file or directory, copyfile '.*foo.txt.*'/); expect(text).toContain(`Exactly one of "path" and "body" must be specified`); expect(result.passed).toBe(0); @@ -112,7 +112,7 @@ test(`testInfo.attach errors with empty path`, async ({ runInlineTest }) => { }); `, }, { reporter: 'line', workers: 1 }); - expect(stripAscii(result.output)).toMatch(/Error: ENOENT: no such file or directory, copyfile ''/); + expect(stripAnsi(result.output)).toMatch(/Error: ENOENT: no such file or directory, copyfile ''/); expect(result.exitCode).toBe(1); }); @@ -129,7 +129,7 @@ test(`testInfo.attach error in fixture`, async ({ runInlineTest }) => { }); `, }, { reporter: 'line', workers: 1 }); - const text = stripAscii(result.output).replace(/\\/g, '/'); + const text = stripAnsi(result.output).replace(/\\/g, '/'); expect(text).toMatch(/Error: ENOENT: no such file or directory, copyfile '.*foo.txt.*'/); expect(result.exitCode).toBe(1); expect(result.passed).toBe(0); @@ -154,7 +154,7 @@ test(`testInfo.attach success in fixture`, async ({ runInlineTest }) => { }); expect(result.exitCode).toBe(1); expect(result.failed).toBe(1); - expect(stripAscii(result.output)).toContain('attachment #1: name (text/plain)'); + expect(stripAnsi(result.output)).toContain('attachment #1: name (text/plain)'); }); test(`testInfo.attach allow empty string body`, async ({ runInlineTest }) => { @@ -169,7 +169,7 @@ test(`testInfo.attach allow empty string body`, async ({ runInlineTest }) => { }); expect(result.exitCode).toBe(1); expect(result.failed).toBe(1); - expect(stripAscii(result.output)).toMatch(/^.*attachment #1: name \(text\/plain\).*\n.*\n.*------/gm); + expect(stripAnsi(result.output)).toMatch(/^.*attachment #1: name \(text\/plain\).*\n.*\n.*------/gm); }); test(`testInfo.attach allow empty buffer body`, async ({ runInlineTest }) => { @@ -184,5 +184,5 @@ test(`testInfo.attach allow empty buffer body`, async ({ runInlineTest }) => { }); expect(result.exitCode).toBe(1); expect(result.failed).toBe(1); - expect(stripAscii(result.output)).toMatch(/^.*attachment #1: name \(text\/plain\).*\n.*\n.*------/gm); + expect(stripAnsi(result.output)).toMatch(/^.*attachment #1: name \(text\/plain\).*\n.*\n.*------/gm); }); diff --git a/tests/playwright-test/reporter-base.spec.ts b/tests/playwright-test/reporter-base.spec.ts index faa9c4b01822f..259ee871f2f3e 100644 --- a/tests/playwright-test/reporter-base.spec.ts +++ b/tests/playwright-test/reporter-base.spec.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { test, expect, stripAscii } from './playwright-test-fixtures'; +import { test, expect, stripAnsi } from './playwright-test-fixtures'; import * as path from 'path'; test('handle long test names', async ({ runInlineTest }) => { @@ -27,7 +27,7 @@ test('handle long test names', async ({ runInlineTest }) => { }); `, }); - expect(stripAscii(result.output)).toContain('expect(1).toBe'); + expect(stripAnsi(result.output)).toContain('expect(1).toBe'); expect(result.exitCode).toBe(1); }); @@ -138,15 +138,15 @@ test('should print slow tests', async ({ runInlineTest }) => { }); expect(result.exitCode).toBe(0); expect(result.passed).toBe(8); - expect(stripAscii(result.output)).toContain(`Slow test file: [foo] › dir${path.sep}a.test.js (`); - expect(stripAscii(result.output)).toContain(`Slow test file: [bar] › dir${path.sep}a.test.js (`); - expect(stripAscii(result.output)).toContain(`Slow test file: [baz] › dir${path.sep}a.test.js (`); - expect(stripAscii(result.output)).toContain(`Slow test file: [qux] › dir${path.sep}a.test.js (`); - expect(stripAscii(result.output)).toContain(`Consider splitting slow test files to speed up parallel execution`); - expect(stripAscii(result.output)).not.toContain(`Slow test file: [foo] › dir${path.sep}b.test.js (`); - expect(stripAscii(result.output)).not.toContain(`Slow test file: [bar] › dir${path.sep}b.test.js (`); - expect(stripAscii(result.output)).not.toContain(`Slow test file: [baz] › dir${path.sep}b.test.js (`); - expect(stripAscii(result.output)).not.toContain(`Slow test file: [qux] › dir${path.sep}b.test.js (`); + expect(stripAnsi(result.output)).toContain(`Slow test file: [foo] › dir${path.sep}a.test.js (`); + expect(stripAnsi(result.output)).toContain(`Slow test file: [bar] › dir${path.sep}a.test.js (`); + expect(stripAnsi(result.output)).toContain(`Slow test file: [baz] › dir${path.sep}a.test.js (`); + expect(stripAnsi(result.output)).toContain(`Slow test file: [qux] › dir${path.sep}a.test.js (`); + expect(stripAnsi(result.output)).toContain(`Consider splitting slow test files to speed up parallel execution`); + expect(stripAnsi(result.output)).not.toContain(`Slow test file: [foo] › dir${path.sep}b.test.js (`); + expect(stripAnsi(result.output)).not.toContain(`Slow test file: [bar] › dir${path.sep}b.test.js (`); + expect(stripAnsi(result.output)).not.toContain(`Slow test file: [baz] › dir${path.sep}b.test.js (`); + expect(stripAnsi(result.output)).not.toContain(`Slow test file: [qux] › dir${path.sep}b.test.js (`); }); test('should not print slow tests', async ({ runInlineTest }) => { @@ -172,7 +172,7 @@ test('should not print slow tests', async ({ runInlineTest }) => { }); expect(result.exitCode).toBe(0); expect(result.passed).toBe(4); - expect(stripAscii(result.output)).not.toContain('Slow test'); + expect(stripAnsi(result.output)).not.toContain('Slow test'); }); test('should print flaky failures', async ({ runInlineTest }) => { @@ -186,7 +186,7 @@ test('should print flaky failures', async ({ runInlineTest }) => { }, { retries: '1', reporter: 'list' }); expect(result.exitCode).toBe(0); expect(result.flaky).toBe(1); - expect(stripAscii(result.output)).toContain('expect(testInfo.retry).toBe(1)'); + expect(stripAnsi(result.output)).toContain('expect(testInfo.retry).toBe(1)'); }); test('should print flaky timeouts', async ({ runInlineTest }) => { @@ -201,7 +201,7 @@ test('should print flaky timeouts', async ({ runInlineTest }) => { }, { retries: '1', reporter: 'list', timeout: '1000' }); expect(result.exitCode).toBe(0); expect(result.flaky).toBe(1); - expect(stripAscii(result.output)).toContain('Timeout of 1000ms exceeded.'); + expect(stripAnsi(result.output)).toContain('Timeout of 1000ms exceeded.'); }); test('should print stack-less errors', async ({ runInlineTest }) => { diff --git a/tests/playwright-test/reporter-dot.spec.ts b/tests/playwright-test/reporter-dot.spec.ts index 6af251995bddc..5571c42763d8e 100644 --- a/tests/playwright-test/reporter-dot.spec.ts +++ b/tests/playwright-test/reporter-dot.spec.ts @@ -15,7 +15,7 @@ */ import colors from 'colors/safe'; -import { test, expect, stripAscii } from './playwright-test-fixtures'; +import { test, expect, stripAnsi } from './playwright-test-fixtures'; test('render expected', async ({ runInlineTest }) => { const result = await runInlineTest({ @@ -52,7 +52,7 @@ test('render unexpected after retry', async ({ runInlineTest }) => { }); `, }, { retries: 3 }); - const text = stripAscii(result.output); + const text = stripAnsi(result.output); expect(text).toContain('×××F'); expect(result.output).toContain(colors.red('F')); expect(result.exitCode).toBe(1); @@ -67,7 +67,7 @@ test('render flaky', async ({ runInlineTest }) => { }); `, }, { retries: 3 }); - const text = stripAscii(result.output); + const text = stripAnsi(result.output); expect(text).toContain('×××±'); expect(result.output).toContain(colors.yellow('±')); expect(text).toContain('1 flaky'); diff --git a/tests/playwright-test/reporter-github.spec.ts b/tests/playwright-test/reporter-github.spec.ts index a7f242c6b9da5..44a2ef3e7ea20 100644 --- a/tests/playwright-test/reporter-github.spec.ts +++ b/tests/playwright-test/reporter-github.spec.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { test, expect, stripAscii } from './playwright-test-fixtures'; +import { test, expect, stripAnsi } from './playwright-test-fixtures'; import path from 'path'; function relativeFilePath(file: string): string { @@ -32,7 +32,7 @@ test('print GitHub annotations for success', async ({ runInlineTest }) => { }); ` }, { reporter: 'github' }); - const text = stripAscii(result.output); + const text = stripAnsi(result.output); expect(text).not.toContain('::error'); expect(text).toContain('::notice title=🎭 Playwright Run Summary:: 1 passed'); expect(result.exitCode).toBe(0); @@ -47,7 +47,7 @@ test('print GitHub annotations for failed tests', async ({ runInlineTest }, test }); ` }, { retries: 3, reporter: 'github' }, { GITHUB_WORKSPACE: process.cwd() }); - const text = stripAscii(result.output); + const text = stripAnsi(result.output); const testPath = relativeFilePath(testInfo.outputPath('a.test.js')); expect(text).toContain(`::error file=${testPath},title=a.test.js:6:7 › example,line=7,col=23:: 1) a.test.js:6:7 › example =======================================================================%0A%0A Retry #1`); expect(text).toContain(`::error file=${testPath},title=a.test.js:6:7 › example,line=7,col=23:: 1) a.test.js:6:7 › example =======================================================================%0A%0A Retry #2`); @@ -69,7 +69,7 @@ test('print GitHub annotations for slow tests', async ({ runInlineTest }) => { }); ` }, { retries: 3, reporter: 'github' }, { GITHUB_WORKSPACE: '' }); - const text = stripAscii(result.output); + const text = stripAnsi(result.output); expect(text).toContain('::warning title=Slow Test,file=a.test.js::a.test.js took'); expect(text).toContain('::notice title=🎭 Playwright Run Summary:: 1 passed'); expect(result.exitCode).toBe(0); @@ -88,7 +88,7 @@ test('print GitHub annotations for global error', async ({ runInlineTest }) => { }); `, }, { reporter: 'github' }); - const text = stripAscii(result.output); + const text = stripAnsi(result.output); expect(text).toContain('::error ::%0AError: Oh my!%0A%0A'); expect(result.exitCode).toBe(1); }); diff --git a/tests/playwright-test/reporter-json.spec.ts b/tests/playwright-test/reporter-json.spec.ts index d1626dfd56c57..fa2ed96c46d58 100644 --- a/tests/playwright-test/reporter-json.spec.ts +++ b/tests/playwright-test/reporter-json.spec.ts @@ -16,7 +16,7 @@ import * as path from 'path'; import * as fs from 'fs'; -import { test, expect, stripAscii } from './playwright-test-fixtures'; +import { test, expect, stripAnsi } from './playwright-test-fixtures'; test('should support spec.ok', async ({ runInlineTest }) => { const result = await runInlineTest({ @@ -215,6 +215,6 @@ test('should add dot in addition to file json', async ({ runInlineTest }, testIn `, }, { reporter: '' }); expect(result.exitCode).toBe(0); - expect(stripAscii(result.output)).toContain('·'); + expect(stripAnsi(result.output)).toContain('·'); expect(fs.existsSync(testInfo.outputPath('a.json'))).toBeTruthy(); }); diff --git a/tests/playwright-test/reporter-line.spec.ts b/tests/playwright-test/reporter-line.spec.ts index c2f8c48da48ca..4f56b391191b2 100644 --- a/tests/playwright-test/reporter-line.spec.ts +++ b/tests/playwright-test/reporter-line.spec.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { test, expect, stripAscii } from './playwright-test-fixtures'; +import { test, expect, stripAnsi } from './playwright-test-fixtures'; test('render unexpected after retry', async ({ runInlineTest }) => { const result = await runInlineTest({ @@ -25,7 +25,7 @@ test('render unexpected after retry', async ({ runInlineTest }) => { }); `, }, { retries: 3, reporter: 'line' }); - const text = stripAscii(result.output); + const text = stripAnsi(result.output); expect(text).toContain('[1/1] a.test.js:6:7 › one'); expect(text).toContain('[2/1] (retries) a.test.js:6:7 › one (retry #1)'); expect(text).toContain('[3/1] (retries) a.test.js:6:7 › one (retry #2)'); @@ -48,7 +48,7 @@ test('render flaky', async ({ runInlineTest }) => { }); `, }, { retries: 3, reporter: 'line' }); - const text = stripAscii(result.output); + const text = stripAnsi(result.output); expect(text).toContain('1 flaky'); expect(result.exitCode).toBe(0); }); @@ -64,5 +64,5 @@ test('should print flaky failures', async ({ runInlineTest }) => { }, { retries: '1', reporter: 'line' }); expect(result.exitCode).toBe(0); expect(result.flaky).toBe(1); - expect(stripAscii(result.output)).toContain('expect(testInfo.retry).toBe(1)'); + expect(stripAnsi(result.output)).toContain('expect(testInfo.retry).toBe(1)'); }); diff --git a/tests/playwright-test/reporter-list.spec.ts b/tests/playwright-test/reporter-list.spec.ts index 216ef64740f2c..a060da34411bb 100644 --- a/tests/playwright-test/reporter-list.spec.ts +++ b/tests/playwright-test/reporter-list.spec.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { test, expect, stripAscii } from './playwright-test-fixtures'; +import { test, expect, stripAnsi } from './playwright-test-fixtures'; test('render each test with project name', async ({ runInlineTest }) => { const result = await runInlineTest({ @@ -36,7 +36,7 @@ test('render each test with project name', async ({ runInlineTest }) => { }); `, }, { reporter: 'list' }); - const text = stripAscii(result.output); + const text = stripAnsi(result.output); const positiveStatusMarkPrefix = process.platform === 'win32' ? 'ok' : '✓ '; const negativateStatusMarkPrefix = process.platform === 'win32' ? 'x ' : '✘ '; expect(text).toContain(`${negativateStatusMarkPrefix} [foo] › a.test.ts:6:7 › fails`); @@ -64,7 +64,7 @@ test('render steps', async ({ runInlineTest }) => { }); `, }, { reporter: 'list' }); - const text = stripAscii(result.output); + const text = stripAnsi(result.output); const lines = text.split('\n').filter(l => l.startsWith('0 :')); lines.pop(); // Remove last item that contains [v] and time in ms. expect(lines).toEqual([ @@ -92,7 +92,7 @@ test('render retries', async ({ runInlineTest }) => { }); `, }, { reporter: 'list', retries: '1' }); - const text = stripAscii(result.output); + const text = stripAnsi(result.output); const lines = text.split('\n').filter(l => l.startsWith('0 :') || l.startsWith('1 :')).map(l => l.replace(/[\dm]+s/, 'XXms')); const positiveStatusMarkPrefix = process.platform === 'win32' ? 'ok' : '✓ '; const negativateStatusMarkPrefix = process.platform === 'win32' ? 'x ' : '✘ '; @@ -122,7 +122,7 @@ test('should truncate long test names', async ({ runInlineTest }) => { }); `, }, { reporter: 'list', retries: 0 }, { PWTEST_TTY_WIDTH: 50, PWTEST_SKIP_TEST_OUTPUT: undefined }); - const text = stripAscii(result.output); + const text = stripAnsi(result.output); const positiveStatusMarkPrefix = process.platform === 'win32' ? 'ok' : '✓ '; const negativateStatusMarkPrefix = process.platform === 'win32' ? 'x ' : '✘ '; expect(text).toContain(`${negativateStatusMarkPrefix} [foo] › a.test.ts:6:7 › fails very`); diff --git a/tests/playwright-test/retry.spec.ts b/tests/playwright-test/retry.spec.ts index af989a1f0e627..d37f04dd4fb63 100644 --- a/tests/playwright-test/retry.spec.ts +++ b/tests/playwright-test/retry.spec.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { test, expect, stripAscii } from './playwright-test-fixtures'; +import { test, expect, stripAnsi } from './playwright-test-fixtures'; test('should retry failures', async ({ runInlineTest }) => { const result = await runInlineTest({ @@ -72,7 +72,7 @@ test('should retry timeout', async ({ runInlineTest }) => { expect(exitCode).toBe(1); expect(passed).toBe(0); expect(failed).toBe(1); - expect(stripAscii(output).split('\n')[2]).toBe('××T'); + expect(stripAnsi(output).split('\n')[2]).toBe('××T'); }); test('should fail on unexpected pass with retries', async ({ runInlineTest }) => { @@ -103,7 +103,7 @@ test('should retry unexpected pass', async ({ runInlineTest }) => { expect(exitCode).toBe(1); expect(passed).toBe(0); expect(failed).toBe(1); - expect(stripAscii(output).split('\n')[2]).toBe('××F'); + expect(stripAnsi(output).split('\n')[2]).toBe('××F'); }); test('should not retry expected failure', async ({ runInlineTest }) => { @@ -123,7 +123,7 @@ test('should not retry expected failure', async ({ runInlineTest }) => { expect(exitCode).toBe(0); expect(passed).toBe(2); expect(failed).toBe(0); - expect(stripAscii(output).split('\n')[2]).toBe('··'); + expect(stripAnsi(output).split('\n')[2]).toBe('··'); }); test('should retry unhandled rejection', async ({ runInlineTest }) => { @@ -141,7 +141,7 @@ test('should retry unhandled rejection', async ({ runInlineTest }) => { expect(result.exitCode).toBe(1); expect(result.passed).toBe(0); expect(result.failed).toBe(1); - expect(stripAscii(result.output).split('\n')[2]).toBe('××F'); + expect(stripAnsi(result.output).split('\n')[2]).toBe('××F'); expect(result.output).toContain('Unhandled rejection'); }); @@ -162,7 +162,7 @@ test('should retry beforeAll failure', async ({ runInlineTest }) => { expect(result.passed).toBe(0); expect(result.failed).toBe(1); expect(result.skipped).toBe(1); - expect(stripAscii(result.output).split('\n')[2]).toBe('×°×°F°'); + expect(stripAnsi(result.output).split('\n')[2]).toBe('×°×°F°'); expect(result.output).toContain('BeforeAll is bugged!'); }); @@ -184,6 +184,6 @@ test('should retry worker fixture setup failure', async ({ runInlineTest }) => { expect(result.exitCode).toBe(1); expect(result.passed).toBe(0); expect(result.failed).toBe(1); - expect(stripAscii(result.output).split('\n')[2]).toBe('××F'); + expect(stripAnsi(result.output).split('\n')[2]).toBe('××F'); expect(result.output).toContain('worker setup is bugged!'); }); diff --git a/tests/playwright-test/runner.spec.ts b/tests/playwright-test/runner.spec.ts index df287a26a7cf8..143cd84fbe433 100644 --- a/tests/playwright-test/runner.spec.ts +++ b/tests/playwright-test/runner.spec.ts @@ -14,7 +14,7 @@ * limitations under the License. */ import path from 'path'; -import { test, expect, stripAscii } from './playwright-test-fixtures'; +import { test, expect, stripAnsi } from './playwright-test-fixtures'; test('it should not allow multiple tests with the same name per suite', async ({ runInlineTest }) => { const result = await runInlineTest({ @@ -194,7 +194,7 @@ test('should not stall when workers are available', async ({ runInlineTest }) => expect(result.exitCode).toBe(1); expect(result.passed).toBe(2); expect(result.failed).toBe(1); - expect(stripAscii(result.output).split('\n').filter(line => line.startsWith('%%'))).toEqual([ + expect(stripAnsi(result.output).split('\n').filter(line => line.startsWith('%%'))).toEqual([ '%%fails-1-started', '%%passes-2-started', '%%fails-1-done', diff --git a/tests/playwright-test/test-info.spec.ts b/tests/playwright-test/test-info.spec.ts index a69019c9080ca..27e676c173eab 100644 --- a/tests/playwright-test/test-info.spec.ts +++ b/tests/playwright-test/test-info.spec.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { test, expect, stripAscii } from './playwright-test-fixtures'; +import { test, expect, stripAnsi } from './playwright-test-fixtures'; test('should work directly', async ({ runInlineTest }) => { const result = await runInlineTest({ @@ -84,7 +84,7 @@ test('should throw outside test', async ({ runInlineTest }) => { test('test 1', async ({title}) => {}); `, }); - const output = stripAscii(result.output); + const output = stripAnsi(result.output); expect(result.exitCode).toBe(1); expect(output).toContain('test.info() can only be called while test is running'); }); diff --git a/tests/playwright-test/test-modifiers.spec.ts b/tests/playwright-test/test-modifiers.spec.ts index 4133b597a6527..8c2af4deeaac2 100644 --- a/tests/playwright-test/test-modifiers.spec.ts +++ b/tests/playwright-test/test-modifiers.spec.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { test, expect, stripAscii } from './playwright-test-fixtures'; +import { test, expect, stripAnsi } from './playwright-test-fixtures'; test('test modifiers should work', async ({ runInlineTest }) => { const result = await runInlineTest({ @@ -331,5 +331,5 @@ test('modifier timeout should be reported', async ({ runInlineTest }) => { expect(result.exitCode).toBe(1); expect(result.failed).toBe(1); expect(result.output).toContain('Error: Timeout of 2000ms exceeded while running skip modifier'); - expect(stripAscii(result.output)).toContain('6 | test.skip(async () => new Promise(() => {}));'); + expect(stripAnsi(result.output)).toContain('6 | test.skip(async () => new Promise(() => {}));'); }); From c5d852f1bbe6e0920efa6a252b7368ba424c76ef Mon Sep 17 00:00:00 2001 From: Pavel Feldman Date: Mon, 31 Jan 2022 17:48:05 -0800 Subject: [PATCH 165/233] fix(test-runner): escape backslashes in win cli (#11763) --- packages/playwright-test/src/cli.ts | 2 +- tests/playwright-test/command-line-filter.spec.ts | 9 +++++++++ tests/playwright-test/test-ignore.spec.ts | 2 +- 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/packages/playwright-test/src/cli.ts b/packages/playwright-test/src/cli.ts index b0ea52565528c..b0ef5cebc8ae4 100644 --- a/packages/playwright-test/src/cli.ts +++ b/packages/playwright-test/src/cli.ts @@ -181,7 +181,7 @@ function forceRegExp(pattern: string): RegExp { const match = pattern.match(/^\/(.*)\/([gi]*)$/); if (match) return new RegExp(match[1], match[2]); - return new RegExp(pattern, 'gi'); + return new RegExp(pattern.replace(/\\/g, '\\\\'), 'gi'); } function overridesFromOptions(options: { [key: string]: any }): Config { diff --git a/tests/playwright-test/command-line-filter.spec.ts b/tests/playwright-test/command-line-filter.spec.ts index c0a9fe3e72aae..3a698a9cec9c5 100644 --- a/tests/playwright-test/command-line-filter.spec.ts +++ b/tests/playwright-test/command-line-filter.spec.ts @@ -15,6 +15,7 @@ */ import { test, expect } from './playwright-test-fixtures'; +import path from 'path'; test('should filter by file name', async ({ runInlineTest }) => { const result = await runInlineTest({ @@ -93,6 +94,14 @@ test('should run nothing for missing line', async ({ runInlineTest }) => { expect(result.failed).toBe(1); }); +test('should escape path on windows', async ({ runInlineTest }) => { + const result = await runInlineTest({ + 'foo/test.spec.ts': `pwt.test('fails', () => { expect(1).toBe(2); });`, + }, undefined, undefined, { additionalArgs: [path.join('foo', 'test.spec.ts')] }); + expect(result.exitCode).toBe(1); + expect(result.failed).toBe(1); +}); + test('should focus a single nested test spec', async ({ runInlineTest }) => { const result = await runInlineTest({ 'foo.test.ts': ` diff --git a/tests/playwright-test/test-ignore.spec.ts b/tests/playwright-test/test-ignore.spec.ts index 2f72663118856..049ba76a0e69f 100644 --- a/tests/playwright-test/test-ignore.spec.ts +++ b/tests/playwright-test/test-ignore.spec.ts @@ -185,7 +185,7 @@ test('should match cli string argument', async ({ runInlineTest }) => { const { test } = pwt; test('pass', ({}) => {}); ` - }, {}, {}, { additionalArgs: [`dir\\${path.sep}a`] }); + }, {}, {}, { additionalArgs: [`dir${path.sep}a`] }); expect(result.passed).toBe(1); expect(result.report.suites.map(s => s.file).sort()).toEqual(['a.test.ts']); expect(result.exitCode).toBe(0); From c82f2641d7941143282e1bed1540d561f00e2aa9 Mon Sep 17 00:00:00 2001 From: Pavel Feldman Date: Tue, 1 Feb 2022 08:08:56 -0800 Subject: [PATCH 166/233] fet(list-files): report per-project test dir and filters (#11764) --- packages/playwright-core/src/cli/innerCli.ts | 2 +- packages/playwright-test/src/cli.ts | 14 +++++++------- packages/playwright-test/src/runner.ts | 7 +++---- 3 files changed, 11 insertions(+), 12 deletions(-) diff --git a/packages/playwright-core/src/cli/innerCli.ts b/packages/playwright-core/src/cli/innerCli.ts index 097eddc68026c..6c588e8da18a6 100644 --- a/packages/playwright-core/src/cli/innerCli.ts +++ b/packages/playwright-core/src/cli/innerCli.ts @@ -246,7 +246,7 @@ if (!process.env.PW_LANG_NAME) { if (playwrightTestPackagePath) { require(playwrightTestPackagePath).addTestCommand(program); require(playwrightTestPackagePath).addShowReportCommand(program); - require(playwrightTestPackagePath).addListTestsCommand(program); + require(playwrightTestPackagePath).addListFilesCommand(program); } else { { const command = program.command('test').allowUnknownOption(true); diff --git a/packages/playwright-test/src/cli.ts b/packages/playwright-test/src/cli.ts index b0ef5cebc8ae4..9ff010e07c1f2 100644 --- a/packages/playwright-test/src/cli.ts +++ b/packages/playwright-test/src/cli.ts @@ -73,14 +73,14 @@ Examples: $ npx playwright test --browser=webkit`); } -export function addListTestsCommand(program: Command) { - const command = program.command('list-tests [test-filter...]', { hidden: true }); - command.description('List tests with Playwright Test'); +export function addListFilesCommand(program: Command) { + const command = program.command('list-files [file-filter...]', { hidden: true }); + command.description('List files with Playwright Test tests'); command.option('-c, --config ', `Configuration file, or a test directory with optional ${kDefaultConfigFiles.map(file => `"${file}"`).join('/')}`); command.option('--project ', `Only run tests from the specified list of projects (default: list all projects)`); command.action(async (args, opts) => { try { - await listTests(opts); + await listTestFiles(opts); } catch (e) { console.error(e); process.exit(1); @@ -167,11 +167,11 @@ async function runTests(args: string[], opts: { [key: string]: any }) { } -async function listTests(opts: { [key: string]: any }) { +async function listTestFiles(opts: { [key: string]: any }) { const configFile = opts.config ? path.resolve(process.cwd(), opts.config) : process.cwd(); const runner = new Runner({}, { defaultConfig: {} }); - const config = await runner.loadConfigFromFile(configFile); - const report = await runner.listAllTestFiles(config, opts.project); + await runner.loadConfigFromFile(configFile); + const report = await runner.listTestFiles(configFile, opts.project); process.stdout.write(JSON.stringify(report), () => { process.exit(0); }); diff --git a/packages/playwright-test/src/runner.ts b/packages/playwright-test/src/runner.ts index 5485f68701f7e..db003d5b091b2 100644 --- a/packages/playwright-test/src/runner.ts +++ b/packages/playwright-test/src/runner.ts @@ -20,7 +20,7 @@ import * as fs from 'fs'; import * as path from 'path'; import { promisify } from 'util'; import { Dispatcher, TestGroup } from './dispatcher'; -import { createFileMatcher, createTitleMatcher, FilePatternFilter } from './util'; +import { createFileMatcher, createTitleMatcher, FilePatternFilter, serializeError } from './util'; import { TestCase, Suite } from './test'; import { Loader } from './loader'; import { FullResult, Reporter, TestError } from '../types/testReporter'; @@ -39,7 +39,6 @@ import { Config, FullConfig } from './types'; import { WebServer } from './webServer'; import { raceAgainstTimeout } from 'playwright-core/lib/utils/async'; import { SigIntWatcher } from 'playwright-core/lib/utils/utils'; -import { serializeError } from './util'; const removeFolderAsync = promisify(rimraf); const readDirAsync = promisify(fs.readdir); @@ -155,15 +154,15 @@ export class Runner { return fullResult; } - async listAllTestFiles(config: Config, projectNames: string[] | undefined): Promise { + async listTestFiles(configFile: string, projectNames: string[] | undefined): Promise { const filesByProject = await this._collectFiles([], projectNames); const report: any = { - testDir: config.testDir, projects: [] }; for (const [project, files] of filesByProject) { report.projects.push({ name: project.config.name, + testDir: path.resolve(configFile, project.config.testDir), files: files }); } From e0c4e66272fef1088c036ad38ec284a93b18669b Mon Sep 17 00:00:00 2001 From: Max Schmitt Date: Tue, 1 Feb 2022 17:12:11 +0100 Subject: [PATCH 167/233] chore: bump dev dependencies (#11779) --- installation-tests/installation-tests.sh | 4 + package-lock.json | 4992 +++++----------------- package.json | 79 +- tests/browsercontext-fetch.spec.ts | 22 +- tests/page/page-set-input-files.spec.ts | 20 +- 5 files changed, 1171 insertions(+), 3946 deletions(-) diff --git a/installation-tests/installation-tests.sh b/installation-tests/installation-tests.sh index f2da27e90e68f..6bd84917c2269 100755 --- a/installation-tests/installation-tests.sh +++ b/installation-tests/installation-tests.sh @@ -108,6 +108,10 @@ function test_screencast { function test_typescript_types { initialize_test "${FUNCNAME[0]}" copy_test_scripts + # @types/node@14.18.9 is the last version which is compatibel with typescript@3.7.5. + # After @types/node@14.18.9 URLSearchParams from @types/node conflicts with typescript's + # shipped types and it results in a type error / build failure. + npm install -D @types/node@14.18.9 # install all packages. npm install ${PLAYWRIGHT_CORE_TGZ} diff --git a/package-lock.json b/package-lock.json index 79637bc6060a1..06ca59a710135 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,71 +12,72 @@ "packages/*" ], "devDependencies": { - "@babel/cli": "^7.14.8", - "@babel/plugin-transform-typescript": "^7.14.6", - "@babel/preset-react": "^7.14.5", + "@babel/cli": "^7.16.8", + "@babel/plugin-transform-typescript": "^7.16.8", + "@babel/preset-react": "^7.16.7", "@types/babel__code-frame": "^7.0.3", - "@types/babel__core": "^7.1.15", - "@types/debug": "^4.1.5", - "@types/extract-zip": "^1.6.2", + "@types/babel__core": "^7.1.18", + "@types/debug": "^4.1.7", + "@types/formidable": "^2.0.4", "@types/mime": "^2.0.3", - "@types/minimatch": "^3.0.3", + "@types/minimatch": "^3.0.5", "@types/ms": "^0.7.31", - "@types/node": "^14.17.15", - "@types/pixelmatch": "^5.2.1", - "@types/pngjs": "^3.4.2", - "@types/progress": "^2.0.3", - "@types/proper-lockfile": "^4.1.1", + "@types/node": "=14.17.15", + "@types/pixelmatch": "^5.2.4", + "@types/pngjs": "^6.0.1", + "@types/progress": "^2.0.5", + "@types/proper-lockfile": "^4.1.2", "@types/proxy-from-env": "^1.0.1", - "@types/react": "^17.0.0", - "@types/react-dom": "^17.0.0", - "@types/resize-observer-browser": "^0.1.4", - "@types/rimraf": "^3.0.0", - "@types/source-map-support": "^0.4.2", + "@types/react": "^17.0.38", + "@types/react-dom": "^17.0.11", + "@types/resize-observer-browser": "^0.1.6", + "@types/rimraf": "^3.0.2", + "@types/source-map-support": "^0.5.4", "@types/webpack": "^5.28.0", "@types/ws": "7.2.6", - "@types/xml2js": "^0.4.5", + "@types/xml2js": "^0.4.9", "@types/yazl": "^2.4.2", - "@typescript-eslint/eslint-plugin": "^5.4.0", - "@typescript-eslint/parser": "^5.4.0", - "@zip.js/zip.js": "^2.3.17", - "ansi-to-html": "^0.7.1", - "babel-loader": "^8.2.2", - "chokidar": "^3.5.0", - "commonmark": "^0.29.1", + "@typescript-eslint/eslint-plugin": "^5.10.2", + "@typescript-eslint/parser": "^5.10.2", + "@zip.js/zip.js": "^2.4.2", + "ansi-to-html": "^0.7.2", + "babel-loader": "^8.2.3", + "chokidar": "^3.5.3", + "commonmark": "^0.30.0", "concurrently": "^6.2.1", - "copy-webpack-plugin": "^9.0.1", - "cross-env": "^7.0.2", - "css-loader": "^6.4.0", + "copy-webpack-plugin": "^9.1.0", + "cross-env": "^7.0.3", + "css-loader": "^6.5.1", "electron": "^12.2.1", "enquirer": "^2.3.6", - "eslint": "^8.2.0", + "eslint": "^8.8.0", "eslint-plugin-notice": "^0.9.10", "eslint-plugin-react-hooks": "^4.3.0", "file-loader": "^6.2.0", - "formidable": "^1.2.2", - "html-webpack-plugin": "^5.3.2", + "formidable": "^2.0.1", + "html-webpack-plugin": "^5.5.0", + "mime": "^2.4.6", "ncp": "^2.0.0", - "node-stream-zip": "^1.11.3", + "node-stream-zip": "^1.15.0", "proxy": "^1.0.2", - "react": "^17.0.1", - "react-dom": "^17.0.1", + "react": "^17.0.2", + "react-dom": "^17.0.2", "socksv5": "0.0.6", - "style-loader": "^3.3.0", - "typescript": "^4.4.3", - "webpack": "^5.58.2", - "webpack-cli": "^4.9.0", + "style-loader": "^3.3.1", + "typescript": "^4.5.5", + "webpack": "^5.68.0", + "webpack-cli": "^4.9.2", "xml2js": "^0.4.23", - "yaml": "^1.10.0" + "yaml": "^1.10.2" }, "engines": { "node": ">=12" } }, "node_modules/@babel/cli": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.14.8.tgz", - "integrity": "sha512-lcy6Lymft9Rpfqmrqdd4oTDdUx9ZwaAhAfywVrHG4771Pa6PPT0danJ1kDHBXYqh4HHSmIdA+nlmfxfxSDPtBg==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.16.8.tgz", + "integrity": "sha512-FTKBbxyk5TclXOGmwYyqelqP5IF6hMxaeJskd85jbR5jBfYlwqgwAbJwnixi1ZBbTqKfFuAA95mdmUFeSRwyJA==", "dev": true, "dependencies": { "commander": "^4.0.1", @@ -95,7 +96,7 @@ "node": ">=6.9.0" }, "optionalDependencies": { - "@nicolo-ribaudo/chokidar-2": "2.1.8-no-fsevents.2", + "@nicolo-ribaudo/chokidar-2": "2.1.8-no-fsevents.3", "chokidar": "^3.4.0" }, "peerDependencies": { @@ -103,11 +104,11 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz", - "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", + "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", "dependencies": { - "@babel/highlight": "^7.14.5" + "@babel/highlight": "^7.16.7" }, "engines": { "node": ">=6.9.0" @@ -151,11 +152,11 @@ } }, "node_modules/@babel/generator": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.8.tgz", - "integrity": "sha512-cYDUpvIzhBVnMzRoY1fkSEhK/HmwEVwlyULYgn/tMQYd6Obag3ylCjONle3gdErfXBW61SVTlR9QR7uWlgeIkg==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.8.tgz", + "integrity": "sha512-1ojZwE9+lOXzcWdWmO6TbUzDfqLD39CmEhN8+2cX9XkDo5yW1OpgfejfliysR2AWLpMamTiOiAp/mtroaymhpw==", "dependencies": { - "@babel/types": "^7.14.8", + "@babel/types": "^7.16.8", "jsesc": "^2.5.1", "source-map": "^0.5.0" }, @@ -164,11 +165,11 @@ } }, "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.14.5.tgz", - "integrity": "sha512-EivH9EgBIb+G8ij1B2jAwSH36WnGvkQSEC6CkX/6v6ZFlw5fVOHvsgGF4uiEHO2GzMvunZb6tDLQEQSdrdocrA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz", + "integrity": "sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==", "dependencies": { - "@babel/types": "^7.14.5" + "@babel/types": "^7.16.7" }, "engines": { "node": ">=6.9.0" @@ -192,16 +193,17 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.14.8.tgz", - "integrity": "sha512-bpYvH8zJBWzeqi1o+co8qOrw+EXzQ/0c74gVmY205AWXy9nifHrOg77y+1zwxX5lXE7Icq4sPlSQ4O2kWBrteQ==", + "version": "7.16.10", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.16.10.tgz", + "integrity": "sha512-wDeej0pu3WN/ffTxMNCPW5UCiOav8IcLRxSIyp/9+IF2xJUM9h/OYjg0IJLHaL6F8oU8kqMz9nc1vryXhMsgXg==", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.14.5", - "@babel/helper-function-name": "^7.14.5", - "@babel/helper-member-expression-to-functions": "^7.14.7", - "@babel/helper-optimise-call-expression": "^7.14.5", - "@babel/helper-replace-supers": "^7.14.5", - "@babel/helper-split-export-declaration": "^7.14.5" + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-member-expression-to-functions": "^7.16.7", + "@babel/helper-optimise-call-expression": "^7.16.7", + "@babel/helper-replace-supers": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7" }, "engines": { "node": ">=6.9.0" @@ -210,58 +212,69 @@ "@babel/core": "^7.0.0" } }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz", + "integrity": "sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag==", + "dependencies": { + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-function-name": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.5.tgz", - "integrity": "sha512-Gjna0AsXWfFvrAuX+VKcN/aNNWonizBj39yGwUzVDVTlMYJMK2Wp6xdpy72mfArFq5uK+NOuexfzZlzI1z9+AQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz", + "integrity": "sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA==", "dependencies": { - "@babel/helper-get-function-arity": "^7.14.5", - "@babel/template": "^7.14.5", - "@babel/types": "^7.14.5" + "@babel/helper-get-function-arity": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/types": "^7.16.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-get-function-arity": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.14.5.tgz", - "integrity": "sha512-I1Db4Shst5lewOM4V+ZKJzQ0JGGaZ6VY1jYvMghRjqs6DWgxLCIyFt30GlnKkfUeFLpJt2vzbMVEXVSXlIFYUg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz", + "integrity": "sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw==", "dependencies": { - "@babel/types": "^7.14.5" + "@babel/types": "^7.16.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-hoist-variables": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.14.5.tgz", - "integrity": "sha512-R1PXiz31Uc0Vxy4OEOm07x0oSjKAdPPCh3tPivn/Eo8cvz6gveAeuyUUPB21Hoiif0uoPQSSdhIPS3352nvdyQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz", + "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==", "dependencies": { - "@babel/types": "^7.14.5" + "@babel/types": "^7.16.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.14.7.tgz", - "integrity": "sha512-TMUt4xKxJn6ccjcOW7c4hlwyJArizskAhoSTOCkA0uZ+KghIaci0Qg9R043kUMWI9mtQfgny+NQ5QATnZ+paaA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.7.tgz", + "integrity": "sha512-VtJ/65tYiU/6AbMTDwyoXGPKHgTsfRarivm+YbB5uAzKUyuPjgZSgAFeG87FCigc7KNHu2Pegh1XIT3lXjvz3Q==", "dependencies": { - "@babel/types": "^7.14.5" + "@babel/types": "^7.16.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.14.5.tgz", - "integrity": "sha512-SwrNHu5QWS84XlHwGYPDtCxcA0hrSlL2yhWYLgeOc0w7ccOl2qv4s/nARI0aYZW+bSwAL5CukeXA47B/1NKcnQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", + "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==", "dependencies": { - "@babel/types": "^7.14.5" + "@babel/types": "^7.16.7" }, "engines": { "node": ">=6.9.0" @@ -286,33 +299,34 @@ } }, "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.14.5.tgz", - "integrity": "sha512-IqiLIrODUOdnPU9/F8ib1Fx2ohlgDhxnIDU7OEVi+kAbEZcyiF7BLU8W6PfvPi9LzztjS7kcbzbmL7oG8kD6VA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.7.tgz", + "integrity": "sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w==", "dependencies": { - "@babel/types": "^7.14.5" + "@babel/types": "^7.16.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", - "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", + "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.14.5.tgz", - "integrity": "sha512-3i1Qe9/8x/hCHINujn+iuHy+mMRLoc77b2nI9TB0zjH1hvn9qGlXjWlggdwUcju36PkPCy/lpM7LLUdcTyH4Ow==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.7.tgz", + "integrity": "sha512-y9vsWilTNaVnVh6xiJfABzsNpgDPKev9HnAgz6Gb1p6UUwf9NepdlsV7VXGCftJM+jqD5f7JIEubcpLjZj5dBw==", "dependencies": { - "@babel/helper-member-expression-to-functions": "^7.14.5", - "@babel/helper-optimise-call-expression": "^7.14.5", - "@babel/traverse": "^7.14.5", - "@babel/types": "^7.14.5" + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-member-expression-to-functions": "^7.16.7", + "@babel/helper-optimise-call-expression": "^7.16.7", + "@babel/traverse": "^7.16.7", + "@babel/types": "^7.16.7" }, "engines": { "node": ">=6.9.0" @@ -341,28 +355,28 @@ } }, "node_modules/@babel/helper-split-export-declaration": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.14.5.tgz", - "integrity": "sha512-hprxVPu6e5Kdp2puZUmvOGjaLv9TCe58E/Fl6hRq4YiVQxIcNvuq6uTM2r1mT/oPskuS9CgR+I94sqAYv0NGKA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", + "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", "dependencies": { - "@babel/types": "^7.14.5" + "@babel/types": "^7.16.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.8.tgz", - "integrity": "sha512-ZGy6/XQjllhYQrNw/3zfWRwZCTVSiBLZ9DHVZxn9n2gip/7ab8mv2TWlKPIBk26RwedCBoWdjLmn+t9na2Gcow==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz", - "integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz", + "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==", "engines": { "node": ">=6.9.0" } @@ -381,11 +395,11 @@ } }, "node_modules/@babel/highlight": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", - "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", + "version": "7.16.10", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz", + "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==", "dependencies": { - "@babel/helper-validator-identifier": "^7.14.5", + "@babel/helper-validator-identifier": "^7.16.7", "chalk": "^2.0.0", "js-tokens": "^4.0.0" }, @@ -394,9 +408,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.8.tgz", - "integrity": "sha512-syoCQFOoo/fzkWDeM0dLEZi5xqurb5vuyzwIMNZRNun+N/9A4cUZeQaE7dTrB8jGaKuJRBtEOajtnmw0I5hvvA==", + "version": "7.16.12", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.12.tgz", + "integrity": "sha512-VfaV15po8RiZssrkPweyvbGVSe4x2y+aciFCgn0n0/SJMR22cwofRV1mtnJQYcSB1wUTaA/X1LnA3es66MCO5A==", "bin": { "parser": "bin/babel-parser.js" }, @@ -587,11 +601,11 @@ } }, "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.14.5.tgz", - "integrity": "sha512-ohuFIsOMXJnbOMRfX7/w7LocdR6R7whhuRD4ax8IipLcLPlZGJKkBxgHp++U4N/vKyU16/YDQr2f5seajD3jIw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.16.7.tgz", + "integrity": "sha512-Esxmk7YjA8QysKeT3VhTXvF6y77f/a91SIs4pWb4H2eWGQkCKFgQaG6hdoEVZtGsrAcb2K5BW66XsOErD4WU3Q==", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.7" }, "engines": { "node": ">=6.9.0" @@ -681,11 +695,11 @@ } }, "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.14.5.tgz", - "integrity": "sha512-u6OXzDaIXjEstBRRoBCQ/uKQKlbuaeE5in0RvWdA4pN6AhqxTIwUsnHPU1CFZA/amYObMsuWhYfRl3Ch90HD0Q==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.16.7.tgz", + "integrity": "sha512-YhUIJHHGkqPgEcMYkPCKTyGUdoGKWtopIycQyjJH8OjvRgOYsXsaKehLVPScKJWAULPxMa4N1vCe6szREFlZ7A==", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.7" }, "engines": { "node": ">=6.9.0" @@ -712,12 +726,12 @@ } }, "node_modules/@babel/plugin-transform-react-display-name": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.14.5.tgz", - "integrity": "sha512-07aqY1ChoPgIxsuDviptRpVkWCSbXWmzQqcgy65C6YSFOfPFvb/DX3bBRHh7pCd/PMEEYHYWUTSVkCbkVainYQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.16.7.tgz", + "integrity": "sha512-qgIg8BcZgd0G/Cz916D5+9kqX0c7nPZyXaP8R2tLNN5tkyIZdG5fEwBrxwplzSnjC1jvQmyMNVwUCZPcbGY7Pg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.7" }, "engines": { "node": ">=6.9.0" @@ -727,15 +741,15 @@ } }, "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.14.5.tgz", - "integrity": "sha512-7RylxNeDnxc1OleDm0F5Q/BSL+whYRbOAR+bwgCxIr0L32v7UFh/pz1DLMZideAUxKT6eMoS2zQH6fyODLEi8Q==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.16.7.tgz", + "integrity": "sha512-8D16ye66fxiE8m890w0BpPpngG9o9OVBBy0gH2E+2AR7qMR2ZpTYJEqLxAsoroenMId0p/wMW+Blc0meDgu0Ag==", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.14.5", - "@babel/helper-module-imports": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/plugin-syntax-jsx": "^7.14.5", - "@babel/types": "^7.14.5" + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-module-imports": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-jsx": "^7.16.7", + "@babel/types": "^7.16.7" }, "engines": { "node": ">=6.9.0" @@ -745,12 +759,12 @@ } }, "node_modules/@babel/plugin-transform-react-jsx-development": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.14.5.tgz", - "integrity": "sha512-rdwG/9jC6QybWxVe2UVOa7q6cnTpw8JRRHOxntG/h6g/guAOe6AhtQHJuJh5FwmnXIT1bdm5vC2/5huV8ZOorQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.16.7.tgz", + "integrity": "sha512-RMvQWvpla+xy6MlBpPlrKZCMRs2AGiHOGHY3xRwl0pEeim348dDyxeH4xBsMPbIMhujeq7ihE702eM2Ew0Wo+A==", "dev": true, "dependencies": { - "@babel/plugin-transform-react-jsx": "^7.14.5" + "@babel/plugin-transform-react-jsx": "^7.16.7" }, "engines": { "node": ">=6.9.0" @@ -760,13 +774,13 @@ } }, "node_modules/@babel/plugin-transform-react-pure-annotations": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.14.5.tgz", - "integrity": "sha512-3X4HpBJimNxW4rhUy/SONPyNQHp5YRr0HhJdT2OH1BRp0of7u3Dkirc7x9FRJMKMqTBI079VZ1hzv7Ouuz///g==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.16.7.tgz", + "integrity": "sha512-hs71ToC97k3QWxswh2ElzMFABXHvGiJ01IB1TbYQDGeWRKWz/MPUTh5jGExdHvosYKpnJW5Pm3S4+TA3FyX+GA==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" }, "engines": { "node": ">=6.9.0" @@ -776,13 +790,13 @@ } }, "node_modules/@babel/plugin-transform-typescript": { - "version": "7.14.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.14.6.tgz", - "integrity": "sha512-XlTdBq7Awr4FYIzqhmYY80WN0V0azF74DMPyFqVHBvf81ZUgc4X7ZOpx6O8eLDK6iM5cCQzeyJw0ynTaefixRA==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.16.8.tgz", + "integrity": "sha512-bHdQ9k7YpBDO2d0NVfkj51DpQcvwIzIusJ7mEUaMlbZq3Kt/U47j24inXZHQ5MDiYpCs+oZiwnXyKedE8+q7AQ==", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.14.6", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/plugin-syntax-typescript": "^7.14.5" + "@babel/helper-create-class-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-typescript": "^7.16.7" }, "engines": { "node": ">=6.9.0" @@ -792,17 +806,17 @@ } }, "node_modules/@babel/preset-react": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.14.5.tgz", - "integrity": "sha512-XFxBkjyObLvBaAvkx1Ie95Iaq4S/GUEIrejyrntQ/VCMKUYvKLoyKxOBzJ2kjA3b6rC9/KL6KXfDC2GqvLiNqQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.16.7.tgz", + "integrity": "sha512-fWpyI8UM/HE6DfPBzD8LnhQ/OcH8AgTaqcqP2nGOXEUV+VKBR5JRN9hCk9ai+zQQ57vtm9oWeXguBCPNUjytgA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-validator-option": "^7.14.5", - "@babel/plugin-transform-react-display-name": "^7.14.5", - "@babel/plugin-transform-react-jsx": "^7.14.5", - "@babel/plugin-transform-react-jsx-development": "^7.14.5", - "@babel/plugin-transform-react-pure-annotations": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-validator-option": "^7.16.7", + "@babel/plugin-transform-react-display-name": "^7.16.7", + "@babel/plugin-transform-react-jsx": "^7.16.7", + "@babel/plugin-transform-react-jsx-development": "^7.16.7", + "@babel/plugin-transform-react-pure-annotations": "^7.16.7" }, "engines": { "node": ">=6.9.0" @@ -828,30 +842,31 @@ } }, "node_modules/@babel/template": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.14.5.tgz", - "integrity": "sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", + "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", "dependencies": { - "@babel/code-frame": "^7.14.5", - "@babel/parser": "^7.14.5", - "@babel/types": "^7.14.5" + "@babel/code-frame": "^7.16.7", + "@babel/parser": "^7.16.7", + "@babel/types": "^7.16.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.8.tgz", - "integrity": "sha512-kexHhzCljJcFNn1KYAQ6A5wxMRzq9ebYpEDV4+WdNyr3i7O44tanbDOR/xjiG2F3sllan+LgwK+7OMk0EmydHg==", - "dependencies": { - "@babel/code-frame": "^7.14.5", - "@babel/generator": "^7.14.8", - "@babel/helper-function-name": "^7.14.5", - "@babel/helper-hoist-variables": "^7.14.5", - "@babel/helper-split-export-declaration": "^7.14.5", - "@babel/parser": "^7.14.8", - "@babel/types": "^7.14.8", + "version": "7.16.10", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.10.tgz", + "integrity": "sha512-yzuaYXoRJBGMlBhsMJoUW7G1UmSb/eXr/JHYM/MsOJgavJibLwASijW7oXBdw3NQ6T0bW7Ty5P/VarOs9cHmqw==", + "dependencies": { + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.16.8", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-hoist-variables": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/parser": "^7.16.10", + "@babel/types": "^7.16.8", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -860,11 +875,11 @@ } }, "node_modules/@babel/types": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.8.tgz", - "integrity": "sha512-iob4soQa7dZw8nodR/KlOQkPh9S4I8RwCxwRIFuiMRYjOzH/KJzdUfDgz6cGi5dDaclXF4P2PAhCdrBJNIg68Q==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.8.tgz", + "integrity": "sha512-smN2DQc5s4M7fntyjGtyIPbRJv6wW4rU/94fmYJ7PKQuZkC0qGMHXJbg6sNGt12JmVr4k5YaptI/XtiLJBnmIg==", "dependencies": { - "@babel/helper-validator-identifier": "^7.14.8", + "@babel/helper-validator-identifier": "^7.16.7", "to-fast-properties": "^2.0.0" }, "engines": { @@ -903,14 +918,14 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.0.4.tgz", - "integrity": "sha512-h8Vx6MdxwWI2WM8/zREHMoqdgLNXEL4QX3MWSVMdyNJGvXVOs+6lp+m2hc3FnuMHDc4poxFNI20vCk0OmI4G0Q==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.0.5.tgz", + "integrity": "sha512-BLxsnmK3KyPunz5wmCCpqy0YelEoxxGmH73Is+Z74oOTMtExcjkr3dDR6quwrjh1YspA8DH9gnX1o069KiS9AQ==", "dev": true, "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.0.0", + "espree": "^9.2.0", "globals": "^13.9.0", "ignore": "^4.0.6", "import-fresh": "^3.2.1", @@ -959,12 +974,12 @@ } }, "node_modules/@humanwhocodes/config-array": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.6.0.tgz", - "integrity": "sha512-JQlEKbcgEUjBFhLIF4iqM7u/9lwgHRBcpHrmUNCALK0Q3amXN6lxdoXLnF0sm11E9VqTmBALR87IlUg1bZ8A9A==", + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.3.tgz", + "integrity": "sha512-3xSMlXHh03hCcCmFc0rbKp3Ivt2PFEJnQUJDDMTJQ2wkECZWdq4GePs2ctc5H8zV+cHPaq8k2vU8mrQjA6iHdQ==", "dev": true, "dependencies": { - "@humanwhocodes/object-schema": "^1.2.0", + "@humanwhocodes/object-schema": "^1.2.1", "debug": "^4.1.1", "minimatch": "^3.0.4" }, @@ -1058,24 +1073,11 @@ } }, "node_modules/@nicolo-ribaudo/chokidar-2": { - "version": "2.1.8-no-fsevents.2", - "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/chokidar-2/-/chokidar-2-2.1.8-no-fsevents.2.tgz", - "integrity": "sha512-Fb8WxUFOBQVl+CX4MWet5o7eCc6Pj04rXIwVKZ6h1NnqTo45eOQW6aWyhG25NIODvWFwTDMwBsYxrQ3imxpetg==", + "version": "2.1.8-no-fsevents.3", + "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/chokidar-2/-/chokidar-2-2.1.8-no-fsevents.3.tgz", + "integrity": "sha512-s88O1aVtXftvp5bCPB7WnmXc5IwOZZ7YPuwNPt+GtOOXpPvad1LfbmjYv+qII7zP6RU2QGnqve27dnLycEnyEQ==", "dev": true, - "optional": true, - "dependencies": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "glob-parent": "^5.1.2", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" - } + "optional": true }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", @@ -1144,9 +1146,9 @@ "dev": true }, "node_modules/@types/babel__core": { - "version": "7.1.15", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.15.tgz", - "integrity": "sha512-bxlMKPDbY8x5h6HBwVzEOk2C8fb6SLfYQ5Jw3uBYuYF1lfWk/kbLd81la82vrIkBb0l+JdmrZaDikPrNxpS/Ew==", + "version": "7.1.18", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.18.tgz", + "integrity": "sha512-S7unDjm/C7z2A2R9NzfKCK1I+BAALDtxEmsJBwlB3EzNfb929ykjL++1CK9LO++EIp2fQrC8O+BwjKvz6UeDyQ==", "dev": true, "dependencies": { "@babel/parser": "^7.1.0", @@ -1185,10 +1187,13 @@ } }, "node_modules/@types/debug": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.5.tgz", - "integrity": "sha512-Q1y515GcOdTHgagaVFhHnIFQ38ygs/kmxdNpvpou+raI9UO3YZcHDngBSYKQklcKlvA7iuQlmIKbzvmxcOE9CQ==", - "dev": true + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.7.tgz", + "integrity": "sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==", + "dev": true, + "dependencies": { + "@types/ms": "*" + } }, "node_modules/@types/eslint": { "version": "7.28.1", @@ -1216,11 +1221,14 @@ "integrity": "sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw==", "dev": true }, - "node_modules/@types/extract-zip": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/@types/extract-zip/-/extract-zip-1.6.2.tgz", - "integrity": "sha1-XH60QcQRNhZ6QriLZAUeYmDCnoY=", - "dev": true + "node_modules/@types/formidable": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/formidable/-/formidable-2.0.4.tgz", + "integrity": "sha512-6HYcnmBCeby/nNGgX9kq1DxUpK2UcB3yoHCr3GzFjjqkpivOdcBSbsXP9NbxLcPEi11Fl/L41rbFCIsteF9sbg==", + "dev": true, + "dependencies": { + "@types/node": "*" + } }, "node_modules/@types/glob": { "version": "7.1.3", @@ -1233,9 +1241,9 @@ } }, "node_modules/@types/html-minifier-terser": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-5.1.2.tgz", - "integrity": "sha512-h4lTMgMJctJybDp8CQrxTUiiYmedihHWkjnF/8Pxseu2S6Nlfcy8kwboQ8yejh456rP2yWoEVm1sS/FVsfM48w==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==", "dev": true }, "node_modules/@types/istanbul-lib-coverage": { @@ -1272,9 +1280,9 @@ "dev": true }, "node_modules/@types/minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-1z8k4wzFnNjVK/tlxvrWuK5WMt6mydWWP7+zvH5eFep4oj+UkrfiJTRtjCeBXNpwaA/FYqqtb4/QS4ianFpIRA==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", "dev": true }, "node_modules/@types/ms": { @@ -1295,27 +1303,27 @@ "dev": true }, "node_modules/@types/pixelmatch": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/@types/pixelmatch/-/pixelmatch-5.2.3.tgz", - "integrity": "sha512-p+nAQVYK/DUx7+s1Xyu9dqAg0gobf7VmJ+iDA4lljg1o4XRgQHr7R2h1NwFt3gdNOZiftxWB11+0TuZqXYf19w==", + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/@types/pixelmatch/-/pixelmatch-5.2.4.tgz", + "integrity": "sha512-HDaSHIAv9kwpMN7zlmwfTv6gax0PiporJOipcrGsVNF3Ba+kryOZc0Pio5pn6NhisgWr7TaajlPEKTbTAypIBQ==", "dev": true, "dependencies": { "@types/node": "*" } }, "node_modules/@types/pngjs": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/@types/pngjs/-/pngjs-3.4.2.tgz", - "integrity": "sha512-LJVPDraJ5YFEnMHnzxTN4psdWz1M61MtaAAWPn3qnDk5fvs7BAmmQ9pd3KPlrdrvozMyne4ktanD4pg0L7x1Pw==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@types/pngjs/-/pngjs-6.0.1.tgz", + "integrity": "sha512-J39njbdW1U/6YyVXvC9+1iflZghP8jgRf2ndYghdJb5xL49LYDB+1EuAxfbuJ2IBbWIL3AjHPQhgaTxT3YaYeg==", "dev": true, "dependencies": { "@types/node": "*" } }, "node_modules/@types/progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-bPOsfCZ4tsTlKiBjBhKnM8jpY5nmIll166IPD58D92hR7G7kZDfx5iB9wGF4NfZrdKolebjeAr3GouYkSGoJ/A==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/progress/-/progress-2.0.5.tgz", + "integrity": "sha512-ZYYVc/kSMkhH9W/4dNK/sLNra3cnkfT2nJyOAIDY+C2u6w72wa0s1aXAezVtbTsnN8HID1uhXCrLwDE2ZXpplg==", "dev": true, "dependencies": { "@types/node": "*" @@ -1328,9 +1336,9 @@ "dev": true }, "node_modules/@types/proper-lockfile": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@types/proper-lockfile/-/proper-lockfile-4.1.1.tgz", - "integrity": "sha512-HAjVfDa73pFgivViHyDu8HHHcds+W4MgOuZZAdyFJrHS8ngtCXmhl4hc2YXqSOwO6Bsa+iF2Sgxb2+gv874VOQ==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@types/proper-lockfile/-/proper-lockfile-4.1.2.tgz", + "integrity": "sha512-kd4LMvcnpYkspDcp7rmXKedn8iJSCoa331zRRamUp5oanKt/CefbEGPQP7G89enz7sKD4bvsr8mHSsC8j5WOvA==", "dev": true, "dependencies": { "@types/retry": "*" @@ -1346,9 +1354,9 @@ } }, "node_modules/@types/react": { - "version": "17.0.5", - "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.5.tgz", - "integrity": "sha512-bj4biDB9ZJmGAYTWSKJly6bMr4BLUiBrx9ujiJEoP9XIDY9CTaPGxE5QWN/1WjpPLzYF7/jRNnV2nNxNe970sw==", + "version": "17.0.38", + "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.38.tgz", + "integrity": "sha512-SI92X1IA+FMnP3qM5m4QReluXzhcmovhZnLNm3pyeQlooi02qI7sLiepEYqT678uNiyc25XfCqxREFpy3W7YhQ==", "dev": true, "dependencies": { "@types/prop-types": "*", @@ -1357,18 +1365,18 @@ } }, "node_modules/@types/react-dom": { - "version": "17.0.4", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.4.tgz", - "integrity": "sha512-Wb6rlnPJfqbhpkvYN39y1NM/pOGGPzzIRquu0RdUMvTwgXNvASFO7pdtrtvyxGTQNb9wzBaQxXAWDdEqegZw2A==", + "version": "17.0.11", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.11.tgz", + "integrity": "sha512-f96K3k+24RaLGVu/Y2Ng3e1EbZ8/cVJvypZWd7cy0ofCBaf2lcM46xNhycMZ2xGwbBjRql7hOlZ+e2WlJ5MH3Q==", "dev": true, "dependencies": { "@types/react": "*" } }, "node_modules/@types/resize-observer-browser": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/@types/resize-observer-browser/-/resize-observer-browser-0.1.5.tgz", - "integrity": "sha512-8k/67Z95Goa6Lznuykxkfhq9YU3l1Qe6LNZmwde1u7802a3x8v44oq0j91DICclxatTr0rNnhXx7+VTIetSrSQ==", + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@types/resize-observer-browser/-/resize-observer-browser-0.1.6.tgz", + "integrity": "sha512-61IfTac0s9jvNtBCpyo86QeaN8qqpMGHdK0uGKCCIy2dt5/Yk84VduHIdWAcmkC5QvdkPL0p5eWYgUZtHKKUVg==", "dev": true }, "node_modules/@types/retry": { @@ -1378,9 +1386,9 @@ "dev": true }, "node_modules/@types/rimraf": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/rimraf/-/rimraf-3.0.0.tgz", - "integrity": "sha512-7WhJ0MdpFgYQPXlF4Dx+DhgvlPCfz/x5mHaeDQAKhcenvQP1KCpLQ18JklAqeGMYSAT2PxLpzd0g2/HE7fj7hQ==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-F3OznnSLAUxFrCEu/L5PY8+ny8DtcFRjx7fZZ9bycvXRi3KPTRS9HOitGZwvPg0juRhXFWIeKX58cnX5YqLohQ==", "dev": true, "dependencies": { "@types/glob": "*", @@ -1394,12 +1402,21 @@ "dev": true }, "node_modules/@types/source-map-support": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@types/source-map-support/-/source-map-support-0.4.2.tgz", - "integrity": "sha512-GbGWx39O8NdUHSChdrU0XeigBAgu1Teg3llwE0slSVcH2qISaQT70ftAiH+h4HIt3VIObFU34PSpXIKJuXCybQ==", + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/@types/source-map-support/-/source-map-support-0.5.4.tgz", + "integrity": "sha512-9zGujX1sOPg32XLyfgEB/0G9ZnrjthL/Iv1ZfuAjj8LEilHZEpQSQs1scpRXPhHzGYgWiLz9ldF1cI8JhL+yMw==", "dev": true, "dependencies": { - "@types/node": "*" + "source-map": "^0.6.0" + } + }, + "node_modules/@types/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" } }, "node_modules/@types/stack-utils": { @@ -1428,9 +1445,9 @@ } }, "node_modules/@types/xml2js": { - "version": "0.4.8", - "resolved": "https://registry.npmjs.org/@types/xml2js/-/xml2js-0.4.8.tgz", - "integrity": "sha512-EyvT83ezOdec7BhDaEcsklWy7RSIdi6CNe95tmOAK0yx/Lm30C9K75snT3fYayK59ApC2oyW+rcHErdG05FHJA==", + "version": "0.4.9", + "resolved": "https://registry.npmjs.org/@types/xml2js/-/xml2js-0.4.9.tgz", + "integrity": "sha512-CHiCKIihl1pychwR2RNX5mAYmJDACgFVCMT5OArMaO3erzwXVcBqPcusr+Vl8yeeXukxZqtF8mZioqX+mpjjdw==", "dev": true, "dependencies": { "@types/node": "*" @@ -1468,13 +1485,14 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.4.0.tgz", - "integrity": "sha512-9/yPSBlwzsetCsGEn9j24D8vGQgJkOTr4oMLas/w886ZtzKIs1iyoqFrwsX2fqYEeUwsdBpC21gcjRGo57u0eg==", + "version": "5.10.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.10.2.tgz", + "integrity": "sha512-4W/9lLuE+v27O/oe7hXJKjNtBLnZE8tQAFpapdxwSVHqtmIoPB1gph3+ahNwVuNL37BX7YQHyGF9Xv6XCnIX2Q==", "dev": true, "dependencies": { - "@typescript-eslint/experimental-utils": "5.4.0", - "@typescript-eslint/scope-manager": "5.4.0", + "@typescript-eslint/scope-manager": "5.10.2", + "@typescript-eslint/type-utils": "5.10.2", + "@typescript-eslint/utils": "5.10.2", "debug": "^4.3.2", "functional-red-black-tree": "^1.0.1", "ignore": "^5.1.8", @@ -1514,18 +1532,16 @@ "node": ">=10" } }, - "node_modules/@typescript-eslint/experimental-utils": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.4.0.tgz", - "integrity": "sha512-Nz2JDIQUdmIGd6p33A+naQmwfkU5KVTLb/5lTk+tLVTDacZKoGQisj8UCxk7onJcrgjIvr8xWqkYI+DbI3TfXg==", + "node_modules/@typescript-eslint/parser": { + "version": "5.10.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.10.2.tgz", + "integrity": "sha512-JaNYGkaQVhP6HNF+lkdOr2cAs2wdSZBoalE22uYWq8IEv/OVH0RksSGydk+sW8cLoSeYmC+OHvRyv2i4AQ7Czg==", "dev": true, "dependencies": { - "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.4.0", - "@typescript-eslint/types": "5.4.0", - "@typescript-eslint/typescript-estree": "5.4.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0" + "@typescript-eslint/scope-manager": "5.10.2", + "@typescript-eslint/types": "5.10.2", + "@typescript-eslint/typescript-estree": "5.10.2", + "debug": "^4.3.2" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -1535,19 +1551,22 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "*" + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@typescript-eslint/parser": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.4.0.tgz", - "integrity": "sha512-JoB41EmxiYpaEsRwpZEYAJ9XQURPFer8hpkIW9GiaspVLX8oqbqNM8P4EP8HOZg96yaALiLEVWllA2E8vwsIKw==", + "node_modules/@typescript-eslint/scope-manager": { + "version": "5.10.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.10.2.tgz", + "integrity": "sha512-39Tm6f4RoZoVUWBYr3ekS75TYgpr5Y+X0xLZxXqcZNDWZdJdYbKd3q2IR4V9y5NxxiPu/jxJ8XP7EgHiEQtFnw==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.4.0", - "@typescript-eslint/types": "5.4.0", - "@typescript-eslint/typescript-estree": "5.4.0", - "debug": "^4.3.2" + "@typescript-eslint/types": "5.10.2", + "@typescript-eslint/visitor-keys": "5.10.2" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -1555,24 +1574,17 @@ "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } } }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.4.0.tgz", - "integrity": "sha512-pRxFjYwoi8R+n+sibjgF9iUiAELU9ihPBtHzocyW8v8D8G8KeQvXTsW7+CBYIyTYsmhtNk50QPGLE3vrvhM5KA==", + "node_modules/@typescript-eslint/type-utils": { + "version": "5.10.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.10.2.tgz", + "integrity": "sha512-uRKSvw/Ccs5FYEoXW04Z5VfzF2iiZcx8Fu7DGIB7RHozuP0VbKNzP1KfZkHBTM75pCpsWxIthEH1B33dmGBKHw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.4.0", - "@typescript-eslint/visitor-keys": "5.4.0" + "@typescript-eslint/utils": "5.10.2", + "debug": "^4.3.2", + "tsutils": "^3.21.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -1580,12 +1592,20 @@ "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/@typescript-eslint/types": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.4.0.tgz", - "integrity": "sha512-GjXNpmn+n1LvnttarX+sPD6+S7giO+9LxDIGlRl4wK3a7qMWALOHYuVSZpPTfEIklYjaWuMtfKdeByx0AcaThA==", + "version": "5.10.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.10.2.tgz", + "integrity": "sha512-Qfp0qk/5j2Rz3p3/WhWgu4S1JtMcPgFLnmAKAW061uXxKSa7VWKZsDXVaMXh2N60CX9h6YLaBoy9PJAfCOjk3w==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -1596,13 +1616,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.4.0.tgz", - "integrity": "sha512-nhlNoBdhKuwiLMx6GrybPT3SFILm5Gij2YBdPEPFlYNFAXUJWX6QRgvi/lwVoadaQEFsizohs6aFRMqsXI2ewA==", + "version": "5.10.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.10.2.tgz", + "integrity": "sha512-WHHw6a9vvZls6JkTgGljwCsMkv8wu8XU8WaYKeYhxhWXH/atZeiMW6uDFPLZOvzNOGmuSMvHtZKd6AuC8PrwKQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.4.0", - "@typescript-eslint/visitor-keys": "5.4.0", + "@typescript-eslint/types": "5.10.2", + "@typescript-eslint/visitor-keys": "5.10.2", "debug": "^4.3.2", "globby": "^11.0.4", "is-glob": "^4.0.3", @@ -1637,13 +1657,37 @@ "node": ">=10" } }, + "node_modules/@typescript-eslint/utils": { + "version": "5.10.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.10.2.tgz", + "integrity": "sha512-vuJaBeig1NnBRkf7q9tgMLREiYD7zsMrsN1DA3wcoMDvr3BTFiIpKjGiYZoKPllfEwN7spUjv7ZqD+JhbVjEPg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "@typescript-eslint/scope-manager": "5.10.2", + "@typescript-eslint/types": "5.10.2", + "@typescript-eslint/typescript-estree": "5.10.2", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.4.0.tgz", - "integrity": "sha512-PVbax7MeE7tdLfW5SA0fs8NGVVr+buMPrcj+CWYWPXsZCH8qZ1THufDzbXm1xrZ2b2PA1iENJ0sRq5fuUtvsJg==", + "version": "5.10.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.10.2.tgz", + "integrity": "sha512-zHIhYGGGrFJvvyfwHk5M08C5B5K4bewkm+rrvNTKk1/S15YHR+SA/QUF8ZWscXSfEaB8Nn2puZj+iHcoxVOD/Q==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.4.0", + "@typescript-eslint/types": "5.10.2", "eslint-visitor-keys": "^3.0.0" }, "engines": { @@ -1801,9 +1845,9 @@ } }, "node_modules/@webpack-cli/configtest": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.1.0.tgz", - "integrity": "sha512-ttOkEkoalEHa7RaFYpM0ErK1xc4twg3Am9hfHhL7MVqlHebnkYd2wuI/ZqTDj0cVzZho6PdinY0phFZV3O0Mzg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.1.1.tgz", + "integrity": "sha512-1FBc1f9G4P/AxMqIgfZgeOTuRnwZMten8E7zap5zgpPInnCrP8D4Q81+4CWIch8i/Nf7nXjP0v6CjjbHOrXhKg==", "dev": true, "peerDependencies": { "webpack": "4.x.x || 5.x.x", @@ -1811,9 +1855,9 @@ } }, "node_modules/@webpack-cli/info": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.4.0.tgz", - "integrity": "sha512-F6b+Man0rwE4n0409FyAJHStYA5OIZERxmnUfLVwv0mc0V1wLad3V7jqRlMkgKBeAq07jUvglacNaa6g9lOpuw==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.4.1.tgz", + "integrity": "sha512-PKVGmazEq3oAo46Q63tpMr4HipI3OPfP7LiNOEJg963RMgT0rqheag28NCML0o3GIzA3DmxP1ZIAv9oTX1CUIA==", "dev": true, "dependencies": { "envinfo": "^7.7.3" @@ -1823,9 +1867,9 @@ } }, "node_modules/@webpack-cli/serve": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.6.0.tgz", - "integrity": "sha512-ZkVeqEmRpBV2GHvjjUZqEai2PpUbuq8Bqd//vEYsp63J8WyexI8ppCqVS3Zs0QADf6aWuPdU+0XsPI647PVlQA==", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.6.1.tgz", + "integrity": "sha512-gNGTiTrjEVQ0OcVnzsRSqTxaBSr+dmTfm+qJsCDluky8uhdLWep7Gcr62QsAKHTMxjCS/8nEITsmFAhfIx+QSw==", "dev": true, "peerDependencies": { "webpack-cli": "4.x.x" @@ -1849,15 +1893,15 @@ "dev": true }, "node_modules/@zip.js/zip.js": { - "version": "2.3.17", - "resolved": "https://registry.npmjs.org/@zip.js/zip.js/-/zip.js-2.3.17.tgz", - "integrity": "sha512-ktTJ8dvbiIu4MAlioJo/475QtTsbOBK5YmBbvRJaduCeEKOof/ZTY2H7DPwiC0pC9dDfEo+uFsqMVI1J4HLl5g==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@zip.js/zip.js/-/zip.js-2.4.2.tgz", + "integrity": "sha512-D4xr9g7U625Q01lQASr9g1sQWEGhndyd+G3v3OvY/qH3pwaJDpbVDy+TO6yEq7c8teQdjjTiiBvlcQcVtT+itg==", "dev": true }, "node_modules/acorn": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.6.0.tgz", - "integrity": "sha512-U1riIR+lBSNi3IbxtaHOIKdH8sLFv3NYfNv8sg7ZsNhcfl4HF2++BfqqrNAxoCLQW1iiylOj76ecnaUxz+z9yw==", + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", + "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -1940,9 +1984,9 @@ } }, "node_modules/ansi-to-html": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/ansi-to-html/-/ansi-to-html-0.7.1.tgz", - "integrity": "sha512-PPpOy/TeLE6xERG5CNNpm1cLTIW1IeWULleeVc089paF45zfz5gzNPXeSQyxt1sUiKVIYZlY86AYx3fsMdIr5w==", + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/ansi-to-html/-/ansi-to-html-0.7.2.tgz", + "integrity": "sha512-v6MqmEpNlxF+POuyhKkidusCHWWkaLcGRURzivcU3I9tv7k4JVhFcnukrM5Rlk2rUywdZuzYAZ+kbZqWCnfN3g==", "dev": true, "dependencies": { "entities": "^2.2.0" @@ -1954,30 +1998,6 @@ "node": ">=8.0.0" } }, - "node_modules/anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, - "optional": true, - "dependencies": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - } - }, - "node_modules/anymatch/node_modules/normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "optional": true, - "dependencies": { - "remove-trailing-separator": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -1999,36 +2019,6 @@ "node": ">= 6.0.0" } }, - "node_modules/arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/array-union": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", @@ -2038,50 +2028,16 @@ "node": ">=8" } }, - "node_modules/array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/async-each": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", - "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", - "dev": true, - "optional": true - }, - "node_modules/atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true, - "optional": true, - "bin": { - "atob": "bin/atob.js" - }, - "engines": { - "node": ">= 4.5.0" - } + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", + "dev": true }, "node_modules/babel-loader": { - "version": "8.2.2", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.2.tgz", - "integrity": "sha512-JvTd0/D889PQBtUXJ2PXaKU/pjZDMtHA9V2ecm+eNRmmBCMR09a+fmpGTNwnJtFmFl5Ei7Vy47LjBb+L0wQ99g==", + "version": "8.2.3", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.3.tgz", + "integrity": "sha512-n4Zeta8NC3QAsuyiizu0GkmRcQ6clkV9WFUnUf1iXP//IeSKbWjofW3UHyZVwlOB4y039YQKefawyTn64Zwbuw==", "dev": true, "dependencies": { "find-cache-dir": "^3.3.1", @@ -2140,38 +2096,6 @@ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, - "node_modules/base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "dev": true, - "optional": true, - "dependencies": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/base/node_modules/define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "optional": true, - "dependencies": { - "is-descriptor": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/basic-auth-parser": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/basic-auth-parser/-/basic-auth-parser-0.0.2.tgz", @@ -2187,16 +2111,6 @@ "node": "*" } }, - "node_modules/binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/boolbase": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", @@ -2219,28 +2133,6 @@ "concat-map": "0.0.1" } }, - "node_modules/braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "optional": true, - "dependencies": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/browserslist": { "version": "4.16.6", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz", @@ -2277,27 +2169,6 @@ "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", "dev": true }, - "node_modules/cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "dev": true, - "optional": true, - "dependencies": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/cacheable-request": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", @@ -2388,24 +2259,30 @@ } }, "node_modules/chokidar": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", - "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], "dependencies": { - "anymatch": "~3.1.1", + "anymatch": "~3.1.2", "braces": "~3.0.2", - "glob-parent": "~5.1.0", + "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", - "readdirp": "~3.5.0" + "readdirp": "~3.6.0" }, "engines": { "node": ">= 8.10.0" }, "optionalDependencies": { - "fsevents": "~2.3.1" + "fsevents": "~2.3.2" } }, "node_modules/chokidar/node_modules/anymatch": { @@ -2475,18 +2352,6 @@ "node": ">=0.12.0" } }, - "node_modules/chokidar/node_modules/readdirp": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", - "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", - "dev": true, - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, "node_modules/chokidar/node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -2508,96 +2373,16 @@ "node": ">=6.0" } }, - "node_modules/class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "dev": true, - "optional": true, - "dependencies": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "optional": true, - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "optional": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "optional": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "optional": true, - "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/class-utils/node_modules/is-descriptor/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/clean-css": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz", - "integrity": "sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==", + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.2.4.tgz", + "integrity": "sha512-nKseG8wCzEuji/4yrgM/5cthL9oTDc5UOQyFMvW/Q53oP6gLH690o1NbuTh6Y18nujr7BxlsFuS7gXLnLzKJGg==", "dev": true, "dependencies": { "source-map": "~0.6.0" }, "engines": { - "node": ">= 4.0" + "node": ">= 10.0" } }, "node_modules/clean-css/node_modules/source-map": { @@ -2652,20 +2437,6 @@ "mimic-response": "^1.0.0" } }, - "node_modules/collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "dev": true, - "optional": true, - "dependencies": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", @@ -2708,9 +2479,9 @@ "dev": true }, "node_modules/commonmark": { - "version": "0.29.3", - "resolved": "https://registry.npmjs.org/commonmark/-/commonmark-0.29.3.tgz", - "integrity": "sha512-fvt/NdOFKaL2gyhltSy6BC4LxbbxbnPxBMl923ittqO/JBM0wQHaoYZliE4tp26cRxX/ZZtRsJlZzQrVdUkXAA==", + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/commonmark/-/commonmark-0.30.0.tgz", + "integrity": "sha512-j1yoUo4gxPND1JWV9xj5ELih0yMv1iCWDG6eEQIPLSWLxzCXiFoyS7kvB+WwU+tZMf4snwJMMtaubV0laFpiBA==", "dev": true, "dependencies": { "entities": "~2.0", @@ -2731,13 +2502,6 @@ "integrity": "sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ==", "dev": true }, - "node_modules/component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", - "dev": true, - "optional": true - }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -2885,28 +2649,17 @@ "safe-buffer": "~5.1.1" } }, - "node_modules/copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/copy-webpack-plugin": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-9.0.1.tgz", - "integrity": "sha512-14gHKKdYIxF84jCEgPgYXCPpldbwpxxLbCmA7LReY7gvbaT555DgeBWBgBZM116tv/fO6RRJrsivBqRyRlukhw==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-9.1.0.tgz", + "integrity": "sha512-rxnR7PaGigJzhqETHGmAcxKnLZSR5u1Y3/bcIv/1FnqXedcL/E2ewK7ZCNrArJKCiSv8yVXhTqetJh8inDvfsA==", "dev": true, "dependencies": { - "fast-glob": "^3.2.5", - "glob-parent": "^6.0.0", + "fast-glob": "^3.2.7", + "glob-parent": "^6.0.1", "globby": "^11.0.3", "normalize-path": "^3.0.0", - "p-limit": "^3.1.0", - "schema-utils": "^3.0.0", + "schema-utils": "^3.1.1", "serialize-javascript": "^6.0.0" }, "engines": { @@ -3001,9 +2754,9 @@ } }, "node_modules/css-loader": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.4.0.tgz", - "integrity": "sha512-Dlt6qfsxI/w1vU0r8qDd4BtMPxWqJeY5qQU7SmmZfvbpe6Xl18McO4GhyaMLns24Y2VNPiZwJPQ8JSbg4qvQLw==", + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.5.1.tgz", + "integrity": "sha512-gEy2w9AnJNnD9Kuo4XAP9VflW/ujKoS9c/syO+uWMlm5igc7LysKzPXaDoR2vroROkSwsTS2tGr1yGGEbZOYZQ==", "dev": true, "dependencies": { "icss-utils": "^5.1.0", @@ -3042,16 +2795,16 @@ } }, "node_modules/css-select": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.1.3.tgz", - "integrity": "sha512-gT3wBNd9Nj49rAbmtFHj1cljIAOLYSX1nZ8CB7TBO3INYckygm5B7LISU/szY//YmdiSLbJvDLOx9VnMVpMBxA==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.2.1.tgz", + "integrity": "sha512-/aUslKhzkTNCQUB2qTX84lVmfia9NyjP3WpDGtj/WxhwBzWBYUV3DgUpurHTme8UTPcPlAD1DJ+b0nN/t50zDQ==", "dev": true, "dependencies": { "boolbase": "^1.0.0", - "css-what": "^5.0.0", - "domhandler": "^4.2.0", - "domutils": "^2.6.0", - "nth-check": "^2.0.0" + "css-what": "^5.1.0", + "domhandler": "^4.3.0", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" }, "funding": { "url": "https://github.com/sponsors/fb55" @@ -3116,16 +2869,6 @@ } } }, - "node_modules/decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10" - } - }, "node_modules/decompress-response": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", @@ -3169,20 +2912,6 @@ "node": ">= 0.4" } }, - "node_modules/define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "optional": true, - "dependencies": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/detect-node": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.5.tgz", @@ -3190,6 +2919,16 @@ "dev": true, "optional": true }, + "node_modules/dezalgo": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.3.tgz", + "integrity": "sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY=", + "dev": true, + "dependencies": { + "asap": "^2.0.0", + "wrappy": "1" + } + }, "node_modules/diff-sequences": { "version": "27.0.6", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.0.6.tgz", @@ -3258,9 +2997,9 @@ ] }, "node_modules/domhandler": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.2.2.tgz", - "integrity": "sha512-PzE9aBMsdZO8TK4BnuJwH0QT41wgMbRzuZrHUcpYncEjmQazq8QEaBWgLG7ZyC/DAZKEgglpIA6j4Qn/HmxS3w==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.0.tgz", + "integrity": "sha512-fC0aXNQXqKSFTr2wDNZDhsEYjCiYsDWl3D01kwt25hm1YIPyDGHvvi3rw+PLqHAl/m71MaiF7d5zvBr0p5UB2g==", "dev": true, "dependencies": { "domelementtype": "^2.2.0" @@ -3325,6 +3064,12 @@ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.785.tgz", "integrity": "sha512-WmCgAeURsMFiyoJ646eUaJQ7GNfvMRLXo+GamUyKVNEM4MqTAsXyC0f38JEB4N3BtbD0tlAKozGP5E2T9K3YGg==" }, + "node_modules/electron/node_modules/@types/node": { + "version": "14.18.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.10.tgz", + "integrity": "sha512-6iihJ/Pp5fsFJ/aEDGyvT4pHGmCpq7ToQ/yf4bl5SbVAvwpspYJ+v3jO7n8UyjhQVHTy+KNszOozDdv+O6sovQ==", + "dev": true + }, "node_modules/electron/node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -3482,24 +3227,23 @@ } }, "node_modules/eslint": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.2.0.tgz", - "integrity": "sha512-erw7XmM+CLxTOickrimJ1SiF55jiNlVSp2qqm0NuBWPtHYQCegD5ZMaW0c3i5ytPqL+SSLaCxdvQXFPLJn+ABw==", + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.8.0.tgz", + "integrity": "sha512-H3KXAzQGBH1plhYS3okDix2ZthuYJlQQEGE5k0IKuEqUSiyu4AmxxlJ2MtTYeJ3xB4jDhcYCwGOg2TXYdnDXlQ==", "dev": true, "dependencies": { - "@eslint/eslintrc": "^1.0.4", - "@humanwhocodes/config-array": "^0.6.0", + "@eslint/eslintrc": "^1.0.5", + "@humanwhocodes/config-array": "^0.9.2", "ajv": "^6.10.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.3.2", "doctrine": "^3.0.0", - "enquirer": "^2.3.5", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^6.0.0", + "eslint-scope": "^7.1.0", "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.0.0", - "espree": "^9.0.0", + "eslint-visitor-keys": "^3.2.0", + "espree": "^9.3.0", "esquery": "^1.4.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -3507,7 +3251,7 @@ "functional-red-black-tree": "^1.0.1", "glob-parent": "^6.0.1", "globals": "^13.6.0", - "ignore": "^4.0.6", + "ignore": "^5.2.0", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", @@ -3518,9 +3262,7 @@ "minimatch": "^3.0.4", "natural-compare": "^1.4.0", "optionator": "^0.9.1", - "progress": "^2.0.0", "regexpp": "^3.2.0", - "semver": "^7.2.1", "strip-ansi": "^6.0.1", "strip-json-comments": "^3.1.0", "text-table": "^0.2.0", @@ -3603,9 +3345,9 @@ } }, "node_modules/eslint-visitor-keys": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.1.0.tgz", - "integrity": "sha512-yWJFpu4DtjsWKkt5GeNBBuZMlNcYVs6vRCLoCVEJrTjaSB6LC98gFipNK/erM2Heg/E8mIK+hXG/pJMLK+eRZA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.2.0.tgz", + "integrity": "sha512-IOzT0X126zn7ALX0dwFiUQEdsfzrm4+ISsQS8nukaJXwEyYKRSnEIIDULYg1mCtGp7UUXgfGl7BIolXREQK+XQ==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -3673,9 +3415,9 @@ } }, "node_modules/eslint/node_modules/eslint-scope": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-6.0.0.tgz", - "integrity": "sha512-uRDL9MWmQCkaFus8RF5K9/L/2fn+80yoW3jkD53l4shjCh26fCtvJGasxjUqP5OT87SYTxCVA3BwTUzuELx9kA==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.0.tgz", + "integrity": "sha512-aWwkhnS0qAXqNOgKOK0dJ2nvzEbhEvpy8OlJ9kZ0FeZnA6zpjv1/Vei+puGFFX7zkPCkHHXb7IDX3A+7yPrRWg==", "dev": true, "dependencies": { "esrecurse": "^4.3.0", @@ -3731,29 +3473,14 @@ } }, "node_modules/eslint/node_modules/ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", "dev": true, "engines": { "node": ">= 4" } }, - "node_modules/eslint/node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/eslint/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -3779,14 +3506,14 @@ } }, "node_modules/espree": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.0.0.tgz", - "integrity": "sha512-r5EQJcYZ2oaGbeR0jR0fFVijGOcwai07/690YRXLINuhmVeRY4UKSAsQPe/0BNuDgwP7Ophoc1PRsr2E3tkbdQ==", + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.0.tgz", + "integrity": "sha512-d/5nCsb0JcqsSEeQzFZ8DH1RmxPcglRWh24EFTlUEmCKoehXGdpsx0RkHDubqUI8LSAIKMQp4r9SzQ3n+sm4HQ==", "dev": true, "dependencies": { - "acorn": "^8.5.0", + "acorn": "^8.7.0", "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^3.0.0" + "eslint-visitor-keys": "^3.1.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -3896,106 +3623,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "optional": true, - "dependencies": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "optional": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/expand-brackets/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "optional": true, - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "optional": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "optional": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "optional": true, - "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/is-descriptor/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/expand-brackets/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true, - "optional": true - }, "node_modules/expect": { "version": "27.2.5", "resolved": "https://registry.npmjs.org/expect/-/expect-27.2.5.tgz", @@ -4023,52 +3650,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "optional": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "optional": true, - "dependencies": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extglob/node_modules/define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "optional": true, - "dependencies": { - "is-descriptor": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/extract-zip": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", @@ -4267,26 +3848,10 @@ "url": "https://opencollective.com/webpack" } }, - "node_modules/fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "optional": true, - "dependencies": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/find-babel-config": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/find-babel-config/-/find-babel-config-1.2.0.tgz", - "integrity": "sha512-jB2CHJeqy6a820ssiqwrKMeyC6nNdmrcgkKWJWmpoxpE8RKciYJXCcXRq1h2AzCo5I5BJeN2tkGEO3hLTuePRA==", + "node_modules/find-babel-config": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/find-babel-config/-/find-babel-config-1.2.0.tgz", + "integrity": "sha512-jB2CHJeqy6a820ssiqwrKMeyC6nNdmrcgkKWJWmpoxpE8RKciYJXCcXRq1h2AzCo5I5BJeN2tkGEO3hLTuePRA==", "dependencies": { "json5": "^0.5.1", "path-exists": "^3.0.0" @@ -4381,36 +3946,19 @@ "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==", "dev": true }, - "node_modules/for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/formidable": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.2.tgz", - "integrity": "sha512-V8gLm+41I/8kguQ4/o1D3RIHRmhYFG4pnNyonvua+40rqcEmT4+V71yaZ3B457xbbgCsCfjSPi65u/W6vK1U5Q==", - "dev": true, - "funding": { - "url": "https://ko-fi.com/tunnckoCore/commissions" - } - }, - "node_modules/fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-2.0.1.tgz", + "integrity": "sha512-rjTMNbp2BpfQShhFbR3Ruk3qk2y9jKpvMW78nJgx8QKtxjDVrwbZG+wvDOmVbifHyOUOQJXxqEy6r0faRrPzTQ==", "dev": true, - "optional": true, "dependencies": { - "map-cache": "^0.2.2" + "dezalgo": "1.0.3", + "hexoid": "1.0.0", + "once": "1.4.0", + "qs": "6.9.3" }, - "engines": { - "node": ">=0.10.0" + "funding": { + "url": "https://ko-fi.com/tunnckoCore/commissions" } }, "node_modules/fs-extra": { @@ -4507,16 +4055,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/glob": { "version": "7.1.7", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", @@ -4693,9 +4231,9 @@ } }, "node_modules/graceful-fs": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", - "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==" + "version": "4.2.9", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", + "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==" }, "node_modules/has": { "version": "1.0.3", @@ -4727,48 +4265,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "dev": true, - "optional": true, - "dependencies": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "dev": true, - "optional": true, - "dependencies": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-values/node_modules/kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "optional": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", @@ -4778,6 +4274,15 @@ "he": "bin/he" } }, + "node_modules/hexoid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hexoid/-/hexoid-1.0.0.tgz", + "integrity": "sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/hosted-git-info": { "version": "2.8.9", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", @@ -4785,24 +4290,33 @@ "dev": true }, "node_modules/html-minifier-terser": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz", - "integrity": "sha512-ZPr5MNObqnV/T9akshPKbVgyOqLmy+Bxo7juKCfTfnjNniTAMdy4hz21YQqoofMBJD2kdREaqPPdThoR78Tgxg==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", "dev": true, "dependencies": { - "camel-case": "^4.1.1", - "clean-css": "^4.2.3", - "commander": "^4.1.1", + "camel-case": "^4.1.2", + "clean-css": "^5.2.2", + "commander": "^8.3.0", "he": "^1.2.0", - "param-case": "^3.0.3", + "param-case": "^3.0.4", "relateurl": "^0.2.7", - "terser": "^4.6.3" + "terser": "^5.10.0" }, "bin": { "html-minifier-terser": "cli.js" }, "engines": { - "node": ">=6" + "node": ">=12" + } + }, + "node_modules/html-minifier-terser/node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "dev": true, + "engines": { + "node": ">= 12" } }, "node_modules/html-reporter": { @@ -4810,15 +4324,15 @@ "link": true }, "node_modules/html-webpack-plugin": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.3.2.tgz", - "integrity": "sha512-HvB33boVNCz2lTyBsSiMffsJ+m0YLIQ+pskblXgN9fnjS1BgEcuAfdInfXfGrkdXV406k9FiDi86eVCDBgJOyQ==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.5.0.tgz", + "integrity": "sha512-sy88PC2cRTVxvETRgUHFrL4No3UxvcH8G1NepGhqaTT+GXN2kTamqasot0inS5hXeg1cMbFDt27zzo9p35lZVw==", "dev": true, "dependencies": { - "@types/html-minifier-terser": "^5.0.0", - "html-minifier-terser": "^5.0.1", + "@types/html-minifier-terser": "^6.0.0", + "html-minifier-terser": "^6.0.2", "lodash": "^4.17.21", - "pretty-error": "^3.0.4", + "pretty-error": "^4.0.0", "tapable": "^2.0.0" }, "engines": { @@ -4975,55 +4489,12 @@ "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" }, - "node_modules/is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "optional": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-accessor-descriptor/node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", "dev": true }, - "node_modules/is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "dev": true, - "optional": true, - "dependencies": { - "binary-extensions": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true, - "optional": true - }, "node_modules/is-core-module": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.6.0.tgz", @@ -5035,54 +4506,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "optional": true, - "dependencies": { - "kind-of": "^6.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-data-descriptor/node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "optional": true, - "dependencies": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-descriptor/node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-docker": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", @@ -5097,16 +4520,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -5137,19 +4550,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "optional": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", @@ -5174,16 +4574,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", @@ -5661,19 +5051,6 @@ "json-buffer": "3.0.0" } }, - "node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "optional": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/leven": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz", @@ -5825,29 +5202,6 @@ "semver": "bin/semver" } }, - "node_modules/map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "dev": true, - "optional": true, - "dependencies": { - "object-visit": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/matcher": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", @@ -5901,68 +5255,6 @@ "integrity": "sha512-+TZ5dUDPKPJaU/rscTzxyN8ZkX7eAVLAiQU/e+YINleXPv03SCmJShaMT1If1liTH8OcmWXZs0CmzCBRBLcMpA==", "dev": true }, - "node_modules/micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "optional": true, - "dependencies": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/micromatch/node_modules/extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "optional": true, - "dependencies": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/micromatch/node_modules/is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "optional": true, - "dependencies": { - "is-plain-object": "^2.0.4" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/micromatch/node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/mime": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", @@ -6029,33 +5321,6 @@ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" }, - "node_modules/mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "dev": true, - "optional": true, - "dependencies": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/mixin-deep/node_modules/is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "optional": true, - "dependencies": { - "is-plain-object": "^2.0.4" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/mkdirp": { "version": "0.5.5", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", @@ -6094,66 +5359,6 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "node_modules/nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "dev": true, - "optional": true, - "dependencies": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/nanomatch/node_modules/extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "optional": true, - "dependencies": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/nanomatch/node_modules/is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "optional": true, - "dependencies": { - "is-plain-object": "^2.0.4" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/nanomatch/node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -6199,12 +5404,12 @@ "integrity": "sha512-uW7fodD6pyW2FZNZnp/Z3hvWKeEW1Y8R1+1CnErE8cXFXzl5blBOoVB41CvMer6P6Q0S5FXDwcHgFd1Wj0U9zg==" }, "node_modules/node-stream-zip": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/node-stream-zip/-/node-stream-zip-1.13.4.tgz", - "integrity": "sha512-M2nPvnSWFFH+fgLIRZDqmhshmuzXcr+ce9BsHQX/30pXR+cEz/USMYmx9ZAFYy837W2QoDoNzhFtbZhfzaMk9A==", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/node-stream-zip/-/node-stream-zip-1.15.0.tgz", + "integrity": "sha512-LN4fydt9TqhZhThkZIVQnF9cwjU3qmUH9h78Mx/K7d3VvfRqqwthLwJEUOEL0QPZ0XQmNN7be5Ggit5+4dq3Bw==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=0.12.0" }, "funding": { "type": "github", @@ -6307,85 +5512,6 @@ "node": ">=0.10.0" } }, - "node_modules/object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "dev": true, - "optional": true, - "dependencies": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "optional": true, - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "optional": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "optional": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "optional": true, - "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/is-descriptor/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", @@ -6394,19 +5520,6 @@ "node": ">= 0.4" } }, - "node_modules/object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "dev": true, - "optional": true, - "dependencies": { - "isobject": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/object.assign": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", @@ -6424,19 +5537,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "dev": true, - "optional": true, - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -6613,16 +5713,6 @@ "tslib": "^2.0.3" } }, - "node_modules/pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -6831,16 +5921,6 @@ "node": ">=10.13.0" } }, - "node_modules/posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/postcss": { "version": "8.3.9", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.3.9.tgz", @@ -6956,13 +6036,13 @@ } }, "node_modules/pretty-error": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-3.0.4.tgz", - "integrity": "sha512-ytLFLfv1So4AO1UkoBF6GXQgJRaKbiSiGFICaOPNwQ3CMvBvXpLRubeQWyPGnsbV/t9ml9qto6IeCsho0aEvwQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", + "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", "dev": true, "dependencies": { "lodash": "^4.17.20", - "renderkid": "^2.0.6" + "renderkid": "^3.0.0" } }, "node_modules/pretty-format": { @@ -7058,6 +6138,18 @@ "node": ">=6" } }, + "node_modules/qs": { + "version": "6.9.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.3.tgz", + "integrity": "sha512-EbZYNarm6138UKKq46tdx08Yo/q9ZhFoAXAI1meAFd2GtbRDhbZY2WQSICskT0c5q99aFzLG1D4nvTk9tqfXIw==", + "dev": true, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -7150,18 +6242,15 @@ } }, "node_modules/readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dev": true, - "optional": true, "dependencies": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" + "picomatch": "^2.2.1" }, "engines": { - "node": ">=0.10" + "node": ">=8.10.0" } }, "node_modules/rechoir": { @@ -7176,47 +6265,6 @@ "node": ">= 0.10" } }, - "node_modules/regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dev": true, - "optional": true, - "dependencies": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/regex-not/node_modules/extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "optional": true, - "dependencies": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/regex-not/node_modules/is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "optional": true, - "dependencies": { - "is-plain-object": "^2.0.4" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/regexpp": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", @@ -7238,65 +6286,17 @@ "node": ">= 0.10" } }, - "node_modules/remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", - "dev": true, - "optional": true - }, "node_modules/renderkid": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.7.tgz", - "integrity": "sha512-oCcFyxaMrKsKcTY59qnCAtmDVSLfPbrv6A3tVbPdFMMrv5jaK10V6m40cKsoPNhAqN6rmHW9sswW4o3ruSrwUQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", + "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", "dev": true, "dependencies": { "css-select": "^4.1.3", "dom-converter": "^0.2.0", "htmlparser2": "^6.1.0", "lodash": "^4.17.21", - "strip-ansi": "^3.0.1" - } - }, - "node_modules/renderkid/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/renderkid/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/repeat-element": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", - "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10" + "strip-ansi": "^6.0.1" } }, "node_modules/require-directory": { @@ -7355,14 +6355,6 @@ "node": ">=4" } }, - "node_modules/resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", - "deprecated": "https://github.com/lydell/resolve-url#deprecated", - "dev": true, - "optional": true - }, "node_modules/responselike": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", @@ -7372,16 +6364,6 @@ "lowercase-keys": "^1.0.0" } }, - "node_modules/ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.12" - } - }, "node_modules/retry": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", @@ -7485,16 +6467,6 @@ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, - "node_modules/safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "dev": true, - "optional": true, - "dependencies": { - "ret": "~0.1.10" - } - }, "node_modules/sax": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", @@ -7582,22 +6554,6 @@ "randombytes": "^2.1.0" } }, - "node_modules/set-value": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", - "dev": true, - "optional": true, - "dependencies": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/shallow-clone": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", @@ -7663,202 +6619,60 @@ "npm": ">= 3.0.0" } }, - "node_modules/snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "dev": true, - "optional": true, + "node_modules/socks": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.6.1.tgz", + "integrity": "sha512-kLQ9N5ucj8uIcxrDwjm0Jsqk06xdpBjGNQtpXy4Q8/QY2k+fY7nZH8CARy+hkbG+SGAovmzzuauCpBlb8FrnBA==", "dependencies": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" + "ip": "^1.1.5", + "smart-buffer": "^4.1.0" }, "engines": { - "node": ">=0.10.0" + "node": ">= 10.13.0", + "npm": ">= 3.0.0" } }, - "node_modules/snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "dev": true, - "optional": true, + "node_modules/socks-proxy-agent": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.1.0.tgz", + "integrity": "sha512-57e7lwCN4Tzt3mXz25VxOErJKXlPfXmkMLnk310v/jwW20jWRVcgsOit+xNkN3eIEdB47GwnfAEBLacZ/wVIKg==", "dependencies": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" + "agent-base": "^6.0.2", + "debug": "^4.3.1", + "socks": "^2.6.1" }, "engines": { - "node": ">=0.10.0" + "node": ">= 10" } }, - "node_modules/snapdragon-node/node_modules/define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "node_modules/socksv5": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/socksv5/-/socksv5-0.0.6.tgz", + "integrity": "sha1-EycjX/fo3iGsQ0oKV53GnD8HEGE=", + "bundleDependencies": [ + "ipv6" + ], "dev": true, - "optional": true, "dependencies": { - "is-descriptor": "^1.0.0" + "ipv6": "*" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "node_modules/socksv5/node_modules/ipv6": { + "version": "3.1.1", "dev": true, - "optional": true, + "inBundle": true, + "license": "MIT", "dependencies": { - "kind-of": "^3.2.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "optional": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/snapdragon/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "optional": true, - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "optional": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "optional": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "optional": true, - "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/is-descriptor/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true, - "optional": true - }, - "node_modules/socks": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.6.1.tgz", - "integrity": "sha512-kLQ9N5ucj8uIcxrDwjm0Jsqk06xdpBjGNQtpXy4Q8/QY2k+fY7nZH8CARy+hkbG+SGAovmzzuauCpBlb8FrnBA==", - "dependencies": { - "ip": "^1.1.5", - "smart-buffer": "^4.1.0" - }, - "engines": { - "node": ">= 10.13.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/socks-proxy-agent": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.1.0.tgz", - "integrity": "sha512-57e7lwCN4Tzt3mXz25VxOErJKXlPfXmkMLnk310v/jwW20jWRVcgsOit+xNkN3eIEdB47GwnfAEBLacZ/wVIKg==", - "dependencies": { - "agent-base": "^6.0.2", - "debug": "^4.3.1", - "socks": "^2.6.1" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/socksv5": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/socksv5/-/socksv5-0.0.6.tgz", - "integrity": "sha1-EycjX/fo3iGsQ0oKV53GnD8HEGE=", - "bundleDependencies": [ - "ipv6" - ], - "dev": true, - "dependencies": { - "ipv6": "*" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/socksv5/node_modules/ipv6": { - "version": "3.1.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "cli": "0.4.x", - "cliff": "0.1.x", - "sprintf": "0.1.x" - }, - "bin": { - "ipv6": "bin/ipv6.js", - "ipv6grep": "bin/ipv6grep.js" + "cli": "0.4.x", + "cliff": "0.1.x", + "sprintf": "0.1.x" + }, + "bin": { + "ipv6": "bin/ipv6.js", + "ipv6grep": "bin/ipv6grep.js" }, "engines": { "node": "*" @@ -7889,20 +6703,6 @@ "node": ">=0.10.0" } }, - "node_modules/source-map-resolve": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", - "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", - "dev": true, - "optional": true, - "dependencies": { - "atob": "^2.1.2", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, "node_modules/source-map-support": { "version": "0.5.20", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.20.tgz", @@ -7922,13 +6722,6 @@ "node": ">=0.10.0" } }, - "node_modules/source-map-url": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", - "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", - "dev": true, - "optional": true - }, "node_modules/spawn-command": { "version": "0.0.2-1", "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2-1.tgz", @@ -7967,46 +6760,6 @@ "integrity": "sha512-oie3/+gKf7QtpitB0LYLETe+k8SifzsX4KixvpOsbI6S0kRiRQ5MKOio8eMSAKQ17N06+wdEOXRiId+zOxo0hA==", "dev": true }, - "node_modules/split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "dev": true, - "optional": true, - "dependencies": { - "extend-shallow": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/split-string/node_modules/extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "optional": true, - "dependencies": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/split-string/node_modules/is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "optional": true, - "dependencies": { - "is-plain-object": "^2.0.4" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/stack-utils": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.5.tgz", @@ -8026,84 +6779,6 @@ "node": ">=8" } }, - "node_modules/static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "dev": true, - "optional": true, - "dependencies": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "optional": true, - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "optional": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "optional": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "optional": true, - "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/is-descriptor/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -8167,9 +6842,9 @@ } }, "node_modules/style-loader": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.0.tgz", - "integrity": "sha512-szANub7ksJtQioJYtpbWwh1hUl99uK15n5HDlikeCRil/zYMZgSxucHddyF/4A3qJMUiAjPhFowrrQuNMA7jwQ==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.1.tgz", + "integrity": "sha512-GPcQ+LDJbrcxHORTRes6Jy2sfvK2kS6hpSfI/fXhPt+spVzxF6LJ1dHLN9zIGmVaaP044YKaIatFaufENRiDoQ==", "dev": true, "engines": { "node": ">= 12.13.0" @@ -8215,20 +6890,28 @@ } }, "node_modules/terser": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", - "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.10.0.tgz", + "integrity": "sha512-AMmF99DMfEDiRJfxfY5jj5wNH/bYO09cniSqhfoyxc8sFoYIgkJy86G04UoZU5VjlpnplVu0K6Tx6E9b5+DlHA==", "dev": true, "dependencies": { "commander": "^2.20.0", - "source-map": "~0.6.1", - "source-map-support": "~0.5.12" + "source-map": "~0.7.2", + "source-map-support": "~0.5.20" }, "bin": { "terser": "bin/terser" }, "engines": { - "node": ">=6.0.0" + "node": ">=10" + }, + "peerDependencies": { + "acorn": "^8.5.0" + }, + "peerDependenciesMeta": { + "acorn": { + "optional": true + } } }, "node_modules/terser-webpack-plugin": { @@ -8266,12 +6949,6 @@ } } }, - "node_modules/terser-webpack-plugin/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, "node_modules/terser-webpack-plugin/node_modules/schema-utils": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", @@ -8299,32 +6976,6 @@ "node": ">=0.10.0" } }, - "node_modules/terser-webpack-plugin/node_modules/terser": { - "version": "5.9.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.9.0.tgz", - "integrity": "sha512-h5hxa23sCdpzcye/7b8YqbE5OwKca/ni0RQz1uRX3tGh8haaGHqcuSqbGRybuAKNdntZ0mDgFNXPJ48xQ2RXKQ==", - "dev": true, - "dependencies": { - "commander": "^2.20.0", - "source-map": "~0.7.2", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/terser-webpack-plugin/node_modules/terser/node_modules/source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, "node_modules/terser/node_modules/commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", @@ -8332,12 +6983,12 @@ "dev": true }, "node_modules/terser/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">= 8" } }, "node_modules/text-table": { @@ -8354,83 +7005,13 @@ "node": ">=4" } }, - "node_modules/to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "dev": true, - "optional": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/to-readable-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", "dev": true, "engines": { - "node": ">=6" - } - }, - "node_modules/to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dev": true, - "optional": true, - "dependencies": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "optional": true, - "dependencies": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-regex/node_modules/extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "optional": true, - "dependencies": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-regex/node_modules/is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "optional": true, - "dependencies": { - "is-plain-object": "^2.0.4" - }, - "engines": { - "node": ">=0.10.0" + "node": ">=6" } }, "node_modules/tree-kill": { @@ -8507,9 +7088,9 @@ "dev": true }, "node_modules/typescript": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.4.3.tgz", - "integrity": "sha512-4xfscpisVgqqDfPaJo5vkd+Qd/ItkoagnHpufr+i2QCHBsNYp+G7UAoyFl8aPtx879u38wPV65rZ8qbGZijalA==", + "version": "4.5.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.5.tgz", + "integrity": "sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -8519,22 +7100,6 @@ "node": ">=4.2.0" } }, - "node_modules/union-value": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", - "dev": true, - "optional": true, - "dependencies": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/universalify": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", @@ -8544,69 +7109,6 @@ "node": ">= 4.0.0" } }, - "node_modules/unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "dev": true, - "optional": true, - "dependencies": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unset-value/node_modules/has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "dev": true, - "optional": true, - "dependencies": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unset-value/node_modules/has-value/node_modules/isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "optional": true, - "dependencies": { - "isarray": "1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unset-value/node_modules/has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/upath": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", - "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", - "dev": true, - "optional": true, - "engines": { - "node": ">=4", - "yarn": "*" - } - }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -8616,14 +7118,6 @@ "punycode": "^2.1.0" } }, - "node_modules/urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "deprecated": "Please see https://github.com/lydell/urix#deprecated", - "dev": true, - "optional": true - }, "node_modules/url-parse-lax": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", @@ -8636,16 +7130,6 @@ "node": ">=4" } }, - "node_modules/use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -8675,9 +7159,9 @@ } }, "node_modules/watchpack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.2.0.tgz", - "integrity": "sha512-up4YAn/XHgZHIxFBVCdlMiWDj6WaLKpwVeGQk2I5thdYxF/KmF0aaz6TfJZ/hfl1h/XlcDr7k1KH7ThDagpFaA==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.3.1.tgz", + "integrity": "sha512-x0t0JuydIo8qCNctdDrn1OzH/qDzk2+rdCOC3YzumZ42fiMqmQ7T3xQurykYMhYfHaPHTp4ZxAx2NfUo1K6QaA==", "dev": true, "dependencies": { "glob-to-regexp": "^0.4.1", @@ -8688,9 +7172,9 @@ } }, "node_modules/webpack": { - "version": "5.58.2", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.58.2.tgz", - "integrity": "sha512-3S6e9Vo1W2ijk4F4PPWRIu6D/uGgqaPmqw+av3W3jLDujuNkdxX5h5c+RQ6GkjVR+WwIPOfgY8av+j5j4tMqJw==", + "version": "5.68.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.68.0.tgz", + "integrity": "sha512-zUcqaUO0772UuuW2bzaES2Zjlm/y3kRBQDVFVCge+s2Y8mwuUTdperGaAv65/NtRL/1zanpSJOq/MD8u61vo6g==", "dev": true, "dependencies": { "@types/eslint-scope": "^3.7.0", @@ -8707,7 +7191,7 @@ "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.4", + "graceful-fs": "^4.2.9", "json-parse-better-errors": "^1.0.2", "loader-runner": "^4.2.0", "mime-types": "^2.1.27", @@ -8715,8 +7199,8 @@ "schema-utils": "^3.1.0", "tapable": "^2.1.1", "terser-webpack-plugin": "^5.1.3", - "watchpack": "^2.2.0", - "webpack-sources": "^3.2.0" + "watchpack": "^2.3.1", + "webpack-sources": "^3.2.3" }, "bin": { "webpack": "bin/webpack.js" @@ -8735,15 +7219,15 @@ } }, "node_modules/webpack-cli": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.9.0.tgz", - "integrity": "sha512-n/jZZBMzVEl4PYIBs+auy2WI0WTQ74EnJDiyD98O2JZY6IVIHJNitkYp/uTXOviIOMfgzrNvC9foKv/8o8KSZw==", + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.9.2.tgz", + "integrity": "sha512-m3/AACnBBzK/kMTcxWHcZFPrw/eQuY4Df1TxvIWfWM2x7mRqBQCqKEd96oCUa9jkapLBaFfRce33eGDb4Pr7YQ==", "dev": true, "dependencies": { "@discoveryjs/json-ext": "^0.5.0", - "@webpack-cli/configtest": "^1.1.0", - "@webpack-cli/info": "^1.4.0", - "@webpack-cli/serve": "^1.6.0", + "@webpack-cli/configtest": "^1.1.1", + "@webpack-cli/info": "^1.4.1", + "@webpack-cli/serve": "^1.6.1", "colorette": "^2.0.14", "commander": "^7.0.0", "execa": "^5.0.0", @@ -8751,7 +7235,6 @@ "import-local": "^3.0.2", "interpret": "^2.2.0", "rechoir": "^0.7.0", - "v8-compile-cache": "^2.2.0", "webpack-merge": "^5.7.3" }, "bin": { @@ -8807,9 +7290,9 @@ } }, "node_modules/webpack-sources": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.1.tgz", - "integrity": "sha512-t6BMVLQ0AkjBOoRTZgqrWm7xbXMBzD+XDq2EZ96+vMfn3qKgsvdXZhbPZ4ElUOpdv4u+iiGe+w3+J75iy/bYGA==", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", "dev": true, "engines": { "node": ">=10.13.0" @@ -9220,12 +7703,12 @@ }, "dependencies": { "@babel/cli": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.14.8.tgz", - "integrity": "sha512-lcy6Lymft9Rpfqmrqdd4oTDdUx9ZwaAhAfywVrHG4771Pa6PPT0danJ1kDHBXYqh4HHSmIdA+nlmfxfxSDPtBg==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.16.8.tgz", + "integrity": "sha512-FTKBbxyk5TclXOGmwYyqelqP5IF6hMxaeJskd85jbR5jBfYlwqgwAbJwnixi1ZBbTqKfFuAA95mdmUFeSRwyJA==", "dev": true, "requires": { - "@nicolo-ribaudo/chokidar-2": "2.1.8-no-fsevents.2", + "@nicolo-ribaudo/chokidar-2": "2.1.8-no-fsevents.3", "chokidar": "^3.4.0", "commander": "^4.0.1", "convert-source-map": "^1.1.0", @@ -9237,11 +7720,11 @@ } }, "@babel/code-frame": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz", - "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", + "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", "requires": { - "@babel/highlight": "^7.14.5" + "@babel/highlight": "^7.16.7" } }, "@babel/compat-data": { @@ -9272,21 +7755,21 @@ } }, "@babel/generator": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.8.tgz", - "integrity": "sha512-cYDUpvIzhBVnMzRoY1fkSEhK/HmwEVwlyULYgn/tMQYd6Obag3ylCjONle3gdErfXBW61SVTlR9QR7uWlgeIkg==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.8.tgz", + "integrity": "sha512-1ojZwE9+lOXzcWdWmO6TbUzDfqLD39CmEhN8+2cX9XkDo5yW1OpgfejfliysR2AWLpMamTiOiAp/mtroaymhpw==", "requires": { - "@babel/types": "^7.14.8", + "@babel/types": "^7.16.8", "jsesc": "^2.5.1", "source-map": "^0.5.0" } }, "@babel/helper-annotate-as-pure": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.14.5.tgz", - "integrity": "sha512-EivH9EgBIb+G8ij1B2jAwSH36WnGvkQSEC6CkX/6v6ZFlw5fVOHvsgGF4uiEHO2GzMvunZb6tDLQEQSdrdocrA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz", + "integrity": "sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==", "requires": { - "@babel/types": "^7.14.5" + "@babel/types": "^7.16.7" } }, "@babel/helper-compilation-targets": { @@ -9301,58 +7784,67 @@ } }, "@babel/helper-create-class-features-plugin": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.14.8.tgz", - "integrity": "sha512-bpYvH8zJBWzeqi1o+co8qOrw+EXzQ/0c74gVmY205AWXy9nifHrOg77y+1zwxX5lXE7Icq4sPlSQ4O2kWBrteQ==", + "version": "7.16.10", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.16.10.tgz", + "integrity": "sha512-wDeej0pu3WN/ffTxMNCPW5UCiOav8IcLRxSIyp/9+IF2xJUM9h/OYjg0IJLHaL6F8oU8kqMz9nc1vryXhMsgXg==", "requires": { - "@babel/helper-annotate-as-pure": "^7.14.5", - "@babel/helper-function-name": "^7.14.5", - "@babel/helper-member-expression-to-functions": "^7.14.7", - "@babel/helper-optimise-call-expression": "^7.14.5", - "@babel/helper-replace-supers": "^7.14.5", - "@babel/helper-split-export-declaration": "^7.14.5" + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-member-expression-to-functions": "^7.16.7", + "@babel/helper-optimise-call-expression": "^7.16.7", + "@babel/helper-replace-supers": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7" + } + }, + "@babel/helper-environment-visitor": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz", + "integrity": "sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag==", + "requires": { + "@babel/types": "^7.16.7" } }, "@babel/helper-function-name": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.5.tgz", - "integrity": "sha512-Gjna0AsXWfFvrAuX+VKcN/aNNWonizBj39yGwUzVDVTlMYJMK2Wp6xdpy72mfArFq5uK+NOuexfzZlzI1z9+AQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz", + "integrity": "sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA==", "requires": { - "@babel/helper-get-function-arity": "^7.14.5", - "@babel/template": "^7.14.5", - "@babel/types": "^7.14.5" + "@babel/helper-get-function-arity": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/types": "^7.16.7" } }, "@babel/helper-get-function-arity": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.14.5.tgz", - "integrity": "sha512-I1Db4Shst5lewOM4V+ZKJzQ0JGGaZ6VY1jYvMghRjqs6DWgxLCIyFt30GlnKkfUeFLpJt2vzbMVEXVSXlIFYUg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz", + "integrity": "sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw==", "requires": { - "@babel/types": "^7.14.5" + "@babel/types": "^7.16.7" } }, "@babel/helper-hoist-variables": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.14.5.tgz", - "integrity": "sha512-R1PXiz31Uc0Vxy4OEOm07x0oSjKAdPPCh3tPivn/Eo8cvz6gveAeuyUUPB21Hoiif0uoPQSSdhIPS3352nvdyQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz", + "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==", "requires": { - "@babel/types": "^7.14.5" + "@babel/types": "^7.16.7" } }, "@babel/helper-member-expression-to-functions": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.14.7.tgz", - "integrity": "sha512-TMUt4xKxJn6ccjcOW7c4hlwyJArizskAhoSTOCkA0uZ+KghIaci0Qg9R043kUMWI9mtQfgny+NQ5QATnZ+paaA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.7.tgz", + "integrity": "sha512-VtJ/65tYiU/6AbMTDwyoXGPKHgTsfRarivm+YbB5uAzKUyuPjgZSgAFeG87FCigc7KNHu2Pegh1XIT3lXjvz3Q==", "requires": { - "@babel/types": "^7.14.5" + "@babel/types": "^7.16.7" } }, "@babel/helper-module-imports": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.14.5.tgz", - "integrity": "sha512-SwrNHu5QWS84XlHwGYPDtCxcA0hrSlL2yhWYLgeOc0w7ccOl2qv4s/nARI0aYZW+bSwAL5CukeXA47B/1NKcnQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", + "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==", "requires": { - "@babel/types": "^7.14.5" + "@babel/types": "^7.16.7" } }, "@babel/helper-module-transforms": { @@ -9371,27 +7863,28 @@ } }, "@babel/helper-optimise-call-expression": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.14.5.tgz", - "integrity": "sha512-IqiLIrODUOdnPU9/F8ib1Fx2ohlgDhxnIDU7OEVi+kAbEZcyiF7BLU8W6PfvPi9LzztjS7kcbzbmL7oG8kD6VA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.7.tgz", + "integrity": "sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w==", "requires": { - "@babel/types": "^7.14.5" + "@babel/types": "^7.16.7" } }, "@babel/helper-plugin-utils": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", - "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==" + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", + "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" }, "@babel/helper-replace-supers": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.14.5.tgz", - "integrity": "sha512-3i1Qe9/8x/hCHINujn+iuHy+mMRLoc77b2nI9TB0zjH1hvn9qGlXjWlggdwUcju36PkPCy/lpM7LLUdcTyH4Ow==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.7.tgz", + "integrity": "sha512-y9vsWilTNaVnVh6xiJfABzsNpgDPKev9HnAgz6Gb1p6UUwf9NepdlsV7VXGCftJM+jqD5f7JIEubcpLjZj5dBw==", "requires": { - "@babel/helper-member-expression-to-functions": "^7.14.5", - "@babel/helper-optimise-call-expression": "^7.14.5", - "@babel/traverse": "^7.14.5", - "@babel/types": "^7.14.5" + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-member-expression-to-functions": "^7.16.7", + "@babel/helper-optimise-call-expression": "^7.16.7", + "@babel/traverse": "^7.16.7", + "@babel/types": "^7.16.7" } }, "@babel/helper-simple-access": { @@ -9411,22 +7904,22 @@ } }, "@babel/helper-split-export-declaration": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.14.5.tgz", - "integrity": "sha512-hprxVPu6e5Kdp2puZUmvOGjaLv9TCe58E/Fl6hRq4YiVQxIcNvuq6uTM2r1mT/oPskuS9CgR+I94sqAYv0NGKA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", + "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", "requires": { - "@babel/types": "^7.14.5" + "@babel/types": "^7.16.7" } }, "@babel/helper-validator-identifier": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.8.tgz", - "integrity": "sha512-ZGy6/XQjllhYQrNw/3zfWRwZCTVSiBLZ9DHVZxn9n2gip/7ab8mv2TWlKPIBk26RwedCBoWdjLmn+t9na2Gcow==" + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==" }, "@babel/helper-validator-option": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz", - "integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==" + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz", + "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==" }, "@babel/helpers": { "version": "7.14.8", @@ -9439,19 +7932,19 @@ } }, "@babel/highlight": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", - "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", + "version": "7.16.10", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz", + "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==", "requires": { - "@babel/helper-validator-identifier": "^7.14.5", + "@babel/helper-validator-identifier": "^7.16.7", "chalk": "^2.0.0", "js-tokens": "^4.0.0" } }, "@babel/parser": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.8.tgz", - "integrity": "sha512-syoCQFOoo/fzkWDeM0dLEZi5xqurb5vuyzwIMNZRNun+N/9A4cUZeQaE7dTrB8jGaKuJRBtEOajtnmw0I5hvvA==" + "version": "7.16.12", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.12.tgz", + "integrity": "sha512-VfaV15po8RiZssrkPweyvbGVSe4x2y+aciFCgn0n0/SJMR22cwofRV1mtnJQYcSB1wUTaA/X1LnA3es66MCO5A==" }, "@babel/plugin-proposal-class-properties": { "version": "7.14.5", @@ -9570,11 +8063,11 @@ } }, "@babel/plugin-syntax-jsx": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.14.5.tgz", - "integrity": "sha512-ohuFIsOMXJnbOMRfX7/w7LocdR6R7whhuRD4ax8IipLcLPlZGJKkBxgHp++U4N/vKyU16/YDQr2f5seajD3jIw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.16.7.tgz", + "integrity": "sha512-Esxmk7YjA8QysKeT3VhTXvF6y77f/a91SIs4pWb4H2eWGQkCKFgQaG6hdoEVZtGsrAcb2K5BW66XsOErD4WU3Q==", "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-syntax-logical-assignment-operators": { @@ -9634,11 +8127,11 @@ } }, "@babel/plugin-syntax-typescript": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.14.5.tgz", - "integrity": "sha512-u6OXzDaIXjEstBRRoBCQ/uKQKlbuaeE5in0RvWdA4pN6AhqxTIwUsnHPU1CFZA/amYObMsuWhYfRl3Ch90HD0Q==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.16.7.tgz", + "integrity": "sha512-YhUIJHHGkqPgEcMYkPCKTyGUdoGKWtopIycQyjJH8OjvRgOYsXsaKehLVPScKJWAULPxMa4N1vCe6szREFlZ7A==", "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-modules-commonjs": { @@ -9653,67 +8146,67 @@ } }, "@babel/plugin-transform-react-display-name": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.14.5.tgz", - "integrity": "sha512-07aqY1ChoPgIxsuDviptRpVkWCSbXWmzQqcgy65C6YSFOfPFvb/DX3bBRHh7pCd/PMEEYHYWUTSVkCbkVainYQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.16.7.tgz", + "integrity": "sha512-qgIg8BcZgd0G/Cz916D5+9kqX0c7nPZyXaP8R2tLNN5tkyIZdG5fEwBrxwplzSnjC1jvQmyMNVwUCZPcbGY7Pg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-react-jsx": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.14.5.tgz", - "integrity": "sha512-7RylxNeDnxc1OleDm0F5Q/BSL+whYRbOAR+bwgCxIr0L32v7UFh/pz1DLMZideAUxKT6eMoS2zQH6fyODLEi8Q==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.16.7.tgz", + "integrity": "sha512-8D16ye66fxiE8m890w0BpPpngG9o9OVBBy0gH2E+2AR7qMR2ZpTYJEqLxAsoroenMId0p/wMW+Blc0meDgu0Ag==", "requires": { - "@babel/helper-annotate-as-pure": "^7.14.5", - "@babel/helper-module-imports": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/plugin-syntax-jsx": "^7.14.5", - "@babel/types": "^7.14.5" + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-module-imports": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-jsx": "^7.16.7", + "@babel/types": "^7.16.7" } }, "@babel/plugin-transform-react-jsx-development": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.14.5.tgz", - "integrity": "sha512-rdwG/9jC6QybWxVe2UVOa7q6cnTpw8JRRHOxntG/h6g/guAOe6AhtQHJuJh5FwmnXIT1bdm5vC2/5huV8ZOorQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.16.7.tgz", + "integrity": "sha512-RMvQWvpla+xy6MlBpPlrKZCMRs2AGiHOGHY3xRwl0pEeim348dDyxeH4xBsMPbIMhujeq7ihE702eM2Ew0Wo+A==", "dev": true, "requires": { - "@babel/plugin-transform-react-jsx": "^7.14.5" + "@babel/plugin-transform-react-jsx": "^7.16.7" } }, "@babel/plugin-transform-react-pure-annotations": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.14.5.tgz", - "integrity": "sha512-3X4HpBJimNxW4rhUy/SONPyNQHp5YRr0HhJdT2OH1BRp0of7u3Dkirc7x9FRJMKMqTBI079VZ1hzv7Ouuz///g==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.16.7.tgz", + "integrity": "sha512-hs71ToC97k3QWxswh2ElzMFABXHvGiJ01IB1TbYQDGeWRKWz/MPUTh5jGExdHvosYKpnJW5Pm3S4+TA3FyX+GA==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-typescript": { - "version": "7.14.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.14.6.tgz", - "integrity": "sha512-XlTdBq7Awr4FYIzqhmYY80WN0V0azF74DMPyFqVHBvf81ZUgc4X7ZOpx6O8eLDK6iM5cCQzeyJw0ynTaefixRA==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.16.8.tgz", + "integrity": "sha512-bHdQ9k7YpBDO2d0NVfkj51DpQcvwIzIusJ7mEUaMlbZq3Kt/U47j24inXZHQ5MDiYpCs+oZiwnXyKedE8+q7AQ==", "requires": { - "@babel/helper-create-class-features-plugin": "^7.14.6", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/plugin-syntax-typescript": "^7.14.5" + "@babel/helper-create-class-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-typescript": "^7.16.7" } }, "@babel/preset-react": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.14.5.tgz", - "integrity": "sha512-XFxBkjyObLvBaAvkx1Ie95Iaq4S/GUEIrejyrntQ/VCMKUYvKLoyKxOBzJ2kjA3b6rC9/KL6KXfDC2GqvLiNqQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.16.7.tgz", + "integrity": "sha512-fWpyI8UM/HE6DfPBzD8LnhQ/OcH8AgTaqcqP2nGOXEUV+VKBR5JRN9hCk9ai+zQQ57vtm9oWeXguBCPNUjytgA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-validator-option": "^7.14.5", - "@babel/plugin-transform-react-display-name": "^7.14.5", - "@babel/plugin-transform-react-jsx": "^7.14.5", - "@babel/plugin-transform-react-jsx-development": "^7.14.5", - "@babel/plugin-transform-react-pure-annotations": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-validator-option": "^7.16.7", + "@babel/plugin-transform-react-display-name": "^7.16.7", + "@babel/plugin-transform-react-jsx": "^7.16.7", + "@babel/plugin-transform-react-jsx-development": "^7.16.7", + "@babel/plugin-transform-react-pure-annotations": "^7.16.7" } }, "@babel/preset-typescript": { @@ -9727,37 +8220,38 @@ } }, "@babel/template": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.14.5.tgz", - "integrity": "sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", + "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", "requires": { - "@babel/code-frame": "^7.14.5", - "@babel/parser": "^7.14.5", - "@babel/types": "^7.14.5" + "@babel/code-frame": "^7.16.7", + "@babel/parser": "^7.16.7", + "@babel/types": "^7.16.7" } }, "@babel/traverse": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.8.tgz", - "integrity": "sha512-kexHhzCljJcFNn1KYAQ6A5wxMRzq9ebYpEDV4+WdNyr3i7O44tanbDOR/xjiG2F3sllan+LgwK+7OMk0EmydHg==", - "requires": { - "@babel/code-frame": "^7.14.5", - "@babel/generator": "^7.14.8", - "@babel/helper-function-name": "^7.14.5", - "@babel/helper-hoist-variables": "^7.14.5", - "@babel/helper-split-export-declaration": "^7.14.5", - "@babel/parser": "^7.14.8", - "@babel/types": "^7.14.8", + "version": "7.16.10", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.10.tgz", + "integrity": "sha512-yzuaYXoRJBGMlBhsMJoUW7G1UmSb/eXr/JHYM/MsOJgavJibLwASijW7oXBdw3NQ6T0bW7Ty5P/VarOs9cHmqw==", + "requires": { + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.16.8", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-hoist-variables": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/parser": "^7.16.10", + "@babel/types": "^7.16.8", "debug": "^4.1.0", "globals": "^11.1.0" } }, "@babel/types": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.8.tgz", - "integrity": "sha512-iob4soQa7dZw8nodR/KlOQkPh9S4I8RwCxwRIFuiMRYjOzH/KJzdUfDgz6cGi5dDaclXF4P2PAhCdrBJNIg68Q==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.8.tgz", + "integrity": "sha512-smN2DQc5s4M7fntyjGtyIPbRJv6wW4rU/94fmYJ7PKQuZkC0qGMHXJbg6sNGt12JmVr4k5YaptI/XtiLJBnmIg==", "requires": { - "@babel/helper-validator-identifier": "^7.14.8", + "@babel/helper-validator-identifier": "^7.16.7", "to-fast-properties": "^2.0.0" } }, @@ -9785,14 +8279,14 @@ } }, "@eslint/eslintrc": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.0.4.tgz", - "integrity": "sha512-h8Vx6MdxwWI2WM8/zREHMoqdgLNXEL4QX3MWSVMdyNJGvXVOs+6lp+m2hc3FnuMHDc4poxFNI20vCk0OmI4G0Q==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.0.5.tgz", + "integrity": "sha512-BLxsnmK3KyPunz5wmCCpqy0YelEoxxGmH73Is+Z74oOTMtExcjkr3dDR6quwrjh1YspA8DH9gnX1o069KiS9AQ==", "dev": true, "requires": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.0.0", + "espree": "^9.2.0", "globals": "^13.9.0", "ignore": "^4.0.6", "import-fresh": "^3.2.1", @@ -9825,12 +8319,12 @@ } }, "@humanwhocodes/config-array": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.6.0.tgz", - "integrity": "sha512-JQlEKbcgEUjBFhLIF4iqM7u/9lwgHRBcpHrmUNCALK0Q3amXN6lxdoXLnF0sm11E9VqTmBALR87IlUg1bZ8A9A==", + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.3.tgz", + "integrity": "sha512-3xSMlXHh03hCcCmFc0rbKp3Ivt2PFEJnQUJDDMTJQ2wkECZWdq4GePs2ctc5H8zV+cHPaq8k2vU8mrQjA6iHdQ==", "dev": true, "requires": { - "@humanwhocodes/object-schema": "^1.2.0", + "@humanwhocodes/object-schema": "^1.2.1", "debug": "^4.1.1", "minimatch": "^3.0.4" } @@ -9899,24 +8393,11 @@ } }, "@nicolo-ribaudo/chokidar-2": { - "version": "2.1.8-no-fsevents.2", - "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/chokidar-2/-/chokidar-2-2.1.8-no-fsevents.2.tgz", - "integrity": "sha512-Fb8WxUFOBQVl+CX4MWet5o7eCc6Pj04rXIwVKZ6h1NnqTo45eOQW6aWyhG25NIODvWFwTDMwBsYxrQ3imxpetg==", + "version": "2.1.8-no-fsevents.3", + "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/chokidar-2/-/chokidar-2-2.1.8-no-fsevents.3.tgz", + "integrity": "sha512-s88O1aVtXftvp5bCPB7WnmXc5IwOZZ7YPuwNPt+GtOOXpPvad1LfbmjYv+qII7zP6RU2QGnqve27dnLycEnyEQ==", "dev": true, - "optional": true, - "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "glob-parent": "^5.1.2", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" - } + "optional": true }, "@nodelib/fs.scandir": { "version": "2.1.5", @@ -10028,9 +8509,9 @@ "dev": true }, "@types/babel__core": { - "version": "7.1.15", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.15.tgz", - "integrity": "sha512-bxlMKPDbY8x5h6HBwVzEOk2C8fb6SLfYQ5Jw3uBYuYF1lfWk/kbLd81la82vrIkBb0l+JdmrZaDikPrNxpS/Ew==", + "version": "7.1.18", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.18.tgz", + "integrity": "sha512-S7unDjm/C7z2A2R9NzfKCK1I+BAALDtxEmsJBwlB3EzNfb929ykjL++1CK9LO++EIp2fQrC8O+BwjKvz6UeDyQ==", "dev": true, "requires": { "@babel/parser": "^7.1.0", @@ -10069,10 +8550,13 @@ } }, "@types/debug": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.5.tgz", - "integrity": "sha512-Q1y515GcOdTHgagaVFhHnIFQ38ygs/kmxdNpvpou+raI9UO3YZcHDngBSYKQklcKlvA7iuQlmIKbzvmxcOE9CQ==", - "dev": true + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.7.tgz", + "integrity": "sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==", + "dev": true, + "requires": { + "@types/ms": "*" + } }, "@types/eslint": { "version": "7.28.1", @@ -10100,11 +8584,14 @@ "integrity": "sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw==", "dev": true }, - "@types/extract-zip": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/@types/extract-zip/-/extract-zip-1.6.2.tgz", - "integrity": "sha1-XH60QcQRNhZ6QriLZAUeYmDCnoY=", - "dev": true + "@types/formidable": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/formidable/-/formidable-2.0.4.tgz", + "integrity": "sha512-6HYcnmBCeby/nNGgX9kq1DxUpK2UcB3yoHCr3GzFjjqkpivOdcBSbsXP9NbxLcPEi11Fl/L41rbFCIsteF9sbg==", + "dev": true, + "requires": { + "@types/node": "*" + } }, "@types/glob": { "version": "7.1.3", @@ -10117,9 +8604,9 @@ } }, "@types/html-minifier-terser": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-5.1.2.tgz", - "integrity": "sha512-h4lTMgMJctJybDp8CQrxTUiiYmedihHWkjnF/8Pxseu2S6Nlfcy8kwboQ8yejh456rP2yWoEVm1sS/FVsfM48w==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==", "dev": true }, "@types/istanbul-lib-coverage": { @@ -10156,9 +8643,9 @@ "dev": true }, "@types/minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-1z8k4wzFnNjVK/tlxvrWuK5WMt6mydWWP7+zvH5eFep4oj+UkrfiJTRtjCeBXNpwaA/FYqqtb4/QS4ianFpIRA==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", "dev": true }, "@types/ms": { @@ -10179,27 +8666,27 @@ "dev": true }, "@types/pixelmatch": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/@types/pixelmatch/-/pixelmatch-5.2.3.tgz", - "integrity": "sha512-p+nAQVYK/DUx7+s1Xyu9dqAg0gobf7VmJ+iDA4lljg1o4XRgQHr7R2h1NwFt3gdNOZiftxWB11+0TuZqXYf19w==", + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/@types/pixelmatch/-/pixelmatch-5.2.4.tgz", + "integrity": "sha512-HDaSHIAv9kwpMN7zlmwfTv6gax0PiporJOipcrGsVNF3Ba+kryOZc0Pio5pn6NhisgWr7TaajlPEKTbTAypIBQ==", "dev": true, "requires": { "@types/node": "*" } }, "@types/pngjs": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/@types/pngjs/-/pngjs-3.4.2.tgz", - "integrity": "sha512-LJVPDraJ5YFEnMHnzxTN4psdWz1M61MtaAAWPn3qnDk5fvs7BAmmQ9pd3KPlrdrvozMyne4ktanD4pg0L7x1Pw==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@types/pngjs/-/pngjs-6.0.1.tgz", + "integrity": "sha512-J39njbdW1U/6YyVXvC9+1iflZghP8jgRf2ndYghdJb5xL49LYDB+1EuAxfbuJ2IBbWIL3AjHPQhgaTxT3YaYeg==", "dev": true, "requires": { "@types/node": "*" } }, "@types/progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-bPOsfCZ4tsTlKiBjBhKnM8jpY5nmIll166IPD58D92hR7G7kZDfx5iB9wGF4NfZrdKolebjeAr3GouYkSGoJ/A==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/progress/-/progress-2.0.5.tgz", + "integrity": "sha512-ZYYVc/kSMkhH9W/4dNK/sLNra3cnkfT2nJyOAIDY+C2u6w72wa0s1aXAezVtbTsnN8HID1uhXCrLwDE2ZXpplg==", "dev": true, "requires": { "@types/node": "*" @@ -10212,9 +8699,9 @@ "dev": true }, "@types/proper-lockfile": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@types/proper-lockfile/-/proper-lockfile-4.1.1.tgz", - "integrity": "sha512-HAjVfDa73pFgivViHyDu8HHHcds+W4MgOuZZAdyFJrHS8ngtCXmhl4hc2YXqSOwO6Bsa+iF2Sgxb2+gv874VOQ==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@types/proper-lockfile/-/proper-lockfile-4.1.2.tgz", + "integrity": "sha512-kd4LMvcnpYkspDcp7rmXKedn8iJSCoa331zRRamUp5oanKt/CefbEGPQP7G89enz7sKD4bvsr8mHSsC8j5WOvA==", "dev": true, "requires": { "@types/retry": "*" @@ -10230,9 +8717,9 @@ } }, "@types/react": { - "version": "17.0.5", - "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.5.tgz", - "integrity": "sha512-bj4biDB9ZJmGAYTWSKJly6bMr4BLUiBrx9ujiJEoP9XIDY9CTaPGxE5QWN/1WjpPLzYF7/jRNnV2nNxNe970sw==", + "version": "17.0.38", + "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.38.tgz", + "integrity": "sha512-SI92X1IA+FMnP3qM5m4QReluXzhcmovhZnLNm3pyeQlooi02qI7sLiepEYqT678uNiyc25XfCqxREFpy3W7YhQ==", "dev": true, "requires": { "@types/prop-types": "*", @@ -10241,18 +8728,18 @@ } }, "@types/react-dom": { - "version": "17.0.4", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.4.tgz", - "integrity": "sha512-Wb6rlnPJfqbhpkvYN39y1NM/pOGGPzzIRquu0RdUMvTwgXNvASFO7pdtrtvyxGTQNb9wzBaQxXAWDdEqegZw2A==", + "version": "17.0.11", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.11.tgz", + "integrity": "sha512-f96K3k+24RaLGVu/Y2Ng3e1EbZ8/cVJvypZWd7cy0ofCBaf2lcM46xNhycMZ2xGwbBjRql7hOlZ+e2WlJ5MH3Q==", "dev": true, "requires": { "@types/react": "*" } }, "@types/resize-observer-browser": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/@types/resize-observer-browser/-/resize-observer-browser-0.1.5.tgz", - "integrity": "sha512-8k/67Z95Goa6Lznuykxkfhq9YU3l1Qe6LNZmwde1u7802a3x8v44oq0j91DICclxatTr0rNnhXx7+VTIetSrSQ==", + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@types/resize-observer-browser/-/resize-observer-browser-0.1.6.tgz", + "integrity": "sha512-61IfTac0s9jvNtBCpyo86QeaN8qqpMGHdK0uGKCCIy2dt5/Yk84VduHIdWAcmkC5QvdkPL0p5eWYgUZtHKKUVg==", "dev": true }, "@types/retry": { @@ -10262,9 +8749,9 @@ "dev": true }, "@types/rimraf": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/rimraf/-/rimraf-3.0.0.tgz", - "integrity": "sha512-7WhJ0MdpFgYQPXlF4Dx+DhgvlPCfz/x5mHaeDQAKhcenvQP1KCpLQ18JklAqeGMYSAT2PxLpzd0g2/HE7fj7hQ==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-F3OznnSLAUxFrCEu/L5PY8+ny8DtcFRjx7fZZ9bycvXRi3KPTRS9HOitGZwvPg0juRhXFWIeKX58cnX5YqLohQ==", "dev": true, "requires": { "@types/glob": "*", @@ -10278,12 +8765,20 @@ "dev": true }, "@types/source-map-support": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@types/source-map-support/-/source-map-support-0.4.2.tgz", - "integrity": "sha512-GbGWx39O8NdUHSChdrU0XeigBAgu1Teg3llwE0slSVcH2qISaQT70ftAiH+h4HIt3VIObFU34PSpXIKJuXCybQ==", + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/@types/source-map-support/-/source-map-support-0.5.4.tgz", + "integrity": "sha512-9zGujX1sOPg32XLyfgEB/0G9ZnrjthL/Iv1ZfuAjj8LEilHZEpQSQs1scpRXPhHzGYgWiLz9ldF1cI8JhL+yMw==", "dev": true, "requires": { - "@types/node": "*" + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } } }, "@types/stack-utils": { @@ -10312,9 +8807,9 @@ } }, "@types/xml2js": { - "version": "0.4.8", - "resolved": "https://registry.npmjs.org/@types/xml2js/-/xml2js-0.4.8.tgz", - "integrity": "sha512-EyvT83ezOdec7BhDaEcsklWy7RSIdi6CNe95tmOAK0yx/Lm30C9K75snT3fYayK59ApC2oyW+rcHErdG05FHJA==", + "version": "0.4.9", + "resolved": "https://registry.npmjs.org/@types/xml2js/-/xml2js-0.4.9.tgz", + "integrity": "sha512-CHiCKIihl1pychwR2RNX5mAYmJDACgFVCMT5OArMaO3erzwXVcBqPcusr+Vl8yeeXukxZqtF8mZioqX+mpjjdw==", "dev": true, "requires": { "@types/node": "*" @@ -10352,13 +8847,14 @@ } }, "@typescript-eslint/eslint-plugin": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.4.0.tgz", - "integrity": "sha512-9/yPSBlwzsetCsGEn9j24D8vGQgJkOTr4oMLas/w886ZtzKIs1iyoqFrwsX2fqYEeUwsdBpC21gcjRGo57u0eg==", + "version": "5.10.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.10.2.tgz", + "integrity": "sha512-4W/9lLuE+v27O/oe7hXJKjNtBLnZE8tQAFpapdxwSVHqtmIoPB1gph3+ahNwVuNL37BX7YQHyGF9Xv6XCnIX2Q==", "dev": true, "requires": { - "@typescript-eslint/experimental-utils": "5.4.0", - "@typescript-eslint/scope-manager": "5.4.0", + "@typescript-eslint/scope-manager": "5.10.2", + "@typescript-eslint/type-utils": "5.10.2", + "@typescript-eslint/utils": "5.10.2", "debug": "^4.3.2", "functional-red-black-tree": "^1.0.1", "ignore": "^5.1.8", @@ -10378,56 +8874,53 @@ } } }, - "@typescript-eslint/experimental-utils": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.4.0.tgz", - "integrity": "sha512-Nz2JDIQUdmIGd6p33A+naQmwfkU5KVTLb/5lTk+tLVTDacZKoGQisj8UCxk7onJcrgjIvr8xWqkYI+DbI3TfXg==", + "@typescript-eslint/parser": { + "version": "5.10.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.10.2.tgz", + "integrity": "sha512-JaNYGkaQVhP6HNF+lkdOr2cAs2wdSZBoalE22uYWq8IEv/OVH0RksSGydk+sW8cLoSeYmC+OHvRyv2i4AQ7Czg==", "dev": true, "requires": { - "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.4.0", - "@typescript-eslint/types": "5.4.0", - "@typescript-eslint/typescript-estree": "5.4.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0" + "@typescript-eslint/scope-manager": "5.10.2", + "@typescript-eslint/types": "5.10.2", + "@typescript-eslint/typescript-estree": "5.10.2", + "debug": "^4.3.2" } }, - "@typescript-eslint/parser": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.4.0.tgz", - "integrity": "sha512-JoB41EmxiYpaEsRwpZEYAJ9XQURPFer8hpkIW9GiaspVLX8oqbqNM8P4EP8HOZg96yaALiLEVWllA2E8vwsIKw==", + "@typescript-eslint/scope-manager": { + "version": "5.10.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.10.2.tgz", + "integrity": "sha512-39Tm6f4RoZoVUWBYr3ekS75TYgpr5Y+X0xLZxXqcZNDWZdJdYbKd3q2IR4V9y5NxxiPu/jxJ8XP7EgHiEQtFnw==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.4.0", - "@typescript-eslint/types": "5.4.0", - "@typescript-eslint/typescript-estree": "5.4.0", - "debug": "^4.3.2" + "@typescript-eslint/types": "5.10.2", + "@typescript-eslint/visitor-keys": "5.10.2" } }, - "@typescript-eslint/scope-manager": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.4.0.tgz", - "integrity": "sha512-pRxFjYwoi8R+n+sibjgF9iUiAELU9ihPBtHzocyW8v8D8G8KeQvXTsW7+CBYIyTYsmhtNk50QPGLE3vrvhM5KA==", + "@typescript-eslint/type-utils": { + "version": "5.10.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.10.2.tgz", + "integrity": "sha512-uRKSvw/Ccs5FYEoXW04Z5VfzF2iiZcx8Fu7DGIB7RHozuP0VbKNzP1KfZkHBTM75pCpsWxIthEH1B33dmGBKHw==", "dev": true, "requires": { - "@typescript-eslint/types": "5.4.0", - "@typescript-eslint/visitor-keys": "5.4.0" + "@typescript-eslint/utils": "5.10.2", + "debug": "^4.3.2", + "tsutils": "^3.21.0" } }, "@typescript-eslint/types": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.4.0.tgz", - "integrity": "sha512-GjXNpmn+n1LvnttarX+sPD6+S7giO+9LxDIGlRl4wK3a7qMWALOHYuVSZpPTfEIklYjaWuMtfKdeByx0AcaThA==", + "version": "5.10.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.10.2.tgz", + "integrity": "sha512-Qfp0qk/5j2Rz3p3/WhWgu4S1JtMcPgFLnmAKAW061uXxKSa7VWKZsDXVaMXh2N60CX9h6YLaBoy9PJAfCOjk3w==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.4.0.tgz", - "integrity": "sha512-nhlNoBdhKuwiLMx6GrybPT3SFILm5Gij2YBdPEPFlYNFAXUJWX6QRgvi/lwVoadaQEFsizohs6aFRMqsXI2ewA==", + "version": "5.10.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.10.2.tgz", + "integrity": "sha512-WHHw6a9vvZls6JkTgGljwCsMkv8wu8XU8WaYKeYhxhWXH/atZeiMW6uDFPLZOvzNOGmuSMvHtZKd6AuC8PrwKQ==", "dev": true, "requires": { - "@typescript-eslint/types": "5.4.0", - "@typescript-eslint/visitor-keys": "5.4.0", + "@typescript-eslint/types": "5.10.2", + "@typescript-eslint/visitor-keys": "5.10.2", "debug": "^4.3.2", "globby": "^11.0.4", "is-glob": "^4.0.3", @@ -10446,13 +8939,27 @@ } } }, + "@typescript-eslint/utils": { + "version": "5.10.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.10.2.tgz", + "integrity": "sha512-vuJaBeig1NnBRkf7q9tgMLREiYD7zsMrsN1DA3wcoMDvr3BTFiIpKjGiYZoKPllfEwN7spUjv7ZqD+JhbVjEPg==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "@typescript-eslint/scope-manager": "5.10.2", + "@typescript-eslint/types": "5.10.2", + "@typescript-eslint/typescript-estree": "5.10.2", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0" + } + }, "@typescript-eslint/visitor-keys": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.4.0.tgz", - "integrity": "sha512-PVbax7MeE7tdLfW5SA0fs8NGVVr+buMPrcj+CWYWPXsZCH8qZ1THufDzbXm1xrZ2b2PA1iENJ0sRq5fuUtvsJg==", + "version": "5.10.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.10.2.tgz", + "integrity": "sha512-zHIhYGGGrFJvvyfwHk5M08C5B5K4bewkm+rrvNTKk1/S15YHR+SA/QUF8ZWscXSfEaB8Nn2puZj+iHcoxVOD/Q==", "dev": true, "requires": { - "@typescript-eslint/types": "5.4.0", + "@typescript-eslint/types": "5.10.2", "eslint-visitor-keys": "^3.0.0" } }, @@ -10603,25 +9110,25 @@ } }, "@webpack-cli/configtest": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.1.0.tgz", - "integrity": "sha512-ttOkEkoalEHa7RaFYpM0ErK1xc4twg3Am9hfHhL7MVqlHebnkYd2wuI/ZqTDj0cVzZho6PdinY0phFZV3O0Mzg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.1.1.tgz", + "integrity": "sha512-1FBc1f9G4P/AxMqIgfZgeOTuRnwZMten8E7zap5zgpPInnCrP8D4Q81+4CWIch8i/Nf7nXjP0v6CjjbHOrXhKg==", "dev": true, "requires": {} }, "@webpack-cli/info": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.4.0.tgz", - "integrity": "sha512-F6b+Man0rwE4n0409FyAJHStYA5OIZERxmnUfLVwv0mc0V1wLad3V7jqRlMkgKBeAq07jUvglacNaa6g9lOpuw==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.4.1.tgz", + "integrity": "sha512-PKVGmazEq3oAo46Q63tpMr4HipI3OPfP7LiNOEJg963RMgT0rqheag28NCML0o3GIzA3DmxP1ZIAv9oTX1CUIA==", "dev": true, "requires": { "envinfo": "^7.7.3" } }, "@webpack-cli/serve": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.6.0.tgz", - "integrity": "sha512-ZkVeqEmRpBV2GHvjjUZqEai2PpUbuq8Bqd//vEYsp63J8WyexI8ppCqVS3Zs0QADf6aWuPdU+0XsPI647PVlQA==", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.6.1.tgz", + "integrity": "sha512-gNGTiTrjEVQ0OcVnzsRSqTxaBSr+dmTfm+qJsCDluky8uhdLWep7Gcr62QsAKHTMxjCS/8nEITsmFAhfIx+QSw==", "dev": true, "requires": {} }, @@ -10638,15 +9145,15 @@ "dev": true }, "@zip.js/zip.js": { - "version": "2.3.17", - "resolved": "https://registry.npmjs.org/@zip.js/zip.js/-/zip.js-2.3.17.tgz", - "integrity": "sha512-ktTJ8dvbiIu4MAlioJo/475QtTsbOBK5YmBbvRJaduCeEKOof/ZTY2H7DPwiC0pC9dDfEo+uFsqMVI1J4HLl5g==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@zip.js/zip.js/-/zip.js-2.4.2.tgz", + "integrity": "sha512-D4xr9g7U625Q01lQASr9g1sQWEGhndyd+G3v3OvY/qH3pwaJDpbVDy+TO6yEq7c8teQdjjTiiBvlcQcVtT+itg==", "dev": true }, "acorn": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.6.0.tgz", - "integrity": "sha512-U1riIR+lBSNi3IbxtaHOIKdH8sLFv3NYfNv8sg7ZsNhcfl4HF2++BfqqrNAxoCLQW1iiylOj76ecnaUxz+z9yw==", + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", + "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==", "dev": true }, "acorn-jsx": { @@ -10703,37 +9210,14 @@ } }, "ansi-to-html": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/ansi-to-html/-/ansi-to-html-0.7.1.tgz", - "integrity": "sha512-PPpOy/TeLE6xERG5CNNpm1cLTIW1IeWULleeVc089paF45zfz5gzNPXeSQyxt1sUiKVIYZlY86AYx3fsMdIr5w==", + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/ansi-to-html/-/ansi-to-html-0.7.2.tgz", + "integrity": "sha512-v6MqmEpNlxF+POuyhKkidusCHWWkaLcGRURzivcU3I9tv7k4JVhFcnukrM5Rlk2rUywdZuzYAZ+kbZqWCnfN3g==", "dev": true, "requires": { "entities": "^2.2.0" } }, - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, - "optional": true, - "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - }, - "dependencies": { - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "optional": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - } - } - }, "argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -10752,65 +9236,22 @@ "mri": "1.1.4" } }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true, - "optional": true - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true, - "optional": true - }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", - "dev": true, - "optional": true - }, "array-union": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", "dev": true }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true, - "optional": true - }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", - "dev": true, - "optional": true - }, - "async-each": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", - "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", - "dev": true, - "optional": true - }, - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true, - "optional": true + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", + "dev": true }, "babel-loader": { - "version": "8.2.2", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.2.tgz", - "integrity": "sha512-JvTd0/D889PQBtUXJ2PXaKU/pjZDMtHA9V2ecm+eNRmmBCMR09a+fmpGTNwnJtFmFl5Ei7Vy47LjBb+L0wQ99g==", + "version": "8.2.3", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.3.tgz", + "integrity": "sha512-n4Zeta8NC3QAsuyiizu0GkmRcQ6clkV9WFUnUf1iXP//IeSKbWjofW3UHyZVwlOB4y039YQKefawyTn64Zwbuw==", "dev": true, "requires": { "find-cache-dir": "^3.3.1", @@ -10853,35 +9294,7 @@ "balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "dev": true, - "optional": true, - "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "optional": true, - "requires": { - "is-descriptor": "^1.0.0" - } - } - } + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "basic-auth-parser": { "version": "0.0.2", @@ -10895,13 +9308,6 @@ "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", "dev": true }, - "binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", - "dev": true, - "optional": true - }, "boolbase": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", @@ -10924,25 +9330,6 @@ "concat-map": "0.0.1" } }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "optional": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - } - }, "browserslist": { "version": "4.16.6", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz", @@ -10966,24 +9353,6 @@ "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", "dev": true }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "dev": true, - "optional": true, - "requires": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - } - }, "cacheable-request": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", @@ -11054,19 +9423,19 @@ } }, "chokidar": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", - "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", "dev": true, "requires": { - "anymatch": "~3.1.1", + "anymatch": "~3.1.2", "braces": "~3.0.2", - "fsevents": "~2.3.1", - "glob-parent": "~5.1.0", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", - "readdirp": "~3.5.0" + "readdirp": "~3.6.0" }, "dependencies": { "anymatch": { @@ -11118,15 +9487,6 @@ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, - "readdirp": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", - "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", - "dev": true, - "requires": { - "picomatch": "^2.2.1" - } - }, "to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -11144,76 +9504,10 @@ "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", "dev": true }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "dev": true, - "optional": true, - "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "optional": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "optional": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "optional": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "optional": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true, - "optional": true - } - } - } - } - }, "clean-css": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz", - "integrity": "sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==", + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.2.4.tgz", + "integrity": "sha512-nKseG8wCzEuji/4yrgM/5cthL9oTDc5UOQyFMvW/Q53oP6gLH690o1NbuTh6Y18nujr7BxlsFuS7gXLnLzKJGg==", "dev": true, "requires": { "source-map": "~0.6.0" @@ -11266,17 +9560,6 @@ "mimic-response": "^1.0.0" } }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "dev": true, - "optional": true, - "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - } - }, "color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", @@ -11313,9 +9596,9 @@ "dev": true }, "commonmark": { - "version": "0.29.3", - "resolved": "https://registry.npmjs.org/commonmark/-/commonmark-0.29.3.tgz", - "integrity": "sha512-fvt/NdOFKaL2gyhltSy6BC4LxbbxbnPxBMl923ittqO/JBM0wQHaoYZliE4tp26cRxX/ZZtRsJlZzQrVdUkXAA==", + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/commonmark/-/commonmark-0.30.0.tgz", + "integrity": "sha512-j1yoUo4gxPND1JWV9xj5ELih0yMv1iCWDG6eEQIPLSWLxzCXiFoyS7kvB+WwU+tZMf4snwJMMtaubV0laFpiBA==", "dev": true, "requires": { "entities": "~2.0", @@ -11332,13 +9615,6 @@ } } }, - "component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", - "dev": true, - "optional": true - }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -11454,25 +9730,17 @@ "safe-buffer": "~5.1.1" } }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "dev": true, - "optional": true - }, "copy-webpack-plugin": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-9.0.1.tgz", - "integrity": "sha512-14gHKKdYIxF84jCEgPgYXCPpldbwpxxLbCmA7LReY7gvbaT555DgeBWBgBZM116tv/fO6RRJrsivBqRyRlukhw==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-9.1.0.tgz", + "integrity": "sha512-rxnR7PaGigJzhqETHGmAcxKnLZSR5u1Y3/bcIv/1FnqXedcL/E2ewK7ZCNrArJKCiSv8yVXhTqetJh8inDvfsA==", "dev": true, "requires": { - "fast-glob": "^3.2.5", - "glob-parent": "^6.0.0", + "fast-glob": "^3.2.7", + "glob-parent": "^6.0.1", "globby": "^11.0.3", "normalize-path": "^3.0.0", - "p-limit": "^3.1.0", - "schema-utils": "^3.0.0", + "schema-utils": "^3.1.1", "serialize-javascript": "^6.0.0" }, "dependencies": { @@ -11532,9 +9800,9 @@ } }, "css-loader": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.4.0.tgz", - "integrity": "sha512-Dlt6qfsxI/w1vU0r8qDd4BtMPxWqJeY5qQU7SmmZfvbpe6Xl18McO4GhyaMLns24Y2VNPiZwJPQ8JSbg4qvQLw==", + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.5.1.tgz", + "integrity": "sha512-gEy2w9AnJNnD9Kuo4XAP9VflW/ujKoS9c/syO+uWMlm5igc7LysKzPXaDoR2vroROkSwsTS2tGr1yGGEbZOYZQ==", "dev": true, "requires": { "icss-utils": "^5.1.0", @@ -11559,16 +9827,16 @@ } }, "css-select": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.1.3.tgz", - "integrity": "sha512-gT3wBNd9Nj49rAbmtFHj1cljIAOLYSX1nZ8CB7TBO3INYckygm5B7LISU/szY//YmdiSLbJvDLOx9VnMVpMBxA==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.2.1.tgz", + "integrity": "sha512-/aUslKhzkTNCQUB2qTX84lVmfia9NyjP3WpDGtj/WxhwBzWBYUV3DgUpurHTme8UTPcPlAD1DJ+b0nN/t50zDQ==", "dev": true, "requires": { "boolbase": "^1.0.0", - "css-what": "^5.0.0", - "domhandler": "^4.2.0", - "domutils": "^2.6.0", - "nth-check": "^2.0.0" + "css-what": "^5.1.0", + "domhandler": "^4.3.0", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" } }, "css-what": { @@ -11603,13 +9871,6 @@ "ms": "2.1.2" } }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", - "dev": true, - "optional": true - }, "decompress-response": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", @@ -11644,17 +9905,6 @@ "object-keys": "^1.0.12" } }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "optional": true, - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - } - }, "detect-node": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.5.tgz", @@ -11662,6 +9912,16 @@ "dev": true, "optional": true }, + "dezalgo": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.3.tgz", + "integrity": "sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY=", + "dev": true, + "requires": { + "asap": "^2.0.0", + "wrappy": "1" + } + }, "diff-sequences": { "version": "27.0.6", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.0.6.tgz", @@ -11712,9 +9972,9 @@ "dev": true }, "domhandler": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.2.2.tgz", - "integrity": "sha512-PzE9aBMsdZO8TK4BnuJwH0QT41wgMbRzuZrHUcpYncEjmQazq8QEaBWgLG7ZyC/DAZKEgglpIA6j4Qn/HmxS3w==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.0.tgz", + "integrity": "sha512-fC0aXNQXqKSFTr2wDNZDhsEYjCiYsDWl3D01kwt25hm1YIPyDGHvvi3rw+PLqHAl/m71MaiF7d5zvBr0p5UB2g==", "dev": true, "requires": { "domelementtype": "^2.2.0" @@ -11758,6 +10018,12 @@ "extract-zip": "^1.0.3" }, "dependencies": { + "@types/node": { + "version": "14.18.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.10.tgz", + "integrity": "sha512-6iihJ/Pp5fsFJ/aEDGyvT4pHGmCpq7ToQ/yf4bl5SbVAvwpspYJ+v3jO7n8UyjhQVHTy+KNszOozDdv+O6sovQ==", + "dev": true + }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -11889,24 +10155,23 @@ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, "eslint": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.2.0.tgz", - "integrity": "sha512-erw7XmM+CLxTOickrimJ1SiF55jiNlVSp2qqm0NuBWPtHYQCegD5ZMaW0c3i5ytPqL+SSLaCxdvQXFPLJn+ABw==", + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.8.0.tgz", + "integrity": "sha512-H3KXAzQGBH1plhYS3okDix2ZthuYJlQQEGE5k0IKuEqUSiyu4AmxxlJ2MtTYeJ3xB4jDhcYCwGOg2TXYdnDXlQ==", "dev": true, "requires": { - "@eslint/eslintrc": "^1.0.4", - "@humanwhocodes/config-array": "^0.6.0", + "@eslint/eslintrc": "^1.0.5", + "@humanwhocodes/config-array": "^0.9.2", "ajv": "^6.10.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.3.2", "doctrine": "^3.0.0", - "enquirer": "^2.3.5", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^6.0.0", + "eslint-scope": "^7.1.0", "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.0.0", - "espree": "^9.0.0", + "eslint-visitor-keys": "^3.2.0", + "espree": "^9.3.0", "esquery": "^1.4.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -11914,7 +10179,7 @@ "functional-red-black-tree": "^1.0.1", "glob-parent": "^6.0.1", "globals": "^13.6.0", - "ignore": "^4.0.6", + "ignore": "^5.2.0", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", @@ -11925,9 +10190,7 @@ "minimatch": "^3.0.4", "natural-compare": "^1.4.0", "optionator": "^0.9.1", - "progress": "^2.0.0", "regexpp": "^3.2.0", - "semver": "^7.2.1", "strip-ansi": "^6.0.1", "strip-json-comments": "^3.1.0", "text-table": "^0.2.0", @@ -11975,9 +10238,9 @@ "dev": true }, "eslint-scope": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-6.0.0.tgz", - "integrity": "sha512-uRDL9MWmQCkaFus8RF5K9/L/2fn+80yoW3jkD53l4shjCh26fCtvJGasxjUqP5OT87SYTxCVA3BwTUzuELx9kA==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.0.tgz", + "integrity": "sha512-aWwkhnS0qAXqNOgKOK0dJ2nvzEbhEvpy8OlJ9kZ0FeZnA6zpjv1/Vei+puGFFX7zkPCkHHXb7IDX3A+7yPrRWg==", "dev": true, "requires": { "esrecurse": "^4.3.0", @@ -12015,20 +10278,11 @@ "dev": true }, "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", "dev": true }, - "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -12092,20 +10346,20 @@ } }, "eslint-visitor-keys": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.1.0.tgz", - "integrity": "sha512-yWJFpu4DtjsWKkt5GeNBBuZMlNcYVs6vRCLoCVEJrTjaSB6LC98gFipNK/erM2Heg/E8mIK+hXG/pJMLK+eRZA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.2.0.tgz", + "integrity": "sha512-IOzT0X126zn7ALX0dwFiUQEdsfzrm4+ISsQS8nukaJXwEyYKRSnEIIDULYg1mCtGp7UUXgfGl7BIolXREQK+XQ==", "dev": true }, "espree": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.0.0.tgz", - "integrity": "sha512-r5EQJcYZ2oaGbeR0jR0fFVijGOcwai07/690YRXLINuhmVeRY4UKSAsQPe/0BNuDgwP7Ophoc1PRsr2E3tkbdQ==", + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.0.tgz", + "integrity": "sha512-d/5nCsb0JcqsSEeQzFZ8DH1RmxPcglRWh24EFTlUEmCKoehXGdpsx0RkHDubqUI8LSAIKMQp4r9SzQ3n+sm4HQ==", "dev": true, "requires": { - "acorn": "^8.5.0", + "acorn": "^8.7.0", "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^3.0.0" + "eslint-visitor-keys": "^3.1.0" } }, "esquery": { @@ -12185,92 +10439,6 @@ } } }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "optional": true, - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "optional": true, - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "optional": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "optional": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "optional": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "optional": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true, - "optional": true - } - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true, - "optional": true - } - } - }, "expect": { "version": "27.2.5", "resolved": "https://registry.npmjs.org/expect/-/expect-27.2.5.tgz", @@ -12291,45 +10459,6 @@ } } }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "optional": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "optional": true, - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "optional": true, - "requires": { - "is-descriptor": "^1.0.0" - } - } - } - }, "extract-zip": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", @@ -12483,19 +10612,6 @@ } } }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "optional": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - } - }, "find-babel-config": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/find-babel-config/-/find-babel-config-1.2.0.tgz", @@ -12571,27 +10687,16 @@ "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==", "dev": true }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true, - "optional": true - }, "formidable": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.2.tgz", - "integrity": "sha512-V8gLm+41I/8kguQ4/o1D3RIHRmhYFG4pnNyonvua+40rqcEmT4+V71yaZ3B457xbbgCsCfjSPi65u/W6vK1U5Q==", - "dev": true - }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-2.0.1.tgz", + "integrity": "sha512-rjTMNbp2BpfQShhFbR3Ruk3qk2y9jKpvMW78nJgx8QKtxjDVrwbZG+wvDOmVbifHyOUOQJXxqEy6r0faRrPzTQ==", "dev": true, - "optional": true, "requires": { - "map-cache": "^0.2.2" + "dezalgo": "1.0.3", + "hexoid": "1.0.0", + "once": "1.4.0", + "qs": "6.9.3" } }, "fs-extra": { @@ -12663,13 +10768,6 @@ "pump": "^3.0.0" } }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", - "dev": true, - "optional": true - }, "glob": { "version": "7.1.7", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", @@ -12807,9 +10905,9 @@ } }, "graceful-fs": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", - "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==" + "version": "4.2.9", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", + "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==" }, "has": { "version": "1.0.3", @@ -12829,47 +10927,18 @@ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==" }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "dev": true, - "optional": true, - "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - } - }, - "has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "dev": true, - "optional": true, - "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "dependencies": { - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "optional": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, "he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "dev": true }, + "hexoid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hexoid/-/hexoid-1.0.0.tgz", + "integrity": "sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==", + "dev": true + }, "hosted-git-info": { "version": "2.8.9", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", @@ -12877,33 +10946,41 @@ "dev": true }, "html-minifier-terser": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz", - "integrity": "sha512-ZPr5MNObqnV/T9akshPKbVgyOqLmy+Bxo7juKCfTfnjNniTAMdy4hz21YQqoofMBJD2kdREaqPPdThoR78Tgxg==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", "dev": true, "requires": { - "camel-case": "^4.1.1", - "clean-css": "^4.2.3", - "commander": "^4.1.1", + "camel-case": "^4.1.2", + "clean-css": "^5.2.2", + "commander": "^8.3.0", "he": "^1.2.0", - "param-case": "^3.0.3", + "param-case": "^3.0.4", "relateurl": "^0.2.7", - "terser": "^4.6.3" + "terser": "^5.10.0" + }, + "dependencies": { + "commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "dev": true + } } }, "html-reporter": { "version": "file:packages/html-reporter" }, "html-webpack-plugin": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.3.2.tgz", - "integrity": "sha512-HvB33boVNCz2lTyBsSiMffsJ+m0YLIQ+pskblXgN9fnjS1BgEcuAfdInfXfGrkdXV406k9FiDi86eVCDBgJOyQ==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.5.0.tgz", + "integrity": "sha512-sy88PC2cRTVxvETRgUHFrL4No3UxvcH8G1NepGhqaTT+GXN2kTamqasot0inS5hXeg1cMbFDt27zzo9p35lZVw==", "dev": true, "requires": { - "@types/html-minifier-terser": "^5.0.0", - "html-minifier-terser": "^5.0.1", + "@types/html-minifier-terser": "^6.0.0", + "html-minifier-terser": "^6.0.2", "lodash": "^4.17.21", - "pretty-error": "^3.0.4", + "pretty-error": "^4.0.0", "tapable": "^2.0.0" } }, @@ -12996,39 +11073,20 @@ "ini": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true, - "optional": true - }, - "interpret": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", - "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", - "dev": true - }, - "ip": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", - "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "optional": true, - "requires": { - "kind-of": "^6.0.0" - }, - "dependencies": { - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "optional": true - } - } + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true, + "optional": true + }, + "interpret": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", + "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", + "dev": true + }, + "ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" }, "is-arrayish": { "version": "0.2.1", @@ -13036,23 +11094,6 @@ "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", "dev": true }, - "is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "dev": true, - "optional": true, - "requires": { - "binary-extensions": "^1.0.0" - } - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true, - "optional": true - }, "is-core-module": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.6.0.tgz", @@ -13061,58 +11102,11 @@ "has": "^1.0.3" } }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "optional": true, - "requires": { - "kind-of": "^6.0.0" - }, - "dependencies": { - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "optional": true - } - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "optional": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - }, - "dependencies": { - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "optional": true - } - } - }, "is-docker": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==" }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true, - "optional": true - }, "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -13134,16 +11128,6 @@ "is-extglob": "^2.1.1" } }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "optional": true, - "requires": { - "kind-of": "^3.0.2" - } - }, "is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", @@ -13159,13 +11143,6 @@ "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true, - "optional": true - }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", @@ -13525,16 +11502,6 @@ "json-buffer": "3.0.0" } }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "optional": true, - "requires": { - "is-buffer": "^1.1.5" - } - }, "leven": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz", @@ -13657,23 +11624,6 @@ } } }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true, - "optional": true - }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "dev": true, - "optional": true, - "requires": { - "object-visit": "^1.0.0" - } - }, "matcher": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", @@ -13717,58 +11667,6 @@ "integrity": "sha512-+TZ5dUDPKPJaU/rscTzxyN8ZkX7eAVLAiQU/e+YINleXPv03SCmJShaMT1If1liTH8OcmWXZs0CmzCBRBLcMpA==", "dev": true }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "optional": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - }, - "dependencies": { - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "optional": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - } - }, - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "optional": true, - "requires": { - "is-plain-object": "^2.0.4" - } - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "optional": true - } - } - }, "mime": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", @@ -13814,29 +11712,6 @@ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" }, - "mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "dev": true, - "optional": true, - "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "optional": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, "mkdirp": { "version": "0.5.5", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", @@ -13863,56 +11738,6 @@ "integrity": "sha512-dW2pUSGZ8ZnCFIlBIA31SV8huOGCHb6OwzVCc7A69rb/a+SgPBwfmLvK5TKQ3INPbRkcI8a/Owo0XbiTNH19wg==", "dev": true }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "dev": true, - "optional": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "optional": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - } - }, - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "optional": true, - "requires": { - "is-plain-object": "^2.0.4" - } - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "optional": true - } - } - }, "natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -13952,9 +11777,9 @@ "integrity": "sha512-uW7fodD6pyW2FZNZnp/Z3hvWKeEW1Y8R1+1CnErE8cXFXzl5blBOoVB41CvMer6P6Q0S5FXDwcHgFd1Wj0U9zg==" }, "node-stream-zip": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/node-stream-zip/-/node-stream-zip-1.13.4.tgz", - "integrity": "sha512-M2nPvnSWFFH+fgLIRZDqmhshmuzXcr+ce9BsHQX/30pXR+cEz/USMYmx9ZAFYy837W2QoDoNzhFtbZhfzaMk9A==", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/node-stream-zip/-/node-stream-zip-1.15.0.tgz", + "integrity": "sha512-LN4fydt9TqhZhThkZIVQnF9cwjU3qmUH9h78Mx/K7d3VvfRqqwthLwJEUOEL0QPZ0XQmNN7be5Ggit5+4dq3Bw==", "dev": true }, "normalize-package-data": { @@ -14033,86 +11858,11 @@ "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", "dev": true }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "dev": true, - "optional": true, - "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "optional": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "optional": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "optional": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "optional": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true, - "optional": true - } - } - } - } - }, "object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "dev": true, - "optional": true, - "requires": { - "isobject": "^3.0.0" - } - }, "object.assign": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", @@ -14124,16 +11874,6 @@ "object-keys": "^1.1.1" } }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "dev": true, - "optional": true, - "requires": { - "isobject": "^3.0.1" - } - }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -14266,13 +12006,6 @@ "tslib": "^2.0.3" } }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "dev": true, - "optional": true - }, "path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -14460,13 +12193,6 @@ "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-5.0.0.tgz", "integrity": "sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==" }, - "posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", - "dev": true, - "optional": true - }, "postcss": { "version": "8.3.9", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.3.9.tgz", @@ -14543,13 +12269,13 @@ "dev": true }, "pretty-error": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-3.0.4.tgz", - "integrity": "sha512-ytLFLfv1So4AO1UkoBF6GXQgJRaKbiSiGFICaOPNwQ3CMvBvXpLRubeQWyPGnsbV/t9ml9qto6IeCsho0aEvwQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", + "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", "dev": true, "requires": { "lodash": "^4.17.20", - "renderkid": "^2.0.6" + "renderkid": "^3.0.0" } }, "pretty-format": { @@ -14629,6 +12355,12 @@ "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", "dev": true }, + "qs": { + "version": "6.9.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.3.tgz", + "integrity": "sha512-EbZYNarm6138UKKq46tdx08Yo/q9ZhFoAXAI1meAFd2GtbRDhbZY2WQSICskT0c5q99aFzLG1D4nvTk9tqfXIw==", + "dev": true + }, "queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -14698,15 +12430,12 @@ } }, "readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dev": true, - "optional": true, "requires": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" + "picomatch": "^2.2.1" } }, "rechoir": { @@ -14718,40 +12447,6 @@ "resolve": "^1.9.0" } }, - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dev": true, - "optional": true, - "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "optional": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - } - }, - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "optional": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, "regexpp": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", @@ -14759,61 +12454,23 @@ "dev": true }, "relateurl": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", - "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", - "dev": true - }, - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", - "dev": true, - "optional": true - }, - "renderkid": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.7.tgz", - "integrity": "sha512-oCcFyxaMrKsKcTY59qnCAtmDVSLfPbrv6A3tVbPdFMMrv5jaK10V6m40cKsoPNhAqN6rmHW9sswW4o3ruSrwUQ==", - "dev": true, - "requires": { - "css-select": "^4.1.3", - "dom-converter": "^0.2.0", - "htmlparser2": "^6.1.0", - "lodash": "^4.17.21", - "strip-ansi": "^3.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - } - } - }, - "repeat-element": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", - "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", - "dev": true, - "optional": true + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", + "dev": true }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "renderkid": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", + "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", "dev": true, - "optional": true + "requires": { + "css-select": "^4.1.3", + "dom-converter": "^0.2.0", + "htmlparser2": "^6.1.0", + "lodash": "^4.17.21", + "strip-ansi": "^6.0.1" + } }, "require-directory": { "version": "2.1.1", @@ -14858,13 +12515,6 @@ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", - "dev": true, - "optional": true - }, "responselike": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", @@ -14874,13 +12524,6 @@ "lowercase-keys": "^1.0.0" } }, - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true, - "optional": true - }, "retry": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", @@ -14955,16 +12598,6 @@ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "dev": true, - "optional": true, - "requires": { - "ret": "~0.1.10" - } - }, "sax": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", @@ -15032,19 +12665,6 @@ "randombytes": "^2.1.0" } }, - "set-value": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", - "dev": true, - "optional": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - } - }, "shallow-clone": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", @@ -15093,127 +12713,6 @@ "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==" }, - "snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "dev": true, - "optional": true, - "requires": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "optional": true, - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "optional": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "optional": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "optional": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "optional": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true, - "optional": true - } - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true, - "optional": true - } - } - }, - "snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "dev": true, - "optional": true, - "requires": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "optional": true, - "requires": { - "is-descriptor": "^1.0.0" - } - } - } - }, - "snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "dev": true, - "optional": true, - "requires": { - "kind-of": "^3.2.0" - } - }, "socks": { "version": "2.6.1", "resolved": "https://registry.npmjs.org/socks/-/socks-2.6.1.tgz", @@ -15272,20 +12771,6 @@ "integrity": "sha512-/3GptzWzu0+0MBQFrDKzw/DvvMTUORvgY6k6jd/VS6iCR4RDTKWH6v6WPwQoUO8667uQEf9Oe38DxAYWY5F/Ug==", "dev": true }, - "source-map-resolve": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", - "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", - "dev": true, - "optional": true, - "requires": { - "atob": "^2.1.2", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, "source-map-support": { "version": "0.5.20", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.20.tgz", @@ -15304,13 +12789,6 @@ } } }, - "source-map-url": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", - "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", - "dev": true, - "optional": true - }, "spawn-command": { "version": "0.0.2-1", "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2-1.tgz", @@ -15349,39 +12827,6 @@ "integrity": "sha512-oie3/+gKf7QtpitB0LYLETe+k8SifzsX4KixvpOsbI6S0kRiRQ5MKOio8eMSAKQ17N06+wdEOXRiId+zOxo0hA==", "dev": true }, - "split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "dev": true, - "optional": true, - "requires": { - "extend-shallow": "^3.0.0" - }, - "dependencies": { - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "optional": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - } - }, - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "optional": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, "stack-utils": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.5.tgz", @@ -15397,70 +12842,6 @@ } } }, - "static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "dev": true, - "optional": true, - "requires": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "optional": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "optional": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "optional": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "optional": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true, - "optional": true - } - } - } - } - }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -15509,9 +12890,9 @@ "dev": true }, "style-loader": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.0.tgz", - "integrity": "sha512-szANub7ksJtQioJYtpbWwh1hUl99uK15n5HDlikeCRil/zYMZgSxucHddyF/4A3qJMUiAjPhFowrrQuNMA7jwQ==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.1.tgz", + "integrity": "sha512-GPcQ+LDJbrcxHORTRes6Jy2sfvK2kS6hpSfI/fXhPt+spVzxF6LJ1dHLN9zIGmVaaP044YKaIatFaufENRiDoQ==", "dev": true, "requires": {} }, @@ -15539,14 +12920,14 @@ "dev": true }, "terser": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", - "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.10.0.tgz", + "integrity": "sha512-AMmF99DMfEDiRJfxfY5jj5wNH/bYO09cniSqhfoyxc8sFoYIgkJy86G04UoZU5VjlpnplVu0K6Tx6E9b5+DlHA==", "dev": true, "requires": { "commander": "^2.20.0", - "source-map": "~0.6.1", - "source-map-support": "~0.5.12" + "source-map": "~0.7.2", + "source-map-support": "~0.5.20" }, "dependencies": { "commander": { @@ -15556,9 +12937,9 @@ "dev": true }, "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", "dev": true } } @@ -15577,12 +12958,6 @@ "terser": "^5.7.2" }, "dependencies": { - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, "schema-utils": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", @@ -15599,25 +12974,6 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true - }, - "terser": { - "version": "5.9.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.9.0.tgz", - "integrity": "sha512-h5hxa23sCdpzcye/7b8YqbE5OwKca/ni0RQz1uRX3tGh8haaGHqcuSqbGRybuAKNdntZ0mDgFNXPJ48xQ2RXKQ==", - "dev": true, - "requires": { - "commander": "^2.20.0", - "source-map": "~0.7.2", - "source-map-support": "~0.5.20" - }, - "dependencies": { - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true - } - } } } }, @@ -15632,69 +12988,12 @@ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=" }, - "to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "dev": true, - "optional": true, - "requires": { - "kind-of": "^3.0.2" - } - }, "to-readable-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", "dev": true }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dev": true, - "optional": true, - "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "optional": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - } - }, - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "optional": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "optional": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - }, "tree-kill": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", @@ -15753,81 +13052,17 @@ "dev": true }, "typescript": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.4.3.tgz", - "integrity": "sha512-4xfscpisVgqqDfPaJo5vkd+Qd/ItkoagnHpufr+i2QCHBsNYp+G7UAoyFl8aPtx879u38wPV65rZ8qbGZijalA==", + "version": "4.5.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.5.tgz", + "integrity": "sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA==", "dev": true }, - "union-value": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", - "dev": true, - "optional": true, - "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" - } - }, "universalify": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", "dev": true }, - "unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "dev": true, - "optional": true, - "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "dependencies": { - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "dev": true, - "optional": true, - "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "optional": true, - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", - "dev": true, - "optional": true - } - } - }, - "upath": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", - "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", - "dev": true, - "optional": true - }, "uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -15837,13 +13072,6 @@ "punycode": "^2.1.0" } }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "dev": true, - "optional": true - }, "url-parse-lax": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", @@ -15853,13 +13081,6 @@ "prepend-http": "^2.0.0" } }, - "use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "dev": true, - "optional": true - }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -15889,9 +13110,9 @@ } }, "watchpack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.2.0.tgz", - "integrity": "sha512-up4YAn/XHgZHIxFBVCdlMiWDj6WaLKpwVeGQk2I5thdYxF/KmF0aaz6TfJZ/hfl1h/XlcDr7k1KH7ThDagpFaA==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.3.1.tgz", + "integrity": "sha512-x0t0JuydIo8qCNctdDrn1OzH/qDzk2+rdCOC3YzumZ42fiMqmQ7T3xQurykYMhYfHaPHTp4ZxAx2NfUo1K6QaA==", "dev": true, "requires": { "glob-to-regexp": "^0.4.1", @@ -15899,9 +13120,9 @@ } }, "webpack": { - "version": "5.58.2", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.58.2.tgz", - "integrity": "sha512-3S6e9Vo1W2ijk4F4PPWRIu6D/uGgqaPmqw+av3W3jLDujuNkdxX5h5c+RQ6GkjVR+WwIPOfgY8av+j5j4tMqJw==", + "version": "5.68.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.68.0.tgz", + "integrity": "sha512-zUcqaUO0772UuuW2bzaES2Zjlm/y3kRBQDVFVCge+s2Y8mwuUTdperGaAv65/NtRL/1zanpSJOq/MD8u61vo6g==", "dev": true, "requires": { "@types/eslint-scope": "^3.7.0", @@ -15918,7 +13139,7 @@ "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.4", + "graceful-fs": "^4.2.9", "json-parse-better-errors": "^1.0.2", "loader-runner": "^4.2.0", "mime-types": "^2.1.27", @@ -15926,8 +13147,8 @@ "schema-utils": "^3.1.0", "tapable": "^2.1.1", "terser-webpack-plugin": "^5.1.3", - "watchpack": "^2.2.0", - "webpack-sources": "^3.2.0" + "watchpack": "^2.3.1", + "webpack-sources": "^3.2.3" }, "dependencies": { "acorn-import-assertions": { @@ -15951,15 +13172,15 @@ } }, "webpack-cli": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.9.0.tgz", - "integrity": "sha512-n/jZZBMzVEl4PYIBs+auy2WI0WTQ74EnJDiyD98O2JZY6IVIHJNitkYp/uTXOviIOMfgzrNvC9foKv/8o8KSZw==", + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.9.2.tgz", + "integrity": "sha512-m3/AACnBBzK/kMTcxWHcZFPrw/eQuY4Df1TxvIWfWM2x7mRqBQCqKEd96oCUa9jkapLBaFfRce33eGDb4Pr7YQ==", "dev": true, "requires": { "@discoveryjs/json-ext": "^0.5.0", - "@webpack-cli/configtest": "^1.1.0", - "@webpack-cli/info": "^1.4.0", - "@webpack-cli/serve": "^1.6.0", + "@webpack-cli/configtest": "^1.1.1", + "@webpack-cli/info": "^1.4.1", + "@webpack-cli/serve": "^1.6.1", "colorette": "^2.0.14", "commander": "^7.0.0", "execa": "^5.0.0", @@ -15967,7 +13188,6 @@ "import-local": "^3.0.2", "interpret": "^2.2.0", "rechoir": "^0.7.0", - "v8-compile-cache": "^2.2.0", "webpack-merge": "^5.7.3" }, "dependencies": { @@ -15996,9 +13216,9 @@ } }, "webpack-sources": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.1.tgz", - "integrity": "sha512-t6BMVLQ0AkjBOoRTZgqrWm7xbXMBzD+XDq2EZ96+vMfn3qKgsvdXZhbPZ4ElUOpdv4u+iiGe+w3+J75iy/bYGA==", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", "dev": true }, "which": { diff --git a/package.json b/package.json index 5794dd468e813..80dc5f9301368 100644 --- a/package.json +++ b/package.json @@ -42,61 +42,62 @@ "packages/*" ], "devDependencies": { - "@babel/cli": "^7.14.8", - "@babel/plugin-transform-typescript": "^7.14.6", - "@babel/preset-react": "^7.14.5", + "@babel/cli": "^7.16.8", + "@babel/plugin-transform-typescript": "^7.16.8", + "@babel/preset-react": "^7.16.7", "@types/babel__code-frame": "^7.0.3", - "@types/babel__core": "^7.1.15", - "@types/debug": "^4.1.5", - "@types/extract-zip": "^1.6.2", + "@types/babel__core": "^7.1.18", + "@types/debug": "^4.1.7", + "@types/formidable": "^2.0.4", "@types/mime": "^2.0.3", - "@types/minimatch": "^3.0.3", + "@types/minimatch": "^3.0.5", "@types/ms": "^0.7.31", - "@types/node": "^14.17.15", - "@types/pixelmatch": "^5.2.1", - "@types/pngjs": "^3.4.2", - "@types/progress": "^2.0.3", - "@types/proper-lockfile": "^4.1.1", + "@types/node": "=14.17.15", + "@types/pixelmatch": "^5.2.4", + "@types/pngjs": "^6.0.1", + "@types/progress": "^2.0.5", + "@types/proper-lockfile": "^4.1.2", "@types/proxy-from-env": "^1.0.1", - "@types/react": "^17.0.0", - "@types/react-dom": "^17.0.0", - "@types/resize-observer-browser": "^0.1.4", - "@types/rimraf": "^3.0.0", - "@types/source-map-support": "^0.4.2", + "@types/react": "^17.0.38", + "@types/react-dom": "^17.0.11", + "@types/resize-observer-browser": "^0.1.6", + "@types/rimraf": "^3.0.2", + "@types/source-map-support": "^0.5.4", "@types/webpack": "^5.28.0", "@types/ws": "7.2.6", - "@types/xml2js": "^0.4.5", + "@types/xml2js": "^0.4.9", "@types/yazl": "^2.4.2", - "@typescript-eslint/eslint-plugin": "^5.4.0", - "@typescript-eslint/parser": "^5.4.0", - "@zip.js/zip.js": "^2.3.17", - "ansi-to-html": "^0.7.1", - "babel-loader": "^8.2.2", - "chokidar": "^3.5.0", - "commonmark": "^0.29.1", + "@typescript-eslint/eslint-plugin": "^5.10.2", + "@typescript-eslint/parser": "^5.10.2", + "@zip.js/zip.js": "^2.4.2", + "ansi-to-html": "^0.7.2", + "babel-loader": "^8.2.3", + "chokidar": "^3.5.3", + "commonmark": "^0.30.0", "concurrently": "^6.2.1", - "copy-webpack-plugin": "^9.0.1", - "cross-env": "^7.0.2", - "css-loader": "^6.4.0", + "copy-webpack-plugin": "^9.1.0", + "cross-env": "^7.0.3", + "css-loader": "^6.5.1", "electron": "^12.2.1", "enquirer": "^2.3.6", - "eslint": "^8.2.0", + "eslint": "^8.8.0", "eslint-plugin-notice": "^0.9.10", "eslint-plugin-react-hooks": "^4.3.0", "file-loader": "^6.2.0", - "formidable": "^1.2.2", - "html-webpack-plugin": "^5.3.2", + "formidable": "^2.0.1", + "html-webpack-plugin": "^5.5.0", + "mime": "^2.4.6", "ncp": "^2.0.0", - "node-stream-zip": "^1.11.3", + "node-stream-zip": "^1.15.0", "proxy": "^1.0.2", - "react": "^17.0.1", - "react-dom": "^17.0.1", + "react": "^17.0.2", + "react-dom": "^17.0.2", "socksv5": "0.0.6", - "style-loader": "^3.3.0", - "typescript": "^4.4.3", - "webpack": "^5.58.2", - "webpack-cli": "^4.9.0", + "style-loader": "^3.3.1", + "typescript": "^4.5.5", + "webpack": "^5.68.0", + "webpack-cli": "^4.9.2", "xml2js": "^0.4.23", - "yaml": "^1.10.0" + "yaml": "^1.10.2" } } diff --git a/tests/browsercontext-fetch.spec.ts b/tests/browsercontext-fetch.spec.ts index b621172f787cc..dea09fe655b6e 100644 --- a/tests/browsercontext-fetch.spec.ts +++ b/tests/browsercontext-fetch.spec.ts @@ -776,13 +776,13 @@ it('should encode to application/json by default', async function({ context, pag expect(json).toEqual(data); }); -it('should support multipart/form-data', async function({ context, page, server }) { - const formReceived = new Promise(resolve => { +it('should support multipart/form-data', async function({ context, server }) { + const formReceived = new Promise<{error: any, fields: formidable.Fields, files: Record, serverRequest: http.IncomingMessage}>(resolve => { server.setRoute('/empty.html', async (serverRequest, res) => { const form = new formidable.IncomingForm(); form.parse(serverRequest, (error, fields, files) => { server.serveFile(serverRequest, res); - resolve({ error, fields, files, serverRequest }); + resolve({ error, fields, files: files as Record, serverRequest }); }); }); }); @@ -807,19 +807,19 @@ it('should support multipart/form-data', async function({ context, page, server expect(serverRequest.headers['content-type']).toContain('multipart/form-data'); expect(fields['firstName']).toBe('John'); expect(fields['lastName']).toBe('Doe'); - expect(files['file'].name).toBe(file.name); - expect(files['file'].type).toBe(file.mimeType); - expect(fs.readFileSync(files['file'].path).toString()).toBe(file.buffer.toString('utf8')); + expect(files['file'].originalFilename).toBe(file.name); + expect(files['file'].mimetype).toBe(file.mimeType); + expect(fs.readFileSync(files['file'].filepath).toString()).toBe(file.buffer.toString('utf8')); expect(response.status()).toBe(200); }); it('should support multipart/form-data with ReadSream values', async function({ context, page, asset, server }) { - const formReceived = new Promise(resolve => { + const formReceived = new Promise<{error: any, fields: formidable.Fields, files: Record, serverRequest: http.IncomingMessage}>(resolve => { server.setRoute('/empty.html', async (serverRequest, res) => { const form = new formidable.IncomingForm(); form.parse(serverRequest, (error, fields, files) => { server.serveFile(serverRequest, res); - resolve({ error, fields, files, serverRequest }); + resolve({ error, fields, files: files as Record, serverRequest }); }); }); }); @@ -840,9 +840,9 @@ it('should support multipart/form-data with ReadSream values', async function({ expect(serverRequest.headers['content-length']).toContain('5498'); expect(fields['firstName']).toBe('John'); expect(fields['lastName']).toBe('Doe'); - expect(files['readStream'].name).toBe('simplezip.json'); - expect(files['readStream'].type).toBe('application/json'); - expect(fs.readFileSync(files['readStream'].path).toString()).toBe(fs.readFileSync(asset('simplezip.json')).toString()); + expect(files['readStream'].originalFilename).toBe('simplezip.json'); + expect(files['readStream'].mimetype).toBe('application/json'); + expect(fs.readFileSync(files['readStream'].filepath).toString()).toBe(fs.readFileSync(asset('simplezip.json')).toString()); expect(response.status()).toBe(200); }); diff --git a/tests/page/page-set-input-files.spec.ts b/tests/page/page-set-input-files.spec.ts index fd910663a88ec..b3137b2e85705 100644 --- a/tests/page/page-set-input-files.spec.ts +++ b/tests/page/page-set-input-files.spec.ts @@ -246,11 +246,11 @@ it('should accept single file', async ({ page, asset }) => { it('should detect mime type', async ({ page, server, asset, isAndroid }) => { it.fixme(isAndroid); - let files; + let files: Record; server.setRoute('/upload', async (req, res) => { const form = new formidable.IncomingForm(); form.parse(req, function(err, fields, f) { - files = f; + files = f as Record; res.end(); }); }); @@ -268,13 +268,13 @@ it('should detect mime type', async ({ page, server, asset, isAndroid }) => { server.waitForRequest('/upload'), ]); const { file1, file2 } = files; - expect(file1.name).toBe('file-to-upload.txt'); - expect(file1.type).toBe('text/plain'); - expect(fs.readFileSync(file1.path).toString()).toBe( + expect(file1.originalFilename).toBe('file-to-upload.txt'); + expect(file1.mimetype).toBe('text/plain'); + expect(fs.readFileSync(file1.filepath).toString()).toBe( fs.readFileSync(asset('file-to-upload.txt')).toString()); - expect(file2.name).toBe('pptr.png'); - expect(file2.type).toBe('image/png'); - expect(fs.readFileSync(file2.path).toString()).toBe( + expect(file2.originalFilename).toBe('pptr.png'); + expect(file2.mimetype).toBe('image/png'); + expect(fs.readFileSync(file2.filepath).toString()).toBe( fs.readFileSync(asset('pptr.png')).toString()); }); @@ -282,11 +282,11 @@ it('should detect mime type', async ({ page, server, asset, isAndroid }) => { it('should not trim big uploaded files', async ({ page, server, asset, isAndroid }) => { it.fixme(isAndroid); - let files; + let files: Record; server.setRoute('/upload', async (req, res) => { const form = new formidable.IncomingForm(); form.parse(req, function(err, fields, f) { - files = f; + files = f as Record; res.end(); }); }); From c2f6462a6b90ec1946fa5481e05a864ac6aff6b0 Mon Sep 17 00:00:00 2001 From: Yury Semikhatsky Date: Tue, 1 Feb 2022 09:26:38 -0800 Subject: [PATCH 168/233] fix(trace-viewer): info message for actions without snapshots (#11765) --- .../playwright-core/src/web/traceViewer/ui/snapshotTab.css | 5 +++++ .../playwright-core/src/web/traceViewer/ui/snapshotTab.tsx | 5 +++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/packages/playwright-core/src/web/traceViewer/ui/snapshotTab.css b/packages/playwright-core/src/web/traceViewer/ui/snapshotTab.css index 6a8b2107f07bf..9d5784e683b26 100644 --- a/packages/playwright-core/src/web/traceViewer/ui/snapshotTab.css +++ b/packages/playwright-core/src/web/traceViewer/ui/snapshotTab.css @@ -88,3 +88,8 @@ iframe#snapshot { height: 100%; border: none; } + +.no-snapshot { + text-align: center; + padding: 50px; +} diff --git a/packages/playwright-core/src/web/traceViewer/ui/snapshotTab.tsx b/packages/playwright-core/src/web/traceViewer/ui/snapshotTab.tsx index e5135c8e91ab6..179fadedcad00 100644 --- a/packages/playwright-core/src/web/traceViewer/ui/snapshotTab.tsx +++ b/packages/playwright-core/src/web/traceViewer/ui/snapshotTab.tsx @@ -101,13 +101,14 @@ export const SnapshotTab: React.FunctionComponent<{
{snapshotInfo.url}
-
-
+
:
Action does not have snapshots
+ } ; }; From 3a5e8184b58d68b73f521cc28714e42b18a5159e Mon Sep 17 00:00:00 2001 From: Pavel Feldman Date: Tue, 1 Feb 2022 11:01:52 -0800 Subject: [PATCH 169/233] fix(html-reporter): open tests from required file (#11784) --- packages/playwright-test/src/reporters/raw.ts | 13 +++++++++---- tests/playwright-test/reporter-html.spec.ts | 18 ++++++++++++++++++ 2 files changed, 27 insertions(+), 4 deletions(-) diff --git a/packages/playwright-test/src/reporters/raw.ts b/packages/playwright-test/src/reporters/raw.ts index ab8ca6a633e39..dad07522c3444 100644 --- a/packages/playwright-test/src/reporters/raw.ts +++ b/packages/playwright-test/src/reporters/raw.ts @@ -151,7 +151,13 @@ class RawReporter { testMatch: serializePatterns(project.testMatch), timeout: project.timeout, }, - suites: suite.suites.map(s => this._serializeSuite(s)) + suites: suite.suites.map(fileSuite => { + // fileId is based on the location of the enclosing file suite. + // Don't use the file in test/suite location, it can be different + // due to the source map / require. + const fileId = calculateSha1(fileSuite.location!.file.split(path.sep).join('/')); + return this._serializeSuite(fileSuite, fileId); + }) }; for (const file of this.stepsInFile.keys()) { let source: string; @@ -181,14 +187,13 @@ class RawReporter { return report; } - private _serializeSuite(suite: Suite): JsonSuite { + private _serializeSuite(suite: Suite, fileId: string): JsonSuite { const location = this._relativeLocation(suite.location); - const fileId = calculateSha1(location!.file.split(path.sep).join('/')); return { title: suite.title, fileId, location, - suites: suite.suites.map(s => this._serializeSuite(s)), + suites: suite.suites.map(s => this._serializeSuite(s, fileId)), tests: suite.tests.map(t => this._serializeTest(t, fileId)), hooks: [], }; diff --git a/tests/playwright-test/reporter-html.spec.ts b/tests/playwright-test/reporter-html.spec.ts index b88c489097a41..19e47b1693361 100644 --- a/tests/playwright-test/reporter-html.spec.ts +++ b/tests/playwright-test/reporter-html.spec.ts @@ -461,3 +461,21 @@ test('should group similar / loop steps', async ({ runInlineTest, showReport, pa /expect\.toEqual.*20/, ]); }); + +test('open tests from required file', async ({ runInlineTest, showReport, page }) => { + test.info().annotations.push({ type: 'issue', description: 'https://github.com/microsoft/playwright/issues/11742' }); + const result = await runInlineTest({ + 'inner.js': ` + const { test, expect } = pwt; + test('sample', async ({}) => { expect(2).toBe(2); }); + `, + 'a.spec.js': `require('./inner')` + }, { 'reporter': 'dot,html' }); + expect(result.exitCode).toBe(0); + await showReport(); + + await page.locator('text=sample').first().click(); + await expect(page.locator('.tree-item-title')).toContainText([ + /expect\.toBe/, + ]); +}); From b6b60decdf96f7a4bd7ae46b078f4dcc8c1e2029 Mon Sep 17 00:00:00 2001 From: Caio Agiani Date: Tue, 1 Feb 2022 16:09:41 -0300 Subject: [PATCH 170/233] fix: typos (#11789) --- browser_patches/upload.sh | 2 +- docs/src/api/class-apiresponseassertions.md | 2 +- packages/playwright-core/src/server/webkit/protocol.d.ts | 2 +- packages/playwright-test/src/util.ts | 2 +- tests/config/commonFixtures.ts | 2 +- tests/inspector/inspectorTest.ts | 2 +- tests/playwright-test/test-output-dir.spec.ts | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/browser_patches/upload.sh b/browser_patches/upload.sh index c1df5c0139fa0..cbaa20bc95e4f 100755 --- a/browser_patches/upload.sh +++ b/browser_patches/upload.sh @@ -11,7 +11,7 @@ if [[ ($1 == '--help') || ($1 == '-h') ]]; then echo "Upload ZIP-PATH to BLOB-PATH in 'builds' container." echo echo "--check pass |--check| as a second parameter instead of a zip-path to check for" - echo " existance of BLOB-PATH" + echo " existence of BLOB-PATH" echo echo "NOTE: \$AZ_ACCOUNT_KEY (azure account name) and \$AZ_ACCOUNT_NAME (azure account name)" echo "env variables are required to upload builds to CDN." diff --git a/docs/src/api/class-apiresponseassertions.md b/docs/src/api/class-apiresponseassertions.md index 12bce591546cd..f9a4a1b08a180 100644 --- a/docs/src/api/class-apiresponseassertions.md +++ b/docs/src/api/class-apiresponseassertions.md @@ -51,7 +51,7 @@ def test_navigates_to_login_page(page: Page) -> None: * langs: java, js - returns: <[APIResponseAssertions]> -Makes the assertion check for the opposite condition. For example, this code tests that the response status is not successfull: +Makes the assertion check for the opposite condition. For example, this code tests that the response status is not successful: ```js await expect(response).not.toBeOK(); diff --git a/packages/playwright-core/src/server/webkit/protocol.d.ts b/packages/playwright-core/src/server/webkit/protocol.d.ts index caf0edbc7c80b..bbdfde73ab135 100644 --- a/packages/playwright-core/src/server/webkit/protocol.d.ts +++ b/packages/playwright-core/src/server/webkit/protocol.d.ts @@ -1172,7 +1172,7 @@ export module Protocol { export type forcePseudoStateReturnValue = { } /** - * Change how layout context type changes are handled for nodes. When the new mode would observe nodes the frontend has not yet recieved, those nodes will be sent to the frontend immediately. + * Change how layout context type changes are handled for nodes. When the new mode would observe nodes the frontend has not yet received, those nodes will be sent to the frontend immediately. */ export type setLayoutContextTypeChangedModeParameters = { /** diff --git a/packages/playwright-test/src/util.ts b/packages/playwright-test/src/util.ts index 2549b3d454060..42731e9543555 100644 --- a/packages/playwright-test/src/util.ts +++ b/packages/playwright-test/src/util.ts @@ -65,7 +65,7 @@ export function createFileMatcher(patterns: string | RegExp | (string | RegExp)[ if (re.test(filePath)) return true; } - // Windows might still recieve unix style paths from Cygwin or Git Bash. + // Windows might still receive unix style paths from Cygwin or Git Bash. // Check against the file url as well. if (path.sep === '\\') { const fileURL = url.pathToFileURL(filePath).href; diff --git a/tests/config/commonFixtures.ts b/tests/config/commonFixtures.ts index e2324336a3131..032ba0f498627 100644 --- a/tests/config/commonFixtures.ts +++ b/tests/config/commonFixtures.ts @@ -100,7 +100,7 @@ export class TestChildProcess { if (r.exitCode) throw new Error(`Process failed with exit code ${r.exitCode}`); if (r.signal) - throw new Error(`Process recieved signal: ${r.signal}`); + throw new Error(`Process received signal: ${r.signal}`); } async waitForOutput(substring: string) { diff --git a/tests/inspector/inspectorTest.ts b/tests/inspector/inspectorTest.ts index 1bb6e48f4571d..a78779823d7f1 100644 --- a/tests/inspector/inspectorTest.ts +++ b/tests/inspector/inspectorTest.ts @@ -216,7 +216,7 @@ class CLIMock { this.waitForCallback = f; if (timeout) { setTimeout(() => { - r(new Error('Timed out waiting for text:\n' + text + '\n\nRecieved:\n' + this.text())); + r(new Error('Timed out waiting for text:\n' + text + '\n\nReceived:\n' + this.text())); }, timeout); } }); diff --git a/tests/playwright-test/test-output-dir.spec.ts b/tests/playwright-test/test-output-dir.spec.ts index 3b533b007bca6..c6a3b0892fc22 100644 --- a/tests/playwright-test/test-output-dir.spec.ts +++ b/tests/playwright-test/test-output-dir.spec.ts @@ -63,7 +63,7 @@ test('should work and remove non-failures', async ({ runInlineTest }, testInfo) expect(fs.existsSync(testInfo.outputPath('test-results', 'my-test-test-1-chromium'))).toBe(true); expect(fs.existsSync(testInfo.outputPath('test-results', 'my-test-test-1-chromium-retry1'))).toBe(true); - // Last retry is successfull, so output dir should be removed. + // Last retry is successful, so output dir should be removed. expect(fs.existsSync(testInfo.outputPath('test-results', 'my-test-test-1-chromium-retry2'))).toBe(false); }); From a3bc911a3dea0fffa73c63422bacb7dde6511f1b Mon Sep 17 00:00:00 2001 From: Pavel Feldman Date: Tue, 1 Feb 2022 11:51:37 -0800 Subject: [PATCH 171/233] fix(debug): don't apply infinite timeouts when using debugger (#11785) --- packages/playwright-test/src/cli.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/packages/playwright-test/src/cli.ts b/packages/playwright-test/src/cli.ts index 9ff010e07c1f2..28d48e1ff4f4b 100644 --- a/packages/playwright-test/src/cli.ts +++ b/packages/playwright-test/src/cli.ts @@ -185,11 +185,10 @@ function forceRegExp(pattern: string): RegExp { } function overridesFromOptions(options: { [key: string]: any }): Config { - const isDebuggerAttached = !!require('inspector').url(); const shardPair = options.shard ? options.shard.split('/').map((t: string) => parseInt(t, 10)) : undefined; return { forbidOnly: options.forbidOnly ? true : undefined, - globalTimeout: isDebuggerAttached ? 0 : (options.globalTimeout ? parseInt(options.globalTimeout, 10) : undefined), + globalTimeout: options.globalTimeout ? parseInt(options.globalTimeout, 10) : undefined, grep: options.grep ? forceRegExp(options.grep) : undefined, grepInvert: options.grepInvert ? forceRegExp(options.grepInvert) : undefined, maxFailures: options.x ? 1 : (options.maxFailures ? parseInt(options.maxFailures, 10) : undefined), @@ -199,7 +198,7 @@ function overridesFromOptions(options: { [key: string]: any }): Config { retries: options.retries ? parseInt(options.retries, 10) : undefined, reporter: (options.reporter && options.reporter.length) ? options.reporter.split(',').map((r: string) => [resolveReporter(r)]) : undefined, shard: shardPair ? { current: shardPair[0], total: shardPair[1] } : undefined, - timeout: isDebuggerAttached ? 0 : (options.timeout ? parseInt(options.timeout, 10) : undefined), + timeout: options.timeout ? parseInt(options.timeout, 10) : undefined, updateSnapshots: options.updateSnapshots ? 'all' as const : undefined, workers: options.workers ? parseInt(options.workers, 10) : undefined, }; From 028afb167b05975a9450c179dcb209196be6b78b Mon Sep 17 00:00:00 2001 From: Max Schmitt Date: Tue, 1 Feb 2022 21:27:34 +0100 Subject: [PATCH 172/233] chore: bump production dependencies (#11787) --- package-lock.json | 837 +++++++++--------- package.json | 4 +- packages/playwright-core/package.json | 18 +- .../src/dispatchers/browserTypeDispatcher.ts | 2 +- .../playwright-core/src/grid/gridClient.ts | 2 +- .../src/remote/playwrightClient.ts | 2 +- .../src/remote/playwrightServer.ts | 5 +- .../playwright-core/src/server/transport.ts | 2 +- packages/playwright-test/package.json | 50 +- utils/check_deps.js | 2 +- 10 files changed, 443 insertions(+), 481 deletions(-) diff --git a/package-lock.json b/package-lock.json index 06ca59a710135..85a7f20de0dbb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -34,7 +34,7 @@ "@types/rimraf": "^3.0.2", "@types/source-map-support": "^0.5.4", "@types/webpack": "^5.28.0", - "@types/ws": "7.2.6", + "@types/ws": "8.2.2", "@types/xml2js": "^0.4.9", "@types/yazl": "^2.4.2", "@typescript-eslint/eslint-plugin": "^5.10.2", @@ -56,7 +56,7 @@ "file-loader": "^6.2.0", "formidable": "^2.0.1", "html-webpack-plugin": "^5.5.0", - "mime": "^2.4.6", + "mime": "^3.0.0", "ncp": "^2.0.0", "node-stream-zip": "^1.15.0", "proxy": "^1.0.2", @@ -115,27 +115,27 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.14.7.tgz", - "integrity": "sha512-nS6dZaISCXJ3+518CWiBfEr//gHyMO02uDxBkXTKZDN5POruCnOZ1N4YBRZDCabwF8nZMWBpRxIicmXtBs+fvw==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.16.8.tgz", + "integrity": "sha512-m7OkX0IdKLKPpBlJtF561YJal5y/jyI5fNfWbPxh2D/nbzzGI4qRyrD8xO2jB24u7l+5I2a43scCG2IrfjC50Q==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.14.8.tgz", - "integrity": "sha512-/AtaeEhT6ErpDhInbXmjHcUQXH0L0TEgscfcxk1qbOvLuKCa5aZT0SOOtDKFY96/CLROwbLSKyFor6idgNaU4Q==", - "dependencies": { - "@babel/code-frame": "^7.14.5", - "@babel/generator": "^7.14.8", - "@babel/helper-compilation-targets": "^7.14.5", - "@babel/helper-module-transforms": "^7.14.8", - "@babel/helpers": "^7.14.8", - "@babel/parser": "^7.14.8", - "@babel/template": "^7.14.5", - "@babel/traverse": "^7.14.8", - "@babel/types": "^7.14.8", + "version": "7.16.12", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.16.12.tgz", + "integrity": "sha512-dK5PtG1uiN2ikk++5OzSYsitZKny4wOCD0nrO4TqnW4BVBTQ2NGS3NgilvT/TEyxTST7LNyWV/T4tXDoD3fOgg==", + "dependencies": { + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.16.8", + "@babel/helper-compilation-targets": "^7.16.7", + "@babel/helper-module-transforms": "^7.16.7", + "@babel/helpers": "^7.16.7", + "@babel/parser": "^7.16.12", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.16.10", + "@babel/types": "^7.16.8", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -176,13 +176,13 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.14.5.tgz", - "integrity": "sha512-v+QtZqXEiOnpO6EYvlImB6zCD2Lel06RzOPzmkz/D/XgQiUu3C/Jb1LOqSt/AIA34TYi/Q+KlT8vTQrgdxkbLw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.7.tgz", + "integrity": "sha512-mGojBwIWcwGD6rfqgRXVlVYmPAv7eOpIemUG3dGnDdCY4Pae70ROij3XmfrH6Fa1h1aiDylpglbZyktfzyo/hA==", "dependencies": { - "@babel/compat-data": "^7.14.5", - "@babel/helper-validator-option": "^7.14.5", - "browserslist": "^4.16.6", + "@babel/compat-data": "^7.16.4", + "@babel/helper-validator-option": "^7.16.7", + "browserslist": "^4.17.5", "semver": "^6.3.0" }, "engines": { @@ -281,18 +281,18 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.14.8.tgz", - "integrity": "sha512-RyE+NFOjXn5A9YU1dkpeBaduagTlZ0+fccnIcAGbv1KGUlReBj7utF7oEth8IdIBQPcux0DDgW5MFBH2xu9KcA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.7.tgz", + "integrity": "sha512-gaqtLDxJEFCeQbYp9aLAefjhkKdjKcdh6DB7jniIGU3Pz52WAmP268zK0VgPz9hUNkMSYeH976K2/Y6yPadpng==", "dependencies": { - "@babel/helper-module-imports": "^7.14.5", - "@babel/helper-replace-supers": "^7.14.5", - "@babel/helper-simple-access": "^7.14.8", - "@babel/helper-split-export-declaration": "^7.14.5", - "@babel/helper-validator-identifier": "^7.14.8", - "@babel/template": "^7.14.5", - "@babel/traverse": "^7.14.8", - "@babel/types": "^7.14.8" + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-module-imports": "^7.16.7", + "@babel/helper-simple-access": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/helper-validator-identifier": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.16.7", + "@babel/types": "^7.16.7" }, "engines": { "node": ">=6.9.0" @@ -333,22 +333,22 @@ } }, "node_modules/@babel/helper-simple-access": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.14.8.tgz", - "integrity": "sha512-TrFN4RHh9gnWEU+s7JloIho2T76GPwRHhdzOWLqTrMnlas8T9O7ec+oEDNsRXndOmru9ymH9DFrEOxpzPoSbdg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.7.tgz", + "integrity": "sha512-ZIzHVyoeLMvXMN/vok/a4LWRy8G2v205mNP0XOuf9XRLyX5/u9CnVulUtDgUTama3lT+bf/UqucuZjqiGuTS1g==", "dependencies": { - "@babel/types": "^7.14.8" + "@babel/types": "^7.16.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.14.5.tgz", - "integrity": "sha512-dmqZB7mrb94PZSAOYtr+ZN5qt5owZIAgqtoTuqiFbHFtxgEcmQlRJVI+bO++fciBunXtB6MK7HrzrfcAzIz2NQ==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz", + "integrity": "sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw==", "dependencies": { - "@babel/types": "^7.14.5" + "@babel/types": "^7.16.0" }, "engines": { "node": ">=6.9.0" @@ -382,13 +382,13 @@ } }, "node_modules/@babel/helpers": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.14.8.tgz", - "integrity": "sha512-ZRDmI56pnV+p1dH6d+UN6GINGz7Krps3+270qqI9UJ4wxYThfAIcI5i7j5vXC4FJ3Wap+S9qcebxeYiqn87DZw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.16.7.tgz", + "integrity": "sha512-9ZDoqtfY7AuEOt3cxchfii6C7GDyyMBffktR5B2jvWv8u2+efwvpnVKXMWzNehqy68tKgAfSwfdw/lWpthS2bw==", "dependencies": { - "@babel/template": "^7.14.5", - "@babel/traverse": "^7.14.8", - "@babel/types": "^7.14.8" + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.16.7", + "@babel/types": "^7.16.7" }, "engines": { "node": ">=6.9.0" @@ -419,12 +419,12 @@ } }, "node_modules/@babel/plugin-proposal-class-properties": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.14.5.tgz", - "integrity": "sha512-q/PLpv5Ko4dVc1LYMpCY7RVAAO4uk55qPwrIuJ5QJ8c6cVuAmhu7I/49JOppXL6gXf7ZHzpRVEUZdYoPLM04Gg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.7.tgz", + "integrity": "sha512-IobU0Xme31ewjYOShSIqd/ZGM/r/cuOz2z0MDbNrhF5FW+ZVgi0f2lyeoj9KFPDOAqsYxmLWZte1WOwlvY9aww==", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-create-class-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" }, "engines": { "node": ">=6.9.0" @@ -434,11 +434,11 @@ } }, "node_modules/@babel/plugin-proposal-dynamic-import": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.14.5.tgz", - "integrity": "sha512-ExjiNYc3HDN5PXJx+bwC50GIx/KKanX2HiggnIUAYedbARdImiCU4RhhHfdf0Kd7JNXGpsBBBCOm+bBVy3Gb0g==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.7.tgz", + "integrity": "sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-dynamic-import": "^7.8.3" }, "engines": { @@ -449,11 +449,11 @@ } }, "node_modules/@babel/plugin-proposal-export-namespace-from": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.14.5.tgz", - "integrity": "sha512-g5POA32bXPMmSBu5Dx/iZGLGnKmKPc5AiY7qfZgurzrCYgIztDlHFbznSNCoQuv57YQLnQfaDi7dxCtLDIdXdA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.7.tgz", + "integrity": "sha512-ZxdtqDXLRGBL64ocZcs7ovt71L3jhC1RGSyR996svrCi3PYqHNkb3SwPJCs8RIzD86s+WPpt2S73+EHCGO+NUA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" }, "engines": { @@ -464,11 +464,11 @@ } }, "node_modules/@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.14.5.tgz", - "integrity": "sha512-YGn2AvZAo9TwyhlLvCCWxD90Xq8xJ4aSgaX3G5D/8DW94L8aaT+dS5cSP+Z06+rCJERGSr9GxMBZ601xoc2taw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.7.tgz", + "integrity": "sha512-K3XzyZJGQCr00+EtYtrDjmwX7o7PLK6U9bi1nCwkQioRFVUv6dJoxbQjtWVtP+bCPy82bONBKG8NPyQ4+i6yjg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" }, "engines": { @@ -479,11 +479,11 @@ } }, "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.14.5.tgz", - "integrity": "sha512-gun/SOnMqjSb98Nkaq2rTKMwervfdAoz6NphdY0vTfuzMfryj+tDGb2n6UkDKwez+Y8PZDhE3D143v6Gepp4Hg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.7.tgz", + "integrity": "sha512-aUOrYU3EVtjf62jQrCj63pYZ7k6vns2h/DQvHPWGmsJRYzWXZ6/AsfgpiRy6XiuIDADhJzP2Q9MwSMKauBQ+UQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" }, "engines": { @@ -494,11 +494,11 @@ } }, "node_modules/@babel/plugin-proposal-numeric-separator": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.14.5.tgz", - "integrity": "sha512-yiclALKe0vyZRZE0pS6RXgjUOt87GWv6FYa5zqj15PvhOGFO69R5DusPlgK/1K5dVnCtegTiWu9UaBSrLLJJBg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.7.tgz", + "integrity": "sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-numeric-separator": "^7.10.4" }, "engines": { @@ -509,12 +509,12 @@ } }, "node_modules/@babel/plugin-proposal-optional-chaining": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.14.5.tgz", - "integrity": "sha512-ycz+VOzo2UbWNI1rQXxIuMOzrDdHGrI23fRiz/Si2R4kv2XZQ1BK8ccdHwehMKBlcH/joGW/tzrUmo67gbJHlQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.7.tgz", + "integrity": "sha512-eC3xy+ZrUcBtP7x+sq62Q/HYd674pPTb/77XZMb5wbDPGWIdUbSr4Agr052+zaUPSb+gGRnjxXfKFvx5iMJ+DA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.14.5", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", "@babel/plugin-syntax-optional-chaining": "^7.8.3" }, "engines": { @@ -525,12 +525,12 @@ } }, "node_modules/@babel/plugin-proposal-private-methods": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.14.5.tgz", - "integrity": "sha512-838DkdUA1u+QTCplatfq4B7+1lnDa/+QMI89x5WZHBcnNv+47N8QEj2k9I2MUU9xIv8XJ4XvPCviM/Dj7Uwt9g==", + "version": "7.16.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.11.tgz", + "integrity": "sha512-F/2uAkPlXDr8+BHpZvo19w3hLFKge+k75XUprE6jaqKxjGkSYcK+4c+bup5PdW/7W/Rpjwql7FTVEDW+fRAQsw==", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-create-class-features-plugin": "^7.16.10", + "@babel/helper-plugin-utils": "^7.16.7" }, "engines": { "node": ">=6.9.0" @@ -540,13 +540,13 @@ } }, "node_modules/@babel/plugin-proposal-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-62EyfyA3WA0mZiF2e2IV9mc9Ghwxcg8YTu8BS4Wss4Y3PY725OmS9M0qLORbJwLqFtGh+jiE4wAmocK2CTUK2Q==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.7.tgz", + "integrity": "sha512-rMQkjcOFbm+ufe3bTZLyOfsOUOxyvLXZJCTARhJr+8UMSoZmqTe1K1BgkFcrW37rAchWg57yI69ORxiWvUINuQ==", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.14.5", - "@babel/helper-create-class-features-plugin": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-create-class-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-private-property-in-object": "^7.14.5" }, "engines": { @@ -709,13 +709,13 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.14.5.tgz", - "integrity": "sha512-en8GfBtgnydoao2PS+87mKyw62k02k7kJ9ltbKe0fXTHrQmG6QZZflYuGI1VVG7sVpx4E1n7KBpNlPb8m78J+A==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.16.8.tgz", + "integrity": "sha512-oflKPvsLT2+uKQopesJt3ApiaIS2HW+hzHFcwRNtyDGieAeC/dIHZX8buJQ2J2X1rxGPy4eRcUijm3qcSPjYcA==", "dependencies": { - "@babel/helper-module-transforms": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-simple-access": "^7.14.5", + "@babel/helper-module-transforms": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-simple-access": "^7.16.7", "babel-plugin-dynamic-import-node": "^2.3.3" }, "engines": { @@ -826,13 +826,13 @@ } }, "node_modules/@babel/preset-typescript": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.14.5.tgz", - "integrity": "sha512-u4zO6CdbRKbS9TypMqrlGH7sd2TAJppZwn3c/ZRLeO/wGsbddxgbPDUZVNrie3JWYLQ9vpineKlsrWFvO6Pwkw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.16.7.tgz", + "integrity": "sha512-WbVEmgXdIyvzB77AQjGBEyYPZx+8tTsO50XtfozQrkW8QB2rLJpH2lgx0TRw5EJrBxOZQ+wCcyPVQvS8tjEHpQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-validator-option": "^7.14.5", - "@babel/plugin-transform-typescript": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-validator-option": "^7.16.7", + "@babel/plugin-transform-typescript": "^7.16.7" }, "engines": { "node": ">=6.9.0" @@ -1436,9 +1436,9 @@ } }, "node_modules/@types/ws": { - "version": "7.2.6", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-7.2.6.tgz", - "integrity": "sha512-Q07IrQUSNpr+cXU4E4LtkSIBPie5GLZyyMC1QtQYRLWz701+XcoVygGUZgvLqElq1nU4ICldMYPnexlBsg3dqQ==", + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.2.2.tgz", + "integrity": "sha512-NOn5eIcgWLOo6qW8AcuLZ7G8PycXu0xTxxkS6Q18VWFxgPUSOwV0pBj2a/4viNZVu25i7RIB7GttdkAIUUXOOg==", "dev": true, "dependencies": { "@types/node": "*" @@ -2134,15 +2134,15 @@ } }, "node_modules/browserslist": { - "version": "4.16.6", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz", - "integrity": "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==", + "version": "4.19.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.19.1.tgz", + "integrity": "sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A==", "dependencies": { - "caniuse-lite": "^1.0.30001219", - "colorette": "^1.2.2", - "electron-to-chromium": "^1.3.723", + "caniuse-lite": "^1.0.30001286", + "electron-to-chromium": "^1.4.17", "escalade": "^3.1.1", - "node-releases": "^1.1.71" + "node-releases": "^2.0.1", + "picocolors": "^1.0.0" }, "bin": { "browserslist": "cli.js" @@ -2155,6 +2155,11 @@ "url": "https://opencollective.com/browserslist" } }, + "node_modules/browserslist/node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, "node_modules/buffer-crc32": { "version": "0.2.13", "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", @@ -2166,8 +2171,7 @@ "node_modules/buffer-from": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", - "dev": true + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" }, "node_modules/cacheable-request": { "version": "6.1.0", @@ -2237,9 +2241,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001246", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001246.tgz", - "integrity": "sha512-Tc+ff0Co/nFNbLOrziBXmMVtpt9S2c2Y+Z9Nk9Khj09J+0zR9ejvIW5qkZAErCbOrVODCx/MN+GpB5FNBs5GFA==", + "version": "1.0.30001304", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001304.tgz", + "integrity": "sha512-bdsfZd6K6ap87AGqSHJP/s1V+U6Z5lyrcbBu3ovbCCf8cSYpwTtGrCBObMpJqwxfTbLW6YTIdbb1jEeTelcpYQ==", "funding": { "type": "opencollective", "url": "https://opencollective.com/browserslist" @@ -2450,11 +2454,6 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" }, - "node_modules/colorette": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", - "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==" - }, "node_modules/colors": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", @@ -2854,9 +2853,9 @@ } }, "node_modules/debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", "dependencies": { "ms": "2.1.2" }, @@ -3060,9 +3059,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.3.785", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.785.tgz", - "integrity": "sha512-WmCgAeURsMFiyoJ646eUaJQ7GNfvMRLXo+GamUyKVNEM4MqTAsXyC0f38JEB4N3BtbD0tlAKozGP5E2T9K3YGg==" + "version": "1.4.59", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.59.tgz", + "integrity": "sha512-AOJ3cAE0TWxz4fQ9zkND5hWrQg16nsZKVz9INOot1oV//u4wWu5xrj9CQMmPTYskkZRunSRc9sAnr4EkexXokg==" }, "node_modules/electron/node_modules/@types/node": { "version": "14.18.10", @@ -5256,14 +5255,14 @@ "dev": true }, "node_modules/mime": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", - "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", + "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", "bin": { "mime": "cli.js" }, "engines": { - "node": ">=4.0.0" + "node": ">=10.0.0" } }, "node_modules/mime-db": { @@ -5390,18 +5389,10 @@ "tslib": "^2.0.3" } }, - "node_modules/node-modules-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", - "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/node-releases": { - "version": "1.1.73", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.73.tgz", - "integrity": "sha512-uW7fodD6pyW2FZNZnp/Z3hvWKeEW1Y8R1+1CnErE8cXFXzl5blBOoVB41CvMer6P6Q0S5FXDwcHgFd1Wj0U9zg==" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.1.tgz", + "integrity": "sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==" }, "node_modules/node-stream-zip": { "version": "1.15.0", @@ -5561,9 +5552,9 @@ } }, "node_modules/open": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/open/-/open-8.3.0.tgz", - "integrity": "sha512-7INcPWb1UcOwSQxAXTnBJ+FxVV4MPs/X++FWWBtgY69/J5lc+tCteMt/oFK1MnkyHC4VILLa9ntmwKTwDR4Q9w==", + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", + "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", "dependencies": { "define-lazy-prop": "^2.0.0", "is-docker": "^2.1.1", @@ -5784,17 +5775,6 @@ "node": ">=6" } }, - "node_modules/pirates": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", - "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", - "dependencies": { - "node-modules-regexp": "^1.0.0" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/pixelmatch": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/pixelmatch/-/pixelmatch-5.2.1.tgz", @@ -5914,11 +5894,11 @@ "link": true }, "node_modules/pngjs": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-5.0.0.tgz", - "integrity": "sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-6.0.0.tgz", + "integrity": "sha512-TRzzuFRRmEoSW/p1KVAmiOgPco2Irlah+bGFCeNfJXxxYGwSw7YwAOAcd7X28K/m5bjBWKsC29KyoMfHbypayg==", "engines": { - "node": ">=10.13.0" + "node": ">=12.13.0" } }, "node_modules/postcss": { @@ -6633,9 +6613,9 @@ } }, "node_modules/socks-proxy-agent": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.1.0.tgz", - "integrity": "sha512-57e7lwCN4Tzt3mXz25VxOErJKXlPfXmkMLnk310v/jwW20jWRVcgsOit+xNkN3eIEdB47GwnfAEBLacZ/wVIKg==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.1.1.tgz", + "integrity": "sha512-t8J0kG3csjA4g6FTbsMOWws+7R7vuRC8aQ/wy3/1OWmsgwA68zs/+cExQ0koSitUDXqhufF/YJr9wtNMZHw5Ew==", "dependencies": { "agent-base": "^6.0.2", "debug": "^4.3.1", @@ -6704,10 +6684,9 @@ } }, "node_modules/source-map-support": { - "version": "0.5.20", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.20.tgz", - "integrity": "sha512-n1lZZ8Ve4ksRqizaBQgxXDgKwttHDhyfQjA6YZZn8+AroHbsIz+JjwxQDxbp+7y5OYCI8t1Yk7etjD9CRd2hIw==", - "dev": true, + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -6717,7 +6696,6 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -7411,11 +7389,11 @@ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "node_modules/ws": { - "version": "7.4.6", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", - "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.4.2.tgz", + "integrity": "sha512-Kbk4Nxyq7/ZWqr/tarI9yIt/+iNNFOjBXEWgTb4ydaNHBNGgvf2QHbS9fdfsndfjFlFwEd4Al+mw83YkaD10ZA==", "engines": { - "node": ">=8.3.0" + "node": ">=10.0.0" }, "peerDependencies": { "bufferutil": "^4.0.1", @@ -7565,20 +7543,20 @@ "version": "1.19.0-next", "license": "Apache-2.0", "dependencies": { - "commander": "^8.2.0", - "debug": "^4.1.1", + "commander": "^8.3.0", + "debug": "^4.3.3", "extract-zip": "^2.0.1", "https-proxy-agent": "^5.0.0", - "jpeg-js": "^0.4.2", - "mime": "^2.4.6", - "pngjs": "^5.0.0", + "jpeg-js": "^0.4.3", + "mime": "^3.0.0", + "pngjs": "^6.0.0", "progress": "^2.0.3", - "proper-lockfile": "^4.1.1", + "proper-lockfile": "^4.1.2", "proxy-from-env": "^1.1.0", "rimraf": "^3.0.2", - "socks-proxy-agent": "^6.1.0", - "stack-utils": "^2.0.3", - "ws": "^7.4.6", + "socks-proxy-agent": "^6.1.1", + "stack-utils": "^2.0.5", + "ws": "^8.4.2", "yauzl": "^2.10.0", "yazl": "^2.5.1" }, @@ -7590,9 +7568,9 @@ } }, "packages/playwright-core/node_modules/commander": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.2.0.tgz", - "integrity": "sha512-LLKxDvHeL91/8MIyTAD5BFMNtoIwztGPMiM/7Bl8rIPmHCZXRxmSWr91h57dpOpnQ6jIUqEWdXE/uBYMfiVZDA==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", "engines": { "node": ">= 12" } @@ -7616,43 +7594,43 @@ "version": "1.19.0-next", "license": "Apache-2.0", "dependencies": { - "@babel/code-frame": "^7.14.5", - "@babel/core": "^7.14.8", - "@babel/plugin-proposal-class-properties": "^7.14.5", - "@babel/plugin-proposal-dynamic-import": "^7.14.5", - "@babel/plugin-proposal-export-namespace-from": "^7.14.5", - "@babel/plugin-proposal-logical-assignment-operators": "^7.14.5", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.14.5", - "@babel/plugin-proposal-numeric-separator": "^7.14.5", - "@babel/plugin-proposal-optional-chaining": "^7.14.5", - "@babel/plugin-proposal-private-methods": "^7.14.5", - "@babel/plugin-proposal-private-property-in-object": "^7.14.5", + "@babel/code-frame": "^7.16.7", + "@babel/core": "^7.16.12", + "@babel/plugin-proposal-class-properties": "^7.16.7", + "@babel/plugin-proposal-dynamic-import": "^7.16.7", + "@babel/plugin-proposal-export-namespace-from": "^7.16.7", + "@babel/plugin-proposal-logical-assignment-operators": "^7.16.7", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.7", + "@babel/plugin-proposal-numeric-separator": "^7.16.7", + "@babel/plugin-proposal-optional-chaining": "^7.16.7", + "@babel/plugin-proposal-private-methods": "^7.16.11", + "@babel/plugin-proposal-private-property-in-object": "^7.16.7", "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-json-strings": "^7.8.3", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-transform-modules-commonjs": "^7.14.5", - "@babel/plugin-transform-react-jsx": "^7.14.5", - "@babel/preset-typescript": "^7.14.5", + "@babel/plugin-transform-modules-commonjs": "^7.16.8", + "@babel/plugin-transform-react-jsx": "^7.16.7", + "@babel/preset-typescript": "^7.16.7", "babel-plugin-module-resolver": "^4.1.0", "colors": "1.4.0", - "commander": "^8.2.0", - "debug": "^4.1.1", + "commander": "^8.3.0", + "debug": "^4.3.3", "expect": "=27.2.5", "jest-matcher-utils": "=27.2.5", - "jpeg-js": "^0.4.2", + "jpeg-js": "^0.4.3", "json5": "^2.2.0", - "mime": "^2.4.6", - "minimatch": "^3.0.3", - "ms": "^2.1.2", - "open": "^8.3.0", - "pirates": "^4.0.1", + "mime": "^3.0.0", + "minimatch": "^3.0.4", + "ms": "^2.1.3", + "open": "^8.4.0", + "pirates": "=4.0.4", "pixelmatch": "^5.2.1", "playwright-core": "=1.19.0-next", - "pngjs": "^5.0.0", + "pngjs": "^6.0.0", "rimraf": "^3.0.2", - "source-map-support": "^0.4.18", - "stack-utils": "^2.0.3", + "source-map-support": "^0.5.21", + "stack-utils": "^2.0.5", "yazl": "^2.5.1" }, "bin": { @@ -7663,27 +7641,24 @@ } }, "packages/playwright-test/node_modules/commander": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.2.0.tgz", - "integrity": "sha512-LLKxDvHeL91/8MIyTAD5BFMNtoIwztGPMiM/7Bl8rIPmHCZXRxmSWr91h57dpOpnQ6jIUqEWdXE/uBYMfiVZDA==", + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", "engines": { "node": ">= 12" } }, - "packages/playwright-test/node_modules/pngjs": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-6.0.0.tgz", - "integrity": "sha512-TRzzuFRRmEoSW/p1KVAmiOgPco2Irlah+bGFCeNfJXxxYGwSw7YwAOAcd7X28K/m5bjBWKsC29KyoMfHbypayg==", - "engines": { - "node": ">=12.13.0" - } + "packages/playwright-test/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, - "packages/playwright-test/node_modules/source-map-support": { - "version": "0.4.18", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", - "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", - "dependencies": { - "source-map": "^0.5.6" + "packages/playwright-test/node_modules/pirates": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.4.tgz", + "integrity": "sha512-ZIrVPH+A52Dw84R0L3/VS9Op04PuQ2SEoJL6bkshmiTic/HldyW9Tf7oH5mhJZBK7NmDx27vSMrYEXPXclpDKw==", + "engines": { + "node": ">= 6" } }, "packages/playwright-webkit": { @@ -7728,24 +7703,24 @@ } }, "@babel/compat-data": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.14.7.tgz", - "integrity": "sha512-nS6dZaISCXJ3+518CWiBfEr//gHyMO02uDxBkXTKZDN5POruCnOZ1N4YBRZDCabwF8nZMWBpRxIicmXtBs+fvw==" + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.16.8.tgz", + "integrity": "sha512-m7OkX0IdKLKPpBlJtF561YJal5y/jyI5fNfWbPxh2D/nbzzGI4qRyrD8xO2jB24u7l+5I2a43scCG2IrfjC50Q==" }, "@babel/core": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.14.8.tgz", - "integrity": "sha512-/AtaeEhT6ErpDhInbXmjHcUQXH0L0TEgscfcxk1qbOvLuKCa5aZT0SOOtDKFY96/CLROwbLSKyFor6idgNaU4Q==", - "requires": { - "@babel/code-frame": "^7.14.5", - "@babel/generator": "^7.14.8", - "@babel/helper-compilation-targets": "^7.14.5", - "@babel/helper-module-transforms": "^7.14.8", - "@babel/helpers": "^7.14.8", - "@babel/parser": "^7.14.8", - "@babel/template": "^7.14.5", - "@babel/traverse": "^7.14.8", - "@babel/types": "^7.14.8", + "version": "7.16.12", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.16.12.tgz", + "integrity": "sha512-dK5PtG1uiN2ikk++5OzSYsitZKny4wOCD0nrO4TqnW4BVBTQ2NGS3NgilvT/TEyxTST7LNyWV/T4tXDoD3fOgg==", + "requires": { + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.16.8", + "@babel/helper-compilation-targets": "^7.16.7", + "@babel/helper-module-transforms": "^7.16.7", + "@babel/helpers": "^7.16.7", + "@babel/parser": "^7.16.12", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.16.10", + "@babel/types": "^7.16.8", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -7773,13 +7748,13 @@ } }, "@babel/helper-compilation-targets": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.14.5.tgz", - "integrity": "sha512-v+QtZqXEiOnpO6EYvlImB6zCD2Lel06RzOPzmkz/D/XgQiUu3C/Jb1LOqSt/AIA34TYi/Q+KlT8vTQrgdxkbLw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.7.tgz", + "integrity": "sha512-mGojBwIWcwGD6rfqgRXVlVYmPAv7eOpIemUG3dGnDdCY4Pae70ROij3XmfrH6Fa1h1aiDylpglbZyktfzyo/hA==", "requires": { - "@babel/compat-data": "^7.14.5", - "@babel/helper-validator-option": "^7.14.5", - "browserslist": "^4.16.6", + "@babel/compat-data": "^7.16.4", + "@babel/helper-validator-option": "^7.16.7", + "browserslist": "^4.17.5", "semver": "^6.3.0" } }, @@ -7848,18 +7823,18 @@ } }, "@babel/helper-module-transforms": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.14.8.tgz", - "integrity": "sha512-RyE+NFOjXn5A9YU1dkpeBaduagTlZ0+fccnIcAGbv1KGUlReBj7utF7oEth8IdIBQPcux0DDgW5MFBH2xu9KcA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.7.tgz", + "integrity": "sha512-gaqtLDxJEFCeQbYp9aLAefjhkKdjKcdh6DB7jniIGU3Pz52WAmP268zK0VgPz9hUNkMSYeH976K2/Y6yPadpng==", "requires": { - "@babel/helper-module-imports": "^7.14.5", - "@babel/helper-replace-supers": "^7.14.5", - "@babel/helper-simple-access": "^7.14.8", - "@babel/helper-split-export-declaration": "^7.14.5", - "@babel/helper-validator-identifier": "^7.14.8", - "@babel/template": "^7.14.5", - "@babel/traverse": "^7.14.8", - "@babel/types": "^7.14.8" + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-module-imports": "^7.16.7", + "@babel/helper-simple-access": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/helper-validator-identifier": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.16.7", + "@babel/types": "^7.16.7" } }, "@babel/helper-optimise-call-expression": { @@ -7888,19 +7863,19 @@ } }, "@babel/helper-simple-access": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.14.8.tgz", - "integrity": "sha512-TrFN4RHh9gnWEU+s7JloIho2T76GPwRHhdzOWLqTrMnlas8T9O7ec+oEDNsRXndOmru9ymH9DFrEOxpzPoSbdg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.7.tgz", + "integrity": "sha512-ZIzHVyoeLMvXMN/vok/a4LWRy8G2v205mNP0XOuf9XRLyX5/u9CnVulUtDgUTama3lT+bf/UqucuZjqiGuTS1g==", "requires": { - "@babel/types": "^7.14.8" + "@babel/types": "^7.16.7" } }, "@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.14.5.tgz", - "integrity": "sha512-dmqZB7mrb94PZSAOYtr+ZN5qt5owZIAgqtoTuqiFbHFtxgEcmQlRJVI+bO++fciBunXtB6MK7HrzrfcAzIz2NQ==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz", + "integrity": "sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw==", "requires": { - "@babel/types": "^7.14.5" + "@babel/types": "^7.16.0" } }, "@babel/helper-split-export-declaration": { @@ -7922,13 +7897,13 @@ "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==" }, "@babel/helpers": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.14.8.tgz", - "integrity": "sha512-ZRDmI56pnV+p1dH6d+UN6GINGz7Krps3+270qqI9UJ4wxYThfAIcI5i7j5vXC4FJ3Wap+S9qcebxeYiqn87DZw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.16.7.tgz", + "integrity": "sha512-9ZDoqtfY7AuEOt3cxchfii6C7GDyyMBffktR5B2jvWv8u2+efwvpnVKXMWzNehqy68tKgAfSwfdw/lWpthS2bw==", "requires": { - "@babel/template": "^7.14.5", - "@babel/traverse": "^7.14.8", - "@babel/types": "^7.14.8" + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.16.7", + "@babel/types": "^7.16.7" } }, "@babel/highlight": { @@ -7947,86 +7922,86 @@ "integrity": "sha512-VfaV15po8RiZssrkPweyvbGVSe4x2y+aciFCgn0n0/SJMR22cwofRV1mtnJQYcSB1wUTaA/X1LnA3es66MCO5A==" }, "@babel/plugin-proposal-class-properties": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.14.5.tgz", - "integrity": "sha512-q/PLpv5Ko4dVc1LYMpCY7RVAAO4uk55qPwrIuJ5QJ8c6cVuAmhu7I/49JOppXL6gXf7ZHzpRVEUZdYoPLM04Gg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.7.tgz", + "integrity": "sha512-IobU0Xme31ewjYOShSIqd/ZGM/r/cuOz2z0MDbNrhF5FW+ZVgi0f2lyeoj9KFPDOAqsYxmLWZte1WOwlvY9aww==", "requires": { - "@babel/helper-create-class-features-plugin": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-create-class-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-proposal-dynamic-import": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.14.5.tgz", - "integrity": "sha512-ExjiNYc3HDN5PXJx+bwC50GIx/KKanX2HiggnIUAYedbARdImiCU4RhhHfdf0Kd7JNXGpsBBBCOm+bBVy3Gb0g==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.7.tgz", + "integrity": "sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg==", "requires": { - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-dynamic-import": "^7.8.3" } }, "@babel/plugin-proposal-export-namespace-from": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.14.5.tgz", - "integrity": "sha512-g5POA32bXPMmSBu5Dx/iZGLGnKmKPc5AiY7qfZgurzrCYgIztDlHFbznSNCoQuv57YQLnQfaDi7dxCtLDIdXdA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.7.tgz", + "integrity": "sha512-ZxdtqDXLRGBL64ocZcs7ovt71L3jhC1RGSyR996svrCi3PYqHNkb3SwPJCs8RIzD86s+WPpt2S73+EHCGO+NUA==", "requires": { - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" } }, "@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.14.5.tgz", - "integrity": "sha512-YGn2AvZAo9TwyhlLvCCWxD90Xq8xJ4aSgaX3G5D/8DW94L8aaT+dS5cSP+Z06+rCJERGSr9GxMBZ601xoc2taw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.7.tgz", + "integrity": "sha512-K3XzyZJGQCr00+EtYtrDjmwX7o7PLK6U9bi1nCwkQioRFVUv6dJoxbQjtWVtP+bCPy82bONBKG8NPyQ4+i6yjg==", "requires": { - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" } }, "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.14.5.tgz", - "integrity": "sha512-gun/SOnMqjSb98Nkaq2rTKMwervfdAoz6NphdY0vTfuzMfryj+tDGb2n6UkDKwez+Y8PZDhE3D143v6Gepp4Hg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.7.tgz", + "integrity": "sha512-aUOrYU3EVtjf62jQrCj63pYZ7k6vns2h/DQvHPWGmsJRYzWXZ6/AsfgpiRy6XiuIDADhJzP2Q9MwSMKauBQ+UQ==", "requires": { - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" } }, "@babel/plugin-proposal-numeric-separator": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.14.5.tgz", - "integrity": "sha512-yiclALKe0vyZRZE0pS6RXgjUOt87GWv6FYa5zqj15PvhOGFO69R5DusPlgK/1K5dVnCtegTiWu9UaBSrLLJJBg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.7.tgz", + "integrity": "sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw==", "requires": { - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-numeric-separator": "^7.10.4" } }, "@babel/plugin-proposal-optional-chaining": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.14.5.tgz", - "integrity": "sha512-ycz+VOzo2UbWNI1rQXxIuMOzrDdHGrI23fRiz/Si2R4kv2XZQ1BK8ccdHwehMKBlcH/joGW/tzrUmo67gbJHlQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.7.tgz", + "integrity": "sha512-eC3xy+ZrUcBtP7x+sq62Q/HYd674pPTb/77XZMb5wbDPGWIdUbSr4Agr052+zaUPSb+gGRnjxXfKFvx5iMJ+DA==", "requires": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.14.5", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", "@babel/plugin-syntax-optional-chaining": "^7.8.3" } }, "@babel/plugin-proposal-private-methods": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.14.5.tgz", - "integrity": "sha512-838DkdUA1u+QTCplatfq4B7+1lnDa/+QMI89x5WZHBcnNv+47N8QEj2k9I2MUU9xIv8XJ4XvPCviM/Dj7Uwt9g==", + "version": "7.16.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.11.tgz", + "integrity": "sha512-F/2uAkPlXDr8+BHpZvo19w3hLFKge+k75XUprE6jaqKxjGkSYcK+4c+bup5PdW/7W/Rpjwql7FTVEDW+fRAQsw==", "requires": { - "@babel/helper-create-class-features-plugin": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-create-class-features-plugin": "^7.16.10", + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-proposal-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-62EyfyA3WA0mZiF2e2IV9mc9Ghwxcg8YTu8BS4Wss4Y3PY725OmS9M0qLORbJwLqFtGh+jiE4wAmocK2CTUK2Q==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.7.tgz", + "integrity": "sha512-rMQkjcOFbm+ufe3bTZLyOfsOUOxyvLXZJCTARhJr+8UMSoZmqTe1K1BgkFcrW37rAchWg57yI69ORxiWvUINuQ==", "requires": { - "@babel/helper-annotate-as-pure": "^7.14.5", - "@babel/helper-create-class-features-plugin": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-create-class-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-private-property-in-object": "^7.14.5" } }, @@ -8135,13 +8110,13 @@ } }, "@babel/plugin-transform-modules-commonjs": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.14.5.tgz", - "integrity": "sha512-en8GfBtgnydoao2PS+87mKyw62k02k7kJ9ltbKe0fXTHrQmG6QZZflYuGI1VVG7sVpx4E1n7KBpNlPb8m78J+A==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.16.8.tgz", + "integrity": "sha512-oflKPvsLT2+uKQopesJt3ApiaIS2HW+hzHFcwRNtyDGieAeC/dIHZX8buJQ2J2X1rxGPy4eRcUijm3qcSPjYcA==", "requires": { - "@babel/helper-module-transforms": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-simple-access": "^7.14.5", + "@babel/helper-module-transforms": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-simple-access": "^7.16.7", "babel-plugin-dynamic-import-node": "^2.3.3" } }, @@ -8210,13 +8185,13 @@ } }, "@babel/preset-typescript": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.14.5.tgz", - "integrity": "sha512-u4zO6CdbRKbS9TypMqrlGH7sd2TAJppZwn3c/ZRLeO/wGsbddxgbPDUZVNrie3JWYLQ9vpineKlsrWFvO6Pwkw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.16.7.tgz", + "integrity": "sha512-WbVEmgXdIyvzB77AQjGBEyYPZx+8tTsO50XtfozQrkW8QB2rLJpH2lgx0TRw5EJrBxOZQ+wCcyPVQvS8tjEHpQ==", "requires": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-validator-option": "^7.14.5", - "@babel/plugin-transform-typescript": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-validator-option": "^7.16.7", + "@babel/plugin-transform-typescript": "^7.16.7" } }, "@babel/template": { @@ -8428,62 +8403,60 @@ "@playwright/test": { "version": "file:packages/playwright-test", "requires": { - "@babel/code-frame": "^7.14.5", - "@babel/core": "^7.14.8", - "@babel/plugin-proposal-class-properties": "^7.14.5", - "@babel/plugin-proposal-dynamic-import": "^7.14.5", - "@babel/plugin-proposal-export-namespace-from": "^7.14.5", - "@babel/plugin-proposal-logical-assignment-operators": "^7.14.5", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.14.5", - "@babel/plugin-proposal-numeric-separator": "^7.14.5", - "@babel/plugin-proposal-optional-chaining": "^7.14.5", - "@babel/plugin-proposal-private-methods": "^7.14.5", - "@babel/plugin-proposal-private-property-in-object": "^7.14.5", + "@babel/code-frame": "^7.16.7", + "@babel/core": "^7.16.12", + "@babel/plugin-proposal-class-properties": "^7.16.7", + "@babel/plugin-proposal-dynamic-import": "^7.16.7", + "@babel/plugin-proposal-export-namespace-from": "^7.16.7", + "@babel/plugin-proposal-logical-assignment-operators": "^7.16.7", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.7", + "@babel/plugin-proposal-numeric-separator": "^7.16.7", + "@babel/plugin-proposal-optional-chaining": "^7.16.7", + "@babel/plugin-proposal-private-methods": "^7.16.11", + "@babel/plugin-proposal-private-property-in-object": "^7.16.7", "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-json-strings": "^7.8.3", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-transform-modules-commonjs": "^7.14.5", - "@babel/plugin-transform-react-jsx": "^7.14.5", - "@babel/preset-typescript": "^7.14.5", + "@babel/plugin-transform-modules-commonjs": "^7.16.8", + "@babel/plugin-transform-react-jsx": "^7.16.7", + "@babel/preset-typescript": "^7.16.7", "babel-plugin-module-resolver": "^4.1.0", "colors": "1.4.0", - "commander": "^8.2.0", - "debug": "^4.1.1", + "commander": "^8.3.0", + "debug": "^4.3.3", "expect": "=27.2.5", "jest-matcher-utils": "=27.2.5", - "jpeg-js": "^0.4.2", + "jpeg-js": "^0.4.3", "json5": "^2.2.0", - "mime": "^2.4.6", - "minimatch": "^3.0.3", - "ms": "^2.1.2", - "open": "^8.3.0", - "pirates": "^4.0.1", + "mime": "^3.0.0", + "minimatch": "^3.0.4", + "ms": "^2.1.3", + "open": "^8.4.0", + "pirates": "=4.0.4", "pixelmatch": "^5.2.1", "playwright-core": "=1.19.0-next", - "pngjs": "^5.0.0", + "pngjs": "^6.0.0", "rimraf": "^3.0.2", - "source-map-support": "^0.4.18", - "stack-utils": "^2.0.3", + "source-map-support": "^0.5.21", + "stack-utils": "^2.0.5", "yazl": "^2.5.1" }, "dependencies": { "commander": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.2.0.tgz", - "integrity": "sha512-LLKxDvHeL91/8MIyTAD5BFMNtoIwztGPMiM/7Bl8rIPmHCZXRxmSWr91h57dpOpnQ6jIUqEWdXE/uBYMfiVZDA==" + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==" }, - "pngjs": { - "version": "https://registry.npmjs.org/pngjs/-/pngjs-6.0.0.tgz", - "integrity": "sha512-TRzzuFRRmEoSW/p1KVAmiOgPco2Irlah+bGFCeNfJXxxYGwSw7YwAOAcd7X28K/m5bjBWKsC29KyoMfHbypayg==" + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, - "source-map-support": { - "version": "0.4.18", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", - "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", - "requires": { - "source-map": "^0.5.6" - } + "pirates": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.4.tgz", + "integrity": "sha512-ZIrVPH+A52Dw84R0L3/VS9Op04PuQ2SEoJL6bkshmiTic/HldyW9Tf7oH5mhJZBK7NmDx27vSMrYEXPXclpDKw==" } } }, @@ -8798,9 +8771,9 @@ } }, "@types/ws": { - "version": "7.2.6", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-7.2.6.tgz", - "integrity": "sha512-Q07IrQUSNpr+cXU4E4LtkSIBPie5GLZyyMC1QtQYRLWz701+XcoVygGUZgvLqElq1nU4ICldMYPnexlBsg3dqQ==", + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.2.2.tgz", + "integrity": "sha512-NOn5eIcgWLOo6qW8AcuLZ7G8PycXu0xTxxkS6Q18VWFxgPUSOwV0pBj2a/4viNZVu25i7RIB7GttdkAIUUXOOg==", "dev": true, "requires": { "@types/node": "*" @@ -9331,15 +9304,22 @@ } }, "browserslist": { - "version": "4.16.6", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz", - "integrity": "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==", + "version": "4.19.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.19.1.tgz", + "integrity": "sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A==", "requires": { - "caniuse-lite": "^1.0.30001219", - "colorette": "^1.2.2", - "electron-to-chromium": "^1.3.723", + "caniuse-lite": "^1.0.30001286", + "electron-to-chromium": "^1.4.17", "escalade": "^3.1.1", - "node-releases": "^1.1.71" + "node-releases": "^2.0.1", + "picocolors": "^1.0.0" + }, + "dependencies": { + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + } } }, "buffer-crc32": { @@ -9350,8 +9330,7 @@ "buffer-from": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", - "dev": true + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" }, "cacheable-request": { "version": "6.1.0", @@ -9408,9 +9387,9 @@ "dev": true }, "caniuse-lite": { - "version": "1.0.30001246", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001246.tgz", - "integrity": "sha512-Tc+ff0Co/nFNbLOrziBXmMVtpt9S2c2Y+Z9Nk9Khj09J+0zR9ejvIW5qkZAErCbOrVODCx/MN+GpB5FNBs5GFA==" + "version": "1.0.30001304", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001304.tgz", + "integrity": "sha512-bdsfZd6K6ap87AGqSHJP/s1V+U6Z5lyrcbBu3ovbCCf8cSYpwTtGrCBObMpJqwxfTbLW6YTIdbb1jEeTelcpYQ==" }, "chalk": { "version": "2.4.2", @@ -9573,11 +9552,6 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" }, - "colorette": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", - "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==" - }, "colors": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", @@ -9864,9 +9838,9 @@ "dev": true }, "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", "requires": { "ms": "2.1.2" } @@ -10054,9 +10028,9 @@ } }, "electron-to-chromium": { - "version": "1.3.785", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.785.tgz", - "integrity": "sha512-WmCgAeURsMFiyoJ646eUaJQ7GNfvMRLXo+GamUyKVNEM4MqTAsXyC0f38JEB4N3BtbD0tlAKozGP5E2T9K3YGg==" + "version": "1.4.59", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.59.tgz", + "integrity": "sha512-AOJ3cAE0TWxz4fQ9zkND5hWrQg16nsZKVz9INOot1oV//u4wWu5xrj9CQMmPTYskkZRunSRc9sAnr4EkexXokg==" }, "emoji-regex": { "version": "8.0.0", @@ -11668,9 +11642,9 @@ "dev": true }, "mime": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", - "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", + "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==" }, "mime-db": { "version": "1.50.0", @@ -11766,15 +11740,10 @@ "tslib": "^2.0.3" } }, - "node-modules-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", - "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=" - }, "node-releases": { - "version": "1.1.73", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.73.tgz", - "integrity": "sha512-uW7fodD6pyW2FZNZnp/Z3hvWKeEW1Y8R1+1CnErE8cXFXzl5blBOoVB41CvMer6P6Q0S5FXDwcHgFd1Wj0U9zg==" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.1.tgz", + "integrity": "sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==" }, "node-stream-zip": { "version": "1.15.0", @@ -11892,9 +11861,9 @@ } }, "open": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/open/-/open-8.3.0.tgz", - "integrity": "sha512-7INcPWb1UcOwSQxAXTnBJ+FxVV4MPs/X++FWWBtgY69/J5lc+tCteMt/oFK1MnkyHC4VILLa9ntmwKTwDR4Q9w==", + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", + "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", "requires": { "define-lazy-prop": "^2.0.0", "is-docker": "^2.1.1", @@ -12056,14 +12025,6 @@ "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", "dev": true }, - "pirates": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", - "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", - "requires": { - "node-modules-regexp": "^1.0.0" - } - }, "pixelmatch": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/pixelmatch/-/pixelmatch-5.2.1.tgz", @@ -12151,28 +12112,28 @@ "playwright-core": { "version": "file:packages/playwright-core", "requires": { - "commander": "^8.2.0", - "debug": "^4.1.1", + "commander": "^8.3.0", + "debug": "^4.3.3", "extract-zip": "^2.0.1", "https-proxy-agent": "^5.0.0", - "jpeg-js": "^0.4.2", - "mime": "^2.4.6", - "pngjs": "^5.0.0", + "jpeg-js": "^0.4.3", + "mime": "^3.0.0", + "pngjs": "^6.0.0", "progress": "^2.0.3", - "proper-lockfile": "^4.1.1", + "proper-lockfile": "^4.1.2", "proxy-from-env": "^1.1.0", "rimraf": "^3.0.2", - "socks-proxy-agent": "^6.1.0", - "stack-utils": "^2.0.3", - "ws": "^7.4.6", + "socks-proxy-agent": "^6.1.1", + "stack-utils": "^2.0.5", + "ws": "^8.4.2", "yauzl": "^2.10.0", "yazl": "^2.5.1" }, "dependencies": { "commander": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.2.0.tgz", - "integrity": "sha512-LLKxDvHeL91/8MIyTAD5BFMNtoIwztGPMiM/7Bl8rIPmHCZXRxmSWr91h57dpOpnQ6jIUqEWdXE/uBYMfiVZDA==" + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==" } } }, @@ -12189,9 +12150,9 @@ } }, "pngjs": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-5.0.0.tgz", - "integrity": "sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==" + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-6.0.0.tgz", + "integrity": "sha512-TRzzuFRRmEoSW/p1KVAmiOgPco2Irlah+bGFCeNfJXxxYGwSw7YwAOAcd7X28K/m5bjBWKsC29KyoMfHbypayg==" }, "postcss": { "version": "8.3.9", @@ -12723,9 +12684,9 @@ } }, "socks-proxy-agent": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.1.0.tgz", - "integrity": "sha512-57e7lwCN4Tzt3mXz25VxOErJKXlPfXmkMLnk310v/jwW20jWRVcgsOit+xNkN3eIEdB47GwnfAEBLacZ/wVIKg==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.1.1.tgz", + "integrity": "sha512-t8J0kG3csjA4g6FTbsMOWws+7R7vuRC8aQ/wy3/1OWmsgwA68zs/+cExQ0koSitUDXqhufF/YJr9wtNMZHw5Ew==", "requires": { "agent-base": "^6.0.2", "debug": "^4.3.1", @@ -12772,10 +12733,9 @@ "dev": true }, "source-map-support": { - "version": "0.5.20", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.20.tgz", - "integrity": "sha512-n1lZZ8Ve4ksRqizaBQgxXDgKwttHDhyfQjA6YZZn8+AroHbsIz+JjwxQDxbp+7y5OYCI8t1Yk7etjD9CRd2hIw==", - "dev": true, + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "requires": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -12784,8 +12744,7 @@ "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" } } }, @@ -13285,9 +13244,9 @@ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "ws": { - "version": "7.4.6", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", - "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.4.2.tgz", + "integrity": "sha512-Kbk4Nxyq7/ZWqr/tarI9yIt/+iNNFOjBXEWgTb4ydaNHBNGgvf2QHbS9fdfsndfjFlFwEd4Al+mw83YkaD10ZA==", "requires": {} }, "xml2js": { diff --git a/package.json b/package.json index 80dc5f9301368..d0db1e416bc10 100644 --- a/package.json +++ b/package.json @@ -64,7 +64,7 @@ "@types/rimraf": "^3.0.2", "@types/source-map-support": "^0.5.4", "@types/webpack": "^5.28.0", - "@types/ws": "7.2.6", + "@types/ws": "8.2.2", "@types/xml2js": "^0.4.9", "@types/yazl": "^2.4.2", "@typescript-eslint/eslint-plugin": "^5.10.2", @@ -86,7 +86,7 @@ "file-loader": "^6.2.0", "formidable": "^2.0.1", "html-webpack-plugin": "^5.5.0", - "mime": "^2.4.6", + "mime": "^3.0.0", "ncp": "^2.0.0", "node-stream-zip": "^1.15.0", "proxy": "^1.0.2", diff --git a/packages/playwright-core/package.json b/packages/playwright-core/package.json index 93d3becdd6283..bc6bf05e17000 100644 --- a/packages/playwright-core/package.json +++ b/packages/playwright-core/package.json @@ -36,20 +36,20 @@ "playwright": "./cli.js" }, "dependencies": { - "commander": "^8.2.0", - "debug": "^4.1.1", + "commander": "^8.3.0", + "debug": "^4.3.3", "extract-zip": "^2.0.1", "https-proxy-agent": "^5.0.0", - "jpeg-js": "^0.4.2", - "mime": "^2.4.6", - "pngjs": "^5.0.0", + "jpeg-js": "^0.4.3", + "mime": "^3.0.0", + "pngjs": "^6.0.0", "progress": "^2.0.3", - "proper-lockfile": "^4.1.1", + "proper-lockfile": "^4.1.2", "proxy-from-env": "^1.1.0", "rimraf": "^3.0.2", - "socks-proxy-agent": "^6.1.0", - "stack-utils": "^2.0.3", - "ws": "^7.4.6", + "socks-proxy-agent": "^6.1.1", + "stack-utils": "^2.0.5", + "ws": "^8.4.2", "yauzl": "^2.10.0", "yazl": "^2.5.1" } diff --git a/packages/playwright-core/src/dispatchers/browserTypeDispatcher.ts b/packages/playwright-core/src/dispatchers/browserTypeDispatcher.ts index 2bc759403c06f..f3bce05a1d6ef 100644 --- a/packages/playwright-core/src/dispatchers/browserTypeDispatcher.ts +++ b/packages/playwright-core/src/dispatchers/browserTypeDispatcher.ts @@ -81,7 +81,7 @@ export class BrowserTypeDispatcher extends Dispatcher { waitForNextTask(() => { try { - pipe.dispatch(JSON.parse(event.data)); + pipe.dispatch(JSON.parse(event.data as string)); } catch (e) { ws.close(); } diff --git a/packages/playwright-core/src/grid/gridClient.ts b/packages/playwright-core/src/grid/gridClient.ts index 5b99faafb679f..68098c716e8d0 100644 --- a/packages/playwright-core/src/grid/gridClient.ts +++ b/packages/playwright-core/src/grid/gridClient.ts @@ -37,7 +37,7 @@ export class GridClient { connection.markAsRemote(); connection.onmessage = (message: Object) => ws.send(JSON.stringify(message)); ws.on('message', message => connection.dispatch(JSON.parse(message.toString()))); - ws.on('close', (code, reason) => connection.close(reason)); + ws.on('close', (code, reason) => connection.close(reason.toString())); const playwright = await connection.initializePlaywright(); playwright._enablePortForwarding(); return new GridClient(ws, playwright); diff --git a/packages/playwright-core/src/remote/playwrightClient.ts b/packages/playwright-core/src/remote/playwrightClient.ts index da2c5a4728950..59c55c0c86eaa 100644 --- a/packages/playwright-core/src/remote/playwrightClient.ts +++ b/packages/playwright-core/src/remote/playwrightClient.ts @@ -50,7 +50,7 @@ export class PlaywrightClient { playwright = await connection.initializePlaywright(); resolve(new PlaywrightClient(playwright, ws)); }); - ws.on('close', (code, reason) => connection.close(reason)); + ws.on('close', (code, reason) => connection.close(reason.toString())); }); let timer: NodeJS.Timeout; try { diff --git a/packages/playwright-core/src/remote/playwrightServer.ts b/packages/playwright-core/src/remote/playwrightServer.ts index 16f632c1791e3..7931e624f6967 100644 --- a/packages/playwright-core/src/remote/playwrightServer.ts +++ b/packages/playwright-core/src/remote/playwrightServer.ts @@ -131,8 +131,11 @@ export class PlaywrightServer { if (!this._wsServer) return; debugLog('Closing server'); + const waitForClose = new Promise(f => this._wsServer!.close(f)); // First disconnect all remaining clients. - await new Promise(f => this._wsServer!.close(f)); + for (const ws of this._wsServer!.clients) + ws.terminate(); + await waitForClose; await new Promise(f => this._wsServer!.options.server!.close(f)); this._wsServer = undefined; await this._delegate.onClose(); diff --git a/packages/playwright-core/src/server/transport.ts b/packages/playwright-core/src/server/transport.ts index 8dbcc8f9167ae..25f58669df4ea 100644 --- a/packages/playwright-core/src/server/transport.ts +++ b/packages/playwright-core/src/server/transport.ts @@ -94,7 +94,7 @@ export class WebSocketTransport implements ConnectionTransport { messageWrap(() => { try { if (this.onmessage) - this.onmessage.call(null, JSON.parse(event.data)); + this.onmessage.call(null, JSON.parse(event.data as string)); } catch (e) { this._ws.close(); } diff --git a/packages/playwright-test/package.json b/packages/playwright-test/package.json index 053d5c7c7a402..73888bb5c436a 100644 --- a/packages/playwright-test/package.json +++ b/packages/playwright-test/package.json @@ -27,43 +27,43 @@ }, "license": "Apache-2.0", "dependencies": { - "@babel/code-frame": "^7.14.5", - "@babel/core": "^7.14.8", - "@babel/plugin-proposal-class-properties": "^7.14.5", - "@babel/plugin-proposal-dynamic-import": "^7.14.5", - "@babel/plugin-proposal-export-namespace-from": "^7.14.5", - "@babel/plugin-proposal-logical-assignment-operators": "^7.14.5", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.14.5", - "@babel/plugin-proposal-numeric-separator": "^7.14.5", - "@babel/plugin-proposal-optional-chaining": "^7.14.5", - "@babel/plugin-proposal-private-methods": "^7.14.5", - "@babel/plugin-proposal-private-property-in-object": "^7.14.5", + "@babel/code-frame": "^7.16.7", + "@babel/core": "^7.16.12", + "@babel/plugin-proposal-class-properties": "^7.16.7", + "@babel/plugin-proposal-dynamic-import": "^7.16.7", + "@babel/plugin-proposal-export-namespace-from": "^7.16.7", + "@babel/plugin-proposal-logical-assignment-operators": "^7.16.7", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.7", + "@babel/plugin-proposal-numeric-separator": "^7.16.7", + "@babel/plugin-proposal-optional-chaining": "^7.16.7", + "@babel/plugin-proposal-private-methods": "^7.16.11", + "@babel/plugin-proposal-private-property-in-object": "^7.16.7", "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-json-strings": "^7.8.3", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-transform-modules-commonjs": "^7.14.5", - "@babel/plugin-transform-react-jsx": "^7.14.5", - "@babel/preset-typescript": "^7.14.5", + "@babel/plugin-transform-modules-commonjs": "^7.16.8", + "@babel/plugin-transform-react-jsx": "^7.16.7", + "@babel/preset-typescript": "^7.16.7", "babel-plugin-module-resolver": "^4.1.0", "colors": "1.4.0", - "commander": "^8.2.0", - "debug": "^4.1.1", + "commander": "^8.3.0", + "debug": "^4.3.3", "expect": "=27.2.5", "jest-matcher-utils": "=27.2.5", - "jpeg-js": "^0.4.2", + "jpeg-js": "^0.4.3", "json5": "^2.2.0", - "mime": "^2.4.6", - "minimatch": "^3.0.3", - "ms": "^2.1.2", - "open": "^8.3.0", - "pirates": "^4.0.1", + "mime": "^3.0.0", + "minimatch": "^3.0.4", + "ms": "^2.1.3", + "open": "^8.4.0", + "pirates": "=4.0.4", "pixelmatch": "^5.2.1", "playwright-core": "=1.19.0-next", - "pngjs": "^5.0.0", + "pngjs": "^6.0.0", "rimraf": "^3.0.2", - "source-map-support": "^0.4.18", - "stack-utils": "^2.0.3", + "source-map-support": "^0.5.21", + "stack-utils": "^2.0.5", "yazl": "^2.5.1" } } diff --git a/utils/check_deps.js b/utils/check_deps.js index 8a3bf9c220ecb..1fda1853f2bb1 100644 --- a/utils/check_deps.js +++ b/utils/check_deps.js @@ -67,7 +67,7 @@ async function innerCheckDeps(root, checkDepsFile) { } for (const dep of deps) { - const resolved = require.resolve(dep); + const resolved = require.resolve(dep, { paths: [root] }); if (dep === resolved || !resolved.includes('node_modules')) deps.delete(dep); } From e7120d2ca28edef05da600d8744e1b9081be5392 Mon Sep 17 00:00:00 2001 From: Max Schmitt Date: Tue, 1 Feb 2022 21:44:43 +0100 Subject: [PATCH 173/233] docs(python): add API testing guide (#11775) --- docs/src/api-testing-python.md | 289 +++++++++++++++++++++++++++++++++ 1 file changed, 289 insertions(+) create mode 100644 docs/src/api-testing-python.md diff --git a/docs/src/api-testing-python.md b/docs/src/api-testing-python.md new file mode 100644 index 0000000000000..0e5d74f616106 --- /dev/null +++ b/docs/src/api-testing-python.md @@ -0,0 +1,289 @@ +--- +id: api-testing +title: "API testing" +--- + +Playwright can be used to get access to the [REST](https://en.wikipedia.org/wiki/Representational_state_transfer) API of +your application. + +Sometimes you may want to send requests to the server directly from Node.js without loading a page and running js code in it. +A few examples where it may come in handy: +- Test your server API. +- Prepare server side state before visiting the web application in a test. +- Validate server side post-conditions after running some actions in the browser. + +All of that could be achieved via [APIRequestContext] methods. + +The following examples rely on the [`pytest-playwright`](./test-runners.md) package which add Playwright fixtures to the Pytest test-runner. + + + +## Writing API Test + +[APIRequestContext] can send all kinds of HTTP(S) requests over network. + +The following example demonstrates how to use Playwright to test issues creation via [GitHub API](https://docs.github.com/en/rest). The test suite will do the following: +- Create a new repository before running tests. +- Create a few issues and validate server state. +- Delete the repository after running tests. + +### Configure + +GitHub API requires authorization, so we'll configure the token once for all tests. While at it, we'll also set the `baseURL` to simplify the tests. + +```python +import os +from typing import Generator + +import pytest +from playwright.sync_api import Playwright, APIRequestContext + +GITHUB_API_TOKEN = os.getenv("GITHUB_API_TOKEN") +assert GITHUB_API_TOKEN, "GITHUB_API_TOKEN is not set" + + +@pytest.fixture(scope="session") +def api_request_context( + playwright: Playwright, +) -> Generator[APIRequestContext, None, None]: + headers = { + # We set this header per GitHub guidelines. + "Accept": "application/vnd.github.v3+json", + # Add authorization token to all requests. + # Assuming personal access token available in the environment. + "Authorization": f"token {GITHUB_API_TOKEN}", + } + request_context = playwright.request.new_context( + base_url="https://api.github.com", extra_http_headers=headers + ) + yield request_context + request_context.dispose() + +``` + +### Write tests + +Now that we initialized request object we can add a few tests that will create new issues in the repository. +```python +import os +from typing import Generator + +import pytest +from playwright.sync_api import Playwright, APIRequestContext + +GITHUB_API_TOKEN = os.getenv("GITHUB_API_TOKEN") +assert GITHUB_API_TOKEN, "GITHUB_API_TOKEN is not set" + +GITHUB_USER = os.getenv("GITHUB_USER") +assert GITHUB_USER, "GITHUB_USER is not set" + +GITHUB_REPO = "test" + +# ... + +def test_should_create_bug_report(api_request_context: APIRequestContext) -> None: + data = { + "title": "[Bug] report 1", + "body": "Bug description", + } + new_issue = api_request_context.post(f"/repos/{GITHUB_USER}/{GITHUB_REPO}/issues", data=data) + assert new_issue.ok + + issues = api_request_context.get(f"/repos/{GITHUB_USER}/{GITHUB_REPO}/issues") + assert issues.ok + issues_response = issues.json() + issue = list(filter(lambda issue: issue["title"] == "[Bug] report 1", issues_response))[0] + assert issue + assert issue["body"] == "Bug description" + +def test_should_create_feature_request(api_request_context: APIRequestContext) -> None: + data = { + "title": "[Feature] request 1", + "body": "Feature description", + } + new_issue = api_request_context.post(f"/repos/{GITHUB_USER}/{GITHUB_REPO}/issues", data=data) + assert new_issue.ok + + issues = api_request_context.get(f"/repos/{GITHUB_USER}/{GITHUB_REPO}/issues") + assert issues.ok + issues_response = issues.json() + issue = list(filter(lambda issue: issue["title"] == "[Feature] request 1", issues_response))[0] + assert issue + assert issue["body"] == "Feature description" +``` + +### Setup and teardown + +These tests assume that repository exists. You probably want to create a new one before running tests and delete it afterwards. Use a [session fixture](https://docs.pytest.org/en/6.2.x/fixture.html#fixture-scopes) for that. The part before `yield` is the before all and after is the after all. + +```python +# ... +@pytest.fixture(scope="session", autouse=True) +def create_test_repository( + api_request_context: APIRequestContext, +) -> Generator[None, None, None]: + # Before all + new_repo = api_request_context.post("/user/repos", data={"name": GITHUB_REPO}) + assert new_repo.ok + yield + # After all + deleted_repo = api_request_context.delete(f"/repos/{GITHUB_USER}/{GITHUB_REPO}") + assert deleted_repo.ok +``` + +### Complete test example + +Here is the complete example of an API test: + +```python +from enum import auto +import os +from typing import Generator + +import pytest +from playwright.sync_api import Playwright, Page, APIRequestContext, expect + +GITHUB_API_TOKEN = os.getenv("GITHUB_API_TOKEN") +assert GITHUB_API_TOKEN, "GITHUB_API_TOKEN is not set" + +GITHUB_USER = os.getenv("GITHUB_USER") +assert GITHUB_USER, "GITHUB_USER is not set" + +GITHUB_REPO = "test" + + +@pytest.fixture(scope="session") +def api_request_context( + playwright: Playwright, +) -> Generator[APIRequestContext, None, None]: + headers = { + # We set this header per GitHub guidelines. + "Accept": "application/vnd.github.v3+json", + # Add authorization token to all requests. + # Assuming personal access token available in the environment. + "Authorization": f"token {GITHUB_API_TOKEN}", + } + request_context = playwright.request.new_context( + base_url="https://api.github.com", extra_http_headers=headers + ) + yield request_context + request_context.dispose() + + +@pytest.fixture(scope="session", autouse=True) +def create_test_repository( + api_request_context: APIRequestContext, +) -> Generator[None, None, None]: + # Before all + new_repo = api_request_context.post("/user/repos", data={"name": GITHUB_REPO}) + assert new_repo.ok + yield + # After all + deleted_repo = api_request_context.delete(f"/repos/{GITHUB_USER}/{GITHUB_REPO}") + assert deleted_repo.ok + + +def test_should_create_bug_report(api_request_context: APIRequestContext) -> None: + data = { + "title": "[Bug] report 1", + "body": "Bug description", + } + new_issue = api_request_context.post( + f"/repos/{GITHUB_USER}/{GITHUB_REPO}/issues", data=data + ) + assert new_issue.ok + + issues = api_request_context.get(f"/repos/{GITHUB_USER}/{GITHUB_REPO}/issues") + assert issues.ok + issues_response = issues.json() + issue = list( + filter(lambda issue: issue["title"] == "[Bug] report 1", issues_response) + )[0] + assert issue + assert issue["body"] == "Bug description" + + +def test_should_create_feature_request(api_request_context: APIRequestContext) -> None: + data = { + "title": "[Feature] request 1", + "body": "Feature description", + } + new_issue = api_request_context.post( + f"/repos/{GITHUB_USER}/{GITHUB_REPO}/issues", data=data + ) + assert new_issue.ok + + issues = api_request_context.get(f"/repos/{GITHUB_USER}/{GITHUB_REPO}/issues") + assert issues.ok + issues_response = issues.json() + issue = list( + filter(lambda issue: issue["title"] == "[Feature] request 1", issues_response) + )[0] + assert issue + assert issue["body"] == "Feature description" +``` + +## Prepare server state via API calls + +The following test creates a new issue via API and then navigates to the list of all issues in the +project to check that it appears at the top of the list. The check is performed using [LocatorAssertions]. + +```python +def test_last_created_issue_should_be_first_in_the_list(api_request_context: APIRequestContext, page: Page) -> None: + def create_issue(title: str) -> None: + data = { + "title": title, + "body": "Feature description", + } + new_issue = api_request_context.post( + f"/repos/{GITHUB_USER}/{GITHUB_REPO}/issues", data=data + ) + assert new_issue.ok + create_issue("[Feature] request 1") + create_issue("[Feature] request 2") + page.goto(f"https://github.com/{GITHUB_USER}/{GITHUB_REPO}/issues") + first_issue = page.locator("a[data-hovercard-type='issue']").first + expect(first_issue).to_have_text("[Feature] request 2") +``` + +## Check the server state after running user actions + +The following test creates a new issue via user interface in the browser and then checks via API if +it was created: + +```python +def test_last_created_issue_should_be_on_the_server(api_request_context: APIRequestContext, page: Page) -> None: + page.goto(f"https://github.com/{GITHUB_USER}/{GITHUB_REPO}/issues") + page.click("text=New issue") + page.fill("[aria-label='Title']", "Bug report 1") + page.fill("[aria-label='Comment body']", "Bug description") + page.click("text=Submit new issue") + issue_id = page.url.split("/")[-1] + + new_issue = api_request_context.get(f"https://github.com/{GITHUB_USER}/{GITHUB_REPO}/issues/{issue_id}") + assert new_issue.ok + assert new_issue.json()["title"] == "[Bug] report 1" + assert new_issue.json()["body"] == "Bug description" +``` + +## Reuse authentication state + +Web apps use cookie-based or token-based authentication, where authenticated +state is stored as [cookies](https://developer.mozilla.org/en-US/docs/Web/HTTP/Cookies). +Playwright provides [`method: APIRequestContext.storageState`] method that can be used to +retrieve storage state from an authenticated context and then create new contexts with that state. + +Storage state is interchangeable between [BrowserContext] and [APIRequestContext]. You can +use it to log in via API calls and then create a new context with cookies already there. +The following code snippet retrieves state from an authenticated [APIRequestContext] and +creates a new [BrowserContext] with that state. + +```python +request_context = playwright.request.new_context(http_credentials={"username": "test", "password": "test"}) +request_context.get("https://api.example.com/login") +# Save storage state into a variable. +state = request_context.storage_state() + +# Create a new context with the saved storage state. +context = browser.new_context(storage_state=state) +``` From f875ebe730f7dd2d5942cb2aba156f9d8e74dcb2 Mon Sep 17 00:00:00 2001 From: Pavel Feldman Date: Tue, 1 Feb 2022 13:04:54 -0800 Subject: [PATCH 174/233] fix(test-runner): respect source maps when reporting test files (#11770) --- packages/playwright-test/src/loader.ts | 21 ++++++++++ tests/playwright-test/reporter-html.spec.ts | 2 +- tests/playwright-test/reporter.spec.ts | 45 +++++++++++++++++++++ 3 files changed, 67 insertions(+), 1 deletion(-) diff --git a/packages/playwright-test/src/loader.ts b/packages/playwright-test/src/loader.ts index f65341434dbef..2208d6798e3c2 100644 --- a/packages/playwright-test/src/loader.ts +++ b/packages/playwright-test/src/loader.ts @@ -132,6 +132,27 @@ export class Loader { } finally { setCurrentlyLoadingFileSuite(undefined); } + + { + // Test locations that we discover potentially have different file name. + // This could be due to either + // a) use of source maps or due to + // b) require of one file from another. + // Try fixing (a) w/o regressing (b). + + const files = new Set(); + suite.allTests().map(t => files.add(t.location.file)); + if (files.size === 1) { + // All tests point to one file. + const mappedFile = files.values().next().value; + if (suite.location.file !== mappedFile) { + // The file is different, check for a likely source map case. + if (path.extname(mappedFile) !== path.extname(suite.location.file)) + suite.location.file = mappedFile; + } + } + } + return suite; } diff --git a/tests/playwright-test/reporter-html.spec.ts b/tests/playwright-test/reporter-html.spec.ts index 19e47b1693361..64ac0dbffeefa 100644 --- a/tests/playwright-test/reporter-html.spec.ts +++ b/tests/playwright-test/reporter-html.spec.ts @@ -473,7 +473,7 @@ test('open tests from required file', async ({ runInlineTest, showReport, page } }, { 'reporter': 'dot,html' }); expect(result.exitCode).toBe(0); await showReport(); - + await expect(page.locator('text=a.spec.js')).toBeVisible(); await page.locator('text=sample').first().click(); await expect(page.locator('.tree-item-title')).toContainText([ /expect\.toBe/, diff --git a/tests/playwright-test/reporter.spec.ts b/tests/playwright-test/reporter.spec.ts index 2425979a2ea05..f1fc09bca309e 100644 --- a/tests/playwright-test/reporter.spec.ts +++ b/tests/playwright-test/reporter.spec.ts @@ -566,6 +566,51 @@ test('should report correct tests/suites when using grep', async ({ runInlineTes expect(fileSuite.specs.length).toBe(0); }); +test('should use sourceMap-based file suite names', async ({ runInlineTest }) => { + test.info().annotations.push({ type: 'issue', description: 'https://github.com/microsoft/playwright/issues/11028' }); + const result = await runInlineTest({ + 'reporter.js': ` + class Reporter { + onBegin(config, suite) { + console.log(suite.suites[0].suites[0].location.file); + } + } + module.exports = Reporter; + `, + 'playwright.config.ts': ` + module.exports = { + reporter: './reporter', + }; + `, + 'a.spec.js': +`var __create = Object.create;//@no-header +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __markAsModule = (target) => __defProp(target, "__esModule", { value: true }); +var __reExport = (target, module2, desc) => { + if (module2 && typeof module2 === "object" || typeof module2 === "function") { + for (let key of __getOwnPropNames(module2)) + if (!__hasOwnProp.call(target, key) && key !== "default") + __defProp(target, key, { get: () => module2[key], enumerable: !(desc = __getOwnPropDesc(module2, key)) || desc.enumerable }); + } + return target; +}; +var __toModule = (module2) => { + return __reExport(__markAsModule(__defProp(module2 != null ? __create(__getProtoOf(module2)) : {}, "default", module2 && module2.__esModule && "default" in module2 ? { get: () => module2.default, enumerable: true } : { value: module2, enumerable: true })), module2); +}; +var import_test = __toModule(require("@playwright/test")); +(0, import_test.test)("pass", async () => { +}); +//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2Euc3BlYy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0IHsgdGVzdCB9IGZyb20gXCJAcGxheXdyaWdodC90ZXN0XCI7XG5cbnRlc3QoJ3Bhc3MnLCBhc3luYyAoKSA9PiB7fSk7Il0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsa0JBQXFCO0FBRXJCLHNCQUFLLFFBQVEsWUFBWTtBQUFBOyIsCiAgIm5hbWVzIjogW10KfQo=`, + }, { 'reporter': '' }); + + expect(result.exitCode).toBe(0); + expect(result.output).toContain('a.spec.ts'); +}); + function stripEscapedAscii(str: string) { return str.replace(/\\u00[a-z0-9][a-z0-9]\[[^m]+m/g, ''); } From 4a52bc9465ecdca35ee59a088e7700ceaf02299f Mon Sep 17 00:00:00 2001 From: Dmitry Gozman Date: Tue, 1 Feb 2022 14:34:47 -0800 Subject: [PATCH 175/233] docs: add option fixtures section to release notes (#11794) --- docs/src/release-notes-js.md | 47 ++++++++++++++++++++++++++++++-- docs/src/test-fixtures-js.md | 4 +++ docs/src/test-parameterize-js.md | 4 +++ 3 files changed, 52 insertions(+), 3 deletions(-) diff --git a/docs/src/release-notes-js.md b/docs/src/release-notes-js.md index 4fc4ecf5df642..19177aaebb0de 100644 --- a/docs/src/release-notes-js.md +++ b/docs/src/release-notes-js.md @@ -50,9 +50,50 @@ This will create a Playwright Test configuration file, optionally add examples, ### New APIs & changes - new [`testCase.repeatEachIndex`](./api/class-testcase#test-case-repeat-each-index) API -- new [option fixtures](./test-fixtures#fixtures-options) - [`acceptDownloads`](./api/class-browser#browser-new-context-option-accept-downloads) option now defaults to `true` +### Breaking change: custom config options + +Custom config options are a convenient way to parametrize projects with different values. Learn more in [this guide](./test-parameterize#parameterized-projects). + +Previously, any fixture introduced through [`method: Test.extend`] could be overridden in the [`property: TestProject.use`] config section. For example, + +```js +// WRONG: THIS SNIPPET DOES NOT WORK SINCE v1.18. + +// fixtures.js +const test = base.extend({ + myParameter: 'default', +}); + +// playwright.config.js +module.exports = { + use: { + myParameter: 'value', + }, +}; +``` + +The proper way to make a fixture parametrized in the config file is to specify `option: true` when defining the fixture. For example, + +```js +// CORRECT: THIS SNIPPET WORKS SINCE v1.18. + +// fixtures.js +const test = base.extend({ + // Fixtures marked as "option: true" will get a value specified in the config, + // or fallback to the default value. + myParameter: ['default', { option: true }], +}); + +// playwright.config.js +module.exports = { + use: { + myParameter: 'value', + }, +}; +``` + ### Browser Versions - Chromium 99.0.4812.0 @@ -447,8 +488,8 @@ import { PlaywrightTestConfig } from '@playwright/test'; const config: PlaywrightTestConfig = { webServer: { command: 'npm run start', // command to launch - port: 3000, // port to await for - timeout: 120 * 1000, + port: 3000, // port to await for + timeout: 120 * 1000, reuseExistingServer: !process.env.CI, }, }; diff --git a/docs/src/test-fixtures-js.md b/docs/src/test-fixtures-js.md index e0b49da3d5f0e..ab401fd49f4c6 100644 --- a/docs/src/test-fixtures-js.md +++ b/docs/src/test-fixtures-js.md @@ -468,6 +468,10 @@ export { expect } from '@playwright/test'; ## Fixtures-options +:::note +Overriding custom fixtures in the config file has changed in version 1.18. [Learn more](./release-notes#breaking-change-custom-config-options). +::: + Playwright Test supports running multiple test projects that can be separately configured. You can use "option" fixtures to make your configuration options declarative and type-checked. Learn more about [parametrizing tests](./test-parameterize.md). Below we'll create a `defaultItem` option in addition to the `todoPage` fixture from other examples. This option will be set in configuration file. Note the tuple syntax and `{ option: true }` argument. diff --git a/docs/src/test-parameterize-js.md b/docs/src/test-parameterize-js.md index c2fc16fd8c3db..f356ff08d5567 100644 --- a/docs/src/test-parameterize-js.md +++ b/docs/src/test-parameterize-js.md @@ -177,3 +177,7 @@ export const test = base.test.extend({ }, }); ``` + +:::note +Parametrized projects behavior has changed in version 1.18. [Learn more](./release-notes#breaking-change-custom-config-options). +::: From e7bd62f20250be82e8860b97af235d9cfefb4cd6 Mon Sep 17 00:00:00 2001 From: Yury Semikhatsky Date: Tue, 1 Feb 2022 14:45:30 -0800 Subject: [PATCH 176/233] docs(electron): minimal version (#11792) --- docs/src/api/class-electron.md | 5 +++++ packages/playwright-core/types/types.d.ts | 4 ++++ 2 files changed, 9 insertions(+) diff --git a/docs/src/api/class-electron.md b/docs/src/api/class-electron.md index a9ddb29f8dfb7..c17c84957ef0f 100644 --- a/docs/src/api/class-electron.md +++ b/docs/src/api/class-electron.md @@ -45,6 +45,11 @@ Note that since you don't need Playwright to install web browsers when testing E PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD=1 npm i -D playwright ``` +**Supported Electron versions are:** +* v12.2.0+ +* v13.4.0+ +* v14+ + ## async method: Electron.launch - returns: <[ElectronApplication]> diff --git a/packages/playwright-core/types/types.d.ts b/packages/playwright-core/types/types.d.ts index c14846d98567f..0870e8a6cc21f 100644 --- a/packages/playwright-core/types/types.d.ts +++ b/packages/playwright-core/types/types.d.ts @@ -13397,6 +13397,10 @@ export interface Download { * PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD=1 npm i -D playwright * ``` * + * **Supported Electron versions are:** + * - v12.2.0+ + * - v13.4.0+ + * - v14+ */ export interface Electron { /** From 011d743f90573aeae41b9f4f16a56f01bd07d75a Mon Sep 17 00:00:00 2001 From: Pavel Feldman Date: Tue, 1 Feb 2022 15:34:09 -0800 Subject: [PATCH 177/233] chore: roll test runner to ToT (#11796) --- .../stable-test-runner/package-lock.json | 1386 +++++++++-------- .../stable-test-runner/package.json | 2 +- 2 files changed, 758 insertions(+), 630 deletions(-) diff --git a/tests/playwright-test/stable-test-runner/package-lock.json b/tests/playwright-test/stable-test-runner/package-lock.json index e89723d2873b0..b3175a957ec4f 100644 --- a/tests/playwright-test/stable-test-runner/package-lock.json +++ b/tests/playwright-test/stable-test-runner/package-lock.json @@ -5,42 +5,42 @@ "packages": { "": { "dependencies": { - "@playwright/test": "1.19.0-alpha-1642473215000" + "@playwright/test": "1.19.0-alpha-1643749494000" } }, "node_modules/@babel/code-frame": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz", - "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", + "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", "dependencies": { - "@babel/highlight": "^7.14.5" + "@babel/highlight": "^7.16.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/compat-data": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.14.7.tgz", - "integrity": "sha512-nS6dZaISCXJ3+518CWiBfEr//gHyMO02uDxBkXTKZDN5POruCnOZ1N4YBRZDCabwF8nZMWBpRxIicmXtBs+fvw==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.16.8.tgz", + "integrity": "sha512-m7OkX0IdKLKPpBlJtF561YJal5y/jyI5fNfWbPxh2D/nbzzGI4qRyrD8xO2jB24u7l+5I2a43scCG2IrfjC50Q==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.14.8.tgz", - "integrity": "sha512-/AtaeEhT6ErpDhInbXmjHcUQXH0L0TEgscfcxk1qbOvLuKCa5aZT0SOOtDKFY96/CLROwbLSKyFor6idgNaU4Q==", - "dependencies": { - "@babel/code-frame": "^7.14.5", - "@babel/generator": "^7.14.8", - "@babel/helper-compilation-targets": "^7.14.5", - "@babel/helper-module-transforms": "^7.14.8", - "@babel/helpers": "^7.14.8", - "@babel/parser": "^7.14.8", - "@babel/template": "^7.14.5", - "@babel/traverse": "^7.14.8", - "@babel/types": "^7.14.8", + "version": "7.16.12", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.16.12.tgz", + "integrity": "sha512-dK5PtG1uiN2ikk++5OzSYsitZKny4wOCD0nrO4TqnW4BVBTQ2NGS3NgilvT/TEyxTST7LNyWV/T4tXDoD3fOgg==", + "dependencies": { + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.16.8", + "@babel/helper-compilation-targets": "^7.16.7", + "@babel/helper-module-transforms": "^7.16.7", + "@babel/helpers": "^7.16.7", + "@babel/parser": "^7.16.12", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.16.10", + "@babel/types": "^7.16.8", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -50,14 +50,18 @@ }, "engines": { "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" } }, "node_modules/@babel/generator": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.8.tgz", - "integrity": "sha512-cYDUpvIzhBVnMzRoY1fkSEhK/HmwEVwlyULYgn/tMQYd6Obag3ylCjONle3gdErfXBW61SVTlR9QR7uWlgeIkg==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.8.tgz", + "integrity": "sha512-1ojZwE9+lOXzcWdWmO6TbUzDfqLD39CmEhN8+2cX9XkDo5yW1OpgfejfliysR2AWLpMamTiOiAp/mtroaymhpw==", "dependencies": { - "@babel/types": "^7.14.8", + "@babel/types": "^7.16.8", "jsesc": "^2.5.1", "source-map": "^0.5.0" }, @@ -66,222 +70,241 @@ } }, "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.0.tgz", - "integrity": "sha512-ItmYF9vR4zA8cByDocY05o0LGUkp1zhbTQOH1NFyl5xXEqlTJQCEJjieriw+aFpxo16swMxUnUiKS7a/r4vtHg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz", + "integrity": "sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==", "dependencies": { - "@babel/types": "^7.16.0" + "@babel/types": "^7.16.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.14.5.tgz", - "integrity": "sha512-v+QtZqXEiOnpO6EYvlImB6zCD2Lel06RzOPzmkz/D/XgQiUu3C/Jb1LOqSt/AIA34TYi/Q+KlT8vTQrgdxkbLw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.7.tgz", + "integrity": "sha512-mGojBwIWcwGD6rfqgRXVlVYmPAv7eOpIemUG3dGnDdCY4Pae70ROij3XmfrH6Fa1h1aiDylpglbZyktfzyo/hA==", "dependencies": { - "@babel/compat-data": "^7.14.5", - "@babel/helper-validator-option": "^7.14.5", - "browserslist": "^4.16.6", + "@babel/compat-data": "^7.16.4", + "@babel/helper-validator-option": "^7.16.7", + "browserslist": "^4.17.5", "semver": "^6.3.0" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.14.8.tgz", - "integrity": "sha512-bpYvH8zJBWzeqi1o+co8qOrw+EXzQ/0c74gVmY205AWXy9nifHrOg77y+1zwxX5lXE7Icq4sPlSQ4O2kWBrteQ==", + "version": "7.16.10", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.16.10.tgz", + "integrity": "sha512-wDeej0pu3WN/ffTxMNCPW5UCiOav8IcLRxSIyp/9+IF2xJUM9h/OYjg0IJLHaL6F8oU8kqMz9nc1vryXhMsgXg==", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.14.5", - "@babel/helper-function-name": "^7.14.5", - "@babel/helper-member-expression-to-functions": "^7.14.7", - "@babel/helper-optimise-call-expression": "^7.14.5", - "@babel/helper-replace-supers": "^7.14.5", - "@babel/helper-split-export-declaration": "^7.14.5" + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-member-expression-to-functions": "^7.16.7", + "@babel/helper-optimise-call-expression": "^7.16.7", + "@babel/helper-replace-supers": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz", + "integrity": "sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag==", + "dependencies": { + "@babel/types": "^7.16.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-function-name": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.5.tgz", - "integrity": "sha512-Gjna0AsXWfFvrAuX+VKcN/aNNWonizBj39yGwUzVDVTlMYJMK2Wp6xdpy72mfArFq5uK+NOuexfzZlzI1z9+AQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz", + "integrity": "sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA==", "dependencies": { - "@babel/helper-get-function-arity": "^7.14.5", - "@babel/template": "^7.14.5", - "@babel/types": "^7.14.5" + "@babel/helper-get-function-arity": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/types": "^7.16.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-get-function-arity": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.14.5.tgz", - "integrity": "sha512-I1Db4Shst5lewOM4V+ZKJzQ0JGGaZ6VY1jYvMghRjqs6DWgxLCIyFt30GlnKkfUeFLpJt2vzbMVEXVSXlIFYUg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz", + "integrity": "sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw==", "dependencies": { - "@babel/types": "^7.14.5" + "@babel/types": "^7.16.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-hoist-variables": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.14.5.tgz", - "integrity": "sha512-R1PXiz31Uc0Vxy4OEOm07x0oSjKAdPPCh3tPivn/Eo8cvz6gveAeuyUUPB21Hoiif0uoPQSSdhIPS3352nvdyQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz", + "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==", "dependencies": { - "@babel/types": "^7.14.5" + "@babel/types": "^7.16.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.14.7.tgz", - "integrity": "sha512-TMUt4xKxJn6ccjcOW7c4hlwyJArizskAhoSTOCkA0uZ+KghIaci0Qg9R043kUMWI9mtQfgny+NQ5QATnZ+paaA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.7.tgz", + "integrity": "sha512-VtJ/65tYiU/6AbMTDwyoXGPKHgTsfRarivm+YbB5uAzKUyuPjgZSgAFeG87FCigc7KNHu2Pegh1XIT3lXjvz3Q==", "dependencies": { - "@babel/types": "^7.14.5" + "@babel/types": "^7.16.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.0.tgz", - "integrity": "sha512-kkH7sWzKPq0xt3H1n+ghb4xEMP8k0U7XV3kkB+ZGy69kDk2ySFW1qPi06sjKzFY3t1j6XbJSqr4mF9L7CYVyhg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", + "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==", "dependencies": { - "@babel/types": "^7.16.0" + "@babel/types": "^7.16.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.14.8.tgz", - "integrity": "sha512-RyE+NFOjXn5A9YU1dkpeBaduagTlZ0+fccnIcAGbv1KGUlReBj7utF7oEth8IdIBQPcux0DDgW5MFBH2xu9KcA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.7.tgz", + "integrity": "sha512-gaqtLDxJEFCeQbYp9aLAefjhkKdjKcdh6DB7jniIGU3Pz52WAmP268zK0VgPz9hUNkMSYeH976K2/Y6yPadpng==", "dependencies": { - "@babel/helper-module-imports": "^7.14.5", - "@babel/helper-replace-supers": "^7.14.5", - "@babel/helper-simple-access": "^7.14.8", - "@babel/helper-split-export-declaration": "^7.14.5", - "@babel/helper-validator-identifier": "^7.14.8", - "@babel/template": "^7.14.5", - "@babel/traverse": "^7.14.8", - "@babel/types": "^7.14.8" + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-module-imports": "^7.16.7", + "@babel/helper-simple-access": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/helper-validator-identifier": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.16.7", + "@babel/types": "^7.16.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.14.5.tgz", - "integrity": "sha512-IqiLIrODUOdnPU9/F8ib1Fx2ohlgDhxnIDU7OEVi+kAbEZcyiF7BLU8W6PfvPi9LzztjS7kcbzbmL7oG8kD6VA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.7.tgz", + "integrity": "sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w==", "dependencies": { - "@babel/types": "^7.14.5" + "@babel/types": "^7.16.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.5.tgz", - "integrity": "sha512-59KHWHXxVA9K4HNF4sbHCf+eJeFe0Te/ZFGqBT4OjXhrwvA04sGfaEGsVTdsjoszq0YTP49RC9UKe5g8uN2RwQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", + "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.14.5.tgz", - "integrity": "sha512-3i1Qe9/8x/hCHINujn+iuHy+mMRLoc77b2nI9TB0zjH1hvn9qGlXjWlggdwUcju36PkPCy/lpM7LLUdcTyH4Ow==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.7.tgz", + "integrity": "sha512-y9vsWilTNaVnVh6xiJfABzsNpgDPKev9HnAgz6Gb1p6UUwf9NepdlsV7VXGCftJM+jqD5f7JIEubcpLjZj5dBw==", "dependencies": { - "@babel/helper-member-expression-to-functions": "^7.14.5", - "@babel/helper-optimise-call-expression": "^7.14.5", - "@babel/traverse": "^7.14.5", - "@babel/types": "^7.14.5" + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-member-expression-to-functions": "^7.16.7", + "@babel/helper-optimise-call-expression": "^7.16.7", + "@babel/traverse": "^7.16.7", + "@babel/types": "^7.16.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-simple-access": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.14.8.tgz", - "integrity": "sha512-TrFN4RHh9gnWEU+s7JloIho2T76GPwRHhdzOWLqTrMnlas8T9O7ec+oEDNsRXndOmru9ymH9DFrEOxpzPoSbdg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.7.tgz", + "integrity": "sha512-ZIzHVyoeLMvXMN/vok/a4LWRy8G2v205mNP0XOuf9XRLyX5/u9CnVulUtDgUTama3lT+bf/UqucuZjqiGuTS1g==", "dependencies": { - "@babel/types": "^7.14.8" + "@babel/types": "^7.16.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.14.5.tgz", - "integrity": "sha512-dmqZB7mrb94PZSAOYtr+ZN5qt5owZIAgqtoTuqiFbHFtxgEcmQlRJVI+bO++fciBunXtB6MK7HrzrfcAzIz2NQ==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz", + "integrity": "sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw==", "dependencies": { - "@babel/types": "^7.14.5" + "@babel/types": "^7.16.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-split-export-declaration": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.14.5.tgz", - "integrity": "sha512-hprxVPu6e5Kdp2puZUmvOGjaLv9TCe58E/Fl6hRq4YiVQxIcNvuq6uTM2r1mT/oPskuS9CgR+I94sqAYv0NGKA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", + "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", "dependencies": { - "@babel/types": "^7.14.5" + "@babel/types": "^7.16.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.15.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", - "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz", - "integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz", + "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.14.8.tgz", - "integrity": "sha512-ZRDmI56pnV+p1dH6d+UN6GINGz7Krps3+270qqI9UJ4wxYThfAIcI5i7j5vXC4FJ3Wap+S9qcebxeYiqn87DZw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.16.7.tgz", + "integrity": "sha512-9ZDoqtfY7AuEOt3cxchfii6C7GDyyMBffktR5B2jvWv8u2+efwvpnVKXMWzNehqy68tKgAfSwfdw/lWpthS2bw==", "dependencies": { - "@babel/template": "^7.14.5", - "@babel/traverse": "^7.14.8", - "@babel/types": "^7.14.8" + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.16.7", + "@babel/types": "^7.16.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", - "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", + "version": "7.16.10", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz", + "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==", "dependencies": { - "@babel/helper-validator-identifier": "^7.14.5", + "@babel/helper-validator-identifier": "^7.16.7", "chalk": "^2.0.0", "js-tokens": "^4.0.0" }, @@ -290,9 +313,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.8.tgz", - "integrity": "sha512-syoCQFOoo/fzkWDeM0dLEZi5xqurb5vuyzwIMNZRNun+N/9A4cUZeQaE7dTrB8jGaKuJRBtEOajtnmw0I5hvvA==", + "version": "7.16.12", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.12.tgz", + "integrity": "sha512-VfaV15po8RiZssrkPweyvbGVSe4x2y+aciFCgn0n0/SJMR22cwofRV1mtnJQYcSB1wUTaA/X1LnA3es66MCO5A==", "bin": { "parser": "bin/babel-parser.js" }, @@ -301,114 +324,141 @@ } }, "node_modules/@babel/plugin-proposal-class-properties": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.14.5.tgz", - "integrity": "sha512-q/PLpv5Ko4dVc1LYMpCY7RVAAO4uk55qPwrIuJ5QJ8c6cVuAmhu7I/49JOppXL6gXf7ZHzpRVEUZdYoPLM04Gg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.7.tgz", + "integrity": "sha512-IobU0Xme31ewjYOShSIqd/ZGM/r/cuOz2z0MDbNrhF5FW+ZVgi0f2lyeoj9KFPDOAqsYxmLWZte1WOwlvY9aww==", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-create-class-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-proposal-dynamic-import": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.14.5.tgz", - "integrity": "sha512-ExjiNYc3HDN5PXJx+bwC50GIx/KKanX2HiggnIUAYedbARdImiCU4RhhHfdf0Kd7JNXGpsBBBCOm+bBVy3Gb0g==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.7.tgz", + "integrity": "sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-dynamic-import": "^7.8.3" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-proposal-export-namespace-from": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.14.5.tgz", - "integrity": "sha512-g5POA32bXPMmSBu5Dx/iZGLGnKmKPc5AiY7qfZgurzrCYgIztDlHFbznSNCoQuv57YQLnQfaDi7dxCtLDIdXdA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.7.tgz", + "integrity": "sha512-ZxdtqDXLRGBL64ocZcs7ovt71L3jhC1RGSyR996svrCi3PYqHNkb3SwPJCs8RIzD86s+WPpt2S73+EHCGO+NUA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.14.5.tgz", - "integrity": "sha512-YGn2AvZAo9TwyhlLvCCWxD90Xq8xJ4aSgaX3G5D/8DW94L8aaT+dS5cSP+Z06+rCJERGSr9GxMBZ601xoc2taw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.7.tgz", + "integrity": "sha512-K3XzyZJGQCr00+EtYtrDjmwX7o7PLK6U9bi1nCwkQioRFVUv6dJoxbQjtWVtP+bCPy82bONBKG8NPyQ4+i6yjg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.14.5.tgz", - "integrity": "sha512-gun/SOnMqjSb98Nkaq2rTKMwervfdAoz6NphdY0vTfuzMfryj+tDGb2n6UkDKwez+Y8PZDhE3D143v6Gepp4Hg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.7.tgz", + "integrity": "sha512-aUOrYU3EVtjf62jQrCj63pYZ7k6vns2h/DQvHPWGmsJRYzWXZ6/AsfgpiRy6XiuIDADhJzP2Q9MwSMKauBQ+UQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-proposal-numeric-separator": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.14.5.tgz", - "integrity": "sha512-yiclALKe0vyZRZE0pS6RXgjUOt87GWv6FYa5zqj15PvhOGFO69R5DusPlgK/1K5dVnCtegTiWu9UaBSrLLJJBg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.7.tgz", + "integrity": "sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-numeric-separator": "^7.10.4" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-proposal-optional-chaining": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.14.5.tgz", - "integrity": "sha512-ycz+VOzo2UbWNI1rQXxIuMOzrDdHGrI23fRiz/Si2R4kv2XZQ1BK8ccdHwehMKBlcH/joGW/tzrUmo67gbJHlQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.7.tgz", + "integrity": "sha512-eC3xy+ZrUcBtP7x+sq62Q/HYd674pPTb/77XZMb5wbDPGWIdUbSr4Agr052+zaUPSb+gGRnjxXfKFvx5iMJ+DA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.14.5", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", "@babel/plugin-syntax-optional-chaining": "^7.8.3" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-proposal-private-methods": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.14.5.tgz", - "integrity": "sha512-838DkdUA1u+QTCplatfq4B7+1lnDa/+QMI89x5WZHBcnNv+47N8QEj2k9I2MUU9xIv8XJ4XvPCviM/Dj7Uwt9g==", + "version": "7.16.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.11.tgz", + "integrity": "sha512-F/2uAkPlXDr8+BHpZvo19w3hLFKge+k75XUprE6jaqKxjGkSYcK+4c+bup5PdW/7W/Rpjwql7FTVEDW+fRAQsw==", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-create-class-features-plugin": "^7.16.10", + "@babel/helper-plugin-utils": "^7.16.7" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-proposal-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-62EyfyA3WA0mZiF2e2IV9mc9Ghwxcg8YTu8BS4Wss4Y3PY725OmS9M0qLORbJwLqFtGh+jiE4wAmocK2CTUK2Q==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.7.tgz", + "integrity": "sha512-rMQkjcOFbm+ufe3bTZLyOfsOUOxyvLXZJCTARhJr+8UMSoZmqTe1K1BgkFcrW37rAchWg57yI69ORxiWvUINuQ==", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.14.5", - "@babel/helper-create-class-features-plugin": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-create-class-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-private-property-in-object": "^7.14.5" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-async-generators": { @@ -425,6 +475,9 @@ "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-export-namespace-from": { @@ -433,6 +486,9 @@ "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", "dependencies": { "@babel/helper-plugin-utils": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-json-strings": { @@ -444,11 +500,11 @@ } }, "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.16.5.tgz", - "integrity": "sha512-42OGssv9NPk4QHKVgIHlzeLgPOW5rGgfV5jzG90AhcXXIv6hu/eqj63w4VgvRxdvZY3AlYeDgPiSJ3BqAd1Y6Q==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.16.7.tgz", + "integrity": "sha512-Esxmk7YjA8QysKeT3VhTXvF6y77f/a91SIs4pWb4H2eWGQkCKFgQaG6hdoEVZtGsrAcb2K5BW66XsOErD4WU3Q==", "dependencies": { - "@babel/helper-plugin-utils": "^7.16.5" + "@babel/helper-plugin-utils": "^7.16.7" }, "engines": { "node": ">=6.9.0" @@ -463,6 +519,9 @@ "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { @@ -471,6 +530,9 @@ "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-numeric-separator": { @@ -479,6 +541,9 @@ "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-object-rest-spread": { @@ -503,6 +568,9 @@ "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-private-property-in-object": { @@ -514,43 +582,52 @@ }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.14.5.tgz", - "integrity": "sha512-u6OXzDaIXjEstBRRoBCQ/uKQKlbuaeE5in0RvWdA4pN6AhqxTIwUsnHPU1CFZA/amYObMsuWhYfRl3Ch90HD0Q==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.16.7.tgz", + "integrity": "sha512-YhUIJHHGkqPgEcMYkPCKTyGUdoGKWtopIycQyjJH8OjvRgOYsXsaKehLVPScKJWAULPxMa4N1vCe6szREFlZ7A==", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.7" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.14.5.tgz", - "integrity": "sha512-en8GfBtgnydoao2PS+87mKyw62k02k7kJ9ltbKe0fXTHrQmG6QZZflYuGI1VVG7sVpx4E1n7KBpNlPb8m78J+A==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.16.8.tgz", + "integrity": "sha512-oflKPvsLT2+uKQopesJt3ApiaIS2HW+hzHFcwRNtyDGieAeC/dIHZX8buJQ2J2X1rxGPy4eRcUijm3qcSPjYcA==", "dependencies": { - "@babel/helper-module-transforms": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-simple-access": "^7.14.5", + "@babel/helper-module-transforms": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-simple-access": "^7.16.7", "babel-plugin-dynamic-import-node": "^2.3.3" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.16.5.tgz", - "integrity": "sha512-+arLIz1d7kmwX0fKxTxbnoeG85ONSnLpvdODa4P3pc1sS7CV1hfmtYWufkW/oYsPnkDrEeQFxhUWcFnrXW7jQQ==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.16.0", - "@babel/helper-module-imports": "^7.16.0", - "@babel/helper-plugin-utils": "^7.16.5", - "@babel/plugin-syntax-jsx": "^7.16.5", - "@babel/types": "^7.16.0" + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.16.7.tgz", + "integrity": "sha512-8D16ye66fxiE8m890w0BpPpngG9o9OVBBy0gH2E+2AR7qMR2ZpTYJEqLxAsoroenMId0p/wMW+Blc0meDgu0Ag==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-module-imports": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-jsx": "^7.16.7", + "@babel/types": "^7.16.7" }, "engines": { "node": ">=6.9.0" @@ -560,56 +637,63 @@ } }, "node_modules/@babel/plugin-transform-typescript": { - "version": "7.14.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.14.6.tgz", - "integrity": "sha512-XlTdBq7Awr4FYIzqhmYY80WN0V0azF74DMPyFqVHBvf81ZUgc4X7ZOpx6O8eLDK6iM5cCQzeyJw0ynTaefixRA==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.16.8.tgz", + "integrity": "sha512-bHdQ9k7YpBDO2d0NVfkj51DpQcvwIzIusJ7mEUaMlbZq3Kt/U47j24inXZHQ5MDiYpCs+oZiwnXyKedE8+q7AQ==", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.14.6", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/plugin-syntax-typescript": "^7.14.5" + "@babel/helper-create-class-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-typescript": "^7.16.7" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/preset-typescript": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.14.5.tgz", - "integrity": "sha512-u4zO6CdbRKbS9TypMqrlGH7sd2TAJppZwn3c/ZRLeO/wGsbddxgbPDUZVNrie3JWYLQ9vpineKlsrWFvO6Pwkw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.16.7.tgz", + "integrity": "sha512-WbVEmgXdIyvzB77AQjGBEyYPZx+8tTsO50XtfozQrkW8QB2rLJpH2lgx0TRw5EJrBxOZQ+wCcyPVQvS8tjEHpQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-validator-option": "^7.14.5", - "@babel/plugin-transform-typescript": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-validator-option": "^7.16.7", + "@babel/plugin-transform-typescript": "^7.16.7" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/template": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.14.5.tgz", - "integrity": "sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", + "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", "dependencies": { - "@babel/code-frame": "^7.14.5", - "@babel/parser": "^7.14.5", - "@babel/types": "^7.14.5" + "@babel/code-frame": "^7.16.7", + "@babel/parser": "^7.16.7", + "@babel/types": "^7.16.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.8.tgz", - "integrity": "sha512-kexHhzCljJcFNn1KYAQ6A5wxMRzq9ebYpEDV4+WdNyr3i7O44tanbDOR/xjiG2F3sllan+LgwK+7OMk0EmydHg==", - "dependencies": { - "@babel/code-frame": "^7.14.5", - "@babel/generator": "^7.14.8", - "@babel/helper-function-name": "^7.14.5", - "@babel/helper-hoist-variables": "^7.14.5", - "@babel/helper-split-export-declaration": "^7.14.5", - "@babel/parser": "^7.14.8", - "@babel/types": "^7.14.8", + "version": "7.16.10", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.10.tgz", + "integrity": "sha512-yzuaYXoRJBGMlBhsMJoUW7G1UmSb/eXr/JHYM/MsOJgavJibLwASijW7oXBdw3NQ6T0bW7Ty5P/VarOs9cHmqw==", + "dependencies": { + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.16.8", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-hoist-variables": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/parser": "^7.16.10", + "@babel/types": "^7.16.8", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -618,11 +702,11 @@ } }, "node_modules/@babel/types": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.0.tgz", - "integrity": "sha512-PJgg/k3SdLsGb3hhisFvtLOw5ts113klrpLuIPtCJIU+BB24fqq6lf8RWqKJEjzqXR9AEH1rIb5XTqwBHB+kQg==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.8.tgz", + "integrity": "sha512-smN2DQc5s4M7fntyjGtyIPbRJv6wW4rU/94fmYJ7PKQuZkC0qGMHXJbg6sNGt12JmVr4k5YaptI/XtiLJBnmIg==", "dependencies": { - "@babel/helper-validator-identifier": "^7.15.7", + "@babel/helper-validator-identifier": "^7.16.7", "to-fast-properties": "^2.0.0" }, "engines": { @@ -709,47 +793,47 @@ } }, "node_modules/@playwright/test": { - "version": "1.19.0-alpha-1642473215000", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.19.0-alpha-1642473215000.tgz", - "integrity": "sha512-BNwM/DnTHIVDVu5p7knp/3HsdvRrhtRsBUKFVcJe0ohDksEiGohu/XI4ZtZor/3/JJsmd8VDs2lAQQkn8/DRPA==", - "dependencies": { - "@babel/code-frame": "^7.14.5", - "@babel/core": "^7.14.8", - "@babel/plugin-proposal-class-properties": "^7.14.5", - "@babel/plugin-proposal-dynamic-import": "^7.14.5", - "@babel/plugin-proposal-export-namespace-from": "^7.14.5", - "@babel/plugin-proposal-logical-assignment-operators": "^7.14.5", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.14.5", - "@babel/plugin-proposal-numeric-separator": "^7.14.5", - "@babel/plugin-proposal-optional-chaining": "^7.14.5", - "@babel/plugin-proposal-private-methods": "^7.14.5", - "@babel/plugin-proposal-private-property-in-object": "^7.14.5", + "version": "1.19.0-alpha-1643749494000", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.19.0-alpha-1643749494000.tgz", + "integrity": "sha512-CrmItYmF2qRC7Y6EVKSwmH+AU70IRO0W6nhBVc7iKXMkHy4K3o41U/K0CRquFrwpjqn1LikPqFqhMh+bGuBgGw==", + "dependencies": { + "@babel/code-frame": "^7.16.7", + "@babel/core": "^7.16.12", + "@babel/plugin-proposal-class-properties": "^7.16.7", + "@babel/plugin-proposal-dynamic-import": "^7.16.7", + "@babel/plugin-proposal-export-namespace-from": "^7.16.7", + "@babel/plugin-proposal-logical-assignment-operators": "^7.16.7", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.7", + "@babel/plugin-proposal-numeric-separator": "^7.16.7", + "@babel/plugin-proposal-optional-chaining": "^7.16.7", + "@babel/plugin-proposal-private-methods": "^7.16.11", + "@babel/plugin-proposal-private-property-in-object": "^7.16.7", "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-json-strings": "^7.8.3", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-transform-modules-commonjs": "^7.14.5", - "@babel/plugin-transform-react-jsx": "^7.14.5", - "@babel/preset-typescript": "^7.14.5", + "@babel/plugin-transform-modules-commonjs": "^7.16.8", + "@babel/plugin-transform-react-jsx": "^7.16.7", + "@babel/preset-typescript": "^7.16.7", "babel-plugin-module-resolver": "^4.1.0", "colors": "1.4.0", - "commander": "^8.2.0", - "debug": "^4.1.1", + "commander": "^8.3.0", + "debug": "^4.3.3", "expect": "=27.2.5", "jest-matcher-utils": "=27.2.5", - "jpeg-js": "^0.4.2", + "jpeg-js": "^0.4.3", "json5": "^2.2.0", - "mime": "^2.4.6", - "minimatch": "^3.0.3", - "ms": "^2.1.2", - "open": "^8.3.0", - "pirates": "^4.0.1", + "mime": "^3.0.0", + "minimatch": "^3.0.4", + "ms": "^2.1.3", + "open": "^8.4.0", + "pirates": "=4.0.4", "pixelmatch": "^5.2.1", - "playwright-core": "=1.19.0-alpha-1642473215000", - "pngjs": "^5.0.0", + "playwright-core": "=1.19.0-alpha-1643749494000", + "pngjs": "^6.0.0", "rimraf": "^3.0.2", - "source-map-support": "^0.4.18", - "stack-utils": "^2.0.3", + "source-map-support": "^0.5.21", + "stack-utils": "^2.0.5", "yazl": "^2.5.1" }, "bin": { @@ -891,21 +975,25 @@ } }, "node_modules/browserslist": { - "version": "4.16.6", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz", - "integrity": "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==", + "version": "4.19.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.19.1.tgz", + "integrity": "sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A==", "dependencies": { - "caniuse-lite": "^1.0.30001219", - "colorette": "^1.2.2", - "electron-to-chromium": "^1.3.723", + "caniuse-lite": "^1.0.30001286", + "electron-to-chromium": "^1.4.17", "escalade": "^3.1.1", - "node-releases": "^1.1.71" + "node-releases": "^2.0.1", + "picocolors": "^1.0.0" }, "bin": { "browserslist": "cli.js" }, "engines": { "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" } }, "node_modules/buffer-crc32": { @@ -916,6 +1004,11 @@ "node": "*" } }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, "node_modules/call-bind": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", @@ -923,12 +1016,19 @@ "dependencies": { "function-bind": "^1.1.1", "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/caniuse-lite": { - "version": "1.0.30001248", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001248.tgz", - "integrity": "sha512-NwlQbJkxUFJ8nMErnGtT0QTM2TJ33xgz4KXJSMIrjXIbDVdaYueGyjOrLKRtJC+rTiWfi6j5cnZN1NBiSBJGNw==" + "version": "1.0.30001304", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001304.tgz", + "integrity": "sha512-bdsfZd6K6ap87AGqSHJP/s1V+U6Z5lyrcbBu3ovbCCf8cSYpwTtGrCBObMpJqwxfTbLW6YTIdbb1jEeTelcpYQ==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + } }, "node_modules/chalk": { "version": "2.4.2", @@ -956,11 +1056,6 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" }, - "node_modules/colorette": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", - "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==" - }, "node_modules/colors": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", @@ -991,14 +1086,19 @@ } }, "node_modules/debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", "dependencies": { "ms": "2.1.2" }, "engines": { "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, "node_modules/debug/node_modules/ms": { @@ -1034,9 +1134,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.3.790", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.790.tgz", - "integrity": "sha512-epMH/S2MkhBv+Y0+nHK8dC7bzmOaPwcmiYqt+VwxSUJLgPzkqZnGUEQ8eVhy5zGmgWm9tDDdXkHDzOEsVU979A==" + "version": "1.4.60", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.60.tgz", + "integrity": "sha512-h53hbEiKC6hijelDgxgkgAUC3PKyR7TmIfvjHnBjUGPMg/3sBuTyG6eDormw+lY24uUJvHkUPzB8dpK8b2u3Sw==" }, "node_modules/end-of-stream": { "version": "1.4.4", @@ -1184,6 +1284,9 @@ "function-bind": "^1.1.1", "has": "^1.0.3", "has-symbols": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/get-stream": { @@ -1257,6 +1360,9 @@ "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/https-proxy-agent": { @@ -1649,14 +1755,14 @@ } }, "node_modules/mime": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", - "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", + "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", "bin": { "mime": "cli.js" }, "engines": { - "node": ">=4.0.0" + "node": ">=10.0.0" } }, "node_modules/minimatch": { @@ -1680,18 +1786,10 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, - "node_modules/node-modules-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", - "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/node-releases": { - "version": "1.1.73", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.73.tgz", - "integrity": "sha512-uW7fodD6pyW2FZNZnp/Z3hvWKeEW1Y8R1+1CnErE8cXFXzl5blBOoVB41CvMer6P6Q0S5FXDwcHgFd1Wj0U9zg==" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.1.tgz", + "integrity": "sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==" }, "node_modules/object-keys": { "version": "1.1.1", @@ -1713,6 +1811,9 @@ }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/once": { @@ -1724,9 +1825,9 @@ } }, "node_modules/open": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/open/-/open-8.3.0.tgz", - "integrity": "sha512-7INcPWb1UcOwSQxAXTnBJ+FxVV4MPs/X++FWWBtgY69/J5lc+tCteMt/oFK1MnkyHC4VILLa9ntmwKTwDR4Q9w==", + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", + "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", "dependencies": { "define-lazy-prop": "^2.0.0", "is-docker": "^2.1.1", @@ -1798,6 +1899,11 @@ "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=" }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, "node_modules/picomatch": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", @@ -1810,12 +1916,9 @@ } }, "node_modules/pirates": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", - "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", - "dependencies": { - "node-modules-regexp": "^1.0.0" - }, + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.4.tgz", + "integrity": "sha512-ZIrVPH+A52Dw84R0L3/VS9Op04PuQ2SEoJL6bkshmiTic/HldyW9Tf7oH5mhJZBK7NmDx27vSMrYEXPXclpDKw==", "engines": { "node": ">= 6" } @@ -1851,24 +1954,24 @@ } }, "node_modules/playwright-core": { - "version": "1.19.0-alpha-1642473215000", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.19.0-alpha-1642473215000.tgz", - "integrity": "sha512-ecBvWOF7ts2d5JJs/voA7ImugrlK9OGr/lG6a96xPjCqKdudAh4BCIHfUrcYARs/gyHpYg/EgCMquROg6aR7Xg==", + "version": "1.19.0-alpha-1643749494000", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.19.0-alpha-1643749494000.tgz", + "integrity": "sha512-7po9hAGNpqwAESGbXw7XRT3FUXhSB+V7LV92pF6gF4J7PVlgPt24oCgrX+dDB2d+ZbMg5/S6bYT6BTRL8pe08Q==", "dependencies": { - "commander": "^8.2.0", - "debug": "^4.1.1", + "commander": "^8.3.0", + "debug": "^4.3.3", "extract-zip": "^2.0.1", "https-proxy-agent": "^5.0.0", - "jpeg-js": "^0.4.2", - "mime": "^2.4.6", - "pngjs": "^5.0.0", + "jpeg-js": "^0.4.3", + "mime": "^3.0.0", + "pngjs": "^6.0.0", "progress": "^2.0.3", - "proper-lockfile": "^4.1.1", + "proper-lockfile": "^4.1.2", "proxy-from-env": "^1.1.0", "rimraf": "^3.0.2", - "socks-proxy-agent": "^6.1.0", - "stack-utils": "^2.0.3", - "ws": "^7.4.6", + "socks-proxy-agent": "^6.1.1", + "stack-utils": "^2.0.5", + "ws": "^8.4.2", "yauzl": "^2.10.0", "yazl": "^2.5.1" }, @@ -1880,11 +1983,11 @@ } }, "node_modules/pngjs": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-5.0.0.tgz", - "integrity": "sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-6.0.0.tgz", + "integrity": "sha512-TRzzuFRRmEoSW/p1KVAmiOgPco2Irlah+bGFCeNfJXxxYGwSw7YwAOAcd7X28K/m5bjBWKsC29KyoMfHbypayg==", "engines": { - "node": ">=10.13.0" + "node": ">=12.13.0" } }, "node_modules/pretty-format": { @@ -2058,11 +2161,20 @@ } }, "node_modules/source-map-support": { - "version": "0.4.18", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", - "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "dependencies": { - "source-map": "^0.5.6" + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" } }, "node_modules/stack-utils": { @@ -2120,11 +2232,11 @@ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "node_modules/ws": { - "version": "7.5.6", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.6.tgz", - "integrity": "sha512-6GLgCqo2cy2A2rjCNFlxQS6ZljG/coZfZXclldI8FB/1G3CCI36Zd8xy2HrFVACi8tfk5XrgLQEk+P0Tnz9UcA==", + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.4.2.tgz", + "integrity": "sha512-Kbk4Nxyq7/ZWqr/tarI9yIt/+iNNFOjBXEWgTb4ydaNHBNGgvf2QHbS9fdfsndfjFlFwEd4Al+mw83YkaD10ZA==", "engines": { - "node": ">=8.3.0" + "node": ">=10.0.0" }, "peerDependencies": { "bufferutil": "^4.0.1", @@ -2159,32 +2271,32 @@ }, "dependencies": { "@babel/code-frame": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz", - "integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", + "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", "requires": { - "@babel/highlight": "^7.14.5" + "@babel/highlight": "^7.16.7" } }, "@babel/compat-data": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.14.7.tgz", - "integrity": "sha512-nS6dZaISCXJ3+518CWiBfEr//gHyMO02uDxBkXTKZDN5POruCnOZ1N4YBRZDCabwF8nZMWBpRxIicmXtBs+fvw==" + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.16.8.tgz", + "integrity": "sha512-m7OkX0IdKLKPpBlJtF561YJal5y/jyI5fNfWbPxh2D/nbzzGI4qRyrD8xO2jB24u7l+5I2a43scCG2IrfjC50Q==" }, "@babel/core": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.14.8.tgz", - "integrity": "sha512-/AtaeEhT6ErpDhInbXmjHcUQXH0L0TEgscfcxk1qbOvLuKCa5aZT0SOOtDKFY96/CLROwbLSKyFor6idgNaU4Q==", - "requires": { - "@babel/code-frame": "^7.14.5", - "@babel/generator": "^7.14.8", - "@babel/helper-compilation-targets": "^7.14.5", - "@babel/helper-module-transforms": "^7.14.8", - "@babel/helpers": "^7.14.8", - "@babel/parser": "^7.14.8", - "@babel/template": "^7.14.5", - "@babel/traverse": "^7.14.8", - "@babel/types": "^7.14.8", + "version": "7.16.12", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.16.12.tgz", + "integrity": "sha512-dK5PtG1uiN2ikk++5OzSYsitZKny4wOCD0nrO4TqnW4BVBTQ2NGS3NgilvT/TEyxTST7LNyWV/T4tXDoD3fOgg==", + "requires": { + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.16.8", + "@babel/helper-compilation-targets": "^7.16.7", + "@babel/helper-module-transforms": "^7.16.7", + "@babel/helpers": "^7.16.7", + "@babel/parser": "^7.16.12", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.16.10", + "@babel/types": "^7.16.8", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -2194,268 +2306,278 @@ } }, "@babel/generator": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.8.tgz", - "integrity": "sha512-cYDUpvIzhBVnMzRoY1fkSEhK/HmwEVwlyULYgn/tMQYd6Obag3ylCjONle3gdErfXBW61SVTlR9QR7uWlgeIkg==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.8.tgz", + "integrity": "sha512-1ojZwE9+lOXzcWdWmO6TbUzDfqLD39CmEhN8+2cX9XkDo5yW1OpgfejfliysR2AWLpMamTiOiAp/mtroaymhpw==", "requires": { - "@babel/types": "^7.14.8", + "@babel/types": "^7.16.8", "jsesc": "^2.5.1", "source-map": "^0.5.0" } }, "@babel/helper-annotate-as-pure": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.0.tgz", - "integrity": "sha512-ItmYF9vR4zA8cByDocY05o0LGUkp1zhbTQOH1NFyl5xXEqlTJQCEJjieriw+aFpxo16swMxUnUiKS7a/r4vtHg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz", + "integrity": "sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==", "requires": { - "@babel/types": "^7.16.0" + "@babel/types": "^7.16.7" } }, "@babel/helper-compilation-targets": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.14.5.tgz", - "integrity": "sha512-v+QtZqXEiOnpO6EYvlImB6zCD2Lel06RzOPzmkz/D/XgQiUu3C/Jb1LOqSt/AIA34TYi/Q+KlT8vTQrgdxkbLw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.7.tgz", + "integrity": "sha512-mGojBwIWcwGD6rfqgRXVlVYmPAv7eOpIemUG3dGnDdCY4Pae70ROij3XmfrH6Fa1h1aiDylpglbZyktfzyo/hA==", "requires": { - "@babel/compat-data": "^7.14.5", - "@babel/helper-validator-option": "^7.14.5", - "browserslist": "^4.16.6", + "@babel/compat-data": "^7.16.4", + "@babel/helper-validator-option": "^7.16.7", + "browserslist": "^4.17.5", "semver": "^6.3.0" } }, "@babel/helper-create-class-features-plugin": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.14.8.tgz", - "integrity": "sha512-bpYvH8zJBWzeqi1o+co8qOrw+EXzQ/0c74gVmY205AWXy9nifHrOg77y+1zwxX5lXE7Icq4sPlSQ4O2kWBrteQ==", + "version": "7.16.10", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.16.10.tgz", + "integrity": "sha512-wDeej0pu3WN/ffTxMNCPW5UCiOav8IcLRxSIyp/9+IF2xJUM9h/OYjg0IJLHaL6F8oU8kqMz9nc1vryXhMsgXg==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-member-expression-to-functions": "^7.16.7", + "@babel/helper-optimise-call-expression": "^7.16.7", + "@babel/helper-replace-supers": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7" + } + }, + "@babel/helper-environment-visitor": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz", + "integrity": "sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag==", "requires": { - "@babel/helper-annotate-as-pure": "^7.14.5", - "@babel/helper-function-name": "^7.14.5", - "@babel/helper-member-expression-to-functions": "^7.14.7", - "@babel/helper-optimise-call-expression": "^7.14.5", - "@babel/helper-replace-supers": "^7.14.5", - "@babel/helper-split-export-declaration": "^7.14.5" + "@babel/types": "^7.16.7" } }, "@babel/helper-function-name": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.5.tgz", - "integrity": "sha512-Gjna0AsXWfFvrAuX+VKcN/aNNWonizBj39yGwUzVDVTlMYJMK2Wp6xdpy72mfArFq5uK+NOuexfzZlzI1z9+AQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz", + "integrity": "sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA==", "requires": { - "@babel/helper-get-function-arity": "^7.14.5", - "@babel/template": "^7.14.5", - "@babel/types": "^7.14.5" + "@babel/helper-get-function-arity": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/types": "^7.16.7" } }, "@babel/helper-get-function-arity": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.14.5.tgz", - "integrity": "sha512-I1Db4Shst5lewOM4V+ZKJzQ0JGGaZ6VY1jYvMghRjqs6DWgxLCIyFt30GlnKkfUeFLpJt2vzbMVEXVSXlIFYUg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz", + "integrity": "sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw==", "requires": { - "@babel/types": "^7.14.5" + "@babel/types": "^7.16.7" } }, "@babel/helper-hoist-variables": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.14.5.tgz", - "integrity": "sha512-R1PXiz31Uc0Vxy4OEOm07x0oSjKAdPPCh3tPivn/Eo8cvz6gveAeuyUUPB21Hoiif0uoPQSSdhIPS3352nvdyQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz", + "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==", "requires": { - "@babel/types": "^7.14.5" + "@babel/types": "^7.16.7" } }, "@babel/helper-member-expression-to-functions": { - "version": "7.14.7", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.14.7.tgz", - "integrity": "sha512-TMUt4xKxJn6ccjcOW7c4hlwyJArizskAhoSTOCkA0uZ+KghIaci0Qg9R043kUMWI9mtQfgny+NQ5QATnZ+paaA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.7.tgz", + "integrity": "sha512-VtJ/65tYiU/6AbMTDwyoXGPKHgTsfRarivm+YbB5uAzKUyuPjgZSgAFeG87FCigc7KNHu2Pegh1XIT3lXjvz3Q==", "requires": { - "@babel/types": "^7.14.5" + "@babel/types": "^7.16.7" } }, "@babel/helper-module-imports": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.0.tgz", - "integrity": "sha512-kkH7sWzKPq0xt3H1n+ghb4xEMP8k0U7XV3kkB+ZGy69kDk2ySFW1qPi06sjKzFY3t1j6XbJSqr4mF9L7CYVyhg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", + "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==", "requires": { - "@babel/types": "^7.16.0" + "@babel/types": "^7.16.7" } }, "@babel/helper-module-transforms": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.14.8.tgz", - "integrity": "sha512-RyE+NFOjXn5A9YU1dkpeBaduagTlZ0+fccnIcAGbv1KGUlReBj7utF7oEth8IdIBQPcux0DDgW5MFBH2xu9KcA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.7.tgz", + "integrity": "sha512-gaqtLDxJEFCeQbYp9aLAefjhkKdjKcdh6DB7jniIGU3Pz52WAmP268zK0VgPz9hUNkMSYeH976K2/Y6yPadpng==", "requires": { - "@babel/helper-module-imports": "^7.14.5", - "@babel/helper-replace-supers": "^7.14.5", - "@babel/helper-simple-access": "^7.14.8", - "@babel/helper-split-export-declaration": "^7.14.5", - "@babel/helper-validator-identifier": "^7.14.8", - "@babel/template": "^7.14.5", - "@babel/traverse": "^7.14.8", - "@babel/types": "^7.14.8" + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-module-imports": "^7.16.7", + "@babel/helper-simple-access": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/helper-validator-identifier": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.16.7", + "@babel/types": "^7.16.7" } }, "@babel/helper-optimise-call-expression": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.14.5.tgz", - "integrity": "sha512-IqiLIrODUOdnPU9/F8ib1Fx2ohlgDhxnIDU7OEVi+kAbEZcyiF7BLU8W6PfvPi9LzztjS7kcbzbmL7oG8kD6VA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.7.tgz", + "integrity": "sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w==", "requires": { - "@babel/types": "^7.14.5" + "@babel/types": "^7.16.7" } }, "@babel/helper-plugin-utils": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.5.tgz", - "integrity": "sha512-59KHWHXxVA9K4HNF4sbHCf+eJeFe0Te/ZFGqBT4OjXhrwvA04sGfaEGsVTdsjoszq0YTP49RC9UKe5g8uN2RwQ==" + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", + "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==" }, "@babel/helper-replace-supers": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.14.5.tgz", - "integrity": "sha512-3i1Qe9/8x/hCHINujn+iuHy+mMRLoc77b2nI9TB0zjH1hvn9qGlXjWlggdwUcju36PkPCy/lpM7LLUdcTyH4Ow==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.7.tgz", + "integrity": "sha512-y9vsWilTNaVnVh6xiJfABzsNpgDPKev9HnAgz6Gb1p6UUwf9NepdlsV7VXGCftJM+jqD5f7JIEubcpLjZj5dBw==", "requires": { - "@babel/helper-member-expression-to-functions": "^7.14.5", - "@babel/helper-optimise-call-expression": "^7.14.5", - "@babel/traverse": "^7.14.5", - "@babel/types": "^7.14.5" + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-member-expression-to-functions": "^7.16.7", + "@babel/helper-optimise-call-expression": "^7.16.7", + "@babel/traverse": "^7.16.7", + "@babel/types": "^7.16.7" } }, "@babel/helper-simple-access": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.14.8.tgz", - "integrity": "sha512-TrFN4RHh9gnWEU+s7JloIho2T76GPwRHhdzOWLqTrMnlas8T9O7ec+oEDNsRXndOmru9ymH9DFrEOxpzPoSbdg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.7.tgz", + "integrity": "sha512-ZIzHVyoeLMvXMN/vok/a4LWRy8G2v205mNP0XOuf9XRLyX5/u9CnVulUtDgUTama3lT+bf/UqucuZjqiGuTS1g==", "requires": { - "@babel/types": "^7.14.8" + "@babel/types": "^7.16.7" } }, "@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.14.5.tgz", - "integrity": "sha512-dmqZB7mrb94PZSAOYtr+ZN5qt5owZIAgqtoTuqiFbHFtxgEcmQlRJVI+bO++fciBunXtB6MK7HrzrfcAzIz2NQ==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz", + "integrity": "sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw==", "requires": { - "@babel/types": "^7.14.5" + "@babel/types": "^7.16.0" } }, "@babel/helper-split-export-declaration": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.14.5.tgz", - "integrity": "sha512-hprxVPu6e5Kdp2puZUmvOGjaLv9TCe58E/Fl6hRq4YiVQxIcNvuq6uTM2r1mT/oPskuS9CgR+I94sqAYv0NGKA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", + "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", "requires": { - "@babel/types": "^7.14.5" + "@babel/types": "^7.16.7" } }, "@babel/helper-validator-identifier": { - "version": "7.15.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", - "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==" + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==" }, "@babel/helper-validator-option": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz", - "integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==" + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz", + "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==" }, "@babel/helpers": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.14.8.tgz", - "integrity": "sha512-ZRDmI56pnV+p1dH6d+UN6GINGz7Krps3+270qqI9UJ4wxYThfAIcI5i7j5vXC4FJ3Wap+S9qcebxeYiqn87DZw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.16.7.tgz", + "integrity": "sha512-9ZDoqtfY7AuEOt3cxchfii6C7GDyyMBffktR5B2jvWv8u2+efwvpnVKXMWzNehqy68tKgAfSwfdw/lWpthS2bw==", "requires": { - "@babel/template": "^7.14.5", - "@babel/traverse": "^7.14.8", - "@babel/types": "^7.14.8" + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.16.7", + "@babel/types": "^7.16.7" } }, "@babel/highlight": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", - "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", + "version": "7.16.10", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz", + "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==", "requires": { - "@babel/helper-validator-identifier": "^7.14.5", + "@babel/helper-validator-identifier": "^7.16.7", "chalk": "^2.0.0", "js-tokens": "^4.0.0" } }, "@babel/parser": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.8.tgz", - "integrity": "sha512-syoCQFOoo/fzkWDeM0dLEZi5xqurb5vuyzwIMNZRNun+N/9A4cUZeQaE7dTrB8jGaKuJRBtEOajtnmw0I5hvvA==" + "version": "7.16.12", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.12.tgz", + "integrity": "sha512-VfaV15po8RiZssrkPweyvbGVSe4x2y+aciFCgn0n0/SJMR22cwofRV1mtnJQYcSB1wUTaA/X1LnA3es66MCO5A==" }, "@babel/plugin-proposal-class-properties": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.14.5.tgz", - "integrity": "sha512-q/PLpv5Ko4dVc1LYMpCY7RVAAO4uk55qPwrIuJ5QJ8c6cVuAmhu7I/49JOppXL6gXf7ZHzpRVEUZdYoPLM04Gg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.7.tgz", + "integrity": "sha512-IobU0Xme31ewjYOShSIqd/ZGM/r/cuOz2z0MDbNrhF5FW+ZVgi0f2lyeoj9KFPDOAqsYxmLWZte1WOwlvY9aww==", "requires": { - "@babel/helper-create-class-features-plugin": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-create-class-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-proposal-dynamic-import": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.14.5.tgz", - "integrity": "sha512-ExjiNYc3HDN5PXJx+bwC50GIx/KKanX2HiggnIUAYedbARdImiCU4RhhHfdf0Kd7JNXGpsBBBCOm+bBVy3Gb0g==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.7.tgz", + "integrity": "sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg==", "requires": { - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-dynamic-import": "^7.8.3" } }, "@babel/plugin-proposal-export-namespace-from": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.14.5.tgz", - "integrity": "sha512-g5POA32bXPMmSBu5Dx/iZGLGnKmKPc5AiY7qfZgurzrCYgIztDlHFbznSNCoQuv57YQLnQfaDi7dxCtLDIdXdA==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.7.tgz", + "integrity": "sha512-ZxdtqDXLRGBL64ocZcs7ovt71L3jhC1RGSyR996svrCi3PYqHNkb3SwPJCs8RIzD86s+WPpt2S73+EHCGO+NUA==", "requires": { - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" } }, "@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.14.5.tgz", - "integrity": "sha512-YGn2AvZAo9TwyhlLvCCWxD90Xq8xJ4aSgaX3G5D/8DW94L8aaT+dS5cSP+Z06+rCJERGSr9GxMBZ601xoc2taw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.7.tgz", + "integrity": "sha512-K3XzyZJGQCr00+EtYtrDjmwX7o7PLK6U9bi1nCwkQioRFVUv6dJoxbQjtWVtP+bCPy82bONBKG8NPyQ4+i6yjg==", "requires": { - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" } }, "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.14.5.tgz", - "integrity": "sha512-gun/SOnMqjSb98Nkaq2rTKMwervfdAoz6NphdY0vTfuzMfryj+tDGb2n6UkDKwez+Y8PZDhE3D143v6Gepp4Hg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.7.tgz", + "integrity": "sha512-aUOrYU3EVtjf62jQrCj63pYZ7k6vns2h/DQvHPWGmsJRYzWXZ6/AsfgpiRy6XiuIDADhJzP2Q9MwSMKauBQ+UQ==", "requires": { - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" } }, "@babel/plugin-proposal-numeric-separator": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.14.5.tgz", - "integrity": "sha512-yiclALKe0vyZRZE0pS6RXgjUOt87GWv6FYa5zqj15PvhOGFO69R5DusPlgK/1K5dVnCtegTiWu9UaBSrLLJJBg==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.7.tgz", + "integrity": "sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw==", "requires": { - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-numeric-separator": "^7.10.4" } }, "@babel/plugin-proposal-optional-chaining": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.14.5.tgz", - "integrity": "sha512-ycz+VOzo2UbWNI1rQXxIuMOzrDdHGrI23fRiz/Si2R4kv2XZQ1BK8ccdHwehMKBlcH/joGW/tzrUmo67gbJHlQ==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.7.tgz", + "integrity": "sha512-eC3xy+ZrUcBtP7x+sq62Q/HYd674pPTb/77XZMb5wbDPGWIdUbSr4Agr052+zaUPSb+gGRnjxXfKFvx5iMJ+DA==", "requires": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.14.5", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", "@babel/plugin-syntax-optional-chaining": "^7.8.3" } }, "@babel/plugin-proposal-private-methods": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.14.5.tgz", - "integrity": "sha512-838DkdUA1u+QTCplatfq4B7+1lnDa/+QMI89x5WZHBcnNv+47N8QEj2k9I2MUU9xIv8XJ4XvPCviM/Dj7Uwt9g==", + "version": "7.16.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.11.tgz", + "integrity": "sha512-F/2uAkPlXDr8+BHpZvo19w3hLFKge+k75XUprE6jaqKxjGkSYcK+4c+bup5PdW/7W/Rpjwql7FTVEDW+fRAQsw==", "requires": { - "@babel/helper-create-class-features-plugin": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-create-class-features-plugin": "^7.16.10", + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-proposal-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-62EyfyA3WA0mZiF2e2IV9mc9Ghwxcg8YTu8BS4Wss4Y3PY725OmS9M0qLORbJwLqFtGh+jiE4wAmocK2CTUK2Q==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.7.tgz", + "integrity": "sha512-rMQkjcOFbm+ufe3bTZLyOfsOUOxyvLXZJCTARhJr+8UMSoZmqTe1K1BgkFcrW37rAchWg57yI69ORxiWvUINuQ==", "requires": { - "@babel/helper-annotate-as-pure": "^7.14.5", - "@babel/helper-create-class-features-plugin": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-create-class-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", "@babel/plugin-syntax-private-property-in-object": "^7.14.5" } }, @@ -2492,11 +2614,11 @@ } }, "@babel/plugin-syntax-jsx": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.16.5.tgz", - "integrity": "sha512-42OGssv9NPk4QHKVgIHlzeLgPOW5rGgfV5jzG90AhcXXIv6hu/eqj63w4VgvRxdvZY3AlYeDgPiSJ3BqAd1Y6Q==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.16.7.tgz", + "integrity": "sha512-Esxmk7YjA8QysKeT3VhTXvF6y77f/a91SIs4pWb4H2eWGQkCKFgQaG6hdoEVZtGsrAcb2K5BW66XsOErD4WU3Q==", "requires": { - "@babel/helper-plugin-utils": "^7.16.5" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-syntax-logical-assignment-operators": { @@ -2556,88 +2678,89 @@ } }, "@babel/plugin-syntax-typescript": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.14.5.tgz", - "integrity": "sha512-u6OXzDaIXjEstBRRoBCQ/uKQKlbuaeE5in0RvWdA4pN6AhqxTIwUsnHPU1CFZA/amYObMsuWhYfRl3Ch90HD0Q==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.16.7.tgz", + "integrity": "sha512-YhUIJHHGkqPgEcMYkPCKTyGUdoGKWtopIycQyjJH8OjvRgOYsXsaKehLVPScKJWAULPxMa4N1vCe6szREFlZ7A==", "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.7" } }, "@babel/plugin-transform-modules-commonjs": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.14.5.tgz", - "integrity": "sha512-en8GfBtgnydoao2PS+87mKyw62k02k7kJ9ltbKe0fXTHrQmG6QZZflYuGI1VVG7sVpx4E1n7KBpNlPb8m78J+A==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.16.8.tgz", + "integrity": "sha512-oflKPvsLT2+uKQopesJt3ApiaIS2HW+hzHFcwRNtyDGieAeC/dIHZX8buJQ2J2X1rxGPy4eRcUijm3qcSPjYcA==", "requires": { - "@babel/helper-module-transforms": "^7.14.5", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-simple-access": "^7.14.5", + "@babel/helper-module-transforms": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-simple-access": "^7.16.7", "babel-plugin-dynamic-import-node": "^2.3.3" } }, "@babel/plugin-transform-react-jsx": { - "version": "7.16.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.16.5.tgz", - "integrity": "sha512-+arLIz1d7kmwX0fKxTxbnoeG85ONSnLpvdODa4P3pc1sS7CV1hfmtYWufkW/oYsPnkDrEeQFxhUWcFnrXW7jQQ==", - "requires": { - "@babel/helper-annotate-as-pure": "^7.16.0", - "@babel/helper-module-imports": "^7.16.0", - "@babel/helper-plugin-utils": "^7.16.5", - "@babel/plugin-syntax-jsx": "^7.16.5", - "@babel/types": "^7.16.0" + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.16.7.tgz", + "integrity": "sha512-8D16ye66fxiE8m890w0BpPpngG9o9OVBBy0gH2E+2AR7qMR2ZpTYJEqLxAsoroenMId0p/wMW+Blc0meDgu0Ag==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-module-imports": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-jsx": "^7.16.7", + "@babel/types": "^7.16.7" } }, "@babel/plugin-transform-typescript": { - "version": "7.14.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.14.6.tgz", - "integrity": "sha512-XlTdBq7Awr4FYIzqhmYY80WN0V0azF74DMPyFqVHBvf81ZUgc4X7ZOpx6O8eLDK6iM5cCQzeyJw0ynTaefixRA==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.16.8.tgz", + "integrity": "sha512-bHdQ9k7YpBDO2d0NVfkj51DpQcvwIzIusJ7mEUaMlbZq3Kt/U47j24inXZHQ5MDiYpCs+oZiwnXyKedE8+q7AQ==", "requires": { - "@babel/helper-create-class-features-plugin": "^7.14.6", - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/plugin-syntax-typescript": "^7.14.5" + "@babel/helper-create-class-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-typescript": "^7.16.7" } }, "@babel/preset-typescript": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.14.5.tgz", - "integrity": "sha512-u4zO6CdbRKbS9TypMqrlGH7sd2TAJppZwn3c/ZRLeO/wGsbddxgbPDUZVNrie3JWYLQ9vpineKlsrWFvO6Pwkw==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.16.7.tgz", + "integrity": "sha512-WbVEmgXdIyvzB77AQjGBEyYPZx+8tTsO50XtfozQrkW8QB2rLJpH2lgx0TRw5EJrBxOZQ+wCcyPVQvS8tjEHpQ==", "requires": { - "@babel/helper-plugin-utils": "^7.14.5", - "@babel/helper-validator-option": "^7.14.5", - "@babel/plugin-transform-typescript": "^7.14.5" + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-validator-option": "^7.16.7", + "@babel/plugin-transform-typescript": "^7.16.7" } }, "@babel/template": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.14.5.tgz", - "integrity": "sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g==", + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", + "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", "requires": { - "@babel/code-frame": "^7.14.5", - "@babel/parser": "^7.14.5", - "@babel/types": "^7.14.5" + "@babel/code-frame": "^7.16.7", + "@babel/parser": "^7.16.7", + "@babel/types": "^7.16.7" } }, "@babel/traverse": { - "version": "7.14.8", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.8.tgz", - "integrity": "sha512-kexHhzCljJcFNn1KYAQ6A5wxMRzq9ebYpEDV4+WdNyr3i7O44tanbDOR/xjiG2F3sllan+LgwK+7OMk0EmydHg==", - "requires": { - "@babel/code-frame": "^7.14.5", - "@babel/generator": "^7.14.8", - "@babel/helper-function-name": "^7.14.5", - "@babel/helper-hoist-variables": "^7.14.5", - "@babel/helper-split-export-declaration": "^7.14.5", - "@babel/parser": "^7.14.8", - "@babel/types": "^7.14.8", + "version": "7.16.10", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.10.tgz", + "integrity": "sha512-yzuaYXoRJBGMlBhsMJoUW7G1UmSb/eXr/JHYM/MsOJgavJibLwASijW7oXBdw3NQ6T0bW7Ty5P/VarOs9cHmqw==", + "requires": { + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.16.8", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-hoist-variables": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/parser": "^7.16.10", + "@babel/types": "^7.16.8", "debug": "^4.1.0", "globals": "^11.1.0" } }, "@babel/types": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.0.tgz", - "integrity": "sha512-PJgg/k3SdLsGb3hhisFvtLOw5ts113klrpLuIPtCJIU+BB24fqq6lf8RWqKJEjzqXR9AEH1rIb5XTqwBHB+kQg==", + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.8.tgz", + "integrity": "sha512-smN2DQc5s4M7fntyjGtyIPbRJv6wW4rU/94fmYJ7PKQuZkC0qGMHXJbg6sNGt12JmVr4k5YaptI/XtiLJBnmIg==", "requires": { - "@babel/helper-validator-identifier": "^7.15.7", + "@babel/helper-validator-identifier": "^7.16.7", "to-fast-properties": "^2.0.0" } }, @@ -2699,47 +2822,47 @@ } }, "@playwright/test": { - "version": "1.19.0-alpha-1642473215000", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.19.0-alpha-1642473215000.tgz", - "integrity": "sha512-BNwM/DnTHIVDVu5p7knp/3HsdvRrhtRsBUKFVcJe0ohDksEiGohu/XI4ZtZor/3/JJsmd8VDs2lAQQkn8/DRPA==", - "requires": { - "@babel/code-frame": "^7.14.5", - "@babel/core": "^7.14.8", - "@babel/plugin-proposal-class-properties": "^7.14.5", - "@babel/plugin-proposal-dynamic-import": "^7.14.5", - "@babel/plugin-proposal-export-namespace-from": "^7.14.5", - "@babel/plugin-proposal-logical-assignment-operators": "^7.14.5", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.14.5", - "@babel/plugin-proposal-numeric-separator": "^7.14.5", - "@babel/plugin-proposal-optional-chaining": "^7.14.5", - "@babel/plugin-proposal-private-methods": "^7.14.5", - "@babel/plugin-proposal-private-property-in-object": "^7.14.5", + "version": "1.19.0-alpha-1643749494000", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.19.0-alpha-1643749494000.tgz", + "integrity": "sha512-CrmItYmF2qRC7Y6EVKSwmH+AU70IRO0W6nhBVc7iKXMkHy4K3o41U/K0CRquFrwpjqn1LikPqFqhMh+bGuBgGw==", + "requires": { + "@babel/code-frame": "^7.16.7", + "@babel/core": "^7.16.12", + "@babel/plugin-proposal-class-properties": "^7.16.7", + "@babel/plugin-proposal-dynamic-import": "^7.16.7", + "@babel/plugin-proposal-export-namespace-from": "^7.16.7", + "@babel/plugin-proposal-logical-assignment-operators": "^7.16.7", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.7", + "@babel/plugin-proposal-numeric-separator": "^7.16.7", + "@babel/plugin-proposal-optional-chaining": "^7.16.7", + "@babel/plugin-proposal-private-methods": "^7.16.11", + "@babel/plugin-proposal-private-property-in-object": "^7.16.7", "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-json-strings": "^7.8.3", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-transform-modules-commonjs": "^7.14.5", - "@babel/plugin-transform-react-jsx": "^7.14.5", - "@babel/preset-typescript": "^7.14.5", + "@babel/plugin-transform-modules-commonjs": "^7.16.8", + "@babel/plugin-transform-react-jsx": "^7.16.7", + "@babel/preset-typescript": "^7.16.7", "babel-plugin-module-resolver": "^4.1.0", "colors": "1.4.0", - "commander": "^8.2.0", - "debug": "^4.1.1", + "commander": "^8.3.0", + "debug": "^4.3.3", "expect": "=27.2.5", "jest-matcher-utils": "=27.2.5", - "jpeg-js": "^0.4.2", + "jpeg-js": "^0.4.3", "json5": "^2.2.0", - "mime": "^2.4.6", - "minimatch": "^3.0.3", - "ms": "^2.1.2", - "open": "^8.3.0", - "pirates": "^4.0.1", + "mime": "^3.0.0", + "minimatch": "^3.0.4", + "ms": "^2.1.3", + "open": "^8.4.0", + "pirates": "=4.0.4", "pixelmatch": "^5.2.1", - "playwright-core": "=1.19.0-alpha-1642473215000", - "pngjs": "^5.0.0", + "playwright-core": "=1.19.0-alpha-1643749494000", + "pngjs": "^6.0.0", "rimraf": "^3.0.2", - "source-map-support": "^0.4.18", - "stack-utils": "^2.0.3", + "source-map-support": "^0.5.21", + "stack-utils": "^2.0.5", "yazl": "^2.5.1" } }, @@ -2860,15 +2983,15 @@ } }, "browserslist": { - "version": "4.16.6", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz", - "integrity": "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==", + "version": "4.19.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.19.1.tgz", + "integrity": "sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A==", "requires": { - "caniuse-lite": "^1.0.30001219", - "colorette": "^1.2.2", - "electron-to-chromium": "^1.3.723", + "caniuse-lite": "^1.0.30001286", + "electron-to-chromium": "^1.4.17", "escalade": "^3.1.1", - "node-releases": "^1.1.71" + "node-releases": "^2.0.1", + "picocolors": "^1.0.0" } }, "buffer-crc32": { @@ -2876,6 +2999,11 @@ "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=" }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, "call-bind": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", @@ -2886,9 +3014,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001248", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001248.tgz", - "integrity": "sha512-NwlQbJkxUFJ8nMErnGtT0QTM2TJ33xgz4KXJSMIrjXIbDVdaYueGyjOrLKRtJC+rTiWfi6j5cnZN1NBiSBJGNw==" + "version": "1.0.30001304", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001304.tgz", + "integrity": "sha512-bdsfZd6K6ap87AGqSHJP/s1V+U6Z5lyrcbBu3ovbCCf8cSYpwTtGrCBObMpJqwxfTbLW6YTIdbb1jEeTelcpYQ==" }, "chalk": { "version": "2.4.2", @@ -2913,11 +3041,6 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" }, - "colorette": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", - "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==" - }, "colors": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", @@ -2942,9 +3065,9 @@ } }, "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", "requires": { "ms": "2.1.2" }, @@ -2975,9 +3098,9 @@ "integrity": "sha512-ag6wfpBFyNXZ0p8pcuIDS//D8H062ZQJ3fzYxjpmeKjnz8W4pekL3AI8VohmyZmsWW2PWaHgjsmqR6L13101VQ==" }, "electron-to-chromium": { - "version": "1.3.790", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.790.tgz", - "integrity": "sha512-epMH/S2MkhBv+Y0+nHK8dC7bzmOaPwcmiYqt+VwxSUJLgPzkqZnGUEQ8eVhy5zGmgWm9tDDdXkHDzOEsVU979A==" + "version": "1.4.60", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.60.tgz", + "integrity": "sha512-h53hbEiKC6hijelDgxgkgAUC3PKyR7TmIfvjHnBjUGPMg/3sBuTyG6eDormw+lY24uUJvHkUPzB8dpK8b2u3Sw==" }, "end-of-stream": { "version": "1.4.4", @@ -3421,9 +3544,9 @@ } }, "mime": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", - "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", + "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==" }, "minimatch": { "version": "3.0.4", @@ -3443,15 +3566,10 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, - "node-modules-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", - "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=" - }, "node-releases": { - "version": "1.1.73", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.73.tgz", - "integrity": "sha512-uW7fodD6pyW2FZNZnp/Z3hvWKeEW1Y8R1+1CnErE8cXFXzl5blBOoVB41CvMer6P6Q0S5FXDwcHgFd1Wj0U9zg==" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.1.tgz", + "integrity": "sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==" }, "object-keys": { "version": "1.1.1", @@ -3478,9 +3596,9 @@ } }, "open": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/open/-/open-8.3.0.tgz", - "integrity": "sha512-7INcPWb1UcOwSQxAXTnBJ+FxVV4MPs/X++FWWBtgY69/J5lc+tCteMt/oFK1MnkyHC4VILLa9ntmwKTwDR4Q9w==", + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", + "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", "requires": { "define-lazy-prop": "^2.0.0", "is-docker": "^2.1.1", @@ -3528,18 +3646,20 @@ "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=" }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, "picomatch": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==" }, "pirates": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", - "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", - "requires": { - "node-modules-regexp": "^1.0.0" - } + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.4.tgz", + "integrity": "sha512-ZIrVPH+A52Dw84R0L3/VS9Op04PuQ2SEoJL6bkshmiTic/HldyW9Tf7oH5mhJZBK7NmDx27vSMrYEXPXclpDKw==" }, "pixelmatch": { "version": "5.2.1", @@ -3565,32 +3685,32 @@ } }, "playwright-core": { - "version": "1.19.0-alpha-1642473215000", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.19.0-alpha-1642473215000.tgz", - "integrity": "sha512-ecBvWOF7ts2d5JJs/voA7ImugrlK9OGr/lG6a96xPjCqKdudAh4BCIHfUrcYARs/gyHpYg/EgCMquROg6aR7Xg==", + "version": "1.19.0-alpha-1643749494000", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.19.0-alpha-1643749494000.tgz", + "integrity": "sha512-7po9hAGNpqwAESGbXw7XRT3FUXhSB+V7LV92pF6gF4J7PVlgPt24oCgrX+dDB2d+ZbMg5/S6bYT6BTRL8pe08Q==", "requires": { - "commander": "^8.2.0", - "debug": "^4.1.1", + "commander": "^8.3.0", + "debug": "^4.3.3", "extract-zip": "^2.0.1", "https-proxy-agent": "^5.0.0", - "jpeg-js": "^0.4.2", - "mime": "^2.4.6", - "pngjs": "^5.0.0", + "jpeg-js": "^0.4.3", + "mime": "^3.0.0", + "pngjs": "^6.0.0", "progress": "^2.0.3", - "proper-lockfile": "^4.1.1", + "proper-lockfile": "^4.1.2", "proxy-from-env": "^1.1.0", "rimraf": "^3.0.2", - "socks-proxy-agent": "^6.1.0", - "stack-utils": "^2.0.3", - "ws": "^7.4.6", + "socks-proxy-agent": "^6.1.1", + "stack-utils": "^2.0.5", + "ws": "^8.4.2", "yauzl": "^2.10.0", "yazl": "^2.5.1" } }, "pngjs": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-5.0.0.tgz", - "integrity": "sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==" + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-6.0.0.tgz", + "integrity": "sha512-TRzzuFRRmEoSW/p1KVAmiOgPco2Irlah+bGFCeNfJXxxYGwSw7YwAOAcd7X28K/m5bjBWKsC29KyoMfHbypayg==" }, "pretty-format": { "version": "27.2.5", @@ -3721,11 +3841,19 @@ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" }, "source-map-support": { - "version": "0.4.18", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", - "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "requires": { - "source-map": "^0.5.6" + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } } }, "stack-utils": { @@ -3770,9 +3898,9 @@ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "ws": { - "version": "7.5.6", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.6.tgz", - "integrity": "sha512-6GLgCqo2cy2A2rjCNFlxQS6ZljG/coZfZXclldI8FB/1G3CCI36Zd8xy2HrFVACi8tfk5XrgLQEk+P0Tnz9UcA==", + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.4.2.tgz", + "integrity": "sha512-Kbk4Nxyq7/ZWqr/tarI9yIt/+iNNFOjBXEWgTb4ydaNHBNGgvf2QHbS9fdfsndfjFlFwEd4Al+mw83YkaD10ZA==", "requires": {} }, "yauzl": { diff --git a/tests/playwright-test/stable-test-runner/package.json b/tests/playwright-test/stable-test-runner/package.json index 0eb6538cfc748..a9c89488dca9b 100644 --- a/tests/playwright-test/stable-test-runner/package.json +++ b/tests/playwright-test/stable-test-runner/package.json @@ -1,6 +1,6 @@ { "private": true, "dependencies": { - "@playwright/test": "1.19.0-alpha-1642473215000" + "@playwright/test": "1.19.0-alpha-1643749494000" } } From 6e2fcc47002596755d0de382dd69514351af3415 Mon Sep 17 00:00:00 2001 From: Pavel Feldman Date: Tue, 1 Feb 2022 15:34:16 -0800 Subject: [PATCH 178/233] chore: do not expose suite load error (#11797) --- docs/src/test-reporter-api/class-suite.md | 5 ----- packages/playwright-test/src/loader.ts | 2 +- packages/playwright-test/src/runner.ts | 4 ++-- packages/playwright-test/src/test.ts | 2 +- packages/playwright-test/types/testReporter.d.ts | 4 ---- utils/generate_types/overrides-testReporter.d.ts | 1 - 6 files changed, 4 insertions(+), 14 deletions(-) diff --git a/docs/src/test-reporter-api/class-suite.md b/docs/src/test-reporter-api/class-suite.md index db76fcc25be5b..b0b3d74c9e834 100644 --- a/docs/src/test-reporter-api/class-suite.md +++ b/docs/src/test-reporter-api/class-suite.md @@ -24,11 +24,6 @@ Reporter is given a root suite in the [`method: Reporter.onBegin`] method. Returns the list of all test cases in this suite and its descendants, as opposite to [`property: Suite.tests`]. -## property: Suite.loadError -- type: <[void]|[TestError]> - -For file suites, contains errors that occurred while loading this file. - ## property: Suite.location - type: <[void]|[Location]> diff --git a/packages/playwright-test/src/loader.ts b/packages/playwright-test/src/loader.ts index 2208d6798e3c2..2e545b9753e5c 100644 --- a/packages/playwright-test/src/loader.ts +++ b/packages/playwright-test/src/loader.ts @@ -128,7 +128,7 @@ export class Loader { } catch (e) { if (environment === 'worker') throw e; - suite.loadError = serializeError(e); + suite._loadError = serializeError(e); } finally { setCurrentlyLoadingFileSuite(undefined); } diff --git a/packages/playwright-test/src/runner.ts b/packages/playwright-test/src/runner.ts index db003d5b091b2..9a3e5f2bbd2d6 100644 --- a/packages/playwright-test/src/runner.ts +++ b/packages/playwright-test/src/runner.ts @@ -233,8 +233,8 @@ export class Runner { const preprocessRoot = new Suite(''); for (const file of allTestFiles) { const fileSuite = await this._loader.loadTestFile(file, 'runner'); - if (fileSuite.loadError) - fatalErrors.push(fileSuite.loadError); + if (fileSuite._loadError) + fatalErrors.push(fileSuite._loadError); preprocessRoot._addSuite(fileSuite); } diff --git a/packages/playwright-test/src/test.ts b/packages/playwright-test/src/test.ts index 441b3a932d543..0ba40a7a2f5ac 100644 --- a/packages/playwright-test/src/test.ts +++ b/packages/playwright-test/src/test.ts @@ -40,7 +40,6 @@ export type Modifier = { export class Suite extends Base implements reporterTypes.Suite { suites: Suite[] = []; tests: TestCase[] = []; - loadError?: reporterTypes.TestError; location?: Location; parent?: Suite; _use: FixturesWithLocation[] = []; @@ -53,6 +52,7 @@ export class Suite extends Base implements reporterTypes.Suite { _modifiers: Modifier[] = []; _parallelMode: 'default' | 'serial' | 'parallel' = 'default'; _projectConfig: FullProject | undefined; + _loadError?: reporterTypes.TestError; _addTest(test: TestCase) { test.parent = this; diff --git a/packages/playwright-test/types/testReporter.d.ts b/packages/playwright-test/types/testReporter.d.ts index 0dfe58b4d05bf..18f92b26fcce8 100644 --- a/packages/playwright-test/types/testReporter.d.ts +++ b/packages/playwright-test/types/testReporter.d.ts @@ -70,10 +70,6 @@ export interface Suite { * group suite. */ title: string; - /** - * For file suites, contains errors that occurred while loading this file. - */ - loadError?: TestError; /** * Location in the source where the suite is defined. Missing for root and project suites. */ diff --git a/utils/generate_types/overrides-testReporter.d.ts b/utils/generate_types/overrides-testReporter.d.ts index 9c7a9dafee218..af511e8ab1c0c 100644 --- a/utils/generate_types/overrides-testReporter.d.ts +++ b/utils/generate_types/overrides-testReporter.d.ts @@ -26,7 +26,6 @@ export interface Location { export interface Suite { parent?: Suite; title: string; - loadError?: TestError; location?: Location; suites: Suite[]; tests: TestCase[]; From 731931ae58296a8fb2518f07ebc9af7d4da1960e Mon Sep 17 00:00:00 2001 From: Sanghyeon Lee Date: Wed, 2 Feb 2022 08:59:30 +0900 Subject: [PATCH 179/233] docs(test-timeouts-js.md): fix inconsistent style of 'override' (#11766) --- docs/src/test-timeouts-js.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/src/test-timeouts-js.md b/docs/src/test-timeouts-js.md index 36e9bb965636c..6da75c9b9c632 100644 --- a/docs/src/test-timeouts-js.md +++ b/docs/src/test-timeouts-js.md @@ -12,9 +12,9 @@ Playwright Test has multiple configurable timeouts for various tasks. |Timeout |Default |Description | |:----------|:----------------|:--------------------------------| |Test timeout|30000 ms|Timeout for each test, includes test, hooks and fixtures:
Set default
{`config = { timeout: 60000 }`}
Override
```test.setTimeout(120000)``` | -|Expect timeout|5000 ms|Timeout for each assertion:
Set default
```config = { expect: { timeout: 10000 } }```
Override
```expect(locator).toBeVisible({ timeout: 10000 })```| -|Action timeout| no timeout |Timeout for each action:
Set default
```config = { use: { actionTimeout: 10000 } }```
Override
```locator.click({ timeout: 10000 })```| -|Navigation timeout| no timeout |Timeout for each navigation action:
Set default
```config = { use: { navigationTimeout: 30000 } }```
Override
```page.goto('/', { timeout: 30000 })```| +|Expect timeout|5000 ms|Timeout for each assertion:
Set default
```config = { expect: { timeout: 10000 } }```
Override
```expect(locator).toBeVisible({ timeout: 10000 })```| +|Action timeout| no timeout |Timeout for each action:
Set default
```config = { use: { actionTimeout: 10000 } }```
Override
```locator.click({ timeout: 10000 })```| +|Navigation timeout| no timeout |Timeout for each navigation action:
Set default
```config = { use: { navigationTimeout: 30000 } }```
Override
```page.goto('/', { timeout: 30000 })```| |Global timeout|no timeout |Global timeout for the whole test run:
Set in config
```config = { globalTimeout: 60*60*1000 }```
| ## Test timeout From 4bbd38560a9a2ec91f63f2abee0cffb874357204 Mon Sep 17 00:00:00 2001 From: Zack Guo Date: Wed, 2 Feb 2022 08:08:08 +0800 Subject: [PATCH 180/233] docs(CONTRIBUTING.md): update how to run a specific test (#11697) --- CONTRIBUTING.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 21e4a95568ae1..d755003d6528c 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -144,7 +144,7 @@ npm run test npm run ctest # also `ftest` for firefox and `wtest` for WebKit ``` -- To run a specific test, substitute `it` with `it.only`: +- To run a specific test, substitute `it` with `it.only`, or use the `--grep 'My test'` CLI parameter: ```js ... @@ -153,6 +153,8 @@ it.only('should work', async ({server, page}) => { const response = await page.goto(server.EMPTY_PAGE); expect(response.ok).toBe(true); }); +// or +playwright test --config=xxx --grep 'should work' ``` - To disable a specific test, substitute `it` with `it.skip`: From a30bc171c56166cc48267e3808f4a91bf62e5082 Mon Sep 17 00:00:00 2001 From: Dmitry Gozman Date: Tue, 1 Feb 2022 17:15:55 -0800 Subject: [PATCH 181/233] chore: make playwright-test tests debuggable with extension (#11798) --- tests/playwright-test/playwright-test-fixtures.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/playwright-test/playwright-test-fixtures.ts b/tests/playwright-test/playwright-test-fixtures.ts index 79030894e95f8..91fb4922a7033 100644 --- a/tests/playwright-test/playwright-test-fixtures.ts +++ b/tests/playwright-test/playwright-test-fixtures.ts @@ -123,6 +123,10 @@ async function runPlaywrightTest(childProcess: CommonFixtures['childProcess'], b ...env, PLAYWRIGHT_DOCKER: undefined, PW_GRID: undefined, + PW_TEST_REPORTER_WS_ENDPOINT: undefined, + PW_TEST_SOURCE_TRANSFORM: undefined, + PW_OUT_OF_PROCESS_DRIVER: undefined, + NODE_OPTIONS: undefined, }, cwd: baseDir, }); From ceb3027bdffdf907a910b8fb27b408cbd6b29f3f Mon Sep 17 00:00:00 2001 From: Pavel Feldman Date: Tue, 1 Feb 2022 17:29:15 -0800 Subject: [PATCH 182/233] chore(test-runner): force colors in worker processes (#11799) --- packages/playwright-test/src/dispatcher.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/playwright-test/src/dispatcher.ts b/packages/playwright-test/src/dispatcher.ts index a6ec8881c9c54..1c3b8769bb7c5 100644 --- a/packages/playwright-test/src/dispatcher.ts +++ b/packages/playwright-test/src/dispatcher.ts @@ -474,7 +474,7 @@ class Worker extends EventEmitter { this.process = child_process.fork(path.join(__dirname, 'worker.js'), { detached: false, env: { - FORCE_COLOR: process.stdout.isTTY ? '1' : '0', + FORCE_COLOR: '1', DEBUG_COLORS: process.stdout.isTTY ? '1' : '0', TEST_WORKER_INDEX: String(this.workerIndex), TEST_PARALLEL_INDEX: String(this.parallelIndex), From b0daa7754fe257b08466662f6e43d3de523be61d Mon Sep 17 00:00:00 2001 From: Andrey Lushnikov Date: Tue, 1 Feb 2022 19:40:44 -0700 Subject: [PATCH 183/233] feat: filter stack traces to exclude test runner frames (#11795) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Before: ```bash Running 1 test using 1 worker 1) [chromium] › tests/example.spec.ts:3:1 › should work ========================================== Error: expect(received).toBe(expected) // Object.is equality Expected: 2 Received: 1 2 | 3 | test('should work', async({page}) => { > 4 | expect(1).toBe(2); | ^ 5 | }); 6 | at Proxy. (/Users/andreylushnikov/prog/playwright/packages/playwright-test/src/expect.ts:151:30) at /Users/andreylushnikov/tmp/tests/example.spec.ts:4:13 at /Users/andreylushnikov/prog/playwright/packages/playwright-test/src/workerRunner.ts:335:13 at runNextTicks (node:internal/process/task_queues:61:5) at processImmediate (node:internal/timers:437:9) at TestInfoImpl._runFn (/Users/andreylushnikov/prog/playwright/packages/playwright-test/src/testInfo.ts:164:7) at WorkerRunner._runTestWithBeforeHooks (/Users/andreylushnikov/prog/playwright/packages/playwright-test/src/workerRunner.ts:317:24) at TimeoutRunner.run (/Users/andreylushnikov/prog/playwright/packages/playwright-core/src/utils/async.ts:48:14) at TestInfoImpl._runWithTimeout (/Users/andreylushnikov/prog/playwright/packages/playwright-test/src/testInfo.ts:151:7) at WorkerRunner._runTestOrAllHook (/Users/andreylushnikov/prog/playwright/packages/playwright-test/src/workerRunner.ts:276:5) at WorkerRunner._runSuite (/Users/andreylushnikov/prog/playwright/packages/playwright-test/src/workerRunner.ts:190:11) at WorkerRunner.run (/Users/andreylushnikov/prog/playwright/packages/playwright-test/src/workerRunner.ts:137:9) at process. (/Users/andreylushnikov/prog/playwright/packages/playwright-test/src/worker.ts:87:5) ``` after: ``` Running 1 test using 1 worker 1) [chromium] › tests/example.spec.ts:3:1 › should work ========================================== Error: expect(received).toBe(expected) // Object.is equality Expected: 2 Received: 1 2 | 3 | test('should work', async({page}) => { > 4 | expect(1).toBe(2); | ^ 5 | }); 6 | at /Users/andreylushnikov/tmp/tests/example.spec.ts:4:13 ``` --- packages/playwright-core/package.json | 1 + .../playwright-core/src/utils/stackTrace.ts | 26 ++-- packages/playwright-test/src/util.ts | 33 ++++++ tests/playwright-test/loader.spec.ts | 111 +++++++++++++++++- 4 files changed, 160 insertions(+), 11 deletions(-) diff --git a/packages/playwright-core/package.json b/packages/playwright-core/package.json index bc6bf05e17000..cd96911c1dea0 100644 --- a/packages/playwright-core/package.json +++ b/packages/playwright-core/package.json @@ -28,6 +28,7 @@ "./lib/utils/processLauncher": "./lib/utils/processLauncher.js", "./lib/utils/registry": "./lib/utils/registry.js", "./lib/utils/utils": "./lib/utils/utils.js", + "./lib/utils/stackTrace": "./lib/utils/stackTrace.js", "./lib/remote/playwrightServer": "./lib/remote/playwrightServer.js", "./lib/remote/playwrightClient": "./lib/remote/playwrightClient.js" }, diff --git a/packages/playwright-core/src/utils/stackTrace.ts b/packages/playwright-core/src/utils/stackTrace.ts index a0e10361766c9..1aed8bf5001ed 100644 --- a/packages/playwright-core/src/utils/stackTrace.ts +++ b/packages/playwright-core/src/utils/stackTrace.ts @@ -56,6 +56,21 @@ export function captureRawStack(): string { return stack; } +export function isInternalFileName(file: string, functionName?: string): boolean { + // Node 16+ has node:internal. + if (file.startsWith('internal') || file.startsWith('node:')) + return true; + // EventEmitter.emit has 'events.js' file. + if (file === 'events.js' && functionName?.endsWith('emit')) + return true; + // Node 12 + if (file === '_stream_readable.js' || file === '_stream_writable.js') + return true; + if (file.startsWith(WS_LIB)) + return true; + return false; +} + export function captureStackTrace(rawStack?: string): ParsedStackTrace { const stack = rawStack || captureRawStack(); @@ -69,16 +84,7 @@ export function captureStackTrace(rawStack?: string): ParsedStackTrace { const frame = stackUtils.parseLine(line); if (!frame || !frame.file) return null; - // Node 16+ has node:internal. - if (frame.file.startsWith('internal') || frame.file.startsWith('node:')) - return null; - // EventEmitter.emit has 'events.js' file. - if (frame.file === 'events.js' && frame.function?.endsWith('.emit')) - return null; - // Node 12 - if (frame.file === '_stream_readable.js' || frame.file === '_stream_writable.js') - return null; - if (frame.file.startsWith(WS_LIB)) + if (isInternalFileName(frame.file, frame.function)) return null; // Workaround for https://github.com/tapjs/stack-utils/issues/60 let fileName: string; diff --git a/packages/playwright-test/src/util.ts b/packages/playwright-test/src/util.ts index 42731e9543555..29e5556e455a5 100644 --- a/packages/playwright-test/src/util.ts +++ b/packages/playwright-test/src/util.ts @@ -21,9 +21,42 @@ import type { TestError, Location } from './types'; import { default as minimatch } from 'minimatch'; import debug from 'debug'; import { calculateSha1, isRegExp } from 'playwright-core/lib/utils/utils'; +import { isInternalFileName } from 'playwright-core/lib/utils/stackTrace'; + +const PLAYWRIGHT_CORE_PATH = path.dirname(require.resolve('playwright-core')); +const PLAYWRIGHT_TEST_PATH = path.join(__dirname, '..'); + +function filterStackTrace(e: Error) { + // This method filters internal stack frames using Error.prepareStackTrace + // hook. Read more about the hook: https://v8.dev/docs/stack-trace-api + // + // NOTE: Error.prepareStackTrace will only be called if `e.stack` has not + // been accessed before. This is the case for Jest Expect and simple throw + // statements. + // + // If `e.stack` has been accessed, this method will be NOOP. + const oldPrepare = Error.prepareStackTrace; + const stackFormatter = oldPrepare || ((error, structuredStackTrace) => [ + `${error.name}: ${error.message}`, + ...structuredStackTrace.map(callSite => ' at ' + callSite.toString()), + ].join('\n')); + Error.prepareStackTrace = (error, structuredStackTrace) => { + return stackFormatter(error, structuredStackTrace.filter(callSite => { + const fileName = callSite.getFileName(); + const functionName = callSite.getFunctionName() || undefined; + if (!fileName) + return true; + return !fileName.startsWith(PLAYWRIGHT_TEST_PATH) && !fileName.startsWith(PLAYWRIGHT_CORE_PATH) && !isInternalFileName(fileName, functionName); + })); + }; + // eslint-disable-next-line + e.stack; // trigger Error.prepareStackTrace + Error.prepareStackTrace = oldPrepare; +} export function serializeError(error: Error | any): TestError { if (error instanceof Error) { + filterStackTrace(error); return { message: error.message, stack: error.stack diff --git a/tests/playwright-test/loader.spec.ts b/tests/playwright-test/loader.spec.ts index 48cca5077577d..ad6a4f449fe79 100644 --- a/tests/playwright-test/loader.spec.ts +++ b/tests/playwright-test/loader.spec.ts @@ -14,7 +14,8 @@ * limitations under the License. */ -import { test, expect } from './playwright-test-fixtures'; +import { test, expect, stripAnsi } from './playwright-test-fixtures'; +import path from 'path'; test('should return the location of a syntax error', async ({ runInlineTest }) => { const result = await runInlineTest({ @@ -265,3 +266,111 @@ test('should import esm from ts when package.json has type module in experimenta expect(result.exitCode).toBe(0); }); + +test('should filter stack trace for simple expect', async ({ runInlineTest }) => { + const result = await runInlineTest({ + 'expect-test.spec.ts': ` + const { test } = pwt; + test('should work', () => { + test.expect(1+1).toEqual(3); + }); + ` + }); + expect(result.exitCode).toBe(1); + expect(stripAnsi(result.output)).not.toContain(path.sep + `playwright-test`); + expect(stripAnsi(result.output)).not.toContain(path.sep + `playwright-core`); + expect(stripAnsi(result.output)).not.toContain('internal'); +}); + +test('should filter stack trace for web-first assertions', async ({ runInlineTest }) => { + const result = await runInlineTest({ + 'expect-test.spec.ts': ` + const { test } = pwt; + test('should work', async ({page}) => { + await expect(page.locator('x-foo'), 'x-foo must be visible').toBeVisible({timeout: 1}); + }); + ` + }); + expect(result.exitCode).toBe(1); + expect(stripAnsi(result.output)).not.toContain(path.sep + `playwright-test`); + expect(stripAnsi(result.output)).not.toContain(path.sep + `playwright-core`); + expect(stripAnsi(result.output)).not.toContain('internal'); +}); + +test('should filter out event emitter from stack traces', async ({ runInlineTest }, testInfo) => { + const result = await runInlineTest({ + 'expect-test.spec.ts': ` + const { test } = pwt; + const EventEmitter = require('events'); + test('should work', async ({}) => { + const emitter = new EventEmitter(); + emitter.on('event', function handle() { expect(1).toBe(2); }); + emitter.emit('event'); + }); + ` + }); + expect(result.exitCode).toBe(1); + const outputWithoutGoodStackFrames = stripAnsi(result.output).split('\n').filter(line => !line.includes(testInfo.outputPath())).join('\n'); + expect(outputWithoutGoodStackFrames).not.toContain('EventEmitter.emit'); +}); + +test('should filter stack trace for raw errors', async ({ runInlineTest }) => { + const result = await runInlineTest({ + 'expect-test.spec.ts': ` + const { test } = pwt; + test('should work', async ({}) => { + throw new Error('foobar!'); + }); + ` + }); + expect(result.exitCode).toBe(1); + expect(stripAnsi(result.output)).toContain('foobar!'); + expect(stripAnsi(result.output)).not.toContain(path.sep + `playwright-test`); + expect(stripAnsi(result.output)).not.toContain(path.sep + `playwright-core`); + expect(stripAnsi(result.output)).not.toContain('internal'); +}); + +test('should not filter out POM', async ({ runInlineTest }) => { + const result = await runInlineTest({ + 'helper.ts': ` + export function foo() { + throw new Error('foo'); + } + `, + 'expect-test.spec.ts': ` + const { test } = pwt; + const { foo } = require('./helper'); + test('should work', ({}) => { + foo(); + }); + ` + }); + expect(result.exitCode).toBe(1); + expect(stripAnsi(result.output)).toContain('foo'); + expect(stripAnsi(result.output)).toContain('helper.ts'); + expect(stripAnsi(result.output)).toContain('expect-test.spec.ts'); + expect(stripAnsi(result.output)).not.toContain(path.sep + `playwright-test`); + expect(stripAnsi(result.output)).not.toContain(path.sep + `playwright-core`); + expect(stripAnsi(result.output)).not.toContain('internal'); +}); + +test('should filter stack even without default Error.prepareStackTrace', async ({ runInlineTest }) => { + const result = await runInlineTest({ + 'expect-test.spec.ts': ` + const { test } = pwt; + test('should work', ({}) => { + Error.prepareStackTrace = undefined; + throw new Error('foobar'); + }); + ` + }); + expect(result.exitCode).toBe(1); + expect(stripAnsi(result.output)).toContain('foobar'); + expect(stripAnsi(result.output)).toContain('expect-test.spec.ts'); + expect(stripAnsi(result.output)).not.toContain(path.sep + `playwright-test`); + expect(stripAnsi(result.output)).not.toContain(path.sep + `playwright-core`); + expect(stripAnsi(result.output)).not.toContain('internal'); + const stackLines = stripAnsi(result.output).split('\n').filter(line => line.includes(' at ')); + expect(stackLines.length).toBe(1); +}); + From c752b285167afef73a78af53863dc86c48b50620 Mon Sep 17 00:00:00 2001 From: Max Schmitt Date: Wed, 2 Feb 2022 11:14:41 +0100 Subject: [PATCH 184/233] chore: pin production dependencies (#11793) --- package-lock.json | 228 +++++++++--------- packages/playwright-chromium/package.json | 2 +- packages/playwright-core/package.json | 32 +-- .../playwright-core/src/grid/gridAgent.ts | 4 +- .../playwright-core/src/grid/gridServer.ts | 6 +- .../playwright-core/src/grid/gridWorker.ts | 4 +- packages/playwright-firefox/package.json | 2 +- packages/playwright-test/package.json | 74 +++--- packages/playwright-webkit/package.json | 2 +- packages/playwright/package.json | 2 +- tests/config/testMode.ts | 4 +- utils/bump_package_versions.js | 2 +- utils/prepare_packages.js | 2 +- 13 files changed, 182 insertions(+), 182 deletions(-) diff --git a/package-lock.json b/package-lock.json index 85a7f20de0dbb..fa4d003d996aa 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7516,7 +7516,7 @@ "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { - "playwright-core": "=1.19.0-next" + "playwright-core": "1.19.0-next" }, "bin": { "playwright": "cli.js" @@ -7530,7 +7530,7 @@ "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { - "playwright-core": "=1.19.0-next" + "playwright-core": "1.19.0-next" }, "bin": { "playwright": "cli.js" @@ -7543,22 +7543,22 @@ "version": "1.19.0-next", "license": "Apache-2.0", "dependencies": { - "commander": "^8.3.0", - "debug": "^4.3.3", - "extract-zip": "^2.0.1", - "https-proxy-agent": "^5.0.0", - "jpeg-js": "^0.4.3", - "mime": "^3.0.0", - "pngjs": "^6.0.0", - "progress": "^2.0.3", - "proper-lockfile": "^4.1.2", - "proxy-from-env": "^1.1.0", - "rimraf": "^3.0.2", - "socks-proxy-agent": "^6.1.1", - "stack-utils": "^2.0.5", - "ws": "^8.4.2", - "yauzl": "^2.10.0", - "yazl": "^2.5.1" + "commander": "8.3.0", + "debug": "4.3.3", + "extract-zip": "2.0.1", + "https-proxy-agent": "5.0.0", + "jpeg-js": "0.4.3", + "mime": "3.0.0", + "pngjs": "6.0.0", + "progress": "2.0.3", + "proper-lockfile": "4.1.2", + "proxy-from-env": "1.1.0", + "rimraf": "3.0.2", + "socks-proxy-agent": "6.1.1", + "stack-utils": "2.0.5", + "ws": "8.4.2", + "yauzl": "2.10.0", + "yazl": "2.5.1" }, "bin": { "playwright": "cli.js" @@ -7580,7 +7580,7 @@ "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { - "playwright-core": "=1.19.0-next" + "playwright-core": "1.19.0-next" }, "bin": { "playwright": "cli.js" @@ -7594,44 +7594,44 @@ "version": "1.19.0-next", "license": "Apache-2.0", "dependencies": { - "@babel/code-frame": "^7.16.7", - "@babel/core": "^7.16.12", - "@babel/plugin-proposal-class-properties": "^7.16.7", - "@babel/plugin-proposal-dynamic-import": "^7.16.7", - "@babel/plugin-proposal-export-namespace-from": "^7.16.7", - "@babel/plugin-proposal-logical-assignment-operators": "^7.16.7", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.7", - "@babel/plugin-proposal-numeric-separator": "^7.16.7", - "@babel/plugin-proposal-optional-chaining": "^7.16.7", - "@babel/plugin-proposal-private-methods": "^7.16.11", - "@babel/plugin-proposal-private-property-in-object": "^7.16.7", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-transform-modules-commonjs": "^7.16.8", - "@babel/plugin-transform-react-jsx": "^7.16.7", - "@babel/preset-typescript": "^7.16.7", - "babel-plugin-module-resolver": "^4.1.0", + "@babel/code-frame": "7.16.7", + "@babel/core": "7.16.12", + "@babel/plugin-proposal-class-properties": "7.16.7", + "@babel/plugin-proposal-dynamic-import": "7.16.7", + "@babel/plugin-proposal-export-namespace-from": "7.16.7", + "@babel/plugin-proposal-logical-assignment-operators": "7.16.7", + "@babel/plugin-proposal-nullish-coalescing-operator": "7.16.7", + "@babel/plugin-proposal-numeric-separator": "7.16.7", + "@babel/plugin-proposal-optional-chaining": "7.16.7", + "@babel/plugin-proposal-private-methods": "7.16.11", + "@babel/plugin-proposal-private-property-in-object": "7.16.7", + "@babel/plugin-syntax-async-generators": "7.8.4", + "@babel/plugin-syntax-json-strings": "7.8.3", + "@babel/plugin-syntax-object-rest-spread": "7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "7.8.3", + "@babel/plugin-transform-modules-commonjs": "7.16.8", + "@babel/plugin-transform-react-jsx": "7.16.7", + "@babel/preset-typescript": "7.16.7", + "babel-plugin-module-resolver": "4.1.0", "colors": "1.4.0", - "commander": "^8.3.0", - "debug": "^4.3.3", - "expect": "=27.2.5", - "jest-matcher-utils": "=27.2.5", - "jpeg-js": "^0.4.3", - "json5": "^2.2.0", - "mime": "^3.0.0", - "minimatch": "^3.0.4", - "ms": "^2.1.3", - "open": "^8.4.0", - "pirates": "=4.0.4", - "pixelmatch": "^5.2.1", - "playwright-core": "=1.19.0-next", - "pngjs": "^6.0.0", - "rimraf": "^3.0.2", - "source-map-support": "^0.5.21", - "stack-utils": "^2.0.5", - "yazl": "^2.5.1" + "commander": "8.3.0", + "debug": "4.3.3", + "expect": "27.2.5", + "jest-matcher-utils": "27.2.5", + "jpeg-js": "0.4.3", + "json5": "2.2.0", + "mime": "3.0.0", + "minimatch": "3.0.4", + "ms": "2.1.3", + "open": "8.4.0", + "pirates": "4.0.4", + "pixelmatch": "5.2.1", + "playwright-core": "1.19.0-next", + "pngjs": "6.0.0", + "rimraf": "3.0.2", + "source-map-support": "0.5.21", + "stack-utils": "2.0.5", + "yazl": "2.5.1" }, "bin": { "playwright": "cli.js" @@ -7666,7 +7666,7 @@ "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { - "playwright-core": "=1.19.0-next" + "playwright-core": "1.19.0-next" }, "bin": { "playwright": "cli.js" @@ -8403,44 +8403,44 @@ "@playwright/test": { "version": "file:packages/playwright-test", "requires": { - "@babel/code-frame": "^7.16.7", - "@babel/core": "^7.16.12", - "@babel/plugin-proposal-class-properties": "^7.16.7", - "@babel/plugin-proposal-dynamic-import": "^7.16.7", - "@babel/plugin-proposal-export-namespace-from": "^7.16.7", - "@babel/plugin-proposal-logical-assignment-operators": "^7.16.7", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.7", - "@babel/plugin-proposal-numeric-separator": "^7.16.7", - "@babel/plugin-proposal-optional-chaining": "^7.16.7", - "@babel/plugin-proposal-private-methods": "^7.16.11", - "@babel/plugin-proposal-private-property-in-object": "^7.16.7", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-transform-modules-commonjs": "^7.16.8", - "@babel/plugin-transform-react-jsx": "^7.16.7", - "@babel/preset-typescript": "^7.16.7", - "babel-plugin-module-resolver": "^4.1.0", + "@babel/code-frame": "7.16.7", + "@babel/core": "7.16.12", + "@babel/plugin-proposal-class-properties": "7.16.7", + "@babel/plugin-proposal-dynamic-import": "7.16.7", + "@babel/plugin-proposal-export-namespace-from": "7.16.7", + "@babel/plugin-proposal-logical-assignment-operators": "7.16.7", + "@babel/plugin-proposal-nullish-coalescing-operator": "7.16.7", + "@babel/plugin-proposal-numeric-separator": "7.16.7", + "@babel/plugin-proposal-optional-chaining": "7.16.7", + "@babel/plugin-proposal-private-methods": "7.16.11", + "@babel/plugin-proposal-private-property-in-object": "7.16.7", + "@babel/plugin-syntax-async-generators": "7.8.4", + "@babel/plugin-syntax-json-strings": "7.8.3", + "@babel/plugin-syntax-object-rest-spread": "7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "7.8.3", + "@babel/plugin-transform-modules-commonjs": "7.16.8", + "@babel/plugin-transform-react-jsx": "7.16.7", + "@babel/preset-typescript": "7.16.7", + "babel-plugin-module-resolver": "4.1.0", "colors": "1.4.0", - "commander": "^8.3.0", - "debug": "^4.3.3", - "expect": "=27.2.5", - "jest-matcher-utils": "=27.2.5", - "jpeg-js": "^0.4.3", - "json5": "^2.2.0", - "mime": "^3.0.0", - "minimatch": "^3.0.4", - "ms": "^2.1.3", - "open": "^8.4.0", - "pirates": "=4.0.4", - "pixelmatch": "^5.2.1", - "playwright-core": "=1.19.0-next", - "pngjs": "^6.0.0", - "rimraf": "^3.0.2", - "source-map-support": "^0.5.21", - "stack-utils": "^2.0.5", - "yazl": "^2.5.1" + "commander": "8.3.0", + "debug": "4.3.3", + "expect": "27.2.5", + "jest-matcher-utils": "27.2.5", + "jpeg-js": "0.4.3", + "json5": "2.2.0", + "mime": "3.0.0", + "minimatch": "3.0.4", + "ms": "2.1.3", + "open": "8.4.0", + "pirates": "4.0.4", + "pixelmatch": "5.2.1", + "playwright-core": "1.19.0-next", + "pngjs": "6.0.0", + "rimraf": "3.0.2", + "source-map-support": "0.5.21", + "stack-utils": "2.0.5", + "yazl": "2.5.1" }, "dependencies": { "commander": { @@ -12100,34 +12100,34 @@ "playwright": { "version": "file:packages/playwright", "requires": { - "playwright-core": "=1.19.0-next" + "playwright-core": "1.19.0-next" } }, "playwright-chromium": { "version": "file:packages/playwright-chromium", "requires": { - "playwright-core": "=1.19.0-next" + "playwright-core": "1.19.0-next" } }, "playwright-core": { "version": "file:packages/playwright-core", "requires": { - "commander": "^8.3.0", - "debug": "^4.3.3", - "extract-zip": "^2.0.1", - "https-proxy-agent": "^5.0.0", - "jpeg-js": "^0.4.3", - "mime": "^3.0.0", - "pngjs": "^6.0.0", - "progress": "^2.0.3", - "proper-lockfile": "^4.1.2", - "proxy-from-env": "^1.1.0", - "rimraf": "^3.0.2", - "socks-proxy-agent": "^6.1.1", - "stack-utils": "^2.0.5", - "ws": "^8.4.2", - "yauzl": "^2.10.0", - "yazl": "^2.5.1" + "commander": "8.3.0", + "debug": "4.3.3", + "extract-zip": "2.0.1", + "https-proxy-agent": "5.0.0", + "jpeg-js": "0.4.3", + "mime": "3.0.0", + "pngjs": "6.0.0", + "progress": "2.0.3", + "proper-lockfile": "4.1.2", + "proxy-from-env": "1.1.0", + "rimraf": "3.0.2", + "socks-proxy-agent": "6.1.1", + "stack-utils": "2.0.5", + "ws": "8.4.2", + "yauzl": "2.10.0", + "yazl": "2.5.1" }, "dependencies": { "commander": { @@ -12140,13 +12140,13 @@ "playwright-firefox": { "version": "file:packages/playwright-firefox", "requires": { - "playwright-core": "=1.19.0-next" + "playwright-core": "1.19.0-next" } }, "playwright-webkit": { "version": "file:packages/playwright-webkit", "requires": { - "playwright-core": "=1.19.0-next" + "playwright-core": "1.19.0-next" } }, "pngjs": { diff --git a/packages/playwright-chromium/package.json b/packages/playwright-chromium/package.json index 5328ce1e6891d..1d826b8a17aa5 100644 --- a/packages/playwright-chromium/package.json +++ b/packages/playwright-chromium/package.json @@ -26,6 +26,6 @@ "install": "node install.js" }, "dependencies": { - "playwright-core": "=1.19.0-next" + "playwright-core": "1.19.0-next" } } diff --git a/packages/playwright-core/package.json b/packages/playwright-core/package.json index cd96911c1dea0..83c640e46e687 100644 --- a/packages/playwright-core/package.json +++ b/packages/playwright-core/package.json @@ -37,21 +37,21 @@ "playwright": "./cli.js" }, "dependencies": { - "commander": "^8.3.0", - "debug": "^4.3.3", - "extract-zip": "^2.0.1", - "https-proxy-agent": "^5.0.0", - "jpeg-js": "^0.4.3", - "mime": "^3.0.0", - "pngjs": "^6.0.0", - "progress": "^2.0.3", - "proper-lockfile": "^4.1.2", - "proxy-from-env": "^1.1.0", - "rimraf": "^3.0.2", - "socks-proxy-agent": "^6.1.1", - "stack-utils": "^2.0.5", - "ws": "^8.4.2", - "yauzl": "^2.10.0", - "yazl": "^2.5.1" + "commander": "8.3.0", + "debug": "4.3.3", + "extract-zip": "2.0.1", + "https-proxy-agent": "5.0.0", + "jpeg-js": "0.4.3", + "mime": "3.0.0", + "pngjs": "6.0.0", + "progress": "2.0.3", + "proper-lockfile": "4.1.2", + "proxy-from-env": "1.1.0", + "rimraf": "3.0.2", + "socks-proxy-agent": "6.1.1", + "stack-utils": "2.0.5", + "ws": "8.4.2", + "yauzl": "2.10.0", + "yazl": "2.5.1" } } diff --git a/packages/playwright-core/src/grid/gridAgent.ts b/packages/playwright-core/src/grid/gridAgent.ts index 998bf9f0f4622..7bce0f3e45312 100644 --- a/packages/playwright-core/src/grid/gridAgent.ts +++ b/packages/playwright-core/src/grid/gridAgent.ts @@ -20,12 +20,12 @@ import { fork } from 'child_process'; import { getPlaywrightVersion } from '../utils/utils'; export function launchGridAgent(agentId: string, gridURL: string) { - const log = debug(`[agent ${agentId}]`); + const log = debug(`pw:grid:agent:${agentId}`); log('created'); const params = new URLSearchParams(); params.set('pwVersion', getPlaywrightVersion(true /* majorMinorOnly */)); params.set('agentId', agentId); - const ws = new WebSocket(gridURL + `/registerAgent?` + params.toString()); + const ws = new WebSocket(gridURL.replace('http://', 'ws://') + `/registerAgent?` + params.toString()); ws.on('message', (workerId: string) => { log('Worker requested ' + workerId); fork(require.resolve('./gridWorker.js'), [gridURL, agentId, workerId], { detached: true }); diff --git a/packages/playwright-core/src/grid/gridServer.ts b/packages/playwright-core/src/grid/gridServer.ts index 41e03a7445856..e9f212de70cf3 100644 --- a/packages/playwright-core/src/grid/gridServer.ts +++ b/packages/playwright-core/src/grid/gridServer.ts @@ -65,7 +65,7 @@ class GridWorker extends EventEmitter { constructor(clientSocket: WebSocket) { super(); - this._log = debug(`[worker ${this.workerId}]`); + this._log = debug(`pw:grid:worker${this.workerId}`); this._clientSocket = clientSocket; clientSocket.on('close', (code: number, reason: string) => this.closeWorker(WSErrors.NO_ERROR)); clientSocket.on('error', (error: Error) => this.closeWorker(WSErrors.CLIENT_SOCKET_ERROR)); @@ -110,7 +110,7 @@ class GridAgent extends EventEmitter { constructor(capacity = Infinity, creationTimeout = 5 * 60000, retireTimeout = 30000) { super(); this._capacity = capacity; - this._log = debug(`[agent ${this.agentId}]`); + this._log = debug(`pw:grid:agent${this.agentId}`); this.setStatus('created'); this._retireTimeout = retireTimeout; this._agentCreationTimeoutId = setTimeout(() => { @@ -196,7 +196,7 @@ export class GridServer { private _pwVersion: string; constructor(factory: GridFactory, authToken: string = '') { - this._log = debug(`[grid]`); + this._log = debug(`pw:grid:server`); this._authToken = authToken || ''; this._server = new HttpServer(); this._factory = factory; diff --git a/packages/playwright-core/src/grid/gridWorker.ts b/packages/playwright-core/src/grid/gridWorker.ts index 21ac465918c12..5ddf6eb6fc349 100644 --- a/packages/playwright-core/src/grid/gridWorker.ts +++ b/packages/playwright-core/src/grid/gridWorker.ts @@ -22,9 +22,9 @@ import { createPlaywright } from '../server/playwright'; import { gracefullyCloseAll } from '../utils/processLauncher'; function launchGridWorker(gridURL: string, agentId: string, workerId: string) { - const log = debug(`[worker ${workerId}]`); + const log = debug(`pw:grid:worker${workerId}`); log('created'); - const ws = new WebSocket(gridURL + `/registerWorker?agentId=${agentId}&workerId=${workerId}`); + const ws = new WebSocket(gridURL.replace('http://', 'ws://') + `/registerWorker?agentId=${agentId}&workerId=${workerId}`); const dispatcherConnection = new DispatcherConnection(); dispatcherConnection.onmessage = message => ws.send(JSON.stringify(message)); ws.once('open', () => { diff --git a/packages/playwright-firefox/package.json b/packages/playwright-firefox/package.json index ffbab4ed120a3..0c050f1cf9155 100644 --- a/packages/playwright-firefox/package.json +++ b/packages/playwright-firefox/package.json @@ -26,6 +26,6 @@ "install": "node install.js" }, "dependencies": { - "playwright-core": "=1.19.0-next" + "playwright-core": "1.19.0-next" } } diff --git a/packages/playwright-test/package.json b/packages/playwright-test/package.json index 73888bb5c436a..bcdacec143146 100644 --- a/packages/playwright-test/package.json +++ b/packages/playwright-test/package.json @@ -27,43 +27,43 @@ }, "license": "Apache-2.0", "dependencies": { - "@babel/code-frame": "^7.16.7", - "@babel/core": "^7.16.12", - "@babel/plugin-proposal-class-properties": "^7.16.7", - "@babel/plugin-proposal-dynamic-import": "^7.16.7", - "@babel/plugin-proposal-export-namespace-from": "^7.16.7", - "@babel/plugin-proposal-logical-assignment-operators": "^7.16.7", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.7", - "@babel/plugin-proposal-numeric-separator": "^7.16.7", - "@babel/plugin-proposal-optional-chaining": "^7.16.7", - "@babel/plugin-proposal-private-methods": "^7.16.11", - "@babel/plugin-proposal-private-property-in-object": "^7.16.7", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-transform-modules-commonjs": "^7.16.8", - "@babel/plugin-transform-react-jsx": "^7.16.7", - "@babel/preset-typescript": "^7.16.7", - "babel-plugin-module-resolver": "^4.1.0", + "@babel/code-frame": "7.16.7", + "@babel/core": "7.16.12", + "@babel/plugin-proposal-class-properties": "7.16.7", + "@babel/plugin-proposal-dynamic-import": "7.16.7", + "@babel/plugin-proposal-export-namespace-from": "7.16.7", + "@babel/plugin-proposal-logical-assignment-operators": "7.16.7", + "@babel/plugin-proposal-nullish-coalescing-operator": "7.16.7", + "@babel/plugin-proposal-numeric-separator": "7.16.7", + "@babel/plugin-proposal-optional-chaining": "7.16.7", + "@babel/plugin-proposal-private-methods": "7.16.11", + "@babel/plugin-proposal-private-property-in-object": "7.16.7", + "@babel/plugin-syntax-async-generators": "7.8.4", + "@babel/plugin-syntax-json-strings": "7.8.3", + "@babel/plugin-syntax-object-rest-spread": "7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "7.8.3", + "@babel/plugin-transform-modules-commonjs": "7.16.8", + "@babel/plugin-transform-react-jsx": "7.16.7", + "@babel/preset-typescript": "7.16.7", + "babel-plugin-module-resolver": "4.1.0", "colors": "1.4.0", - "commander": "^8.3.0", - "debug": "^4.3.3", - "expect": "=27.2.5", - "jest-matcher-utils": "=27.2.5", - "jpeg-js": "^0.4.3", - "json5": "^2.2.0", - "mime": "^3.0.0", - "minimatch": "^3.0.4", - "ms": "^2.1.3", - "open": "^8.4.0", - "pirates": "=4.0.4", - "pixelmatch": "^5.2.1", - "playwright-core": "=1.19.0-next", - "pngjs": "^6.0.0", - "rimraf": "^3.0.2", - "source-map-support": "^0.5.21", - "stack-utils": "^2.0.5", - "yazl": "^2.5.1" + "commander": "8.3.0", + "debug": "4.3.3", + "expect": "27.2.5", + "jest-matcher-utils": "27.2.5", + "jpeg-js": "0.4.3", + "json5": "2.2.0", + "mime": "3.0.0", + "minimatch": "3.0.4", + "ms": "2.1.3", + "open": "8.4.0", + "pirates": "4.0.4", + "pixelmatch": "5.2.1", + "playwright-core": "1.19.0-next", + "pngjs": "6.0.0", + "rimraf": "3.0.2", + "source-map-support": "0.5.21", + "stack-utils": "2.0.5", + "yazl": "2.5.1" } } diff --git a/packages/playwright-webkit/package.json b/packages/playwright-webkit/package.json index 7b2b4b850d485..813e46cc5402d 100644 --- a/packages/playwright-webkit/package.json +++ b/packages/playwright-webkit/package.json @@ -25,6 +25,6 @@ "install": "node install.js" }, "dependencies": { - "playwright-core": "=1.19.0-next" + "playwright-core": "1.19.0-next" } } diff --git a/packages/playwright/package.json b/packages/playwright/package.json index c822b9543ce5a..3623f4b1ada93 100644 --- a/packages/playwright/package.json +++ b/packages/playwright/package.json @@ -26,6 +26,6 @@ "install": "node install.js" }, "dependencies": { - "playwright-core": "=1.19.0-next" + "playwright-core": "1.19.0-next" } } diff --git a/tests/config/testMode.ts b/tests/config/testMode.ts index 6f470cbc6ac38..9b00ec3c34b2e 100644 --- a/tests/config/testMode.ts +++ b/tests/config/testMode.ts @@ -44,12 +44,12 @@ export class ServiceTestMode implements TestMode { private _gridClient: GridClient; async setup() { - this._gridClient = await GridClient.connect('http://localhost:3333'); + this._gridClient = await GridClient.connect('ws://localhost:3333'); return this._gridClient.playwright(); } async teardown() { - await this._gridClient.close(); + this._gridClient.close(); } } diff --git a/utils/bump_package_versions.js b/utils/bump_package_versions.js index 0619491962ace..3ccf2bac99df9 100755 --- a/utils/bump_package_versions.js +++ b/utils/bump_package_versions.js @@ -54,7 +54,7 @@ const { packages, packagesToPublish } = require('./list_packages.js'); if (publicPackages.has(package)) playwrightCorePackages.version = version; if (playwrightCorePackages.dependencies && playwrightCorePackages.dependencies['playwright-core']) - packageLock['packages']['packages/playwright-test']['dependencies']['playwright-core'] = '=' + version; + packageLock['packages']['packages/playwright-test']['dependencies']['playwright-core'] = version; } fs.writeFileSync(packageLockPath, JSON.stringify(packageLock, null, 2) + '\n'); } diff --git a/utils/prepare_packages.js b/utils/prepare_packages.js index 5e90c84a2c2fc..a6072050adbab 100644 --- a/utils/prepare_packages.js +++ b/utils/prepare_packages.js @@ -105,7 +105,7 @@ async function lintPackage(packageName) { currentPackageJSON.license = pwInternalJSON.license; for (const name of Object.keys(currentPackageJSON.dependencies || {})) { if (name in PACKAGES) - currentPackageJSON.dependencies[name] = `=${pwInternalJSON.version}`; + currentPackageJSON.dependencies[name] = pwInternalJSON.version; } await writeToPackage('package.json', JSON.stringify(currentPackageJSON, null, 2) + '\n'); From fba523a9d04983bc69aa691ef0c0df64a8d02ac1 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 2 Feb 2022 11:39:10 +0100 Subject: [PATCH 185/233] feat(chromium): roll to r965416 (#11802) Co-authored-by: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Max Schmitt --- README.md | 4 +- packages/playwright-core/browsers.json | 4 +- .../src/server/chromium/protocol.d.ts | 114 +++++++++++++++--- .../src/server/deviceDescriptorsSource.json | 92 +++++++------- packages/playwright-core/types/protocol.d.ts | 114 +++++++++++++++--- tests/page/page-network-response.spec.ts | 4 +- 6 files changed, 252 insertions(+), 80 deletions(-) diff --git a/README.md b/README.md index 80d756bcb60d8..3ea2421ac8b74 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # 🎭 Playwright -[![npm version](https://img.shields.io/npm/v/playwright.svg?style=flat)](https://www.npmjs.com/package/playwright) [![Chromium version](https://img.shields.io/badge/chromium-99.0.4837.0-blue.svg?logo=google-chrome)](https://www.chromium.org/Home) [![Firefox version](https://img.shields.io/badge/firefox-96.0.1-blue.svg?logo=mozilla-firefox)](https://www.mozilla.org/en-US/firefox/new/) [![WebKit version](https://img.shields.io/badge/webkit-15.4-blue.svg?logo=safari)](https://webkit.org/) +[![npm version](https://img.shields.io/npm/v/playwright.svg?style=flat)](https://www.npmjs.com/package/playwright) [![Chromium version](https://img.shields.io/badge/chromium-100.0.4863.0-blue.svg?logo=google-chrome)](https://www.chromium.org/Home) [![Firefox version](https://img.shields.io/badge/firefox-96.0.1-blue.svg?logo=mozilla-firefox)](https://www.mozilla.org/en-US/firefox/new/) [![WebKit version](https://img.shields.io/badge/webkit-15.4-blue.svg?logo=safari)](https://webkit.org/) ## [Documentation](https://playwright.dev) | [API reference](https://playwright.dev/docs/api/class-playwright/) @@ -8,7 +8,7 @@ Playwright is a framework for Web Testing and Automation. It allows testing [Chr | | Linux | macOS | Windows | | :--- | :---: | :---: | :---: | -| Chromium 99.0.4837.0 | :white_check_mark: | :white_check_mark: | :white_check_mark: | +| Chromium 100.0.4863.0 | :white_check_mark: | :white_check_mark: | :white_check_mark: | | WebKit 15.4 | :white_check_mark: | :white_check_mark: | :white_check_mark: | | Firefox 96.0.1 | :white_check_mark: | :white_check_mark: | :white_check_mark: | diff --git a/packages/playwright-core/browsers.json b/packages/playwright-core/browsers.json index 8b367ba0537c9..75fab9a83aeff 100644 --- a/packages/playwright-core/browsers.json +++ b/packages/playwright-core/browsers.json @@ -3,12 +3,12 @@ "browsers": [ { "name": "chromium", - "revision": "960211", + "revision": "965416", "installByDefault": true }, { "name": "chromium-with-symbols", - "revision": "960211", + "revision": "965416", "installByDefault": false }, { diff --git a/packages/playwright-core/src/server/chromium/protocol.d.ts b/packages/playwright-core/src/server/chromium/protocol.d.ts index ccdbb5c8015e5..f054c8cba8834 100644 --- a/packages/playwright-core/src/server/chromium/protocol.d.ts +++ b/packages/playwright-core/src/server/chromium/protocol.d.ts @@ -842,12 +842,6 @@ instead of "limited-quirks". url: string; location?: SourceCodeLocation; } - export interface WasmCrossOriginModuleSharingIssueDetails { - wasmModuleUrl: string; - sourceOrigin: string; - targetOrigin: string; - isWarning: boolean; - } export type GenericIssueErrorType = "CrossOriginPortalPostMessageError"; /** * Depending on the concrete errorType, different properties are set. @@ -880,6 +874,16 @@ https://www.chromestatus.com/feature/5684870116278272 for more details." deprecationType: string; } export type ClientHintIssueReason = "MetaTagAllowListInvalidOrigin"|"MetaTagModifiedHTML"; + export interface FederatedAuthRequestIssueDetails { + federatedAuthRequestIssueReason: FederatedAuthRequestIssueReason; + } + /** + * Represents the failure reason when a federated authentication reason fails. +Should be updated alongside RequestIdTokenStatus in +third_party/blink/public/mojom/webid/federated_auth_request.mojom to include +all cases except for success. + */ + export type FederatedAuthRequestIssueReason = "ApprovalDeclined"|"TooManyRequests"|"WellKnownHttpNotFound"|"WellKnownNoResponse"|"WellKnownInvalidResponse"|"ClientIdMetadataHttpNotFound"|"ClientIdMetadataNoResponse"|"ClientIdMetadataInvalidResponse"|"ErrorFetchingSignin"|"InvalidSigninResponse"|"AccountsHttpNotFound"|"AccountsNoResponse"|"AccountsInvalidResponse"|"IdTokenHttpNotFound"|"IdTokenNoResponse"|"IdTokenInvalidResponse"|"IdTokenInvalidRequest"|"ErrorIdToken"|"Canceled"; /** * This issue tracks client hints related issues. It's used to deprecate old features, encourage the use of new ones, and provide general guidance. @@ -893,7 +897,7 @@ features, encourage the use of new ones, and provide general guidance. optional fields in InspectorIssueDetails to convey more specific information about the kind of issue. */ - export type InspectorIssueCode = "SameSiteCookieIssue"|"MixedContentIssue"|"BlockedByResponseIssue"|"HeavyAdIssue"|"ContentSecurityPolicyIssue"|"SharedArrayBufferIssue"|"TrustedWebActivityIssue"|"LowTextContrastIssue"|"CorsIssue"|"AttributionReportingIssue"|"QuirksModeIssue"|"NavigatorUserAgentIssue"|"WasmCrossOriginModuleSharingIssue"|"GenericIssue"|"DeprecationIssue"|"ClientHintIssue"; + export type InspectorIssueCode = "SameSiteCookieIssue"|"MixedContentIssue"|"BlockedByResponseIssue"|"HeavyAdIssue"|"ContentSecurityPolicyIssue"|"SharedArrayBufferIssue"|"TrustedWebActivityIssue"|"LowTextContrastIssue"|"CorsIssue"|"AttributionReportingIssue"|"QuirksModeIssue"|"NavigatorUserAgentIssue"|"GenericIssue"|"DeprecationIssue"|"ClientHintIssue"|"FederatedAuthRequestIssue"; /** * This struct holds a list of optional fields with additional information specific to the kind of issue. When adding a new issue code, please also @@ -912,10 +916,10 @@ add a new optional field to this type. attributionReportingIssueDetails?: AttributionReportingIssueDetails; quirksModeIssueDetails?: QuirksModeIssueDetails; navigatorUserAgentIssueDetails?: NavigatorUserAgentIssueDetails; - wasmCrossOriginModuleSharingIssue?: WasmCrossOriginModuleSharingIssueDetails; genericIssueDetails?: GenericIssueDetails; deprecationIssueDetails?: DeprecationIssueDetails; clientHintIssueDetails?: ClientHintIssueDetails; + federatedAuthRequestIssueDetails?: FederatedAuthRequestIssueDetails; } /** * A unique id for a DevTools inspector issue. Allows other entities (e.g. @@ -3310,6 +3314,10 @@ be called for that search. * Enables DOM agent for the given page. */ export type enableParameters = { + /** + * Whether to include whitespaces in the children array of returned Nodes. + */ + includeWhitespace?: "none"|"all"; } export type enableReturnValue = { } @@ -6108,7 +6116,7 @@ modifiers, keyboard layout, etc (e.g., 'AltGr') (default: ""). /** * Editing commands to send with the key event (e.g., 'selectAll') (default: []). These are related to but not equal the command names used in `document.execCommand` and NSStandardKeyBindingResponding. -See https://source.chromium.org/chromium/chromium/src/+/master:third_party/blink/renderer/core/editing/commands/editor_command_names.h for valid command names. +See https://source.chromium.org/chromium/chromium/src/+/main:third_party/blink/renderer/core/editing/commands/editor_command_names.h for valid command names. */ commands?: string[]; } @@ -7943,7 +7951,7 @@ the same request (but not for redirected requests). initiatorIPAddressSpace: IPAddressSpace; privateNetworkRequestPolicy: PrivateNetworkRequestPolicy; } - export type CrossOriginOpenerPolicyValue = "SameOrigin"|"SameOriginAllowPopups"|"UnsafeNone"|"SameOriginPlusCoep"; + export type CrossOriginOpenerPolicyValue = "SameOrigin"|"SameOriginAllowPopups"|"UnsafeNone"|"SameOriginPlusCoep"|"SameOriginAllowPopupsPlusCoep"; export interface CrossOriginOpenerPolicyStatus { value: CrossOriginOpenerPolicyValue; reportOnlyValue: CrossOriginOpenerPolicyValue; @@ -10059,11 +10067,11 @@ Backend then generates 'inspectNodeRequested' event upon element selection. * All Permissions Policy features. This enum should match the one defined in third_party/blink/renderer/core/permissions_policy/permissions_policy_features.json5. */ - export type PermissionsPolicyFeature = "accelerometer"|"ambient-light-sensor"|"attribution-reporting"|"autoplay"|"camera"|"ch-dpr"|"ch-device-memory"|"ch-downlink"|"ch-ect"|"ch-prefers-color-scheme"|"ch-rtt"|"ch-ua"|"ch-ua-arch"|"ch-ua-bitness"|"ch-ua-platform"|"ch-ua-model"|"ch-ua-mobile"|"ch-ua-full-version"|"ch-ua-full-version-list"|"ch-ua-platform-version"|"ch-ua-reduced"|"ch-viewport-height"|"ch-viewport-width"|"ch-width"|"clipboard-read"|"clipboard-write"|"cross-origin-isolated"|"direct-sockets"|"display-capture"|"document-domain"|"encrypted-media"|"execution-while-out-of-viewport"|"execution-while-not-rendered"|"focus-without-user-activation"|"fullscreen"|"frobulate"|"gamepad"|"geolocation"|"gyroscope"|"hid"|"idle-detection"|"interest-cohort"|"join-ad-interest-group"|"keyboard-map"|"magnetometer"|"microphone"|"midi"|"otp-credentials"|"payment"|"picture-in-picture"|"publickey-credentials-get"|"run-ad-auction"|"screen-wake-lock"|"serial"|"shared-autofill"|"storage-access-api"|"sync-xhr"|"trust-token-redemption"|"usb"|"vertical-scroll"|"web-share"|"window-placement"|"xr-spatial-tracking"; + export type PermissionsPolicyFeature = "accelerometer"|"ambient-light-sensor"|"attribution-reporting"|"autoplay"|"camera"|"ch-dpr"|"ch-device-memory"|"ch-downlink"|"ch-ect"|"ch-prefers-color-scheme"|"ch-rtt"|"ch-ua"|"ch-ua-arch"|"ch-ua-bitness"|"ch-ua-platform"|"ch-ua-model"|"ch-ua-mobile"|"ch-ua-full"|"ch-ua-full-version"|"ch-ua-full-version-list"|"ch-ua-platform-version"|"ch-ua-reduced"|"ch-ua-wow64"|"ch-viewport-height"|"ch-viewport-width"|"ch-width"|"clipboard-read"|"clipboard-write"|"cross-origin-isolated"|"direct-sockets"|"display-capture"|"document-domain"|"encrypted-media"|"execution-while-out-of-viewport"|"execution-while-not-rendered"|"focus-without-user-activation"|"fullscreen"|"frobulate"|"gamepad"|"geolocation"|"gyroscope"|"hid"|"idle-detection"|"interest-cohort"|"join-ad-interest-group"|"keyboard-map"|"magnetometer"|"microphone"|"midi"|"otp-credentials"|"payment"|"picture-in-picture"|"publickey-credentials-get"|"run-ad-auction"|"screen-wake-lock"|"serial"|"shared-autofill"|"storage-access-api"|"sync-xhr"|"trust-token-redemption"|"usb"|"vertical-scroll"|"web-share"|"window-placement"|"xr-spatial-tracking"; /** * Reason for a permissions policy feature to be disabled. */ - export type PermissionsPolicyBlockReason = "Header"|"IframeAttribute"; + export type PermissionsPolicyBlockReason = "Header"|"IframeAttribute"|"InFencedFrameTree"; export interface PermissionsPolicyBlockLocator { frameId: FrameId; blockReason: PermissionsPolicyBlockReason; @@ -10524,7 +10532,7 @@ Example URLs: http://www.google.com/file.html -> "google.com" /** * List of not restored reasons for back-forward cache. */ - export type BackForwardCacheNotRestoredReason = "NotMainFrame"|"BackForwardCacheDisabled"|"RelatedActiveContentsExist"|"HTTPStatusNotOK"|"SchemeNotHTTPOrHTTPS"|"Loading"|"WasGrantedMediaAccess"|"DisableForRenderFrameHostCalled"|"DomainNotAllowed"|"HTTPMethodNotGET"|"SubframeIsNavigating"|"Timeout"|"CacheLimit"|"JavaScriptExecution"|"RendererProcessKilled"|"RendererProcessCrashed"|"GrantedMediaStreamAccess"|"SchedulerTrackedFeatureUsed"|"ConflictingBrowsingInstance"|"CacheFlushed"|"ServiceWorkerVersionActivation"|"SessionRestored"|"ServiceWorkerPostMessage"|"EnteredBackForwardCacheBeforeServiceWorkerHostAdded"|"RenderFrameHostReused_SameSite"|"RenderFrameHostReused_CrossSite"|"ServiceWorkerClaim"|"IgnoreEventAndEvict"|"HaveInnerContents"|"TimeoutPuttingInCache"|"BackForwardCacheDisabledByLowMemory"|"BackForwardCacheDisabledByCommandLine"|"NetworkRequestDatapipeDrainedAsBytesConsumer"|"NetworkRequestRedirected"|"NetworkRequestTimeout"|"NetworkExceedsBufferLimit"|"NavigationCancelledWhileRestoring"|"NotMostRecentNavigationEntry"|"BackForwardCacheDisabledForPrerender"|"UserAgentOverrideDiffers"|"ForegroundCacheLimit"|"BrowsingInstanceNotSwapped"|"BackForwardCacheDisabledForDelegate"|"OptInUnloadHeaderNotPresent"|"UnloadHandlerExistsInMainFrame"|"UnloadHandlerExistsInSubFrame"|"ServiceWorkerUnregistration"|"CacheControlNoStore"|"CacheControlNoStoreCookieModified"|"CacheControlNoStoreHTTPOnlyCookieModified"|"NoResponseHead"|"Unknown"|"ActivationNavigationsDisallowedForBug1234857"|"WebSocket"|"WebTransport"|"WebRTC"|"MainResourceHasCacheControlNoStore"|"MainResourceHasCacheControlNoCache"|"SubresourceHasCacheControlNoStore"|"SubresourceHasCacheControlNoCache"|"ContainsPlugins"|"DocumentLoaded"|"DedicatedWorkerOrWorklet"|"OutstandingNetworkRequestOthers"|"OutstandingIndexedDBTransaction"|"RequestedNotificationsPermission"|"RequestedMIDIPermission"|"RequestedAudioCapturePermission"|"RequestedVideoCapturePermission"|"RequestedBackForwardCacheBlockedSensors"|"RequestedBackgroundWorkPermission"|"BroadcastChannel"|"IndexedDBConnection"|"WebXR"|"SharedWorker"|"WebLocks"|"WebHID"|"WebShare"|"RequestedStorageAccessGrant"|"WebNfc"|"OutstandingNetworkRequestFetch"|"OutstandingNetworkRequestXHR"|"AppBanner"|"Printing"|"WebDatabase"|"PictureInPicture"|"Portal"|"SpeechRecognizer"|"IdleManager"|"PaymentManager"|"SpeechSynthesis"|"KeyboardLock"|"WebOTPService"|"OutstandingNetworkRequestDirectSocket"|"InjectedJavascript"|"InjectedStyleSheet"|"Dummy"|"ContentSecurityHandler"|"ContentWebAuthenticationAPI"|"ContentFileChooser"|"ContentSerial"|"ContentFileSystemAccess"|"ContentMediaDevicesDispatcherHost"|"ContentWebBluetooth"|"ContentWebUSB"|"ContentMediaSession"|"ContentMediaSessionService"|"ContentScreenReader"|"EmbedderPopupBlockerTabHelper"|"EmbedderSafeBrowsingTriggeredPopupBlocker"|"EmbedderSafeBrowsingThreatDetails"|"EmbedderAppBannerManager"|"EmbedderDomDistillerViewerSource"|"EmbedderDomDistillerSelfDeletingRequestDelegate"|"EmbedderOomInterventionTabHelper"|"EmbedderOfflinePage"|"EmbedderChromePasswordManagerClientBindCredentialManager"|"EmbedderPermissionRequestManager"|"EmbedderModalDialog"|"EmbedderExtensions"|"EmbedderExtensionMessaging"|"EmbedderExtensionMessagingForOpenPort"|"EmbedderExtensionSentMessageToCachedFrame"; + export type BackForwardCacheNotRestoredReason = "NotPrimaryMainFrame"|"BackForwardCacheDisabled"|"RelatedActiveContentsExist"|"HTTPStatusNotOK"|"SchemeNotHTTPOrHTTPS"|"Loading"|"WasGrantedMediaAccess"|"DisableForRenderFrameHostCalled"|"DomainNotAllowed"|"HTTPMethodNotGET"|"SubframeIsNavigating"|"Timeout"|"CacheLimit"|"JavaScriptExecution"|"RendererProcessKilled"|"RendererProcessCrashed"|"GrantedMediaStreamAccess"|"SchedulerTrackedFeatureUsed"|"ConflictingBrowsingInstance"|"CacheFlushed"|"ServiceWorkerVersionActivation"|"SessionRestored"|"ServiceWorkerPostMessage"|"EnteredBackForwardCacheBeforeServiceWorkerHostAdded"|"RenderFrameHostReused_SameSite"|"RenderFrameHostReused_CrossSite"|"ServiceWorkerClaim"|"IgnoreEventAndEvict"|"HaveInnerContents"|"TimeoutPuttingInCache"|"BackForwardCacheDisabledByLowMemory"|"BackForwardCacheDisabledByCommandLine"|"NetworkRequestDatapipeDrainedAsBytesConsumer"|"NetworkRequestRedirected"|"NetworkRequestTimeout"|"NetworkExceedsBufferLimit"|"NavigationCancelledWhileRestoring"|"NotMostRecentNavigationEntry"|"BackForwardCacheDisabledForPrerender"|"UserAgentOverrideDiffers"|"ForegroundCacheLimit"|"BrowsingInstanceNotSwapped"|"BackForwardCacheDisabledForDelegate"|"OptInUnloadHeaderNotPresent"|"UnloadHandlerExistsInMainFrame"|"UnloadHandlerExistsInSubFrame"|"ServiceWorkerUnregistration"|"CacheControlNoStore"|"CacheControlNoStoreCookieModified"|"CacheControlNoStoreHTTPOnlyCookieModified"|"NoResponseHead"|"Unknown"|"ActivationNavigationsDisallowedForBug1234857"|"WebSocket"|"WebTransport"|"WebRTC"|"MainResourceHasCacheControlNoStore"|"MainResourceHasCacheControlNoCache"|"SubresourceHasCacheControlNoStore"|"SubresourceHasCacheControlNoCache"|"ContainsPlugins"|"DocumentLoaded"|"DedicatedWorkerOrWorklet"|"OutstandingNetworkRequestOthers"|"OutstandingIndexedDBTransaction"|"RequestedNotificationsPermission"|"RequestedMIDIPermission"|"RequestedAudioCapturePermission"|"RequestedVideoCapturePermission"|"RequestedBackForwardCacheBlockedSensors"|"RequestedBackgroundWorkPermission"|"BroadcastChannel"|"IndexedDBConnection"|"WebXR"|"SharedWorker"|"WebLocks"|"WebHID"|"WebShare"|"RequestedStorageAccessGrant"|"WebNfc"|"OutstandingNetworkRequestFetch"|"OutstandingNetworkRequestXHR"|"AppBanner"|"Printing"|"WebDatabase"|"PictureInPicture"|"Portal"|"SpeechRecognizer"|"IdleManager"|"PaymentManager"|"SpeechSynthesis"|"KeyboardLock"|"WebOTPService"|"OutstandingNetworkRequestDirectSocket"|"InjectedJavascript"|"InjectedStyleSheet"|"Dummy"|"ContentSecurityHandler"|"ContentWebAuthenticationAPI"|"ContentFileChooser"|"ContentSerial"|"ContentFileSystemAccess"|"ContentMediaDevicesDispatcherHost"|"ContentWebBluetooth"|"ContentWebUSB"|"ContentMediaSession"|"ContentMediaSessionService"|"ContentScreenReader"|"EmbedderPopupBlockerTabHelper"|"EmbedderSafeBrowsingTriggeredPopupBlocker"|"EmbedderSafeBrowsingThreatDetails"|"EmbedderAppBannerManager"|"EmbedderDomDistillerViewerSource"|"EmbedderDomDistillerSelfDeletingRequestDelegate"|"EmbedderOomInterventionTabHelper"|"EmbedderOfflinePage"|"EmbedderChromePasswordManagerClientBindCredentialManager"|"EmbedderPermissionRequestManager"|"EmbedderModalDialog"|"EmbedderExtensions"|"EmbedderExtensionMessaging"|"EmbedderExtensionMessagingForOpenPort"|"EmbedderExtensionSentMessageToCachedFrame"; /** * Types of not restored reasons for back-forward cache. */ @@ -12415,7 +12423,7 @@ For cached script it is the last time the cache entry was validated. /** * Enum of possible storage types. */ - export type StorageType = "appcache"|"cookies"|"file_systems"|"indexeddb"|"local_storage"|"shader_cache"|"websql"|"service_workers"|"cache_storage"|"all"|"other"; + export type StorageType = "appcache"|"cookies"|"file_systems"|"indexeddb"|"local_storage"|"shader_cache"|"websql"|"service_workers"|"cache_storage"|"interest_groups"|"all"|"other"; /** * Usage for a storage type. */ @@ -12437,6 +12445,34 @@ Tokens from that issuer. issuerOrigin: string; count: number; } + /** + * Enum of interest group access types. + */ + export type InterestGroupAccessType = "join"|"leave"|"update"|"bid"|"win"; + /** + * Ad advertising element inside an interest group. + */ + export interface InterestGroupAd { + renderUrl: string; + metadata?: string; + } + /** + * The full details of an interest group. + */ + export interface InterestGroupDetails { + ownerOrigin: string; + name: string; + expirationTime: Network.TimeSinceEpoch; + joiningOrigin: string; + biddingUrl?: string; + biddingWasmHelperUrl?: string; + updateUrl?: string; + trustedBiddingSignalsUrl?: string; + trustedBiddingSignalsKeys: string[]; + userBiddingSignals?: string; + ads: InterestGroupAd[]; + adComponents: InterestGroupAd[]; + } /** * A cache's contents have been modified. @@ -12486,6 +12522,15 @@ Tokens from that issuer. */ origin: string; } + /** + * One of the interest groups was accessed by the associated page. + */ + export type interestGroupAccessedPayload = { + accessTime: Network.TimeSinceEpoch; + type: InterestGroupAccessType; + ownerOrigin: string; + name: string; + } /** * Clears storage for origin. @@ -12657,6 +12702,24 @@ Leaves other stored data, including the issuer's Redemption Records, intact. */ didDeleteTokens: boolean; } + /** + * Gets details for a named interest group. + */ + export type getInterestGroupDetailsParameters = { + ownerOrigin: string; + name: string; + } + export type getInterestGroupDetailsReturnValue = { + details: InterestGroupDetails; + } + /** + * Enables/Disables issuing of interestGroupAccessed events. + */ + export type setInterestGroupTrackingParameters = { + enable: boolean; + } + export type setInterestGroupTrackingReturnValue = { + } } /** @@ -16870,6 +16933,22 @@ unsubscribes current runtime agent from Runtime.bindingCalled notifications. } export type removeBindingReturnValue = { } + /** + * This method tries to lookup and populate exception details for a +JavaScript Error object. +Note that the stackTrace portion of the resulting exceptionDetails will +only be populated if the Runtime domain was enabled at the time when the +Error was thrown. + */ + export type getExceptionDetailsParameters = { + /** + * The error object for which to resolve the exception details. + */ + errorObjectId: RemoteObjectId; + } + export type getExceptionDetailsReturnValue = { + exceptionDetails?: ExceptionDetails; + } } /** @@ -17022,6 +17101,7 @@ unsubscribes current runtime agent from Runtime.bindingCalled notifications. "Storage.cacheStorageListUpdated": Storage.cacheStorageListUpdatedPayload; "Storage.indexedDBContentUpdated": Storage.indexedDBContentUpdatedPayload; "Storage.indexedDBListUpdated": Storage.indexedDBListUpdatedPayload; + "Storage.interestGroupAccessed": Storage.interestGroupAccessedPayload; "Target.attachedToTarget": Target.attachedToTargetPayload; "Target.detachedFromTarget": Target.detachedFromTargetPayload; "Target.receivedMessageFromTarget": Target.receivedMessageFromTargetPayload; @@ -17467,6 +17547,8 @@ unsubscribes current runtime agent from Runtime.bindingCalled notifications. "Storage.untrackIndexedDBForOrigin": Storage.untrackIndexedDBForOriginParameters; "Storage.getTrustTokens": Storage.getTrustTokensParameters; "Storage.clearTrustTokens": Storage.clearTrustTokensParameters; + "Storage.getInterestGroupDetails": Storage.getInterestGroupDetailsParameters; + "Storage.setInterestGroupTracking": Storage.setInterestGroupTrackingParameters; "SystemInfo.getInfo": SystemInfo.getInfoParameters; "SystemInfo.getProcessInfo": SystemInfo.getProcessInfoParameters; "Target.activateTarget": Target.activateTargetParameters; @@ -17597,6 +17679,7 @@ unsubscribes current runtime agent from Runtime.bindingCalled notifications. "Runtime.terminateExecution": Runtime.terminateExecutionParameters; "Runtime.addBinding": Runtime.addBindingParameters; "Runtime.removeBinding": Runtime.removeBindingParameters; + "Runtime.getExceptionDetails": Runtime.getExceptionDetailsParameters; "Schema.getDomains": Schema.getDomainsParameters; } export interface CommandReturnValues { @@ -17990,6 +18073,8 @@ unsubscribes current runtime agent from Runtime.bindingCalled notifications. "Storage.untrackIndexedDBForOrigin": Storage.untrackIndexedDBForOriginReturnValue; "Storage.getTrustTokens": Storage.getTrustTokensReturnValue; "Storage.clearTrustTokens": Storage.clearTrustTokensReturnValue; + "Storage.getInterestGroupDetails": Storage.getInterestGroupDetailsReturnValue; + "Storage.setInterestGroupTracking": Storage.setInterestGroupTrackingReturnValue; "SystemInfo.getInfo": SystemInfo.getInfoReturnValue; "SystemInfo.getProcessInfo": SystemInfo.getProcessInfoReturnValue; "Target.activateTarget": Target.activateTargetReturnValue; @@ -18120,6 +18205,7 @@ unsubscribes current runtime agent from Runtime.bindingCalled notifications. "Runtime.terminateExecution": Runtime.terminateExecutionReturnValue; "Runtime.addBinding": Runtime.addBindingReturnValue; "Runtime.removeBinding": Runtime.removeBindingReturnValue; + "Runtime.getExceptionDetails": Runtime.getExceptionDetailsReturnValue; "Schema.getDomains": Schema.getDomainsReturnValue; } } diff --git a/packages/playwright-core/src/server/deviceDescriptorsSource.json b/packages/playwright-core/src/server/deviceDescriptorsSource.json index 24e53f14f2034..e6a9784cf3056 100644 --- a/packages/playwright-core/src/server/deviceDescriptorsSource.json +++ b/packages/playwright-core/src/server/deviceDescriptorsSource.json @@ -110,7 +110,7 @@ "defaultBrowserType": "webkit" }, "Galaxy S5": { - "userAgent": "Mozilla/5.0 (Linux; Android 5.0; SM-G900P Build/LRX21T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4837.0 Mobile Safari/537.36", + "userAgent": "Mozilla/5.0 (Linux; Android 5.0; SM-G900P Build/LRX21T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4863.0 Mobile Safari/537.36", "viewport": { "width": 360, "height": 640 @@ -121,7 +121,7 @@ "defaultBrowserType": "chromium" }, "Galaxy S5 landscape": { - "userAgent": "Mozilla/5.0 (Linux; Android 5.0; SM-G900P Build/LRX21T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4837.0 Mobile Safari/537.36", + "userAgent": "Mozilla/5.0 (Linux; Android 5.0; SM-G900P Build/LRX21T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4863.0 Mobile Safari/537.36", "viewport": { "width": 640, "height": 360 @@ -132,7 +132,7 @@ "defaultBrowserType": "chromium" }, "Galaxy S8": { - "userAgent": "Mozilla/5.0 (Linux; Android 7.0; SM-G950U Build/NRD90M) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4837.0 Mobile Safari/537.36", + "userAgent": "Mozilla/5.0 (Linux; Android 7.0; SM-G950U Build/NRD90M) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4863.0 Mobile Safari/537.36", "viewport": { "width": 360, "height": 740 @@ -143,7 +143,7 @@ "defaultBrowserType": "chromium" }, "Galaxy S8 landscape": { - "userAgent": "Mozilla/5.0 (Linux; Android 7.0; SM-G950U Build/NRD90M) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4837.0 Mobile Safari/537.36", + "userAgent": "Mozilla/5.0 (Linux; Android 7.0; SM-G950U Build/NRD90M) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4863.0 Mobile Safari/537.36", "viewport": { "width": 740, "height": 360 @@ -154,7 +154,7 @@ "defaultBrowserType": "chromium" }, "Galaxy S9+": { - "userAgent": "Mozilla/5.0 (Linux; Android 8.0.0; SM-G965U Build/R16NW) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4837.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/100.0.4863.0 Mobile Safari/537.36", "viewport": { "width": 320, "height": 658 @@ -165,7 +165,7 @@ "defaultBrowserType": "chromium" }, "Galaxy S9+ landscape": { - "userAgent": "Mozilla/5.0 (Linux; Android 8.0.0; SM-G965U Build/R16NW) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4837.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/100.0.4863.0 Mobile Safari/537.36", "viewport": { "width": 658, "height": 320 @@ -176,7 +176,7 @@ "defaultBrowserType": "chromium" }, "Galaxy Tab S4": { - "userAgent": "Mozilla/5.0 (Linux; Android 8.1.0; SM-T837A) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4837.0 Safari/537.36", + "userAgent": "Mozilla/5.0 (Linux; Android 8.1.0; SM-T837A) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4863.0 Safari/537.36", "viewport": { "width": 712, "height": 1138 @@ -187,7 +187,7 @@ "defaultBrowserType": "chromium" }, "Galaxy Tab S4 landscape": { - "userAgent": "Mozilla/5.0 (Linux; Android 8.1.0; SM-T837A) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4837.0 Safari/537.36", + "userAgent": "Mozilla/5.0 (Linux; Android 8.1.0; SM-T837A) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4863.0 Safari/537.36", "viewport": { "width": 1138, "height": 712 @@ -828,7 +828,7 @@ "defaultBrowserType": "webkit" }, "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/99.0.4837.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/100.0.4863.0 Mobile Safari/537.36", "viewport": { "width": 384, "height": 640 @@ -839,7 +839,7 @@ "defaultBrowserType": "chromium" }, "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/99.0.4837.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/100.0.4863.0 Mobile Safari/537.36", "viewport": { "width": 640, "height": 384 @@ -850,7 +850,7 @@ "defaultBrowserType": "chromium" }, "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/99.0.4837.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/100.0.4863.0 Mobile Safari/537.36 Edge/14.14263", "viewport": { "width": 640, "height": 360 @@ -861,7 +861,7 @@ "defaultBrowserType": "chromium" }, "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/99.0.4837.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/100.0.4863.0 Mobile Safari/537.36 Edge/14.14263", "viewport": { "width": 360, "height": 640 @@ -872,7 +872,7 @@ "defaultBrowserType": "chromium" }, "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/99.0.4837.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/100.0.4863.0 Mobile Safari/537.36 Edge/14.14263", "viewport": { "width": 360, "height": 640 @@ -883,7 +883,7 @@ "defaultBrowserType": "chromium" }, "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/99.0.4837.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/100.0.4863.0 Mobile Safari/537.36 Edge/14.14263", "viewport": { "width": 640, "height": 360 @@ -894,7 +894,7 @@ "defaultBrowserType": "chromium" }, "Nexus 10": { - "userAgent": "Mozilla/5.0 (Linux; Android 6.0.1; Nexus 10 Build/MOB31T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4837.0 Safari/537.36", + "userAgent": "Mozilla/5.0 (Linux; Android 6.0.1; Nexus 10 Build/MOB31T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4863.0 Safari/537.36", "viewport": { "width": 800, "height": 1280 @@ -905,7 +905,7 @@ "defaultBrowserType": "chromium" }, "Nexus 10 landscape": { - "userAgent": "Mozilla/5.0 (Linux; Android 6.0.1; Nexus 10 Build/MOB31T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4837.0 Safari/537.36", + "userAgent": "Mozilla/5.0 (Linux; Android 6.0.1; Nexus 10 Build/MOB31T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4863.0 Safari/537.36", "viewport": { "width": 1280, "height": 800 @@ -916,7 +916,7 @@ "defaultBrowserType": "chromium" }, "Nexus 4": { - "userAgent": "Mozilla/5.0 (Linux; Android 4.4.2; Nexus 4 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4837.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/100.0.4863.0 Mobile Safari/537.36", "viewport": { "width": 384, "height": 640 @@ -927,7 +927,7 @@ "defaultBrowserType": "chromium" }, "Nexus 4 landscape": { - "userAgent": "Mozilla/5.0 (Linux; Android 4.4.2; Nexus 4 Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4837.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/100.0.4863.0 Mobile Safari/537.36", "viewport": { "width": 640, "height": 384 @@ -938,7 +938,7 @@ "defaultBrowserType": "chromium" }, "Nexus 5": { - "userAgent": "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4837.0 Mobile Safari/537.36", + "userAgent": "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4863.0 Mobile Safari/537.36", "viewport": { "width": 360, "height": 640 @@ -949,7 +949,7 @@ "defaultBrowserType": "chromium" }, "Nexus 5 landscape": { - "userAgent": "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4837.0 Mobile Safari/537.36", + "userAgent": "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4863.0 Mobile Safari/537.36", "viewport": { "width": 640, "height": 360 @@ -960,7 +960,7 @@ "defaultBrowserType": "chromium" }, "Nexus 5X": { - "userAgent": "Mozilla/5.0 (Linux; Android 8.0.0; Nexus 5X Build/OPR4.170623.006) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4837.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/100.0.4863.0 Mobile Safari/537.36", "viewport": { "width": 412, "height": 732 @@ -971,7 +971,7 @@ "defaultBrowserType": "chromium" }, "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/99.0.4837.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/100.0.4863.0 Mobile Safari/537.36", "viewport": { "width": 732, "height": 412 @@ -982,7 +982,7 @@ "defaultBrowserType": "chromium" }, "Nexus 6": { - "userAgent": "Mozilla/5.0 (Linux; Android 7.1.1; Nexus 6 Build/N6F26U) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4837.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/100.0.4863.0 Mobile Safari/537.36", "viewport": { "width": 412, "height": 732 @@ -993,7 +993,7 @@ "defaultBrowserType": "chromium" }, "Nexus 6 landscape": { - "userAgent": "Mozilla/5.0 (Linux; Android 7.1.1; Nexus 6 Build/N6F26U) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4837.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/100.0.4863.0 Mobile Safari/537.36", "viewport": { "width": 732, "height": 412 @@ -1004,7 +1004,7 @@ "defaultBrowserType": "chromium" }, "Nexus 6P": { - "userAgent": "Mozilla/5.0 (Linux; Android 8.0.0; Nexus 6P Build/OPP3.170518.006) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4837.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/100.0.4863.0 Mobile Safari/537.36", "viewport": { "width": 412, "height": 732 @@ -1015,7 +1015,7 @@ "defaultBrowserType": "chromium" }, "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/99.0.4837.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/100.0.4863.0 Mobile Safari/537.36", "viewport": { "width": 732, "height": 412 @@ -1026,7 +1026,7 @@ "defaultBrowserType": "chromium" }, "Nexus 7": { - "userAgent": "Mozilla/5.0 (Linux; Android 6.0.1; Nexus 7 Build/MOB30X) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4837.0 Safari/537.36", + "userAgent": "Mozilla/5.0 (Linux; Android 6.0.1; Nexus 7 Build/MOB30X) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4863.0 Safari/537.36", "viewport": { "width": 600, "height": 960 @@ -1037,7 +1037,7 @@ "defaultBrowserType": "chromium" }, "Nexus 7 landscape": { - "userAgent": "Mozilla/5.0 (Linux; Android 6.0.1; Nexus 7 Build/MOB30X) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4837.0 Safari/537.36", + "userAgent": "Mozilla/5.0 (Linux; Android 6.0.1; Nexus 7 Build/MOB30X) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4863.0 Safari/537.36", "viewport": { "width": 960, "height": 600 @@ -1092,7 +1092,7 @@ "defaultBrowserType": "webkit" }, "Pixel 2": { - "userAgent": "Mozilla/5.0 (Linux; Android 8.0; Pixel 2 Build/OPD3.170816.012) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4837.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/100.0.4863.0 Mobile Safari/537.36", "viewport": { "width": 411, "height": 731 @@ -1103,7 +1103,7 @@ "defaultBrowserType": "chromium" }, "Pixel 2 landscape": { - "userAgent": "Mozilla/5.0 (Linux; Android 8.0; Pixel 2 Build/OPD3.170816.012) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4837.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/100.0.4863.0 Mobile Safari/537.36", "viewport": { "width": 731, "height": 411 @@ -1114,7 +1114,7 @@ "defaultBrowserType": "chromium" }, "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/99.0.4837.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/100.0.4863.0 Mobile Safari/537.36", "viewport": { "width": 411, "height": 823 @@ -1125,7 +1125,7 @@ "defaultBrowserType": "chromium" }, "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/99.0.4837.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/100.0.4863.0 Mobile Safari/537.36", "viewport": { "width": 823, "height": 411 @@ -1136,7 +1136,7 @@ "defaultBrowserType": "chromium" }, "Pixel 3": { - "userAgent": "Mozilla/5.0 (Linux; Android 9; Pixel 3 Build/PQ1A.181105.017.A1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4837.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/100.0.4863.0 Mobile Safari/537.36", "viewport": { "width": 393, "height": 786 @@ -1147,7 +1147,7 @@ "defaultBrowserType": "chromium" }, "Pixel 3 landscape": { - "userAgent": "Mozilla/5.0 (Linux; Android 9; Pixel 3 Build/PQ1A.181105.017.A1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4837.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/100.0.4863.0 Mobile Safari/537.36", "viewport": { "width": 786, "height": 393 @@ -1158,7 +1158,7 @@ "defaultBrowserType": "chromium" }, "Pixel 4": { - "userAgent": "Mozilla/5.0 (Linux; Android 10; Pixel 4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4837.0 Mobile Safari/537.36", + "userAgent": "Mozilla/5.0 (Linux; Android 10; Pixel 4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4863.0 Mobile Safari/537.36", "viewport": { "width": 353, "height": 745 @@ -1169,7 +1169,7 @@ "defaultBrowserType": "chromium" }, "Pixel 4 landscape": { - "userAgent": "Mozilla/5.0 (Linux; Android 10; Pixel 4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4837.0 Mobile Safari/537.36", + "userAgent": "Mozilla/5.0 (Linux; Android 10; Pixel 4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4863.0 Mobile Safari/537.36", "viewport": { "width": 745, "height": 353 @@ -1180,7 +1180,7 @@ "defaultBrowserType": "chromium" }, "Pixel 4a (5G)": { - "userAgent": "Mozilla/5.0 (Linux; Android 11; Pixel 4a (5G)) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4837.0 Mobile Safari/537.36", + "userAgent": "Mozilla/5.0 (Linux; Android 11; Pixel 4a (5G)) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4863.0 Mobile Safari/537.36", "screen": { "width": 412, "height": 892 @@ -1195,7 +1195,7 @@ "defaultBrowserType": "chromium" }, "Pixel 4a (5G) landscape": { - "userAgent": "Mozilla/5.0 (Linux; Android 11; Pixel 4a (5G)) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4837.0 Mobile Safari/537.36", + "userAgent": "Mozilla/5.0 (Linux; Android 11; Pixel 4a (5G)) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4863.0 Mobile Safari/537.36", "screen": { "height": 892, "width": 412 @@ -1210,7 +1210,7 @@ "defaultBrowserType": "chromium" }, "Pixel 5": { - "userAgent": "Mozilla/5.0 (Linux; Android 11; Pixel 5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4837.0 Mobile Safari/537.36", + "userAgent": "Mozilla/5.0 (Linux; Android 11; Pixel 5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4863.0 Mobile Safari/537.36", "screen": { "width": 393, "height": 851 @@ -1225,7 +1225,7 @@ "defaultBrowserType": "chromium" }, "Pixel 5 landscape": { - "userAgent": "Mozilla/5.0 (Linux; Android 11; Pixel 5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4837.0 Mobile Safari/537.36", + "userAgent": "Mozilla/5.0 (Linux; Android 11; Pixel 5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4863.0 Mobile Safari/537.36", "screen": { "width": 851, "height": 393 @@ -1240,7 +1240,7 @@ "defaultBrowserType": "chromium" }, "Moto G4": { - "userAgent": "Mozilla/5.0 (Linux; Android 7.0; Moto G (4)) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4837.0 Mobile Safari/537.36", + "userAgent": "Mozilla/5.0 (Linux; Android 7.0; Moto G (4)) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4863.0 Mobile Safari/537.36", "viewport": { "width": 360, "height": 640 @@ -1251,7 +1251,7 @@ "defaultBrowserType": "chromium" }, "Moto G4 landscape": { - "userAgent": "Mozilla/5.0 (Linux; Android 7.0; Moto G (4)) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4837.0 Mobile Safari/537.36", + "userAgent": "Mozilla/5.0 (Linux; Android 7.0; Moto G (4)) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4863.0 Mobile Safari/537.36", "viewport": { "width": 640, "height": 360 @@ -1262,7 +1262,7 @@ "defaultBrowserType": "chromium" }, "Desktop Chrome HiDPI": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4837.0 Safari/537.36", + "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4863.0 Safari/537.36", "screen": { "width": 1792, "height": 1120 @@ -1277,7 +1277,7 @@ "defaultBrowserType": "chromium" }, "Desktop Edge HiDPI": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4837.0 Safari/537.36 Edg/99.0.4837.0", + "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4863.0 Safari/537.36 Edg/100.0.4863.0", "screen": { "width": 1792, "height": 1120 @@ -1322,7 +1322,7 @@ "defaultBrowserType": "webkit" }, "Desktop Chrome": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4837.0 Safari/537.36", + "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4863.0 Safari/537.36", "screen": { "width": 1920, "height": 1080 @@ -1337,7 +1337,7 @@ "defaultBrowserType": "chromium" }, "Desktop Edge": { - "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4837.0 Safari/537.36 Edg/99.0.4837.0", + "userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4863.0 Safari/537.36 Edg/100.0.4863.0", "screen": { "width": 1920, "height": 1080 diff --git a/packages/playwright-core/types/protocol.d.ts b/packages/playwright-core/types/protocol.d.ts index ccdbb5c8015e5..f054c8cba8834 100644 --- a/packages/playwright-core/types/protocol.d.ts +++ b/packages/playwright-core/types/protocol.d.ts @@ -842,12 +842,6 @@ instead of "limited-quirks". url: string; location?: SourceCodeLocation; } - export interface WasmCrossOriginModuleSharingIssueDetails { - wasmModuleUrl: string; - sourceOrigin: string; - targetOrigin: string; - isWarning: boolean; - } export type GenericIssueErrorType = "CrossOriginPortalPostMessageError"; /** * Depending on the concrete errorType, different properties are set. @@ -880,6 +874,16 @@ https://www.chromestatus.com/feature/5684870116278272 for more details." deprecationType: string; } export type ClientHintIssueReason = "MetaTagAllowListInvalidOrigin"|"MetaTagModifiedHTML"; + export interface FederatedAuthRequestIssueDetails { + federatedAuthRequestIssueReason: FederatedAuthRequestIssueReason; + } + /** + * Represents the failure reason when a federated authentication reason fails. +Should be updated alongside RequestIdTokenStatus in +third_party/blink/public/mojom/webid/federated_auth_request.mojom to include +all cases except for success. + */ + export type FederatedAuthRequestIssueReason = "ApprovalDeclined"|"TooManyRequests"|"WellKnownHttpNotFound"|"WellKnownNoResponse"|"WellKnownInvalidResponse"|"ClientIdMetadataHttpNotFound"|"ClientIdMetadataNoResponse"|"ClientIdMetadataInvalidResponse"|"ErrorFetchingSignin"|"InvalidSigninResponse"|"AccountsHttpNotFound"|"AccountsNoResponse"|"AccountsInvalidResponse"|"IdTokenHttpNotFound"|"IdTokenNoResponse"|"IdTokenInvalidResponse"|"IdTokenInvalidRequest"|"ErrorIdToken"|"Canceled"; /** * This issue tracks client hints related issues. It's used to deprecate old features, encourage the use of new ones, and provide general guidance. @@ -893,7 +897,7 @@ features, encourage the use of new ones, and provide general guidance. optional fields in InspectorIssueDetails to convey more specific information about the kind of issue. */ - export type InspectorIssueCode = "SameSiteCookieIssue"|"MixedContentIssue"|"BlockedByResponseIssue"|"HeavyAdIssue"|"ContentSecurityPolicyIssue"|"SharedArrayBufferIssue"|"TrustedWebActivityIssue"|"LowTextContrastIssue"|"CorsIssue"|"AttributionReportingIssue"|"QuirksModeIssue"|"NavigatorUserAgentIssue"|"WasmCrossOriginModuleSharingIssue"|"GenericIssue"|"DeprecationIssue"|"ClientHintIssue"; + export type InspectorIssueCode = "SameSiteCookieIssue"|"MixedContentIssue"|"BlockedByResponseIssue"|"HeavyAdIssue"|"ContentSecurityPolicyIssue"|"SharedArrayBufferIssue"|"TrustedWebActivityIssue"|"LowTextContrastIssue"|"CorsIssue"|"AttributionReportingIssue"|"QuirksModeIssue"|"NavigatorUserAgentIssue"|"GenericIssue"|"DeprecationIssue"|"ClientHintIssue"|"FederatedAuthRequestIssue"; /** * This struct holds a list of optional fields with additional information specific to the kind of issue. When adding a new issue code, please also @@ -912,10 +916,10 @@ add a new optional field to this type. attributionReportingIssueDetails?: AttributionReportingIssueDetails; quirksModeIssueDetails?: QuirksModeIssueDetails; navigatorUserAgentIssueDetails?: NavigatorUserAgentIssueDetails; - wasmCrossOriginModuleSharingIssue?: WasmCrossOriginModuleSharingIssueDetails; genericIssueDetails?: GenericIssueDetails; deprecationIssueDetails?: DeprecationIssueDetails; clientHintIssueDetails?: ClientHintIssueDetails; + federatedAuthRequestIssueDetails?: FederatedAuthRequestIssueDetails; } /** * A unique id for a DevTools inspector issue. Allows other entities (e.g. @@ -3310,6 +3314,10 @@ be called for that search. * Enables DOM agent for the given page. */ export type enableParameters = { + /** + * Whether to include whitespaces in the children array of returned Nodes. + */ + includeWhitespace?: "none"|"all"; } export type enableReturnValue = { } @@ -6108,7 +6116,7 @@ modifiers, keyboard layout, etc (e.g., 'AltGr') (default: ""). /** * Editing commands to send with the key event (e.g., 'selectAll') (default: []). These are related to but not equal the command names used in `document.execCommand` and NSStandardKeyBindingResponding. -See https://source.chromium.org/chromium/chromium/src/+/master:third_party/blink/renderer/core/editing/commands/editor_command_names.h for valid command names. +See https://source.chromium.org/chromium/chromium/src/+/main:third_party/blink/renderer/core/editing/commands/editor_command_names.h for valid command names. */ commands?: string[]; } @@ -7943,7 +7951,7 @@ the same request (but not for redirected requests). initiatorIPAddressSpace: IPAddressSpace; privateNetworkRequestPolicy: PrivateNetworkRequestPolicy; } - export type CrossOriginOpenerPolicyValue = "SameOrigin"|"SameOriginAllowPopups"|"UnsafeNone"|"SameOriginPlusCoep"; + export type CrossOriginOpenerPolicyValue = "SameOrigin"|"SameOriginAllowPopups"|"UnsafeNone"|"SameOriginPlusCoep"|"SameOriginAllowPopupsPlusCoep"; export interface CrossOriginOpenerPolicyStatus { value: CrossOriginOpenerPolicyValue; reportOnlyValue: CrossOriginOpenerPolicyValue; @@ -10059,11 +10067,11 @@ Backend then generates 'inspectNodeRequested' event upon element selection. * All Permissions Policy features. This enum should match the one defined in third_party/blink/renderer/core/permissions_policy/permissions_policy_features.json5. */ - export type PermissionsPolicyFeature = "accelerometer"|"ambient-light-sensor"|"attribution-reporting"|"autoplay"|"camera"|"ch-dpr"|"ch-device-memory"|"ch-downlink"|"ch-ect"|"ch-prefers-color-scheme"|"ch-rtt"|"ch-ua"|"ch-ua-arch"|"ch-ua-bitness"|"ch-ua-platform"|"ch-ua-model"|"ch-ua-mobile"|"ch-ua-full-version"|"ch-ua-full-version-list"|"ch-ua-platform-version"|"ch-ua-reduced"|"ch-viewport-height"|"ch-viewport-width"|"ch-width"|"clipboard-read"|"clipboard-write"|"cross-origin-isolated"|"direct-sockets"|"display-capture"|"document-domain"|"encrypted-media"|"execution-while-out-of-viewport"|"execution-while-not-rendered"|"focus-without-user-activation"|"fullscreen"|"frobulate"|"gamepad"|"geolocation"|"gyroscope"|"hid"|"idle-detection"|"interest-cohort"|"join-ad-interest-group"|"keyboard-map"|"magnetometer"|"microphone"|"midi"|"otp-credentials"|"payment"|"picture-in-picture"|"publickey-credentials-get"|"run-ad-auction"|"screen-wake-lock"|"serial"|"shared-autofill"|"storage-access-api"|"sync-xhr"|"trust-token-redemption"|"usb"|"vertical-scroll"|"web-share"|"window-placement"|"xr-spatial-tracking"; + export type PermissionsPolicyFeature = "accelerometer"|"ambient-light-sensor"|"attribution-reporting"|"autoplay"|"camera"|"ch-dpr"|"ch-device-memory"|"ch-downlink"|"ch-ect"|"ch-prefers-color-scheme"|"ch-rtt"|"ch-ua"|"ch-ua-arch"|"ch-ua-bitness"|"ch-ua-platform"|"ch-ua-model"|"ch-ua-mobile"|"ch-ua-full"|"ch-ua-full-version"|"ch-ua-full-version-list"|"ch-ua-platform-version"|"ch-ua-reduced"|"ch-ua-wow64"|"ch-viewport-height"|"ch-viewport-width"|"ch-width"|"clipboard-read"|"clipboard-write"|"cross-origin-isolated"|"direct-sockets"|"display-capture"|"document-domain"|"encrypted-media"|"execution-while-out-of-viewport"|"execution-while-not-rendered"|"focus-without-user-activation"|"fullscreen"|"frobulate"|"gamepad"|"geolocation"|"gyroscope"|"hid"|"idle-detection"|"interest-cohort"|"join-ad-interest-group"|"keyboard-map"|"magnetometer"|"microphone"|"midi"|"otp-credentials"|"payment"|"picture-in-picture"|"publickey-credentials-get"|"run-ad-auction"|"screen-wake-lock"|"serial"|"shared-autofill"|"storage-access-api"|"sync-xhr"|"trust-token-redemption"|"usb"|"vertical-scroll"|"web-share"|"window-placement"|"xr-spatial-tracking"; /** * Reason for a permissions policy feature to be disabled. */ - export type PermissionsPolicyBlockReason = "Header"|"IframeAttribute"; + export type PermissionsPolicyBlockReason = "Header"|"IframeAttribute"|"InFencedFrameTree"; export interface PermissionsPolicyBlockLocator { frameId: FrameId; blockReason: PermissionsPolicyBlockReason; @@ -10524,7 +10532,7 @@ Example URLs: http://www.google.com/file.html -> "google.com" /** * List of not restored reasons for back-forward cache. */ - export type BackForwardCacheNotRestoredReason = "NotMainFrame"|"BackForwardCacheDisabled"|"RelatedActiveContentsExist"|"HTTPStatusNotOK"|"SchemeNotHTTPOrHTTPS"|"Loading"|"WasGrantedMediaAccess"|"DisableForRenderFrameHostCalled"|"DomainNotAllowed"|"HTTPMethodNotGET"|"SubframeIsNavigating"|"Timeout"|"CacheLimit"|"JavaScriptExecution"|"RendererProcessKilled"|"RendererProcessCrashed"|"GrantedMediaStreamAccess"|"SchedulerTrackedFeatureUsed"|"ConflictingBrowsingInstance"|"CacheFlushed"|"ServiceWorkerVersionActivation"|"SessionRestored"|"ServiceWorkerPostMessage"|"EnteredBackForwardCacheBeforeServiceWorkerHostAdded"|"RenderFrameHostReused_SameSite"|"RenderFrameHostReused_CrossSite"|"ServiceWorkerClaim"|"IgnoreEventAndEvict"|"HaveInnerContents"|"TimeoutPuttingInCache"|"BackForwardCacheDisabledByLowMemory"|"BackForwardCacheDisabledByCommandLine"|"NetworkRequestDatapipeDrainedAsBytesConsumer"|"NetworkRequestRedirected"|"NetworkRequestTimeout"|"NetworkExceedsBufferLimit"|"NavigationCancelledWhileRestoring"|"NotMostRecentNavigationEntry"|"BackForwardCacheDisabledForPrerender"|"UserAgentOverrideDiffers"|"ForegroundCacheLimit"|"BrowsingInstanceNotSwapped"|"BackForwardCacheDisabledForDelegate"|"OptInUnloadHeaderNotPresent"|"UnloadHandlerExistsInMainFrame"|"UnloadHandlerExistsInSubFrame"|"ServiceWorkerUnregistration"|"CacheControlNoStore"|"CacheControlNoStoreCookieModified"|"CacheControlNoStoreHTTPOnlyCookieModified"|"NoResponseHead"|"Unknown"|"ActivationNavigationsDisallowedForBug1234857"|"WebSocket"|"WebTransport"|"WebRTC"|"MainResourceHasCacheControlNoStore"|"MainResourceHasCacheControlNoCache"|"SubresourceHasCacheControlNoStore"|"SubresourceHasCacheControlNoCache"|"ContainsPlugins"|"DocumentLoaded"|"DedicatedWorkerOrWorklet"|"OutstandingNetworkRequestOthers"|"OutstandingIndexedDBTransaction"|"RequestedNotificationsPermission"|"RequestedMIDIPermission"|"RequestedAudioCapturePermission"|"RequestedVideoCapturePermission"|"RequestedBackForwardCacheBlockedSensors"|"RequestedBackgroundWorkPermission"|"BroadcastChannel"|"IndexedDBConnection"|"WebXR"|"SharedWorker"|"WebLocks"|"WebHID"|"WebShare"|"RequestedStorageAccessGrant"|"WebNfc"|"OutstandingNetworkRequestFetch"|"OutstandingNetworkRequestXHR"|"AppBanner"|"Printing"|"WebDatabase"|"PictureInPicture"|"Portal"|"SpeechRecognizer"|"IdleManager"|"PaymentManager"|"SpeechSynthesis"|"KeyboardLock"|"WebOTPService"|"OutstandingNetworkRequestDirectSocket"|"InjectedJavascript"|"InjectedStyleSheet"|"Dummy"|"ContentSecurityHandler"|"ContentWebAuthenticationAPI"|"ContentFileChooser"|"ContentSerial"|"ContentFileSystemAccess"|"ContentMediaDevicesDispatcherHost"|"ContentWebBluetooth"|"ContentWebUSB"|"ContentMediaSession"|"ContentMediaSessionService"|"ContentScreenReader"|"EmbedderPopupBlockerTabHelper"|"EmbedderSafeBrowsingTriggeredPopupBlocker"|"EmbedderSafeBrowsingThreatDetails"|"EmbedderAppBannerManager"|"EmbedderDomDistillerViewerSource"|"EmbedderDomDistillerSelfDeletingRequestDelegate"|"EmbedderOomInterventionTabHelper"|"EmbedderOfflinePage"|"EmbedderChromePasswordManagerClientBindCredentialManager"|"EmbedderPermissionRequestManager"|"EmbedderModalDialog"|"EmbedderExtensions"|"EmbedderExtensionMessaging"|"EmbedderExtensionMessagingForOpenPort"|"EmbedderExtensionSentMessageToCachedFrame"; + export type BackForwardCacheNotRestoredReason = "NotPrimaryMainFrame"|"BackForwardCacheDisabled"|"RelatedActiveContentsExist"|"HTTPStatusNotOK"|"SchemeNotHTTPOrHTTPS"|"Loading"|"WasGrantedMediaAccess"|"DisableForRenderFrameHostCalled"|"DomainNotAllowed"|"HTTPMethodNotGET"|"SubframeIsNavigating"|"Timeout"|"CacheLimit"|"JavaScriptExecution"|"RendererProcessKilled"|"RendererProcessCrashed"|"GrantedMediaStreamAccess"|"SchedulerTrackedFeatureUsed"|"ConflictingBrowsingInstance"|"CacheFlushed"|"ServiceWorkerVersionActivation"|"SessionRestored"|"ServiceWorkerPostMessage"|"EnteredBackForwardCacheBeforeServiceWorkerHostAdded"|"RenderFrameHostReused_SameSite"|"RenderFrameHostReused_CrossSite"|"ServiceWorkerClaim"|"IgnoreEventAndEvict"|"HaveInnerContents"|"TimeoutPuttingInCache"|"BackForwardCacheDisabledByLowMemory"|"BackForwardCacheDisabledByCommandLine"|"NetworkRequestDatapipeDrainedAsBytesConsumer"|"NetworkRequestRedirected"|"NetworkRequestTimeout"|"NetworkExceedsBufferLimit"|"NavigationCancelledWhileRestoring"|"NotMostRecentNavigationEntry"|"BackForwardCacheDisabledForPrerender"|"UserAgentOverrideDiffers"|"ForegroundCacheLimit"|"BrowsingInstanceNotSwapped"|"BackForwardCacheDisabledForDelegate"|"OptInUnloadHeaderNotPresent"|"UnloadHandlerExistsInMainFrame"|"UnloadHandlerExistsInSubFrame"|"ServiceWorkerUnregistration"|"CacheControlNoStore"|"CacheControlNoStoreCookieModified"|"CacheControlNoStoreHTTPOnlyCookieModified"|"NoResponseHead"|"Unknown"|"ActivationNavigationsDisallowedForBug1234857"|"WebSocket"|"WebTransport"|"WebRTC"|"MainResourceHasCacheControlNoStore"|"MainResourceHasCacheControlNoCache"|"SubresourceHasCacheControlNoStore"|"SubresourceHasCacheControlNoCache"|"ContainsPlugins"|"DocumentLoaded"|"DedicatedWorkerOrWorklet"|"OutstandingNetworkRequestOthers"|"OutstandingIndexedDBTransaction"|"RequestedNotificationsPermission"|"RequestedMIDIPermission"|"RequestedAudioCapturePermission"|"RequestedVideoCapturePermission"|"RequestedBackForwardCacheBlockedSensors"|"RequestedBackgroundWorkPermission"|"BroadcastChannel"|"IndexedDBConnection"|"WebXR"|"SharedWorker"|"WebLocks"|"WebHID"|"WebShare"|"RequestedStorageAccessGrant"|"WebNfc"|"OutstandingNetworkRequestFetch"|"OutstandingNetworkRequestXHR"|"AppBanner"|"Printing"|"WebDatabase"|"PictureInPicture"|"Portal"|"SpeechRecognizer"|"IdleManager"|"PaymentManager"|"SpeechSynthesis"|"KeyboardLock"|"WebOTPService"|"OutstandingNetworkRequestDirectSocket"|"InjectedJavascript"|"InjectedStyleSheet"|"Dummy"|"ContentSecurityHandler"|"ContentWebAuthenticationAPI"|"ContentFileChooser"|"ContentSerial"|"ContentFileSystemAccess"|"ContentMediaDevicesDispatcherHost"|"ContentWebBluetooth"|"ContentWebUSB"|"ContentMediaSession"|"ContentMediaSessionService"|"ContentScreenReader"|"EmbedderPopupBlockerTabHelper"|"EmbedderSafeBrowsingTriggeredPopupBlocker"|"EmbedderSafeBrowsingThreatDetails"|"EmbedderAppBannerManager"|"EmbedderDomDistillerViewerSource"|"EmbedderDomDistillerSelfDeletingRequestDelegate"|"EmbedderOomInterventionTabHelper"|"EmbedderOfflinePage"|"EmbedderChromePasswordManagerClientBindCredentialManager"|"EmbedderPermissionRequestManager"|"EmbedderModalDialog"|"EmbedderExtensions"|"EmbedderExtensionMessaging"|"EmbedderExtensionMessagingForOpenPort"|"EmbedderExtensionSentMessageToCachedFrame"; /** * Types of not restored reasons for back-forward cache. */ @@ -12415,7 +12423,7 @@ For cached script it is the last time the cache entry was validated. /** * Enum of possible storage types. */ - export type StorageType = "appcache"|"cookies"|"file_systems"|"indexeddb"|"local_storage"|"shader_cache"|"websql"|"service_workers"|"cache_storage"|"all"|"other"; + export type StorageType = "appcache"|"cookies"|"file_systems"|"indexeddb"|"local_storage"|"shader_cache"|"websql"|"service_workers"|"cache_storage"|"interest_groups"|"all"|"other"; /** * Usage for a storage type. */ @@ -12437,6 +12445,34 @@ Tokens from that issuer. issuerOrigin: string; count: number; } + /** + * Enum of interest group access types. + */ + export type InterestGroupAccessType = "join"|"leave"|"update"|"bid"|"win"; + /** + * Ad advertising element inside an interest group. + */ + export interface InterestGroupAd { + renderUrl: string; + metadata?: string; + } + /** + * The full details of an interest group. + */ + export interface InterestGroupDetails { + ownerOrigin: string; + name: string; + expirationTime: Network.TimeSinceEpoch; + joiningOrigin: string; + biddingUrl?: string; + biddingWasmHelperUrl?: string; + updateUrl?: string; + trustedBiddingSignalsUrl?: string; + trustedBiddingSignalsKeys: string[]; + userBiddingSignals?: string; + ads: InterestGroupAd[]; + adComponents: InterestGroupAd[]; + } /** * A cache's contents have been modified. @@ -12486,6 +12522,15 @@ Tokens from that issuer. */ origin: string; } + /** + * One of the interest groups was accessed by the associated page. + */ + export type interestGroupAccessedPayload = { + accessTime: Network.TimeSinceEpoch; + type: InterestGroupAccessType; + ownerOrigin: string; + name: string; + } /** * Clears storage for origin. @@ -12657,6 +12702,24 @@ Leaves other stored data, including the issuer's Redemption Records, intact. */ didDeleteTokens: boolean; } + /** + * Gets details for a named interest group. + */ + export type getInterestGroupDetailsParameters = { + ownerOrigin: string; + name: string; + } + export type getInterestGroupDetailsReturnValue = { + details: InterestGroupDetails; + } + /** + * Enables/Disables issuing of interestGroupAccessed events. + */ + export type setInterestGroupTrackingParameters = { + enable: boolean; + } + export type setInterestGroupTrackingReturnValue = { + } } /** @@ -16870,6 +16933,22 @@ unsubscribes current runtime agent from Runtime.bindingCalled notifications. } export type removeBindingReturnValue = { } + /** + * This method tries to lookup and populate exception details for a +JavaScript Error object. +Note that the stackTrace portion of the resulting exceptionDetails will +only be populated if the Runtime domain was enabled at the time when the +Error was thrown. + */ + export type getExceptionDetailsParameters = { + /** + * The error object for which to resolve the exception details. + */ + errorObjectId: RemoteObjectId; + } + export type getExceptionDetailsReturnValue = { + exceptionDetails?: ExceptionDetails; + } } /** @@ -17022,6 +17101,7 @@ unsubscribes current runtime agent from Runtime.bindingCalled notifications. "Storage.cacheStorageListUpdated": Storage.cacheStorageListUpdatedPayload; "Storage.indexedDBContentUpdated": Storage.indexedDBContentUpdatedPayload; "Storage.indexedDBListUpdated": Storage.indexedDBListUpdatedPayload; + "Storage.interestGroupAccessed": Storage.interestGroupAccessedPayload; "Target.attachedToTarget": Target.attachedToTargetPayload; "Target.detachedFromTarget": Target.detachedFromTargetPayload; "Target.receivedMessageFromTarget": Target.receivedMessageFromTargetPayload; @@ -17467,6 +17547,8 @@ unsubscribes current runtime agent from Runtime.bindingCalled notifications. "Storage.untrackIndexedDBForOrigin": Storage.untrackIndexedDBForOriginParameters; "Storage.getTrustTokens": Storage.getTrustTokensParameters; "Storage.clearTrustTokens": Storage.clearTrustTokensParameters; + "Storage.getInterestGroupDetails": Storage.getInterestGroupDetailsParameters; + "Storage.setInterestGroupTracking": Storage.setInterestGroupTrackingParameters; "SystemInfo.getInfo": SystemInfo.getInfoParameters; "SystemInfo.getProcessInfo": SystemInfo.getProcessInfoParameters; "Target.activateTarget": Target.activateTargetParameters; @@ -17597,6 +17679,7 @@ unsubscribes current runtime agent from Runtime.bindingCalled notifications. "Runtime.terminateExecution": Runtime.terminateExecutionParameters; "Runtime.addBinding": Runtime.addBindingParameters; "Runtime.removeBinding": Runtime.removeBindingParameters; + "Runtime.getExceptionDetails": Runtime.getExceptionDetailsParameters; "Schema.getDomains": Schema.getDomainsParameters; } export interface CommandReturnValues { @@ -17990,6 +18073,8 @@ unsubscribes current runtime agent from Runtime.bindingCalled notifications. "Storage.untrackIndexedDBForOrigin": Storage.untrackIndexedDBForOriginReturnValue; "Storage.getTrustTokens": Storage.getTrustTokensReturnValue; "Storage.clearTrustTokens": Storage.clearTrustTokensReturnValue; + "Storage.getInterestGroupDetails": Storage.getInterestGroupDetailsReturnValue; + "Storage.setInterestGroupTracking": Storage.setInterestGroupTrackingReturnValue; "SystemInfo.getInfo": SystemInfo.getInfoReturnValue; "SystemInfo.getProcessInfo": SystemInfo.getProcessInfoReturnValue; "Target.activateTarget": Target.activateTargetReturnValue; @@ -18120,6 +18205,7 @@ unsubscribes current runtime agent from Runtime.bindingCalled notifications. "Runtime.terminateExecution": Runtime.terminateExecutionReturnValue; "Runtime.addBinding": Runtime.addBindingReturnValue; "Runtime.removeBinding": Runtime.removeBindingReturnValue; + "Runtime.getExceptionDetails": Runtime.getExceptionDetailsReturnValue; "Schema.getDomains": Schema.getDomainsReturnValue; } } diff --git a/tests/page/page-network-response.spec.ts b/tests/page/page-network-response.spec.ts index 1a64e19346e2a..b47f8871b00b1 100644 --- a/tests/page/page-network-response.spec.ts +++ b/tests/page/page-network-response.spec.ts @@ -268,13 +268,13 @@ it('should behave the same way for headers and allHeaders', async ({ page, serve expect(allHeaders['name-b']).toEqual('v4'); }); -it('should provide a Response with a file URL', async ({ page, asset, isAndroid, isElectron, isWindows, browserName }) => { +it('should provide a Response with a file URL', async ({ page, asset, isAndroid, isElectron, isWindows, browserName, browserMajorVersion }) => { it.skip(isAndroid, 'No files on Android'); it.fixme(browserName === 'firefox', 'Firefox does return null for file:// URLs'); const fileurl = url.pathToFileURL(asset('frames/two-frames.html')).href; const response = await page.goto(fileurl); - if (isElectron || (browserName === 'webkit' && isWindows)) + if (isElectron || (browserName === 'chromium' && browserMajorVersion >= 100) || (browserName === 'webkit' && isWindows)) expect(response.status()).toBe(200); else expect(response.status()).toBe(0); From 20450b96ff79c1c11ed06970a497585a83911834 Mon Sep 17 00:00:00 2001 From: Max Schmitt Date: Wed, 2 Feb 2022 16:14:21 +0100 Subject: [PATCH 186/233] devops: fix broken emojis on TG on Windows bot (#11810) --- browser_patches/checkout_build_archive_upload.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/browser_patches/checkout_build_archive_upload.sh b/browser_patches/checkout_build_archive_upload.sh index 9b27c1f174741..58dcb1d007178 100755 --- a/browser_patches/checkout_build_archive_upload.sh +++ b/browser_patches/checkout_build_archive_upload.sh @@ -421,7 +421,7 @@ if generate_and_upload_browser_build 2>&1 | ./sanitize_and_compress_log.js $LOG_ fi done; LAST_COMMIT_MESSAGE=$(git log --format=%s -n 1 HEAD -- "./${BROWSER_NAME}/BUILD_NUMBER") - send_telegram_message "${BROWSER_DISPLAY_NAME} r${BUILD_NUMBER} COMPLETE! ✅ ${LAST_COMMIT_MESSAGE}" + send_telegram_message "${BROWSER_DISPLAY_NAME} r${BUILD_NUMBER} COMPLETE! \\u270 ${LAST_COMMIT_MESSAGE}" if [[ "${BROWSER_DISPLAY_NAME}" != "chromium-with-symbols" ]]; then create_roll_into_playwright_pr $BROWSER_NAME $BUILD_NUMBER fi @@ -447,7 +447,7 @@ else fi # Upload logs only in case of failure and report failure. ./upload.sh "${LOG_BLOB_PATH}" ${LOG_PATH} || true - send_telegram_message "$BUILD_ALIAS -- ${FAILED_STEP} failed! ❌
${LOG_BLOB_NAME} -- GitHub Action Logs" + send_telegram_message "$BUILD_ALIAS -- ${FAILED_STEP} failed! \\u274c ${LOG_BLOB_NAME} -- GitHub Action Logs" exit 1 fi From f6dd9b0c11e8c89a1421523a0214b6d9051d983a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 2 Feb 2022 16:15:18 +0100 Subject: [PATCH 187/233] chore(deps): bump nanoid from 3.1.29 to 3.2.0 (#11778) Bumps [nanoid](https://github.com/ai/nanoid) from 3.1.29 to 3.2.0. - [Release notes](https://github.com/ai/nanoid/releases) - [Changelog](https://github.com/ai/nanoid/blob/main/CHANGELOG.md) - [Commits](https://github.com/ai/nanoid/compare/3.1.29...3.2.0) --- updated-dependencies: - dependency-name: nanoid dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index fa4d003d996aa..efc258ba4c0eb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5347,9 +5347,9 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/nanoid": { - "version": "3.1.29", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.29.tgz", - "integrity": "sha512-dW2pUSGZ8ZnCFIlBIA31SV8huOGCHb6OwzVCc7A69rb/a+SgPBwfmLvK5TKQ3INPbRkcI8a/Owo0XbiTNH19wg==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.2.0.tgz", + "integrity": "sha512-fmsZYa9lpn69Ad5eDn7FMcnnSR+8R34W9qJEijxYhTbfOWzr22n1QxCMzXLK+ODyW2973V3Fux959iQoUxzUIA==", "dev": true, "bin": { "nanoid": "bin/nanoid.cjs" @@ -11707,9 +11707,9 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "nanoid": { - "version": "3.1.29", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.29.tgz", - "integrity": "sha512-dW2pUSGZ8ZnCFIlBIA31SV8huOGCHb6OwzVCc7A69rb/a+SgPBwfmLvK5TKQ3INPbRkcI8a/Owo0XbiTNH19wg==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.2.0.tgz", + "integrity": "sha512-fmsZYa9lpn69Ad5eDn7FMcnnSR+8R34W9qJEijxYhTbfOWzr22n1QxCMzXLK+ODyW2973V3Fux959iQoUxzUIA==", "dev": true }, "natural-compare": { From de8f22a8ff5abfbde42741d980905493c13554bc Mon Sep 17 00:00:00 2001 From: Leonardo Henrique Tsuda Date: Wed, 2 Feb 2022 17:10:34 -0300 Subject: [PATCH 188/233] docs(selectors.md): fix fill and FillAsync examples (#11790) --- docs/src/selectors.md | 42 +++++++++++++++++++++--------------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/docs/src/selectors.md b/docs/src/selectors.md index 6bd65c1c3ef9a..0323970387e4a 100644 --- a/docs/src/selectors.md +++ b/docs/src/selectors.md @@ -202,7 +202,7 @@ Selectors are strings that are used to create [Locator]s. Locators are used to p page.locator("_vue=list-item[text *= 'milk' i]").click(); ``` ```python async - await page.locator("_vue=list-item[text *= "milk" i]").click() + await page.locator("_vue=list-item[text *= 'milk' i]").click() ``` ```python sync page.locator("_vue=list-item[text *= 'milk' i]").click() @@ -645,7 +645,7 @@ to compute distance and relative position of the elements. ```js // Fill an input to the right of "Username". -await page.locator('input:right-of(:text("Username"))', 'value').fill(); +await page.locator('input:right-of(:text("Username"))').fill('value'); // Click a button near the promo card. await page.locator('button:near(.promo-card)').click(); @@ -653,7 +653,7 @@ await page.locator('button:near(.promo-card)').click(); ```java // Fill an input to the right of "Username". -page.locator("input:right-of(:text(\"Username\"))", "value").fill(); +page.locator("input:right-of(:text(\"Username\"))").fill("value"); // Click a button near the promo card. page.locator("button:near(.promo-card)").click(); @@ -661,7 +661,7 @@ page.locator("button:near(.promo-card)").click(); ```python async # Fill an input to the right of "Username". -await page.locator('input:right-of(:text("Username"))', 'value').fill() +await page.locator('input:right-of(:text("Username"))').fill('value') # Click a button near the promo card. await page.locator('button:near(.promo-card)').click() @@ -669,7 +669,7 @@ await page.locator('button:near(.promo-card)').click() ```python sync # Fill an input to the right of "Username". -page.locator('input:right-of(:text("Username"))', 'value').fill() +page.locator('input:right-of(:text("Username"))').fill('value') # Click a button near the promo card. page.locator('button:near(.promo-card)').click() @@ -677,7 +677,7 @@ page.locator('button:near(.promo-card)').click() ```csharp // Fill an input to the right of "Username". -await page.Locator("input:right-of(:text(\"Username\"))", "value").FillAsync(); +await page.Locator("input:right-of(:text(\"Username\"))").FillAsync("value"); // Click a button near the promo card. await page.Locator("button:near(.promo-card)").ClickAsync(); @@ -824,7 +824,7 @@ the following attributes are supported: ```js // Fill an input with the id "username" -await page.locator('id=username', 'value').fill(); +await page.locator('id=username').fill('value'); // Click an element with data-test-id "submit" await page.locator('data-test-id=submit').click(); @@ -832,7 +832,7 @@ await page.locator('data-test-id=submit').click(); ```java // Fill an input with the id "username" -page.locator("id=username", "value").fill(); +page.locator("id=username").fill("value"); // Click an element with data-test-id "submit" page.locator("data-test-id=submit").click(); @@ -840,7 +840,7 @@ page.locator("data-test-id=submit").click(); ```python async # Fill an input with the id "username" -await page.locator('id=username', 'value').fill() +await page.locator('id=username').fill('value') # Click an element with data-test-id "submit" await page.locator('data-test-id=submit').click() @@ -848,7 +848,7 @@ await page.locator('data-test-id=submit').click() ```python sync # Fill an input with the id "username" -page.locator('id=username', 'value').fill() +page.locator('id=username').fill('value') # Click an element with data-test-id "submit" page.locator('data-test-id=submit').click() @@ -856,7 +856,7 @@ page.locator('data-test-id=submit').click() ```csharp // Fill an input with the id "username" -await page.Locator("id=username", "value").FillAsync(); +await page.Locator("id=username").FillAsync("value"); // Click an element with data-test-id "submit" await page.Locator("data-test-id=submit").ClickAsync(); @@ -984,8 +984,8 @@ await page.locator('text="Login"').click(); await page.locator('"Login"').click(); // short-form // queries "Search GitHub" placeholder attribute -await page.locator('css=[placeholder="Search GitHub"]', 'query').fill(); -await page.locator('[placeholder="Search GitHub"]', 'query').fill(); // short-form +await page.locator('css=[placeholder="Search GitHub"]').fill('query'); +await page.locator('[placeholder="Search GitHub"]').fill('query'); // short-form // queries "Close" accessibility label await page.locator('css=[aria-label="Close"]').click(); @@ -1001,8 +1001,8 @@ page.locator("text=\"Login\"").click(); page.locator("\"Login\"").click(); // short-form // queries "Search GitHub" placeholder attribute -page.locator("css=[placeholder='Search GitHub']", "query").fill(); -page.locator("[placeholder='Search GitHub']", "query").fill(); // short-form +page.locator("css=[placeholder='Search GitHub']").fill("query"); +page.locator("[placeholder='Search GitHub']").fill("query"); // short-form // queries "Close" accessibility label page.locator("css=[aria-label='Close']").click(); @@ -1018,8 +1018,8 @@ await page.locator('text="Login"').click() await page.locator('"Login"').click() # short-form # queries "Search GitHub" placeholder attribute -await page.locator('css=[placeholder="Search GitHub"]', 'query').fill() -await page.locator('[placeholder="Search GitHub"]', 'query').fill() # short-form +await page.locator('css=[placeholder="Search GitHub"]').fill('query') +await page.locator('[placeholder="Search GitHub"]').fill('query') # short-form # queries "Close" accessibility label await page.locator('css=[aria-label="Close"]').click() @@ -1035,8 +1035,8 @@ page.locator('text="Login"').click() page.locator('"Login"').click() # short-form # queries "Search GitHub" placeholder attribute -page.locator('css=[placeholder="Search GitHub"]').fill() -page.locator('[placeholder="Search GitHub"]').fill() # short-form +page.locator('css=[placeholder="Search GitHub"]').fill('query') +page.locator('[placeholder="Search GitHub"]').fill('query') # short-form # queries "Close" accessibility label page.locator('css=[aria-label="Close"]').click() @@ -1052,8 +1052,8 @@ await page.Locator("text=\"Login\"").ClickAsync(); await page.Locator("\"Login\"").ClickAsync(); // short-form // queries "Search GitHub" placeholder attribute -await page.Locator("css=[placeholder='Search GitHub']", "query").FillAsync(); -await page.Locator("[placeholder='Search GitHub']", "query").FillAsync(); // short-form +await page.Locator("css=[placeholder='Search GitHub']").FillAsync("query"); +await page.Locator("[placeholder='Search GitHub']").FillAsync("query"); // short-form // queries "Close" accessibility label await page.Locator("css=[aria-label='Close']").ClickAsync(); From 55b9d14bbded66ead2d0ca87f9e26104f4127094 Mon Sep 17 00:00:00 2001 From: Yury Semikhatsky Date: Wed, 2 Feb 2022 15:38:55 -0800 Subject: [PATCH 189/233] browser(webkit): revert r288284 (#11821) --- browser_patches/webkit/BUILD_NUMBER | 4 +-- browser_patches/webkit/patches/bootstrap.diff | 35 +++++++++++-------- 2 files changed, 23 insertions(+), 16 deletions(-) diff --git a/browser_patches/webkit/BUILD_NUMBER b/browser_patches/webkit/BUILD_NUMBER index 4113fbf9912b8..3f73a39efcf23 100644 --- a/browser_patches/webkit/BUILD_NUMBER +++ b/browser_patches/webkit/BUILD_NUMBER @@ -1,2 +1,2 @@ -1608 -Changed: yurys@chromium.org Mon Jan 31 13:38:05 PST 2022 +1609 +Changed: yurys@chromium.org Wed 02 Feb 2022 03:31:54 PM PST diff --git a/browser_patches/webkit/patches/bootstrap.diff b/browser_patches/webkit/patches/bootstrap.diff index a66ec92774e55..437201cec790e 100644 --- a/browser_patches/webkit/patches/bootstrap.diff +++ b/browser_patches/webkit/patches/bootstrap.diff @@ -19227,18 +19227,6 @@ index 0000000000000000000000000000000000000000..5cf8a010e9809e6a95741cdb7c2cbeb4 +} + +} // namespace WebKit -diff --git a/Source/WebKit/UIProcess/win/WebProcessPoolWin.cpp b/Source/WebKit/UIProcess/win/WebProcessPoolWin.cpp -index a86b34ddaa8f715e1c947b8943cefd92139c4130..69f3521277d317e942bfbdd3f6d14cb71d741307 100644 ---- a/Source/WebKit/UIProcess/win/WebProcessPoolWin.cpp -+++ b/Source/WebKit/UIProcess/win/WebProcessPoolWin.cpp -@@ -34,6 +34,7 @@ - #include - #include - #include -+#include - #endif - - namespace WebKit { diff --git a/Source/WebKit/UIProcess/wpe/InspectorTargetProxyWPE.cpp b/Source/WebKit/UIProcess/wpe/InspectorTargetProxyWPE.cpp new file mode 100644 index 0000000000000000000000000000000000000000..7453194ca6f032ba86a4c67f5bf12688ab6ec1be @@ -21307,10 +21295,10 @@ index 04869b0d67226fb9f7951298f32f952c94cb2837..6ceb1dafd51d4f34c2f20f4f44a1dd99 WEBKIT_OPTION_DEFAULT_PORT_VALUE(ENABLE_NETSCAPE_PLUGIN_API PRIVATE OFF) else () diff --git a/Source/cmake/OptionsWinCairo.cmake b/Source/cmake/OptionsWinCairo.cmake -index 62b4bc6e91b180abe8ca0f749ce76bf1aba98d4d..89d9e16c7ca6ab3fa2ef7d695825437927755675 100644 +index 62b4bc6e91b180abe8ca0f749ce76bf1aba98d4d..23216d79747d514c53e965618d5bf7ade8beb659 100644 --- a/Source/cmake/OptionsWinCairo.cmake +++ b/Source/cmake/OptionsWinCairo.cmake -@@ -37,15 +37,36 @@ if (OpenJPEG_FOUND) +@@ -37,20 +37,42 @@ if (OpenJPEG_FOUND) endif () find_package(WOFF2 1.0.2 COMPONENTS dec) @@ -21350,6 +21338,25 @@ index 62b4bc6e91b180abe8ca0f749ce76bf1aba98d4d..89d9e16c7ca6ab3fa2ef7d6958254379 set(USE_ANGLE_EGL ON) set(USE_ANGLE_WEBGL ON) + SET_AND_EXPOSE_TO_BUILD(USE_ANGLE ON) + SET_AND_EXPOSE_TO_BUILD(USE_CAIRO ON) ++SET_AND_EXPOSE_TO_BUILD(USE_CF ON) + SET_AND_EXPOSE_TO_BUILD(USE_CURL ON) + SET_AND_EXPOSE_TO_BUILD(USE_GRAPHICS_LAYER_TEXTURE_MAPPER ON) + SET_AND_EXPOSE_TO_BUILD(USE_GRAPHICS_LAYER_WC ON) +@@ -67,11 +89,7 @@ SET_AND_EXPOSE_TO_BUILD(ENABLE_DEVELOPER_MODE ${DEVELOPER_MODE}) + + SET_AND_EXPOSE_TO_BUILD(HAVE_OS_DARK_MODE_SUPPORT 1) + +-# CoreFoundation is required when building WebKitLegacy +-if (ENABLE_WEBKIT_LEGACY) +- SET_AND_EXPOSE_TO_BUILD(USE_CF ON) +- set(COREFOUNDATION_LIBRARY CFlite) +-endif () ++set(COREFOUNDATION_LIBRARY CFlite) + + add_definitions(-DWTF_PLATFORM_WIN_CAIRO=1) + add_definitions(-DNOCRYPT) diff --git a/Tools/MiniBrowser/gtk/BrowserTab.c b/Tools/MiniBrowser/gtk/BrowserTab.c index 1c84f30b2ea96dd0c168918f9d63773b8e2548a3..55603437900a65de7bef70563c9ec0399c5f563c 100644 --- a/Tools/MiniBrowser/gtk/BrowserTab.c From f587a43932119fb50e3b81700b7f5eb89b266628 Mon Sep 17 00:00:00 2001 From: Dmitry Gozman Date: Wed, 2 Feb 2022 16:55:50 -0800 Subject: [PATCH 190/233] feat(locator): "has" option (#11411) This introduces `locator('div', { has: locator })` syntax that matches elements containing other elements. Can be used together with `hasText`. Internally, has selector engine takes an inner selector escaped with double-quotes: `div >> has="li >> span >> text=Foo" >> span`. --- docs/src/api/params.md | 9 ++++ packages/playwright-core/src/client/frame.ts | 2 +- .../playwright-core/src/client/locator.ts | 10 ++++- packages/playwright-core/src/client/page.ts | 2 +- .../src/server/common/selectorParser.ts | 33 +++++++++++++- .../src/server/injected/injectedScript.ts | 21 ++++++--- .../playwright-core/src/server/selectors.ts | 14 +++--- .../server/supplements/injected/consoleApi.ts | 8 ++-- packages/playwright-core/types/types.d.ts | 32 ++++++++++++++ tests/inspector/console-api.spec.ts | 6 +++ tests/page/locator-query.spec.ts | 44 +++++++++++++++++++ tests/page/selectors-misc.spec.ts | 34 ++++++++++++++ 12 files changed, 195 insertions(+), 20 deletions(-) diff --git a/docs/src/api/params.md b/docs/src/api/params.md index 7718491d7398d..732af683f7ee2 100644 --- a/docs/src/api/params.md +++ b/docs/src/api/params.md @@ -876,5 +876,14 @@ Slows down Playwright operations by the specified amount of milliseconds. Useful Matches elements containing specified text somewhere inside, possibly in a child or a descendant element. For example, `"Playwright"` matches `
Playwright
`. +## locator-option-has +- `has` <[Locator]> + +Matches elements containing an element that matches an inner locator. Inner locator is queried against the outer one. +For example, `article` that has `text=Playwright` matches `
Playwright
`. + +Note that outer and inner locators must belong to the same frame. Inner locator must not contain [FrameLocator]s. + ## locator-options-list - %%-locator-option-has-text-%% +- %%-locator-option-has-%% diff --git a/packages/playwright-core/src/client/frame.ts b/packages/playwright-core/src/client/frame.ts index 1cba0f0157ebb..32e2fcc02163c 100644 --- a/packages/playwright-core/src/client/frame.ts +++ b/packages/playwright-core/src/client/frame.ts @@ -288,7 +288,7 @@ export class Frame extends ChannelOwner implements api.Fr return await this._channel.highlight({ selector }); } - locator(selector: string, options?: { hasText?: string | RegExp }): Locator { + locator(selector: string, options?: { hasText?: string | RegExp, has?: Locator }): Locator { return new Locator(this, selector, options); } diff --git a/packages/playwright-core/src/client/locator.ts b/packages/playwright-core/src/client/locator.ts index 9c0b46fae73b3..13b52c13ceccf 100644 --- a/packages/playwright-core/src/client/locator.ts +++ b/packages/playwright-core/src/client/locator.ts @@ -29,7 +29,7 @@ export class Locator implements api.Locator { private _frame: Frame; private _selector: string; - constructor(frame: Frame, selector: string, options?: { hasText?: string | RegExp }) { + constructor(frame: Frame, selector: string, options?: { hasText?: string | RegExp, has?: Locator }) { this._frame = frame; this._selector = selector; @@ -40,6 +40,12 @@ export class Locator implements api.Locator { else this._selector += ` >> :scope:has-text(${escapeWithQuotes(text, '"')})`; } + + if (options?.has) { + if (options.has._frame !== frame) + throw new Error(`Inner "has" locator must belong to the same frame.`); + this._selector += ` >> has=` + JSON.stringify(options.has._selector); + } } private async _withElement(task: (handle: ElementHandle, timeout?: number) => Promise, timeout?: number): Promise { @@ -110,7 +116,7 @@ export class Locator implements api.Locator { return this._frame._highlight(this._selector); } - locator(selector: string, options?: { hasText?: string | RegExp }): Locator { + locator(selector: string, options?: { hasText?: string | RegExp, has?: Locator }): Locator { return new Locator(this._frame, this._selector + ' >> ' + selector, options); } diff --git a/packages/playwright-core/src/client/page.ts b/packages/playwright-core/src/client/page.ts index 1dd7e8dd32e93..0558dbb8a7ab6 100644 --- a/packages/playwright-core/src/client/page.ts +++ b/packages/playwright-core/src/client/page.ts @@ -515,7 +515,7 @@ export class Page extends ChannelOwner implements api.Page return this._mainFrame.fill(selector, value, options); } - locator(selector: string, options?: { hasText?: string | RegExp }): Locator { + locator(selector: string, options?: { hasText?: string | RegExp, has?: Locator }): Locator { return this.mainFrame().locator(selector, options); } diff --git a/packages/playwright-core/src/server/common/selectorParser.ts b/packages/playwright-core/src/server/common/selectorParser.ts index 9b37b455ee645..9ded59564710e 100644 --- a/packages/playwright-core/src/server/common/selectorParser.ts +++ b/packages/playwright-core/src/server/common/selectorParser.ts @@ -19,7 +19,7 @@ export { InvalidSelectorError, isInvalidSelectorError } from './cssParser'; export type ParsedSelectorPart = { name: string, - body: string | CSSComplexSelectorList, + body: string | CSSComplexSelectorList | ParsedSelector, source: string, }; @@ -34,6 +34,7 @@ type ParsedSelectorStrings = { }; export const customCSSNames = new Set(['not', 'is', 'where', 'has', 'scope', 'light', 'visible', 'text', 'text-matches', 'text-is', 'has-text', 'above', 'below', 'right-of', 'left-of', 'near', 'nth-match']); +const kNestedSelectorNames = new Set(['has']); export function parseSelector(selector: string): ParsedSelector { const result = parseSelectorString(selector); @@ -48,8 +49,25 @@ export function parseSelector(selector: string): ParsedSelector { source: part.body }; } + if (kNestedSelectorNames.has(part.name)) { + let innerSelector: string; + try { + const unescaped = JSON.parse(part.body); + if (typeof unescaped !== 'string') + throw new Error(`Malformed selector: ${part.name}=` + part.body); + innerSelector = unescaped; + } catch (e) { + throw new Error(`Malformed selector: ${part.name}=` + part.body); + } + const result = { name: part.name, source: part.body, body: parseSelector(innerSelector) }; + if (result.body.parts.some(part => part.name === 'control' && part.body === 'enter-frame')) + throw new Error(`Frames are not allowed inside "${part.name}" selectors`); + return result; + } return { ...part, source: part.body }; }); + if (kNestedSelectorNames.has(parts[0].name)) + throw new Error(`"${parts[0].name}" selector cannot be first`); return { capture: result.capture, parts @@ -94,6 +112,19 @@ export function stringifySelector(selector: string | ParsedSelector): string { }).join(' >> '); } +export function allEngineNames(selector: ParsedSelector): Set { + const result = new Set(); + const visit = (selector: ParsedSelector) => { + for (const part of selector.parts) { + result.add(part.name); + if (kNestedSelectorNames.has(part.name)) + visit(part.body as ParsedSelector); + } + }; + visit(selector); + return result; +} + function parseSelectorString(selector: string): ParsedSelectorStrings { let index = 0; let quote: string | undefined; diff --git a/packages/playwright-core/src/server/injected/injectedScript.ts b/packages/playwright-core/src/server/injected/injectedScript.ts index 1778a7f753aa9..259e94cdebd08 100644 --- a/packages/playwright-core/src/server/injected/injectedScript.ts +++ b/packages/playwright-core/src/server/injected/injectedScript.ts @@ -18,7 +18,7 @@ import { SelectorEngine, SelectorRoot } from './selectorEngine'; import { XPathEngine } from './xpathSelectorEngine'; import { ReactEngine } from './reactSelectorEngine'; import { VueEngine } from './vueSelectorEngine'; -import { ParsedSelector, ParsedSelectorPart, parseSelector, stringifySelector } from '../common/selectorParser'; +import { allEngineNames, ParsedSelector, ParsedSelectorPart, parseSelector, stringifySelector } from '../common/selectorParser'; import { SelectorEvaluatorImpl, isVisible, parentElementOrShadowHost, elementMatchesText, TextMatcher, createRegexTextMatcher, createStrictTextMatcher, createLaxTextMatcher } from './selectorEvaluator'; import { CSSComplexSelectorList } from '../common/cssParser'; import { generateSelector } from './selectorGenerator'; @@ -99,6 +99,7 @@ export class InjectedScript { this._engines.set('nth', { queryAll: () => [] }); this._engines.set('visible', { queryAll: () => [] }); this._engines.set('control', this._createControlEngine()); + this._engines.set('has', this._createHasEngine()); for (const { name, engine } of customEngines) this._engines.set(name, engine); @@ -116,9 +117,9 @@ export class InjectedScript { parseSelector(selector: string): ParsedSelector { const result = parseSelector(selector); - for (const part of result.parts) { - if (!this._engines.has(part.name)) - throw this.createStacklessError(`Unknown engine "${part.name}" while parsing selector ${selector}`); + for (const name of allEngineNames(result)) { + if (!this._engines.has(name)) + throw this.createStacklessError(`Unknown engine "${name}" while parsing selector ${selector}`); } return result; } @@ -181,7 +182,7 @@ export class InjectedScript { } let all = queryResults[index]; if (!all) { - all = this._queryEngineAll(selector.parts[index], root.element); + all = this._queryEngineAll(part, root.element); queryResults[index] = all; } @@ -278,6 +279,16 @@ export class InjectedScript { }; } + private _createHasEngine(): SelectorEngineV2 { + const queryAll = (root: SelectorRoot, body: ParsedSelector) => { + if (root.nodeType !== 1 /* Node.ELEMENT_NODE */) + return []; + const has = !!this.querySelector(body, root, false); + return has ? [root as Element] : []; + }; + return { queryAll }; + } + extend(source: string, params: any): any { const constrFunction = global.eval(` (() => { diff --git a/packages/playwright-core/src/server/selectors.ts b/packages/playwright-core/src/server/selectors.ts index f9d7310f17253..25d1a9a74bf61 100644 --- a/packages/playwright-core/src/server/selectors.ts +++ b/packages/playwright-core/src/server/selectors.ts @@ -18,7 +18,7 @@ import * as dom from './dom'; import * as frames from './frames'; import * as js from './javascript'; import * as types from './types'; -import { InvalidSelectorError, ParsedSelector, parseSelector, stringifySelector } from './common/selectorParser'; +import { allEngineNames, InvalidSelectorError, ParsedSelector, parseSelector, stringifySelector } from './common/selectorParser'; import { createGuid } from '../utils/utils'; export type SelectorInfo = { @@ -44,7 +44,7 @@ export class Selectors { 'data-testid', 'data-testid:light', 'data-test-id', 'data-test-id:light', 'data-test', 'data-test:light', - 'nth', 'visible', 'control' + 'nth', 'visible', 'control', 'has', ]); this._builtinEnginesInMainWorld = new Set([ '_react', '_vue', @@ -135,13 +135,13 @@ export class Selectors { parseSelector(selector: string | ParsedSelector, strict: boolean): SelectorInfo { const parsed = typeof selector === 'string' ? parseSelector(selector) : selector; let needsMainWorld = false; - for (const part of parsed.parts) { - const custom = this._engines.get(part.name); - if (!custom && !this._builtinEngines.has(part.name)) - throw new InvalidSelectorError(`Unknown engine "${part.name}" while parsing selector ${stringifySelector(parsed)}`); + for (const name of allEngineNames(parsed)) { + const custom = this._engines.get(name); + if (!custom && !this._builtinEngines.has(name)) + throw new InvalidSelectorError(`Unknown engine "${name}" while parsing selector ${stringifySelector(parsed)}`); if (custom && !custom.contentScript) needsMainWorld = true; - if (this._builtinEnginesInMainWorld.has(part.name)) + if (this._builtinEnginesInMainWorld.has(name)) needsMainWorld = true; } return { diff --git a/packages/playwright-core/src/server/supplements/injected/consoleApi.ts b/packages/playwright-core/src/server/supplements/injected/consoleApi.ts index e5a0613bdbaa1..2f818eadd235c 100644 --- a/packages/playwright-core/src/server/supplements/injected/consoleApi.ts +++ b/packages/playwright-core/src/server/supplements/injected/consoleApi.ts @@ -24,7 +24,7 @@ function createLocator(injectedScript: InjectedScript, initial: string, options? element: Element | undefined; elements: Element[]; - constructor(selector: string, options?: { hasText?: string | RegExp }) { + constructor(selector: string, options?: { hasText?: string | RegExp, has?: Locator }) { this.selector = selector; if (options?.hasText) { const text = options.hasText; @@ -33,12 +33,14 @@ function createLocator(injectedScript: InjectedScript, initial: string, options? else this.selector += ` >> :scope:has-text(${escapeWithQuotes(text)})`; } + if (options?.has) + this.selector += ` >> has=` + JSON.stringify(options.has.selector); const parsed = injectedScript.parseSelector(this.selector); this.element = injectedScript.querySelector(parsed, document, false); this.elements = injectedScript.querySelectorAll(parsed, document); } - locator(selector: string, options?: { hasText: string | RegExp }): Locator { + locator(selector: string, options?: { hasText: string | RegExp, has?: Locator }): Locator { return new Locator(this.selector ? this.selector + ' >> ' + selector : selector, options); } } @@ -48,7 +50,7 @@ function createLocator(injectedScript: InjectedScript, initial: string, options? type ConsoleAPIInterface = { $: (selector: string) => void; $$: (selector: string) => void; - locator: (selector: string) => any; + locator: (selector: string, options?: { hasText: string | RegExp, has?: any }) => any; inspect: (selector: string) => void; selector: (element: Element) => void; resume: () => void; diff --git a/packages/playwright-core/types/types.d.ts b/packages/playwright-core/types/types.d.ts index 0870e8a6cc21f..2fa0b5cf14c5f 100644 --- a/packages/playwright-core/types/types.d.ts +++ b/packages/playwright-core/types/types.d.ts @@ -2570,6 +2570,14 @@ export interface Page { * @param options */ locator(selector: string, options?: { + /** + * Matches elements containing an element that matches an inner locator. Inner locator is queried against the outer one. + * For example, `article` that has `text=Playwright` matches `
Playwright
`. + * + * Note that outer and inner locators must belong to the same frame. Inner locator must not contain [FrameLocator]s. + */ + has?: Locator; + /** * Matches elements containing specified text somewhere inside, possibly in a child or a descendant element. For example, * `"Playwright"` matches `
Playwright
`. @@ -5353,6 +5361,14 @@ export interface Frame { * @param options */ locator(selector: string, options?: { + /** + * Matches elements containing an element that matches an inner locator. Inner locator is queried against the outer one. + * For example, `article` that has `text=Playwright` matches `
Playwright
`. + * + * Note that outer and inner locators must belong to the same frame. Inner locator must not contain [FrameLocator]s. + */ + has?: Locator; + /** * Matches elements containing specified text somewhere inside, possibly in a child or a descendant element. For example, * `"Playwright"` matches `
Playwright
`. @@ -9266,6 +9282,14 @@ export interface Locator { * @param options */ locator(selector: string, options?: { + /** + * Matches elements containing an element that matches an inner locator. Inner locator is queried against the outer one. + * For example, `article` that has `text=Playwright` matches `
Playwright
`. + * + * Note that outer and inner locators must belong to the same frame. Inner locator must not contain [FrameLocator]s. + */ + has?: Locator; + /** * Matches elements containing specified text somewhere inside, possibly in a child or a descendant element. For example, * `"Playwright"` matches `
Playwright
`. @@ -13700,6 +13724,14 @@ export interface FrameLocator { * @param options */ locator(selector: string, options?: { + /** + * Matches elements containing an element that matches an inner locator. Inner locator is queried against the outer one. + * For example, `article` that has `text=Playwright` matches `
Playwright
`. + * + * Note that outer and inner locators must belong to the same frame. Inner locator must not contain [FrameLocator]s. + */ + has?: Locator; + /** * Matches elements containing specified text somewhere inside, possibly in a child or a descendant element. For example, * `"Playwright"` matches `
Playwright
`. diff --git a/tests/inspector/console-api.spec.ts b/tests/inspector/console-api.spec.ts index 73426ac7f88bf..2b35a6384c5e2 100644 --- a/tests/inspector/console-api.spec.ts +++ b/tests/inspector/console-api.spec.ts @@ -60,3 +60,9 @@ it('should support playwright.locator.values', async ({ page }) => { expect(await page.evaluate(`playwright.locator('div', { hasText: /ELL/i }).elements.length`)).toBe(1); expect(await page.evaluate(`playwright.locator('div', { hasText: /Hello/ }).elements.length`)).toBe(1); }); + +it('should support playwright.locator({ has })', async ({ page }) => { + await page.setContent('
Hi
Hello
'); + expect(await page.evaluate(`playwright.locator('div', { has: playwright.locator('span') }).element.innerHTML`)).toContain('Hello'); + expect(await page.evaluate(`playwright.locator('div', { has: playwright.locator('text=Hello') }).element.innerHTML`)).toContain('span'); +}); diff --git a/tests/page/locator-query.spec.ts b/tests/page/locator-query.spec.ts index a8fec6d97db02..504adf1d2ab37 100644 --- a/tests/page/locator-query.spec.ts +++ b/tests/page/locator-query.spec.ts @@ -89,3 +89,47 @@ it('should filter by regex and regexp flags', async ({ page }) => { await page.setContent(`
Hello "world"
Hello world
`); await expect(page.locator('div', { hasText: /hElLo "world"/i })).toHaveText('Hello "world"'); }); + +it('should support has:locator', async ({ page }) => { + await page.setContent(`
hello
world
`); + await expect(page.locator(`div`, { + has: page.locator(`text=world`) + })).toHaveCount(1); + expect(await page.locator(`div`, { + has: page.locator(`text=world`) + }).evaluate(e => e.outerHTML)).toBe(`
world
`); + await expect(page.locator(`div`, { + has: page.locator(`text="hello"`) + })).toHaveCount(1); + expect(await page.locator(`div`, { + has: page.locator(`text="hello"`) + }).evaluate(e => e.outerHTML)).toBe(`
hello
`); + await expect(page.locator(`div`, { + has: page.locator(`xpath=./span`) + })).toHaveCount(2); + await expect(page.locator(`div`, { + has: page.locator(`span`) + })).toHaveCount(2); + await expect(page.locator(`div`, { + has: page.locator(`span`, { hasText: 'wor' }) + })).toHaveCount(1); + expect(await page.locator(`div`, { + has: page.locator(`span`, { hasText: 'wor' }) + }).evaluate(e => e.outerHTML)).toBe(`
world
`); + await expect(page.locator(`div`, { + has: page.locator(`span`), + hasText: 'wor', + })).toHaveCount(1); +}); + +it('should enforce same frame for has:locator', async ({ page, server }) => { + await page.goto(server.PREFIX + '/frames/two-frames.html'); + const child = page.frames()[1]; + let error; + try { + page.locator('div', { has: child.locator('span') }); + } catch (e) { + error = e; + } + expect(error.message).toContain('Inner "has" locator must belong to the same frame.'); +}); diff --git a/tests/page/selectors-misc.spec.ts b/tests/page/selectors-misc.spec.ts index 9314922d80838..f82c6c5c32aae 100644 --- a/tests/page/selectors-misc.spec.ts +++ b/tests/page/selectors-misc.spec.ts @@ -339,3 +339,37 @@ it('should properly determine visibility of display:contents elements', async ({ `); await page.waitForSelector('article', { state: 'hidden' }); }); + +it('should work with has=', async ({ page, server }) => { + await page.goto(server.PREFIX + '/deep-shadow.html'); + expect(await page.$$eval(`div >> has="#target"`, els => els.length)).toBe(2); + expect(await page.$$eval(`div >> has="[data-testid=foo]"`, els => els.length)).toBe(3); + expect(await page.$$eval(`div >> has="[attr*=value]"`, els => els.length)).toBe(2); + + await page.setContent(`

`); + expect(await page.$$eval(`section >> has="span, div"`, els => els.length)).toBe(1); + expect(await page.$$eval(`section >> has="span, div"`, els => els.length)).toBe(1); + expect(await page.$$eval(`section >> has="br"`, els => els.length)).toBe(1); + expect(await page.$$eval(`section >> has="span, br"`, els => els.length)).toBe(2); + expect(await page.$$eval(`section >> has="span, br, div"`, els => els.length)).toBe(2); + + await page.setContent(`
hello
world
`); + expect(await page.$$eval(`div >> has="text=world"`, els => els.length)).toBe(1); + expect(await page.$eval(`div >> has="text=world"`, e => e.outerHTML)).toBe(`
world
`); + expect(await page.$$eval(`div >> has="text=\\"hello\\""`, els => els.length)).toBe(1); + expect(await page.$eval(`div >> has="text=\\"hello\\""`, e => e.outerHTML)).toBe(`
hello
`); + expect(await page.$$eval(`div >> has="xpath=./span"`, els => els.length)).toBe(2); + expect(await page.$$eval(`div >> has="span"`, els => els.length)).toBe(2); + expect(await page.$$eval(`div >> has="span >> text=wor"`, els => els.length)).toBe(1); + expect(await page.$eval(`div >> has="span >> text=wor"`, e => e.outerHTML)).toBe(`
world
`); + expect(await page.$eval(`div >> has="span >> text=wor" >> span`, e => e.outerHTML)).toBe(`world`); + + const error1 = await page.$(`div >> has=abc`).catch(e => e); + expect(error1.message).toContain('Malformed selector: has=abc'); + const error2 = await page.$(`has="div"`).catch(e => e); + expect(error2.message).toContain('"has" selector cannot be first'); + const error3 = await page.$(`div >> has=33`).catch(e => e); + expect(error3.message).toContain('Malformed selector: has=33'); + const error4 = await page.$(`div >> has="span!"`).catch(e => e); + expect(error4.message).toContain('Unexpected token "!" while parsing selector "span!"'); +}); From ba0c7e679bbecbf47bcf519aefeba781125707c6 Mon Sep 17 00:00:00 2001 From: Andrey Lushnikov Date: Wed, 2 Feb 2022 19:33:51 -0700 Subject: [PATCH 191/233] feat(test-runner): support expect.soft (#11800) Soft expects will still fail the test, but will not abort it's execution. As a consequence of this: - `TestResult` now might have multiple errors, which is reflected with a new `testResult.erros: TestError[]` field. - `TestInfo` now might have multiple errors as well, which is reflected with a new `testInfo.errors: TestError[]` field. Fixes #7819 --- docs/src/test-api/class-testinfo.md | 13 +-- docs/src/test-assertions-js.md | 17 +++- .../src/test-reporter-api/class-testresult.md | 8 +- .../html-reporter/src/testCaseView.spec.tsx | 1 + packages/html-reporter/src/testResultView.css | 1 + packages/html-reporter/src/testResultView.tsx | 4 +- packages/playwright-test/src/dispatcher.ts | 9 ++- packages/playwright-test/src/expect.ts | 40 ++++++++-- packages/playwright-test/src/index.ts | 6 +- packages/playwright-test/src/ipc.ts | 2 +- .../playwright-test/src/matchers/golden.ts | 6 +- .../playwright-test/src/reporters/base.ts | 67 ++++++++-------- .../playwright-test/src/reporters/html.ts | 4 +- packages/playwright-test/src/reporters/raw.ts | 4 +- packages/playwright-test/src/test.ts | 3 +- packages/playwright-test/src/testInfo.ts | 39 +++++---- packages/playwright-test/src/util.ts | 7 +- packages/playwright-test/src/workerRunner.ts | 4 +- packages/playwright-test/types/test.d.ts | 7 +- .../playwright-test/types/testExpect.d.ts | 1 + .../playwright-test/types/testReporter.d.ts | 7 +- tests/playwright-test/expect-soft.spec.ts | 80 +++++++++++++++++++ tests/playwright-test/golden.spec.ts | 8 +- tests/playwright-test/reporter-github.spec.ts | 2 +- utils/generate_types/overrides-test.d.ts | 1 + .../overrides-testReporter.d.ts | 1 + 26 files changed, 252 insertions(+), 90 deletions(-) create mode 100644 tests/playwright-test/expect-soft.spec.ts diff --git a/docs/src/test-api/class-testinfo.md b/docs/src/test-api/class-testinfo.md index bc73fc12ea911..0b087c6b7a975 100644 --- a/docs/src/test-api/class-testinfo.md +++ b/docs/src/test-api/class-testinfo.md @@ -128,12 +128,15 @@ The number of milliseconds the test took to finish. Always zero before the test ## property: TestInfo.error -- type: <[Object]> - - `message` <[void]|[string]> Error message. Set when `Error` (or its subclass) has been thrown. - - `stack` <[void]|[string]> Error stack. Set when `Error` (or its subclass) has been thrown. - - `value` <[void]|[string]> The thrown value. Set when anything except the `Error` (or its subclass) has been thrown. +- type: <[void]|[TestError]> -An error thrown during test execution, if any. +First error thrown during test execution, if any. This is equal to the first +element in [`property: TestInfo.errors`]. + +## property: TestInfo.errors +- type: <[Array]<[TestError]>> + +Errors thrown during test execution, if any. ## property: TestInfo.expectedStatus diff --git a/docs/src/test-assertions-js.md b/docs/src/test-assertions-js.md index cd541bc31e14d..f4e5c73021a72 100644 --- a/docs/src/test-assertions-js.md +++ b/docs/src/test-assertions-js.md @@ -19,10 +19,25 @@ expect(value).not.toEqual(0); await expect(locator).not.toContainText("some text"); ``` -You can also specify a custom error message as a second argument to the `expect` function, for example: +By default, failed assertion will terminate test execution. Playwright also +supports *soft assertions*: failed soft assertions **do not** terminate test execution, +but mark the test as failed. + +```js +// Make a few checks that will not stop the test when failed... +await expect.soft(page.locator('#status')).toHaveText('Success'); +await expect.soft(page.locator('#eta')).toHaveText('1 day'); + +// ... and continue the test to check more things. +await page.locator('#next-page').click(); +await expect.soft(page.locator('#title')).toHaveText('Make another order'); +``` + +You can specify a custom error message as a second argument to the `expect` function, for example: ```js expect(value, 'my custom error message').toBe(42); +expect.soft(value, 'my soft assertion').toBe(56); ``` diff --git a/docs/src/test-reporter-api/class-testresult.md b/docs/src/test-reporter-api/class-testresult.md index 7a96d057e0750..6857eb12a03cd 100644 --- a/docs/src/test-reporter-api/class-testresult.md +++ b/docs/src/test-reporter-api/class-testresult.md @@ -20,7 +20,13 @@ Running time in milliseconds. ## property: TestResult.error - type: <[void]|[TestError]> -An error thrown during the test execution, if any. +First error thrown during test execution, if any. This is equal to the first +element in [`property: TestResult.errors`]. + +## property: TestResult.errors +- type: <[Array]<[TestError]>> + +Errors thrown during the test execution. ## property: TestResult.retry - type: <[int]> diff --git a/packages/html-reporter/src/testCaseView.spec.tsx b/packages/html-reporter/src/testCaseView.spec.tsx index 64eb73a855ba5..1516c3649a0ca 100644 --- a/packages/html-reporter/src/testCaseView.spec.tsx +++ b/packages/html-reporter/src/testCaseView.spec.tsx @@ -26,6 +26,7 @@ const result: TestResult = { retry: 0, startTime: new Date(0).toUTCString(), duration: 100, + errors: [], steps: [{ title: 'Outer step', startTime: new Date(100).toUTCString(), diff --git a/packages/html-reporter/src/testResultView.css b/packages/html-reporter/src/testResultView.css index 9f07a89cda491..1d9c39e9491c2 100644 --- a/packages/html-reporter/src/testResultView.css +++ b/packages/html-reporter/src/testResultView.css @@ -55,6 +55,7 @@ border-radius: 6px; padding: 16px; line-height: initial; + margin-bottom: 6px; } .test-result-counter { diff --git a/packages/html-reporter/src/testResultView.tsx b/packages/html-reporter/src/testResultView.tsx index 0a6c5a85a40b8..764cb25a1429e 100644 --- a/packages/html-reporter/src/testResultView.tsx +++ b/packages/html-reporter/src/testResultView.tsx @@ -51,8 +51,8 @@ export const TestResultView: React.FC<{ const diff = attachmentsMap.get('diff'); const hasImages = [actual?.contentType, expected?.contentType, diff?.contentType].some(v => v && /^image\//i.test(v)); return
- {result.error && - + {!!result.errors.length && + {result.errors.map((error, index) => )} } {!!result.steps.length && {result.steps.map((step, i) => )} diff --git a/packages/playwright-test/src/dispatcher.ts b/packages/playwright-test/src/dispatcher.ts index 1c3b8769bb7c5..dcb1806a36023 100644 --- a/packages/playwright-test/src/dispatcher.ts +++ b/packages/playwright-test/src/dispatcher.ts @@ -199,7 +199,8 @@ export class Dispatcher { const { result } = data.resultByWorkerIndex.get(worker.workerIndex)!; data.resultByWorkerIndex.delete(worker.workerIndex); result.duration = params.duration; - result.error = params.error; + result.errors = params.errors; + result.error = result.errors[0]; result.attachments = params.attachments.map(a => ({ name: a.name, path: a.path, @@ -292,7 +293,8 @@ export class Dispatcher { if (runningHookId) { const data = this._testById.get(runningHookId)!; const { result } = data.resultByWorkerIndex.get(worker.workerIndex)!; - result.error = params.fatalError; + result.errors = [params.fatalError]; + result.error = result.errors[0]; result.status = 'failed'; this._reporter.onTestEnd?.(data.test, result); } @@ -312,7 +314,8 @@ export class Dispatcher { if (test._type === 'test') this._reporter.onTestBegin?.(test, result); } - result.error = params.fatalError; + result.errors = [params.fatalError]; + result.error = result.errors[0]; result.status = first ? 'failed' : 'skipped'; this._reportTestEnd(test, result); failedTestIds.add(test._id); diff --git a/packages/playwright-test/src/expect.ts b/packages/playwright-test/src/expect.ts index 4524848567463..96c7d9f564678 100644 --- a/packages/playwright-test/src/expect.ts +++ b/packages/playwright-test/src/expect.ts @@ -92,15 +92,23 @@ export const printReceivedStringContainExpectedResult = ( // #endregion +function createExpect(actual: unknown, message: string|undefined, isSoft: boolean) { + if (message !== undefined && typeof message !== 'string') + throw new Error('expect(actual, optionalErrorMessage): optional error message must be a string.'); + return new Proxy(expectLibrary(actual), new ExpectMetaInfoProxyHandler(message || '', isSoft)); +} + export const expect: Expect = new Proxy(expectLibrary as any, { apply: function(target: any, thisArg: any, argumentsList: [actual: unknown, message: string|undefined]) { - const message = argumentsList[1]; - if (message !== undefined && typeof message !== 'string') - throw new Error('expect(actual, optionalErrorMessage): optional error message must be a string.'); - return new Proxy(expectLibrary.call(thisArg, argumentsList[0]), new ExpectMetaInfoProxyHandler(message || '')); + const [actual, message] = argumentsList; + return createExpect(actual, message, false /* isSoft */); } }); +expect.soft = (actual: unknown, message: string|undefined) => { + return createExpect(actual, message, true /* isSoft */); +}; + expectLibrary.setState({ expand: false }); const customMatchers = { toBeChecked, @@ -128,15 +136,18 @@ const customMatchers = { type ExpectMetaInfo = { message: string; + isSoft: boolean; }; let expectCallMetaInfo: undefined|ExpectMetaInfo = undefined; class ExpectMetaInfoProxyHandler { private _message: string; + private _isSoft: boolean; - constructor(message: string) { + constructor(message: string, isSoft: boolean) { this._message = message; + this._isSoft = isSoft; } get(target: any, prop: any, receiver: any): any { @@ -144,12 +155,26 @@ class ExpectMetaInfoProxyHandler { if (typeof value !== 'function') return new Proxy(value, this); return (...args: any[]) => { + const testInfo = currentTestInfo(); + if (!testInfo) + return value.call(target, ...args); + const handleError = (e: Error) => { + if (this._isSoft) + testInfo._failWithError(serializeError(e), false /* isHardError */); + else + throw e; + }; try { expectCallMetaInfo = { message: this._message, + isSoft: this._isSoft, }; - const result = value.call(target, ...args); + let result = value.call(target, ...args); + if ((result instanceof Promise)) + result = result.catch(handleError); return result; + } catch (e) { + handleError(e); } finally { expectCallMetaInfo = undefined; } @@ -172,10 +197,11 @@ function wrap(matcherName: string, matcher: any) { const stackLines = new Error().stack!.split('\n').slice(INTERNAL_STACK_LENGTH + 1); const frame = stackLines[0] ? stackUtils.parseLine(stackLines[0]) : undefined; const customMessage = expectCallMetaInfo?.message ?? ''; + const isSoft = expectCallMetaInfo?.isSoft ?? false; const step = testInfo._addStep({ location: frame && frame.file ? { file: path.resolve(process.cwd(), frame.file), line: frame.line || 0, column: frame.column || 0 } : undefined, category: 'expect', - title: customMessage || `expect${this.isNot ? '.not' : ''}.${matcherName}`, + title: customMessage || `expect${isSoft ? '.soft' : ''}${this.isNot ? '.not' : ''}.${matcherName}`, canHaveChildren: true, forceNoParent: false }); diff --git a/packages/playwright-test/src/index.ts b/packages/playwright-test/src/index.ts index 34d67fe69b4d0..4e075578b56c5 100644 --- a/packages/playwright-test/src/index.ts +++ b/packages/playwright-test/src/index.ts @@ -380,7 +380,8 @@ export const test = _baseTest.extend({ const anyContext = leftoverContexts[0]; const pendingCalls = anyContext ? formatPendingCalls((anyContext as any)._connection.pendingProtocolCalls()) : ''; await Promise.all(leftoverContexts.filter(c => createdContexts.has(c)).map(c => c.close())); - testInfo.error = prependToTestError(testInfo.error, pendingCalls); + if (pendingCalls) + testInfo.error = prependToTestError(testInfo.error, pendingCalls); } }, { auto: true }], @@ -434,7 +435,8 @@ export const test = _baseTest.extend({ } })); - testInfo.error = prependToTestError(testInfo.error, prependToError); + if (prependToError) + testInfo.error = prependToTestError(testInfo.error, prependToError); }, context: async ({ _contextFactory }, use) => { diff --git a/packages/playwright-test/src/ipc.ts b/packages/playwright-test/src/ipc.ts index f31badf109f0e..c20c63bb1d341 100644 --- a/packages/playwright-test/src/ipc.ts +++ b/packages/playwright-test/src/ipc.ts @@ -39,7 +39,7 @@ export type TestEndPayload = { testId: string; duration: number; status: TestStatus; - error?: TestError; + errors: TestError[]; expectedStatus: TestStatus; annotations: { type: string, description?: string }[]; timeout: number; diff --git a/packages/playwright-test/src/matchers/golden.ts b/packages/playwright-test/src/matchers/golden.ts index 546d04bd6862d..cc95e3c325b86 100644 --- a/packages/playwright-test/src/matchers/golden.ts +++ b/packages/playwright-test/src/matchers/golden.ts @@ -23,7 +23,7 @@ import jpeg from 'jpeg-js'; import pixelmatch from 'pixelmatch'; import { diff_match_patch, DIFF_INSERT, DIFF_DELETE, DIFF_EQUAL } from '../third_party/diff_match_patch'; import { UpdateSnapshots } from '../types'; -import { addSuffixToFilePath } from '../util'; +import { addSuffixToFilePath, serializeError } from '../util'; import BlinkDiff from '../third_party/blink-diff'; import PNGImage from '../third_party/png-js'; import { TestInfoImpl } from '../testInfo'; @@ -129,8 +129,8 @@ export function compare( return { pass: true, message }; } if (updateSnapshots === 'missing') { - testInfo._appendErrorMessage(message); - return { pass: true, message }; + testInfo._failWithError(serializeError(new Error(message)), false /* isHardError */); + return { pass: true }; } return { pass: false, message }; } diff --git a/packages/playwright-test/src/reporters/base.ts b/packages/playwright-test/src/reporters/base.ts index 4371c5ca1485e..a779bb2dd4e80 100644 --- a/packages/playwright-test/src/reporters/base.ts +++ b/packages/playwright-test/src/reporters/base.ts @@ -33,11 +33,6 @@ type Annotation = { location?: Location; }; -type FailureDetails = { - tokens: string[]; - location?: Location; -}; - type ErrorDetails = { message: string; location?: Location; @@ -99,7 +94,7 @@ export class BaseReporter implements Reporter { } onError(error: TestError) { - console.log(formatError(this.config, error, colors.enabled).message); + console.log('\n' + formatError(this.config, error, colors.enabled).message); } async onEnd(result: FullResult) { @@ -232,14 +227,16 @@ export function formatFailure(config: FullConfig, test: TestCase, options: {inde lines.push(colors.red(header)); for (const result of test.results) { const resultLines: string[] = []; - const { tokens: resultTokens, location } = formatResultFailure(config, test, result, ' ', colors.enabled); - if (!resultTokens.length) + const errors = formatResultFailure(config, test, result, ' ', colors.enabled); + if (!errors.length) continue; + const retryLines = []; if (result.retry) { - resultLines.push(''); - resultLines.push(colors.gray(pad(` Retry #${result.retry}`, '-'))); + retryLines.push(''); + retryLines.push(colors.gray(pad(` Retry #${result.retry}`, '-'))); } - resultLines.push(...resultTokens); + resultLines.push(...retryLines); + resultLines.push(...errors.map(error => '\n' + error.message)); if (includeAttachments) { for (let i = 0; i < result.attachments.length; ++i) { const attachment = result.attachments[i]; @@ -277,11 +274,13 @@ export function formatFailure(config: FullConfig, test: TestCase, options: {inde resultLines.push(''); resultLines.push(colors.gray(pad('--- Test output', '-')) + '\n\n' + outputText + '\n' + pad('', '-')); } - annotations.push({ - location, - title, - message: [header, ...resultLines].join('\n'), - }); + for (const error of errors) { + annotations.push({ + location: error.location, + title, + message: [header, ...retryLines, error.message].join('\n'), + }); + } lines.push(...resultLines); } lines.push(''); @@ -291,25 +290,27 @@ export function formatFailure(config: FullConfig, test: TestCase, options: {inde }; } -export function formatResultFailure(config: FullConfig, test: TestCase, result: TestResult, initialIndent: string, highlightCode: boolean): FailureDetails { - const resultTokens: string[] = []; +export function formatResultFailure(config: FullConfig, test: TestCase, result: TestResult, initialIndent: string, highlightCode: boolean): ErrorDetails[] { + const errorDetails: ErrorDetails[] = []; + if (result.status === 'timedOut') { - resultTokens.push(''); - resultTokens.push(indent(colors.red(`Timeout of ${test.timeout}ms exceeded.`), initialIndent)); - } - if (result.status === 'passed' && test.expectedStatus === 'failed') { - resultTokens.push(''); - resultTokens.push(indent(colors.red(`Expected to fail, but passed.`), initialIndent)); + errorDetails.push({ + message: indent(colors.red(`Timeout of ${test.timeout}ms exceeded.`), initialIndent), + }); + } else if (result.status === 'passed' && test.expectedStatus === 'failed') { + errorDetails.push({ + message: indent(colors.red(`Expected to fail, but passed.`), initialIndent), + }); } - let error: ErrorDetails | undefined = undefined; - if (result.error !== undefined) { - error = formatError(config, result.error, highlightCode, test.location.file); - resultTokens.push(indent(error.message, initialIndent)); + + for (const error of result.errors) { + const formattedError = formatError(config, error, highlightCode, test.location.file); + errorDetails.push({ + message: indent(formattedError.message, initialIndent), + location: formattedError.location, + }); } - return { - tokens: resultTokens, - location: error?.location, - }; + return errorDetails; } function relativeFilePath(config: FullConfig, file: string): string { @@ -341,7 +342,7 @@ function formatTestHeader(config: FullConfig, test: TestCase, indent: string, in export function formatError(config: FullConfig, error: TestError, highlightCode: boolean, file?: string): ErrorDetails { const stack = error.stack; - const tokens = ['']; + const tokens = []; let location: Location | undefined; if (stack) { const parsed = prepareErrorStack(stack, file); diff --git a/packages/playwright-test/src/reporters/html.ts b/packages/playwright-test/src/reporters/html.ts index 29b656a47a4bf..009e85f96a118 100644 --- a/packages/playwright-test/src/reporters/html.ts +++ b/packages/playwright-test/src/reporters/html.ts @@ -93,7 +93,7 @@ export type TestResult = { startTime: string; duration: number; steps: TestStep[]; - error?: string; + errors: string[]; attachments: TestAttachment[]; status: 'passed' | 'failed' | 'timedOut' | 'skipped'; }; @@ -393,7 +393,7 @@ class HtmlBuilder { startTime: result.startTime, retry: result.retry, steps: result.steps.map(s => this._createTestStep(s)), - error: result.error, + errors: result.errors, status: result.status, attachments: result.attachments.map(a => { if (a.name === 'trace') diff --git a/packages/playwright-test/src/reporters/raw.ts b/packages/playwright-test/src/reporters/raw.ts index dad07522c3444..9cb155c12d911 100644 --- a/packages/playwright-test/src/reporters/raw.ts +++ b/packages/playwright-test/src/reporters/raw.ts @@ -83,7 +83,7 @@ export type JsonTestResult = { startTime: string; duration: number; status: TestStatus; - error?: JsonError; + errors: JsonError[]; attachments: JsonAttachment[]; steps: JsonTestStep[]; }; @@ -224,7 +224,7 @@ class RawReporter { startTime: result.startTime.toISOString(), duration: result.duration, status: result.status, - error: formatResultFailure(this.config, test, result, '', true).tokens.join('').trim(), + errors: formatResultFailure(this.config, test, result, '', true).map(error => error.message), attachments: this._createAttachments(result), steps: dedupeSteps(result.steps.map(step => this._serializeStep(test, step))) }; diff --git a/packages/playwright-test/src/test.ts b/packages/playwright-test/src/test.ts index 0ba40a7a2f5ac..121b1d6f7b5b1 100644 --- a/packages/playwright-test/src/test.ts +++ b/packages/playwright-test/src/test.ts @@ -191,7 +191,8 @@ export class TestCase extends Base implements reporterTypes.TestCase { stderr: [], attachments: [], status: 'skipped', - steps: [] + steps: [], + errors: [], }; this.results.push(result); return result; diff --git a/packages/playwright-test/src/testInfo.ts b/packages/playwright-test/src/testInfo.ts index ba647139a1d4b..7913a66b8eecd 100644 --- a/packages/playwright-test/src/testInfo.ts +++ b/packages/playwright-test/src/testInfo.ts @@ -34,6 +34,7 @@ export class TestInfoImpl implements TestInfo { readonly _timeoutRunner: TimeoutRunner; readonly _startTime: number; readonly _startWallTime: number; + private _hasHardError: boolean = false; // ------------ TestInfo fields ------------ readonly repeatEachIndex: number; @@ -59,7 +60,20 @@ export class TestInfoImpl implements TestInfo { snapshotSuffix: string = ''; readonly outputDir: string; readonly snapshotDir: string; - error: TestError | undefined = undefined; + errors: TestError[] = []; + + get error(): TestError | undefined { + return this.errors.length > 0 ? this.errors[0] : undefined; + } + + set error(e: TestError | undefined) { + if (e === undefined) + throw new Error('Cannot assign testInfo.error undefined value!'); + if (!this.errors.length) + this.errors.push(e); + else + this.errors[0] = e; + } constructor( loader: Loader, @@ -168,7 +182,7 @@ export class TestInfoImpl implements TestInfo { this.status = 'skipped'; } else { const serialized = serializeError(error); - this._failWithError(serialized); + this._failWithError(serialized, true /* isHardError */); return serialized; } } @@ -178,25 +192,18 @@ export class TestInfoImpl implements TestInfo { return this._addStepImpl(data); } - _failWithError(error: TestError) { - // Do not overwrite any previous error and error status. + _failWithError(error: TestError, isHardError: boolean) { + // Do not overwrite any previous hard errors. // Some (but not all) scenarios include: // - expect() that fails after uncaught exception. // - fail after the timeout, e.g. due to fixture teardown. + if (isHardError && this._hasHardError) + return; + if (isHardError) + this._hasHardError = true; if (this.status === 'passed') this.status = 'failed'; - if (this.error === undefined) - this.error = error; - } - - _appendErrorMessage(message: string) { - // Do not overwrite any previous error status. - if (this.status === 'passed') - this.status = 'failed'; - if (this.error === undefined) - this.error = { value: 'Error: ' + message }; - else if (this.error.value) - this.error.value += '\nError: ' + message; + this.errors.push(error); } // ------------ TestInfo methods ------------ diff --git a/packages/playwright-test/src/util.ts b/packages/playwright-test/src/util.ts index 29e5556e455a5..59ca3e03f0e1b 100644 --- a/packages/playwright-test/src/util.ts +++ b/packages/playwright-test/src/util.ts @@ -24,6 +24,7 @@ import { calculateSha1, isRegExp } from 'playwright-core/lib/utils/utils'; import { isInternalFileName } from 'playwright-core/lib/utils/stackTrace'; const PLAYWRIGHT_CORE_PATH = path.dirname(require.resolve('playwright-core')); +const EXPECT_PATH = path.dirname(require.resolve('expect')); const PLAYWRIGHT_TEST_PATH = path.join(__dirname, '..'); function filterStackTrace(e: Error) { @@ -46,7 +47,7 @@ function filterStackTrace(e: Error) { const functionName = callSite.getFunctionName() || undefined; if (!fileName) return true; - return !fileName.startsWith(PLAYWRIGHT_TEST_PATH) && !fileName.startsWith(PLAYWRIGHT_CORE_PATH) && !isInternalFileName(fileName, functionName); + return !fileName.startsWith(PLAYWRIGHT_TEST_PATH) && !fileName.startsWith(PLAYWRIGHT_CORE_PATH) && !fileName.startsWith(EXPECT_PATH) && !isInternalFileName(fileName, functionName); })); }; // eslint-disable-next-line @@ -202,9 +203,7 @@ export function getContainedPath(parentPath: string, subPath: string = ''): stri export const debugTest = debug('pw:test'); -export function prependToTestError(testError: TestError | undefined, message: string | undefined, location?: Location) { - if (!message) - return testError; +export function prependToTestError(testError: TestError | undefined, message: string, location?: Location): TestError { if (!testError) { if (!location) return { value: message }; diff --git a/packages/playwright-test/src/workerRunner.ts b/packages/playwright-test/src/workerRunner.ts index 9f46d915a5fbf..52420c9f97c9e 100644 --- a/packages/playwright-test/src/workerRunner.ts +++ b/packages/playwright-test/src/workerRunner.ts @@ -95,7 +95,7 @@ export class WorkerRunner extends EventEmitter { // and continuing to run tests in the same worker is problematic. Therefore, // we turn this into a fatal error and restart the worker anyway. if (this._currentTest && this._currentTest._test._type === 'test' && this._currentTest.expectedStatus !== 'failed') { - this._currentTest._failWithError(serializeError(error)); + this._currentTest._failWithError(serializeError(error), true /* isHardError */); } else { // No current test - fatal error. if (!this._fatalError) @@ -395,7 +395,7 @@ function buildTestEndPayload(testInfo: TestInfoImpl): TestEndPayload { testId: testInfo._test._id, duration: testInfo.duration, status: testInfo.status!, - error: testInfo.error, + errors: testInfo.errors, expectedStatus: testInfo.expectedStatus, annotations: testInfo.annotations, timeout: testInfo.timeout, diff --git a/packages/playwright-test/types/test.d.ts b/packages/playwright-test/types/test.d.ts index 9c3f948e6d62e..9919ad175e2bd 100644 --- a/packages/playwright-test/types/test.d.ts +++ b/packages/playwright-test/types/test.d.ts @@ -1492,9 +1492,14 @@ export interface TestInfo { */ status?: TestStatus; /** - * An error thrown during test execution, if any. + * First error thrown during test execution, if any. This is equal to the first element in + * [testInfo.errors](https://playwright.dev/docs/api/class-testinfo#test-info-errors). */ error?: TestError; + /** + * Errors thrown during test execution, if any. + */ + errors: TestError[]; /** * Output written to `process.stdout` or `console.log` during the test execution. */ diff --git a/packages/playwright-test/types/testExpect.d.ts b/packages/playwright-test/types/testExpect.d.ts index 76b0417b9fd9e..1a80948ff1ba1 100644 --- a/packages/playwright-test/types/testExpect.d.ts +++ b/packages/playwright-test/types/testExpect.d.ts @@ -29,6 +29,7 @@ type MakeMatchers = PlaywrightTest.Matchers & export declare type Expect = { (actual: T, message?: string): MakeMatchers; + soft: (actual: T, message?: string) => MakeMatchers; // Sourced from node_modules/expect/build/types.d.ts assertions(arg0: number): void; diff --git a/packages/playwright-test/types/testReporter.d.ts b/packages/playwright-test/types/testReporter.d.ts index 18f92b26fcce8..1916f4b4e3391 100644 --- a/packages/playwright-test/types/testReporter.d.ts +++ b/packages/playwright-test/types/testReporter.d.ts @@ -213,9 +213,14 @@ export interface TestResult { */ status: TestStatus; /** - * An error thrown during the test execution, if any. + * First error thrown during test execution, if any. This is equal to the first element in + * [testResult.errors](https://playwright.dev/docs/api/class-testresult#test-result-errors). */ error?: TestError; + /** + * Errors thrown during the test execution. + */ + errors: TestError[]; /** * The list of files or buffers attached during the test execution through * [testInfo.attachments](https://playwright.dev/docs/api/class-testinfo#test-info-attachments). diff --git a/tests/playwright-test/expect-soft.spec.ts b/tests/playwright-test/expect-soft.spec.ts new file mode 100644 index 0000000000000..29af49f18a1b4 --- /dev/null +++ b/tests/playwright-test/expect-soft.spec.ts @@ -0,0 +1,80 @@ +/** + * Copyright Microsoft Corporation. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { test, expect, stripAnsi } from './playwright-test-fixtures'; + +test('soft expects should compile', async ({ runTSC }) => { + const result = await runTSC({ + 'a.spec.ts': ` + const { test } = pwt; + test('should work', () => { + test.expect.soft(1+1).toBe(3); + test.expect.soft(1+1, 'custom error message').toBe(3); + }); + ` + }); + expect(result.exitCode).toBe(0); +}); + +test('soft expects should work', async ({ runInlineTest }) => { + const result = await runInlineTest({ + 'a.spec.ts': ` + const { test } = pwt; + test('should work', () => { + test.expect.soft(1+1).toBe(3); + console.log('woof-woof'); + }); + ` + }); + expect(result.exitCode).toBe(1); + expect(stripAnsi(result.output)).toContain('woof-woof'); +}); + +test('should report a mixture of soft and non-soft errors', async ({ runInlineTest }) => { + const result = await runInlineTest({ + 'a.spec.ts': ` + const { test } = pwt; + test('should work', ({}) => { + test.expect.soft(1+1, 'one plus one').toBe(3); + test.expect.soft(2*2, 'two times two').toBe(5); + test.expect(3/3, 'three div three').toBe(7); + test.expect.soft(6-4, 'six minus four').toBe(3); + }); + ` + }); + expect(result.exitCode).toBe(1); + expect(stripAnsi(result.output)).toContain('Error: one plus one'); + expect(stripAnsi(result.output)).toContain('Error: two times two'); + expect(stripAnsi(result.output)).toContain('Error: three div three'); + expect(stripAnsi(result.output)).not.toContain('Error: six minus four'); +}); + +test('testInfo should contain all soft expect errors', async ({ runInlineTest }) => { + const result = await runInlineTest({ + 'a.spec.ts': ` + const { test } = pwt; + test('should work', ({}, testInfo) => { + test.expect.soft(1+1, 'one plus one').toBe(3); + test.expect.soft(2*2, 'two times two').toBe(5); + test.expect(testInfo.errors.length, 'must be exactly two errors').toBe(2); + }); + ` + }); + expect(result.exitCode).toBe(1); + expect(stripAnsi(result.output)).toContain('Error: one plus one'); + expect(stripAnsi(result.output)).toContain('Error: two times two'); + expect(stripAnsi(result.output)).not.toContain('Error: must be exactly two errors'); +}); diff --git a/tests/playwright-test/golden.spec.ts b/tests/playwright-test/golden.spec.ts index e1dfba4920663..11fc014b2d1d1 100644 --- a/tests/playwright-test/golden.spec.ts +++ b/tests/playwright-test/golden.spec.ts @@ -172,14 +172,18 @@ test('should write missing expectations locally twice and continue', async ({ ru expect(result.failed).toBe(1); const snapshot1OutputPath = testInfo.outputPath('a.spec.js-snapshots/snapshot.txt'); - expect(result.output).toContain(`${snapshot1OutputPath} is missing in snapshots, writing actual`); + expect(result.output).toContain(`Error: ${snapshot1OutputPath} is missing in snapshots, writing actual`); expect(fs.readFileSync(snapshot1OutputPath, 'utf-8')).toBe('Hello world'); const snapshot2OutputPath = testInfo.outputPath('a.spec.js-snapshots/snapshot2.txt'); - expect(result.output).toContain(`${snapshot2OutputPath} is missing in snapshots, writing actual`); + expect(result.output).toContain(`Error: ${snapshot2OutputPath} is missing in snapshots, writing actual`); expect(fs.readFileSync(snapshot2OutputPath, 'utf-8')).toBe('Hello world2'); expect(result.output).toContain('Here we are!'); + + const stackLines = stripAnsi(result.output).split('\n').filter(line => line.includes(' at ')).filter(line => !line.includes(testInfo.outputPath())); + expect(result.output).toContain('a.spec.js:8'); + expect(stackLines.length).toBe(0); }); test('shouldn\'t write missing expectations locally for negated matcher', async ({ runInlineTest }, testInfo) => { diff --git a/tests/playwright-test/reporter-github.spec.ts b/tests/playwright-test/reporter-github.spec.ts index 44a2ef3e7ea20..d4c554893a2b0 100644 --- a/tests/playwright-test/reporter-github.spec.ts +++ b/tests/playwright-test/reporter-github.spec.ts @@ -89,6 +89,6 @@ test('print GitHub annotations for global error', async ({ runInlineTest }) => { `, }, { reporter: 'github' }); const text = stripAnsi(result.output); - expect(text).toContain('::error ::%0AError: Oh my!%0A%0A'); + expect(text).toContain('::error ::Error: Oh my!%0A%0A'); expect(result.exitCode).toBe(1); }); diff --git a/utils/generate_types/overrides-test.d.ts b/utils/generate_types/overrides-test.d.ts index 6eb666ea266fb..8707f0fd831ec 100644 --- a/utils/generate_types/overrides-test.d.ts +++ b/utils/generate_types/overrides-test.d.ts @@ -216,6 +216,7 @@ export interface TestInfo { duration: number; status?: TestStatus; error?: TestError; + errors: TestError[]; stdout: (string | Buffer)[]; stderr: (string | Buffer)[]; snapshotSuffix: string; diff --git a/utils/generate_types/overrides-testReporter.d.ts b/utils/generate_types/overrides-testReporter.d.ts index af511e8ab1c0c..592eb6e421f95 100644 --- a/utils/generate_types/overrides-testReporter.d.ts +++ b/utils/generate_types/overrides-testReporter.d.ts @@ -56,6 +56,7 @@ export interface TestResult { duration: number; status: TestStatus; error?: TestError; + errors: TestError[]; attachments: { name: string, path?: string, body?: Buffer, contentType: string }[]; stdout: (string | Buffer)[]; stderr: (string | Buffer)[]; From fdda759a9d13f70740901050d4feaa178ec46c93 Mon Sep 17 00:00:00 2001 From: Pavel Feldman Date: Wed, 2 Feb 2022 20:44:11 -0800 Subject: [PATCH 192/233] feat(parallel): allow setting enclosing scope parallel mode (#11822) --- docs/src/test-api/class-test.md | 68 +++++++++++++---- docs/src/test-auth-js.md | 80 ++++++++++---------- docs/src/test-parallel-js.md | 77 +++++++++++++++++-- docs/src/test-retries-js.md | 82 ++++++++++----------- packages/playwright-test/src/testType.ts | 21 ++++++ packages/playwright-test/types/test.d.ts | 41 +++++++++-- tests/playwright-test/test-parallel.spec.ts | 58 +++++++++++++++ tests/playwright-test/test-serial.spec.ts | 40 ++++++++++ utils/generate_types/overrides-test.d.ts | 1 + utils/generate_types/parseOverrides.js | 10 ++- 10 files changed, 364 insertions(+), 114 deletions(-) diff --git a/docs/src/test-api/class-test.md b/docs/src/test-api/class-test.md index 2736d5d47d97e..617437e8107df 100644 --- a/docs/src/test-api/class-test.md +++ b/docs/src/test-api/class-test.md @@ -248,6 +248,46 @@ Group title. A callback that is run immediately when calling [`method: Test.describe`]. Any tests added in this callback will belong to the group. +## method: Test.describe.configure + +Set execution mode of execution for the enclosing scope. Can be executed either on the top level or inside a describe. Configuration applies to the entire scope, regardless of whether it run before or after the test +declaration. + +Learn more about the execution modes [here](./test-parallel-js.md). + +```js js-flavor=js +// Run all the tests in the file concurrently using parallel workers. +test.describe.configure({ mode: 'parallel' }); +test('runs in parallel 1', async ({ page }) => {}); +test('runs in parallel 2', async ({ page }) => {}); +``` + +```js js-flavor=ts +// Run all the tests in the file concurrently using parallel workers. +test.describe.configure({ mode: 'parallel' }); +test('runs in parallel 1', async ({ page }) => {}); +test('runs in parallel 2', async ({ page }) => {}); +``` + +```js js-flavor=js +// Annotate tests as inter-dependent. +test.describe.configure({ mode: 'serial' }); +test('runs first', async ({ page }) => {}); +test('runs second', async ({ page }) => {}); +``` + +```js js-flavor=ts +// Annotate tests as inter-dependent. +test.describe.configure({ mode: 'serial' }); +test('runs first', async ({ page }) => {}); +test('runs second', async ({ page }) => {}); +``` + +### option: Test.describe.configure.mode +- `mode` <"parallel"|"serial"> + + + ## method: Test.describe.only Declares a focused group of tests. If there are some focused tests or suites, all of them will be run but nothing else. @@ -290,21 +330,19 @@ A callback that is run immediately when calling [`method: Test.describe.only`]. Declares a group of tests that could be run in parallel. By default, tests in a single test file run one after another, but using [`method: Test.describe.parallel`] allows them to run in parallel. +See [`method: Test.describe.configure`] for the preferred way of configuring the execution mode. + ```js js-flavor=js test.describe.parallel('group', () => { - test('runs in parallel 1', async ({ page }) => { - }); - test('runs in parallel 2', async ({ page }) => { - }); + test('runs in parallel 1', async ({ page }) => {}); + test('runs in parallel 2', async ({ page }) => {}); }); ``` ```js js-flavor=ts test.describe.parallel('group', () => { - test('runs in parallel 1', async ({ page }) => { - }); - test('runs in parallel 2', async ({ page }) => { - }); + test('runs in parallel 1', async ({ page }) => {}); + test('runs in parallel 2', async ({ page }) => {}); }); ``` @@ -342,25 +380,23 @@ A callback that is run immediately when calling [`method: Test.describe.parallel Declares a group of tests that should always be run serially. If one of the tests fails, all subsequent tests are skipped. All tests in a group are retried together. +See [`method: Test.describe.configure`] for the preferred way of configuring the execution mode. + :::note Using serial is not recommended. It is usually better to make your tests isolated, so they can be run independently. ::: ```js js-flavor=js test.describe.serial('group', () => { - test('runs first', async ({ page }) => { - }); - test('runs second', async ({ page }) => { - }); + test('runs first', async ({ page }) => {}); + test('runs second', async ({ page }) => {}); }); ``` ```js js-flavor=ts test.describe.serial('group', () => { - test('runs first', async ({ page }) => { - }); - test('runs second', async ({ page }) => { - }); + test('runs first', async ({ page }) => {}); + test('runs second', async ({ page }) => {}); }); ``` diff --git a/docs/src/test-auth-js.md b/docs/src/test-auth-js.md index ccd2965dd181c..f2a4c80da643a 100644 --- a/docs/src/test-auth-js.md +++ b/docs/src/test-auth-js.md @@ -293,30 +293,30 @@ order to achieve that: const { test } = require('@playwright/test'); -test.describe.serial('use the same page', () => { - /** @type {import('@playwright/test').Page} */ - let page; - - test.beforeAll(async ({ browser }) => { - // Create page yourself and sign in. - page = await browser.newPage(); - await page.goto('https://github.com/login'); - await page.fill('input[name="user"]', 'user'); - await page.fill('input[name="password"]', 'password'); - await page.click('text=Sign in'); - }); +test.describe.configure({ mode: 'serial' }); - test.afterAll(async () => { - await page.close(); - }); +/** @type {import('@playwright/test').Page} */ +let page; - test('first test', async () => { - // page is signed in. - }); +test.beforeAll(async ({ browser }) => { + // Create page yourself and sign in. + page = await browser.newPage(); + await page.goto('https://github.com/login'); + await page.fill('input[name="user"]', 'user'); + await page.fill('input[name="password"]', 'password'); + await page.click('text=Sign in'); +}); - test('second test', async () => { - // page is signed in. - }); +test.afterAll(async () => { + await page.close(); +}); + +test('first test', async () => { + // page is signed in. +}); + +test('second test', async () => { + // page is signed in. }); ``` @@ -325,29 +325,29 @@ test.describe.serial('use the same page', () => { import { test, Page } from '@playwright/test'; -test.describe.serial('use the same page', () => { - let page: Page; +test.describe.configure({ mode: 'serial' }); - test.beforeAll(async ({ browser }) => { - // Create page once and sign in. - page = await browser.newPage(); - await page.goto('https://github.com/login'); - await page.fill('input[name="user"]', 'user'); - await page.fill('input[name="password"]', 'password'); - await page.click('text=Sign in'); - }); +let page: Page; - test.afterAll(async () => { - await page.close(); - }); +test.beforeAll(async ({ browser }) => { + // Create page once and sign in. + page = await browser.newPage(); + await page.goto('https://github.com/login'); + await page.fill('input[name="user"]', 'user'); + await page.fill('input[name="password"]', 'password'); + await page.click('text=Sign in'); +}); - test('first test', async () => { - // page is signed in. - }); +test.afterAll(async () => { + await page.close(); +}); - test('second test', async () => { - // page is signed in. - }); +test('first test', async () => { + // page is signed in. +}); + +test('second test', async () => { + // page is signed in. }); ``` diff --git a/docs/src/test-parallel-js.md b/docs/src/test-parallel-js.md index ee435429805e3..74a9e4d8670ac 100644 --- a/docs/src/test-parallel-js.md +++ b/docs/src/test-parallel-js.md @@ -72,18 +72,81 @@ Note that parallel tests are executed in separate worker processes and cannot sh ```js js-flavor=js const { test } = require('@playwright/test'); -test.describe.parallel('suite', () => { - test('runs in parallel 1', async ({ page }) => { /* ... */ }); - test('runs in parallel 2', async ({ page }) => { /* ... */ }); -}); +test.describe.configure({ mode: 'parallel' }); + +test('runs in parallel 1', async ({ page }) => { /* ... */ }); +test('runs in parallel 2', async ({ page }) => { /* ... */ }); ``` ```js js-flavor=ts import { test } from '@playwright/test'; -test.describe.parallel('suite', () => { - test('runs in parallel 1', async ({ page }) => { /* ... */ }); - test('runs in parallel 2', async ({ page }) => { /* ... */ }); +test.describe.configure({ mode: 'parallel' }); + +test('runs in parallel 1', async ({ page }) => { /* ... */ }); +test('runs in parallel 2', async ({ page }) => { /* ... */ }); +``` + +## Serial mode + +You can annotate inter-dependent tests as serial. If one of the serial tests +fails, all subsequent tests are skipped. All tests in a group are retried together. + +:::note +Using serial is not recommended. It is usually better to make your tests isolated, so they can be run independently. +::: + +```js js-flavor=js +// @ts-check + +const { test } = require('@playwright/test'); + +test.describe.configure({ mode: 'serial' }); + +/** @type {import('@playwright/test').Page} */ +let page; + +test.beforeAll(async ({ browser }) => { + page = await browser.newPage(); +}); + +test.afterAll(async () => { + await page.close(); +}); + +test('runs first', async () => { + await page.goto('https://playwright.dev/'); +}); + +test('runs second', async () => { + await page.click('text=Get Started'); +}); +``` + +```js js-flavor=ts +// example.spec.ts + +import { test, Page } from '@playwright/test'; + +// Annotate entire file as serial. +test.describe.configure({ mode: 'serial' }); + +let page: Page; + +test.beforeAll(async ({ browser }) => { + page = await browser.newPage(); +}); + +test.afterAll(async () => { + await page.close(); +}); + +test('runs first', async () => { + await page.goto('https://playwright.dev/'); +}); + +test('runs second', async () => { + await page.click('text=Get Started'); }); ``` diff --git a/docs/src/test-retries-js.md b/docs/src/test-retries-js.md index 7c150306e56d4..204caabf7c4a0 100644 --- a/docs/src/test-retries-js.md +++ b/docs/src/test-retries-js.md @@ -143,23 +143,23 @@ Consider the following snippet that uses `test.describe.serial`: ```js js-flavor=js const { test } = require('@playwright/test'); -test.describe.serial('suite', () => { - test.beforeAll(async () => { /* ... */ }); - test('first good', async ({ page }) => { /* ... */ }); - test('second flaky', async ({ page }) => { /* ... */ }); - test('third good', async ({ page }) => { /* ... */ }); -}); +test.describe.configure({ mode: 'serial' }); + +test.beforeAll(async () => { /* ... */ }); +test('first good', async ({ page }) => { /* ... */ }); +test('second flaky', async ({ page }) => { /* ... */ }); +test('third good', async ({ page }) => { /* ... */ }); ``` ```js js-flavor=ts import { test } from '@playwright/test'; -test.describe.serial('suite', () => { - test.beforeAll(async () => { /* ... */ }); - test('first good', async ({ page }) => { /* ... */ }); - test('second flaky', async ({ page }) => { /* ... */ }); - test('third good', async ({ page }) => { /* ... */ }); -}); +test.describe.configure({ mode: 'serial' }); + +test.beforeAll(async () => { /* ... */ }); +test('first good', async ({ page }) => { /* ... */ }); +test('second flaky', async ({ page }) => { /* ... */ }); +test('third good', async ({ page }) => { /* ... */ }); ``` When running without [retries](#retries), all tests after the failure are skipped: @@ -195,25 +195,25 @@ Playwright Test creates an isolated [Page] object for each test. However, if you const { test } = require('@playwright/test'); -test.describe.serial('use the same page', () => { - /** @type {import('@playwright/test').Page} */ - let page; +test.describe.configure({ mode: 'serial' }); - test.beforeAll(async ({ browser }) => { - page = await browser.newPage(); - }); +/** @type {import('@playwright/test').Page} */ +let page; - test.afterAll(async () => { - await page.close(); - }); +test.beforeAll(async ({ browser }) => { + page = await browser.newPage(); +}); + +test.afterAll(async () => { + await page.close(); +}); - test('runs first', async () => { - await page.goto('https://playwright.dev/'); - }); +test('runs first', async () => { + await page.goto('https://playwright.dev/'); +}); - test('runs second', async () => { - await page.click('text=Get Started'); - }); +test('runs second', async () => { + await page.click('text=Get Started'); }); ``` @@ -222,23 +222,23 @@ test.describe.serial('use the same page', () => { import { test, Page } from '@playwright/test'; -test.describe.serial('use the same page', () => { - let page: Page; +test.describe.configure({ mode: 'serial' }); - test.beforeAll(async ({ browser }) => { - page = await browser.newPage(); - }); +let page: Page; - test.afterAll(async () => { - await page.close(); - }); +test.beforeAll(async ({ browser }) => { + page = await browser.newPage(); +}); - test('runs first', async () => { - await page.goto('https://playwright.dev/'); - }); +test.afterAll(async () => { + await page.close(); +}); + +test('runs first', async () => { + await page.goto('https://playwright.dev/'); +}); - test('runs second', async () => { - await page.click('text=Get Started'); - }); +test('runs second', async () => { + await page.click('text=Get Started'); }); ``` diff --git a/packages/playwright-test/src/testType.ts b/packages/playwright-test/src/testType.ts index b0af49a36ca8c..3b3f795815722 100644 --- a/packages/playwright-test/src/testType.ts +++ b/packages/playwright-test/src/testType.ts @@ -36,6 +36,7 @@ export class TestTypeImpl { test.only = wrapFunctionWithLocation(this._createTest.bind(this, 'only')); test.describe = wrapFunctionWithLocation(this._describe.bind(this, 'default')); test.describe.only = wrapFunctionWithLocation(this._describe.bind(this, 'only')); + test.describe.configure = wrapFunctionWithLocation(this._configure.bind(this)); test.describe.parallel = wrapFunctionWithLocation(this._describe.bind(this, 'parallel')); test.describe.parallel.only = wrapFunctionWithLocation(this._describe.bind(this, 'parallel.only')); test.describe.serial = wrapFunctionWithLocation(this._describe.bind(this, 'serial')); @@ -133,6 +134,26 @@ export class TestTypeImpl { } } + private _configure(location: Location, options: { mode?: 'parallel' | 'serial' }) { + throwIfRunningInsideJest(); + const suite = currentlyLoadingFileSuite(); + if (!suite) + throw errorWithLocation(location, `describe.configure() can only be called in a test file`); + + if (!options.mode) + return; + if (suite._parallelMode !== 'default') + throw errorWithLocation(location, 'Parallel mode is already assigned for the enclosing scope.'); + suite._parallelMode = options.mode; + + for (let parent: Suite | undefined = suite.parent; parent; parent = parent.parent) { + if (parent._parallelMode === 'serial' && suite._parallelMode === 'parallel') + throw errorWithLocation(location, 'describe.parallel cannot be nested inside describe.serial'); + if (parent._parallelMode === 'parallel' && suite._parallelMode === 'serial') + throw errorWithLocation(location, 'describe.serial cannot be nested inside describe.parallel'); + } + } + private _modifier(type: 'skip' | 'fail' | 'fixme' | 'slow', location: Location, ...modifierArgs: [arg?: any | Function, description?: string]) { const suite = currentlyLoadingFileSuite(); if (suite) { diff --git a/packages/playwright-test/types/test.d.ts b/packages/playwright-test/types/test.d.ts index 9919ad175e2bd..5160660224d6d 100644 --- a/packages/playwright-test/types/test.d.ts +++ b/packages/playwright-test/types/test.d.ts @@ -1640,15 +1640,16 @@ export interface TestType NOTE: Using serial is not recommended. It is usually better to make your tests isolated, so they can be run * independently. * * ```ts * test.describe.serial('group', () => { - * test('runs first', async ({ page }) => { - * }); - * test('runs second', async ({ page }) => { - * }); + * test('runs first', async ({ page }) => {}); + * test('runs second', async ({ page }) => {}); * }); * ``` * @@ -1685,12 +1686,13 @@ export interface TestType { - * test('runs in parallel 1', async ({ page }) => { - * }); - * test('runs in parallel 2', async ({ page }) => { - * }); + * test('runs in parallel 1', async ({ page }) => {}); + * test('runs in parallel 2', async ({ page }) => {}); * }); * ``` * @@ -1711,6 +1713,29 @@ export interface TestType {}); + * test('runs in parallel 2', async ({ page }) => {}); + * ``` + * + * ```ts + * // Annotate tests as inter-dependent. + * test.describe.configure({ mode: 'serial' }); + * test('runs first', async ({ page }) => {}); + * test('runs second', async ({ page }) => {}); + * ``` + * + * @param options + */ + configure: (options: { mode?: 'parallel' | 'serial' }) => void; }; /** * Declares a skipped test, similarly to diff --git a/tests/playwright-test/test-parallel.spec.ts b/tests/playwright-test/test-parallel.spec.ts index 2c408443a5789..9f53e3dbafb6d 100644 --- a/tests/playwright-test/test-parallel.spec.ts +++ b/tests/playwright-test/test-parallel.spec.ts @@ -58,3 +58,61 @@ test('test.describe.parallel should work', async ({ runInlineTest }) => { expect(result.output).toContain('%% worker=1'); expect(result.output).toContain('%% worker=2'); }); + +test('test.describe.parallel should work in file', async ({ runInlineTest }) => { + const result = await runInlineTest({ + 'a.test.ts': ` + const { test } = pwt; + test.describe.configure({ mode: 'parallel' }); + test('test1', async ({}, testInfo) => { + console.log('\\n%% worker=' + testInfo.workerIndex); + await new Promise(f => setTimeout(f, 1000)); + }); + test('test2', async ({}, testInfo) => { + console.log('\\n%% worker=' + testInfo.workerIndex); + await new Promise(f => setTimeout(f, 1000)); + }); + test.describe('inner suite', () => { + test('test3', async ({}, testInfo) => { + console.log('\\n%% worker=' + testInfo.workerIndex); + await new Promise(f => setTimeout(f, 1000)); + }); + }); + `, + }, { workers: 3 }); + expect(result.exitCode).toBe(0); + expect(result.passed).toBe(3); + expect(result.output).toContain('%% worker=0'); + expect(result.output).toContain('%% worker=1'); + expect(result.output).toContain('%% worker=2'); +}); + +test('test.describe.parallel should work in describe', async ({ runInlineTest }) => { + const result = await runInlineTest({ + 'a.test.ts': ` + const { test } = pwt; + test.describe('parallel suite', () => { + test.describe.configure({ mode: 'parallel' }); + test('test1', async ({}, testInfo) => { + console.log('\\n%% worker=' + testInfo.workerIndex); + await new Promise(f => setTimeout(f, 1000)); + }); + test('test2', async ({}, testInfo) => { + console.log('\\n%% worker=' + testInfo.workerIndex); + await new Promise(f => setTimeout(f, 1000)); + }); + test.describe('inner suite', () => { + test('test3', async ({}, testInfo) => { + console.log('\\n%% worker=' + testInfo.workerIndex); + await new Promise(f => setTimeout(f, 1000)); + }); + }); + }); + `, + }, { workers: 3 }); + expect(result.exitCode).toBe(0); + expect(result.passed).toBe(3); + expect(result.output).toContain('%% worker=0'); + expect(result.output).toContain('%% worker=1'); + expect(result.output).toContain('%% worker=2'); +}); diff --git a/tests/playwright-test/test-serial.spec.ts b/tests/playwright-test/test-serial.spec.ts index 40e8761b1e380..2ab6402e7d5a1 100644 --- a/tests/playwright-test/test-serial.spec.ts +++ b/tests/playwright-test/test-serial.spec.ts @@ -55,6 +55,46 @@ test('test.describe.serial should work', async ({ runInlineTest }) => { ]); }); +test('test.describe.serial should work in describe', async ({ runInlineTest }) => { + const result = await runInlineTest({ + 'a.test.ts': ` + const { test } = pwt; + test.describe('serial suite', () => { + test.describe.configure({ mode: 'serial' }); + test('test1', async ({}) => { + console.log('\\n%%test1'); + }); + test('test2', async ({}) => { + console.log('\\n%%test2'); + }); + + test.describe('inner suite', () => { + test('test3', async ({}) => { + console.log('\\n%%test3'); + expect(1).toBe(2); + }); + test('test4', async ({}) => { + console.log('\\n%%test4'); + }); + }); + + test('test5', async ({}) => { + console.log('\\n%%test5'); + }); + }); + `, + }); + expect(result.exitCode).toBe(1); + expect(result.passed).toBe(2); + expect(result.failed).toBe(1); + expect(result.skipped).toBe(2); + expect(result.output.split('\n').filter(line => line.startsWith('%%'))).toEqual([ + '%%test1', + '%%test2', + '%%test3', + ]); +}); + test('test.describe.serial should work with retry', async ({ runInlineTest }) => { const result = await runInlineTest({ 'a.test.ts': ` diff --git a/utils/generate_types/overrides-test.d.ts b/utils/generate_types/overrides-test.d.ts index 8707f0fd831ec..b553255e2e345 100644 --- a/utils/generate_types/overrides-test.d.ts +++ b/utils/generate_types/overrides-test.d.ts @@ -244,6 +244,7 @@ export interface TestType void; }; skip(title: string, testFunction: (args: TestArgs & WorkerArgs, testInfo: TestInfo) => Promise | void): void; skip(): void; diff --git a/utils/generate_types/parseOverrides.js b/utils/generate_types/parseOverrides.js index 5dc69c15c31b1..765dffefd9ccc 100644 --- a/utils/generate_types/parseOverrides.js +++ b/utils/generate_types/parseOverrides.js @@ -101,8 +101,8 @@ async function parseOverrides(filePath, commentForClass, commentForMethod, extra * @param {ts.Node} node */ function visitProperties(className, prefix, node) { - // This function supports structs like "a: { b: string; c: number }" - // and inserts comments for "a.b" and "a.c" + // This function supports structs like "a: { b: string; c: number, (): void }" + // and inserts comments for "a.b", "a.c", a. if (ts.isPropertySignature(node)) { const name = checker.getSymbolAtLocation(node.name).getName(); const pos = node.getStart(file, false); @@ -111,6 +111,12 @@ async function parseOverrides(filePath, commentForClass, commentForMethod, extra text: commentForMethod(className, `${prefix}.${name}`, 0), }); ts.forEachChild(node, child => visitProperties(className, `${prefix}.${name}`, child)); + } else if (ts.isCallSignatureDeclaration(node)) { + const pos = node.getStart(file, false); + replacers.push({ + pos, + text: commentForMethod(className, `${prefix}`, 0), + }); } else if (!ts.isMethodSignature(node)) { ts.forEachChild(node, child => visitProperties(className, prefix, child)); } From 1215057ca1cf756f35e045a34fd340838bee81d8 Mon Sep 17 00:00:00 2001 From: Pavel Feldman Date: Wed, 2 Feb 2022 21:26:45 -0800 Subject: [PATCH 193/233] chore: use ipc transport for out-of-process driver (#11826) --- packages/playwright-core/src/cli/driver.ts | 4 +- packages/playwright-core/src/outofprocess.ts | 38 ++++++++++--------- .../playwright-core/src/protocol/transport.ts | 27 ++++++++++++- .../src/server/android/android.ts | 10 ++--- utils/check_deps.js | 2 +- 5 files changed, 55 insertions(+), 26 deletions(-) diff --git a/packages/playwright-core/src/cli/driver.ts b/packages/playwright-core/src/cli/driver.ts index 8252acca0712b..3a64be7cca0e0 100644 --- a/packages/playwright-core/src/cli/driver.ts +++ b/packages/playwright-core/src/cli/driver.ts @@ -22,7 +22,7 @@ import { BrowserType } from '../client/browserType'; import { LaunchServerOptions } from '../client/types'; import { DispatcherConnection, Root } from '../dispatchers/dispatcher'; import { PlaywrightDispatcher } from '../dispatchers/playwrightDispatcher'; -import { Transport } from '../protocol/transport'; +import { IpcTransport, PipeTransport } from '../protocol/transport'; import { PlaywrightServer } from '../remote/playwrightServer'; import { createPlaywright } from '../server/playwright'; import { gracefullyCloseAll } from '../utils/processLauncher'; @@ -38,7 +38,7 @@ export function runDriver() { const playwright = createPlaywright(sdkLanguage); return new PlaywrightDispatcher(rootScope, playwright); }); - const transport = new Transport(process.stdout, process.stdin); + const transport = process.send ? new IpcTransport(process) : new PipeTransport(process.stdout, process.stdin); transport.onmessage = message => dispatcherConnection.dispatch(JSON.parse(message)); dispatcherConnection.onmessage = message => transport.send(JSON.stringify(message)); transport.onclose = async () => { diff --git a/packages/playwright-core/src/outofprocess.ts b/packages/playwright-core/src/outofprocess.ts index 89cfdcbd52246..9bfae2895bacc 100644 --- a/packages/playwright-core/src/outofprocess.ts +++ b/packages/playwright-core/src/outofprocess.ts @@ -15,10 +15,11 @@ */ import { Connection } from './client/connection'; -import { Transport } from './protocol/transport'; +import { IpcTransport } from './protocol/transport'; import { Playwright } from './client/playwright'; import * as childProcess from 'child_process'; import * as path from 'path'; +import { ManualPromise } from './utils/async'; export async function start(env: any = {}): Promise<{ playwright: Playwright, stop: () => Promise }> { const client = new PlaywrightClient(env); @@ -30,16 +31,13 @@ export async function start(env: any = {}): Promise<{ playwright: Playwright, st class PlaywrightClient { _playwright: Promise; _driverProcess: childProcess.ChildProcess; - private _closePromise: Promise; - private _onExit: (exitCode: number | null, signal: string | null) => {}; + private _closePromise = new ManualPromise(); + private _transport: IpcTransport; + private _stopped = false; constructor(env: any) { - this._onExit = (exitCode: number | null, signal: string | null) => { - throw new Error(`Server closed with exitCode=${exitCode} signal=${signal}`); - }; - this._driverProcess = childProcess.fork(path.join(__dirname, 'cli', 'cli.js'), ['run-driver'], { - stdio: 'pipe', + stdio: ['inherit', 'inherit', 'inherit', 'ipc'], detached: true, env: { ...process.env, @@ -47,22 +45,28 @@ class PlaywrightClient { }, }); this._driverProcess.unref(); - this._driverProcess.on('exit', this._onExit); + this._driverProcess.on('exit', this._onExit.bind(this)); const connection = new Connection(); - const transport = new Transport(this._driverProcess.stdin!, this._driverProcess.stdout!); - connection.onmessage = message => transport.send(JSON.stringify(message)); - transport.onmessage = message => connection.dispatch(JSON.parse(message)); - this._closePromise = new Promise(f => transport.onclose = f); + this._transport = new IpcTransport(this._driverProcess); + connection.onmessage = message => this._transport.send(JSON.stringify(message)); + this._transport.onmessage = message => connection.dispatch(JSON.parse(message)); + this._transport.onclose = () => this._closePromise.resolve(); this._playwright = connection.initializePlaywright(); } async stop() { - this._driverProcess.removeListener('exit', this._onExit); - this._driverProcess.stdin!.destroy(); - this._driverProcess.stdout!.destroy(); - this._driverProcess.stderr!.destroy(); + this._stopped = true; + this._transport.close(); await this._closePromise; } + + private _onExit(exitCode: number | null, signal: string | null) { + if (this._stopped) + this._closePromise.resolve(); + else + throw new Error(`Server closed with exitCode=${exitCode} signal=${signal}`); + } + } diff --git a/packages/playwright-core/src/protocol/transport.ts b/packages/playwright-core/src/protocol/transport.ts index 9b4be17edf3eb..e23ccb683d0f7 100644 --- a/packages/playwright-core/src/protocol/transport.ts +++ b/packages/playwright-core/src/protocol/transport.ts @@ -14,6 +14,7 @@ * limitations under the License. */ +import { ChildProcess } from 'child_process'; import { makeWaitForNextTask } from '../utils/utils'; export interface WritableStream { @@ -29,7 +30,7 @@ export interface ClosableStream { close(): void; } -export class Transport { +export class PipeTransport { private _pipeWrite: WritableStream; private _data = Buffer.from([]); private _waitForNextTask = makeWaitForNextTask(); @@ -102,3 +103,27 @@ export class Transport { } } } + +export class IpcTransport { + private _process: NodeJS.Process | ChildProcess; + onmessage?: (message: string) => void; + onclose?: () => void; + + constructor(process: NodeJS.Process | ChildProcess) { + this._process = process; + this._process.on('message', message => { + if (message === '') + this.onclose?.(); + else + this.onmessage?.(message); + }); + } + + send(message: string) { + this._process.send!(message); + } + + close() { + this._process.send!(''); + } +} diff --git a/packages/playwright-core/src/server/android/android.ts b/packages/playwright-core/src/server/android/android.ts index 40d823c59b273..1f5899cc98d51 100644 --- a/packages/playwright-core/src/server/android/android.ts +++ b/packages/playwright-core/src/server/android/android.ts @@ -26,7 +26,7 @@ import { BrowserContext, validateBrowserContextOptions } from '../browserContext import { ProgressController } from '../progress'; import { CRBrowser } from '../chromium/crBrowser'; import { helper } from '../helper'; -import { Transport } from '../../protocol/transport'; +import { PipeTransport } from '../../protocol/transport'; import { RecentLogsCollector } from '../../utils/debugLogger'; import { TimeoutSettings } from '../../utils/timeoutSettings'; import { AndroidWebView } from '../../protocol/channels'; @@ -95,7 +95,7 @@ export class AndroidDevice extends SdkObject { readonly _backend: DeviceBackend; readonly model: string; readonly serial: string; - private _driverPromise: Promise | undefined; + private _driverPromise: Promise | undefined; private _lastId = 0; private _callbacks = new Map void, reject: (error: Error) => void }>(); private _pollingWebViews: NodeJS.Timeout | undefined; @@ -155,13 +155,13 @@ export class AndroidDevice extends SdkObject { return await this._backend.runCommand(`shell:screencap -p`); } - private async _driver(): Promise { + private async _driver(): Promise { if (!this._driverPromise) this._driverPromise = this._installDriver(); return this._driverPromise; } - private async _installDriver(): Promise { + private async _installDriver(): Promise { debug('pw:android')('Stopping the old driver'); await this.shell(`am force-stop com.microsoft.playwright.androiddriver`); @@ -176,7 +176,7 @@ export class AndroidDevice extends SdkObject { debug('pw:android')('Starting the new driver'); this.shell('am instrument -w com.microsoft.playwright.androiddriver.test/androidx.test.runner.AndroidJUnitRunner').catch(e => debug('pw:android')(e)); const socket = await this._waitForLocalAbstract('playwright_android_driver_socket'); - const transport = new Transport(socket, socket, socket, 'be'); + const transport = new PipeTransport(socket, socket, socket, 'be'); transport.onmessage = message => { const response = JSON.parse(message); const { id, result, error } = response; diff --git a/utils/check_deps.js b/utils/check_deps.js index 1fda1853f2bb1..d471921c31e13 100644 --- a/utils/check_deps.js +++ b/utils/check_deps.js @@ -181,7 +181,7 @@ DEPS['src/protocol/'] = ['src/utils/']; // Client depends on chromium protocol for types. DEPS['src/client/'] = ['src/common/', 'src/utils/', 'src/protocol/', 'src/server/chromium/protocol.d.ts']; -DEPS['src/outofprocess.ts'] = ['src/client/', 'src/protocol/']; +DEPS['src/outofprocess.ts'] = ['src/client/', 'src/protocol/', 'src/utils/']; DEPS['src/dispatchers/'] = ['src/common/', 'src/utils/', 'src/protocol/', 'src/server/**']; From f96b1dd43ba808783fd2986711b23a6fd0b812aa Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 3 Feb 2022 08:20:39 -0800 Subject: [PATCH 194/233] feat(webkit): roll to r1609 (#11824) --- packages/playwright-core/browsers.json | 2 +- .../playwright-core/src/server/webkit/protocol.d.ts | 13 ++++++++++--- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/packages/playwright-core/browsers.json b/packages/playwright-core/browsers.json index 75fab9a83aeff..d4eb97624e992 100644 --- a/packages/playwright-core/browsers.json +++ b/packages/playwright-core/browsers.json @@ -23,7 +23,7 @@ }, { "name": "webkit", - "revision": "1604", + "revision": "1609", "installByDefault": true, "revisionOverrides": { "mac10.14": "1446" diff --git a/packages/playwright-core/src/server/webkit/protocol.d.ts b/packages/playwright-core/src/server/webkit/protocol.d.ts index bbdfde73ab135..0b980bb010f4e 100644 --- a/packages/playwright-core/src/server/webkit/protocol.d.ts +++ b/packages/playwright-core/src/server/webkit/protocol.d.ts @@ -162,7 +162,7 @@ export module Protocol { animationId: AnimationId; } export type requestEffectTargetReturnValue = { - nodeId: DOM.NodeId; + effectTarget: DOM.Styleable; } /** * Resolves JavaScript `WebAnimation` object for given `AnimationId`. @@ -906,7 +906,7 @@ export module Protocol { /** * The layout context type of a node. */ - export type LayoutContextType = "grid"; + export type LayoutContextType = "flex"|"grid"; /** * The mode for how layout context type changes are handled (default: Observed). Observed limits handling to those nodes already known to the frontend by other means (generally, this means the node is a visible item in the Elements tab). All informs the frontend of all layout context type changes and all nodes with a known layout context are sent to the frontend. */ @@ -1172,7 +1172,7 @@ export module Protocol { export type forcePseudoStateReturnValue = { } /** - * Change how layout context type changes are handled for nodes. When the new mode would observe nodes the frontend has not yet received, those nodes will be sent to the frontend immediately. + * Change how layout context type changes are handled for nodes. When the new mode would observe nodes the frontend has not yet recieved, those nodes will be sent to the frontend immediately. */ export type setLayoutContextTypeChangedModeParameters = { /** @@ -2085,6 +2085,13 @@ export module Protocol { */ marginColor?: RGBAColor; } + /** + * An object referencing a node and a pseudo-element, primarily used to identify an animation effect target. + */ + export interface Styleable { + nodeId: NodeId; + pseudoId?: CSS.PseudoId; + } /** * Data to construct File object. */ From d237ad76c1dde5e0528d17f7849ab88b7d7f57c2 Mon Sep 17 00:00:00 2001 From: Yury Semikhatsky Date: Thu, 3 Feb 2022 09:09:38 -0800 Subject: [PATCH 195/233] test: mark cltr+click test as timing out on windows (#11840) --- tests/browsercontext-page-event.spec.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/browsercontext-page-event.spec.ts b/tests/browsercontext-page-event.spec.ts index 5ace0959587ec..6b96038171f76 100644 --- a/tests/browsercontext-page-event.spec.ts +++ b/tests/browsercontext-page-event.spec.ts @@ -185,9 +185,10 @@ it('should work with Ctrl-clicking', async ({ browser, server, isMac, browserNam await context.close(); }); -it('should not hang on ctrl-click during provisional load', async ({ context, page, server, isMac, browserName }) => { +it('should not hang on ctrl-click during provisional load', async ({ context, page, server, isMac, isWindows, browserName }) => { it.info().annotations.push({ type: 'issue', description: 'https://github.com/microsoft/playwright/issues/11595' }); it.skip(browserName === 'chromium', 'Chromium does not dispatch renderer messages while navigation is provisional.'); + it.fixme(browserName === 'webkit' && isWindows, 'Timesout while trying to click'); await page.goto(server.EMPTY_PAGE); await page.setContent('yo'); server.setRoute('/slow.html', () => {}); From 72424dc90476e98c0e593ef985758eee9c872f91 Mon Sep 17 00:00:00 2001 From: Pavel Feldman Date: Thu, 3 Feb 2022 16:10:39 -0800 Subject: [PATCH 196/233] chore: allow setting reporter via env (#11848) --- packages/playwright-test/src/reporters/html.ts | 2 +- packages/playwright-test/src/runner.ts | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/packages/playwright-test/src/reporters/html.ts b/packages/playwright-test/src/reporters/html.ts index 009e85f96a118..0ddf74ff1eb62 100644 --- a/packages/playwright-test/src/reporters/html.ts +++ b/packages/playwright-test/src/reporters/html.ts @@ -125,7 +125,7 @@ class HtmlReporter implements Reporter { constructor(options: { outputFolder?: string, open?: 'always' | 'never' | 'on-failure' } = {}) { // TODO: resolve relative to config. this._outputFolder = options.outputFolder; - this._open = options.open || 'on-failure'; + this._open = process.env.PW_TEST_HTML_REPORT_OPEN as any || options.open || 'on-failure'; } printsToStdio() { diff --git a/packages/playwright-test/src/runner.ts b/packages/playwright-test/src/runner.ts index 9a3e5f2bbd2d6..60fe9ad9b5db7 100644 --- a/packages/playwright-test/src/runner.ts +++ b/packages/playwright-test/src/runner.ts @@ -113,6 +113,11 @@ export class Runner { reporters.push(new reporterConstructor(arg)); } } + if (process.env.PW_TEST_REPORTER) { + const reporterConstructor = await this._loader.loadReporter(process.env.PW_TEST_REPORTER); + reporters.push(new reporterConstructor()); + } + const someReporterPrintsToStdio = reporters.some(r => { const prints = r.printsToStdio ? r.printsToStdio() : true; return prints; From d9a8bb057dc4717436ad97ad7df26a3f2f314c5a Mon Sep 17 00:00:00 2001 From: Dmitry Gozman Date: Thu, 3 Feb 2022 17:14:12 -0800 Subject: [PATCH 197/233] fix(test-fail): allow unhandled expects in test.fail (#11850) Previously, we would consider this a worker error, but we make an exception for "expect()" calls. --- packages/playwright-test/src/workerRunner.ts | 6 +++++- tests/playwright-test/basic.spec.ts | 16 ++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/packages/playwright-test/src/workerRunner.ts b/packages/playwright-test/src/workerRunner.ts index 52420c9f97c9e..f421ade8b7e06 100644 --- a/packages/playwright-test/src/workerRunner.ts +++ b/packages/playwright-test/src/workerRunner.ts @@ -94,7 +94,11 @@ export class WorkerRunner extends EventEmitter { // a test runner. In the latter case, the worker state could be messed up, // and continuing to run tests in the same worker is problematic. Therefore, // we turn this into a fatal error and restart the worker anyway. - if (this._currentTest && this._currentTest._test._type === 'test' && this._currentTest.expectedStatus !== 'failed') { + // The only exception is the expect() error that we still consider ok. + const isExpectError = (error instanceof Error) && !!(error as any).matcherResult; + const isCurrentTestExpectedToFail = this._currentTest?.expectedStatus === 'failed'; + const shouldConsiderAsTestError = isExpectError || !isCurrentTestExpectedToFail; + if (this._currentTest && this._currentTest._test._type === 'test' && shouldConsiderAsTestError) { this._currentTest._failWithError(serializeError(error), true /* isHardError */); } else { // No current test - fatal error. diff --git a/tests/playwright-test/basic.spec.ts b/tests/playwright-test/basic.spec.ts index 074a409896207..9eb9d96ddef2d 100644 --- a/tests/playwright-test/basic.spec.ts +++ b/tests/playwright-test/basic.spec.ts @@ -426,3 +426,19 @@ test('should not reuse worker after unhandled rejection in test.fail', async ({ expect(result.output).toContain(`Error: Oh my!`); expect(result.output).not.toContain(`Did not teardown test scope`); }); + +test('should allow unhandled expects in test.fail', async ({ runInlineTest }) => { + const result = await runInlineTest({ + 'a.spec.ts': ` + const { test } = pwt; + test('failing1', async ({}) => { + test.fail(); + Promise.resolve().then(() => expect(1).toBe(2)); + await new Promise(f => setTimeout(f, 100)); + }); + ` + }); + expect(result.exitCode).toBe(0); + expect(result.passed).toBe(1); + expect(result.output).not.toContain(`Error: expect`); +}); From c9e99d5d97ec60de98bd2b91720bffb505b4a542 Mon Sep 17 00:00:00 2001 From: Dmitry Gozman Date: Thu, 3 Feb 2022 17:16:40 -0800 Subject: [PATCH 198/233] test: reenable "should intercept network activity from worker 2" (#11851) --- tests/page/interception.spec.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/tests/page/interception.spec.ts b/tests/page/interception.spec.ts index 2acc965fed1c4..949a151358085 100644 --- a/tests/page/interception.spec.ts +++ b/tests/page/interception.spec.ts @@ -108,8 +108,6 @@ it('should intercept network activity from worker', async function({ page, serve it('should intercept network activity from worker 2', async function({ page, server, isElectron, isAndroid, browserName, browserMajorVersion }) { it.skip(isAndroid); it.fixme(isElectron); - it.fixme(browserName === 'chromium' && browserMajorVersion === 97, '@see https://github.com/microsoft/playwright/issues/10048'); - it.fixme(browserName === 'chromium' && browserMajorVersion === 99, '@see https://github.com/microsoft/playwright/issues/11593'); const url = server.PREFIX + '/worker/worker.js'; await page.route(url, route => { From 547a32885b06d604e72bcf067fa1a86b18038a00 Mon Sep 17 00:00:00 2001 From: Andrey Lushnikov Date: Thu, 3 Feb 2022 22:44:23 -0700 Subject: [PATCH 199/233] feat: hide blinking cursor when making screenshots (#11854) References #9938 --- .../src/server/chromium/crDragDrop.ts | 1 + .../src/server/screenshotter.ts | 34 +++++++++++++++++++ tests/page/page-screenshot.spec.ts | 17 ++++++++++ 3 files changed, 52 insertions(+) diff --git a/packages/playwright-core/src/server/chromium/crDragDrop.ts b/packages/playwright-core/src/server/chromium/crDragDrop.ts index abec6964f39d4..33d65a993948c 100644 --- a/packages/playwright-core/src/server/chromium/crDragDrop.ts +++ b/packages/playwright-core/src/server/chromium/crDragDrop.ts @@ -84,6 +84,7 @@ export class DragManager { const val = await didStartDrag; window.removeEventListener('mousemove', mouseListener, { capture: true }); window.removeEventListener('dragstart', dragListener, { capture: true }); + delete window.__cleanupDrag; return val; }; }).toString(), true, 'utility').catch(() => {}); diff --git a/packages/playwright-core/src/server/screenshotter.ts b/packages/playwright-core/src/server/screenshotter.ts index 5fda7b65950e5..920a697d6d3c3 100644 --- a/packages/playwright-core/src/server/screenshotter.ts +++ b/packages/playwright-core/src/server/screenshotter.ts @@ -22,6 +22,12 @@ import * as types from './types'; import { Progress } from './progress'; import { assert } from '../utils/utils'; +declare global { + interface Window { + __cleanupScreenshot?: () => void; + } +} + export class Screenshotter { private _queue = new TaskQueue(); private _page: Page; @@ -115,8 +121,36 @@ export class Screenshotter { progress.cleanupWhenAborted(() => this._page._delegate.setBackgroundColor()); } progress.throwIfAborted(); // Avoid extra work. + + const restoreBlinkingCaret = async () => { + await Promise.all(this._page.frames().map(async frame => { + frame.nonStallingEvaluateInExistingContext('window.__cleanupScreenshot && window.__cleanupScreenshot()', false, 'utility').catch(() => {}); + })); + }; + await Promise.all(this._page.frames().map(async frame => { + await frame.nonStallingEvaluateInExistingContext((function() { + const styleTag = document.createElement('style'); + styleTag.textContent = ` + * { caret-color: transparent !important; } + * > * { caret-color: transparent !important; } + * > * > * { caret-color: transparent !important; } + * > * > * > * { caret-color: transparent !important; } + * > * > * > * > * { caret-color: transparent !important; } + `; + document.documentElement.append(styleTag); + window.__cleanupScreenshot = () => { + styleTag.remove(); + delete window.__cleanupScreenshot; + }; + }).toString(), true, 'utility').catch(() => {}); + })); + progress.cleanupWhenAborted(() => restoreBlinkingCaret()); + progress.throwIfAborted(); // Avoid extra work. + const buffer = await this._page._delegate.takeScreenshot(progress, format, documentRect, viewportRect, options.quality, fitsViewport); progress.throwIfAborted(); // Avoid restoring after failure - should be done by cleanup. + await restoreBlinkingCaret(); + progress.throwIfAborted(); // Avoid restoring after failure - should be done by cleanup. if (shouldSetDefaultBackground) await this._page._delegate.setBackgroundColor(); progress.throwIfAborted(); // Avoid side effects. diff --git a/tests/page/page-screenshot.spec.ts b/tests/page/page-screenshot.spec.ts index 97c635dff9f32..27a46c4c085d1 100644 --- a/tests/page/page-screenshot.spec.ts +++ b/tests/page/page-screenshot.spec.ts @@ -31,6 +31,23 @@ it.describe('page screenshot', () => { expect(screenshot).toMatchSnapshot('screenshot-sanity.png'); }); + it('should not capture blinking caret', async ({ page, server }) => { + await page.setContent(` +
+ `); + const div = page.locator('div'); + await div.type('foo bar'); + const screenshot = await div.screenshot(); + for (let i = 0; i < 10; ++i) { + // Caret blinking time is set to 500ms. + // Try to capture variety of screenshots to make + // sure we don't capture blinking caret. + await new Promise(x => setTimeout(x, 150)); + const newScreenshot = await div.screenshot(); + expect(newScreenshot.equals(screenshot)).toBe(true); + } + }); + it('should clip rect', async ({ page, server }) => { await page.setViewportSize({ width: 500, height: 500 }); await page.goto(server.PREFIX + '/grid.html'); From d9c82b8784dcc1fde29be004d8ef3e3b40cfa2e2 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 4 Feb 2022 11:19:21 +0100 Subject: [PATCH 200/233] browser(chromium): roll to r966993 (#11862) Co-authored-by: github-actions <41898282+github-actions[bot]@users.noreply.github.com> --- browser_patches/chromium/BUILD_NUMBER | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/browser_patches/chromium/BUILD_NUMBER b/browser_patches/chromium/BUILD_NUMBER index e42c7cc212b2c..61b98c6595b95 100644 --- a/browser_patches/chromium/BUILD_NUMBER +++ b/browser_patches/chromium/BUILD_NUMBER @@ -1 +1 @@ -965416 +966993 From c45dacc834303458ec0685f5f6b63a82bb8e2083 Mon Sep 17 00:00:00 2001 From: Dmitry Gozman Date: Fri, 4 Feb 2022 07:34:23 -0800 Subject: [PATCH 201/233] feat(codegen): make selector generator strict (#11856) This is required to migrate to locators. --- .../src/server/injected/injectedScript.ts | 2 +- .../src/server/injected/selectorGenerator.ts | 54 ++++++++++--------- .../server/supplements/injected/consoleApi.ts | 2 +- .../server/supplements/injected/recorder.ts | 4 +- tests/page/page-strict.spec.ts | 4 +- tests/selector-generator.spec.ts | 14 ++--- 6 files changed, 43 insertions(+), 37 deletions(-) diff --git a/packages/playwright-core/src/server/injected/injectedScript.ts b/packages/playwright-core/src/server/injected/injectedScript.ts index 259e94cdebd08..10689773871e5 100644 --- a/packages/playwright-core/src/server/injected/injectedScript.ts +++ b/packages/playwright-core/src/server/injected/injectedScript.ts @@ -848,7 +848,7 @@ export class InjectedScript { strictModeViolationError(selector: ParsedSelector, matches: Element[]): Error { const infos = matches.slice(0, 10).map(m => ({ preview: this.previewNode(m), - selector: generateSelector(this, m).selector + selector: generateSelector(this, m, true).selector })); const lines = infos.map((info, i) => `\n ${i + 1}) ${info.preview} aka playwright.$("${info.selector}")`); if (infos.length < matches.length) diff --git a/packages/playwright-core/src/server/injected/selectorGenerator.ts b/packages/playwright-core/src/server/injected/selectorGenerator.ts index 39e44a3c34d06..f83d93fba0c3a 100644 --- a/packages/playwright-core/src/server/injected/selectorGenerator.ts +++ b/packages/playwright-core/src/server/injected/selectorGenerator.ts @@ -25,6 +25,7 @@ type SelectorToken = { const cacheAllowText = new Map(); const cacheDisallowText = new Map(); +const kNthScore = 1000; export function querySelector(injectedScript: InjectedScript, selector: string, ownerDocument: Document): { selector: string, elements: Element[] } { try { @@ -41,12 +42,12 @@ export function querySelector(injectedScript: InjectedScript, selector: string, } } -export function generateSelector(injectedScript: InjectedScript, targetElement: Element): { selector: string, elements: Element[] } { +export function generateSelector(injectedScript: InjectedScript, targetElement: Element, strict: boolean): { selector: string, elements: Element[] } { injectedScript._evaluator.begin(); try { targetElement = targetElement.closest('button,select,input,[role=button],[role=checkbox],[role=radio]') || targetElement; - const targetTokens = generateSelectorFor(injectedScript, targetElement); - const bestTokens = targetTokens || [cssFallback(injectedScript, targetElement)]; + const targetTokens = generateSelectorFor(injectedScript, targetElement, strict); + const bestTokens = targetTokens || cssFallback(injectedScript, targetElement, strict); const selector = joinTokens(bestTokens); const parsedSelector = injectedScript.parseSelector(selector); return { @@ -65,7 +66,7 @@ function filterRegexTokens(textCandidates: SelectorToken[][]): SelectorToken[][] return textCandidates.filter(c => c[0].selector[0] !== '/'); } -function generateSelectorFor(injectedScript: InjectedScript, targetElement: Element): SelectorToken[] | null { +function generateSelectorFor(injectedScript: InjectedScript, targetElement: Element, strict: boolean): SelectorToken[] | null { if (targetElement.ownerDocument.documentElement === targetElement) return [{ engine: 'css', selector: 'html', score: 1 }]; @@ -80,7 +81,7 @@ function generateSelectorFor(injectedScript: InjectedScript, targetElement: Elem const noTextCandidates = buildCandidates(injectedScript, element).map(token => [token]); // First check all text and non-text candidates for the element. - let result = chooseFirstSelector(injectedScript, targetElement.ownerDocument, element, [...textCandidates, ...noTextCandidates], allowNthMatch); + let result = chooseFirstSelector(injectedScript, targetElement.ownerDocument, element, [...textCandidates, ...noTextCandidates], allowNthMatch, strict); // Do not use regex for chained selectors (for performance). textCandidates = filterRegexTokens(textCandidates); @@ -110,7 +111,7 @@ function generateSelectorFor(injectedScript: InjectedScript, targetElement: Elem if (result && combineScores([...parentTokens, ...bestPossibleInParent]) >= combineScores(result)) continue; // Update the best candidate that finds "element" in the "parent". - bestPossibleInParent = chooseFirstSelector(injectedScript, parent, element, candidates, allowNthMatch); + bestPossibleInParent = chooseFirstSelector(injectedScript, parent, element, candidates, allowNthMatch, strict); if (!bestPossibleInParent) return; const combined = [...parentTokens, ...bestPossibleInParent]; @@ -214,7 +215,7 @@ function makeSelectorForId(id: string) { return /^[a-zA-Z][a-zA-Z0-9\-\_]+$/.test(id) ? '#' + id : `[id="${cssEscape(id)}"]`; } -function cssFallback(injectedScript: InjectedScript, targetElement: Element): SelectorToken { +function cssFallback(injectedScript: InjectedScript, targetElement: Element, strict: boolean): SelectorToken[] { const kFallbackScore = 10000000; const root: Node = targetElement.ownerDocument; const tokens: string[] = []; @@ -229,6 +230,18 @@ function cssFallback(injectedScript: InjectedScript, targetElement: Element): Se return node === targetElement ? selector : undefined; } + function makeStrict(selector: string): SelectorToken[] { + const token = { engine: 'css', selector, score: kFallbackScore }; + if (!strict) + return [token]; + const parsedSelector = injectedScript.parseSelector(selector); + const elements = injectedScript.querySelectorAll(parsedSelector, targetElement.ownerDocument); + if (elements.length === 1) + return [token]; + const nth = { engine: 'nth', selector: String(elements.indexOf(targetElement)), score: kNthScore }; + return [token, nth]; + } + for (let element: Element | null = targetElement; element && element !== root; element = parentElementOrShadowHost(element)) { const nodeName = element.nodeName.toLowerCase(); @@ -238,7 +251,7 @@ function cssFallback(injectedScript: InjectedScript, targetElement: Element): Se const token = makeSelectorForId(element.id); const selector = uniqueCSSSelector(token); if (selector) - return { engine: 'css', selector, score: kFallbackScore }; + return makeStrict(selector); bestTokenForLevel = token; } @@ -250,7 +263,7 @@ function cssFallback(injectedScript: InjectedScript, targetElement: Element): Se const token = '.' + classes.slice(0, i + 1).join('.'); const selector = uniqueCSSSelector(token); if (selector) - return { engine: 'css', selector, score: kFallbackScore }; + return makeStrict(selector); // Even if not unique, does this subset of classes uniquely identify node as a child? if (!bestTokenForLevel && parent) { const sameClassSiblings = parent.querySelectorAll(token); @@ -266,7 +279,7 @@ function cssFallback(injectedScript: InjectedScript, targetElement: Element): Se const token = sameTagSiblings.indexOf(element) === 0 ? cssEscape(nodeName) : `${cssEscape(nodeName)}:nth-child(${1 + siblings.indexOf(element)})`; const selector = uniqueCSSSelector(token); if (selector) - return { engine: 'css', selector, score: kFallbackScore }; + return makeStrict(selector); if (!bestTokenForLevel) bestTokenForLevel = token; } else if (!bestTokenForLevel) { @@ -274,7 +287,7 @@ function cssFallback(injectedScript: InjectedScript, targetElement: Element): Se } tokens.unshift(bestTokenForLevel); } - return { engine: 'css', selector: uniqueCSSSelector()!, score: kFallbackScore }; + return makeStrict(uniqueCSSSelector()!); } function escapeForRegex(text: string): string { @@ -307,7 +320,7 @@ function combineScores(tokens: SelectorToken[]): number { return score; } -function chooseFirstSelector(injectedScript: InjectedScript, scope: Element | Document, targetElement: Element, selectors: SelectorToken[][], allowNthMatch: boolean): SelectorToken[] | null { +function chooseFirstSelector(injectedScript: InjectedScript, scope: Element | Document, targetElement: Element, selectors: SelectorToken[][], allowNthMatch: boolean, strict: boolean): SelectorToken[] | null { const joined = selectors.map(tokens => ({ tokens, score: combineScores(tokens) })); joined.sort((a, b) => a.score - b.score); @@ -315,26 +328,19 @@ function chooseFirstSelector(injectedScript: InjectedScript, scope: Element | Do for (const { tokens } of joined) { const parsedSelector = injectedScript.parseSelector(joinTokens(tokens)); const result = injectedScript.querySelectorAll(parsedSelector, scope); + const isStrictEnough = !strict || result.length === 1; const index = result.indexOf(targetElement); - if (index === 0) { + if (index === 0 && isStrictEnough) { // We are the first match - found the best selector. return tokens; } - // Otherwise, perhaps we can get nth-match? + // Otherwise, perhaps we can use nth=? if (!allowNthMatch || bestWithIndex || index === -1 || result.length > 5) continue; - // To use nth-match, we must convert everything to css. - const allCss = tokens.map(token => { - if (token.engine !== 'text') - return token; - if (token.selector.startsWith('/') && token.selector.endsWith('/')) - return { engine: 'css', selector: `:text-matches("${token.selector.substring(1, token.selector.length - 1)}")`, score: token.score }; - return { engine: 'css', selector: `:text("${token.selector}")`, score: token.score }; - }); - const combined = joinTokens(allCss); - bestWithIndex = [{ engine: 'css', selector: `:nth-match(${combined}, ${index + 1})`, score: combineScores(allCss) + 1000 }]; + const nth: SelectorToken = { engine: 'nth', selector: String(index), score: kNthScore }; + bestWithIndex = [...tokens, nth]; } return bestWithIndex; } diff --git a/packages/playwright-core/src/server/supplements/injected/consoleApi.ts b/packages/playwright-core/src/server/supplements/injected/consoleApi.ts index 2f818eadd235c..2ef763bfa39b6 100644 --- a/packages/playwright-core/src/server/supplements/injected/consoleApi.ts +++ b/packages/playwright-core/src/server/supplements/injected/consoleApi.ts @@ -104,7 +104,7 @@ export class ConsoleAPI { private _selector(element: Element) { if (!(element instanceof Element)) throw new Error(`Usage: playwright.selector(element).`); - return generateSelector(this._injectedScript, element).selector; + return generateSelector(this._injectedScript, element, true).selector; } private _resume() { diff --git a/packages/playwright-core/src/server/supplements/injected/recorder.ts b/packages/playwright-core/src/server/supplements/injected/recorder.ts index 9461cd422f394..4487241b3419f 100644 --- a/packages/playwright-core/src/server/supplements/injected/recorder.ts +++ b/packages/playwright-core/src/server/supplements/injected/recorder.ts @@ -237,7 +237,7 @@ export class Recorder { private _onFocus() { const activeElement = this._deepActiveElement(document); - const result = activeElement ? generateSelector(this._injectedScript, activeElement) : null; + const result = activeElement ? generateSelector(this._injectedScript, activeElement, true) : null; this._activeModel = result && result.selector ? result : null; if (this._params.isUnderTest) console.error('Highlight updated for test: ' + (result ? result.selector : null)); // eslint-disable-line no-console @@ -250,7 +250,7 @@ export class Recorder { return; } const hoveredElement = this._hoveredElement; - const { selector, elements } = generateSelector(this._injectedScript, hoveredElement); + const { selector, elements } = generateSelector(this._injectedScript, hoveredElement, true); if ((this._hoveredModel && this._hoveredModel.selector === selector) || this._hoveredElement !== hoveredElement) return; this._hoveredModel = selector ? { selector, elements } : null; diff --git a/tests/page/page-strict.spec.ts b/tests/page/page-strict.spec.ts index 8d0e12721a634..fc64cc1914d33 100644 --- a/tests/page/page-strict.spec.ts +++ b/tests/page/page-strict.spec.ts @@ -34,7 +34,7 @@ it('should fail page.fill in strict mode', async ({ page }) => { await page.setContent(`
`); const error = await page.fill('input', 'text', { strict: true }).catch(e => e); expect(error.message).toContain('strict mode violation'); - expect(error.message).toContain('1) aka playwright.$("input")'); + expect(error.message).toContain('1) aka playwright.$("input >> nth=0")'); expect(error.message).toContain('2) aka playwright.$("div input")'); }); @@ -54,6 +54,6 @@ it('should fail page.dispatchEvent in strict mode', async ({ page }) => { await page.setContent(`
`); const error = await page.dispatchEvent('span', 'click', {}, { strict: true }).catch(e => e); expect(error.message).toContain('strict mode violation'); - expect(error.message).toContain('1) aka playwright.$("span")'); + expect(error.message).toContain('1) aka playwright.$("span >> nth=0")'); expect(error.message).toContain('2) aka playwright.$("div span")'); }); diff --git a/tests/selector-generator.spec.ts b/tests/selector-generator.spec.ts index 7c5da574ace64..b1ce30a419737 100644 --- a/tests/selector-generator.spec.ts +++ b/tests/selector-generator.spec.ts @@ -73,12 +73,12 @@ it.describe('selector generator', () => { `); - expect(await generate(page, '[mark="1"]')).toBe(':nth-match(select, 2)'); + expect(await generate(page, '[mark="1"]')).toBe('select >> nth=1'); }); it('should use ordinal for identical nodes', async ({ page }) => { await page.setContent(`
Text
Text
Text
Text
`); - expect(await generate(page, 'div[mark="1"]')).toBe(`:nth-match(:text("Text"), 3)`); + expect(await generate(page, 'div[mark="1"]')).toBe(`text=Text >> nth=2`); }); it('should prefer data-testid', async ({ page }) => { @@ -94,7 +94,7 @@ it.describe('selector generator', () => {
Text
`); - expect(await generate(page, 'div[mark="1"]')).toBe('[data-testid="a"]'); + expect(await generate(page, 'div[mark="1"]')).toBe('[data-testid="a"] >> nth=0'); }); it('should handle second non-unique data-testid', async ({ page }) => { @@ -105,7 +105,7 @@ it.describe('selector generator', () => {
Text
`); - expect(await generate(page, 'div[mark="1"]')).toBe(`:nth-match([data-testid="a"], 2)`); + expect(await generate(page, 'div[mark="1"]')).toBe(`[data-testid="a"] >> nth=1`); }); it('should use readable id', async ({ page }) => { @@ -121,7 +121,7 @@ it.describe('selector generator', () => {
`); - expect(await generate(page, 'div[mark="1"]')).toBe(`:nth-match(div, 2)`); + expect(await generate(page, 'div[mark="1"]')).toBe(`div >> nth=1`); }); it('should use has-text', async ({ page }) => { @@ -195,7 +195,7 @@ it.describe('selector generator', () => { `); - expect(await generate(page, 'input[mark="1"]')).toBe(':nth-match(input, 2)'); + expect(await generate(page, 'input[mark="1"]')).toBe('input >> nth=1'); }); it.describe('should prioritise input element attributes correctly', () => { @@ -249,7 +249,7 @@ it.describe('selector generator', () => { input2.setAttribute('value', 'foo'); shadowRoot2.appendChild(input2); }); - expect(await generate(page, 'input[value=foo]')).toBe(':nth-match(input, 3)'); + expect(await generate(page, 'input[value=foo]')).toBe('input >> nth=2'); }); it('should work in dynamic iframes without navigation', async ({ page }) => { From 6881db681741320196df2f7c15f8c9194b0e6cb8 Mon Sep 17 00:00:00 2001 From: Aarni Koskela Date: Fri, 4 Feb 2022 17:36:30 +0200 Subject: [PATCH 202/233] docs: fix typo in Python APIRequestContext example (#11861) `playwright.chromium` should be `p.chromium`, etc. --- docs/src/api/class-apirequestcontext.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/src/api/class-apirequestcontext.md b/docs/src/api/class-apirequestcontext.md index e40c8c02843f0..588d3c720528b 100644 --- a/docs/src/api/class-apirequestcontext.md +++ b/docs/src/api/class-apirequestcontext.md @@ -71,13 +71,13 @@ with sync_playwright() as p: # This will launch a new browser, create a context and page. When making HTTP # requests with the internal APIRequestContext (e.g. `context.request` or `page.request`) # it will automatically set the cookies to the browser page and vise versa. - browser = playwright.chromium.launch() + browser = p.chromium.launch() context = browser.new_context(base_url="https://api.github.com") api_request_context = context.request page = context.new_page() # Alternatively you can create a APIRequestContext manually without having a browser context attached: - # api_request_context = playwright.request.new_context(base_url="https://api.github.com") + # api_request_context = p.request.new_context(base_url="https://api.github.com") # Create a repository. From e67d2124512fdc899c9183c308394cd84d1433b9 Mon Sep 17 00:00:00 2001 From: Daniel Kolesa Date: Fri, 4 Feb 2022 17:37:49 +0100 Subject: [PATCH 203/233] browser(webkit): roll to 02/03/22 (#11852) --- browser_patches/webkit/BUILD_NUMBER | 4 +- browser_patches/webkit/UPSTREAM_CONFIG.sh | 2 +- browser_patches/webkit/patches/bootstrap.diff | 353 +++++++++--------- 3 files changed, 182 insertions(+), 177 deletions(-) diff --git a/browser_patches/webkit/BUILD_NUMBER b/browser_patches/webkit/BUILD_NUMBER index 3f73a39efcf23..35d85b13e16a6 100644 --- a/browser_patches/webkit/BUILD_NUMBER +++ b/browser_patches/webkit/BUILD_NUMBER @@ -1,2 +1,2 @@ -1609 -Changed: yurys@chromium.org Wed 02 Feb 2022 03:31:54 PM PST +1610 +Changed: dkolesa@igalia.com Fri Feb 4 00:43:35 CET 2022 diff --git a/browser_patches/webkit/UPSTREAM_CONFIG.sh b/browser_patches/webkit/UPSTREAM_CONFIG.sh index 1b4077c0423eb..5c972a934b5e3 100644 --- a/browser_patches/webkit/UPSTREAM_CONFIG.sh +++ b/browser_patches/webkit/UPSTREAM_CONFIG.sh @@ -1,3 +1,3 @@ REMOTE_URL="https://github.com/WebKit/WebKit.git" BASE_BRANCH="main" -BASE_REVISION="dd0bc728b4618f059dafab7e742f261a174c3a70" +BASE_REVISION="f522f6f875f2443ba32dc2cce3d8b0cfd97ffc77" diff --git a/browser_patches/webkit/patches/bootstrap.diff b/browser_patches/webkit/patches/bootstrap.diff index 437201cec790e..1d49d26c6bc46 100644 --- a/browser_patches/webkit/patches/bootstrap.diff +++ b/browser_patches/webkit/patches/bootstrap.diff @@ -1,8 +1,8 @@ diff --git a/Source/JavaScriptCore/CMakeLists.txt b/Source/JavaScriptCore/CMakeLists.txt -index 37ce753743c353d58f66118b7837c8788e48197e..b82c7c1992b841dc0846366ded69bbe51096bd37 100644 +index 788377f671399a13b0b51531e0c29c24743db821..3ecf6ef79bc3fdb97282f8a9f0bddd85f693b639 100644 --- a/Source/JavaScriptCore/CMakeLists.txt +++ b/Source/JavaScriptCore/CMakeLists.txt -@@ -1342,22 +1342,27 @@ set(JavaScriptCore_INSPECTOR_DOMAINS +@@ -1343,22 +1343,27 @@ set(JavaScriptCore_INSPECTOR_DOMAINS ${JAVASCRIPTCORE_DIR}/inspector/protocol/CSS.json ${JAVASCRIPTCORE_DIR}/inspector/protocol/Canvas.json ${JAVASCRIPTCORE_DIR}/inspector/protocol/Console.json @@ -1925,14 +1925,13 @@ index be86666961906832f585adb43edeb381ad199222..23b1fd28ee684537fcbcc9c671e2bff8 Source/third_party/opus/src/celt Source/third_party/opus/src/include diff --git a/Source/ThirdParty/libwebrtc/Configurations/libwebrtc.mac.exp b/Source/ThirdParty/libwebrtc/Configurations/libwebrtc.mac.exp -index dfe8ba87c6bed689f7f044d388b7c21b19936518..3de753ce55f0626e98d19a71c31f81f2c7b65c4c 100644 +index ca5473a62ad98bf6b4e0ceb602885645d90f7d23..d2808ac22cfa34f15662941d2dcba7abe4a80d7d 100644 --- a/Source/ThirdParty/libwebrtc/Configurations/libwebrtc.mac.exp +++ b/Source/ThirdParty/libwebrtc/Configurations/libwebrtc.mac.exp -@@ -330,4 +330,23 @@ __ZN3rtc6Thread12socketserverEv - __ZN6webrtc32webrtc_sequence_checker_internal19SequenceCheckerImplC2Ev - __ZNK3rtc14RTCCertificate17GetSSLCertificateEv +@@ -332,3 +332,23 @@ __ZNK3rtc14RTCCertificate17GetSSLCertificateEv __ZTVN6webrtc30WrappingAsyncDnsResolverResultE -- + __ZN6webrtc20pixelBufferFromFrameERKNS_10VideoFrameE + __ZN6webrtc14copyVideoFrameERKNS_10VideoFrameEPh +__ZN8mkvmuxer11SegmentInfo15set_writing_appEPKc +__ZN8mkvmuxer11SegmentInfo4InitEv +__ZN8mkvmuxer7Segment10OutputCuesEb @@ -1967,7 +1966,7 @@ index 2ee75dd5ff6bb1a30bd27c28600210f70beb17f8..1ad9a018d3431aa1e877983a55578296 PUBLIC_HEADERS_FOLDER_PREFIX = /usr/local/include; INSTALL_PUBLIC_HEADER_PREFIX = $(INSTALL_PATH_PREFIX)$(PUBLIC_HEADERS_FOLDER_PREFIX); diff --git a/Source/ThirdParty/libwebrtc/libwebrtc.xcodeproj/project.pbxproj b/Source/ThirdParty/libwebrtc/libwebrtc.xcodeproj/project.pbxproj -index 5354ce4e111c808b39fbd22fb5f147fedaa46726..99b5e1db2c997ce80fe07ef2e0d576b330a540a6 100644 +index 447a02d3cd2802e028ec16d549654a06adcaaae5..bf576a79f103fe43e375df9be49e0f6ea19f0e14 100644 --- a/Source/ThirdParty/libwebrtc/libwebrtc.xcodeproj/project.pbxproj +++ b/Source/ThirdParty/libwebrtc/libwebrtc.xcodeproj/project.pbxproj @@ -3870,6 +3870,9 @@ @@ -2024,7 +2023,7 @@ index 5354ce4e111c808b39fbd22fb5f147fedaa46726..99b5e1db2c997ce80fe07ef2e0d576b3 }; 5CD286461E6E154E0094FDC8 /* Check for Weak VTables and Externals */ = { isa = PBXShellScriptBuildPhase; -@@ -18657,6 +18674,7 @@ +@@ -18658,6 +18675,7 @@ 419C82F51FE20EB50040C30F /* audio_encoder_opus.cc in Sources */, 419C82F31FE20EB50040C30F /* audio_encoder_opus_config.cc in Sources */, 4140B8201E4E3383007409E6 /* audio_encoder_pcm.cc in Sources */, @@ -2032,7 +2031,7 @@ index 5354ce4e111c808b39fbd22fb5f147fedaa46726..99b5e1db2c997ce80fe07ef2e0d576b3 5CDD8FFE1E43CE3A00621E92 /* audio_encoder_pcm16b.cc in Sources */, 5CD285461E6A61D20094FDC8 /* audio_format.cc in Sources */, 41DDB26F212679D200296D47 /* audio_format_to_string.cc in Sources */, -@@ -19103,6 +19121,7 @@ +@@ -19104,6 +19122,7 @@ 417953DB216983910028266B /* metrics.cc in Sources */, 5CDD865E1E43B8B500621E92 /* min_max_operations.c in Sources */, 4189395B242A71F5007FDC41 /* min_video_bitrate_experiment.cc in Sources */, @@ -2040,7 +2039,7 @@ index 5354ce4e111c808b39fbd22fb5f147fedaa46726..99b5e1db2c997ce80fe07ef2e0d576b3 4131C387234B957D0028A615 /* moving_average.cc in Sources */, 41FCBB1521B1F7AA00A5DF27 /* moving_average.cc in Sources */, 5CD286101E6A64C90094FDC8 /* moving_max.cc in Sources */, -@@ -19333,6 +19352,7 @@ +@@ -19334,6 +19353,7 @@ 4131C53B234C8B190028A615 /* rtc_event_rtp_packet_outgoing.cc in Sources */, 4131C552234C8B190028A615 /* rtc_event_video_receive_stream_config.cc in Sources */, 4131C554234C8B190028A615 /* rtc_event_video_send_stream_config.cc in Sources */, @@ -2049,7 +2048,7 @@ index 5354ce4e111c808b39fbd22fb5f147fedaa46726..99b5e1db2c997ce80fe07ef2e0d576b3 41323A1D2665288B00B38623 /* packet_sequencer.cc in Sources */, 4131BF2D234B88200028A615 /* rtc_stats_collector.cc in Sources */, diff --git a/Source/WTF/Scripts/Preferences/WebPreferences.yaml b/Source/WTF/Scripts/Preferences/WebPreferences.yaml -index d56c1cce33d857391475e037b8cc4eaa7233cfad..23704ab54b8f84930b2484aba525a2fd25bbddd5 100644 +index e79c7d92d128a8668f34c32418539146331f2ece..01b4985add6381a37d6bbfe7cb44f1f20f44b3e6 100644 --- a/Source/WTF/Scripts/Preferences/WebPreferences.yaml +++ b/Source/WTF/Scripts/Preferences/WebPreferences.yaml @@ -995,7 +995,7 @@ InspectorStartsAttached: @@ -2080,7 +2079,7 @@ index d56c1cce33d857391475e037b8cc4eaa7233cfad..23704ab54b8f84930b2484aba525a2fd type: bool humanReadableName: "Private Click Measurement" diff --git a/Source/WTF/Scripts/Preferences/WebPreferencesExperimental.yaml b/Source/WTF/Scripts/Preferences/WebPreferencesExperimental.yaml -index 7a4d36463ec550c0f3ead4a7a25d5319fef3af5e..80609cf99b6b5581c4dd1a40476e28f00c033020 100644 +index 5b4d3b625717532554f3ad72a4db45a69eca85e6..30c6a502efdbf0fe619e7ddf2239f1535078958a 100644 --- a/Source/WTF/Scripts/Preferences/WebPreferencesExperimental.yaml +++ b/Source/WTF/Scripts/Preferences/WebPreferencesExperimental.yaml @@ -455,7 +455,7 @@ CrossOriginOpenerPolicyEnabled: @@ -2270,10 +2269,10 @@ index 664b0e29f6ba3ce4826e5109d73f86cc9bc6adfd..95e9875d933ff7b9219b2a1d89029b8a #if !defined(ENABLE_TOUCH_ACTION_REGIONS) diff --git a/Source/WTF/wtf/PlatformEnableCocoa.h b/Source/WTF/wtf/PlatformEnableCocoa.h -index 59e5093187a96134ddb342d5ccc740fb4a6dbca0..f3e4f6d01dde966a2431cfa16515d1edbda258f0 100644 +index 760bc70fee671a73d8cb302cef9480072dbab937..f282ad28a5d857b064eca9c123ecf5fdd9da63c6 100644 --- a/Source/WTF/wtf/PlatformEnableCocoa.h +++ b/Source/WTF/wtf/PlatformEnableCocoa.h -@@ -219,7 +219,7 @@ +@@ -215,7 +215,7 @@ #define ENABLE_DATA_DETECTION 1 #endif @@ -2295,10 +2294,10 @@ index 3901bfb0f5479064f4e7b67c90621ff26d74b580..5b3615a871d0d7123822394c94d5ce10 if (Journald_FOUND) diff --git a/Source/WTF/wtf/PlatformHave.h b/Source/WTF/wtf/PlatformHave.h -index a04798e3b40af4ddc2b0908e369555d540668d33..cc3a0105b4369b3e8e3f353134ce3e2d1c519afb 100644 +index 70ca32462835341f4966ada7fbe0875868788773..0266b7b3633c684ae2d6a17fcf9853b05b38b894 100644 --- a/Source/WTF/wtf/PlatformHave.h +++ b/Source/WTF/wtf/PlatformHave.h -@@ -391,7 +391,7 @@ +@@ -397,7 +397,7 @@ #define HAVE_FOUNDATION_WITH_SAME_SITE_COOKIE_SUPPORT 1 #endif @@ -2421,10 +2420,10 @@ index bd3dead9cece47e9af0cc5b4ad188d74aabb8fcb..46a89056a878c8c4f015257df69629e7 set(CSS_VALUE_PLATFORM_DEFINES "HAVE_OS_DARK_MODE_SUPPORT=1") diff --git a/Source/WebCore/SourcesCocoa.txt b/Source/WebCore/SourcesCocoa.txt -index 410c6f4ad5b2159045d152c661b50f153468467d..6db27f1055faf2c9d36ca207314d0a466c87375e 100644 +index 33a896520f78d5b83cb84f181fa76be3e1054942..04bcc6b5170cba64c90c43a500fb3e969325bfae 100644 --- a/Source/WebCore/SourcesCocoa.txt +++ b/Source/WebCore/SourcesCocoa.txt -@@ -615,3 +615,9 @@ platform/graphics/angle/ANGLEUtilities.cpp @no-unify +@@ -617,3 +617,9 @@ platform/graphics/angle/ANGLEUtilities.cpp @no-unify platform/graphics/angle/ExtensionsGLANGLE.cpp @no-unify platform/graphics/angle/GraphicsContextGLANGLE.cpp @no-unify platform/graphics/angle/TemporaryANGLESetting.cpp @no-unify @@ -2486,10 +2485,10 @@ index c4898d6db6bf06552f602c4b7f0a7267e64e44f4..7cf2e30729671a89c373870c5691d337 __ZN7WebCore14DocumentLoaderD2Ev __ZN7WebCore14DocumentLoader17clearMainResourceEv diff --git a/Source/WebCore/WebCore.xcodeproj/project.pbxproj b/Source/WebCore/WebCore.xcodeproj/project.pbxproj -index 9cbf876e258fb97cdc8a36651f4b72054fd9c643..a42613a9b94fee39404514724641242c4e8250ea 100644 +index c5f44ef04a7058b19b24c85d11d63d9454e3db0c..319dc3d3e3c49e73c9b04f9c978a3a6667584258 100644 --- a/Source/WebCore/WebCore.xcodeproj/project.pbxproj +++ b/Source/WebCore/WebCore.xcodeproj/project.pbxproj -@@ -5479,6 +5479,13 @@ +@@ -5485,6 +5485,13 @@ EDE3A5000C7A430600956A37 /* ColorMac.h in Headers */ = {isa = PBXBuildFile; fileRef = EDE3A4FF0C7A430600956A37 /* ColorMac.h */; settings = {ATTRIBUTES = (Private, ); }; }; EDEC98030AED7E170059137F /* WebCorePrefix.h in Headers */ = {isa = PBXBuildFile; fileRef = EDEC98020AED7E170059137F /* WebCorePrefix.h */; }; EFCC6C8F20FE914400A2321B /* CanvasActivityRecord.h in Headers */ = {isa = PBXBuildFile; fileRef = EFCC6C8D20FE914000A2321B /* CanvasActivityRecord.h */; settings = {ATTRIBUTES = (Private, ); }; }; @@ -2503,7 +2502,7 @@ index 9cbf876e258fb97cdc8a36651f4b72054fd9c643..a42613a9b94fee39404514724641242c F12171F616A8CF0B000053CA /* WebVTTElement.h in Headers */ = {isa = PBXBuildFile; fileRef = F12171F416A8BC63000053CA /* WebVTTElement.h */; }; F32BDCD92363AACA0073B6AE /* UserGestureEmulationScope.h in Headers */ = {isa = PBXBuildFile; fileRef = F32BDCD72363AACA0073B6AE /* UserGestureEmulationScope.h */; }; F344C7141125B82C00F26EEE /* InspectorFrontendClient.h in Headers */ = {isa = PBXBuildFile; fileRef = F344C7121125B82C00F26EEE /* InspectorFrontendClient.h */; settings = {ATTRIBUTES = (Private, ); }; }; -@@ -17716,6 +17723,14 @@ +@@ -17731,6 +17738,14 @@ EDEC98020AED7E170059137F /* WebCorePrefix.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = WebCorePrefix.h; sourceTree = ""; tabWidth = 4; usesTabs = 0; }; EFB7287B2124C73D005C2558 /* CanvasActivityRecord.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = CanvasActivityRecord.cpp; sourceTree = ""; }; EFCC6C8D20FE914000A2321B /* CanvasActivityRecord.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CanvasActivityRecord.h; sourceTree = ""; }; @@ -2518,7 +2517,7 @@ index 9cbf876e258fb97cdc8a36651f4b72054fd9c643..a42613a9b94fee39404514724641242c F12171F316A8BC63000053CA /* WebVTTElement.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WebVTTElement.cpp; sourceTree = ""; }; F12171F416A8BC63000053CA /* WebVTTElement.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebVTTElement.h; sourceTree = ""; }; F32BDCD52363AAC90073B6AE /* UserGestureEmulationScope.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = UserGestureEmulationScope.cpp; sourceTree = ""; }; -@@ -24034,7 +24049,12 @@ +@@ -24064,7 +24079,12 @@ 93D6B7A62551D3ED0058DD3A /* DummySpeechRecognitionProvider.h */, 1AF326770D78B9440068F0C4 /* EditorClient.h */, 93C09A800B064F00005ABD4D /* EventHandler.cpp */, @@ -2531,7 +2530,7 @@ index 9cbf876e258fb97cdc8a36651f4b72054fd9c643..a42613a9b94fee39404514724641242c E0FEF371B27C53EAC1C1FBEE /* EventSource.cpp */, E0FEF371B17C53EAC1C1FBEE /* EventSource.h */, E0FEF371B07C53EAC1C1FBEE /* EventSource.idl */, -@@ -29993,6 +30013,8 @@ +@@ -30025,6 +30045,8 @@ 29E4D8DF16B0940F00C84704 /* PlatformSpeechSynthesizer.h */, 1AD8F81A11CAB9E900E93E54 /* PlatformStrategies.cpp */, 1AD8F81911CAB9E900E93E54 /* PlatformStrategies.h */, @@ -2540,7 +2539,7 @@ index 9cbf876e258fb97cdc8a36651f4b72054fd9c643..a42613a9b94fee39404514724641242c 0FD7C21D23CE41E30096D102 /* PlatformWheelEvent.cpp */, 935C476A09AC4D4F00A6AAB4 /* PlatformWheelEvent.h */, BCBB8AB513F1AFB000734DF0 /* PODInterval.h */, -@@ -32302,6 +32324,7 @@ +@@ -32334,6 +32356,7 @@ BCCFBAE70B5152ED0001F1D7 /* DocumentParser.h */, AD6E71AA1668899D00320C13 /* DocumentSharedObjectPool.cpp */, AD6E71AB1668899D00320C13 /* DocumentSharedObjectPool.h */, @@ -2548,7 +2547,7 @@ index 9cbf876e258fb97cdc8a36651f4b72054fd9c643..a42613a9b94fee39404514724641242c 6BDB5DC1227BD3B800919770 /* DocumentStorageAccess.cpp */, 6BDB5DC0227BD3B800919770 /* DocumentStorageAccess.h */, 7CE7FA5B1EF882300060C9D6 /* DocumentTouch.cpp */, -@@ -33313,6 +33336,7 @@ +@@ -33345,6 +33368,7 @@ 93C4F6EB1108F9A50099D0DB /* AccessibilityScrollbar.h in Headers */, 29489FC712C00F0300D83F0F /* AccessibilityScrollView.h in Headers */, 0709FC4E1025DEE30059CDBA /* AccessibilitySlider.h in Headers */, @@ -2556,7 +2555,7 @@ index 9cbf876e258fb97cdc8a36651f4b72054fd9c643..a42613a9b94fee39404514724641242c 29D7BCFA1444AF7D0070619C /* AccessibilitySpinButton.h in Headers */, 69A6CBAD1C6BE42C00B836E9 /* AccessibilitySVGElement.h in Headers */, AAC08CF315F941FD00F1E188 /* AccessibilitySVGRoot.h in Headers */, -@@ -35438,6 +35462,7 @@ +@@ -35470,6 +35494,7 @@ 6E4ABCD5138EA0B70071D291 /* JSHTMLUnknownElement.h in Headers */, E44614170CD6826900FADA75 /* JSHTMLVideoElement.h in Headers */, 81BE20D311F4BC3200915DFA /* JSIDBCursor.h in Headers */, @@ -2564,7 +2563,7 @@ index 9cbf876e258fb97cdc8a36651f4b72054fd9c643..a42613a9b94fee39404514724641242c 7C3D8EF01E0B21430023B084 /* JSIDBCursorDirection.h in Headers */, C585A68311D4FB08004C3E4B /* JSIDBDatabase.h in Headers */, C585A69711D4FB13004C3E4B /* JSIDBFactory.h in Headers */, -@@ -36549,6 +36574,7 @@ +@@ -36581,6 +36606,7 @@ 0F7D07331884C56C00B4AF86 /* PlatformTextTrack.h in Headers */, 074E82BB18A69F0E007EF54C /* PlatformTimeRanges.h in Headers */, CDD08ABD277E542600EA3755 /* PlatformTrackConfiguration.h in Headers */, @@ -2572,7 +2571,7 @@ index 9cbf876e258fb97cdc8a36651f4b72054fd9c643..a42613a9b94fee39404514724641242c CD1F9B022700323D00617EB6 /* PlatformVideoColorPrimaries.h in Headers */, CD1F9B01270020B700617EB6 /* PlatformVideoColorSpace.h in Headers */, CD1F9B032700323D00617EB6 /* PlatformVideoMatrixCoefficients.h in Headers */, -@@ -38582,6 +38608,7 @@ +@@ -38619,6 +38645,7 @@ 1ABA76CA11D20E50004C201C /* CSSPropertyNames.cpp in Sources */, 2D22830323A8470700364B7E /* CursorMac.mm in Sources */, 5CBD59592280E926002B22AA /* CustomHeaderFields.cpp in Sources */, @@ -2580,7 +2579,7 @@ index 9cbf876e258fb97cdc8a36651f4b72054fd9c643..a42613a9b94fee39404514724641242c 6E72F54C229DCD0C00B3E151 /* ExtensionsGLANGLE.cpp in Sources */, 7CE6CBFD187F394900D46BF5 /* FormatConverter.cpp in Sources */, 5130F2F624AEA60A00E1D0A0 /* GameControllerSoftLink.mm in Sources */, -@@ -38653,6 +38680,7 @@ +@@ -38691,6 +38718,7 @@ 6E72F54F229DCD1300B3E151 /* TemporaryANGLESetting.cpp in Sources */, CE88EE262414467B007F29C2 /* TextAlternativeWithRange.mm in Sources */, 51DF6D800B92A18E00C2DC85 /* ThreadCheck.mm in Sources */, @@ -2588,7 +2587,7 @@ index 9cbf876e258fb97cdc8a36651f4b72054fd9c643..a42613a9b94fee39404514724641242c 538EC8031F96AF81004D22A8 /* UnifiedSource1-mm.mm in Sources */, 538EC8021F96AF81004D22A8 /* UnifiedSource1.cpp in Sources */, 538EC8051F96AF81004D22A8 /* UnifiedSource2-mm.mm in Sources */, -@@ -38701,6 +38729,7 @@ +@@ -38739,6 +38767,7 @@ 538EC8881F993F9C004D22A8 /* UnifiedSource23.cpp in Sources */, DE5F85801FA1ABF4006DB63A /* UnifiedSource24-mm.mm in Sources */, 538EC8891F993F9D004D22A8 /* UnifiedSource24.cpp in Sources */, @@ -2596,7 +2595,7 @@ index 9cbf876e258fb97cdc8a36651f4b72054fd9c643..a42613a9b94fee39404514724641242c DE5F85811FA1ABF4006DB63A /* UnifiedSource25-mm.mm in Sources */, 538EC88A1F993F9D004D22A8 /* UnifiedSource25.cpp in Sources */, DE5F85821FA1ABF4006DB63A /* UnifiedSource26-mm.mm in Sources */, -@@ -39233,6 +39262,7 @@ +@@ -39271,6 +39300,7 @@ 2D8B92F1203D13E1009C868F /* UnifiedSource516.cpp in Sources */, 2D8B92F2203D13E1009C868F /* UnifiedSource517.cpp in Sources */, 2D8B92F3203D13E1009C868F /* UnifiedSource518.cpp in Sources */, @@ -2605,7 +2604,7 @@ index 9cbf876e258fb97cdc8a36651f4b72054fd9c643..a42613a9b94fee39404514724641242c 2D8B92F5203D13E1009C868F /* UnifiedSource520.cpp in Sources */, 2D8B92F6203D13E1009C868F /* UnifiedSource521.cpp in Sources */, diff --git a/Source/WebCore/accessibility/AccessibilityObject.cpp b/Source/WebCore/accessibility/AccessibilityObject.cpp -index 95db0f344fd847ccf6144260f257fc7bf996b68e..72741e339c2d4aa7f5df4f36393570d4bdc0a03c 100644 +index ed1c65b61c0eed1be35c8d2d6641887c74cafd80..ed5d78d7c073f8647311d3be6600b30c16357b2e 100644 --- a/Source/WebCore/accessibility/AccessibilityObject.cpp +++ b/Source/WebCore/accessibility/AccessibilityObject.cpp @@ -61,6 +61,7 @@ @@ -2616,7 +2615,7 @@ index 95db0f344fd847ccf6144260f257fc7bf996b68e..72741e339c2d4aa7f5df4f36393570d4 #include "LocalizedStrings.h" #include "MathMLNames.h" #include "NodeList.h" -@@ -3616,10 +3617,15 @@ AccessibilityObjectInclusion AccessibilityObject::defaultObjectInclusion() const +@@ -3617,10 +3618,15 @@ AccessibilityObjectInclusion AccessibilityObject::defaultObjectInclusion() const if (useParentData ? m_isIgnoredFromParentData.isPresentationalChildOfAriaRole : isPresentationalChildOfAriaRole()) return AccessibilityObjectInclusion::IgnoreObject; @@ -5353,7 +5352,7 @@ index 16edb3bc689b8e2dde17597b642b706c1343e1f5..f363b2ca2410f22cff8d6ad908a88527 private: diff --git a/Source/WebCore/layout/integration/LayoutIntegrationLineLayout.cpp b/Source/WebCore/layout/integration/LayoutIntegrationLineLayout.cpp -index 9f9c10efd706b48e08cd26828fee8acb873ce376..89e423d712201bb2e3f1df595f6344144f8d6538 100644 +index c85b7b875b81c6da4b3ddcf60df0f330bff2acf1..2e5d880289422e432308f8f1740156b657a11016 100644 --- a/Source/WebCore/layout/integration/LayoutIntegrationLineLayout.cpp +++ b/Source/WebCore/layout/integration/LayoutIntegrationLineLayout.cpp @@ -307,7 +307,7 @@ void LineLayout::updateFormattingRootGeometryAndInvalidate() @@ -5401,7 +5400,7 @@ index 359b63851868423c37a10063501a4df06d9adbaa..3e5593c61d5a73eff267423080c29b2a } diff --git a/Source/WebCore/loader/DocumentLoader.h b/Source/WebCore/loader/DocumentLoader.h -index c2bea6f6a69b836472c0aff7a0d7070396ba6c2b..80af07d2f4327a400c85b65b640bcfa2ab2f430a 100644 +index 123d04213f75354949837089d2065966f929c9e6..976b4266690d08df1b4defc023f720283a10b091 100644 --- a/Source/WebCore/loader/DocumentLoader.h +++ b/Source/WebCore/loader/DocumentLoader.h @@ -179,9 +179,13 @@ public: @@ -5568,7 +5567,7 @@ index 284967df462545fe06cc2eb66a2716282053f2f3..54a62a348579e54013e23f9d65c55b54 #if ENABLE(INPUT_TYPE_COLOR) diff --git a/Source/WebCore/page/EventHandler.cpp b/Source/WebCore/page/EventHandler.cpp -index 16d5389dfffac3254fcef4fa79a07655dd003302..9f97272d7a67e0c655784e3ac2db67e1aa7ef51e 100644 +index 27517c22e7709eaae55123f99ee697ed6685a901..90d55bd1e045b12b1b0e7a2367978395a536b164 100644 --- a/Source/WebCore/page/EventHandler.cpp +++ b/Source/WebCore/page/EventHandler.cpp @@ -140,6 +140,7 @@ @@ -6311,7 +6310,7 @@ index 28d1fc3242174a680711027877d4153923790220..058b5309eed081fcc1e4158f66e80642 if (stateObjectType == StateObjectType::Push) { frame->loader().history().pushState(WTFMove(data), title, fullURL.string()); diff --git a/Source/WebCore/page/Page.cpp b/Source/WebCore/page/Page.cpp -index f264fadbba1b035ae06d39bc0f25c8ecbfffe169..63502c3b93573ef5a8130cebf757e1f33ff706c4 100644 +index 83a50e2421ee0d0c6fcb75007a804a6edd711975..858e02caa87de9739cf03aad914617f294ac55d8 100644 --- a/Source/WebCore/page/Page.cpp +++ b/Source/WebCore/page/Page.cpp @@ -471,6 +471,37 @@ void Page::setOverrideViewportArguments(const std::optional& @@ -6381,10 +6380,10 @@ index f264fadbba1b035ae06d39bc0f25c8ecbfffe169..63502c3b93573ef5a8130cebf757e1f3 { if (insets == m_fullscreenInsets) diff --git a/Source/WebCore/page/Page.h b/Source/WebCore/page/Page.h -index 08f85e896998d491d3d2c9bf49457a4106587bde..12f892016a2f1f690535f263e4afe28594a9e4f5 100644 +index 8fd51eb67d1eba2ff0a9cd5881a7ce767e22abb9..0b51d4b0bfc01e93b3cffa5f1d592b8f4ffb5a84 100644 --- a/Source/WebCore/page/Page.h +++ b/Source/WebCore/page/Page.h -@@ -271,6 +271,9 @@ public: +@@ -273,6 +273,9 @@ public: const std::optional& overrideViewportArguments() const { return m_overrideViewportArguments; } WEBCORE_EXPORT void setOverrideViewportArguments(const std::optional&); @@ -6394,7 +6393,7 @@ index 08f85e896998d491d3d2c9bf49457a4106587bde..12f892016a2f1f690535f263e4afe285 static void refreshPlugins(bool reload); WEBCORE_EXPORT PluginData& pluginData(); void clearPluginData(); -@@ -323,6 +326,10 @@ public: +@@ -325,6 +328,10 @@ public: DragCaretController& dragCaretController() const { return *m_dragCaretController; } #if ENABLE(DRAG_SUPPORT) DragController& dragController() const { return *m_dragController; } @@ -6405,7 +6404,7 @@ index 08f85e896998d491d3d2c9bf49457a4106587bde..12f892016a2f1f690535f263e4afe285 #endif FocusController& focusController() const { return *m_focusController; } #if ENABLE(CONTEXT_MENUS) -@@ -485,6 +492,8 @@ public: +@@ -487,6 +494,8 @@ public: WEBCORE_EXPORT void effectiveAppearanceDidChange(bool useDarkAppearance, bool useElevatedUserInterfaceLevel); bool defaultUseDarkAppearance() const { return m_useDarkAppearance; } void setUseDarkAppearanceOverride(std::optional); @@ -6414,7 +6413,7 @@ index 08f85e896998d491d3d2c9bf49457a4106587bde..12f892016a2f1f690535f263e4afe285 #if ENABLE(TEXT_AUTOSIZING) float textAutosizingWidth() const { return m_textAutosizingWidth; } -@@ -888,6 +897,11 @@ public: +@@ -890,6 +899,11 @@ public: WEBCORE_EXPORT Vector> editableElementsInRect(const FloatRect&) const; @@ -6426,7 +6425,7 @@ index 08f85e896998d491d3d2c9bf49457a4106587bde..12f892016a2f1f690535f263e4afe285 #if ENABLE(DEVICE_ORIENTATION) && PLATFORM(IOS_FAMILY) DeviceOrientationUpdateProvider* deviceOrientationUpdateProvider() const { return m_deviceOrientationUpdateProvider.get(); } #endif -@@ -994,6 +1008,9 @@ private: +@@ -996,6 +1010,9 @@ private: #if ENABLE(DRAG_SUPPORT) const std::unique_ptr m_dragController; @@ -6436,7 +6435,7 @@ index 08f85e896998d491d3d2c9bf49457a4106587bde..12f892016a2f1f690535f263e4afe285 #endif const std::unique_ptr m_focusController; #if ENABLE(CONTEXT_MENUS) -@@ -1073,6 +1090,7 @@ private: +@@ -1075,6 +1092,7 @@ private: bool m_useElevatedUserInterfaceLevel { false }; bool m_useDarkAppearance { false }; std::optional m_useDarkAppearanceOverride; @@ -6444,7 +6443,7 @@ index 08f85e896998d491d3d2c9bf49457a4106587bde..12f892016a2f1f690535f263e4afe285 #if ENABLE(TEXT_AUTOSIZING) float m_textAutosizingWidth { 0 }; -@@ -1251,6 +1269,11 @@ private: +@@ -1253,6 +1271,11 @@ private: #endif std::optional m_overrideViewportArguments; @@ -6986,10 +6985,10 @@ index 0000000000000000000000000000000000000000..f0c3a183e5bc44bdfa4201e0db2067b4 + +#endif // ENABLE(SPEECH_SYNTHESIS) diff --git a/Source/WebCore/platform/graphics/FontCascade.h b/Source/WebCore/platform/graphics/FontCascade.h -index babe96684e7c15cb9ca9693ba3560a8aa3d2c96c..6a8f9095415441a4e253ac791e26166e5d63349d 100644 +index 24cfb7137431a77ecb01fedaa4473c69784476c3..9c1413baafa7675fd62d8eb85a267575f47c99be 100644 --- a/Source/WebCore/platform/graphics/FontCascade.h +++ b/Source/WebCore/platform/graphics/FontCascade.h -@@ -301,7 +301,8 @@ private: +@@ -304,7 +304,8 @@ private: return true; if (textRenderingMode == TextRenderingMode::OptimizeSpeed) return false; @@ -8733,7 +8732,7 @@ index 2e90534ffd8da83b7dc54d46fa7def16319bbb43..2493c00d58957751c65c37eb409fa8d6 int innerLineHeight() const override; #endif diff --git a/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.cpp b/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.cpp -index f5b7db1603cabf8594f48c8f23a426ab972b7f39..131688cb854503eab1d51572aa52d29dc0843a7e 100644 +index a34f79bde3e081696d73a55fbf59058bf6d8f379..dd0004e8281c53877f4133a0caf4b94ef6b006b7 100644 --- a/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.cpp +++ b/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.cpp @@ -77,6 +77,11 @@ @@ -8759,7 +8758,7 @@ index f5b7db1603cabf8594f48c8f23a426ab972b7f39..131688cb854503eab1d51572aa52d29d m_networkSocketStreams.add(identifier, NetworkSocketStream::create(m_networkProcess.get(), WTFMove(url), m_sessionID, cachePartition, identifier, m_connection, WTFMove(token), acceptInsecureCertificates)); } -@@ -1008,6 +1017,14 @@ void NetworkConnectionToWebProcess::clearPageSpecificData(PageIdentifier pageID) +@@ -1011,6 +1020,14 @@ void NetworkConnectionToWebProcess::clearPageSpecificData(PageIdentifier pageID) #endif } @@ -8775,7 +8774,7 @@ index f5b7db1603cabf8594f48c8f23a426ab972b7f39..131688cb854503eab1d51572aa52d29d void NetworkConnectionToWebProcess::removeStorageAccessForFrame(FrameIdentifier frameID, PageIdentifier pageID) { diff --git a/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.h b/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.h -index 0a6e684012f399ca1f2e1e6581441c0b5b6aa08a..a97221e53302e650eb550a37605bab0251954831 100644 +index ab96657d0df4a2331040ac51fc43c06847848047..c284d1a4eb98e10f43a10acf8a776c306f3fa7fb 100644 --- a/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.h +++ b/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.h @@ -294,6 +294,8 @@ private: @@ -8801,7 +8800,7 @@ index 242835050b24970c5eac1e26bf86b5b025a80e53..7e5277d3613d45054d349ce4935202ff RemoveStorageAccessForFrame(WebCore::FrameIdentifier frameID, WebCore::PageIdentifier pageID); LogUserInteraction(WebCore::RegistrableDomain domain) diff --git a/Source/WebKit/NetworkProcess/NetworkProcess.cpp b/Source/WebKit/NetworkProcess/NetworkProcess.cpp -index 310c6c51a309c4548c2fd0dcb99319ca9ab84ee9..1422b8acf9f21fdc6b32957412f77a539521b708 100644 +index 7c79e2a20976a139c7f667f113c48946dedd5641..9b699a12467f20f029c0f933d0e3e343f168475c 100644 --- a/Source/WebKit/NetworkProcess/NetworkProcess.cpp +++ b/Source/WebKit/NetworkProcess/NetworkProcess.cpp @@ -26,7 +26,6 @@ @@ -9006,10 +9005,10 @@ index f57a72b6bdc3382469d69adb1b1201c7a9f07a84..c501211b094312ca44f0bf92de5d6ebc void clear(); diff --git a/Source/WebKit/NetworkProcess/cocoa/NetworkSessionCocoa.mm b/Source/WebKit/NetworkProcess/cocoa/NetworkSessionCocoa.mm -index 0a3c1b81902ce2a82a96a08aea42aa911789c1ef..d0ec4d3febee0b702b232116673d0f9b9c8c008f 100644 +index 834e5261733119e70e1ef20d177a73819feffc91..565b653f77e70e63679e9c6128539fb37e334b8c 100644 --- a/Source/WebKit/NetworkProcess/cocoa/NetworkSessionCocoa.mm +++ b/Source/WebKit/NetworkProcess/cocoa/NetworkSessionCocoa.mm -@@ -735,7 +735,7 @@ void NetworkSessionCocoa::setClientAuditToken(const WebCore::AuthenticationChall +@@ -736,7 +736,7 @@ void NetworkSessionCocoa::setClientAuditToken(const WebCore::AuthenticationChall if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]) { sessionCocoa->setClientAuditToken(challenge); @@ -9018,7 +9017,7 @@ index 0a3c1b81902ce2a82a96a08aea42aa911789c1ef..d0ec4d3febee0b702b232116673d0f9b return completionHandler(NSURLSessionAuthChallengeUseCredential, [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust]); NSURLSessionTaskTransactionMetrics *metrics = task._incompleteTaskMetrics.transactionMetrics.lastObject; -@@ -968,6 +968,13 @@ ALLOW_DEPRECATED_DECLARATIONS_END +@@ -974,6 +974,13 @@ ALLOW_DEPRECATED_DECLARATIONS_END resourceResponse.setDeprecatedNetworkLoadMetrics(WebCore::copyTimingData(taskMetrics, networkDataTask->networkLoadMetrics())); @@ -9029,11 +9028,11 @@ index 0a3c1b81902ce2a82a96a08aea42aa911789c1ef..d0ec4d3febee0b702b232116673d0f9b + }]; + resourceResponse.m_httpRequestHeaderFields = WTFMove(requestHeaders); + - networkDataTask->didReceiveResponse(WTFMove(resourceResponse), negotiatedLegacyTLS, [completionHandler = makeBlockPtr(completionHandler), taskIdentifier](WebCore::PolicyAction policyAction) { + networkDataTask->didReceiveResponse(WTFMove(resourceResponse), negotiatedLegacyTLS, privateRelayed, [completionHandler = makeBlockPtr(completionHandler), taskIdentifier](WebCore::PolicyAction policyAction) { #if !LOG_DISABLED LOG(NetworkSession, "%llu didReceiveResponse completionHandler (%d)", taskIdentifier, policyAction); diff --git a/Source/WebKit/NetworkProcess/curl/NetworkDataTaskCurl.cpp b/Source/WebKit/NetworkProcess/curl/NetworkDataTaskCurl.cpp -index 13fcc7bd48a55a093912926ba4484cf5e355132b..013327f235abf03a6411ccc034b5dcc8b1514d66 100644 +index 06ccec621a05a7c309b89e210424de7daf307136..6a433ccd3ad4dbd5d8e42c693bb80655b887d55a 100644 --- a/Source/WebKit/NetworkProcess/curl/NetworkDataTaskCurl.cpp +++ b/Source/WebKit/NetworkProcess/curl/NetworkDataTaskCurl.cpp @@ -26,9 +26,13 @@ @@ -9047,10 +9046,10 @@ index 13fcc7bd48a55a093912926ba4484cf5e355132b..013327f235abf03a6411ccc034b5dcc8 +#include "Download.h" #include "NetworkSessionCurl.h" +#include "NetworkProcess.h" + #include "PrivateRelayed.h" #include #include - #include -@@ -41,6 +45,7 @@ +@@ -42,6 +46,7 @@ #include #include #include @@ -9058,7 +9057,7 @@ index 13fcc7bd48a55a093912926ba4484cf5e355132b..013327f235abf03a6411ccc034b5dcc8 namespace WebKit { -@@ -78,6 +83,8 @@ NetworkDataTaskCurl::NetworkDataTaskCurl(NetworkSession& session, NetworkDataTas +@@ -79,6 +84,8 @@ NetworkDataTaskCurl::NetworkDataTaskCurl(NetworkSession& session, NetworkDataTas m_curlRequest->setUserPass(m_initialCredential.user(), m_initialCredential.password()); m_curlRequest->setAuthenticationScheme(ProtectionSpace::AuthenticationScheme::HTTPBasic); } @@ -9067,7 +9066,7 @@ index 13fcc7bd48a55a093912926ba4484cf5e355132b..013327f235abf03a6411ccc034b5dcc8 m_curlRequest->start(); } -@@ -107,6 +114,9 @@ void NetworkDataTaskCurl::cancel() +@@ -108,6 +115,9 @@ void NetworkDataTaskCurl::cancel() if (m_curlRequest) m_curlRequest->cancel(); @@ -9077,7 +9076,7 @@ index 13fcc7bd48a55a093912926ba4484cf5e355132b..013327f235abf03a6411ccc034b5dcc8 } void NetworkDataTaskCurl::invalidateAndCancel() -@@ -151,6 +161,7 @@ void NetworkDataTaskCurl::curlDidReceiveResponse(CurlRequest& request, CurlRespo +@@ -152,6 +162,7 @@ void NetworkDataTaskCurl::curlDidReceiveResponse(CurlRequest& request, CurlRespo m_response = ResourceResponse(receivedResponse); m_response.setCertificateInfo(WTFMove(receivedResponse.certificateInfo)); m_response.setDeprecatedNetworkLoadMetrics(Box::create(WTFMove(receivedResponse.networkLoadMetrics))); @@ -9085,7 +9084,7 @@ index 13fcc7bd48a55a093912926ba4484cf5e355132b..013327f235abf03a6411ccc034b5dcc8 handleCookieHeaders(request.resourceRequest(), receivedResponse); -@@ -178,7 +189,12 @@ void NetworkDataTaskCurl::curlDidReceiveData(CurlRequest&, const SharedBuffer& b +@@ -179,7 +190,12 @@ void NetworkDataTaskCurl::curlDidReceiveData(CurlRequest&, const SharedBuffer& b Ref protectedThis { *this }; if (state() == State::Canceling || state() == State::Completed || (!m_client && !isDownload())) return; @@ -9099,7 +9098,7 @@ index 13fcc7bd48a55a093912926ba4484cf5e355132b..013327f235abf03a6411ccc034b5dcc8 m_client->didReceiveData(buffer); } -@@ -187,9 +203,26 @@ void NetworkDataTaskCurl::curlDidComplete(CurlRequest&, NetworkLoadMetrics&& net +@@ -188,9 +204,26 @@ void NetworkDataTaskCurl::curlDidComplete(CurlRequest&, NetworkLoadMetrics&& net if (state() == State::Canceling || state() == State::Completed || (!m_client && !isDownload())) return; @@ -9126,7 +9125,7 @@ index 13fcc7bd48a55a093912926ba4484cf5e355132b..013327f235abf03a6411ccc034b5dcc8 void NetworkDataTaskCurl::curlDidFailWithError(CurlRequest& request, ResourceError&& resourceError, CertificateInfo&& certificateInfo) { if (state() == State::Canceling || state() == State::Completed || (!m_client && !isDownload())) -@@ -200,6 +233,14 @@ void NetworkDataTaskCurl::curlDidFailWithError(CurlRequest& request, ResourceErr +@@ -201,6 +234,14 @@ void NetworkDataTaskCurl::curlDidFailWithError(CurlRequest& request, ResourceErr return; } @@ -9141,7 +9140,7 @@ index 13fcc7bd48a55a093912926ba4484cf5e355132b..013327f235abf03a6411ccc034b5dcc8 m_client->didCompleteWithError(resourceError); } -@@ -237,6 +278,19 @@ void NetworkDataTaskCurl::invokeDidReceiveResponse() +@@ -238,6 +279,19 @@ void NetworkDataTaskCurl::invokeDidReceiveResponse() case PolicyAction::Ignore: invalidateAndCancel(); break; @@ -9161,7 +9160,7 @@ index 13fcc7bd48a55a093912926ba4484cf5e355132b..013327f235abf03a6411ccc034b5dcc8 default: notImplemented(); break; -@@ -316,6 +370,8 @@ void NetworkDataTaskCurl::willPerformHTTPRedirection() +@@ -317,6 +371,8 @@ void NetworkDataTaskCurl::willPerformHTTPRedirection() m_curlRequest->setUserPass(m_initialCredential.user(), m_initialCredential.password()); m_curlRequest->setAuthenticationScheme(ProtectionSpace::AuthenticationScheme::HTTPBasic); } @@ -9208,10 +9207,10 @@ index e55864a95f7bcbc085c46628bff058573573286c..d82268c1877a29e3e9e848185e4df4e7 WebCore::ShouldRelaxThirdPartyCookieBlocking m_shouldRelaxThirdPartyCookieBlocking { WebCore::ShouldRelaxThirdPartyCookieBlocking::No }; diff --git a/Source/WebKit/NetworkProcess/soup/NetworkDataTaskSoup.cpp b/Source/WebKit/NetworkProcess/soup/NetworkDataTaskSoup.cpp -index 60a49c6d404c52563d87fc2cd1cb22444671d1cd..6184a79c62057390aa6fa7473a4117e8428bc597 100644 +index 81d990d2b653d8e8018afdec45c79f271d4c1c9c..79e7d85c2576eb355e5cf1b5077ab66d6fdaa18c 100644 --- a/Source/WebKit/NetworkProcess/soup/NetworkDataTaskSoup.cpp +++ b/Source/WebKit/NetworkProcess/soup/NetworkDataTaskSoup.cpp -@@ -493,6 +493,8 @@ void NetworkDataTaskSoup::didSendRequest(GRefPtr&& inputStream) +@@ -494,6 +494,8 @@ void NetworkDataTaskSoup::didSendRequest(GRefPtr&& inputStream) m_networkLoadMetrics.failsTAOCheck = !passesTimingAllowOriginCheck(m_response, *origin); } @@ -9220,7 +9219,7 @@ index 60a49c6d404c52563d87fc2cd1cb22444671d1cd..6184a79c62057390aa6fa7473a4117e8 dispatchDidReceiveResponse(); } -@@ -590,6 +592,8 @@ bool NetworkDataTaskSoup::acceptCertificate(GTlsCertificate* certificate, GTlsCe +@@ -591,6 +593,8 @@ bool NetworkDataTaskSoup::acceptCertificate(GTlsCertificate* certificate, GTlsCe { ASSERT(m_soupMessage); URL url = soupURIToURL(soup_message_get_uri(m_soupMessage.get())); @@ -9229,7 +9228,7 @@ index 60a49c6d404c52563d87fc2cd1cb22444671d1cd..6184a79c62057390aa6fa7473a4117e8 auto error = static_cast(*m_session).soupNetworkSession().checkTLSErrors(url, certificate, tlsErrors); if (!error) return true; -@@ -1217,6 +1221,12 @@ WebCore::AdditionalNetworkLoadMetricsForWebInspector& NetworkDataTaskSoup::addit +@@ -1218,6 +1222,12 @@ WebCore::AdditionalNetworkLoadMetricsForWebInspector& NetworkDataTaskSoup::addit return *m_networkLoadMetrics.additionalNetworkLoadMetricsForWebInspector; } @@ -9242,7 +9241,7 @@ index 60a49c6d404c52563d87fc2cd1cb22444671d1cd..6184a79c62057390aa6fa7473a4117e8 void NetworkDataTaskSoup::didGetHeaders() { // We are a bit more conservative with the persistent credential storage than the session store, -@@ -1262,6 +1272,20 @@ void NetworkDataTaskSoup::didGetHeaders() +@@ -1263,6 +1273,20 @@ void NetworkDataTaskSoup::didGetHeaders() additionalMetrics.tlsProtocol = tlsProtocolVersionToString(soup_message_get_tls_protocol_version(m_soupMessage.get())); additionalMetrics.tlsCipher = String::fromUTF8(soup_message_get_tls_ciphersuite_name(m_soupMessage.get())); additionalMetrics.responseHeaderBytesReceived = soup_message_metrics_get_response_header_bytes_received(metrics); @@ -10181,7 +10180,7 @@ index 85d6f74114f4e7f82d9502d1b99d69098d6a49b6..6896c9756edb233dda46c7031e1af699 return WebTouchEvent(); } diff --git a/Source/WebKit/Sources.txt b/Source/WebKit/Sources.txt -index df47c786c8def624f43fc946ddc82d343229994e..473e2f048492ddd99b61093e50543f8ed074a025 100644 +index 57ef3b14eaf2c1092098ee9432f508c611e58e35..782a0547ad06f0c72d8cad1f2457d1117ad3e021 100644 --- a/Source/WebKit/Sources.txt +++ b/Source/WebKit/Sources.txt @@ -393,11 +393,14 @@ Shared/XR/XRDeviceProxy.cpp @@ -10229,10 +10228,10 @@ index df47c786c8def624f43fc946ddc82d343229994e..473e2f048492ddd99b61093e50543f8e UIProcess/Media/AudioSessionRoutingArbitratorProxy.cpp UIProcess/Media/MediaUsageManager.cpp diff --git a/Source/WebKit/SourcesCocoa.txt b/Source/WebKit/SourcesCocoa.txt -index 7bfee083fcf9227c7f5f8496d97ee8ab90e5aa1f..0fbd5c21e6cac0aeddcae4b2bde3557a1bb24ed8 100644 +index 3a72596a4d7a5cab4566277136564ba015b196cd..aecfb624b16bb5dc37b76e3c5f2b84647d5aa377 100644 --- a/Source/WebKit/SourcesCocoa.txt +++ b/Source/WebKit/SourcesCocoa.txt -@@ -271,6 +271,7 @@ UIProcess/API/Cocoa/_WKApplicationManifest.mm +@@ -273,6 +273,7 @@ UIProcess/API/Cocoa/_WKApplicationManifest.mm UIProcess/API/Cocoa/_WKAttachment.mm UIProcess/API/Cocoa/_WKAutomationSession.mm UIProcess/API/Cocoa/_WKAutomationSessionConfiguration.mm @@ -10240,7 +10239,7 @@ index 7bfee083fcf9227c7f5f8496d97ee8ab90e5aa1f..0fbd5c21e6cac0aeddcae4b2bde3557a UIProcess/API/Cocoa/_WKContentRuleListAction.mm UIProcess/API/Cocoa/_WKContextMenuElementInfo.mm UIProcess/API/Cocoa/_WKCustomHeaderFields.mm @no-unify -@@ -445,6 +446,7 @@ UIProcess/Inspector/ios/WKInspectorHighlightView.mm +@@ -447,6 +448,7 @@ UIProcess/Inspector/ios/WKInspectorHighlightView.mm UIProcess/Inspector/ios/WKInspectorNodeSearchGestureRecognizer.mm UIProcess/Inspector/mac/RemoteWebInspectorUIProxyMac.mm @@ -10446,7 +10445,7 @@ index 026121d114c5fcad84c1396be8d692625beaa3bd..edd6e5cae033124c589959a42522fde0 } #endif diff --git a/Source/WebKit/UIProcess/API/C/WKPage.cpp b/Source/WebKit/UIProcess/API/C/WKPage.cpp -index 509b9b25f394f6b367cbb8d687587c14d2885b60..056556f991ee15e8096c48359cda72b9058ce902 100644 +index 20a1e302ddbd2a61e3c5a2cd5ef11d35c94bffba..f682c0b9d17c47a6b9dd410e1f42c2bf0d96f6ae 100644 --- a/Source/WebKit/UIProcess/API/C/WKPage.cpp +++ b/Source/WebKit/UIProcess/API/C/WKPage.cpp @@ -1775,6 +1775,13 @@ void WKPageSetPageUIClient(WKPageRef pageRef, const WKPageUIClientBase* wkClient @@ -11155,7 +11154,7 @@ index 78d1578f94793e9e59a3d4d2b33e79ea8530fa04..493cdadac3873508b3efa3048638e73a #endif +int webkitWebContextExistingCount(); diff --git a/Source/WebKit/UIProcess/API/glib/WebKitWebView.cpp b/Source/WebKit/UIProcess/API/glib/WebKitWebView.cpp -index 10a109fb921f5dc20f08ace52595eeda55d7181a..1ff2154a7c14ef74a15c8edbba37dda7ce58fdb4 100644 +index c893e91c3971b7e771b0751e5df025d415f9ab87..41401a4f72e1eba38412075eba1ad29f59fef0ff 100644 --- a/Source/WebKit/UIProcess/API/glib/WebKitWebView.cpp +++ b/Source/WebKit/UIProcess/API/glib/WebKitWebView.cpp @@ -32,6 +32,7 @@ @@ -11370,10 +11369,10 @@ index 0000000000000000000000000000000000000000..9f1a0173a5641d6f158d815b8f7b9ea6 + +#endif diff --git a/Source/WebKit/UIProcess/API/gtk/WebKitWebViewBase.cpp b/Source/WebKit/UIProcess/API/gtk/WebKitWebViewBase.cpp -index 8c066161aebe9517df27e9aa793da28e054f0c2c..394c068b546ed46c360123625ec4fc3c1c441b60 100644 +index 27a770ecbfc69b96d693a8662df1dbaead44d7e2..81b150bac8ca394282c5f2146ef3ce41241a8101 100644 --- a/Source/WebKit/UIProcess/API/gtk/WebKitWebViewBase.cpp +++ b/Source/WebKit/UIProcess/API/gtk/WebKitWebViewBase.cpp -@@ -2537,6 +2537,11 @@ void webkitWebViewBaseResetClickCounter(WebKitWebViewBase* webkitWebViewBase) +@@ -2539,6 +2539,11 @@ void webkitWebViewBaseResetClickCounter(WebKitWebViewBase* webkitWebViewBase) #endif } @@ -12157,7 +12156,7 @@ index b0dd19a8fe284f48ce07e2da604612077619a0c3..451b5ab76b204246d0479627f44c357a #if PLATFORM(IOS_FAMILY) diff --git a/Source/WebKit/UIProcess/Cocoa/WebProcessPoolCocoa.mm b/Source/WebKit/UIProcess/Cocoa/WebProcessPoolCocoa.mm -index fc71cb3b238ee42fd9e3c07c89caf669a5c4437d..17b26bb30cfd6c0caeaa61f5a2c6c1d6a8d609f7 100644 +index cc5f6b0722c4061d53ff6405af79ef3d45b560f7..074c87276777c12b6e9a2611b02b7a02464f11b5 100644 --- a/Source/WebKit/UIProcess/Cocoa/WebProcessPoolCocoa.mm +++ b/Source/WebKit/UIProcess/Cocoa/WebProcessPoolCocoa.mm @@ -396,7 +396,7 @@ void WebProcessPool::platformInitializeWebProcess(const WebProcessProxy& process @@ -12169,7 +12168,7 @@ index fc71cb3b238ee42fd9e3c07c89caf669a5c4437d..17b26bb30cfd6c0caeaa61f5a2c6c1d6 #endif #if PLATFORM(IOS) -@@ -698,8 +698,8 @@ void WebProcessPool::registerNotificationObservers() +@@ -697,8 +697,8 @@ void WebProcessPool::registerNotificationObservers() }]; m_scrollerStyleNotificationObserver = [[NSNotificationCenter defaultCenter] addObserverForName:NSPreferredScrollerStyleDidChangeNotification object:nil queue:[NSOperationQueue currentQueue] usingBlock:^(NSNotification *notification) { @@ -12181,7 +12180,7 @@ index fc71cb3b238ee42fd9e3c07c89caf669a5c4437d..17b26bb30cfd6c0caeaa61f5a2c6c1d6 m_activationObserver = [[NSNotificationCenter defaultCenter] addObserverForName:NSApplicationDidBecomeActiveNotification object:NSApp queue:[NSOperationQueue currentQueue] usingBlock:^(NSNotification *notification) { diff --git a/Source/WebKit/UIProcess/Cocoa/WebViewImpl.h b/Source/WebKit/UIProcess/Cocoa/WebViewImpl.h -index e851cab82c7429f5b946e9aba7d2d88005965620..ce66175b9cdf1e866454834cfe4eaf3f87840989 100644 +index d64a7dba42d94db24efa8f60ae499a76423d85e9..4364cae8ec64acde543be9c8ec18175fa21f1692 100644 --- a/Source/WebKit/UIProcess/Cocoa/WebViewImpl.h +++ b/Source/WebKit/UIProcess/Cocoa/WebViewImpl.h @@ -503,6 +503,9 @@ public: @@ -12195,10 +12194,10 @@ index e851cab82c7429f5b946e9aba7d2d88005965620..ce66175b9cdf1e866454834cfe4eaf3f void saveBackForwardSnapshotForCurrentItem(); void saveBackForwardSnapshotForItem(WebBackForwardListItem&); diff --git a/Source/WebKit/UIProcess/Cocoa/WebViewImpl.mm b/Source/WebKit/UIProcess/Cocoa/WebViewImpl.mm -index 921e196026cc651de65cd7644c8ae22cf82a9bde..9b5c47dd840f799a88f276ccc758aeb04c75facf 100644 +index bec2ecbd2d849ab8535a1e8f96dca647e1b62631..42037cb1b4a10498430b8bd1faecf420c81fe11f 100644 --- a/Source/WebKit/UIProcess/Cocoa/WebViewImpl.mm +++ b/Source/WebKit/UIProcess/Cocoa/WebViewImpl.mm -@@ -2645,6 +2645,11 @@ WebCore::DestinationColorSpace WebViewImpl::colorSpace() +@@ -2644,6 +2644,11 @@ WebCore::DestinationColorSpace WebViewImpl::colorSpace() if (!m_colorSpace) m_colorSpace = [NSColorSpace sRGBColorSpace]; } @@ -12210,7 +12209,7 @@ index 921e196026cc651de65cd7644c8ae22cf82a9bde..9b5c47dd840f799a88f276ccc758aeb0 ASSERT(m_colorSpace); return WebCore::DestinationColorSpace { [m_colorSpace CGColorSpace] }; -@@ -4624,6 +4629,18 @@ static RetainPtr takeWindowSnapshot(CGSWindowID windowID, bool captu +@@ -4625,6 +4630,18 @@ static RetainPtr takeWindowSnapshot(CGSWindowID windowID, bool captu return adoptCF(CGWindowListCreateImage(CGRectNull, kCGWindowListOptionIncludingWindow, windowID, imageOptions)); } @@ -12386,7 +12385,7 @@ index b23a45ff7d313317d8ba64fb430ebba3b6adef71..8419b69c5e278cf88a3ab6b98c335edd } // namespace WebKit diff --git a/Source/WebKit/UIProcess/Downloads/DownloadProxy.cpp b/Source/WebKit/UIProcess/Downloads/DownloadProxy.cpp -index 7f5868577fd5bb251bd9eb25f2edeaa225ee0845..b7a08b3876921495afc88de35960803ecdb9e2f1 100644 +index 7f5868577fd5bb251bd9eb25f2edeaa225ee0845..9894d5fcd9ee69ecdbdc5fc58a2d99779ec8794f 100644 --- a/Source/WebKit/UIProcess/Downloads/DownloadProxy.cpp +++ b/Source/WebKit/UIProcess/Downloads/DownloadProxy.cpp @@ -42,8 +42,10 @@ @@ -12404,7 +12403,7 @@ index 7f5868577fd5bb251bd9eb25f2edeaa225ee0845..b7a08b3876921495afc88de35960803e , m_request(resourceRequest) , m_originatingPage(originatingPage) , m_frameInfo(API::FrameInfo::create(FrameInfoData { frameInfoData }, originatingPage)) -+ , m_uuid(createCanonicalUUIDString()) ++ , m_uuid(createVersion4UUIDString()) { + if (auto* instrumentation = m_dataStore->downloadInstrumentation()) + instrumentation->downloadCreated(m_uuid, m_request, frameInfoData, originatingPage, this); @@ -12799,7 +12798,7 @@ index 0000000000000000000000000000000000000000..4ec8b96bbbddf8a7b042f53a8068754a +cairo_status_t cairo_image_surface_write_to_jpeg_mem(cairo_surface_t *sfc, unsigned char **data, size_t *len, int quality); diff --git a/Source/WebKit/UIProcess/Inspector/Agents/InspectorScreencastAgent.cpp b/Source/WebKit/UIProcess/Inspector/Agents/InspectorScreencastAgent.cpp new file mode 100644 -index 0000000000000000000000000000000000000000..d33d2423fd7ca230e40acecc581cfee611cd113c +index 0000000000000000000000000000000000000000..68f4dfb777dc4b51d4e3e2f3f849131d40dd9879 --- /dev/null +++ b/Source/WebKit/UIProcess/Inspector/Agents/InspectorScreencastAgent.cpp @@ -0,0 +1,302 @@ @@ -12963,7 +12962,7 @@ index 0000000000000000000000000000000000000000..d33d2423fd7ca230e40acecc581cfee6 + if (!m_encoder) + return makeUnexpected(errorString); + -+ m_currentScreencastID = createCanonicalUUIDString(); ++ m_currentScreencastID = createVersion4UUIDString(); + +#if PLATFORM(MAC) + m_encoder->setOffsetTop(toolbarHeight); @@ -15748,7 +15747,7 @@ index 7a14cfba15c103a2d4fe263fa49d25af3c396ec2..3ee0e154349661632799057c71f1d1f1 BOOL result = ::CreateProcess(0, commandLine.data(), 0, 0, true, 0, 0, 0, &startupInfo, &processInformation); diff --git a/Source/WebKit/UIProcess/PageClient.h b/Source/WebKit/UIProcess/PageClient.h -index 0fc6187a4fc034b6246bf8cd1a2bb4b88c97a9dd..e8a32c134bd00a6ae933ddd2ba43691c9439b814 100644 +index 2e5f6073c7ed8eefe6cbf847318e8e4aed40382e..0c6327776cae234141a017f33d439977bb4a8969 100644 --- a/Source/WebKit/UIProcess/PageClient.h +++ b/Source/WebKit/UIProcess/PageClient.h @@ -324,6 +324,11 @@ public: @@ -16795,7 +16794,7 @@ index 0000000000000000000000000000000000000000..48c9ccc420c1b4ae3259e1d5ba17fd8f + +} // namespace WebKit diff --git a/Source/WebKit/UIProcess/WebPageProxy.cpp b/Source/WebKit/UIProcess/WebPageProxy.cpp -index c42e1cbd9beaeb0cfaae04b41c0b4f7cad970cb1..d1da4786256007849cedf1b4508af179645509cf 100644 +index e49935c325f69f343440caa0add7bffe1c005282..37aa17314a303faf69f2114fe7021f6bd3afe67f 100644 --- a/Source/WebKit/UIProcess/WebPageProxy.cpp +++ b/Source/WebKit/UIProcess/WebPageProxy.cpp @@ -248,6 +248,9 @@ @@ -17315,7 +17314,7 @@ index c42e1cbd9beaeb0cfaae04b41c0b4f7cad970cb1..d1da4786256007849cedf1b4508af179 // and make it one UIClient call that calls the completionHandler with false // if there is no delegate instead of returning the completionHandler diff --git a/Source/WebKit/UIProcess/WebPageProxy.h b/Source/WebKit/UIProcess/WebPageProxy.h -index b2577687d9f8da7823141cac7fbcc42fba2b4e85..8eb1f671ec6396971ca71142798408e5dc8ddcce 100644 +index 507eac8a9652ae0fe0a13b226deff882dec38f31..93e17bebb8f02a6cd14e45ab2934d492982b8f2b 100644 --- a/Source/WebKit/UIProcess/WebPageProxy.h +++ b/Source/WebKit/UIProcess/WebPageProxy.h @@ -39,6 +39,7 @@ @@ -17512,10 +17511,10 @@ index 15cd0e3d5968bc6617ea5c4a28f017a114dab95b..c3d27602c67eb6740180dd5c679e4205 DidPerformDragOperation(bool handled) #endif diff --git a/Source/WebKit/UIProcess/WebProcessPool.cpp b/Source/WebKit/UIProcess/WebProcessPool.cpp -index 66d49fac3ea64159b1c824a20fee419f70de3457..311a06964cf2ca6c1c6adbab5c59b4493031fbfd 100644 +index afc23ee53f12842193d2eaef20f25962eed73fa2..a31a99922b3f8076a3825eeeb3d8965adde790be 100644 --- a/Source/WebKit/UIProcess/WebProcessPool.cpp +++ b/Source/WebKit/UIProcess/WebProcessPool.cpp -@@ -539,6 +539,14 @@ void WebProcessPool::establishWorkerContextConnectionToNetworkProcess(NetworkPro +@@ -539,6 +539,14 @@ void WebProcessPool::establishServiceWorkerContextConnectionToNetworkProcess(Net // Arbitrarily choose the first process pool to host the service worker process. auto* processPool = processPools()[0]; @@ -17546,7 +17545,7 @@ index 66d49fac3ea64159b1c824a20fee419f70de3457..311a06964cf2ca6c1c6adbab5c59b449 parameters.urlSchemesRegisteredAsEmptyDocument = copyToVector(m_schemesToRegisterAsEmptyDocument); parameters.urlSchemesRegisteredAsSecure = copyToVector(LegacyGlobalSettings::singleton().schemesToRegisterAsSecure()); diff --git a/Source/WebKit/UIProcess/WebProcessProxy.cpp b/Source/WebKit/UIProcess/WebProcessProxy.cpp -index 3bbe03a7dae2ed6779468332c0c45c7430bd857b..e08178580e5a890867c704a9c9193c7ff5004bec 100644 +index 057d4992418a0043d84c59d7b6e52f9e02658a71..2329d11783b07a426b39f04e1544832e8db01c93 100644 --- a/Source/WebKit/UIProcess/WebProcessProxy.cpp +++ b/Source/WebKit/UIProcess/WebProcessProxy.cpp @@ -143,6 +143,11 @@ HashMap& WebProcessProxy::allProcesses() @@ -17562,7 +17561,7 @@ index 3bbe03a7dae2ed6779468332c0c45c7430bd857b..e08178580e5a890867c704a9c9193c7f { return allProcesses().get(identifier); diff --git a/Source/WebKit/UIProcess/WebProcessProxy.h b/Source/WebKit/UIProcess/WebProcessProxy.h -index f514b9916ad4082a7f071f657378fef3ed22a831..7ff2168724c20bbacbdb597ed121985fca1201c3 100644 +index f8b795b1d343535e8092e01dbab379af33461dbe..cb4bf4fdab5aeced74e054cb81636911dbd839a7 100644 --- a/Source/WebKit/UIProcess/WebProcessProxy.h +++ b/Source/WebKit/UIProcess/WebProcessProxy.h @@ -143,6 +143,7 @@ public: @@ -18305,7 +18304,7 @@ index 0000000000000000000000000000000000000000..d0f9827544994e450e24e3f7a427c35e + +} // namespace WebKit diff --git a/Source/WebKit/UIProcess/ios/PageClientImplIOS.mm b/Source/WebKit/UIProcess/ios/PageClientImplIOS.mm -index 92126cdc69a7fd3cdae6aa0f4be8743e2b0c70b2..d64a10ca21bf43961ab35992763dc148378df3b3 100644 +index 0ec2088fabdf470899fd0359af5cb97e68d5f4a2..8aa97e9356a933c47e639b918e7dc702f91b91f7 100644 --- a/Source/WebKit/UIProcess/ios/PageClientImplIOS.mm +++ b/Source/WebKit/UIProcess/ios/PageClientImplIOS.mm @@ -437,6 +437,8 @@ IntRect PageClientImpl::rootViewToAccessibilityScreen(const IntRect& rect) @@ -19630,10 +19629,10 @@ index 0000000000000000000000000000000000000000..c3d7cacea987ba2b094d5022c670705e + +} // namespace WebKit diff --git a/Source/WebKit/WebKit.xcodeproj/project.pbxproj b/Source/WebKit/WebKit.xcodeproj/project.pbxproj -index 779118bd2f3e032ca87c074d2e6b0dbe549b67eb..a341f24c8b03998aed561bdce5dcdccd40398b2d 100644 +index dc02f89412df46f85006a3460b7f4ccae85d01d1..4cc2af1d3e2257073f7810780daecce23464b44b 100644 --- a/Source/WebKit/WebKit.xcodeproj/project.pbxproj +++ b/Source/WebKit/WebKit.xcodeproj/project.pbxproj -@@ -1238,6 +1238,7 @@ +@@ -1242,6 +1242,7 @@ 5CABDC8722C40FED001EDE8E /* APIMessageListener.h in Headers */ = {isa = PBXBuildFile; fileRef = 5CABDC8322C40FA7001EDE8E /* APIMessageListener.h */; }; 5CADDE05215046BD0067D309 /* WKWebProcess.h in Headers */ = {isa = PBXBuildFile; fileRef = 5C74300E21500492004BFA17 /* WKWebProcess.h */; settings = {ATTRIBUTES = (Private, ); }; }; 5CAECB6627465AE400AB78D0 /* UnifiedSource115.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5CAECB5E27465AE300AB78D0 /* UnifiedSource115.cpp */; }; @@ -19641,7 +19640,7 @@ index 779118bd2f3e032ca87c074d2e6b0dbe549b67eb..a341f24c8b03998aed561bdce5dcdccd 5CAF7AA726F93AB00003F19E /* adattributiond.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5CAF7AA526F93A950003F19E /* adattributiond.cpp */; }; 5CAFDE452130846300B1F7E1 /* _WKInspector.h in Headers */ = {isa = PBXBuildFile; fileRef = 5CAFDE422130843500B1F7E1 /* _WKInspector.h */; settings = {ATTRIBUTES = (Private, ); }; }; 5CAFDE472130846A00B1F7E1 /* _WKInspectorInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = 5CAFDE442130843600B1F7E1 /* _WKInspectorInternal.h */; }; -@@ -1933,6 +1934,18 @@ +@@ -1937,6 +1938,18 @@ DF0C5F28252ECB8E00D921DB /* WKDownload.h in Headers */ = {isa = PBXBuildFile; fileRef = DF0C5F24252ECB8D00D921DB /* WKDownload.h */; settings = {ATTRIBUTES = (Public, ); }; }; DF0C5F2A252ECB8E00D921DB /* WKDownloadDelegate.h in Headers */ = {isa = PBXBuildFile; fileRef = DF0C5F26252ECB8E00D921DB /* WKDownloadDelegate.h */; settings = {ATTRIBUTES = (Public, ); }; }; DF0C5F2B252ED44000D921DB /* WKDownloadInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = DF0C5F25252ECB8E00D921DB /* WKDownloadInternal.h */; }; @@ -19660,9 +19659,9 @@ index 779118bd2f3e032ca87c074d2e6b0dbe549b67eb..a341f24c8b03998aed561bdce5dcdccd DF462E0F23F22F5500EFF35F /* WKHTTPCookieStorePrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = DF462E0E23F22F5300EFF35F /* WKHTTPCookieStorePrivate.h */; settings = {ATTRIBUTES = (Private, ); }; }; DF462E1223F338BE00EFF35F /* WKContentWorldPrivate.h in Headers */ = {isa = PBXBuildFile; fileRef = DF462E1123F338AD00EFF35F /* WKContentWorldPrivate.h */; settings = {ATTRIBUTES = (Private, ); }; }; DF84CEE4249AA24D009096F6 /* WKPDFHUDView.mm in Sources */ = {isa = PBXBuildFile; fileRef = DF84CEE2249AA21F009096F6 /* WKPDFHUDView.mm */; }; -@@ -1996,6 +2009,9 @@ - E5CBA76827A318E100DF7858 /* UnifiedSource117.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E5CBA76227A3187900DF7858 /* UnifiedSource117.cpp */; }; - E5DEFA6826F8F42600AB68DB /* PhotosUISPI.h in Headers */ = {isa = PBXBuildFile; fileRef = E5DEFA6726F8F42600AB68DB /* PhotosUISPI.h */; }; +@@ -2007,6 +2020,9 @@ + EBA8D3B627A5E33F00CB7900 /* MockPushServiceConnection.mm in Sources */ = {isa = PBXBuildFile; fileRef = EBA8D3B027A5E33F00CB7900 /* MockPushServiceConnection.mm */; }; + EBA8D3B727A5E33F00CB7900 /* PushServiceConnection.mm in Sources */ = {isa = PBXBuildFile; fileRef = EBA8D3B127A5E33F00CB7900 /* PushServiceConnection.mm */; }; ED82A7F2128C6FAF004477B3 /* WKBundlePageOverlay.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A22F0FF1289FCD90085E74F /* WKBundlePageOverlay.h */; settings = {ATTRIBUTES = (Private, ); }; }; + F303B849249A8D640031DE5C /* ScreencastEncoder.h in Headers */ = {isa = PBXBuildFile; fileRef = F303B848249A8D3A0031DE5C /* ScreencastEncoder.h */; }; + F33C7AC7249AD79C0018BE41 /* libwebrtc.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = F33C7AC6249AD79C0018BE41 /* libwebrtc.dylib */; }; @@ -19670,7 +19669,7 @@ index 779118bd2f3e032ca87c074d2e6b0dbe549b67eb..a341f24c8b03998aed561bdce5dcdccd F409BA181E6E64BC009DA28E /* WKDragDestinationAction.h in Headers */ = {isa = PBXBuildFile; fileRef = F409BA171E6E64B3009DA28E /* WKDragDestinationAction.h */; settings = {ATTRIBUTES = (Private, ); }; }; F4299507270E234D0032298B /* StreamMessageReceiver.h in Headers */ = {isa = PBXBuildFile; fileRef = F4299506270E234C0032298B /* StreamMessageReceiver.h */; }; F42D634122A0EFDF00D2FB3A /* WebAutocorrectionData.h in Headers */ = {isa = PBXBuildFile; fileRef = F42D633F22A0EFD300D2FB3A /* WebAutocorrectionData.h */; }; -@@ -4899,6 +4915,7 @@ +@@ -4920,6 +4936,7 @@ 5CABDC8522C40FCC001EDE8E /* WKMessageListener.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WKMessageListener.h; sourceTree = ""; }; 5CADDE0D2151AA010067D309 /* AuthenticationChallengeDisposition.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AuthenticationChallengeDisposition.h; sourceTree = ""; }; 5CAECB5E27465AE300AB78D0 /* UnifiedSource115.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = UnifiedSource115.cpp; path = "DerivedSources/WebKit/unified-sources/UnifiedSource115.cpp"; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -19678,7 +19677,7 @@ index 779118bd2f3e032ca87c074d2e6b0dbe549b67eb..a341f24c8b03998aed561bdce5dcdccd 5CAF7AA426F93A750003F19E /* adattributiond */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = adattributiond; sourceTree = BUILT_PRODUCTS_DIR; }; 5CAF7AA526F93A950003F19E /* adattributiond.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = adattributiond.cpp; sourceTree = ""; }; 5CAF7AA626F93AA50003F19E /* adattributiond.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = adattributiond.xcconfig; sourceTree = ""; }; -@@ -6311,6 +6328,19 @@ +@@ -6332,6 +6349,19 @@ DF0C5F24252ECB8D00D921DB /* WKDownload.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WKDownload.h; sourceTree = ""; }; DF0C5F25252ECB8E00D921DB /* WKDownloadInternal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WKDownloadInternal.h; sourceTree = ""; }; DF0C5F26252ECB8E00D921DB /* WKDownloadDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WKDownloadDelegate.h; sourceTree = ""; }; @@ -19698,7 +19697,7 @@ index 779118bd2f3e032ca87c074d2e6b0dbe549b67eb..a341f24c8b03998aed561bdce5dcdccd DF462E0E23F22F5300EFF35F /* WKHTTPCookieStorePrivate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WKHTTPCookieStorePrivate.h; sourceTree = ""; }; DF462E1123F338AD00EFF35F /* WKContentWorldPrivate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WKContentWorldPrivate.h; sourceTree = ""; }; DF58C6311371AC5800F9A37C /* NativeWebWheelEvent.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NativeWebWheelEvent.h; sourceTree = ""; }; -@@ -6442,6 +6472,14 @@ +@@ -6470,6 +6500,14 @@ ECA680D31E6904B500731D20 /* ExtraPrivateSymbolsForTAPI.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ExtraPrivateSymbolsForTAPI.h; sourceTree = ""; }; ECBFC1DB1E6A4D66000300C7 /* ExtraPublicSymbolsForTAPI.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ExtraPublicSymbolsForTAPI.h; sourceTree = ""; }; F036978715F4BF0500C3A80E /* WebColorPicker.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WebColorPicker.cpp; sourceTree = ""; }; @@ -19713,7 +19712,7 @@ index 779118bd2f3e032ca87c074d2e6b0dbe549b67eb..a341f24c8b03998aed561bdce5dcdccd F409BA171E6E64B3009DA28E /* WKDragDestinationAction.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WKDragDestinationAction.h; sourceTree = ""; }; F40D1B68220BDC0F00B49A01 /* WebAutocorrectionContext.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = WebAutocorrectionContext.h; path = ios/WebAutocorrectionContext.h; sourceTree = ""; }; F41056612130699A0092281D /* APIAttachmentCocoa.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = APIAttachmentCocoa.mm; sourceTree = ""; }; -@@ -6586,6 +6624,7 @@ +@@ -6614,6 +6652,7 @@ 3766F9EF189A1244003CF19B /* QuartzCore.framework in Frameworks */, 37694525184FC6B600CDE21F /* Security.framework in Frameworks */, 37BEC4DD1948FC6A008B4286 /* WebCore.framework in Frameworks */, @@ -19721,7 +19720,7 @@ index 779118bd2f3e032ca87c074d2e6b0dbe549b67eb..a341f24c8b03998aed561bdce5dcdccd ); runOnlyForDeploymentPostprocessing = 0; }; -@@ -8655,6 +8694,7 @@ +@@ -8685,6 +8724,7 @@ 37C4C08318149C2A003688B9 /* Cocoa */ = { isa = PBXGroup; children = ( @@ -19729,7 +19728,7 @@ index 779118bd2f3e032ca87c074d2e6b0dbe549b67eb..a341f24c8b03998aed561bdce5dcdccd 1A43E826188F38E2009E4D30 /* Deprecated */, 37A5E01218BBF937000A081E /* _WKActivatedElementInfo.h */, 37A5E01118BBF937000A081E /* _WKActivatedElementInfo.mm */, -@@ -9792,6 +9832,7 @@ +@@ -9831,6 +9871,7 @@ children = ( DDE992F4278D06D900F60D26 /* libWebKitAdditions.a */, 57A9FF15252C6AEF006A2040 /* libWTF.a */, @@ -19737,7 +19736,7 @@ index 779118bd2f3e032ca87c074d2e6b0dbe549b67eb..a341f24c8b03998aed561bdce5dcdccd 5750F32A2032D4E500389347 /* LocalAuthentication.framework */, 570DAAB0230273D200E8FC04 /* NearField.framework */, 51F7BB7E274564A100C45A72 /* Security.framework */, -@@ -10298,6 +10339,12 @@ +@@ -10343,6 +10384,12 @@ children = ( 9197940423DBC4BB00257892 /* InspectorBrowserAgent.cpp */, 9197940323DBC4BB00257892 /* InspectorBrowserAgent.h */, @@ -19750,7 +19749,7 @@ index 779118bd2f3e032ca87c074d2e6b0dbe549b67eb..a341f24c8b03998aed561bdce5dcdccd ); path = Agents; sourceTree = ""; -@@ -10306,6 +10353,7 @@ +@@ -10351,6 +10398,7 @@ isa = PBXGroup; children = ( A5D3504D1D78F0D2005124A9 /* RemoteWebInspectorUIProxyMac.mm */, @@ -19758,7 +19757,7 @@ index 779118bd2f3e032ca87c074d2e6b0dbe549b67eb..a341f24c8b03998aed561bdce5dcdccd 1CA8B935127C774E00576C2B /* WebInspectorUIProxyMac.mm */, 99A7ACE326012919006D57FD /* WKInspectorResourceURLSchemeHandler.h */, 99A7ACE42601291A006D57FD /* WKInspectorResourceURLSchemeHandler.mm */, -@@ -10854,6 +10902,12 @@ +@@ -10899,6 +10947,12 @@ BC032DC310F438260058C15A /* UIProcess */ = { isa = PBXGroup; children = ( @@ -19771,7 +19770,7 @@ index 779118bd2f3e032ca87c074d2e6b0dbe549b67eb..a341f24c8b03998aed561bdce5dcdccd BC032DC410F4387C0058C15A /* API */, 512F588D12A8836F00629530 /* Authentication */, 9955A6E81C79809000EB6A93 /* Automation */, -@@ -11159,6 +11213,7 @@ +@@ -11204,6 +11258,7 @@ BC0C376610F807660076D7CB /* C */ = { isa = PBXGroup; children = ( @@ -19779,7 +19778,7 @@ index 779118bd2f3e032ca87c074d2e6b0dbe549b67eb..a341f24c8b03998aed561bdce5dcdccd 5123CF18133D25E60056F800 /* cg */, 6EE849C41368D9040038D481 /* mac */, BCB63477116BF10600603215 /* WebKit2_C.h */, -@@ -11747,6 +11802,11 @@ +@@ -11792,6 +11847,11 @@ BCCF085C113F3B7500C650C5 /* mac */ = { isa = PBXGroup; children = ( @@ -19791,7 +19790,7 @@ index 779118bd2f3e032ca87c074d2e6b0dbe549b67eb..a341f24c8b03998aed561bdce5dcdccd B878B613133428DC006888E9 /* CorrectionPanel.h */, B878B614133428DC006888E9 /* CorrectionPanel.mm */, 07EF07592745A8160066EA04 /* DisplayCaptureSessionManager.h */, -@@ -12663,6 +12723,7 @@ +@@ -12708,6 +12768,7 @@ 99788ACB1F421DDA00C08000 /* _WKAutomationSessionConfiguration.h in Headers */, 990D28AC1C6420CF00986977 /* _WKAutomationSessionDelegate.h in Headers */, 990D28B11C65208D00986977 /* _WKAutomationSessionInternal.h in Headers */, @@ -19799,7 +19798,7 @@ index 779118bd2f3e032ca87c074d2e6b0dbe549b67eb..a341f24c8b03998aed561bdce5dcdccd 5C4609E7224317B4009943C2 /* _WKContentRuleListAction.h in Headers */, 5C4609E8224317BB009943C2 /* _WKContentRuleListActionInternal.h in Headers */, 1A5704F81BE01FF400874AF1 /* _WKContextMenuElementInfo.h in Headers */, -@@ -12971,6 +13032,7 @@ +@@ -13018,6 +13079,7 @@ 1A14F8E21D74C834006CBEC6 /* FrameInfoData.h in Headers */, 1AE00D611831792100087DD7 /* FrameLoadState.h in Headers */, 5C121E842410208D00486F9B /* FrameTreeNodeData.h in Headers */, @@ -19807,7 +19806,7 @@ index 779118bd2f3e032ca87c074d2e6b0dbe549b67eb..a341f24c8b03998aed561bdce5dcdccd 2D4AF0892044C3C4006C8817 /* FrontBoardServicesSPI.h in Headers */, CD78E1151DB7D7ED0014A2DE /* FullscreenClient.h in Headers */, CD19D2EA2046406F0017074A /* FullscreenTouchSecheuristic.h in Headers */, -@@ -12986,6 +13048,7 @@ +@@ -13033,6 +13095,7 @@ 410F0D4C2701EFF900F96DFC /* GPUProcessConnectionInitializationParameters.h in Headers */, 4614F13225DED875007006E7 /* GPUProcessConnectionParameters.h in Headers */, 2DA049B8180CCD0A00AAFA9E /* GraphicsLayerCARemote.h in Headers */, @@ -19815,7 +19814,7 @@ index 779118bd2f3e032ca87c074d2e6b0dbe549b67eb..a341f24c8b03998aed561bdce5dcdccd C0CE72AD1247E78D00BC0EC4 /* HandleMessage.h in Headers */, 1AC75A1B1B3368270056745B /* HangDetectionDisabler.h in Headers */, 57AC8F50217FEED90055438C /* HidConnection.h in Headers */, -@@ -13132,6 +13195,7 @@ +@@ -13180,6 +13243,7 @@ 413075AC1DE85F370039EC69 /* NetworkRTCMonitor.h in Headers */, 41DC45961E3D6E2200B11F51 /* NetworkRTCProvider.h in Headers */, 5C20CBA01BB1ECD800895BB1 /* NetworkSession.h in Headers */, @@ -19823,7 +19822,7 @@ index 779118bd2f3e032ca87c074d2e6b0dbe549b67eb..a341f24c8b03998aed561bdce5dcdccd 532159551DBAE7290054AA3C /* NetworkSessionCocoa.h in Headers */, 417915B92257046F00D6F97E /* NetworkSocketChannel.h in Headers */, 93085DE026E5BCFD000EC6A7 /* NetworkStorageManager.h in Headers */, -@@ -13197,6 +13261,7 @@ +@@ -13245,6 +13309,7 @@ BC1A7C581136E19C00FB7167 /* ProcessLauncher.h in Headers */, 463FD4821EB94EC000A2982C /* ProcessTerminationReason.h in Headers */, 86E67A251910B9D100004AB7 /* ProcessThrottler.h in Headers */, @@ -19831,7 +19830,7 @@ index 779118bd2f3e032ca87c074d2e6b0dbe549b67eb..a341f24c8b03998aed561bdce5dcdccd 83048AE61ACA45DC0082C832 /* ProcessThrottlerClient.h in Headers */, 2D279E1926955768004B3EEB /* PrototypeToolsSPI.h in Headers */, 517B5F81275E97B6002DC22D /* PushAppBundle.h in Headers */, -@@ -13222,6 +13287,7 @@ +@@ -13271,6 +13336,7 @@ CDAC20CA23FC2F750021DEE3 /* RemoteCDMInstanceSession.h in Headers */, CDAC20C923FC2F750021DEE3 /* RemoteCDMInstanceSessionIdentifier.h in Headers */, F451C0FE2703B263002BA03B /* RemoteDisplayListRecorderProxy.h in Headers */, @@ -19839,7 +19838,7 @@ index 779118bd2f3e032ca87c074d2e6b0dbe549b67eb..a341f24c8b03998aed561bdce5dcdccd 2D47B56D1810714E003A3AEE /* RemoteLayerBackingStore.h in Headers */, 2DDF731518E95060004F5A66 /* RemoteLayerBackingStoreCollection.h in Headers */, 1AB16AEA164B3A8800290D62 /* RemoteLayerTreeContext.h in Headers */, -@@ -13557,6 +13623,7 @@ +@@ -13608,6 +13674,7 @@ A543E30D215C8A9000279CD9 /* WebPageInspectorTargetController.h in Headers */, A543E307215AD13700279CD9 /* WebPageInspectorTargetFrontendChannel.h in Headers */, C0CE72A11247E71D00BC0EC4 /* WebPageMessages.h in Headers */, @@ -19847,7 +19846,7 @@ index 779118bd2f3e032ca87c074d2e6b0dbe549b67eb..a341f24c8b03998aed561bdce5dcdccd 2D5C9D0619C81D8F00B3C5C1 /* WebPageOverlay.h in Headers */, 46C392292316EC4D008EED9B /* WebPageProxyIdentifier.h in Headers */, BCBD3915125BB1A800D2C29F /* WebPageProxyMessages.h in Headers */, -@@ -13693,6 +13760,7 @@ +@@ -13746,6 +13813,7 @@ BCD25F1711D6BDE100169B0E /* WKBundleFrame.h in Headers */, BCF049E611FE20F600F86A58 /* WKBundleFramePrivate.h in Headers */, BC49862F124D18C100D834E1 /* WKBundleHitTestResult.h in Headers */, @@ -19855,7 +19854,7 @@ index 779118bd2f3e032ca87c074d2e6b0dbe549b67eb..a341f24c8b03998aed561bdce5dcdccd BC204EF211C83EC8008F3375 /* WKBundleInitialize.h in Headers */, 65B86F1E12F11DE300B7DD8A /* WKBundleInspector.h in Headers */, 1A8B66B41BC45B010082DF77 /* WKBundleMac.h in Headers */, -@@ -13746,6 +13814,7 @@ +@@ -13799,6 +13867,7 @@ 5C795D71229F3757003FF1C4 /* WKContextMenuElementInfoPrivate.h in Headers */, 51A555F6128C6C47009ABCEC /* WKContextMenuItem.h in Headers */, 51A55601128C6D92009ABCEC /* WKContextMenuItemTypes.h in Headers */, @@ -19863,7 +19862,7 @@ index 779118bd2f3e032ca87c074d2e6b0dbe549b67eb..a341f24c8b03998aed561bdce5dcdccd A1EA02381DABFF7E0096021F /* WKContextMenuListener.h in Headers */, BCC938E11180DE440085E5FE /* WKContextPrivate.h in Headers */, 9FB5F395169E6A80002C25BF /* WKContextPrivateMac.h in Headers */, -@@ -13902,6 +13971,7 @@ +@@ -13955,6 +14024,7 @@ 1AB8A1F818400BB800E9AE69 /* WKPageContextMenuClient.h in Headers */, 8372DB251A674C8F00C697C5 /* WKPageDiagnosticLoggingClient.h in Headers */, 1AB8A1F418400B8F00E9AE69 /* WKPageFindClient.h in Headers */, @@ -19871,7 +19870,7 @@ index 779118bd2f3e032ca87c074d2e6b0dbe549b67eb..a341f24c8b03998aed561bdce5dcdccd 1AB8A1F618400B9D00E9AE69 /* WKPageFindMatchesClient.h in Headers */, 1AB8A1F018400B0000E9AE69 /* WKPageFormClient.h in Headers */, BC7B633712A45ABA00D174A4 /* WKPageGroup.h in Headers */, -@@ -15416,6 +15486,8 @@ +@@ -15471,6 +15541,8 @@ C1A152D724E5A29A00978C8B /* HandleXPCEndpointMessages.mm in Sources */, 2749F6442146561B008380BF /* InjectedBundleNodeHandle.cpp in Sources */, 2749F6452146561E008380BF /* InjectedBundleRangeHandle.cpp in Sources */, @@ -19880,7 +19879,7 @@ index 779118bd2f3e032ca87c074d2e6b0dbe549b67eb..a341f24c8b03998aed561bdce5dcdccd C14D37FE24ACE086007FF014 /* LaunchServicesDatabaseManager.mm in Sources */, C1710CF724AA643200D7C112 /* LaunchServicesDatabaseObserver.mm in Sources */, 2984F588164BA095004BC0C6 /* LegacyCustomProtocolManagerMessageReceiver.cpp in Sources */, -@@ -15742,6 +15814,8 @@ +@@ -15799,6 +15871,8 @@ 51F060E11654318500F3282F /* WebMDNSRegisterMessageReceiver.cpp in Sources */, 31BA924D148831260062EDB5 /* WebNotificationManagerMessageReceiver.cpp in Sources */, 2DF6FE52212E110900469030 /* WebPage.cpp in Sources */, @@ -19890,10 +19889,10 @@ index 779118bd2f3e032ca87c074d2e6b0dbe549b67eb..a341f24c8b03998aed561bdce5dcdccd BCBD3914125BB1A800D2C29F /* WebPageProxyMessageReceiver.cpp in Sources */, 7CE9CE101FA0767A000177DE /* WebPageUpdatePreferences.cpp in Sources */, diff --git a/Source/WebKit/WebProcess/Network/WebLoaderStrategy.cpp b/Source/WebKit/WebProcess/Network/WebLoaderStrategy.cpp -index 1bd6f347eef54b00eebaa453fe778e74f877dd35..f88f8142be023270ba2194af087c36a12954d961 100644 +index d85f495a108af473849e0be7a16adcb6d7ba2157..ab6f199f645d5c0339f729d3a3f547443ada2c3d 100644 --- a/Source/WebKit/WebProcess/Network/WebLoaderStrategy.cpp +++ b/Source/WebKit/WebProcess/Network/WebLoaderStrategy.cpp -@@ -232,6 +232,11 @@ void WebLoaderStrategy::scheduleLoad(ResourceLoader& resourceLoader, CachedResou +@@ -231,6 +231,11 @@ void WebLoaderStrategy::scheduleLoad(ResourceLoader& resourceLoader, CachedResou } #endif @@ -19905,7 +19904,7 @@ index 1bd6f347eef54b00eebaa453fe778e74f877dd35..f88f8142be023270ba2194af087c36a1 if (!tryLoadingUsingURLSchemeHandler(resourceLoader, trackingParameters)) { WEBLOADERSTRATEGY_RELEASE_LOG("scheduleLoad: URL will be scheduled with the NetworkProcess"); -@@ -294,7 +299,8 @@ static void addParametersShared(const Frame* frame, NetworkResourceLoadParameter +@@ -298,7 +303,8 @@ static void addParametersShared(const Frame* frame, NetworkResourceLoadParameter } } @@ -19915,7 +19914,7 @@ index 1bd6f347eef54b00eebaa453fe778e74f877dd35..f88f8142be023270ba2194af087c36a1 { auto identifier = resourceLoader.identifier(); ASSERT(identifier); -@@ -310,7 +316,7 @@ void WebLoaderStrategy::scheduleLoadFromNetworkProcess(ResourceLoader& resourceL +@@ -314,7 +320,7 @@ void WebLoaderStrategy::scheduleLoadFromNetworkProcess(ResourceLoader& resourceL RunLoop::main().dispatch([resourceLoader = Ref { resourceLoader }] { resourceLoader->didFail(resourceLoader->blockedError()); }); @@ -19924,7 +19923,7 @@ index 1bd6f347eef54b00eebaa453fe778e74f877dd35..f88f8142be023270ba2194af087c36a1 } } -@@ -320,7 +326,6 @@ void WebLoaderStrategy::scheduleLoadFromNetworkProcess(ResourceLoader& resourceL +@@ -324,7 +330,6 @@ void WebLoaderStrategy::scheduleLoadFromNetworkProcess(ResourceLoader& resourceL LOG(NetworkScheduling, "(WebProcess) WebLoaderStrategy::scheduleLoad, url '%s' will be scheduled with the NetworkProcess with priority %d, storedCredentialsPolicy %i", resourceLoader.url().string().latin1().data(), static_cast(resourceLoader.request().priority()), (int)storedCredentialsPolicy); @@ -19932,7 +19931,7 @@ index 1bd6f347eef54b00eebaa453fe778e74f877dd35..f88f8142be023270ba2194af087c36a1 loadParameters.identifier = identifier; loadParameters.webPageProxyID = trackingParameters.webPageProxyID; loadParameters.webPageID = trackingParameters.pageID; -@@ -405,14 +410,11 @@ void WebLoaderStrategy::scheduleLoadFromNetworkProcess(ResourceLoader& resourceL +@@ -409,14 +414,11 @@ void WebLoaderStrategy::scheduleLoadFromNetworkProcess(ResourceLoader& resourceL if (loadParameters.options.mode != FetchOptions::Mode::Navigate) { ASSERT(loadParameters.sourceOrigin); @@ -19950,7 +19949,7 @@ index 1bd6f347eef54b00eebaa453fe778e74f877dd35..f88f8142be023270ba2194af087c36a1 loadParameters.isMainFrameNavigation = resourceLoader.frame() && resourceLoader.frame()->isMainFrame() && resourceLoader.options().mode == FetchOptions::Mode::Navigate; if (loadParameters.isMainFrameNavigation && document) -@@ -451,6 +453,17 @@ void WebLoaderStrategy::scheduleLoadFromNetworkProcess(ResourceLoader& resourceL +@@ -455,6 +457,17 @@ void WebLoaderStrategy::scheduleLoadFromNetworkProcess(ResourceLoader& resourceL } ASSERT((loadParameters.webPageID && loadParameters.webFrameID) || loadParameters.clientCredentialPolicy == ClientCredentialPolicy::CannotAskClientForCredentials); @@ -19968,7 +19967,7 @@ index 1bd6f347eef54b00eebaa453fe778e74f877dd35..f88f8142be023270ba2194af087c36a1 std::optional existingNetworkResourceLoadIdentifierToResume; if (loadParameters.isMainFrameNavigation) -@@ -465,7 +478,7 @@ void WebLoaderStrategy::scheduleLoadFromNetworkProcess(ResourceLoader& resourceL +@@ -469,7 +482,7 @@ void WebLoaderStrategy::scheduleLoadFromNetworkProcess(ResourceLoader& resourceL } auto loader = WebResourceLoader::create(resourceLoader, trackingParameters); @@ -19977,7 +19976,7 @@ index 1bd6f347eef54b00eebaa453fe778e74f877dd35..f88f8142be023270ba2194af087c36a1 } void WebLoaderStrategy::scheduleInternallyFailedLoad(WebCore::ResourceLoader& resourceLoader) -@@ -872,7 +885,7 @@ void WebLoaderStrategy::didFinishPreconnection(WebCore::ResourceLoaderIdentifier +@@ -876,7 +889,7 @@ void WebLoaderStrategy::didFinishPreconnection(WebCore::ResourceLoaderIdentifier bool WebLoaderStrategy::isOnLine() const { @@ -19986,7 +19985,7 @@ index 1bd6f347eef54b00eebaa453fe778e74f877dd35..f88f8142be023270ba2194af087c36a1 } void WebLoaderStrategy::addOnlineStateChangeListener(Function&& listener) -@@ -892,6 +905,11 @@ void WebLoaderStrategy::isResourceLoadFinished(CachedResource& resource, Complet +@@ -896,6 +909,11 @@ void WebLoaderStrategy::isResourceLoadFinished(CachedResource& resource, Complet void WebLoaderStrategy::setOnLineState(bool isOnLine) { @@ -19998,7 +19997,7 @@ index 1bd6f347eef54b00eebaa453fe778e74f877dd35..f88f8142be023270ba2194af087c36a1 if (m_isOnLine == isOnLine) return; -@@ -900,6 +918,12 @@ void WebLoaderStrategy::setOnLineState(bool isOnLine) +@@ -904,6 +922,12 @@ void WebLoaderStrategy::setOnLineState(bool isOnLine) listener(isOnLine); } @@ -20042,10 +20041,10 @@ index 2290d987c36f68245b08fb2b86319d4d5a68e4a3..f22b3a7c855918b11582dd1ea9be00b2 } // namespace WebKit diff --git a/Source/WebKit/WebProcess/Network/WebResourceLoader.cpp b/Source/WebKit/WebProcess/Network/WebResourceLoader.cpp -index eadd84730f11b773b0352dbaafe8ddacda876093..3d37ef89dcdd2c50bbfd15cbb9d56bcbcda3cce0 100644 +index efe2755ee12a7667bf7812f50bc8b42e5bae11fe..609082c4425ddc2b44e37c7355882b379b432998 100644 --- a/Source/WebKit/WebProcess/Network/WebResourceLoader.cpp +++ b/Source/WebKit/WebProcess/Network/WebResourceLoader.cpp -@@ -175,9 +175,6 @@ void WebResourceLoader::didReceiveResponse(const ResourceResponse& response, boo +@@ -191,9 +191,6 @@ void WebResourceLoader::didReceiveResponse(const ResourceResponse& response, Pri } m_coreLoader->didReceiveResponse(inspectorResponse, [this, protectedThis = WTFMove(protectedThis), interceptedRequestIdentifier, policyDecisionCompletionHandler = WTFMove(policyDecisionCompletionHandler), overrideData = WTFMove(overrideData)]() mutable { @@ -20055,7 +20054,7 @@ index eadd84730f11b773b0352dbaafe8ddacda876093..3d37ef89dcdd2c50bbfd15cbb9d56bcb if (!m_coreLoader || !m_coreLoader->identifier()) { m_interceptController.continueResponse(interceptedRequestIdentifier); return; -@@ -195,6 +192,8 @@ void WebResourceLoader::didReceiveResponse(const ResourceResponse& response, boo +@@ -211,6 +208,8 @@ void WebResourceLoader::didReceiveResponse(const ResourceResponse& response, Pri } }); }); @@ -20512,7 +20511,7 @@ index f127d64d005ab7b93875591b94a5899205e91579..df0de26e4dc449a0fbf93e7037444df4 uint64_t m_navigationID; }; diff --git a/Source/WebKit/WebProcess/WebPage/WebPage.cpp b/Source/WebKit/WebProcess/WebPage/WebPage.cpp -index 9b7a2504f5dd1f4cedd62112178ba005341a1444..fb0cea6377bf2d339ead4ace7ea4713e001bfbda 100644 +index 6548507869ceaf50d187ed693e6d917d23fd00f9..3b99c1e193987df3d7809d22880090029ef886b5 100644 --- a/Source/WebKit/WebProcess/WebPage/WebPage.cpp +++ b/Source/WebKit/WebProcess/WebPage/WebPage.cpp @@ -916,6 +916,9 @@ WebPage::WebPage(PageIdentifier pageID, WebPageCreationParameters&& parameters) @@ -20630,7 +20629,7 @@ index 9b7a2504f5dd1f4cedd62112178ba005341a1444..fb0cea6377bf2d339ead4ace7ea4713e } void WebPage::listenForLayoutMilestones(OptionSet milestones) -@@ -3303,6 +3312,104 @@ void WebPage::touchEvent(const WebTouchEvent& touchEvent) +@@ -3305,6 +3314,104 @@ void WebPage::touchEvent(const WebTouchEvent& touchEvent) send(Messages::WebPageProxy::DidReceiveEvent(static_cast(touchEvent.type()), handled)); } @@ -20735,7 +20734,7 @@ index 9b7a2504f5dd1f4cedd62112178ba005341a1444..fb0cea6377bf2d339ead4ace7ea4713e #endif void WebPage::cancelPointer(WebCore::PointerID pointerId, const WebCore::IntPoint& documentPoint) -@@ -3379,6 +3486,11 @@ void WebPage::sendMessageToTargetBackend(const String& targetId, const String& m +@@ -3381,6 +3488,11 @@ void WebPage::sendMessageToTargetBackend(const String& targetId, const String& m m_inspectorTargetController->sendMessageToTargetBackend(targetId, message); } @@ -20747,7 +20746,7 @@ index 9b7a2504f5dd1f4cedd62112178ba005341a1444..fb0cea6377bf2d339ead4ace7ea4713e void WebPage::insertNewlineInQuotedContent() { Ref frame = CheckedRef(m_page->focusController())->focusedOrMainFrame(); -@@ -3617,6 +3729,7 @@ void WebPage::didCompletePageTransition() +@@ -3619,6 +3731,7 @@ void WebPage::didCompletePageTransition() void WebPage::show() { send(Messages::WebPageProxy::ShowPage()); @@ -20755,7 +20754,7 @@ index 9b7a2504f5dd1f4cedd62112178ba005341a1444..fb0cea6377bf2d339ead4ace7ea4713e } void WebPage::setIsTakingSnapshotsForApplicationSuspension(bool isTakingSnapshotsForApplicationSuspension) -@@ -4436,7 +4549,7 @@ NotificationPermissionRequestManager* WebPage::notificationPermissionRequestMana +@@ -4439,7 +4552,7 @@ NotificationPermissionRequestManager* WebPage::notificationPermissionRequestMana #if ENABLE(DRAG_SUPPORT) @@ -20764,7 +20763,7 @@ index 9b7a2504f5dd1f4cedd62112178ba005341a1444..fb0cea6377bf2d339ead4ace7ea4713e void WebPage::performDragControllerAction(DragControllerAction action, const IntPoint& clientPosition, const IntPoint& globalPosition, OptionSet draggingSourceOperationMask, SelectionData&& selectionData, OptionSet flags) { if (!m_page) { -@@ -6796,6 +6909,9 @@ Ref WebPage::createDocumentLoader(Frame& frame, const ResourceRe +@@ -6799,6 +6912,9 @@ Ref WebPage::createDocumentLoader(Frame& frame, const ResourceRe WebsitePoliciesData::applyToDocumentLoader(WTFMove(*m_pendingWebsitePolicies), documentLoader); m_pendingWebsitePolicies = std::nullopt; } @@ -20775,7 +20774,7 @@ index 9b7a2504f5dd1f4cedd62112178ba005341a1444..fb0cea6377bf2d339ead4ace7ea4713e return documentLoader; diff --git a/Source/WebKit/WebProcess/WebPage/WebPage.h b/Source/WebKit/WebProcess/WebPage/WebPage.h -index 6c7923267959105d531c11e81bb3a9cad8186ea0..f637fe12945a37734eea227d60c5b05595aea212 100644 +index 67d48fed2995bc1a1171a9e995a6a7b6e7950170..1e2d18dc74d9eedef0f88904eae7cfa71cea2fee 100644 --- a/Source/WebKit/WebProcess/WebPage/WebPage.h +++ b/Source/WebKit/WebProcess/WebPage/WebPage.h @@ -122,6 +122,10 @@ typedef struct _AtkObject AtkObject; @@ -20789,7 +20788,7 @@ index 6c7923267959105d531c11e81bb3a9cad8186ea0..f637fe12945a37734eea227d60c5b055 #if PLATFORM(GTK) || PLATFORM(WPE) #include "InputMethodState.h" #endif -@@ -987,11 +991,11 @@ public: +@@ -988,11 +992,11 @@ public: void clearSelection(); void restoreSelectionInFocusedEditableElement(); @@ -20803,7 +20802,7 @@ index 6c7923267959105d531c11e81bb3a9cad8186ea0..f637fe12945a37734eea227d60c5b055 void performDragControllerAction(DragControllerAction, const WebCore::DragData&, SandboxExtension::Handle&&, Vector&&); #endif -@@ -1005,6 +1009,9 @@ public: +@@ -1006,6 +1010,9 @@ public: void didStartDrag(); void dragCancelled(); OptionSet allowedDragSourceActions() const { return m_allowedDragSourceActions; } @@ -20813,7 +20812,7 @@ index 6c7923267959105d531c11e81bb3a9cad8186ea0..f637fe12945a37734eea227d60c5b055 #endif void beginPrinting(WebCore::FrameIdentifier, const PrintInfo&); -@@ -1241,6 +1248,7 @@ public: +@@ -1242,6 +1249,7 @@ public: void connectInspector(const String& targetId, Inspector::FrontendChannel::ConnectionType); void disconnectInspector(const String& targetId); void sendMessageToTargetBackend(const String& targetId, const String& message); @@ -20821,7 +20820,7 @@ index 6c7923267959105d531c11e81bb3a9cad8186ea0..f637fe12945a37734eea227d60c5b055 void insertNewlineInQuotedContent(); -@@ -1598,6 +1606,7 @@ private: +@@ -1602,6 +1610,7 @@ private: // Actions void tryClose(CompletionHandler&&); void platformDidReceiveLoadParameters(const LoadParameters&); @@ -20829,7 +20828,7 @@ index 6c7923267959105d531c11e81bb3a9cad8186ea0..f637fe12945a37734eea227d60c5b055 void loadRequest(LoadParameters&&); NO_RETURN void loadRequestWaitingForProcessLaunch(LoadParameters&&, URL&&, WebPageProxyIdentifier, bool); void loadData(LoadParameters&&); -@@ -1635,6 +1644,7 @@ private: +@@ -1639,6 +1648,7 @@ private: void updatePotentialTapSecurityOrigin(const WebTouchEvent&, bool wasHandled); #elif ENABLE(TOUCH_EVENTS) void touchEvent(const WebTouchEvent&); @@ -20837,7 +20836,7 @@ index 6c7923267959105d531c11e81bb3a9cad8186ea0..f637fe12945a37734eea227d60c5b055 #endif void cancelPointer(WebCore::PointerID, const WebCore::IntPoint&); -@@ -1768,9 +1778,7 @@ private: +@@ -1772,9 +1782,7 @@ private: void requestRectForFoundTextRange(const WebFoundTextRange&, CompletionHandler&&); @@ -20847,7 +20846,7 @@ index 6c7923267959105d531c11e81bb3a9cad8186ea0..f637fe12945a37734eea227d60c5b055 void didChangeSelectedIndexForActivePopupMenu(int32_t newIndex); void setTextForActivePopupMenu(int32_t index); -@@ -2305,6 +2313,7 @@ private: +@@ -2309,6 +2317,7 @@ private: UserActivity m_userActivity; uint64_t m_pendingNavigationID { 0 }; @@ -20856,7 +20855,7 @@ index 6c7923267959105d531c11e81bb3a9cad8186ea0..f637fe12945a37734eea227d60c5b055 bool m_mainFrameProgressCompleted { false }; diff --git a/Source/WebKit/WebProcess/WebPage/WebPage.messages.in b/Source/WebKit/WebProcess/WebPage/WebPage.messages.in -index 6cce7f4b95cbb42689027f14f49e80d8464227af..3b35d5b31abfca5a77aecc7c417e10d7fecef003 100644 +index 1191837c351ea2795df9b1a5bf2a4643658e0d4e..058eed0658640b5e278ba1a04c8c388e42d5c058 100644 --- a/Source/WebKit/WebProcess/WebPage/WebPage.messages.in +++ b/Source/WebKit/WebProcess/WebPage/WebPage.messages.in @@ -133,6 +133,7 @@ GenerateSyntheticEditingCommand(enum:uint8_t WebKit::SyntheticEditingCommandType @@ -21000,10 +20999,10 @@ index bb512aec34506aa588a736b6dcf6b6f3b669e342..fbcad974ad70113d527f7cac688e47d5 } diff --git a/Source/WebKit/WebProcess/WebProcess.cpp b/Source/WebKit/WebProcess/WebProcess.cpp -index ee1434bda87b4391145c4689537096d06ae39880..0e20719bb128b968a5ca98d77f258f5961f62231 100644 +index dd8d581ac5b24d5d94062b9c65c242f0c51ec984..057cdb7f7de86946bfef599a172c69f2bcb7cfdf 100644 --- a/Source/WebKit/WebProcess/WebProcess.cpp +++ b/Source/WebKit/WebProcess/WebProcess.cpp -@@ -88,6 +88,7 @@ +@@ -89,6 +89,7 @@ #include "WebsiteData.h" #include "WebsiteDataStoreParameters.h" #include "WebsiteDataType.h" @@ -21011,7 +21010,7 @@ index ee1434bda87b4391145c4689537096d06ae39880..0e20719bb128b968a5ca98d77f258f59 #include #include #include -@@ -349,6 +350,8 @@ void WebProcess::initializeProcess(const AuxiliaryProcessInitializationParameter +@@ -350,6 +351,8 @@ void WebProcess::initializeProcess(const AuxiliaryProcessInitializationParameter platformInitializeProcess(parameters); updateCPULimit(); @@ -21102,12 +21101,12 @@ index 0000000000000000000000000000000000000000..dd6a53e2d57318489b7e49dd7373706d + LIBVPX_LIBRARIES +) diff --git a/Source/cmake/OptionsGTK.cmake b/Source/cmake/OptionsGTK.cmake -index 7c12863eba8dd5106490d0e797309a727d332192..e47d35318c62091bb3694f472ed7c6d50cecbd90 100644 +index 2260d519347ff8ef62b32da566b496b61d572b10..e771bb505761f5cb705eec3dafbc25a572639a91 100644 --- a/Source/cmake/OptionsGTK.cmake +++ b/Source/cmake/OptionsGTK.cmake @@ -5,6 +5,7 @@ WEBKIT_OPTION_BEGIN() - SET_PROJECT_VERSION(2 35 1) + SET_PROJECT_VERSION(2 35 2) +set(ENABLE_WEBKIT_LEGACY OFF) @@ -21162,13 +21161,12 @@ index 7c12863eba8dd5106490d0e797309a727d332192..e47d35318c62091bb3694f472ed7c6d5 WEBKIT_OPTION_DEFAULT_PORT_VALUE(ENABLE_MHTML PRIVATE ON) WEBKIT_OPTION_DEFAULT_PORT_VALUE(ENABLE_MOUSE_CURSOR_SCALE PRIVATE ON) WEBKIT_OPTION_DEFAULT_PORT_VALUE(ENABLE_NETSCAPE_PLUGIN_API PRIVATE OFF) -@@ -171,6 +176,16 @@ WEBKIT_OPTION_DEFAULT_PORT_VALUE(ENABLE_SHAREABLE_RESOURCE PRIVATE ON) +@@ -171,6 +176,15 @@ WEBKIT_OPTION_DEFAULT_PORT_VALUE(ENABLE_SHAREABLE_RESOURCE PRIVATE ON) WEBKIT_OPTION_DEFAULT_PORT_VALUE(ENABLE_WEB_API_STATISTICS PRIVATE ON) WEBKIT_OPTION_DEFAULT_PORT_VALUE(ENABLE_WEB_RTC PRIVATE ${ENABLE_EXPERIMENTAL_FEATURES}) +# Playwright +WEBKIT_OPTION_DEFAULT_PORT_VALUE(ENABLE_APPLICATION_MANIFEST PRIVATE ON) -+WEBKIT_OPTION_DEFAULT_PORT_VALUE(ENABLE_CSS_TRAILING_WORD PRIVATE ON) +WEBKIT_OPTION_DEFAULT_PORT_VALUE(ENABLE_CURSOR_VISIBILITY PRIVATE ON) +WEBKIT_OPTION_DEFAULT_PORT_VALUE(ENABLE_DOWNLOAD_ATTRIBUTE PRIVATE ON) +WEBKIT_OPTION_DEFAULT_PORT_VALUE(ENABLE_DEVICE_ORIENTATION PRIVATE ON) @@ -21180,7 +21178,7 @@ index 7c12863eba8dd5106490d0e797309a727d332192..e47d35318c62091bb3694f472ed7c6d5 # Finalize the value for all options. Do not attempt to use an option before diff --git a/Source/cmake/OptionsWPE.cmake b/Source/cmake/OptionsWPE.cmake -index 023fbaab4f707d9d133a9ea073820e2a467e4cac..dc076b170b2963cdd11db2fca8f652d08ffc41c8 100644 +index 79b46b20c0ca45536777dce7018c8619c7906452..46411c864a9ba597b4071a78ba04cb0af0b905d0 100644 --- a/Source/cmake/OptionsWPE.cmake +++ b/Source/cmake/OptionsWPE.cmake @@ -3,6 +3,7 @@ include(VersioningUtils) @@ -21200,13 +21198,12 @@ index 023fbaab4f707d9d133a9ea073820e2a467e4cac..dc076b170b2963cdd11db2fca8f652d0 WEBKIT_OPTION_DEFAULT_PORT_VALUE(ENABLE_MHTML PRIVATE ON) WEBKIT_OPTION_DEFAULT_PORT_VALUE(ENABLE_NETSCAPE_PLUGIN_API PRIVATE OFF) WEBKIT_OPTION_DEFAULT_PORT_VALUE(ENABLE_NOTIFICATIONS PRIVATE ON) -@@ -69,17 +70,36 @@ WEBKIT_OPTION_DEFAULT_PORT_VALUE(ENABLE_TOUCH_EVENTS PRIVATE ON) +@@ -69,17 +70,35 @@ WEBKIT_OPTION_DEFAULT_PORT_VALUE(ENABLE_TOUCH_EVENTS PRIVATE ON) WEBKIT_OPTION_DEFAULT_PORT_VALUE(ENABLE_WEB_RTC PRIVATE ${ENABLE_EXPERIMENTAL_FEATURES}) WEBKIT_OPTION_DEFAULT_PORT_VALUE(ENABLE_WEBXR PRIVATE ${ENABLE_EXPERIMENTAL_FEATURES}) +# Playwright +WEBKIT_OPTION_DEFAULT_PORT_VALUE(ENABLE_APPLICATION_MANIFEST PRIVATE ON) -+WEBKIT_OPTION_DEFAULT_PORT_VALUE(ENABLE_CSS_TRAILING_WORD PRIVATE ON) +WEBKIT_OPTION_DEFAULT_PORT_VALUE(ENABLE_CURSOR_VISIBILITY PRIVATE ON) +WEBKIT_OPTION_DEFAULT_PORT_VALUE(ENABLE_DARK_MODE_CSS PRIVATE ON) +WEBKIT_OPTION_DEFAULT_PORT_VALUE(ENABLE_DATALIST_ELEMENT PRIVATE ON) @@ -21242,7 +21239,7 @@ index 023fbaab4f707d9d133a9ea073820e2a467e4cac..dc076b170b2963cdd11db2fca8f652d0 # Private options specific to the WPE port. diff --git a/Source/cmake/OptionsWin.cmake b/Source/cmake/OptionsWin.cmake -index 04869b0d67226fb9f7951298f32f952c94cb2837..6ceb1dafd51d4f34c2f20f4f44a1dd99ca900d72 100644 +index 04869b0d67226fb9f7951298f32f952c94cb2837..dce1628048dec7c861ff9aeeaacb2c62d88431bb 100644 --- a/Source/cmake/OptionsWin.cmake +++ b/Source/cmake/OptionsWin.cmake @@ -7,8 +7,9 @@ add_definitions(-D_WINDOWS -DWINVER=0x601 -D_WIN32_WINNT=0x601) @@ -21276,13 +21273,12 @@ index 04869b0d67226fb9f7951298f32f952c94cb2837..6ceb1dafd51d4f34c2f20f4f44a1dd99 WEBKIT_OPTION_DEFAULT_PORT_VALUE(ENABLE_VIDEO PUBLIC ON) WEBKIT_OPTION_DEFAULT_PORT_VALUE(ENABLE_WEBASSEMBLY PRIVATE OFF) WEBKIT_OPTION_DEFAULT_PORT_VALUE(ENABLE_WEB_AUDIO PUBLIC OFF) -@@ -90,6 +88,17 @@ if (${WTF_PLATFORM_WIN_CAIRO}) +@@ -90,6 +88,16 @@ if (${WTF_PLATFORM_WIN_CAIRO}) # No support planned WEBKIT_OPTION_DEFAULT_PORT_VALUE(ENABLE_FTPDIR PRIVATE OFF) + # Playwright + WEBKIT_OPTION_DEFAULT_PORT_VALUE(ENABLE_CSS_CONIC_GRADIENTS PRIVATE ON) -+ WEBKIT_OPTION_DEFAULT_PORT_VALUE(ENABLE_CSS_TRAILING_WORD PRIVATE ON) + WEBKIT_OPTION_DEFAULT_PORT_VALUE(ENABLE_DARK_MODE_CSS PRIVATE ON) + WEBKIT_OPTION_DEFAULT_PORT_VALUE(ENABLE_DEVICE_ORIENTATION PRIVATE ON) + WEBKIT_OPTION_DEFAULT_PORT_VALUE(ENABLE_DOWNLOAD_ATTRIBUTE PRIVATE ON) @@ -21928,7 +21924,7 @@ index 2014ba2e11644b5d19f5f979d02485d488765ecc..3ab1dd0e1ae697d5c95895b8193f4ff3 list(APPEND WebKitTestRunnerInjectedBundle_LIBRARIES diff --git a/Tools/WebKitTestRunner/TestController.cpp b/Tools/WebKitTestRunner/TestController.cpp -index d95f685f8157e63b53f6e431b444bda6b5149767..7901e5387989322326d5f8e6a22a426c724f0df9 100644 +index 270509ce94c95a0c2c257c5437a1fb4a9c26692f..7ff81bc742cc572649afbe1b27fd2311e015b7e2 100644 --- a/Tools/WebKitTestRunner/TestController.cpp +++ b/Tools/WebKitTestRunner/TestController.cpp @@ -808,6 +808,7 @@ void TestController::createWebViewWithOptions(const TestOptions& options) @@ -22030,10 +22026,19 @@ index 52605867b9302d1afcc56c5e9b0c54acf0827900..6edf24ab60249241ba2969531ef55f4b } diff --git a/Tools/wpe/backends/HeadlessViewBackend.cpp b/Tools/wpe/backends/HeadlessViewBackend.cpp -index 39f0e26d1bb3cd486346a400c700a9d84e99bc2e..16bc0f9bf376c530082be6f20d5e5d247ceb6816 100644 +index f648e718b51dcc4afe433c812956ea8960232b3c..b849dd178d0d463c0a8afff9bfe0b7aacb74fa67 100644 --- a/Tools/wpe/backends/HeadlessViewBackend.cpp +++ b/Tools/wpe/backends/HeadlessViewBackend.cpp -@@ -149,27 +149,24 @@ void HeadlessViewBackend::updateSnapshot(struct wpe_fdo_shm_exported_buffer* exp +@@ -52,3 +52,4 @@ void HeadlessViewBackend::dispatchFullscreenEvent() + #endif + + } // namespace WPEToolingBackends ++ +diff --git a/Tools/wpe/backends/fdo/HeadlessViewBackendFdo.cpp b/Tools/wpe/backends/fdo/HeadlessViewBackendFdo.cpp +index 4b3d262528d33800ac46e4e9fc342b11f2744979..39d72bd2c04e79b94a5c7634b6abc9b227d5c148 100644 +--- a/Tools/wpe/backends/fdo/HeadlessViewBackendFdo.cpp ++++ b/Tools/wpe/backends/fdo/HeadlessViewBackendFdo.cpp +@@ -149,27 +149,25 @@ void HeadlessViewBackend::updateSnapshot(PlatformBuffer exportedBuffer) return; } @@ -22061,7 +22066,7 @@ index 39f0e26d1bb3cd486346a400c700a9d84e99bc2e..16bc0f9bf376c530082be6f20d5e5d24 - wl_shm_buffer_begin_access(shmBuffer); auto* data = static_cast(wl_shm_buffer_get_data(shmBuffer)); -- + - for (uint32_t y = 0; y < height; ++y) { - for (uint32_t x = 0; x < width; ++x) { - buffer[bufferStride * y + 4 * x + 0] = data[stride * y + 4 * x + 0]; @@ -22075,7 +22080,7 @@ index 39f0e26d1bb3cd486346a400c700a9d84e99bc2e..16bc0f9bf376c530082be6f20d5e5d24 wl_shm_buffer_end_access(shmBuffer); } -@@ -177,7 +174,7 @@ void HeadlessViewBackend::updateSnapshot(struct wpe_fdo_shm_exported_buffer* exp +@@ -177,7 +175,7 @@ void HeadlessViewBackend::updateSnapshot(PlatformBuffer exportedBuffer) cairo_surface_destroy(m_snapshot); m_snapshot = cairo_image_surface_create_for_data(buffer, CAIRO_FORMAT_ARGB32, From afc4b505aa461ed91bc36a55b6780ab4e141f14c Mon Sep 17 00:00:00 2001 From: Yury Semikhatsky Date: Fri, 4 Feb 2022 13:50:46 -0800 Subject: [PATCH 204/233] docs: fix duplicate sections (#11874) --- docs/src/test-api/class-test.md | 4 ++++ packages/playwright-test/types/test.d.ts | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/docs/src/test-api/class-test.md b/docs/src/test-api/class-test.md index 617437e8107df..5b4ea02026543 100644 --- a/docs/src/test-api/class-test.md +++ b/docs/src/test-api/class-test.md @@ -255,6 +255,8 @@ declaration. Learn more about the execution modes [here](./test-parallel-js.md). +Running tests in parallel: + ```js js-flavor=js // Run all the tests in the file concurrently using parallel workers. test.describe.configure({ mode: 'parallel' }); @@ -269,6 +271,8 @@ test('runs in parallel 1', async ({ page }) => {}); test('runs in parallel 2', async ({ page }) => {}); ``` +Running tests sequentially: + ```js js-flavor=js // Annotate tests as inter-dependent. test.describe.configure({ mode: 'serial' }); diff --git a/packages/playwright-test/types/test.d.ts b/packages/playwright-test/types/test.d.ts index 5160660224d6d..ab218514e6283 100644 --- a/packages/playwright-test/types/test.d.ts +++ b/packages/playwright-test/types/test.d.ts @@ -1719,6 +1719,8 @@ export interface TestType {}); * ``` * + * Running tests sequentially: + * * ```ts * // Annotate tests as inter-dependent. * test.describe.configure({ mode: 'serial' }); From af4944388f781bde54a803e4eef06346e466e7f4 Mon Sep 17 00:00:00 2001 From: Dmitry Gozman Date: Fri, 4 Feb 2022 15:34:33 -0800 Subject: [PATCH 205/233] test: skip "should support has:locator" on tracing bots (#11876) --- tests/page/locator-query.spec.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/page/locator-query.spec.ts b/tests/page/locator-query.spec.ts index 504adf1d2ab37..47777667f218f 100644 --- a/tests/page/locator-query.spec.ts +++ b/tests/page/locator-query.spec.ts @@ -90,7 +90,9 @@ it('should filter by regex and regexp flags', async ({ page }) => { await expect(page.locator('div', { hasText: /hElLo "world"/i })).toHaveText('Hello "world"'); }); -it('should support has:locator', async ({ page }) => { +it('should support has:locator', async ({ page, trace }) => { + it.skip(trace === 'on'); + await page.setContent(`
hello
world
`); await expect(page.locator(`div`, { has: page.locator(`text=world`) From 1503264aca79577201429b554231f3fad9a2dd79 Mon Sep 17 00:00:00 2001 From: Dmitry Gozman Date: Fri, 4 Feb 2022 16:14:48 -0800 Subject: [PATCH 206/233] test: decrease threshold for flaky "should play audio" (#11878) --- tests/capabilities.spec.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/capabilities.spec.ts b/tests/capabilities.spec.ts index db7ba53f85394..b8d574fbae6fa 100644 --- a/tests/capabilities.spec.ts +++ b/tests/capabilities.spec.ts @@ -92,7 +92,7 @@ it('should play audio #smoke', async ({ page, server, browserName, platform }) = await page.$eval('audio', e => e.play()); await page.waitForTimeout(1000); await page.$eval('audio', e => e.pause()); - expect(await page.$eval('audio', e => e.currentTime)).toBeGreaterThan(0.5); + expect(await page.$eval('audio', e => e.currentTime)).toBeGreaterThan(0.2); }); it('should support webgl #smoke', async ({ page, browserName, headless }) => { From 46dfa45b4edd8864d422936068ba1d3c1ef3df2a Mon Sep 17 00:00:00 2001 From: Yury Semikhatsky Date: Fri, 4 Feb 2022 16:44:04 -0800 Subject: [PATCH 207/233] docs: fix parallel test docs build (#11877) --- docs/src/test-api/class-test.md | 2 +- docs/src/test-timeouts-js.md | 10 +++++----- packages/playwright-test/types/test.d.ts | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/src/test-api/class-test.md b/docs/src/test-api/class-test.md index 5b4ea02026543..df33e24f648b3 100644 --- a/docs/src/test-api/class-test.md +++ b/docs/src/test-api/class-test.md @@ -253,7 +253,7 @@ A callback that is run immediately when calling [`method: Test.describe`]. Any t Set execution mode of execution for the enclosing scope. Can be executed either on the top level or inside a describe. Configuration applies to the entire scope, regardless of whether it run before or after the test declaration. -Learn more about the execution modes [here](./test-parallel-js.md). +Learn more about the execution modes [here](./test-parallel.md). Running tests in parallel: diff --git a/docs/src/test-timeouts-js.md b/docs/src/test-timeouts-js.md index 6da75c9b9c632..4a397a1ca3d7b 100644 --- a/docs/src/test-timeouts-js.md +++ b/docs/src/test-timeouts-js.md @@ -11,11 +11,11 @@ Playwright Test has multiple configurable timeouts for various tasks. |Timeout |Default |Description | |:----------|:----------------|:--------------------------------| -|Test timeout|30000 ms|Timeout for each test, includes test, hooks and fixtures:
Set default
{`config = { timeout: 60000 }`}
Override
```test.setTimeout(120000)``` | -|Expect timeout|5000 ms|Timeout for each assertion:
Set default
```config = { expect: { timeout: 10000 } }```
Override
```expect(locator).toBeVisible({ timeout: 10000 })```| -|Action timeout| no timeout |Timeout for each action:
Set default
```config = { use: { actionTimeout: 10000 } }```
Override
```locator.click({ timeout: 10000 })```| -|Navigation timeout| no timeout |Timeout for each navigation action:
Set default
```config = { use: { navigationTimeout: 30000 } }```
Override
```page.goto('/', { timeout: 30000 })```| -|Global timeout|no timeout |Global timeout for the whole test run:
Set in config
```config = { globalTimeout: 60*60*1000 }```
| +|Test timeout|30000 ms|Timeout for each test, includes test, hooks and fixtures:
Set default
{`config = { timeout: 60000 }`}
Override
{`test.setTimeout(120000)`}` | +|Expect timeout|5000 ms|Timeout for each assertion:
Set default
{`config = { expect: { timeout: 10000 } }`}
Override
{`expect(locator).toBeVisible({ timeout: 10000 })`} | +|Action timeout| no timeout |Timeout for each action:
Set default
{`config = { use: { actionTimeout: 10000 } }`}
Override
{`locator.click({ timeout: 10000 })`}| +|Navigation timeout| no timeout |Timeout for each navigation action:
Set default
{`config = { use: { navigationTimeout: 30000 } }`}
Override
{`page.goto('/', { timeout: 30000 })`}| +|Global timeout|no timeout |Global timeout for the whole test run:
Set in config
{`config = { globalTimeout: 60*60*1000 }`}
| ## Test timeout diff --git a/packages/playwright-test/types/test.d.ts b/packages/playwright-test/types/test.d.ts index ab218514e6283..df398388b8a53 100644 --- a/packages/playwright-test/types/test.d.ts +++ b/packages/playwright-test/types/test.d.ts @@ -1717,7 +1717,7 @@ export interface TestType Date: Fri, 4 Feb 2022 19:27:45 -0800 Subject: [PATCH 208/233] feat(codegen): generate locators and frame locators (#11873) --- .../src/server/injected/highlight.ts | 7 +- .../src/server/injected/injectedScript.ts | 6 +- .../supplements/recorder/codeGenerator.ts | 21 +- .../src/server/supplements/recorder/csharp.ts | 51 ++-- .../src/server/supplements/recorder/java.ts | 51 ++-- .../server/supplements/recorder/javascript.ts | 47 ++-- .../src/server/supplements/recorder/python.ts | 43 +++- .../supplements/recorder/recorderActions.ts | 8 + .../src/server/supplements/recorder/utils.ts | 10 - .../server/supplements/recorderSupplement.ts | 91 +++++-- tests/inspector/cli-codegen-1.spec.ts | 144 +++++------ tests/inspector/cli-codegen-2.spec.ts | 178 ++++--------- tests/inspector/cli-codegen-3.spec.ts | 235 ++++++++++++++++++ tests/inspector/pause.spec.ts | 39 ++- 14 files changed, 611 insertions(+), 320 deletions(-) create mode 100644 tests/inspector/cli-codegen-3.spec.ts diff --git a/packages/playwright-core/src/server/injected/highlight.ts b/packages/playwright-core/src/server/injected/highlight.ts index 8ee30c5ebe5ac..eaf3bb55fa323 100644 --- a/packages/playwright-core/src/server/injected/highlight.ts +++ b/packages/playwright-core/src/server/injected/highlight.ts @@ -44,7 +44,7 @@ export class Highlight { this._innerGlassPaneElement.appendChild(this._tooltipElement); // Use a closed shadow root to prevent selectors matching our internal previews. - this._glassPaneShadow = this._outerGlassPaneElement.attachShadow({ mode: this._isUnderTest ? 'open' : 'closed' }); + this._glassPaneShadow = this._outerGlassPaneElement.attachShadow({ mode: 'closed' }); this._glassPaneShadow.appendChild(this._innerGlassPaneElement); this._glassPaneShadow.appendChild(this._actionPointElement); const styleElement = document.createElement('style'); @@ -105,6 +105,8 @@ export class Highlight { this._actionPointElement.style.top = y + 'px'; this._actionPointElement.style.left = x + 'px'; this._actionPointElement.hidden = false; + if (this._isUnderTest) + console.error('Action point for test: ' + JSON.stringify({ x, y })); // eslint-disable-line no-console } hideActionPoint() { @@ -162,6 +164,9 @@ export class Highlight { highlightElement.style.height = box.height + 'px'; highlightElement.style.display = 'block'; this._highlightElements.push(highlightElement); + + if (this._isUnderTest) + console.error('Highlight box for test: ' + JSON.stringify({ x: box.x, y: box.y, width: box.width, height: box.height })); // eslint-disable-line no-console } for (const highlightElement of pool) { diff --git a/packages/playwright-core/src/server/injected/injectedScript.ts b/packages/playwright-core/src/server/injected/injectedScript.ts index 10689773871e5..715b7d38a291e 100644 --- a/packages/playwright-core/src/server/injected/injectedScript.ts +++ b/packages/playwright-core/src/server/injected/injectedScript.ts @@ -124,6 +124,10 @@ export class InjectedScript { return result; } + generateSelector(targetElement: Element): string { + return generateSelector(this, targetElement, true).selector; + } + querySelector(selector: ParsedSelector, root: Node, strict: boolean): Element | undefined { if (!(root as any)['querySelector']) throw this.createStacklessError('Node is not queryable.'); @@ -848,7 +852,7 @@ export class InjectedScript { strictModeViolationError(selector: ParsedSelector, matches: Element[]): Error { const infos = matches.slice(0, 10).map(m => ({ preview: this.previewNode(m), - selector: generateSelector(this, m, true).selector + selector: this.generateSelector(m), })); const lines = infos.map((info, i) => `\n ${i + 1}) ${info.preview} aka playwright.$("${info.selector}")`); if (infos.length < matches.length) diff --git a/packages/playwright-core/src/server/supplements/recorder/codeGenerator.ts b/packages/playwright-core/src/server/supplements/recorder/codeGenerator.ts index 99444c5b98efd..7a11fa48f278a 100644 --- a/packages/playwright-core/src/server/supplements/recorder/codeGenerator.ts +++ b/packages/playwright-core/src/server/supplements/recorder/codeGenerator.ts @@ -18,14 +18,10 @@ import { EventEmitter } from 'events'; import type { BrowserContextOptions, LaunchOptions } from '../../../..'; import { Frame } from '../../frames'; import { LanguageGenerator, LanguageGeneratorOptions } from './language'; -import { Action, Signal } from './recorderActions'; -import { describeFrame } from './utils'; +import { Action, Signal, FrameDescription } from './recorderActions'; export type ActionInContext = { - pageAlias: string; - frameName?: string; - frameUrl: string; - isMainFrame: boolean; + frame: FrameDescription; action: Action; committed?: boolean; }; @@ -82,10 +78,10 @@ export class CodeGenerator extends EventEmitter { didPerformAction(actionInContext: ActionInContext) { if (!this._enabled) return; - const { action, pageAlias } = actionInContext; + const action = actionInContext.action; let eraseLastAction = false; - if (this._lastAction && this._lastAction.pageAlias === pageAlias) { - const { action: lastAction } = this._lastAction; + if (this._lastAction && this._lastAction.frame.pageAlias === actionInContext.frame.pageAlias) { + const lastAction = this._lastAction.action; // We augment last action based on the type. if (this._lastAction && action.name === 'fill' && lastAction.name === 'fill') { if (action.selector === lastAction.selector) @@ -148,8 +144,11 @@ export class CodeGenerator extends EventEmitter { if (signal.name === 'navigation') { this.addAction({ - pageAlias, - ...describeFrame(frame), + frame: { + pageAlias, + isMainFrame: frame._page.mainFrame() === frame, + url: frame.url(), + }, committed: true, action: { name: 'navigate', diff --git a/packages/playwright-core/src/server/supplements/recorder/csharp.ts b/packages/playwright-core/src/server/supplements/recorder/csharp.ts index 58cbbbd547a4a..4c7f21ff5ed97 100644 --- a/packages/playwright-core/src/server/supplements/recorder/csharp.ts +++ b/packages/playwright-core/src/server/supplements/recorder/csharp.ts @@ -28,7 +28,8 @@ export class CSharpLanguageGenerator implements LanguageGenerator { highlighter = 'csharp'; generateAction(actionInContext: ActionInContext): string { - const { action, pageAlias } = actionInContext; + const action = actionInContext.action; + const pageAlias = actionInContext.frame.pageAlias; const formatter = new CSharpFormatter(8); formatter.newLine(); formatter.add('// ' + actionTitle(action)); @@ -40,10 +41,17 @@ export class CSharpLanguageGenerator implements LanguageGenerator { return formatter.format(); } - const subject = actionInContext.isMainFrame ? pageAlias : - (actionInContext.frameName ? - `${pageAlias}.Frame(${quote(actionInContext.frameName)})` : - `${pageAlias}.FrameByUrl(${quote(actionInContext.frameUrl)})`); + let subject: string; + if (actionInContext.frame.isMainFrame) { + subject = pageAlias; + } else if (actionInContext.frame.selectorsChain && action.name !== 'navigate') { + const locators = actionInContext.frame.selectorsChain.map(selector => '.' + asLocator(selector, 'FrameLocator')); + subject = `${pageAlias}${locators.join('')}`; + } else if (actionInContext.frame.name) { + subject = `${pageAlias}.Frame(${quote(actionInContext.frame.name)})`; + } else { + subject = `${pageAlias}.FrameByUrl(${quote(actionInContext.frame.url)})`; + } const signals = toSignalMap(action); @@ -58,12 +66,12 @@ export class CSharpLanguageGenerator implements LanguageGenerator { } const lines: string[] = []; - const actionCall = this._generateActionCall(action, actionInContext.isMainFrame); + const actionCall = this._generateActionCall(action, actionInContext.frame.isMainFrame); if (signals.waitForNavigation) { lines.push(`await ${pageAlias}.RunAndWaitForNavigationAsync(async () =>`); lines.push(`{`); lines.push(` await ${subject}.${actionCall};`); - lines.push(`}/*, new ${actionInContext.isMainFrame ? 'Page' : 'Frame'}WaitForNavigationOptions`); + lines.push(`}/*, new ${actionInContext.frame.isMainFrame ? 'Page' : 'Frame'}WaitForNavigationOptions`); lines.push(`{`); lines.push(` UrlString = ${quote(signals.waitForNavigation.url)}`); lines.push(`}*/);`); @@ -110,27 +118,27 @@ export class CSharpLanguageGenerator implements LanguageGenerator { if (action.position) options.position = action.position; if (!Object.entries(options).length) - return `${method}Async(${quote(action.selector)})`; - const optionsString = formatObject(options, ' ', (isPage ? 'Page' : 'Frame') + method + 'Options'); - return `${method}Async(${quote(action.selector)}, ${optionsString})`; + return asLocator(action.selector) + `.${method}Async()`; + const optionsString = formatObject(options, ' ', 'Locator' + method + 'Options'); + return asLocator(action.selector) + `.${method}Async(${optionsString})`; } case 'check': - return `CheckAsync(${quote(action.selector)})`; + return asLocator(action.selector) + `.CheckAsync()`; case 'uncheck': - return `UncheckAsync(${quote(action.selector)})`; + return asLocator(action.selector) + `.UncheckAsync()`; case 'fill': - return `FillAsync(${quote(action.selector)}, ${quote(action.text)})`; + return asLocator(action.selector) + `.FillAsync(${quote(action.text)})`; case 'setInputFiles': - return `SetInputFilesAsync(${quote(action.selector)}, ${formatObject(action.files)})`; + return asLocator(action.selector) + `.SetInputFilesAsync(${formatObject(action.files)})`; case 'press': { const modifiers = toModifiers(action.modifiers); const shortcut = [...modifiers, action.key].join('+'); - return `PressAsync(${quote(action.selector)}, ${quote(shortcut)})`; + return asLocator(action.selector) + `.PressAsync(${quote(shortcut)})`; } case 'navigate': return `GotoAsync(${quote(action.url)})`; case 'select': - return `SelectOptionAsync(${quote(action.selector)}, ${formatObject(action.options)})`; + return asLocator(action.selector) + `.SelectOptionAsync(${formatObject(action.options)})`; } } @@ -270,4 +278,13 @@ class CSharpFormatter { function quote(text: string) { return escapeWithQuotes(text, '\"'); -} \ No newline at end of file +} + +function asLocator(selector: string, locatorFn = 'Locator') { + const match = selector.match(/(.*)\s+>>\s+nth=(\d+)$/); + if (!match) + return `${locatorFn}(${quote(selector)})`; + if (+match[2] === 0) + return `${locatorFn}(${quote(match[1])}).First`; + return `${locatorFn}(${quote(match[1])}).Nth(${match[2]})`; +} diff --git a/packages/playwright-core/src/server/supplements/recorder/java.ts b/packages/playwright-core/src/server/supplements/recorder/java.ts index 31e545976e7bd..d70efc7f18420 100644 --- a/packages/playwright-core/src/server/supplements/recorder/java.ts +++ b/packages/playwright-core/src/server/supplements/recorder/java.ts @@ -29,7 +29,8 @@ export class JavaLanguageGenerator implements LanguageGenerator { highlighter = 'java'; generateAction(actionInContext: ActionInContext): string { - const { action, pageAlias } = actionInContext; + const action = actionInContext.action; + const pageAlias = actionInContext.frame.pageAlias; const formatter = new JavaScriptFormatter(6); formatter.newLine(); formatter.add('// ' + actionTitle(action)); @@ -41,10 +42,17 @@ export class JavaLanguageGenerator implements LanguageGenerator { return formatter.format(); } - const subject = actionInContext.isMainFrame ? pageAlias : - (actionInContext.frameName ? - `${pageAlias}.frame(${quote(actionInContext.frameName)})` : - `${pageAlias}.frameByUrl(${quote(actionInContext.frameUrl)})`); + let subject: string; + if (actionInContext.frame.isMainFrame) { + subject = pageAlias; + } else if (actionInContext.frame.selectorsChain && action.name !== 'navigate') { + const locators = actionInContext.frame.selectorsChain.map(selector => '.' + asLocator(selector, 'frameLocator')); + subject = `${pageAlias}${locators.join('')}`; + } else if (actionInContext.frame.name) { + subject = `${pageAlias}.frame(${quote(actionInContext.frame.name)})`; + } else { + subject = `${pageAlias}.frameByUrl(${quote(actionInContext.frame.url)})`; + } const signals = toSignalMap(action); @@ -55,7 +63,7 @@ export class JavaLanguageGenerator implements LanguageGenerator { });`); } - const actionCall = this._generateActionCall(action, actionInContext.isMainFrame); + const actionCall = this._generateActionCall(action); let code = `${subject}.${actionCall};`; if (signals.popup) { @@ -85,7 +93,7 @@ export class JavaLanguageGenerator implements LanguageGenerator { return formatter.format(); } - private _generateActionCall(action: Action, isPage: boolean): string { + private _generateActionCall(action: Action): string { switch (action.name) { case 'openPage': throw Error('Not reached'); @@ -105,26 +113,26 @@ export class JavaLanguageGenerator implements LanguageGenerator { options.clickCount = action.clickCount; if (action.position) options.position = action.position; - const optionsText = formatClickOptions(options, isPage); - return `${method}(${quote(action.selector)}${optionsText ? ', ' : ''}${optionsText})`; + const optionsText = formatClickOptions(options); + return asLocator(action.selector) + `.${method}(${optionsText})`; } case 'check': - return `check(${quote(action.selector)})`; + return asLocator(action.selector) + `.check()`; case 'uncheck': - return `uncheck(${quote(action.selector)})`; + return asLocator(action.selector) + `.uncheck()`; case 'fill': - return `fill(${quote(action.selector)}, ${quote(action.text)})`; + return asLocator(action.selector) + `.fill(${quote(action.text)})`; case 'setInputFiles': - return `setInputFiles(${quote(action.selector)}, ${formatPath(action.files.length === 1 ? action.files[0] : action.files)})`; + return asLocator(action.selector) + `.setInputFiles(${formatPath(action.files.length === 1 ? action.files[0] : action.files)})`; case 'press': { const modifiers = toModifiers(action.modifiers); const shortcut = [...modifiers, action.key].join('+'); - return `press(${quote(action.selector)}, ${quote(shortcut)})`; + return asLocator(action.selector) + `.press(${quote(shortcut)})`; } case 'navigate': return `navigate(${quote(action.url)})`; case 'select': - return `selectOption(${quote(action.selector)}, ${formatSelectOption(action.options.length > 1 ? action.options : action.options[0])})`; + return asLocator(action.selector) + `.selectOption(${formatSelectOption(action.options.length > 1 ? action.options : action.options[0])})`; } } @@ -217,7 +225,7 @@ function formatContextOptions(contextOptions: BrowserContextOptions, deviceName: return lines.join('\n'); } -function formatClickOptions(options: MouseClickOptions, isPage: boolean) { +function formatClickOptions(options: MouseClickOptions) { const lines = []; if (options.button) lines.push(` .setButton(MouseButton.${options.button.toUpperCase()})`); @@ -229,10 +237,19 @@ function formatClickOptions(options: MouseClickOptions, isPage: boolean) { lines.push(` .setPosition(${options.position.x}, ${options.position.y})`); if (!lines.length) return ''; - lines.unshift(`new ${isPage ? 'Page' : 'Frame'}.ClickOptions()`); + lines.unshift(`new Locator.ClickOptions()`); return lines.join('\n'); } function quote(text: string) { return escapeWithQuotes(text, '\"'); } + +function asLocator(selector: string, locatorFn = 'locator') { + const match = selector.match(/(.*)\s+>>\s+nth=(\d+)$/); + if (!match) + return `${locatorFn}(${quote(selector)})`; + if (+match[2] === 0) + return `${locatorFn}(${quote(match[1])}).first()`; + return `${locatorFn}(${quote(match[1])}).nth(${match[2]})`; +} diff --git a/packages/playwright-core/src/server/supplements/recorder/javascript.ts b/packages/playwright-core/src/server/supplements/recorder/javascript.ts index 4722180eb7b9e..1dbffc3127faf 100644 --- a/packages/playwright-core/src/server/supplements/recorder/javascript.ts +++ b/packages/playwright-core/src/server/supplements/recorder/javascript.ts @@ -35,7 +35,8 @@ export class JavaScriptLanguageGenerator implements LanguageGenerator { } generateAction(actionInContext: ActionInContext): string { - const { action, pageAlias } = actionInContext; + const action = actionInContext.action; + const pageAlias = actionInContext.frame.pageAlias; const formatter = new JavaScriptFormatter(2); formatter.newLine(); formatter.add('// ' + actionTitle(action)); @@ -49,10 +50,17 @@ export class JavaScriptLanguageGenerator implements LanguageGenerator { return formatter.format(); } - const subject = actionInContext.isMainFrame ? pageAlias : - (actionInContext.frameName ? - `${pageAlias}.frame(${formatObject({ name: actionInContext.frameName })})` : - `${pageAlias}.frame(${formatObject({ url: actionInContext.frameUrl })})`); + let subject: string; + if (actionInContext.frame.isMainFrame) { + subject = pageAlias; + } else if (actionInContext.frame.selectorsChain && action.name !== 'navigate') { + const locators = actionInContext.frame.selectorsChain.map(selector => '.' + asLocator(selector, 'frameLocator')); + subject = `${pageAlias}${locators.join('')}`; + } else if (actionInContext.frame.name) { + subject = `${pageAlias}.frame(${formatObject({ name: actionInContext.frame.name })})`; + } else { + subject = `${pageAlias}.frame(${formatObject({ url: actionInContext.frame.url })})`; + } const signals = toSignalMap(action); @@ -123,26 +131,26 @@ export class JavaScriptLanguageGenerator implements LanguageGenerator { options.clickCount = action.clickCount; if (action.position) options.position = action.position; - const optionsString = formatOptions(options); - return `${method}(${quote(action.selector)}${optionsString})`; + const optionsString = formatOptions(options, false); + return asLocator(action.selector) + `.${method}(${optionsString})`; } case 'check': - return `check(${quote(action.selector)})`; + return asLocator(action.selector) + `.check()`; case 'uncheck': - return `uncheck(${quote(action.selector)})`; + return asLocator(action.selector) + `.uncheck()`; case 'fill': - return `fill(${quote(action.selector)}, ${quote(action.text)})`; + return asLocator(action.selector) + `.fill(${quote(action.text)})`; case 'setInputFiles': - return `setInputFiles(${quote(action.selector)}, ${formatObject(action.files.length === 1 ? action.files[0] : action.files)})`; + return asLocator(action.selector) + `.setInputFiles(${formatObject(action.files.length === 1 ? action.files[0] : action.files)})`; case 'press': { const modifiers = toModifiers(action.modifiers); const shortcut = [...modifiers, action.key].join('+'); - return `press(${quote(action.selector)}, ${quote(shortcut)})`; + return asLocator(action.selector) + `.press(${quote(shortcut)})`; } case 'navigate': return `goto(${quote(action.url)})`; case 'select': - return `selectOption(${quote(action.selector)}, ${formatObject(action.options.length > 1 ? action.options : action.options[0])})`; + return asLocator(action.selector) + `.selectOption(${formatObject(action.options.length > 1 ? action.options : action.options[0])})`; } } @@ -192,11 +200,20 @@ ${useText ? '\ntest.use(' + useText + ');\n' : ''} } } -function formatOptions(value: any): string { +function asLocator(selector: string, locatorFn = 'locator') { + const match = selector.match(/(.*)\s+>>\s+nth=(\d+)$/); + if (!match) + return `${locatorFn}(${quote(selector)})`; + if (+match[2] === 0) + return `${locatorFn}(${quote(match[1])}).first()`; + return `${locatorFn}(${quote(match[1])}).nth(${match[2]})`; +} + +function formatOptions(value: any, hasArguments: boolean): string { const keys = Object.keys(value); if (!keys.length) return ''; - return ', ' + formatObject(value); + return (hasArguments ? ', ' : '') + formatObject(value); } function formatObject(value: any, indent = ' '): string { diff --git a/packages/playwright-core/src/server/supplements/recorder/python.ts b/packages/playwright-core/src/server/supplements/recorder/python.ts index 1247657b856a6..d0b6bee6eb0f0 100644 --- a/packages/playwright-core/src/server/supplements/recorder/python.ts +++ b/packages/playwright-core/src/server/supplements/recorder/python.ts @@ -40,7 +40,8 @@ export class PythonLanguageGenerator implements LanguageGenerator { } generateAction(actionInContext: ActionInContext): string { - const { action, pageAlias } = actionInContext; + const action = actionInContext.action; + const pageAlias = actionInContext.frame.pageAlias; const formatter = new PythonFormatter(4); formatter.newLine(); formatter.add('# ' + actionTitle(action)); @@ -52,10 +53,17 @@ export class PythonLanguageGenerator implements LanguageGenerator { return formatter.format(); } - const subject = actionInContext.isMainFrame ? pageAlias : - (actionInContext.frameName ? - `${pageAlias}.frame(${formatOptions({ name: actionInContext.frameName }, false)})` : - `${pageAlias}.frame(${formatOptions({ url: actionInContext.frameUrl }, false)})`); + let subject: string; + if (actionInContext.frame.isMainFrame) { + subject = pageAlias; + } else if (actionInContext.frame.selectorsChain && action.name !== 'navigate') { + const locators = actionInContext.frame.selectorsChain.map(selector => '.' + asLocator(selector, 'frame_locator')); + subject = `${pageAlias}${locators.join('')}`; + } else if (actionInContext.frame.name) { + subject = `${pageAlias}.frame(${formatOptions({ name: actionInContext.frame.name }, false)})`; + } else { + subject = `${pageAlias}.frame(${formatOptions({ url: actionInContext.frame.url }, false)})`; + } const signals = toSignalMap(action); @@ -114,26 +122,26 @@ export class PythonLanguageGenerator implements LanguageGenerator { options.clickCount = action.clickCount; if (action.position) options.position = action.position; - const optionsString = formatOptions(options, true); - return `${method}(${quote(action.selector)}${optionsString})`; + const optionsString = formatOptions(options, false); + return asLocator(action.selector) + `.${method}(${optionsString})`; } case 'check': - return `check(${quote(action.selector)})`; + return asLocator(action.selector) + `.check()`; case 'uncheck': - return `uncheck(${quote(action.selector)})`; + return asLocator(action.selector) + `.uncheck()`; case 'fill': - return `fill(${quote(action.selector)}, ${quote(action.text)})`; + return asLocator(action.selector) + `.fill(${quote(action.text)})`; case 'setInputFiles': - return `set_input_files(${quote(action.selector)}, ${formatValue(action.files.length === 1 ? action.files[0] : action.files)})`; + return asLocator(action.selector) + `.set_input_files(${formatValue(action.files.length === 1 ? action.files[0] : action.files)})`; case 'press': { const modifiers = toModifiers(action.modifiers); const shortcut = [...modifiers, action.key].join('+'); - return `press(${quote(action.selector)}, ${quote(shortcut)})`; + return asLocator(action.selector) + `.press(${quote(shortcut)})`; } case 'navigate': return `goto(${quote(action.url)})`; case 'select': - return `select_option(${quote(action.selector)}, ${formatValue(action.options.length === 1 ? action.options[0] : action.options)})`; + return asLocator(action.selector) + `.select_option(${formatValue(action.options.length === 1 ? action.options[0] : action.options)})`; } } @@ -272,3 +280,12 @@ class PythonFormatter { function quote(text: string) { return escapeWithQuotes(text, '\"'); } + +function asLocator(selector: string, locatorFn = 'locator') { + const match = selector.match(/(.*)\s+>>\s+nth=(\d+)$/); + if (!match) + return `${locatorFn}(${quote(selector)})`; + if (+match[2] === 0) + return `${locatorFn}(${quote(match[1])}).first`; + return `${locatorFn}(${quote(match[1])}).nth(${match[2]})`; +} diff --git a/packages/playwright-core/src/server/supplements/recorder/recorderActions.ts b/packages/playwright-core/src/server/supplements/recorder/recorderActions.ts index 66ddac6c91abb..b525360affac4 100644 --- a/packages/playwright-core/src/server/supplements/recorder/recorderActions.ts +++ b/packages/playwright-core/src/server/supplements/recorder/recorderActions.ts @@ -121,6 +121,14 @@ export type DialogSignal = BaseSignal & { export type Signal = NavigationSignal | PopupSignal | DownloadSignal | DialogSignal; +export type FrameDescription = { + pageAlias: string; + isMainFrame: boolean; + url: string; + name?: string; + selectorsChain?: string[]; +}; + export function actionTitle(action: Action): string { switch (action.name) { case 'openPage': diff --git a/packages/playwright-core/src/server/supplements/recorder/utils.ts b/packages/playwright-core/src/server/supplements/recorder/utils.ts index 4dea686ee7357..8ee92aa453270 100644 --- a/packages/playwright-core/src/server/supplements/recorder/utils.ts +++ b/packages/playwright-core/src/server/supplements/recorder/utils.ts @@ -48,13 +48,3 @@ export function toModifiers(modifiers: number): ('Alt' | 'Control' | 'Meta' | 'S result.push('Shift'); return result; } - -export function describeFrame(frame: Frame): { frameName?: string, frameUrl: string, isMainFrame: boolean } { - const page = frame._page; - if (page.mainFrame() === frame) - return { isMainFrame: true, frameUrl: frame.url() }; - const frames = page.frames().filter(f => f.name() === frame.name()); - if (frames.length === 1 && frames[0] === frame) - return { isMainFrame: false, frameUrl: frame.url(), frameName: frame.name() }; - return { isMainFrame: false, frameUrl: frame.url() }; -} diff --git a/packages/playwright-core/src/server/supplements/recorderSupplement.ts b/packages/playwright-core/src/server/supplements/recorderSupplement.ts index 3ea80780afd2b..e250c19bace7d 100644 --- a/packages/playwright-core/src/server/supplements/recorderSupplement.ts +++ b/packages/playwright-core/src/server/supplements/recorderSupplement.ts @@ -18,7 +18,7 @@ import * as fs from 'fs'; import * as actions from './recorder/recorderActions'; import type * as channels from '../../protocol/channels'; import { CodeGenerator, ActionInContext } from './recorder/codeGenerator'; -import { describeFrame, toClickOptions, toModifiers } from './recorder/utils'; +import { toClickOptions, toModifiers } from './recorder/utils'; import { Page } from '../page'; import { Frame } from '../frames'; import { BrowserContext } from '../browserContext'; @@ -36,6 +36,7 @@ import { createGuid, isUnderTest, monotonicTime } from '../../utils/utils'; import { metadataToCallLog } from './recorder/recorderUtils'; import { Debugger } from './debugger'; import { EventEmitter } from 'events'; +import { raceAgainstTimeout } from '../../utils/async'; type BindingSource = { frame: Frame, page: Page }; @@ -380,16 +381,15 @@ class ContextRecorder extends EventEmitter { // First page is called page, others are called popup1, popup2, etc. const frame = page.mainFrame(); page.on('close', () => { - this._pageAliases.delete(page); this._generator.addAction({ - pageAlias, - ...describeFrame(page.mainFrame()), + frame: this._describeMainFrame(page), committed: true, action: { name: 'closePage', signals: [], } }); + this._pageAliases.delete(page); }); frame.on(Frame.Events.Navigation, () => this._onFrameNavigated(frame, page)); page.on(Page.Events.Download, () => this._onDownload(page)); @@ -402,8 +402,7 @@ class ContextRecorder extends EventEmitter { this._onPopup(page.opener()!, page); } else { this._generator.addAction({ - pageAlias, - ...describeFrame(page.mainFrame()), + frame: this._describeMainFrame(page), committed: true, action: { name: 'openPage', @@ -422,14 +421,69 @@ class ContextRecorder extends EventEmitter { } } + private _describeMainFrame(page: Page): actions.FrameDescription { + return { + pageAlias: this._pageAliases.get(page)!, + isMainFrame: true, + url: page.mainFrame().url(), + }; + } + + private async _describeFrame(frame: Frame): Promise { + const page = frame._page; + const pageAlias = this._pageAliases.get(page)!; + const chain: Frame[] = []; + for (let ancestor: Frame | null = frame; ancestor; ancestor = ancestor.parentFrame()) + chain.push(ancestor); + chain.reverse(); + + if (chain.length === 1) + return this._describeMainFrame(page); + + const hasUniqueName = page.frames().filter(f => f.name() === frame.name()).length === 1; + const fallback: actions.FrameDescription = { + pageAlias, + isMainFrame: false, + url: frame.url(), + name: frame.name() && hasUniqueName ? frame.name() : undefined, + }; + if (chain.length > 3) + return fallback; + + const selectorPromises: Promise[] = []; + for (let i = 0; i < chain.length - 1; i++) + selectorPromises.push(this._findFrameSelector(chain[i + 1], chain[i])); + + const result = await raceAgainstTimeout(() => Promise.all(selectorPromises), 2000); + if (!result.timedOut && result.result.every(selector => !!selector)) { + return { + ...fallback, + selectorsChain: result.result as string[], + }; + } + return fallback; + } + + private async _findFrameSelector(frame: Frame, parent: Frame): Promise { + try { + const frameElement = await frame.frameElement(); + if (!frameElement) + return; + const utility = await parent._utilityContext(); + const injected = await utility.injectedScript(); + const selector = await injected.evaluate((injected, element) => injected.generateSelector(element as Element), frameElement); + return selector; + } catch (e) { + } + } + private async _performAction(frame: Frame, action: actions.Action) { // Commit last action so that no further signals are added to it. this._generator.commitLastAction(); - const page = frame._page; + const frameDescription = await this._describeFrame(frame); const actionInContext: ActionInContext = { - pageAlias: this._pageAliases.get(page)!, - ...describeFrame(frame), + frame: frameDescription, action }; @@ -476,20 +530,20 @@ class ContextRecorder extends EventEmitter { const kActionTimeout = 5000; if (action.name === 'click') { const { options } = toClickOptions(action); - await perform('click', { selector: action.selector }, callMetadata => frame.click(callMetadata, action.selector, { ...options, timeout: kActionTimeout })); + await perform('click', { selector: action.selector }, callMetadata => frame.click(callMetadata, action.selector, { ...options, timeout: kActionTimeout, strict: true })); } if (action.name === 'press') { const modifiers = toModifiers(action.modifiers); const shortcut = [...modifiers, action.key].join('+'); - await perform('press', { selector: action.selector, key: shortcut }, callMetadata => frame.press(callMetadata, action.selector, shortcut, { timeout: kActionTimeout })); + await perform('press', { selector: action.selector, key: shortcut }, callMetadata => frame.press(callMetadata, action.selector, shortcut, { timeout: kActionTimeout, strict: true })); } if (action.name === 'check') - await perform('check', { selector: action.selector }, callMetadata => frame.check(callMetadata, action.selector, { timeout: kActionTimeout })); + await perform('check', { selector: action.selector }, callMetadata => frame.check(callMetadata, action.selector, { timeout: kActionTimeout, strict: true })); if (action.name === 'uncheck') - await perform('uncheck', { selector: action.selector }, callMetadata => frame.uncheck(callMetadata, action.selector, { timeout: kActionTimeout })); + await perform('uncheck', { selector: action.selector }, callMetadata => frame.uncheck(callMetadata, action.selector, { timeout: kActionTimeout, strict: true })); if (action.name === 'select') { const values = action.options.map(value => ({ value })); - await perform('selectOption', { selector: action.selector, values }, callMetadata => frame.selectOption(callMetadata, action.selector, [], values, { timeout: kActionTimeout })); + await perform('selectOption', { selector: action.selector, values }, callMetadata => frame.selectOption(callMetadata, action.selector, [], values, { timeout: kActionTimeout, strict: true })); } } @@ -497,11 +551,12 @@ class ContextRecorder extends EventEmitter { // Commit last action so that no further signals are added to it. this._generator.commitLastAction(); - this._generator.addAction({ - pageAlias: this._pageAliases.get(frame._page)!, - ...describeFrame(frame), + const frameDescription = await this._describeFrame(frame); + const actionInContext: ActionInContext = { + frame: frameDescription, action - }); + }; + this._generator.addAction(actionInContext); } private _onFrameNavigated(frame: Frame, page: Page) { diff --git a/tests/inspector/cli-codegen-1.spec.ts b/tests/inspector/cli-codegen-1.spec.ts index ed27f426a5c9b..0dca8e0324418 100644 --- a/tests/inspector/cli-codegen-1.spec.ts +++ b/tests/inspector/cli-codegen-1.spec.ts @@ -36,23 +36,23 @@ test.describe('cli codegen', () => { expect(sources.get('JavaScript').text).toContain(` // Click text=Submit - await page.click('text=Submit');`); + await page.locator('text=Submit').click();`); expect(sources.get('Python').text).toContain(` # Click text=Submit - page.click("text=Submit")`); + page.locator("text=Submit").click()`); expect(sources.get('Python Async').text).toContain(` # Click text=Submit - await page.click("text=Submit")`); + await page.locator("text=Submit").click()`); expect(sources.get('Java').text).toContain(` // Click text=Submit - page.click("text=Submit");`); + page.locator("text=Submit").click();`); expect(sources.get('C#').text).toContain(` // Click text=Submit - await page.ClickAsync("text=Submit");`); + await page.Locator("text=Submit").ClickAsync();`); expect(message.text()).toBe('click'); }); @@ -84,7 +84,7 @@ test.describe('cli codegen', () => { expect(sources.get('JavaScript').text).toContain(` // Click text=Submit - await page.click('text=Submit');`); + await page.locator('text=Submit').click();`); expect(message.text()).toBe('click'); }); @@ -115,7 +115,7 @@ test.describe('cli codegen', () => { expect(sources.get('JavaScript').text).toContain(` // Click canvas - await page.click('canvas', { + await page.locator('canvas').click({ position: { x: 250, y: 250 @@ -124,20 +124,20 @@ test.describe('cli codegen', () => { expect(sources.get('Python').text).toContain(` # Click canvas - page.click("canvas", position={"x":250,"y":250})`); + page.locator("canvas").click(position={"x":250,"y":250})`); expect(sources.get('Python Async').text).toContain(` # Click canvas - await page.click("canvas", position={"x":250,"y":250})`); + await page.locator("canvas").click(position={"x":250,"y":250})`); expect(sources.get('Java').text).toContain(` // Click canvas - page.click("canvas", new Page.ClickOptions() + page.locator("canvas").click(new Locator.ClickOptions() .setPosition(250, 250));`); expect(sources.get('C#').text).toContain(` // Click canvas - await page.ClickAsync("canvas", new PageClickOptions + await page.Locator("canvas").ClickAsync(new LocatorClickOptions { Position = new Position { @@ -170,23 +170,23 @@ test.describe('cli codegen', () => { expect(sources.get('JavaScript').text).toContain(` // Click text=Submit - await page.click('text=Submit');`); + await page.locator('text=Submit').click();`); expect(sources.get('Python').text).toContain(` # Click text=Submit - page.click("text=Submit")`); + page.locator("text=Submit").click()`); expect(sources.get('Python Async').text).toContain(` # Click text=Submit - await page.click("text=Submit")`); + await page.locator("text=Submit").click()`); expect(sources.get('Java').text).toContain(` // Click text=Submit - page.click("text=Submit");`); + page.locator("text=Submit").click();`); expect(sources.get('C#').text).toContain(` // Click text=Submit - await page.ClickAsync("text=Submit");`); + await page.Locator("text=Submit").ClickAsync();`); expect(message.text()).toBe('click'); }); @@ -221,7 +221,7 @@ test.describe('cli codegen', () => { ]); expect(sources.get('JavaScript').text).toContain(` // Click text=Some long text here - await page.click('text=Some long text here');`); + await page.locator('text=Some long text here').click();`); expect(message.text()).toBe('click'); }); @@ -240,22 +240,22 @@ test.describe('cli codegen', () => { expect(sources.get('JavaScript').text).toContain(` // Fill input[name="name"] - await page.fill('input[name="name"]', 'John');`); + await page.locator('input[name="name"]').fill('John');`); expect(sources.get('Java').text).toContain(` // Fill input[name="name"] - page.fill("input[name=\\\"name\\\"]", "John");`); + page.locator("input[name=\\\"name\\\"]").fill("John");`); expect(sources.get('Python').text).toContain(` # Fill input[name="name"] - page.fill(\"input[name=\\\"name\\\"]\", \"John\")`); + page.locator(\"input[name=\\\"name\\\"]\").fill(\"John\")`); expect(sources.get('Python Async').text).toContain(` # Fill input[name="name"] - await page.fill(\"input[name=\\\"name\\\"]\", \"John\")`); + await page.locator(\"input[name=\\\"name\\\"]\").fill(\"John\")`); expect(sources.get('C#').text).toContain(` // Fill input[name="name"] - await page.FillAsync(\"input[name=\\\"name\\\"]\", \"John\");`); + await page.Locator(\"input[name=\\\"name\\\"]\").FillAsync(\"John\");`); expect(message.text()).toBe('John'); }); @@ -274,7 +274,7 @@ test.describe('cli codegen', () => { ]); expect(sources.get('JavaScript').text).toContain(` // Fill textarea[name="name"] - await page.fill('textarea[name="name"]', 'John');`); + await page.locator('textarea[name="name"]').fill('John');`); expect(message.text()).toBe('John'); }); @@ -296,23 +296,23 @@ test.describe('cli codegen', () => { expect(sources.get('JavaScript').text).toContain(` // Press Enter with modifiers - await page.press('input[name="name"]', 'Shift+Enter');`); + await page.locator('input[name="name"]').press('Shift+Enter');`); expect(sources.get('Java').text).toContain(` // Press Enter with modifiers - page.press("input[name=\\\"name\\\"]", "Shift+Enter");`); + page.locator("input[name=\\\"name\\\"]").press("Shift+Enter");`); expect(sources.get('Python').text).toContain(` # Press Enter with modifiers - page.press(\"input[name=\\\"name\\\"]\", \"Shift+Enter\")`); + page.locator(\"input[name=\\\"name\\\"]\").press(\"Shift+Enter\")`); expect(sources.get('Python Async').text).toContain(` # Press Enter with modifiers - await page.press(\"input[name=\\\"name\\\"]\", \"Shift+Enter\")`); + await page.locator(\"input[name=\\\"name\\\"]\").press(\"Shift+Enter\")`); expect(sources.get('C#').text).toContain(` // Press Enter with modifiers - await page.PressAsync(\"input[name=\\\"name\\\"]\", \"Shift+Enter\");`); + await page.Locator(\"input[name=\\\"name\\\"]\").PressAsync(\"Shift+Enter\");`); expect(messages[0].text()).toBe('press'); }); @@ -338,15 +338,15 @@ test.describe('cli codegen', () => { const text = recorder.sources().get('JavaScript').text; expect(text).toContain(` // Fill input[name="one"] - await page.fill('input[name="one"]', 'foobar123');`); + await page.locator('input[name="one"]').fill('foobar123');`); expect(text).toContain(` // Press Tab - await page.press('input[name="one"]', 'Tab');`); + await page.locator('input[name="one"]').press('Tab');`); expect(text).toContain(` // Fill input[name="two"] - await page.fill('input[name="two"]', 'barfoo321');`); + await page.locator('input[name="two"]').fill('barfoo321');`); }); test('should record ArrowDown', async ({ page, openRecorder }) => { @@ -368,7 +368,7 @@ test.describe('cli codegen', () => { ]); expect(sources.get('JavaScript').text).toContain(` // Press ArrowDown - await page.press('input[name="name"]', 'ArrowDown');`); + await page.locator('input[name="name"]').press('ArrowDown');`); expect(messages[0].text()).toBe('press:ArrowDown'); }); @@ -392,7 +392,7 @@ test.describe('cli codegen', () => { ]); expect(sources.get('JavaScript').text).toContain(` // Press ArrowDown - await page.press('input[name="name"]', 'ArrowDown');`); + await page.locator('input[name="name"]').press('ArrowDown');`); expect(messages.length).toBe(2); expect(messages[0].text()).toBe('down:ArrowDown'); expect(messages[1].text()).toBe('up:ArrowDown'); @@ -414,23 +414,23 @@ test.describe('cli codegen', () => { expect(sources.get('JavaScript').text).toContain(` // Check input[name="accept"] - await page.check('input[name="accept"]');`); + await page.locator('input[name="accept"]').check();`); expect(sources.get('Java').text).toContain(` // Check input[name="accept"] - page.check("input[name=\\\"accept\\\"]");`); + page.locator("input[name=\\\"accept\\\"]").check();`); expect(sources.get('Python').text).toContain(` # Check input[name="accept"] - page.check(\"input[name=\\\"accept\\\"]\")`); + page.locator(\"input[name=\\\"accept\\\"]\").check()`); expect(sources.get('Python Async').text).toContain(` # Check input[name="accept"] - await page.check(\"input[name=\\\"accept\\\"]\")`); + await page.locator(\"input[name=\\\"accept\\\"]\").check()`); expect(sources.get('C#').text).toContain(` // Check input[name="accept"] - await page.CheckAsync(\"input[name=\\\"accept\\\"]\");`); + await page.Locator(\"input[name=\\\"accept\\\"]\").CheckAsync();`); expect(message.text()).toBe('true'); }); @@ -451,7 +451,7 @@ test.describe('cli codegen', () => { expect(sources.get('JavaScript').text).toContain(` // Check input[name="accept"] - await page.check('input[name="accept"]');`); + await page.locator('input[name="accept"]').check();`); expect(message.text()).toBe('true'); }); @@ -471,23 +471,23 @@ test.describe('cli codegen', () => { expect(sources.get('JavaScript').text).toContain(` // Uncheck input[name="accept"] - await page.uncheck('input[name="accept"]');`); + await page.locator('input[name="accept"]').uncheck();`); expect(sources.get('Java').text).toContain(` // Uncheck input[name="accept"] - page.uncheck("input[name=\\\"accept\\\"]");`); + page.locator("input[name=\\\"accept\\\"]").uncheck();`); expect(sources.get('Python').text).toContain(` # Uncheck input[name="accept"] - page.uncheck(\"input[name=\\\"accept\\\"]\")`); + page.locator(\"input[name=\\\"accept\\\"]\").uncheck()`); expect(sources.get('Python Async').text).toContain(` # Uncheck input[name="accept"] - await page.uncheck(\"input[name=\\\"accept\\\"]\")`); + await page.locator(\"input[name=\\\"accept\\\"]\").uncheck()`); expect(sources.get('C#').text).toContain(` // Uncheck input[name="accept"] - await page.UncheckAsync(\"input[name=\\\"accept\\\"]\");`); + await page.Locator(\"input[name=\\\"accept\\\"]\").UncheckAsync();`); expect(message.text()).toBe('false'); }); @@ -508,23 +508,23 @@ test.describe('cli codegen', () => { expect(sources.get('JavaScript').text).toContain(` // Select 2 - await page.selectOption('select', '2');`); + await page.locator('select').selectOption('2');`); expect(sources.get('Java').text).toContain(` // Select 2 - page.selectOption("select", "2");`); + page.locator("select").selectOption("2");`); expect(sources.get('Python').text).toContain(` # Select 2 - page.select_option(\"select\", \"2\")`); + page.locator(\"select\").select_option(\"2\")`); expect(sources.get('Python Async').text).toContain(` # Select 2 - await page.select_option(\"select\", \"2\")`); + await page.locator(\"select\").select_option(\"2\")`); expect(sources.get('C#').text).toContain(` // Select 2 - await page.SelectOptionAsync(\"select\", new[] { \"2\" });`); + await page.Locator(\"select\").SelectOptionAsync(new[] { \"2\" });`); expect(message.text()).toBe('2'); }); @@ -548,31 +548,31 @@ test.describe('cli codegen', () => { // Click text=link const [page1] = await Promise.all([ page.waitForEvent('popup'), - page.click('text=link') + page.locator('text=link').click() ]);`); expect(sources.get('Java').text).toContain(` // Click text=link Page page1 = page.waitForPopup(() -> { - page.click("text=link"); + page.locator("text=link").click(); });`); expect(sources.get('Python').text).toContain(` # Click text=link with page.expect_popup() as popup_info: - page.click(\"text=link\") + page.locator(\"text=link\").click() page1 = popup_info.value`); expect(sources.get('Python Async').text).toContain(` # Click text=link async with page.expect_popup() as popup_info: - await page.click(\"text=link\") + await page.locator(\"text=link\").click() page1 = await popup_info.value`); expect(sources.get('C#').text).toContain(` var page1 = await page.RunAndWaitForPopupAsync(async () => { - await page.ClickAsync(\"text=link\"); + await page.Locator(\"text=link\").ClickAsync(); });`); expect(popup.url()).toBe('about:blank'); @@ -593,32 +593,32 @@ test.describe('cli codegen', () => { expect(sources.get('JavaScript').text).toContain(` // Click text=link - await page.click('text=link'); + await page.locator('text=link').click(); // assert.equal(page.url(), 'about:blank#foo');`); expect(sources.get('Playwright Test').text).toContain(` // Click text=link - await page.click('text=link'); + await page.locator('text=link').click(); await expect(page).toHaveURL('about:blank#foo');`); expect(sources.get('Java').text).toContain(` // Click text=link - page.click("text=link"); + page.locator("text=link").click(); // assert page.url().equals("about:blank#foo");`); expect(sources.get('Python').text).toContain(` # Click text=link - page.click(\"text=link\") + page.locator(\"text=link\").click() # assert page.url == \"about:blank#foo\"`); expect(sources.get('Python Async').text).toContain(` # Click text=link - await page.click(\"text=link\") + await page.locator(\"text=link\").click() # assert page.url == \"about:blank#foo\"`); expect(sources.get('C#').text).toContain(` // Click text=link - await page.ClickAsync(\"text=link\"); + await page.Locator(\"text=link\").ClickAsync(); // Assert.AreEqual(\"about:blank#foo\", page.Url);`); expect(page.url()).toContain('about:blank#foo'); @@ -643,33 +643,33 @@ test.describe('cli codegen', () => { // Click text=link await Promise.all([ page.waitForNavigation(/*{ url: 'about:blank#foo' }*/), - page.click('text=link') + page.locator('text=link').click() ]);`); expect(sources.get('Java').text).toContain(` // Click text=link // page.waitForNavigation(new Page.WaitForNavigationOptions().setUrl("about:blank#foo"), () -> page.waitForNavigation(() -> { - page.click("text=link"); + page.locator("text=link").click(); });`); expect(sources.get('Python').text).toContain(` # Click text=link # with page.expect_navigation(url=\"about:blank#foo\"): with page.expect_navigation(): - page.click(\"text=link\")`); + page.locator(\"text=link\").click()`); expect(sources.get('Python Async').text).toContain(` # Click text=link # async with page.expect_navigation(url=\"about:blank#foo\"): async with page.expect_navigation(): - await page.click(\"text=link\")`); + await page.locator(\"text=link\").click()`); expect(sources.get('C#').text).toContain(` // Click text=link await page.RunAndWaitForNavigationAsync(async () => { - await page.ClickAsync(\"text=link\"); + await page.Locator(\"text=link\").ClickAsync(); }/*, new PageWaitForNavigationOptions { UrlString = \"about:blank#foo\" @@ -688,8 +688,8 @@ test.describe('cli codegen', () => { await recorder.page.keyboard.insertText('@'); await recorder.page.keyboard.type('example.com'); await recorder.waitForOutput('JavaScript', 'example.com'); - expect(recorder.sources().get('JavaScript').text).not.toContain(`await page.press('input', 'AltGraph');`); - expect(recorder.sources().get('JavaScript').text).toContain(`await page.fill('input', 'playwright@example.com');`); + expect(recorder.sources().get('JavaScript').text).not.toContain(`await page.locator('input').press('AltGraph');`); + expect(recorder.sources().get('JavaScript').text).toContain(`await page.locator('input').fill('playwright@example.com');`); }); test('should middle click', async ({ page, openRecorder, server }) => { @@ -703,22 +703,22 @@ test.describe('cli codegen', () => { ]); expect(sources.get('JavaScript').text).toContain(` - await page.click('text=Click me', { + await page.locator('text=Click me').click({ button: 'middle' });`); expect(sources.get('Python').text).toContain(` - page.click("text=Click me", button="middle")`); + page.locator("text=Click me").click(button="middle")`); expect(sources.get('Python Async').text).toContain(` - await page.click("text=Click me", button="middle")`); + await page.locator("text=Click me").click(button="middle")`); expect(sources.get('Java').text).toContain(` - page.click("text=Click me", new Page.ClickOptions() + page.locator("text=Click me").click(new Locator.ClickOptions() .setButton(MouseButton.MIDDLE));`); expect(sources.get('C#').text).toContain(` - await page.ClickAsync("text=Click me", new PageClickOptions + await page.Locator("text=Click me").ClickAsync(new LocatorClickOptions { Button = MouseButton.Middle, });`); diff --git a/tests/inspector/cli-codegen-2.spec.ts b/tests/inspector/cli-codegen-2.spec.ts index c59b2a126fce2..a3ef05c898552 100644 --- a/tests/inspector/cli-codegen-2.spec.ts +++ b/tests/inspector/cli-codegen-2.spec.ts @@ -133,23 +133,23 @@ test.describe('cli codegen', () => { expect(sources.get('JavaScript').text).toContain(` // Upload file-to-upload.txt - await page.setInputFiles('input[type="file"]', 'file-to-upload.txt');`); + await page.locator('input[type="file"]').setInputFiles('file-to-upload.txt');`); expect(sources.get('Java').text).toContain(` // Upload file-to-upload.txt - page.setInputFiles("input[type=\\\"file\\\"]", Paths.get("file-to-upload.txt"));`); + page.locator("input[type=\\\"file\\\"]").setInputFiles(Paths.get("file-to-upload.txt"));`); expect(sources.get('Python').text).toContain(` # Upload file-to-upload.txt - page.set_input_files(\"input[type=\\\"file\\\"]\", \"file-to-upload.txt\")`); + page.locator(\"input[type=\\\"file\\\"]\").set_input_files(\"file-to-upload.txt\")`); expect(sources.get('Python Async').text).toContain(` # Upload file-to-upload.txt - await page.set_input_files(\"input[type=\\\"file\\\"]\", \"file-to-upload.txt\")`); + await page.locator(\"input[type=\\\"file\\\"]\").set_input_files(\"file-to-upload.txt\")`); expect(sources.get('C#').text).toContain(` // Upload file-to-upload.txt - await page.SetInputFilesAsync(\"input[type=\\\"file\\\"]\", new[] { \"file-to-upload.txt\" });`); + await page.Locator(\"input[type=\\\"file\\\"]\").SetInputFilesAsync(new[] { \"file-to-upload.txt\" });`); }); test('should upload multiple files', async ({ page, openRecorder, browserName, asset }) => { @@ -170,23 +170,23 @@ test.describe('cli codegen', () => { expect(sources.get('JavaScript').text).toContain(` // Upload file-to-upload.txt, file-to-upload-2.txt - await page.setInputFiles('input[type=\"file\"]', ['file-to-upload.txt', 'file-to-upload-2.txt']);`); + await page.locator('input[type=\"file\"]').setInputFiles(['file-to-upload.txt', 'file-to-upload-2.txt']);`); expect(sources.get('Java').text).toContain(` // Upload file-to-upload.txt, file-to-upload-2.txt - page.setInputFiles("input[type=\\\"file\\\"]", new Path[] {Paths.get("file-to-upload.txt"), Paths.get("file-to-upload-2.txt")});`); + page.locator("input[type=\\\"file\\\"]").setInputFiles(new Path[] {Paths.get("file-to-upload.txt"), Paths.get("file-to-upload-2.txt")});`); expect(sources.get('Python').text).toContain(` # Upload file-to-upload.txt, file-to-upload-2.txt - page.set_input_files(\"input[type=\\\"file\\\"]\", [\"file-to-upload.txt\", \"file-to-upload-2.txt\"]`); + page.locator(\"input[type=\\\"file\\\"]\").set_input_files([\"file-to-upload.txt\", \"file-to-upload-2.txt\"]`); expect(sources.get('Python Async').text).toContain(` # Upload file-to-upload.txt, file-to-upload-2.txt - await page.set_input_files(\"input[type=\\\"file\\\"]\", [\"file-to-upload.txt\", \"file-to-upload-2.txt\"]`); + await page.locator(\"input[type=\\\"file\\\"]\").set_input_files([\"file-to-upload.txt\", \"file-to-upload-2.txt\"]`); expect(sources.get('C#').text).toContain(` // Upload file-to-upload.txt, file-to-upload-2.txt - await page.SetInputFilesAsync(\"input[type=\\\"file\\\"]\", new[] { \"file-to-upload.txt\", \"file-to-upload-2.txt\" });`); + await page.Locator(\"input[type=\\\"file\\\"]\").SetInputFilesAsync(new[] { \"file-to-upload.txt\", \"file-to-upload-2.txt\" });`); }); test('should clear files', async ({ page, openRecorder, browserName, asset }) => { @@ -207,23 +207,23 @@ test.describe('cli codegen', () => { expect(sources.get('JavaScript').text).toContain(` // Clear selected files - await page.setInputFiles('input[type=\"file\"]', []);`); + await page.locator('input[type=\"file\"]').setInputFiles([]);`); expect(sources.get('Java').text).toContain(` // Clear selected files - page.setInputFiles("input[type=\\\"file\\\"]", new Path[0]);`); + page.locator("input[type=\\\"file\\\"]").setInputFiles(new Path[0]);`); expect(sources.get('Python').text).toContain(` # Clear selected files - page.set_input_files(\"input[type=\\\"file\\\"]\", []`); + page.locator(\"input[type=\\\"file\\\"]\").set_input_files([])`); expect(sources.get('Python Async').text).toContain(` # Clear selected files - await page.set_input_files(\"input[type=\\\"file\\\"]\", []`); + await page.locator(\"input[type=\\\"file\\\"]\").set_input_files([])`); expect(sources.get('C#').text).toContain(` // Clear selected files - await page.SetInputFilesAsync(\"input[type=\\\"file\\\"]\", new[] { });`); + await page.Locator(\"input[type=\\\"file\\\"]\").SetInputFilesAsync(new[] { });`); }); @@ -257,7 +257,7 @@ test.describe('cli codegen', () => { // Click text=Download const [download] = await Promise.all([ page.waitForEvent('download'), - page.click('text=Download') + page.locator('text=Download').click() ]);`); expect(sources.get('Java').text).toContain(` @@ -265,7 +265,7 @@ test.describe('cli codegen', () => { expect(sources.get('Java').text).toContain(` // Click text=Download Download download = page.waitForDownload(() -> { - page.click("text=Download"); + page.locator("text=Download").click(); });`); expect(sources.get('Python').text).toContain(` @@ -273,7 +273,7 @@ test.describe('cli codegen', () => { expect(sources.get('Python').text).toContain(` # Click text=Download with page.expect_download() as download_info: - page.click(\"text=Download\") + page.locator(\"text=Download\").click() download = download_info.value`); expect(sources.get('Python Async').text).toContain(` @@ -281,7 +281,7 @@ test.describe('cli codegen', () => { expect(sources.get('Python Async').text).toContain(` # Click text=Download async with page.expect_download() as download_info: - await page.click(\"text=Download\") + await page.locator(\"text=Download\").click() download = await download_info.value`); expect(sources.get('C#').text).toContain(` @@ -290,7 +290,7 @@ test.describe('cli codegen', () => { // Click text=Download var download1 = await page.RunAndWaitForDownloadAsync(async () => { - await page.ClickAsync(\"text=Download\"); + await page.Locator(\"text=Download\").ClickAsync(); });`); }); @@ -314,7 +314,7 @@ test.describe('cli codegen', () => { console.log(\`Dialog message: \${dialog.message()}\`); dialog.dismiss().catch(() => {}); }); - await page.click('text=click me');`); + await page.locator('text=click me').click();`); expect(sources.get('Java').text).toContain(` // Click text=click me @@ -322,17 +322,17 @@ test.describe('cli codegen', () => { System.out.println(String.format("Dialog message: %s", dialog.message())); dialog.dismiss(); }); - page.click("text=click me");`); + page.locator("text=click me").click();`); expect(sources.get('Python').text).toContain(` # Click text=click me page.once(\"dialog\", lambda dialog: dialog.dismiss()) - page.click(\"text=click me\")`); + page.locator(\"text=click me\").click()`); expect(sources.get('Python Async').text).toContain(` # Click text=click me page.once(\"dialog\", lambda dialog: dialog.dismiss()) - await page.click(\"text=click me\")`); + await page.locator(\"text=click me\").click()`); expect(sources.get('C#').text).toContain(` // Click text=click me @@ -343,7 +343,7 @@ test.describe('cli codegen', () => { page.Dialog -= page_Dialog1_EventHandler; } page.Dialog += page_Dialog1_EventHandler; - await page.ClickAsync(\"text=click me\");`); + await page.Locator(\"text=click me\").ClickAsync();`); }); @@ -393,7 +393,7 @@ test.describe('cli codegen', () => { // Click text=link const [page1] = await Promise.all([ page.waitForEvent('popup'), - page.click('text=link', { + page.locator('text=link').click({ modifiers: ['${platform === 'darwin' ? 'Meta' : 'Control'}'] }) ]);`); @@ -423,20 +423,20 @@ test.describe('cli codegen', () => { await recorder.waitForOutput('JavaScript', 'TextB'); const sources = recorder.sources(); - expect(sources.get('JavaScript').text).toContain(`await page1.fill('input', 'TextA');`); - expect(sources.get('JavaScript').text).toContain(`await page2.fill('input', 'TextB');`); + expect(sources.get('JavaScript').text).toContain(`await page1.locator('input').fill('TextA');`); + expect(sources.get('JavaScript').text).toContain(`await page2.locator('input').fill('TextB');`); - expect(sources.get('Java').text).toContain(`page1.fill("input", "TextA");`); - expect(sources.get('Java').text).toContain(`page2.fill("input", "TextB");`); + expect(sources.get('Java').text).toContain(`page1.locator("input").fill("TextA");`); + expect(sources.get('Java').text).toContain(`page2.locator("input").fill("TextB");`); - expect(sources.get('Python').text).toContain(`page1.fill(\"input\", \"TextA\")`); - expect(sources.get('Python').text).toContain(`page2.fill(\"input\", \"TextB\")`); + expect(sources.get('Python').text).toContain(`page1.locator(\"input\").fill(\"TextA\")`); + expect(sources.get('Python').text).toContain(`page2.locator(\"input\").fill(\"TextB\")`); - expect(sources.get('Python Async').text).toContain(`await page1.fill(\"input\", \"TextA\")`); - expect(sources.get('Python Async').text).toContain(`await page2.fill(\"input\", \"TextB\")`); + expect(sources.get('Python Async').text).toContain(`await page1.locator(\"input\").fill(\"TextA\")`); + expect(sources.get('Python Async').text).toContain(`await page2.locator(\"input\").fill(\"TextB\")`); - expect(sources.get('C#').text).toContain(`await page1.FillAsync(\"input\", \"TextA\");`); - expect(sources.get('C#').text).toContain(`await page2.FillAsync(\"input\", \"TextB\");`); + expect(sources.get('C#').text).toContain(`await page1.Locator(\"input\").FillAsync(\"TextA\");`); + expect(sources.get('C#').text).toContain(`await page2.Locator(\"input\").FillAsync(\"TextB\");`); }); test('click should emit events in order', async ({ page, openRecorder }) => { @@ -458,7 +458,7 @@ test.describe('cli codegen', () => { }); await Promise.all([ page.click('button'), - recorder.waitForOutput('JavaScript', 'page.click') + recorder.waitForOutput('JavaScript', '.click(') ]); expect(messages).toEqual(['mousedown', 'mouseup', 'click']); }); @@ -496,99 +496,6 @@ test.describe('cli codegen', () => { ]); }); - test('should prefer frame name', async ({ page, openRecorder, server }) => { - const recorder = await openRecorder(); - await recorder.setContentAndWait(` - - - - `, server.EMPTY_PAGE, 4); - const frameOne = page.frame({ name: 'one' }); - const frameTwo = page.frame({ name: 'two' }); - const otherFrame = page.frames().find(f => f !== page.mainFrame() && !f.name()); - - let [sources] = await Promise.all([ - recorder.waitForOutput('JavaScript', 'one'), - frameOne.click('div'), - ]); - - expect(sources.get('JavaScript').text).toContain(` - // Click text=Hi, I'm frame - await page.frame({ - name: 'one' - }).click('text=Hi, I\\'m frame');`); - - expect(sources.get('Java').text).toContain(` - // Click text=Hi, I'm frame - page.frame("one").click("text=Hi, I'm frame");`); - - expect(sources.get('Python').text).toContain(` - # Click text=Hi, I'm frame - page.frame(name=\"one\").click(\"text=Hi, I'm frame\")`); - - expect(sources.get('Python Async').text).toContain(` - # Click text=Hi, I'm frame - await page.frame(name=\"one\").click(\"text=Hi, I'm frame\")`); - - expect(sources.get('C#').text).toContain(` - // Click text=Hi, I'm frame - await page.Frame(\"one\").ClickAsync(\"text=Hi, I'm frame\");`); - - [sources] = await Promise.all([ - recorder.waitForOutput('JavaScript', 'two'), - frameTwo.click('div'), - ]); - - expect(sources.get('JavaScript').text).toContain(` - // Click text=Hi, I'm frame - await page.frame({ - name: 'two' - }).click('text=Hi, I\\'m frame');`); - - expect(sources.get('Java').text).toContain(` - // Click text=Hi, I'm frame - page.frame("two").click("text=Hi, I'm frame");`); - - expect(sources.get('Python').text).toContain(` - # Click text=Hi, I'm frame - page.frame(name=\"two\").click(\"text=Hi, I'm frame\")`); - - expect(sources.get('Python Async').text).toContain(` - # Click text=Hi, I'm frame - await page.frame(name=\"two\").click(\"text=Hi, I'm frame\")`); - - expect(sources.get('C#').text).toContain(` - // Click text=Hi, I'm frame - await page.Frame(\"two\").ClickAsync(\"text=Hi, I'm frame\");`); - - [sources] = await Promise.all([ - recorder.waitForOutput('JavaScript', 'url: \''), - otherFrame.click('div'), - ]); - - expect(sources.get('JavaScript').text).toContain(` - // Click text=Hi, I'm frame - await page.frame({ - url: 'http://localhost:${server.PORT}/frames/frame.html' - }).click('text=Hi, I\\'m frame');`); - - expect(sources.get('Java').text).toContain(` - // Click text=Hi, I'm frame - page.frameByUrl("http://localhost:${server.PORT}/frames/frame.html").click("text=Hi, I'm frame");`); - - expect(sources.get('Python').text).toContain(` - # Click text=Hi, I'm frame - page.frame(url=\"http://localhost:${server.PORT}/frames/frame.html\").click(\"text=Hi, I'm frame\")`); - - expect(sources.get('Python Async').text).toContain(` - # Click text=Hi, I'm frame - await page.frame(url=\"http://localhost:${server.PORT}/frames/frame.html\").click(\"text=Hi, I'm frame\")`); - - expect(sources.get('C#').text).toContain(` - // Click text=Hi, I'm frame - await page.FrameByUrl(\"http://localhost:${server.PORT}/frames/frame.html\").ClickAsync(\"text=Hi, I'm frame\");`); - }); - test('should record navigations after identical pushState', async ({ page, openRecorder, server }) => { const recorder = await openRecorder(); server.setRoute('/page2.html', (req, res) => { @@ -655,22 +562,23 @@ test.describe('cli codegen', () => { expect(sources.get('JavaScript').text).toContain(` // Fill textarea[name="name"] - await page.fill('textarea[name="name"]', 'Hello\\'"\`\\nWorld');`); + await page.locator('textarea[name="name"]').fill('Hello\\'"\`\\nWorld');`); + expect(sources.get('Java').text).toContain(` // Fill textarea[name="name"] - page.fill("textarea[name=\\\"name\\\"]", "Hello'\\"\`\\nWorld");`); + page.locator("textarea[name=\\\"name\\\"]").fill("Hello'\\"\`\\nWorld");`); expect(sources.get('Python').text).toContain(` # Fill textarea[name="name"] - page.fill(\"textarea[name=\\\"name\\\"]\", \"Hello'\\"\`\\nWorld\")`); + page.locator(\"textarea[name=\\\"name\\\"]\").fill(\"Hello'\\"\`\\nWorld\")`); expect(sources.get('Python Async').text).toContain(` # Fill textarea[name="name"] - await page.fill(\"textarea[name=\\\"name\\\"]\", \"Hello'\\"\`\\nWorld\")`); + await page.locator(\"textarea[name=\\\"name\\\"]\").fill(\"Hello'\\"\`\\nWorld\")`); expect(sources.get('C#').text).toContain(` // Fill textarea[name="name"] - await page.FillAsync(\"textarea[name=\\\"name\\\"]\", \"Hello'\\"\`\\nWorld\");`); + await page.Locator(\"textarea[name=\\\"name\\\"]\").FillAsync(\"Hello'\\"\`\\nWorld\");`); expect(message.text()).toBe('Hello\'\"\`\nWorld'); }); diff --git a/tests/inspector/cli-codegen-3.spec.ts b/tests/inspector/cli-codegen-3.spec.ts new file mode 100644 index 0000000000000..8997ee26dd9b8 --- /dev/null +++ b/tests/inspector/cli-codegen-3.spec.ts @@ -0,0 +1,235 @@ +/** + * Copyright (c) Microsoft Corporation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { test, expect } from './inspectorTest'; + +test.describe('cli codegen', () => { + test.skip(({ mode }) => mode !== 'default'); + + test('should click locator.first', async ({ page, openRecorder }) => { + const recorder = await openRecorder(); + + await recorder.setContentAndWait(` + + + `); + + const selector = await recorder.hoverOverElement('button'); + expect(selector).toBe('text=Submit >> nth=0'); + + const [message, sources] = await Promise.all([ + page.waitForEvent('console', msg => msg.type() !== 'error'), + recorder.waitForOutput('JavaScript', 'click'), + page.dispatchEvent('button', 'click', { detail: 1 }) + ]); + + expect(sources.get('JavaScript').text).toContain(` + // Click text=Submit >> nth=0 + await page.locator('text=Submit').first().click();`); + + expect(sources.get('Python').text).toContain(` + # Click text=Submit >> nth=0 + page.locator("text=Submit").first.click()`); + + expect(sources.get('Python Async').text).toContain(` + # Click text=Submit >> nth=0 + await page.locator("text=Submit").first.click()`); + + expect(sources.get('Java').text).toContain(` + // Click text=Submit >> nth=0 + page.locator("text=Submit").first().click();`); + + expect(sources.get('C#').text).toContain(` + // Click text=Submit >> nth=0 + await page.Locator("text=Submit").First.ClickAsync();`); + + expect(message.text()).toBe('click1'); + }); + + test('should click locator.nth', async ({ page, openRecorder }) => { + const recorder = await openRecorder(); + + await recorder.setContentAndWait(` + + + `); + + const selector = await recorder.hoverOverElement('button >> nth=1'); + expect(selector).toBe('text=Submit >> nth=1'); + + const [message, sources] = await Promise.all([ + page.waitForEvent('console', msg => msg.type() !== 'error'), + recorder.waitForOutput('JavaScript', 'click'), + page.dispatchEvent('button', 'click', { detail: 1 }) + ]); + + expect(sources.get('JavaScript').text).toContain(` + // Click text=Submit >> nth=1 + await page.locator('text=Submit').nth(1).click();`); + + expect(sources.get('Python').text).toContain(` + # Click text=Submit >> nth=1 + page.locator("text=Submit").nth(1).click()`); + + expect(sources.get('Python Async').text).toContain(` + # Click text=Submit >> nth=1 + await page.locator("text=Submit").nth(1).click()`); + + expect(sources.get('Java').text).toContain(` + // Click text=Submit >> nth=1 + page.locator("text=Submit").nth(1).click();`); + + expect(sources.get('C#').text).toContain(` + // Click text=Submit >> nth=1 + await page.Locator("text=Submit").Nth(1).ClickAsync();`); + + expect(message.text()).toBe('click2'); + }); + + test('should generate frame locators', async ({ page, openRecorder, server }) => { + const recorder = await openRecorder(); + /* + iframe + div Hello1 + iframe + div Hello2 + iframe[name=one] + div HelloNameOne + iframe[name=two] + dev HelloNameTwo + iframe + dev HelloAnonymous + */ + await recorder.setContentAndWait(` +