From 04aeed0d3b7886654854b2c5f9c4102e99d733ca Mon Sep 17 00:00:00 2001 From: Joey Parrish Date: Mon, 1 Feb 2021 17:20:38 +0000 Subject: [PATCH 1/7] feat(Xbox): New backend for Xbox One This backend requires: - Xbox One device in Dev Mode - Windows 10 host - Visual Studio - Windows 10 SDK It builds a UWP (Universal Windows Platform) application hosting a WebView pointing to the desired destination URL, then deploys that app to the Xbox and launches it. In this way, it is very similar to the Tizen backend. But because this backend uses Visual Studio to build a UWP app, it **must** be run on Windows. --- CHANGELOG.md | 4 + README.md | 1 + backends/tizen/README.md | 10 +- backends/tizen/tizen-utils.js | 3 +- backends/xboxone/CHANGELOG.md | 3 + backends/xboxone/README.md | 152 ++ backends/xboxone/app-template/.gitignore | 5 + backends/xboxone/app-template/App.xaml | 26 + backends/xboxone/app-template/App.xaml.cs | 104 ++ .../Assets/SplashScreen.scale-200.png | Bin 0 -> 82676 bytes .../Assets/Square150x150Logo.scale-200.png | Bin 0 -> 41276 bytes .../Assets/Square44x44Logo.scale-200.png | Bin 0 -> 9285 bytes .../xboxone/app-template/Assets/StoreLogo.png | Bin 0 -> 4180 bytes .../Assets/Wide310x150Logo.scale-200.png | Bin 0 -> 37643 bytes backends/xboxone/app-template/MainPage.xaml | 39 + .../xboxone/app-template/MainPage.xaml.cs | 34 + .../xboxone/app-template/Package.appxmanifest | 55 + .../PackageCertificateKeyFile.pfx | Bin 0 -> 2560 bytes .../app-template/Properties/AssemblyInfo.cs | 29 + .../app-template/Properties/Default.rd.xml | 31 + backends/xboxone/app-template/README.md | 10 + .../XboxOneWebDriverServer.csproj | 182 ++ .../app-template/XboxOneWebDriverServer.sln | 51 + backends/xboxone/how-it-works.md | 57 + backends/xboxone/package-lock.json | 1660 +++++++++++++++++ backends/xboxone/package.json | 37 + backends/xboxone/tunneling.md | 70 + backends/xboxone/xbox-one-utils.js | 373 ++++ backends/xboxone/xbox-one-webdriver-cli.js | 75 + backends/xboxone/xbox-one-webdriver-server.js | 71 + package-lock.json | 535 +++++- package.json | 2 +- 32 files changed, 3548 insertions(+), 71 deletions(-) create mode 100644 backends/xboxone/CHANGELOG.md create mode 100644 backends/xboxone/README.md create mode 100644 backends/xboxone/app-template/.gitignore create mode 100644 backends/xboxone/app-template/App.xaml create mode 100644 backends/xboxone/app-template/App.xaml.cs create mode 100644 backends/xboxone/app-template/Assets/SplashScreen.scale-200.png create mode 100644 backends/xboxone/app-template/Assets/Square150x150Logo.scale-200.png create mode 100644 backends/xboxone/app-template/Assets/Square44x44Logo.scale-200.png create mode 100644 backends/xboxone/app-template/Assets/StoreLogo.png create mode 100644 backends/xboxone/app-template/Assets/Wide310x150Logo.scale-200.png create mode 100644 backends/xboxone/app-template/MainPage.xaml create mode 100644 backends/xboxone/app-template/MainPage.xaml.cs create mode 100644 backends/xboxone/app-template/Package.appxmanifest create mode 100644 backends/xboxone/app-template/PackageCertificateKeyFile.pfx create mode 100644 backends/xboxone/app-template/Properties/AssemblyInfo.cs create mode 100644 backends/xboxone/app-template/Properties/Default.rd.xml create mode 100644 backends/xboxone/app-template/README.md create mode 100644 backends/xboxone/app-template/XboxOneWebDriverServer.csproj create mode 100644 backends/xboxone/app-template/XboxOneWebDriverServer.sln create mode 100644 backends/xboxone/how-it-works.md create mode 100644 backends/xboxone/package-lock.json create mode 100644 backends/xboxone/package.json create mode 100644 backends/xboxone/tunneling.md create mode 100644 backends/xboxone/xbox-one-utils.js create mode 100755 backends/xboxone/xbox-one-webdriver-cli.js create mode 100755 backends/xboxone/xbox-one-webdriver-server.js diff --git a/CHANGELOG.md b/CHANGELOG.md index 65bfbd5..ca4d560 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +## 1.1.1 (2021-02-11) + +Added links to Xbox One backend package from base package README. + ## 1.1.0 (2020-12-22) Document setup with Chromium-based Edge. Although this didn't require any code diff --git a/README.md b/README.md index 5a84b44..2df68db 100644 --- a/README.md +++ b/README.md @@ -35,6 +35,7 @@ Out of the box, we provide backends for: - Chromecast (NPM package [`chromecast-webdriver-server`](https://www.npmjs.com/package/chromecast-webdriver-server)) - ChromeOS (NPM package [`chromeos-webdriver-server`](https://www.npmjs.com/package/chromeos-webdriver-server)) - Tizen (NPM package [`tizen-webdriver-server`](https://www.npmjs.com/package/tizen-webdriver-server)) + - Xbox One (NPM package [`xbox-one-webdriver-server`](https://www.npmjs.com/package/xbox-one-webdriver-server)) In addition, you'll need JAR files from the package [`generic-webdriver-server`](https://www.npmjs.com/package/generic-webdriver-server). diff --git a/backends/tizen/README.md b/backends/tizen/README.md index 3f5adbb..5c7df09 100644 --- a/backends/tizen/README.md +++ b/backends/tizen/README.md @@ -40,7 +40,8 @@ properties: provided in the client's desired capabilities instead. (See below.) - `genericwebdriver.backend.params.wake-on-lan-address`: The ethernet address of the Tizen device, to wake it in case it is sleeping at the beginning of - the session. Optional, but highly recommended. + the session. Optional, but highly recommended. NOTE: This will only work + over wired ethernet connections, **not WiFi**! ## Supported parameters @@ -50,7 +51,9 @@ This backend supports the following parameters: - `hostname`: **(required)** The hostname or IP address of the Tizen device, with optional port number. - `wake-on-lan-address`: The ethernet address of the Tizen device, to wake it - in case it is sleeping at the beginning of the session. + in case it is sleeping at the beginning of the session. Optional, but + highly recommended. NOTE: This will only work over wired ethernet + connections, **not WiFi**! - `local-tizen-studio`: If true, use a locally-installed copy of Tizen Studio instead of a Docker image. - `tizen-studio-docker-image`: The name of a Docker image to use for Tizen @@ -95,7 +98,8 @@ directing a Tizen device to a specific URL. For example, if installed globally with `npm install -g tizen-webdriver-server`: ```sh -tizen-webdriver-cli --hostname=192.168.1.42 --url=https://www.google.com/ +tizen-webdriver-cli --hostname=192.168.1.42 \ + --url=https://shaka-player-demo.appspot.com/demo/ ``` diff --git a/backends/tizen/tizen-utils.js b/backends/tizen/tizen-utils.js index 29616cb..b218fd9 100644 --- a/backends/tizen/tizen-utils.js +++ b/backends/tizen/tizen-utils.js @@ -182,7 +182,8 @@ function addTizenArgs(yargs) { description: 'The ethernet address of the Tizen host, which we will use to ' + 'wake the device if it is sleeping at the beginning of the ' + - 'session.', + 'session. Optional, but highly recommended. NOTE: This will ' + + 'only work over wired ethernet connections, **not WiFi**!', type: 'string', }) .option('local-tizen-studio', { diff --git a/backends/xboxone/CHANGELOG.md b/backends/xboxone/CHANGELOG.md new file mode 100644 index 0000000..11b0cb7 --- /dev/null +++ b/backends/xboxone/CHANGELOG.md @@ -0,0 +1,3 @@ +## 1.0.0 (2021-02-11) + +Initial release. diff --git a/backends/xboxone/README.md b/backends/xboxone/README.md new file mode 100644 index 0000000..5eca742 --- /dev/null +++ b/backends/xboxone/README.md @@ -0,0 +1,152 @@ +# Xbox One WebDriver Server + +A [WebDriver][] server for Xbox One devices, implementing the subset of the +WebDriver protocol necessary for [Karma][]. Add Xbox One devices to your +[Selenium grid][]! + +Part of the [Generic WebDriver Server][] family. + + +## Prerequisites + +To use these tools, you will need: + - Xbox One device in Dev Mode + - Windows 10 host + - Visual Studio 2015 Update 3, Visual Studio 2017, or Visual Studio 2019 + - Windows 10 SDK w/ Universal Windows App Development Tools (UWP) + + +### Dev Mode Setup + +1. To put your Xbox One device in Dev Mode, start with + [Microsoft's official docs on dev mode][]. + + However, if you find that the official setup never completes, you can try + the [alternate method for dev mode setup][] using a secret menu and button + sequence instead: + + `Settings > System > Console Info > Press LB RB LT RT > Developer Settings > + Developer Mode` + +2. Configure the device for remote access and set a username and password. + + 1. From dev home, click `Remote Access Settings`. + 2. Check `Enable Xbox Device Portal`. + 3. Check `Require authentication to remotely access this console`. + 4. Click `Set username and password`. + 5. Set a username and password, which the WebDriver server will use to + authenticate. + +3. Create a new test account or sign in with an existing account. Without an + account, neither Microsoft Edge nor WebView will work for some reason. + + 1. From dev home, under `Test accounts`, click `Add existing` or + `Create new`. + 2. Follow the prompts to sign in. + +[Microsoft's official docs on dev mode]: https://docs.microsoft.com/en-us/windows/uwp/xbox-apps/devkit-activation +[alternate method for dev mode setup]: https://docs.microsoft.com/en-us/answers/questions/81169/almost-there-trying-activate-dev-console.html + + +### Windows 10 host setup + +1. If you don't have Visual Studio 2015 Update 3, Visual Studio 2017, or Visual + Studio 2019, install it now: https://visualstudio.microsoft.com/ +2. When installing the Windows 10 SDK, check Universal Windows App Development + Tools: https://docs.microsoft.com/en-us/windows/uwp/xbox-apps/development-environment-setup +3. If you install Visual Studio in any unusual location, you may have to + provide an explicit path to `MSBuild.exe` when you configure the WebDriver + server later. + + +### Screenshot setup + +Unlike many others, this backend **does** support screenshots. However, you +need to configure the Xbox display settings to make sure the screenshots are +consistent and correctly-aligned. + +1. From dev home, under `Settings`, click `Launch Settings`. +2. Under `General`, click `TV & display options`. +3. Under `Advanced`, click `Video fidelity & overscan`. +4. Under `Overscan border`, uncheck `Apps can add a border`. + + +## Installation + +```sh +npm install --save-dev generic-webdriver-server xbox-one-webdriver-server +``` + + +## Usage + +First, please refer to the ["Setup" doc][] for [Generic WebDriver Server][]. +That will explain how to set up Selenium to talk to Generic WebDriver Servers, +as well as how to set server parameters. + +In the command-line for the Selenium node, set the following Java system +properties: + + - `genericwebdriver.browser.name`: We recommend the value "xboxone". See also + notes in the ["Setup" doc][]. + - `genericwebdriver.backend.exe`: The path to the executable, such as + `node_modules/.bin/xbox-one-webdriver-server.cmd` or + `%APPDATA%\npm\xbox-one-webdriver-server.cmd`. + - `genericwebdriver.backend.params.hostname`: The hostname or IP address of the + Xbox One device, with optional Device Portal port number (default 11443). If + omitted, this **must** be provided in the client's desired capabilities + instead. (See below.) + - `genericwebdriver.backend.params.username`: The Xbox One Device Portal + username. If omitted, this **must** be provided in the client's desired + capabilities instead. (See below.) + - `genericwebdriver.backend.params.password`: The Xbox One Device Portal + password. If omitted, this **must** be provided in the client's desired + capabilities instead. (See below.) + - `genericwebdriver.backend.params.msbuild`: The path to `MSBuild.exe` from + Visual Studio. The server will attempt to locate this at typical locations + on all drives. If that fails, this option becomes **required**. + + +## Supported parameters + +This backend supports the following parameters: + + - `hostname`: **(required)** The hostname or IP address of the Xbox One device, + with optional Device Portal port number (default 11443). + - `username`: **(required)** The Xbox One Device Portal username. + - `password`: **(required)** The Xbox One Device Portal password. + - `msbuild`: The path to `MSBuild.exe` from Visual Studio. The server will + attempt to locate this at typical locations on all drives. If that fails, + this option becomes **required**. + + +## How it works + +See [how-it-works.md](https://github.com/google/generic-webdriver-server/blob/main/backends/xbox-one/how-it-works.md) +for details. + + +## Tunneling to a Xbox One device on another network + +See [tunneling.md](https://github.com/google/generic-webdriver-server/blob/main/backends/xbox-one/tunneling.md) +for details. + + +## Using the CLI + +In addition to running a Xbox One node in Selenium, this package offers a CLI +for directing a Xbox One device to a specific URL. For example, if installed +globally with `npm install -g xbox-one-webdriver-server`: + +```sh +xbox-one-webdriver-cli.cmd ^ + --hostname=192.168.1.42 --username=myuser --password=mypassword ^ + --url=https://shaka-player-demo.appspot.com/demo/ +``` + + +[Generic WebDriver Server]: https://github.com/google/generic-webdriver-server +[Karma]: https://karma-runner.github.io/ +[Selenium grid]: https://www.selenium.dev/documentation/en/grid/ +["Setup" doc]: https://github.com/google/generic-webdriver-server/blob/main/setup.md +[WebDriver]: https://www.w3.org/TR/webdriver2/ diff --git a/backends/xboxone/app-template/.gitignore b/backends/xboxone/app-template/.gitignore new file mode 100644 index 0000000..6d1ac22 --- /dev/null +++ b/backends/xboxone/app-template/.gitignore @@ -0,0 +1,5 @@ +.vs/ +AppPackages/ +BundleArtifacts/ +bin/ +obj/ diff --git a/backends/xboxone/app-template/App.xaml b/backends/xboxone/app-template/App.xaml new file mode 100644 index 0000000..b5151f5 --- /dev/null +++ b/backends/xboxone/app-template/App.xaml @@ -0,0 +1,26 @@ + + + + + + diff --git a/backends/xboxone/app-template/App.xaml.cs b/backends/xboxone/app-template/App.xaml.cs new file mode 100644 index 0000000..938ef9c --- /dev/null +++ b/backends/xboxone/app-template/App.xaml.cs @@ -0,0 +1,104 @@ +/** + * Copyright 2020 Google LLC + * + * 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. + */ + +// This is the C# code-behind for App.xaml. It's all boilerplate generated by +// Visual Studio, then cleaned up by hand to remove things we definitely didn't +// need. There may be more cleanup possible. + +using System; +using Windows.ApplicationModel; +using Windows.ApplicationModel.Activation; +using Windows.UI.Xaml; +using Windows.UI.Xaml.Controls; +using Windows.UI.Xaml.Navigation; + +namespace XboxOneWebDriverServer +{ + /// + /// Provides application-specific behavior to supplement the default Application class. + /// + sealed partial class App : Application + { + /// + /// Initializes the singleton application object. This is the first line of authored code + /// executed, and as such is the logical equivalent of main() or WinMain(). + /// + public App() + { + this.InitializeComponent(); + this.Suspending += OnSuspending; + } + + /// + /// Invoked when the application is launched normally by the end user. Other entry points + /// will be used such as when the application is launched to open a specific file. + /// + /// Details about the launch request and process. + protected override void OnLaunched(LaunchActivatedEventArgs e) + { + Frame rootFrame = Window.Current.Content as Frame; + + // Do not repeat app initialization when the Window already has content, + // just ensure that the window is active + if (rootFrame == null) + { + // Create a Frame to act as the navigation context and navigate to the first page + rootFrame = new Frame(); + + rootFrame.NavigationFailed += OnNavigationFailed; + + // Place the frame in the current Window + Window.Current.Content = rootFrame; + } + + if (e.PrelaunchActivated == false) + { + if (rootFrame.Content == null) + { + // When the navigation stack isn't restored navigate to the first page, + // configuring the new page by passing required information as a navigation + // parameter + rootFrame.Navigate(typeof(MainPage), e.Arguments); + } + // Ensure the current window is active + Window.Current.Activate(); + } + } + + /// + /// Invoked when Navigation to a certain page fails + /// + /// The Frame which failed navigation + /// Details about the navigation failure + void OnNavigationFailed(object sender, NavigationFailedEventArgs e) + { + throw new Exception("Failed to load Page " + e.SourcePageType.FullName); + } + + /// + /// Invoked when application execution is being suspended. Application state is saved + /// without knowing whether the application will be terminated or resumed with the contents + /// of memory still intact. + /// + /// The source of the suspend request. + /// Details about the suspend request. + private void OnSuspending(object sender, SuspendingEventArgs e) + { + var deferral = e.SuspendingOperation.GetDeferral(); + deferral.Complete(); + } + } +} diff --git a/backends/xboxone/app-template/Assets/SplashScreen.scale-200.png b/backends/xboxone/app-template/Assets/SplashScreen.scale-200.png new file mode 100644 index 0000000000000000000000000000000000000000..8144ea13b15ad64b3c68a66ed08e4b26b7385b0e GIT binary patch literal 82676 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%0D^0EXy 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

ga9f-kPy41bzt?S8;Zpo~;sZ|RYd9$lN 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%0A&|IF3V12Qn?7;wWU78_K%`wePw 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 literal 0 HcmV?d00001 diff --git a/backends/xboxone/app-template/Assets/Square150x150Logo.scale-200.png b/backends/xboxone/app-template/Assets/Square150x150Logo.scale-200.png new file mode 100644 index 0000000000000000000000000000000000000000..3ab032665de4629707b71d1814c323caa96371cb GIT binary patch literal 41276 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 F{trvMg-rke literal 0 HcmV?d00001 diff --git a/backends/xboxone/app-template/Assets/Square44x44Logo.scale-200.png b/backends/xboxone/app-template/Assets/Square44x44Logo.scale-200.png new file mode 100644 index 0000000000000000000000000000000000000000..f9b8baad7d7554539633fbba9d762a1cba06dc67 GIT binary patch literal 9285 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 T#uD=kIRLzuR+K7{)c5;81C#ae literal 0 HcmV?d00001 diff --git a/backends/xboxone/app-template/Assets/StoreLogo.png b/backends/xboxone/app-template/Assets/StoreLogo.png new file mode 100644 index 0000000000000000000000000000000000000000..f2fd29a3a5732265fd5c646caa3437510bdb3aef GIT binary patch literal 4180 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 + + + + + + + diff --git a/backends/xboxone/app-template/MainPage.xaml.cs b/backends/xboxone/app-template/MainPage.xaml.cs new file mode 100644 index 0000000..93582a0 --- /dev/null +++ b/backends/xboxone/app-template/MainPage.xaml.cs @@ -0,0 +1,34 @@ +/** + * Copyright 2020 Google LLC + * + * 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. + */ + +// This is the C# code-behind for MainPage.xaml. It's all boilerplate +// generated by Visual Studio. + +using Windows.UI.Xaml.Controls; + +namespace XboxOneWebDriverServer +{ + ///

+ /// An empty page that can be used on its own or navigated to within a Frame. + /// + public sealed partial class MainPage : Page + { + public MainPage() + { + this.InitializeComponent(); + } + } +} diff --git a/backends/xboxone/app-template/Package.appxmanifest b/backends/xboxone/app-template/Package.appxmanifest new file mode 100644 index 0000000..a9cf514 --- /dev/null +++ b/backends/xboxone/app-template/Package.appxmanifest @@ -0,0 +1,55 @@ + + + + + + + + + + Xbox One WebDriver Server + generic-webdriver-server + Assets\StoreLogo.png + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/backends/xboxone/app-template/PackageCertificateKeyFile.pfx b/backends/xboxone/app-template/PackageCertificateKeyFile.pfx new file mode 100644 index 0000000000000000000000000000000000000000..d7947fddd6f30bd13b567291f5ac34cac20173b2 GIT binary patch literal 2560 zcmZWpc{tQ-8~)8=7|S@N=-4tyj;$F>3`zDaBqUk0kDZW_DKp2|9qTw!SrVa8j;$=& zLo~=vStkrh7)!+YopXKPIoEf6f4t9g-}iGr@B94oJ{U6c01AO&$jCYbQYzXYdWQ?b z3dtiQOWi#$SmLgr^K=XC$lVq@;rE^5gh;N;$(+F^T_Z+3>p3%BZy%CuMA#} zg0q!XBSkIFH-$l=to?8@d~A_u)h1`BwE9IMlYKfC7E>~&dlv%>c1}?vl%|KH$6}|jfLI~<_pv?BbGuW^T)0ZV4V8qx; z4^`-1fctc9uWEkDXAX`$&l%4{xh8IL#y0cL+cVx@e7UIVZGP&}gE9lzK$-M(CR9bh zCGrYo|MML4#~t$tEsm?d;d&PB?j?&HgKH4lq^wh7o+!)Blr_$B*F|KAFfF6{O)_1A ztJU4mn81cD0bWGI1&a_RZoG#`bzYX}o!HFzi<0)yTFXkmb3hAygRHS%+iB)$zZz7& zHDidz6P>1sB~`}NwMw4|Hna1|=o-MjcVNcvHncKBTiVa^$fjNvu4;}p@>wTaZbFs#*_`3w|5mgiIZfku`_NE;7oO@N{gHVPx zUVa%Wk$aEZG_7kY5!IByoK%Ax3VBXZ*AiTK3V-^Ym~%M3c`{;S_}rvcfKWIA;Y*2V z9L5;kGgjp@6Oc_RwIcz0497|Cenx$ohy8n&ozkSnzkuNQl2f}YY*5+11Oy>Sel^r2>iUgmV>zJjy!eQFgo}| zfcm4uX*+ekS54!Q!`ZrFleTFyY6XFQgH3Y;pFvX5U5!EjT~}7@U^BNS{T6XB=sKeR zTgPg3#v7k)>2G_|5tngVuQeSh6Qmyl)ceXXmHW3j3M|`w+XOl+%n$dSpl;z3L!E4+ zylYt-A*~}P<9=uw;L zhZ8is5^rX}N%6T7Pl~0&MXSS~*%&Kv#BJgDiI%dOmpRMuuKeOAn%4^AI<#kGgGM7^ z#ZaA20V2-Z*-J^<_C4S|e)S+^ou$$^$ZLqI-c&{BN8IkxiOX`YQ_8T?Yildz`q{ZiJMa;M{VwIah zs(stVS@pKP`UkklQfgT*_R{`^RP{RNUAacdnBaqSv2pmFIJ_f;F5jF)(06gFV1OfiQ zE%3Ml!GH*00mi=+KfnWI+8`zX0ifm&@*r@O0KoI_E)n3$-@Z_gxq?pyVaTxDe!l%2%7mSmY}-eE4hSN0MRJSr1~V_NN(fqh2cYxvvuCQiK%) zzXWXaN->ioD|=cwX%ycZf=*F34^DmIdZ1Qs#gjUju^RZZIJW0(#HC2)|3d&*ai9^*D zjjykch}l+g#d{Vb9Kwkjhvh~#l=YB+?hqP(dWzSD1Pf7#YD0h3a~Vl)y_46SUqjQK z16I&XVwMJ-wx5mK5q9Q|I(nx*6S{CsDC%oi+q!wV{qV$Mg}|+JZh_#gVyoS!RU@$-2d_+CQ1vd{yQ39c z`$4|s^KH_P1Cp;CT$+WJl>P8PMtFzPc=FAs;pF!|$WGP)D51ic&f4`*H^AjAwx8To z51Al8ZvX7h1X@ZPOdWc>fv4`35x!sBx5nBEUS7q_a9S?-@DBMrW}($u_b6M%efn_z z^RMUj3@4NyRS!mQ>ry07g>}Xhh zAujW3=qmfN9~?Z(5OLu3^NKZUCY=#J=-r{WE_jHSGb8p09cKgAIvK1xRF6?I7PsnAW3Y&LsRswM@&ulFW3 zTFwr&He%E;r!lMu7HJd=$`3zL5t6&NRD&V)e&&{{%!%b(8h&jGKY_MTky_IF#ESBr Rw(``-33^ucuKTZ#`6t0`kj4N2 literal 0 HcmV?d00001 diff --git a/backends/xboxone/app-template/Properties/AssemblyInfo.cs b/backends/xboxone/app-template/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..ff89d77 --- /dev/null +++ b/backends/xboxone/app-template/Properties/AssemblyInfo.cs @@ -0,0 +1,29 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("XboxOneWebDriverServer")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("XboxOneWebDriverServer")] +[assembly: AssemblyCopyright("Copyright © 2021")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] +[assembly: ComVisible(false)] diff --git a/backends/xboxone/app-template/Properties/Default.rd.xml b/backends/xboxone/app-template/Properties/Default.rd.xml new file mode 100644 index 0000000..af00722 --- /dev/null +++ b/backends/xboxone/app-template/Properties/Default.rd.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/backends/xboxone/app-template/README.md b/backends/xboxone/app-template/README.md new file mode 100644 index 0000000..f0e6483 --- /dev/null +++ b/backends/xboxone/app-template/README.md @@ -0,0 +1,10 @@ +# Xbox One UWP Container Application Template + +This is a template for a UWP app for Xbox One. + +It contains XAML files with C# code-behinds, and has only one primary component, +which is a WebView pointing to some specific destination. The application is +almost entirely UWP boilerplate generated by Visual Studio. + +The MainPage.xaml file will be overwritten with a specific URL before being +built and deployed to the Xbox One device. diff --git a/backends/xboxone/app-template/XboxOneWebDriverServer.csproj b/backends/xboxone/app-template/XboxOneWebDriverServer.csproj new file mode 100644 index 0000000..a669f7d --- /dev/null +++ b/backends/xboxone/app-template/XboxOneWebDriverServer.csproj @@ -0,0 +1,182 @@ + + + + + Debug + x86 + {239EE728-5BD4-4F3E-BCA7-5E4DA23322EA} + AppContainerExe + Properties + XboxOneWebDriverServer + XboxOneWebDriverServer + en-US + UAP + 10.0.18362.0 + 10.0.18362.0 + 14 + 512 + {A5A43C5B-DE2A-4C0C-9213-0A381AF9435A};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + true + True + False + False + False + True + Always + x64 + 0 + PackageCertificateKeyFile.pfx + SHA256 + SideloadOnly + False + x64 + False + + + true + bin\x86\Debug\ + DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP + ;2008 + full + x86 + false + prompt + true + + + bin\x86\Release\ + TRACE;NETFX_CORE;WINDOWS_UWP + true + ;2008 + pdbonly + x86 + false + prompt + true + true + + + true + bin\ARM\Debug\ + DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP + ;2008 + full + ARM + false + prompt + true + + + bin\ARM\Release\ + TRACE;NETFX_CORE;WINDOWS_UWP + true + ;2008 + pdbonly + ARM + false + prompt + true + true + + + true + bin\ARM64\Debug\ + DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP + ;2008 + full + ARM64 + false + prompt + true + true + + + bin\ARM64\Release\ + TRACE;NETFX_CORE;WINDOWS_UWP + true + ;2008 + pdbonly + ARM64 + false + prompt + true + true + + + true + bin\x64\Debug\ + DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP + ;2008 + full + x64 + false + prompt + true + + + bin\x64\Release\ + NETFX_CORE;WINDOWS_UWP;CODE_ANALYSIS + true + ;2008 + pdbonly + x64 + false + prompt + true + false + + + PackageReference + + + + App.xaml + + + MainPage.xaml + + + + + + Designer + + + + + + + + + + + + + MSBuild:Compile + Designer + + + MSBuild:Compile + Designer + + + + + 6.2.10 + + + + + + + 14.0 + + + + diff --git a/backends/xboxone/app-template/XboxOneWebDriverServer.sln b/backends/xboxone/app-template/XboxOneWebDriverServer.sln new file mode 100644 index 0000000..71f1068 --- /dev/null +++ b/backends/xboxone/app-template/XboxOneWebDriverServer.sln @@ -0,0 +1,51 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.30907.101 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "XboxOneWebDriverServer", "XboxOneWebDriverServer.csproj", "{239EE728-5BD4-4F3E-BCA7-5E4DA23322EA}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|ARM = Debug|ARM + Debug|ARM64 = Debug|ARM64 + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|ARM = Release|ARM + Release|ARM64 = Release|ARM64 + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {239EE728-5BD4-4F3E-BCA7-5E4DA23322EA}.Debug|ARM.ActiveCfg = Debug|ARM + {239EE728-5BD4-4F3E-BCA7-5E4DA23322EA}.Debug|ARM.Build.0 = Debug|ARM + {239EE728-5BD4-4F3E-BCA7-5E4DA23322EA}.Debug|ARM.Deploy.0 = Debug|ARM + {239EE728-5BD4-4F3E-BCA7-5E4DA23322EA}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {239EE728-5BD4-4F3E-BCA7-5E4DA23322EA}.Debug|ARM64.Build.0 = Debug|ARM64 + {239EE728-5BD4-4F3E-BCA7-5E4DA23322EA}.Debug|ARM64.Deploy.0 = Debug|ARM64 + {239EE728-5BD4-4F3E-BCA7-5E4DA23322EA}.Debug|x64.ActiveCfg = Debug|x64 + {239EE728-5BD4-4F3E-BCA7-5E4DA23322EA}.Debug|x64.Build.0 = Debug|x64 + {239EE728-5BD4-4F3E-BCA7-5E4DA23322EA}.Debug|x64.Deploy.0 = Debug|x64 + {239EE728-5BD4-4F3E-BCA7-5E4DA23322EA}.Debug|x86.ActiveCfg = Debug|x86 + {239EE728-5BD4-4F3E-BCA7-5E4DA23322EA}.Debug|x86.Build.0 = Debug|x86 + {239EE728-5BD4-4F3E-BCA7-5E4DA23322EA}.Debug|x86.Deploy.0 = Debug|x86 + {239EE728-5BD4-4F3E-BCA7-5E4DA23322EA}.Release|ARM.ActiveCfg = Release|ARM + {239EE728-5BD4-4F3E-BCA7-5E4DA23322EA}.Release|ARM.Build.0 = Release|ARM + {239EE728-5BD4-4F3E-BCA7-5E4DA23322EA}.Release|ARM.Deploy.0 = Release|ARM + {239EE728-5BD4-4F3E-BCA7-5E4DA23322EA}.Release|ARM64.ActiveCfg = Release|ARM64 + {239EE728-5BD4-4F3E-BCA7-5E4DA23322EA}.Release|ARM64.Build.0 = Release|ARM64 + {239EE728-5BD4-4F3E-BCA7-5E4DA23322EA}.Release|ARM64.Deploy.0 = Release|ARM64 + {239EE728-5BD4-4F3E-BCA7-5E4DA23322EA}.Release|x64.ActiveCfg = Release|x64 + {239EE728-5BD4-4F3E-BCA7-5E4DA23322EA}.Release|x64.Build.0 = Release|x64 + {239EE728-5BD4-4F3E-BCA7-5E4DA23322EA}.Release|x64.Deploy.0 = Release|x64 + {239EE728-5BD4-4F3E-BCA7-5E4DA23322EA}.Release|x86.ActiveCfg = Release|x86 + {239EE728-5BD4-4F3E-BCA7-5E4DA23322EA}.Release|x86.Build.0 = Release|x86 + {239EE728-5BD4-4F3E-BCA7-5E4DA23322EA}.Release|x86.Deploy.0 = Release|x86 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {1CBBBB61-3C41-46EF-8269-CE1AEEF7C6EE} + EndGlobalSection +EndGlobal diff --git a/backends/xboxone/how-it-works.md b/backends/xboxone/how-it-works.md new file mode 100644 index 0000000..39f1297 --- /dev/null +++ b/backends/xboxone/how-it-works.md @@ -0,0 +1,57 @@ +# How Xbox One WebDriver Server Works + +The Xbox One WebDriver server is composed of two parts: + +1. A UWP (Universal Windows Platform) container application (see + [app-template/](app-template/)) +2. [Visual Studio][] (local copy required) + + +## The Container App + +The Xbox One WebDriver server's container app hosts a WebView which will display +any URL at the client's request. When the client requests a URL to be loaded, +an [app template](app-template/) is built into a complete app containing the +requested URL. The app is then installed on the Xbox One device and launched. + +When the WebDriver client closes the session, the Xbox One WebDriver server +shuts down and uninstalls the app. + + +## Visual Studio + +[Visual Studio][] is required to build the container app. You must also have +the [Windows 10 SDK with Universal Windows App Development Tools][] installed. +Because of these requirements, the Xbox One WebDriver Server and CLI will only +work on Windows 10. + + +## Device Portal APIs + +The Xbox One WebDriver server uses the [Windows Device Portal REST API][] and +extensions from the [Xbox Device Portal REST API][] to install the container +app, launch it, stop it, uninstall it, and take screenshots. + +Using the Device Portal APIs on an Xbox One requires you to first place the +device in [dev mode][]. (If dev mode setup fails, you can try an [alternate +method for dev mode setup][] using a secret menu and button sequence instead.) + +These APIs also generally requires authentication, so you are required +to [configure the Xbox One for remote access][]. + + +# Screenshots + +Screenshots can be taken using the Device Portal API without any dependency on +Visual Studio or the container application. So this can be done from the Xbox +One WebDriver CLI on any operating system. This is the only platform-agnostic +function available. + + +[Visual Studio]: https://visualstudio.microsoft.com/ +[Windows 10 SDK with Universal Windows App Development Tools]: https://docs.microsoft.com/en-us/windows/uwp/xbox-apps/development-environment-setup +[Windows Device Portal REST API]: https://docs.microsoft.com/en-us/windows/uwp/debug-test-perf/device-portal-api-core +[Xbox Device Portal REST API]: https://docs.microsoft.com/en-us/windows/uwp/xbox-apps/reference +[dev mode]: https://docs.microsoft.com/en-us/windows/uwp/xbox-apps/devkit-activation +[alternate method for dev mode setup]: https://docs.microsoft.com/en-us/answers/questions/81169/almost-there-trying-activate-dev-console.html +[configure the Xbox One for remote access]: https://docs.microsoft.com/en-us/windows/uwp/xbox-apps/device-portal-xbox diff --git a/backends/xboxone/package-lock.json b/backends/xboxone/package-lock.json new file mode 100644 index 0000000..0b0c4a2 --- /dev/null +++ b/backends/xboxone/package-lock.json @@ -0,0 +1,1660 @@ +{ + "name": "xbox-one-webdriver-server", + "version": "1.0.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "xbox-one-webdriver-server", + "version": "1.0.0", + "license": "Apache-2.0", + "dependencies": { + "form-data": "^3.0.0", + "fs-extra": "^9.1.0", + "generic-webdriver-server": "^1.1.0", + "tmp-promise": "^3.0.2" + }, + "bin": { + "xbox-one-webdriver-cli": "xbox-one-webdriver-cli.js", + "xbox-one-webdriver-server": "xbox-one-webdriver-server.js" + } + }, + "node_modules/accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "dependencies": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "node_modules/body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "dependencies": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "node_modules/content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "dependencies": { + "safe-buffer": "5.1.2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "dependencies": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/form-data": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.0.tgz", + "integrity": "sha512-CKMFDglpbMi6PyN+brwB9Q/GOw0eAnsrEZDgcsH5Krhz5Od/haKHAX0NmQfha2zPPz0JpWzA7GJHGSnvCRLWsg==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "node_modules/generic-webdriver-server": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/generic-webdriver-server/-/generic-webdriver-server-1.1.0.tgz", + "integrity": "sha512-zFt5erZwUPAt9fXxkt4V6Z+2Gr/BXkHMsNmhw00Pa+LA9/BaKccA5DXpjPv6F3QdqX8fUhEz8VluG/MH6QfczQ==", + "dependencies": { + "express": "^4.17.1", + "yargs": "^15.3.1" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.5.tgz", + "integrity": "sha512-kBBSQbz2K0Nyn+31j/w36fUfxkBW9/gfwRWdUY1ULReH3iokVJgddZAFcD1D0xlgTmFxJCbUkUclAlc6/IDJkw==" + }, + "node_modules/http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dependencies": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.45.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.45.0.tgz", + "integrity": "sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.28", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.28.tgz", + "integrity": "sha512-0TO2yJ5YHYr7M2zzT7gDU1tbwHxEUWBCLt0lscSNpcdAfFyJOVEpRYNS7EXVcTLNj/25QO8gulHC5JtTzSE2UQ==", + "dependencies": { + "mime-db": "1.45.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + }, + "node_modules/proxy-addr": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", + "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", + "dependencies": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "dependencies": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "dependencies": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + }, + "node_modules/serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + }, + "node_modules/setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + }, + "node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dependencies": { + "ansi-regex": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "dependencies": { + "rimraf": "^3.0.0" + }, + "engines": { + "node": ">=8.17.0" + } + }, + "node_modules/tmp-promise": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/tmp-promise/-/tmp-promise-3.0.2.tgz", + "integrity": "sha512-OyCLAKU1HzBjL6Ev3gxUeraJNlbNingmi8IrHHEsYH8LTmEuhvYfqvhn2F/je+mjf4N58UmZ96OMEy1JanSCpA==", + "dependencies": { + "tmp": "^0.2.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" + }, + "node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "node_modules/y18n": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz", + "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==" + }, + "node_modules/yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dependencies": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" + } + } + }, + "dependencies": { + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==" + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "requires": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + }, + "cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "requires": { + "safe-buffer": "5.1.2" + } + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" + }, + "cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + }, + "express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "requires": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + } + }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "form-data": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.0.tgz", + "integrity": "sha512-CKMFDglpbMi6PyN+brwB9Q/GOw0eAnsrEZDgcsH5Krhz5Od/haKHAX0NmQfha2zPPz0JpWzA7GJHGSnvCRLWsg==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + }, + "fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "requires": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "generic-webdriver-server": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/generic-webdriver-server/-/generic-webdriver-server-1.1.0.tgz", + "integrity": "sha512-zFt5erZwUPAt9fXxkt4V6Z+2Gr/BXkHMsNmhw00Pa+LA9/BaKccA5DXpjPv6F3QdqX8fUhEz8VluG/MH6QfczQ==", + "requires": { + "express": "^4.17.1", + "yargs": "^15.3.1" + } + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "graceful-fs": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.5.tgz", + "integrity": "sha512-kBBSQbz2K0Nyn+31j/w36fUfxkBW9/gfwRWdUY1ULReH3iokVJgddZAFcD1D0xlgTmFxJCbUkUclAlc6/IDJkw==" + }, + "http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "requires": { + "p-locate": "^4.1.0" + } + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + }, + "mime-db": { + "version": "1.45.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.45.0.tgz", + "integrity": "sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w==" + }, + "mime-types": { + "version": "2.1.28", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.28.tgz", + "integrity": "sha512-0TO2yJ5YHYr7M2zzT7gDU1tbwHxEUWBCLt0lscSNpcdAfFyJOVEpRYNS7EXVcTLNj/25QO8gulHC5JtTzSE2UQ==", + "requires": { + "mime-db": "1.45.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "requires": { + "ee-first": "1.1.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + }, + "proxy-addr": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", + "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", + "requires": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.9.1" + } + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" + }, + "raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "requires": { + "glob": "^7.1.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "dependencies": { + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + } + } + }, + "serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" + }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "requires": { + "rimraf": "^3.0.0" + } + }, + "tmp-promise": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/tmp-promise/-/tmp-promise-3.0.2.tgz", + "integrity": "sha512-OyCLAKU1HzBjL6Ev3gxUeraJNlbNingmi8IrHHEsYH8LTmEuhvYfqvhn2F/je+mjf4N58UmZ96OMEy1JanSCpA==", + "requires": { + "tmp": "^0.2.0" + } + }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==" + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" + }, + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "y18n": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz", + "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==" + }, + "yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "requires": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + } + }, + "yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } +} diff --git a/backends/xboxone/package.json b/backends/xboxone/package.json new file mode 100644 index 0000000..1ae0f81 --- /dev/null +++ b/backends/xboxone/package.json @@ -0,0 +1,37 @@ +{ + "name": "xbox-one-webdriver-server", + "description": "An Xbox One WebDriver server that pushes URLs to Xbox One devices, built on generic-webdriver-server.", + "version": "1.0.0", + "homepage": "https://github.com/google/generic-webdriver-server", + "author": "Google", + "license": "Apache-2.0", + "maintainers": [ + { + "name": "Joey Parrish", + "email": "joeyparrish@google.com" + } + ], + "keywords": [ + "karma", + "selenium", + "xbox-one", + "webdriver" + ], + "main": "xbox-one-webdriver-server.js", + "scripts": { + "lint": "(cd ../../; npx eslint --ignore-path .gitignore --max-warnings 0 backends/xboxone/)", + "checkClean": "[[ -z \"$(git status --short .)\" ]] || (echo \"Git not clean!\"; git status .; exit 1)", + "pretest": "npm run lint", + "prepack": "npm run lint && npm run checkClean" + }, + "bin": { + "xbox-one-webdriver-cli": "./xbox-one-webdriver-cli.js", + "xbox-one-webdriver-server": "./xbox-one-webdriver-server.js" + }, + "dependencies": { + "form-data": "^3.0.0", + "fs-extra": "^9.1.0", + "generic-webdriver-server": "^1.1.0", + "tmp-promise": "^3.0.2" + } +} diff --git a/backends/xboxone/tunneling.md b/backends/xboxone/tunneling.md new file mode 100644 index 0000000..dbc4ec6 --- /dev/null +++ b/backends/xboxone/tunneling.md @@ -0,0 +1,70 @@ +# Tunneling to a Xbox One Device on Another Network + +If your Selenium node runs on a separate network from your Xbox One device, +you may need to create a tunnel to that other network. This document will +explain how to do that with SSH. We assume general familiarity with SSH and +that your target network has an accessible SSH server already. + +The Xbox One WebDriver server uses the Device Portal API to control the device. +(See [how-it-works.md](how-it-works.md) for details.) This uses port 11443 of +the Xbox One device. So our tunnel will target port 11443. Here's an example +SSH command for this tunnel: + +```sh +ssh my-user@other-network-server -L 11443:xbox-one-device-hostname-or-ip:11443 +``` + +In this example, you would replace `other-network-server` with the SSH server on +the target network, `my-user` with your username on that server, and +`xbox-one-device-hostname-or-ip` with the hostname or IP address of the Xbox One +device on that network. This will allow you access the remote Xbox One device +on your workstation. + + +## Configuring your server with a tunnel + +To configure the Xbox One device hostname or IP server-side (recommended), use +the following system property: + +```sh +java \ + -Dgenericwebdriver.backend.params.hostname=localhost \ + # ... +``` + +This will direct the Xbox One WebDriver server to connect to your workstation's +port 11443, which will tunnel through the SSH connection to the remote device's +port 11443. + +See also ["Setting parameters"][] in the ["Setup" doc][] of +[Generic WebDriver Server][]. + + +## Tunneling to multiple Xbox One devices using different ports + +If you need to tunnel to multiple Xbox One devices, you will need to use +different local ports for each tunnel. If the Xbox One devices are all on the +same network, you can still use a single SSH connection for multiple tunnels. +Here's an example SSH command with multiple tunnels: + +```sh +ssh my-user@other-network-server \ + -L 11443:xbox-one-A-hostname-or-ip:11443 \ + -L 11444:xbox-one-B-hostname-or-ip:11443 \ + -L 11445:xbox-one-C-hostname-or-ip:11443 +``` + +This will open three ports on your workstation (11443, 11444, 11445), each +tunneled to port 11443 on a different device. Then you would set up three +Selenium nodes, with each specifying the port number in the backend parameters: + +```sh +java \ + -Dgenericwebdriver.backend.params.hostname=localhost:11445 \ + # ... +``` + + +[Generic WebDriver Server]: https://github.com/google/generic-webdriver-server +["Setting parameters"]: https://github.com/google/generic-webdriver-server/blob/main/setup.md#setting-parameters +["Setup" doc]: https://github.com/google/generic-webdriver-server/blob/main/setup.md diff --git a/backends/xboxone/xbox-one-utils.js b/backends/xboxone/xbox-one-utils.js new file mode 100644 index 0000000..3e587a4 --- /dev/null +++ b/backends/xboxone/xbox-one-utils.js @@ -0,0 +1,373 @@ +/** + * Copyright 2020 Google LLC + * + * 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. + */ + + +const FormData = require('form-data'); +const fs = require('fs-extra'); +const https = require('https'); +const os = require('os'); +const path = require('path'); +const tmp = require('tmp-promise'); +const util = require('util'); + +const execFile = util.promisify(require('child_process').execFile); + +const appTemplatePath = path.resolve(__dirname, 'app-template'); +const appId = '25796bff-2d0c-4ce0-82f4-862db940a2fd_38r8bc51r0hnm!App'; +const appIdBase64 = Buffer.from(appId, 'utf8').toString('base64'); +const packageId = + '25796bff-2d0c-4ce0-82f4-862db940a2fd_1.0.0.0_x64__38r8bc51r0hnm'; +const defaultPort = 11443; // For the Xbox One Device Portal +const packageFolderName = 'XboxOneWebDriverServer_1.0.0.0_Test'; +const packageBundleName = 'XboxOneWebDriverServer_1.0.0.0_x64.msixbundle'; + +// Main API reference docs: +// https://docs.microsoft.com/en-us/windows/uwp/debug-test-perf/device-portal-api-core +// https://docs.microsoft.com/en-us/windows/uwp/xbox-apps/reference + + +/** + * Uses Visual Studio to connect to an Xbox One device, install a temporary UWP + * container app, and load a URL into it. + * + * @param {!object} flags Parsed command-line flags. + * @param {Console} log A Console-like interface for logging. Can be "console". + * @param {?string} url If non-null, install the Xbox One container app and load + * the URL into it. If null, send the Xbox One device back to the home + * screen. + * @return {!Promise} + */ +async function loadOnXboxOne(flags, log, url) { + checkPlatformRequirements(); + + if (url) { + // Copy the app template into a temporary directory. + const tmpDirOptions = { + mode: 0o700, // Only accessible to the owner + prefix: 'xbox-one-webdriver-server-', + unsafeCleanup: true, // Remove directory contents on cleanup + }; + const tmpDir = await tmp.dir(tmpDirOptions); + + try { + log.info('Preparing app template'); + await fs.copySync(appTemplatePath, tmpDir.path); + setAppUrl(tmpDir.path, url); + log.info('Building app'); + await buildApp(flags.msbuild, tmpDir.path); + log.info('Installing app'); + await installApp( + tmpDir.path, flags.hostname, flags.username, flags.password); + log.info('Launching app'); + await launchApp(flags.hostname, flags.username, flags.password); + } finally { + // Remove our temporary directory. + tmpDir.cleanup(); + } + } else { + log.info('Uninstalling app'); + await uninstallApp(flags.hostname, flags.username, flags.password); + } + log.info('Done'); +} + +/** + * Check platform requirements for using these tools. + * + * @throws Error if requirements are not met. + */ +function checkPlatformRequirements() { + if (!os.type().toLowerCase().startsWith('windows')) { + throw new Error('Only usable on Windows!'); + } +} + +/** + * Set the URL for the application template. + * + * @param {string} tempPath The temp folder in which the application template + * can be found. + * @param {string} url The destination URL. + */ +function setAppUrl(tempPath, url) { + // Fill in the desired destination URL in the app source. + const mainXamlPath = path.resolve(tempPath, 'MainPage.xaml'); + const originalXaml = fs.readFileSync(mainXamlPath).toString('utf8'); + const modifiedXaml = originalXaml.replace('DESTINATION', url); + fs.writeFileSync(mainXamlPath, modifiedXaml); +} + +/** + * Build the application in the temp path. + * + * @param {string} msbuildPath The path to MSBuild.exe. + * @param {string} tempPath The temp folder in which the application template + * can be found. + * @return {!Promise} + */ +async function buildApp(msbuildPath, tempPath) { + // Build the app using Visual Studio. + await execFile(msbuildPath, [ + 'XboxOneWebDriverServer.sln', + '-p:Configuration=Release,Optimize=false,DebugSymbols=false', + '-p:Platform=x64', + '-t:Restore;Build', + ], { + cwd: tempPath, + }); +} + +/** + * Install the application to the specified Xbox One. + * + * @param {string} tempPath The temp folder in which the application template + * can be found. + * @param {string} xboxOneAddress The IP or hostname of the Xbox One device. + * @param {string} username The username to authenticate to the Device Portal. + * @param {string} password The password to authenticate to the Device Portal. + * @return {!Promise} + */ +async function installApp(tempPath, xboxOneAddress, username, password) { + // Find the app bundle and its deps. + const appBundlePath = path.resolve( + tempPath, 'AppPackages', packageFolderName, packageBundleName); + const depsFolderPath = path.resolve( + tempPath, 'AppPackages', packageFolderName, 'Dependencies', 'x64'); + const depsPaths = fs.readdirSync(depsFolderPath).map( + (filename) => path.resolve(depsFolderPath, filename)); + + const formData = new FormData(); + formData.append(packageBundleName, fs.createReadStream(appBundlePath)); + for (const depPath of depsPaths) { + formData.append(path.basename(depPath), fs.createReadStream(depPath)); + } + + // https://docs.microsoft.com/en-us/windows/uwp/debug-test-perf/device-portal-api-core#install-an-app + await httpRequestHelper( + xboxOneAddress, username, password, + 'POST', `api/app/packagemanager/package?package=${packageBundleName}`, + formData); + + const startTime = Date.now(); + // eslint-disable-next-line no-constant-condition + while (true) { + // https://docs.microsoft.com/en-us/windows/uwp/debug-test-perf/device-portal-api-core#get-app-installation-status + const {statusCode} = await httpRequestHelper( + xboxOneAddress, username, password, + 'GET', 'api/app/packagemanager/state'); + + // Status code will be 204 when the installation is still in progress. + if (statusCode != 204) { + break; + } + + const now = Date.now(); + const elapsedSeconds = (now - startTime) / 1000; + // Time out of this loop after 60 seconds. + if (elapsedSeconds > 60) { + throw new Error('Timeout while waiting for package installation!'); + } + } +} + +/** + * Launch the application on the specified Xbox One. + * + * @param {string} xboxOneAddress The IP or hostname of the Xbox One device. + * @param {string} username The username to authenticate to the Device Portal. + * @param {string} password The password to authenticate to the Device Portal. + * @return {!Promise} + */ +async function launchApp(xboxOneAddress, username, password) { + // https://docs.microsoft.com/en-us/windows/uwp/debug-test-perf/device-portal-api-core#start-a-modern-app + await httpRequestHelper( + xboxOneAddress, username, password, + 'POST', `api/taskmanager/app?appid=${appIdBase64}`); +} + +/** + * Uninstall the application on the specified Xbox One. + * + * @param {string} xboxOneAddress The IP or hostname of the Xbox One device. + * @param {string} username The username to authenticate to the Device Portal. + * @param {string} password The password to authenticate to the Device Portal. + * @return {!Promise} + */ +async function uninstallApp(xboxOneAddress, username, password) { + // https://docs.microsoft.com/en-us/windows/uwp/debug-test-perf/device-portal-api-core#uninstall-an-app + try { + await httpRequestHelper( + xboxOneAddress, username, password, + 'DELETE', `api/app/packagemanager/package?package=${packageId}`); + } catch (error) { + if (error.statusCode == 500 && error.body.includes('Element not found')) { + // Ignore this. There was nothing to uninstall, and that's fine. + } else { + throw error; + } + } +} + +/** + * Take a screenshot on the specified Xbox One (PNG format). + * + * @param {string} xboxOneAddress The IP or hostname of the Xbox One device. + * @param {string} username The username to authenticate to the Device Portal. + * @param {string} password The password to authenticate to the Device Portal. + * @return {!Promise.} + */ +async function takeScreenshot(xboxOneAddress, username, password) { + // https://docs.microsoft.com/en-us/windows/uwp/xbox-apps/wdp-media-capture-api + const {data} = await httpRequestHelper( + xboxOneAddress, username, password, + 'GET', 'ext/screenshot?download=true&hdr=false'); + return data; +} + + +/** + * A helper function to make HTTP requests to the Device Portal APIs on the Xbox + * One device. + * + * @param {string} xboxOneAddress The IP or hostname of the Xbox One device. + * @param {string} username The username to authenticate to the Device Portal. + * @param {string} password The password to authenticate to the Device Portal. + * @param {string} method The HTTP request method to use. + * @param {string} path The HTTP request path to use. + * @param {?FormData} formData Optional multipart form data for file uploads. + * @return {!Promise<{statusCode: number, data: Buffer}>} + */ +function httpRequestHelper( + xboxOneAddress, username, password, method, path, formData) { + return new Promise((resolve, reject) => { + const url = `https://${xboxOneAddress}/${path}`; + const options = { + defaultPort, // if not specified in xboxOneAddress + rejectUnauthorized: false, // do not validate HTTPS cert + method, + }; + if (formData) { + options.headers = formData.getHeaders(); + } else { + options.headers = {}; + } + + // NOTE: auto- prefix disables requirements around CSRF tokens, to allow + // automation on this API. + // See https://docs.microsoft.com/en-us/windows/uwp/debug-test-perf/device-portal#csrf-protection-and-scripting + const basicAuth = Buffer.from('auto-' + username + ':' + password, 'utf8'); + options.headers.Authorization = 'Basic ' + basicAuth.toString('base64'); + + const req = https.request(url, options, (response) => { + const chunks = []; + response.on('data', (chunk) => { + chunks.push(chunk); + }); + response.on('end', () => { + const statusCode = response.statusCode; + const data = Buffer.concat(chunks); + if (statusCode < 200 || statusCode > 299) { + const error = new Error( + `${method} ${url} => ` + + `HTTP ${statusCode}: ${data.toString('utf8')}`); + error.method = method; + error.url = url; + error.statusCode = statusCode; + error.body = data.toString('utf8'); + reject(error); + } else { + resolve({statusCode, data}); + } + }); + }); + + req.on('error', reject); + + if (formData) { + formData.pipe(req); + } else { + req.end(); + } + }); +} + +/** + * Try to find MSBuild.exe from Visual Studio, to simplify configuration. + * + * @return {?string} The path to MSBuild.exe, or null if not found. + */ +function findMsbuild() { + const basePath = 'Program Files (x86)\\Microsoft Visual Studio'; + + for (const drive of 'cdefghijklmnopqrstuvwxyz') { + for (const version of ['2017', '2019']) { + // Microsoft's VS docs call these versions of Visual Studio "Offerings". + for (const offering of ['Enterprise', 'Professional', 'Community']) { + const vsPath = `${drive}:\\${basePath}\\${version}\\${offering}`; + const msbuildPath = `${vsPath}\\MSBuild\\Current\\Bin\\MSBuild.exe`; + if (fs.existsSync(msbuildPath)) { + return msbuildPath; + } + } + } + } + + return null; +} + +/** + * Add Xbox-One-specific arguments to the application's argument parser (from + * the "yargs" module). + * + * @param {Yargs} yargs The argument parser object from "yargs". + */ +function addXboxOneArgs(yargs) { + const msbuildPath = findMsbuild(); + + yargs + .option('hostname', { + description: + 'The Xbox One hostname or IP address, with optional port number ' + + '(default port number is 11443)', + type: 'string', + demandOption: true, + }) + .option('username', { + description: 'The Xbox One Device Portal username.', + type: 'string', + demandOption: true, + }) + .option('password', { + description: 'The Xbox One Device Portal password.', + type: 'string', + demandOption: true, + }) + .option('msbuild', { + description: 'The path to MSBuild.exe from Visual Studio.', + type: 'string', + // We try to detect the path for you, but if we fail, this becomes a + // required argument. + default: msbuildPath, + demandOption: msbuildPath == null, + }); +} + +module.exports = { + checkPlatformRequirements, + loadOnXboxOne, + takeScreenshot, + addXboxOneArgs, +}; diff --git a/backends/xboxone/xbox-one-webdriver-cli.js b/backends/xboxone/xbox-one-webdriver-cli.js new file mode 100755 index 0000000..e91a9c0 --- /dev/null +++ b/backends/xboxone/xbox-one-webdriver-cli.js @@ -0,0 +1,75 @@ +#!/usr/bin/env node +/** + * Copyright 2020 Google LLC + * + * 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. + */ + + +const fs = require('fs'); +const yargs = require('yargs'); +const {loadOnXboxOne, takeScreenshot, addXboxOneArgs} = + require('./xbox-one-utils'); + +yargs + .strict() + .usage('Usage: $0 --hostname= --url=') + .usage(' or: $0 --hostname= --home') + .usage(' or: $0 --hostname= --screenshot=') + .option('url', { + description: 'A URL to direct the Xbox One device to.\n' + + 'Either --url, --home, or --screenshot must be specified.', + type: 'string', + }) + .option('home', { + description: 'Direct the Xbox One device to the home screen.\n' + + 'Either --url, --home, or --screenshot must be specified.', + type: 'boolean', + }) + .option('screenshot', { + description: 'Take a screenshot of the Xbox One device and save to the ' + + 'specified path.\n' + + 'Either --url, --home, or --screenshot must be specified.', + type: 'string', + }) + // You can't use more than one of these at once. + .conflicts('url', 'home') + .conflicts('url', 'screenshot') + .conflicts('home', 'screenshot') + .check((flags) => { + // Enforce that one or the other is specified. + if (!flags.url && !flags.home && !flags.screenshot) { + throw new Error( + 'Either --url, --home, or --screenshot must be specified.'); + } + + return true; + }); + +addXboxOneArgs(yargs); + +const flags = yargs.argv; + +(async () => { + try { + if (flags.screenshot) { + const data = await takeScreenshot( + flags.hostname, flags.username, flags.password); + fs.writeFileSync(flags.screenshot, data); + } else { + await loadOnXboxOne(flags, /* log= */ console, flags.url); + } + } catch (error) { + console.error(error); + } +})(); diff --git a/backends/xboxone/xbox-one-webdriver-server.js b/backends/xboxone/xbox-one-webdriver-server.js new file mode 100755 index 0000000..85254be --- /dev/null +++ b/backends/xboxone/xbox-one-webdriver-server.js @@ -0,0 +1,71 @@ +#!/usr/bin/env node +/** + * Copyright 2020 Google LLC + * + * 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. + */ + + +let baseModule; +try { + // To support easy development when making changes in the source repo, we + // first try looking for a copy of the base module using a relative path. In + // this context, we prefer the local copy over one that may already be + // installed. + baseModule = require('../../generic-webdriver-server'); +} catch (error) { + if (!error.message.includes('Cannot find module')) { + throw error; + } + + // When this module is running in an installed context, we fall back to + // requiring the installed base module by name. + baseModule = require('generic-webdriver-server'); +} + +const {GenericSingleSessionWebDriverServer, yargs} = baseModule; +const { + checkPlatformRequirements, + loadOnXboxOne, + takeScreenshot, + addXboxOneArgs, +} = require('./xbox-one-utils'); + +/** WebDriver server backend for Xbox One */ +class XboxOneWebDriverServer extends GenericSingleSessionWebDriverServer { + constructor() { + super(); + checkPlatformRequirements(); + } + + /** @override */ + async navigateToSingleSession(url) { + await loadOnXboxOne(this.flags, this.log, url); + } + + /** @override */ + async closeSingleSession() { + // Send the device back to the home screen. + await loadOnXboxOne(this.flags, this.log, null); + } + + /** @override */ + async screenshot(sessionId) { + return await takeScreenshot( + this.flags.hostname, this.flags.username, this.flags.password); + } +} + +addXboxOneArgs(yargs); +const server = new XboxOneWebDriverServer(); +server.listen(); diff --git a/package-lock.json b/package-lock.json index 0c96f1a..5ebf2f9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,11 +1,11 @@ { "name": "generic-webdriver-server", - "version": "1.1.0", + "version": "1.1.1", "lockfileVersion": 2, "requires": true, "packages": { "": { - "version": "1.1.0", + "version": "1.1.1", "license": "Apache-2.0", "dependencies": { "express": "^4.17.1", @@ -50,6 +50,9 @@ "dev": true, "dependencies": { "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" } }, "node_modules/@babel/highlight/node_modules/chalk": { @@ -61,6 +64,9 @@ "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" } }, "node_modules/@babel/highlight/node_modules/color-convert": { @@ -90,13 +96,22 @@ "dependencies": { "mime-types": "~2.1.24", "negotiator": "0.6.2" + }, + "engines": { + "node": ">= 0.6" } }, "node_modules/acorn": { "version": "7.3.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.3.1.tgz", "integrity": "sha512-tLc0wSnatxAQHVHUapaHdz72pi9KUyHjq5KyHjGg9Y8Ifdc79pTh2XvI6I1/chZbnM7QtNKzh66ooDogPZSleA==", - "dev": true + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } }, "node_modules/acorn-jsx": { "version": "5.2.0", @@ -120,12 +135,18 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "dev": true + "dev": true, + "engines": { + "node": ">=6" + } }, "node_modules/ansi-regex": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "engines": { + "node": ">=8" + } }, "node_modules/ansi-styles": { "version": "4.2.1", @@ -134,6 +155,9 @@ "dependencies": { "@types/color-name": "^1.1.1", "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" } }, "node_modules/argparse": { @@ -154,7 +178,10 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", - "dev": true + "dev": true, + "engines": { + "node": ">=4" + } }, "node_modules/balanced-match": { "version": "1.0.0", @@ -177,6 +204,9 @@ "qs": "6.7.0", "raw-body": "2.4.0", "type-is": "~1.6.17" + }, + "engines": { + "node": ">= 0.8" } }, "node_modules/brace-expansion": { @@ -192,18 +222,27 @@ "node_modules/bytes": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "engines": { + "node": ">= 0.8" + } }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true + "dev": true, + "engines": { + "node": ">=6" + } }, "node_modules/camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "engines": { + "node": ">=6" + } }, "node_modules/chalk": { "version": "4.1.0", @@ -213,13 +252,19 @@ "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" } }, "node_modules/chalk/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, "node_modules/chalk/node_modules/supports-color": { "version": "7.1.0", @@ -228,6 +273,9 @@ "dev": true, "dependencies": { "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, "node_modules/cliui": { @@ -246,6 +294,9 @@ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dependencies": { "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, "node_modules/color-name": { @@ -257,7 +308,10 @@ "version": "0.7.5", "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-0.7.5.tgz", "integrity": "sha512-iH9YA35ccw94nx5244GVkpyC9eVTsL71jZz6iz5w6RIf79JLF2AsXHXq9p6Oaohyl3sx5qSMnGsWUDFIAfWL4w==", - "dev": true + "dev": true, + "engines": { + "node": ">= 6.0.0" + } }, "node_modules/concat-map": { "version": "0.0.1", @@ -271,17 +325,26 @@ "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", "dependencies": { "safe-buffer": "5.1.2" + }, + "engines": { + "node": ">= 0.6" } }, "node_modules/content-type": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "engines": { + "node": ">= 0.6" + } }, "node_modules/cookie": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", - "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", + "engines": { + "node": ">= 0.6" + } }, "node_modules/cookie-signature": { "version": "1.0.6", @@ -297,6 +360,9 @@ "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" } }, "node_modules/debug": { @@ -310,7 +376,10 @@ "node_modules/decamelize": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "engines": { + "node": ">=0.10.0" + } }, "node_modules/deep-is": { "version": "0.1.3", @@ -321,7 +390,10 @@ "node_modules/depd": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "engines": { + "node": ">= 0.6" + } }, "node_modules/destroy": { "version": "1.0.4", @@ -335,6 +407,9 @@ "dev": true, "dependencies": { "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" } }, "node_modules/ee-first": { @@ -350,7 +425,10 @@ "node_modules/encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "engines": { + "node": ">= 0.8" + } }, "node_modules/enquirer": { "version": "2.3.6", @@ -359,6 +437,9 @@ "dev": true, "dependencies": { "ansi-colors": "^4.1.1" + }, + "engines": { + "node": ">=8.6" } }, "node_modules/escape-html": { @@ -370,7 +451,10 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.8.0" + } }, "node_modules/eslint": { "version": "7.4.0", @@ -414,13 +498,22 @@ "table": "^5.2.3", "text-table": "^0.2.0", "v8-compile-cache": "^2.0.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" } }, "node_modules/eslint-config-google": { "version": "0.14.0", "resolved": "https://registry.npmjs.org/eslint-config-google/-/eslint-config-google-0.14.0.tgz", "integrity": "sha512-WsbX4WbjuMvTdeVL6+J3rK1RGhCTqjsFjX7UMSMgZiyxxaNLkoJENbrGExzERFeoTpGw3F3FypTiWAP9ZXzkEw==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, "node_modules/eslint-plugin-jsdoc": { "version": "30.0.2", @@ -435,6 +528,9 @@ "regextras": "^0.7.1", "semver": "^7.3.2", "spdx-expression-parse": "^3.0.1" + }, + "engines": { + "node": ">=10" } }, "node_modules/eslint-plugin-jsdoc/node_modules/debug": { @@ -460,6 +556,9 @@ "dependencies": { "esrecurse": "^4.1.0", "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" } }, "node_modules/eslint-utils": { @@ -469,13 +568,19 @@ "dev": true, "dependencies": { "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": ">=6" } }, "node_modules/eslint-visitor-keys": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true + "dev": true, + "engines": { + "node": ">=4" + } }, "node_modules/eslint/node_modules/debug": { "version": "4.1.1", @@ -501,13 +606,23 @@ "acorn": "^7.2.0", "acorn-jsx": "^5.2.0", "eslint-visitor-keys": "^1.2.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" } }, "node_modules/esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } }, "node_modules/esquery": { "version": "1.3.1", @@ -516,13 +631,19 @@ "dev": true, "dependencies": { "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" } }, "node_modules/esquery/node_modules/estraverse": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.1.0.tgz", "integrity": "sha512-FyohXK+R0vE+y1nHLoBM7ZTyqRpqAlhdZHCWIWEviFLiGB8b04H6bQs8G+XTthacvT8VuwvteiP7RJSxMs8UEw==", - "dev": true + "dev": true, + "engines": { + "node": ">=4.0" + } }, "node_modules/esrecurse": { "version": "4.2.1", @@ -531,24 +652,36 @@ "dev": true, "dependencies": { "estraverse": "^4.1.0" + }, + "engines": { + "node": ">=4.0" } }, "node_modules/estraverse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true + "dev": true, + "engines": { + "node": ">=4.0" + } }, "node_modules/esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, "node_modules/etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "engines": { + "node": ">= 0.6" + } }, "node_modules/express": { "version": "4.17.1", @@ -585,6 +718,9 @@ "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" } }, "node_modules/fast-deep-equal": { @@ -612,6 +748,9 @@ "dev": true, "dependencies": { "flat-cache": "^2.0.1" + }, + "engines": { + "node": ">=4" } }, "node_modules/finalhandler": { @@ -626,6 +765,9 @@ "parseurl": "~1.3.3", "statuses": "~1.5.0", "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" } }, "node_modules/find-up": { @@ -635,6 +777,9 @@ "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, "node_modules/flat-cache": { @@ -646,6 +791,9 @@ "flatted": "^2.0.0", "rimraf": "2.6.3", "write": "1.0.3" + }, + "engines": { + "node": ">=4" } }, "node_modules/flatted": { @@ -657,12 +805,18 @@ "node_modules/forwarded": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", - "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", + "engines": { + "node": ">= 0.6" + } }, "node_modules/fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "engines": { + "node": ">= 0.6" + } }, "node_modules/fs.realpath": { "version": "1.0.0", @@ -679,7 +833,10 @@ "node_modules/get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } }, "node_modules/glob": { "version": "7.1.6", @@ -693,6 +850,9 @@ "minimatch": "^3.0.4", "once": "^1.3.0", "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" } }, "node_modules/glob-parent": { @@ -702,6 +862,9 @@ "dev": true, "dependencies": { "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" } }, "node_modules/globals": { @@ -711,13 +874,19 @@ "dev": true, "dependencies": { "type-fest": "^0.8.1" + }, + "engines": { + "node": ">=8" } }, "node_modules/has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true + "dev": true, + "engines": { + "node": ">=4" + } }, "node_modules/http-errors": { "version": "1.7.2", @@ -729,6 +898,9 @@ "setprototypeof": "1.1.1", "statuses": ">= 1.5.0 < 2", "toidentifier": "1.0.0" + }, + "engines": { + "node": ">= 0.6" } }, "node_modules/iconv-lite": { @@ -737,13 +909,19 @@ "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dependencies": { "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" } }, "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==", - "dev": true + "dev": true, + "engines": { + "node": ">= 4" + } }, "node_modules/import-fresh": { "version": "3.2.1", @@ -753,13 +931,19 @@ "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" } }, "node_modules/imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.8.19" + } }, "node_modules/inflight": { "version": "1.0.6", @@ -779,18 +963,27 @@ "node_modules/ipaddr.js": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } }, "node_modules/is-glob": { "version": "4.0.1", @@ -799,6 +992,9 @@ "dev": true, "dependencies": { "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" } }, "node_modules/isexe": { @@ -821,13 +1017,22 @@ "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" } }, "node_modules/jsdoctypeparser": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/jsdoctypeparser/-/jsdoctypeparser-8.0.0.tgz", "integrity": "sha512-eLCs6s4JqN8TjFJfgdiLHRvogLhOAJz+5RIA2FtoMe6ZDyuvghvppnlIToqAEnVbxRqLMrfnNXpW8FpmR6IMBw==", - "dev": true + "dev": true, + "bin": { + "jsdoctypeparser": "bin/jsdoctypeparser" + }, + "engines": { + "node": ">=10" + } }, "node_modules/json-schema-traverse": { "version": "0.4.1", @@ -849,6 +1054,9 @@ "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" } }, "node_modules/locate-path": { @@ -857,6 +1065,9 @@ "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dependencies": { "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" } }, "node_modules/lodash": { @@ -868,7 +1079,10 @@ "node_modules/media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "engines": { + "node": ">= 0.6" + } }, "node_modules/merge-descriptors": { "version": "1.0.1", @@ -878,17 +1092,29 @@ "node_modules/methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "engines": { + "node": ">= 0.6" + } }, "node_modules/mime": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } }, "node_modules/mime-db": { "version": "1.44.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", - "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==" + "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==", + "engines": { + "node": ">= 0.6" + } }, "node_modules/mime-types": { "version": "2.1.27", @@ -896,6 +1122,9 @@ "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", "dependencies": { "mime-db": "1.44.0" + }, + "engines": { + "node": ">= 0.6" } }, "node_modules/minimatch": { @@ -905,6 +1134,9 @@ "dev": true, "dependencies": { "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" } }, "node_modules/minimist": { @@ -920,6 +1152,9 @@ "dev": true, "dependencies": { "minimist": "^1.2.5" + }, + "bin": { + "mkdirp": "bin/cmd.js" } }, "node_modules/ms": { @@ -936,7 +1171,10 @@ "node_modules/negotiator": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "engines": { + "node": ">= 0.6" + } }, "node_modules/on-finished": { "version": "2.3.0", @@ -944,6 +1182,9 @@ "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", "dependencies": { "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" } }, "node_modules/once": { @@ -967,6 +1208,9 @@ "prelude-ls": "^1.2.1", "type-check": "^0.4.0", "word-wrap": "^1.2.3" + }, + "engines": { + "node": ">= 0.8.0" } }, "node_modules/p-limit": { @@ -975,6 +1219,9 @@ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dependencies": { "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" } }, "node_modules/p-locate": { @@ -983,12 +1230,18 @@ "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dependencies": { "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" } }, "node_modules/p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "engines": { + "node": ">=6" + } }, "node_modules/parent-module": { "version": "1.0.1", @@ -997,29 +1250,44 @@ "dev": true, "dependencies": { "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" } }, "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "engines": { + "node": ">=8" + } }, "node_modules/path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, "node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, "node_modules/path-to-regexp": { "version": "0.1.7", @@ -1030,13 +1298,19 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true + "dev": true, + "engines": { + "node": ">= 0.8.0" + } }, "node_modules/progress": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.4.0" + } }, "node_modules/proxy-addr": { "version": "2.0.6", @@ -1045,23 +1319,35 @@ "dependencies": { "forwarded": "~0.1.2", "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" } }, "node_modules/punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true + "dev": true, + "engines": { + "node": ">=6" + } }, "node_modules/qs": { "version": "6.7.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "engines": { + "node": ">=0.6" + } }, "node_modules/range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } }, "node_modules/raw-body": { "version": "2.4.0", @@ -1072,24 +1358,36 @@ "http-errors": "1.7.2", "iconv-lite": "0.4.24", "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" } }, "node_modules/regexpp": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, "node_modules/regextras": { "version": "0.7.1", "resolved": "https://registry.npmjs.org/regextras/-/regextras-0.7.1.tgz", "integrity": "sha512-9YXf6xtW+qzQ+hcMQXx95MOvfqXFgsKDZodX3qZB0x2n5Z94ioetIITsBtvJbiOyxa/6s9AtyweBLCdPmPko/w==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.1.14" + } }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "engines": { + "node": ">=0.10.0" + } }, "node_modules/require-main-filename": { "version": "2.0.0", @@ -1100,7 +1398,10 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true + "dev": true, + "engines": { + "node": ">=4" + } }, "node_modules/rimraf": { "version": "2.6.3", @@ -1109,6 +1410,9 @@ "dev": true, "dependencies": { "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" } }, "node_modules/safe-buffer": { @@ -1125,7 +1429,13 @@ "version": "7.3.2", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", - "dev": true + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } }, "node_modules/send": { "version": "0.17.1", @@ -1145,6 +1455,9 @@ "on-finished": "~2.3.0", "range-parser": "~1.2.1", "statuses": "~1.5.0" + }, + "engines": { + "node": ">= 0.8.0" } }, "node_modules/send/node_modules/ms": { @@ -1161,6 +1474,9 @@ "escape-html": "~1.0.3", "parseurl": "~1.3.3", "send": "0.17.1" + }, + "engines": { + "node": ">= 0.8.0" } }, "node_modules/set-blocking": { @@ -1180,13 +1496,19 @@ "dev": true, "dependencies": { "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" } }, "node_modules/shebang-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, "node_modules/slice-ansi": { "version": "2.1.0", @@ -1197,6 +1519,9 @@ "ansi-styles": "^3.2.0", "astral-regex": "^1.0.0", "is-fullwidth-code-point": "^2.0.0" + }, + "engines": { + "node": ">=6" } }, "node_modules/slice-ansi/node_modules/ansi-styles": { @@ -1206,6 +1531,9 @@ "dev": true, "dependencies": { "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" } }, "node_modules/slice-ansi/node_modules/color-convert": { @@ -1227,7 +1555,10 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true + "dev": true, + "engines": { + "node": ">=4" + } }, "node_modules/spdx-exceptions": { "version": "2.3.0", @@ -1260,7 +1591,10 @@ "node_modules/statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "engines": { + "node": ">= 0.6" + } }, "node_modules/string-width": { "version": "4.2.0", @@ -1270,6 +1604,9 @@ "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" } }, "node_modules/strip-ansi": { @@ -1278,13 +1615,19 @@ "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", "dependencies": { "ansi-regex": "^5.0.0" + }, + "engines": { + "node": ">=8" } }, "node_modules/strip-json-comments": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.0.tgz", "integrity": "sha512-e6/d0eBu7gHtdCqFt0xJr642LdToM5/cN4Qb9DbHjVx1CP5RyeM+zH7pbecEmDv/lBqb0QH+6Uqq75rxFPkM0w==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, "node_modules/supports-color": { "version": "5.5.0", @@ -1293,6 +1636,9 @@ "dev": true, "dependencies": { "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" } }, "node_modules/table": { @@ -1305,13 +1651,19 @@ "lodash": "^4.17.14", "slice-ansi": "^2.1.0", "string-width": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" } }, "node_modules/table/node_modules/ansi-regex": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true + "dev": true, + "engines": { + "node": ">=6" + } }, "node_modules/table/node_modules/emoji-regex": { "version": "7.0.3", @@ -1323,7 +1675,10 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true + "dev": true, + "engines": { + "node": ">=4" + } }, "node_modules/table/node_modules/string-width": { "version": "3.1.0", @@ -1334,6 +1689,9 @@ "emoji-regex": "^7.0.1", "is-fullwidth-code-point": "^2.0.0", "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" } }, "node_modules/table/node_modules/strip-ansi": { @@ -1343,6 +1701,9 @@ "dev": true, "dependencies": { "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" } }, "node_modules/text-table": { @@ -1354,7 +1715,10 @@ "node_modules/toidentifier": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "engines": { + "node": ">=0.6" + } }, "node_modules/type-check": { "version": "0.4.0", @@ -1363,13 +1727,19 @@ "dev": true, "dependencies": { "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" } }, "node_modules/type-fest": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, "node_modules/type-is": { "version": "1.6.18", @@ -1378,12 +1748,18 @@ "dependencies": { "media-typer": "0.3.0", "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" } }, "node_modules/unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "engines": { + "node": ">= 0.8" + } }, "node_modules/uri-js": { "version": "4.2.2", @@ -1397,7 +1773,10 @@ "node_modules/utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "engines": { + "node": ">= 0.4.0" + } }, "node_modules/v8-compile-cache": { "version": "2.1.1", @@ -1408,7 +1787,10 @@ "node_modules/vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "engines": { + "node": ">= 0.8" + } }, "node_modules/which": { "version": "2.0.2", @@ -1417,6 +1799,12 @@ "dev": true, "dependencies": { "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" } }, "node_modules/which-module": { @@ -1428,7 +1816,10 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, "node_modules/wrap-ansi": { "version": "6.2.0", @@ -1438,6 +1829,9 @@ "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" } }, "node_modules/wrappy": { @@ -1453,6 +1847,9 @@ "dev": true, "dependencies": { "mkdirp": "^0.5.1" + }, + "engines": { + "node": ">=4" } }, "node_modules/y18n": { @@ -1476,6 +1873,9 @@ "which-module": "^2.0.0", "y18n": "^4.0.0", "yargs-parser": "^18.1.1" + }, + "engines": { + "node": ">=8" } }, "node_modules/yargs-parser": { @@ -1485,6 +1885,9 @@ "dependencies": { "camelcase": "^5.0.0", "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" } } }, diff --git a/package.json b/package.json index 592d85c..e9e029f 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "generic-webdriver-server", "description": "A generic WebDriver server base class and a Selenium add-on to invoke it.", - "version": "1.1.0", + "version": "1.1.1", "homepage": "https://github.com/google/generic-webdriver-server", "author": "Google", "license": "Apache-2.0", From 79303a11f0ee1de563b716b62a0a975ce753b606 Mon Sep 17 00:00:00 2001 From: Joey Parrish Date: Thu, 11 Feb 2021 12:38:42 -0800 Subject: [PATCH 2/7] Add explicit docs on device models --- README.md | 2 +- backends/xboxone/README.md | 10 +++++++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 2df68db..a5b6127 100644 --- a/README.md +++ b/README.md @@ -35,7 +35,7 @@ Out of the box, we provide backends for: - Chromecast (NPM package [`chromecast-webdriver-server`](https://www.npmjs.com/package/chromecast-webdriver-server)) - ChromeOS (NPM package [`chromeos-webdriver-server`](https://www.npmjs.com/package/chromeos-webdriver-server)) - Tizen (NPM package [`tizen-webdriver-server`](https://www.npmjs.com/package/tizen-webdriver-server)) - - Xbox One (NPM package [`xbox-one-webdriver-server`](https://www.npmjs.com/package/xbox-one-webdriver-server)) + - Xbox One/One X/One S/Series X/Series S (NPM package [`xbox-one-webdriver-server`](https://www.npmjs.com/package/xbox-one-webdriver-server)) In addition, you'll need JAR files from the package [`generic-webdriver-server`](https://www.npmjs.com/package/generic-webdriver-server). diff --git a/backends/xboxone/README.md b/backends/xboxone/README.md index 5eca742..38a4867 100644 --- a/backends/xboxone/README.md +++ b/backends/xboxone/README.md @@ -7,10 +7,18 @@ WebDriver protocol necessary for [Karma][]. Add Xbox One devices to your Part of the [Generic WebDriver Server][] family. +## Supported Models + +These tools should work on Xbox One, Xbox One X, Xbox One S, Xbox Series X, and +Xbox Series S devices. + +These tools will **not** work with Xbox 360 or the original Xbox devices. + + ## Prerequisites To use these tools, you will need: - - Xbox One device in Dev Mode + - Xbox One (or One X, One S, Series X, Series S) device in Dev Mode - Windows 10 host - Visual Studio 2015 Update 3, Visual Studio 2017, or Visual Studio 2019 - Windows 10 SDK w/ Universal Windows App Development Tools (UWP) From 9133e1b60d29fe9430a55fcdb5b38648fed54173 Mon Sep 17 00:00:00 2001 From: Joey Parrish Date: Thu, 11 Feb 2021 12:39:38 -0800 Subject: [PATCH 3/7] Fix doc typos --- backends/xboxone/README.md | 6 +++--- backends/xboxone/tunneling.md | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/backends/xboxone/README.md b/backends/xboxone/README.md index 38a4867..fd454ab 100644 --- a/backends/xboxone/README.md +++ b/backends/xboxone/README.md @@ -134,7 +134,7 @@ See [how-it-works.md](https://github.com/google/generic-webdriver-server/blob/ma for details. -## Tunneling to a Xbox One device on another network +## Tunneling to an Xbox One device on another network See [tunneling.md](https://github.com/google/generic-webdriver-server/blob/main/backends/xbox-one/tunneling.md) for details. @@ -142,8 +142,8 @@ for details. ## Using the CLI -In addition to running a Xbox One node in Selenium, this package offers a CLI -for directing a Xbox One device to a specific URL. For example, if installed +In addition to running an Xbox One node in Selenium, this package offers a CLI +for directing an Xbox One device to a specific URL. For example, if installed globally with `npm install -g xbox-one-webdriver-server`: ```sh diff --git a/backends/xboxone/tunneling.md b/backends/xboxone/tunneling.md index dbc4ec6..b34b96a 100644 --- a/backends/xboxone/tunneling.md +++ b/backends/xboxone/tunneling.md @@ -1,4 +1,4 @@ -# Tunneling to a Xbox One Device on Another Network +# Tunneling to an Xbox One Device on Another Network If your Selenium node runs on a separate network from your Xbox One device, you may need to create a tunnel to that other network. This document will From 401817a1c2b0ee64313bd6179cb69d0edd2790d0 Mon Sep 17 00:00:00 2001 From: Joey Parrish Date: Thu, 11 Feb 2021 12:40:17 -0800 Subject: [PATCH 4/7] Strip down App.xaml.cs --- backends/xboxone/app-template/App.xaml.cs | 31 +---------------------- 1 file changed, 1 insertion(+), 30 deletions(-) diff --git a/backends/xboxone/app-template/App.xaml.cs b/backends/xboxone/app-template/App.xaml.cs index 938ef9c..aa84df3 100644 --- a/backends/xboxone/app-template/App.xaml.cs +++ b/backends/xboxone/app-template/App.xaml.cs @@ -16,14 +16,11 @@ // This is the C# code-behind for App.xaml. It's all boilerplate generated by // Visual Studio, then cleaned up by hand to remove things we definitely didn't -// need. There may be more cleanup possible. +// need. -using System; -using Windows.ApplicationModel; using Windows.ApplicationModel.Activation; using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; -using Windows.UI.Xaml.Navigation; namespace XboxOneWebDriverServer { @@ -39,7 +36,6 @@ sealed partial class App : Application public App() { this.InitializeComponent(); - this.Suspending += OnSuspending; } /// @@ -58,8 +54,6 @@ protected override void OnLaunched(LaunchActivatedEventArgs e) // Create a Frame to act as the navigation context and navigate to the first page rootFrame = new Frame(); - rootFrame.NavigationFailed += OnNavigationFailed; - // Place the frame in the current Window Window.Current.Content = rootFrame; } @@ -77,28 +71,5 @@ protected override void OnLaunched(LaunchActivatedEventArgs e) Window.Current.Activate(); } } - - /// - /// Invoked when Navigation to a certain page fails - /// - /// The Frame which failed navigation - /// Details about the navigation failure - void OnNavigationFailed(object sender, NavigationFailedEventArgs e) - { - throw new Exception("Failed to load Page " + e.SourcePageType.FullName); - } - - /// - /// Invoked when application execution is being suspended. Application state is saved - /// without knowing whether the application will be terminated or resumed with the contents - /// of memory still intact. - /// - /// The source of the suspend request. - /// Details about the suspend request. - private void OnSuspending(object sender, SuspendingEventArgs e) - { - var deferral = e.SuspendingOperation.GetDeferral(); - deferral.Complete(); - } } } From f46369137976311f8928a031db3cfaf24d1c922e Mon Sep 17 00:00:00 2001 From: Joey Parrish Date: Fri, 19 Feb 2021 15:38:03 -0800 Subject: [PATCH 5/7] Only auto-detect VS 2019 --- backends/xboxone/README.md | 14 +++++++++----- backends/xboxone/xbox-one-utils.js | 16 +++++++--------- 2 files changed, 16 insertions(+), 14 deletions(-) diff --git a/backends/xboxone/README.md b/backends/xboxone/README.md index fd454ab..304bfb1 100644 --- a/backends/xboxone/README.md +++ b/backends/xboxone/README.md @@ -62,9 +62,11 @@ To use these tools, you will need: Studio 2019, install it now: https://visualstudio.microsoft.com/ 2. When installing the Windows 10 SDK, check Universal Windows App Development Tools: https://docs.microsoft.com/en-us/windows/uwp/xbox-apps/development-environment-setup -3. If you install Visual Studio in any unusual location, you may have to - provide an explicit path to `MSBuild.exe` when you configure the WebDriver - server later. +3. If you have VS 2015 or VS 2017, or if you install Visual Studio in any + unusual location, you may have to provide an explicit path to `MSBuild.exe` + when you configure the WebDriver server later. (We have only tested the + automatic configuration of the MSBuild path in VS 2019. See `msbuild` + parameter described below under "Usage".) ### Screenshot setup @@ -112,7 +114,8 @@ properties: capabilities instead. (See below.) - `genericwebdriver.backend.params.msbuild`: The path to `MSBuild.exe` from Visual Studio. The server will attempt to locate this at typical locations - on all drives. If that fails, this option becomes **required**. + on all drives. If that fails, this option becomes **required**. For Visual + Studio 2015 or Visual Studio 2017, this option is also **required**. ## Supported parameters @@ -125,7 +128,8 @@ This backend supports the following parameters: - `password`: **(required)** The Xbox One Device Portal password. - `msbuild`: The path to `MSBuild.exe` from Visual Studio. The server will attempt to locate this at typical locations on all drives. If that fails, - this option becomes **required**. + this option becomes **required**. For Visual Studio 2015 or Visual Studio + 2017, this option is also **required**. ## How it works diff --git a/backends/xboxone/xbox-one-utils.js b/backends/xboxone/xbox-one-utils.js index 3e587a4..1f1b624 100644 --- a/backends/xboxone/xbox-one-utils.js +++ b/backends/xboxone/xbox-one-utils.js @@ -310,17 +310,15 @@ function httpRequestHelper( * @return {?string} The path to MSBuild.exe, or null if not found. */ function findMsbuild() { - const basePath = 'Program Files (x86)\\Microsoft Visual Studio'; + const basePath = 'Program Files (x86)\\Microsoft Visual Studio\\2019'; for (const drive of 'cdefghijklmnopqrstuvwxyz') { - for (const version of ['2017', '2019']) { - // Microsoft's VS docs call these versions of Visual Studio "Offerings". - for (const offering of ['Enterprise', 'Professional', 'Community']) { - const vsPath = `${drive}:\\${basePath}\\${version}\\${offering}`; - const msbuildPath = `${vsPath}\\MSBuild\\Current\\Bin\\MSBuild.exe`; - if (fs.existsSync(msbuildPath)) { - return msbuildPath; - } + // Microsoft's VS docs call these versions of Visual Studio "Offerings". + for (const offering of ['Enterprise', 'Professional', 'Community']) { + const vsPath = `${drive}:\\${basePath}\\${offering}`; + const msbuildPath = `${vsPath}\\MSBuild\\Current\\Bin\\MSBuild.exe`; + if (fs.existsSync(msbuildPath)) { + return msbuildPath; } } } From 47802d137fafc75df9d37f76568d266d114f6620 Mon Sep 17 00:00:00 2001 From: Joey Parrish Date: Fri, 19 Feb 2021 15:39:10 -0800 Subject: [PATCH 6/7] Optimistically update changelog release date --- backends/xboxone/CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backends/xboxone/CHANGELOG.md b/backends/xboxone/CHANGELOG.md index 11b0cb7..8930473 100644 --- a/backends/xboxone/CHANGELOG.md +++ b/backends/xboxone/CHANGELOG.md @@ -1,3 +1,3 @@ -## 1.0.0 (2021-02-11) +## 1.0.0 (2021-02-22) Initial release. From f34c945d8054db95464aa1c961323215f646cb92 Mon Sep 17 00:00:00 2001 From: Joey Parrish Date: Fri, 19 Feb 2021 18:56:05 -0800 Subject: [PATCH 7/7] Tweak changelog release date again --- backends/xboxone/CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backends/xboxone/CHANGELOG.md b/backends/xboxone/CHANGELOG.md index 8930473..4fbaef0 100644 --- a/backends/xboxone/CHANGELOG.md +++ b/backends/xboxone/CHANGELOG.md @@ -1,3 +1,3 @@ -## 1.0.0 (2021-02-22) +## 1.0.0 (2021-02-19) Initial release.