diff --git a/.github/workflows/publish-btp.yml b/.github/workflows/publish-btp.yml index a512fca1..be6b2d8c 100644 --- a/.github/workflows/publish-btp.yml +++ b/.github/workflows/publish-btp.yml @@ -15,7 +15,7 @@ jobs: - uses: actions/checkout@v3 - uses: actions/setup-node@v3 with: - node-version: 16 + node-version: 18 cache: "npm" cache-dependency-path: "**/package-lock.json" registry-url: https://registry.npmjs.org/ @@ -29,18 +29,21 @@ jobs: uses: actions/upload-artifact@v3 with: name: mtar - path: | - examples/ui5-ts-app/mta_archives/ui5-approuter_1.0.0.mtar + path: examples/ui5-ts-app/mta_archives/ui5-approuter_1.0.0.mtar publish-sample-ts-app-to-btp: needs: build-sample-ts-app runs-on: ubuntu-latest - container: ppiper/cf-cli steps: - name: get mtar uses: actions/download-artifact@v3 with: name: mtar - - run: | - cf login -a https://api.cf.eu20.hana.ondemand.com -u ${{secrets.BTP_LOGIN}} -p ${{secrets.BTP_PASSWORD}} -o "${{secrets.BTP_ORG}}" -s ${{secrets.BTP_SPACE}} - cf deploy examples/ui5-ts-app/mta_archives/ui5-approuter_1.0.0.mtar -f + - uses: elliottpope/cloudfoundry-cli-action + with: + CF_API: https://api.cf.eu20.hana.ondemand.com + USERNAME: ${{ secrets.BTP_LOGIN }} + PASSWORD: ${{ secrets.BTP_PASSWORD }} + ORG: ${{secrets.BTP_ORG}} + SPACE: ${{secrets.BTP_SPACE}} + COMMAND: deploy examples/ui5-ts-app/mta_archives/ui5-approuter_1.0.0.mtar -f diff --git a/.github/workflows/wdi5-tests_js-app.yml b/.github/workflows/wdi5-tests_js-app.yml index 69df9e53..be794f3a 100644 --- a/.github/workflows/wdi5-tests_js-app.yml +++ b/.github/workflows/wdi5-tests_js-app.yml @@ -61,6 +61,10 @@ jobs: - name: build run: npm run build - # run wdi5 tests within app(s) - - name: test js-app + # run wdi5 tests within CJS app/env + - name: test cjs js-app run: npm run test-h:js-app + + # run wdi5 tests within ESM app/env + - name: test esm js-app + run: npm run test-h:js-app:esm diff --git a/.vscode/settings.json b/.vscode/settings.json index 6b20ac3e..f84c5731 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -4,5 +4,6 @@ "editor.defaultFormatter": "esbenp.prettier-vscode" }, "javascript.preferences.importModuleSpecifierEnding": "js", - "typescript.preferences.importModuleSpecifierEnding": "js" + "typescript.preferences.importModuleSpecifierEnding": "js", + "search.useIgnoreFiles": true } diff --git a/client-side-js/fireEvent.cjs b/client-side-js/fireEvent.cjs index 57162add..e2bfc496 100644 --- a/client-side-js/fireEvent.cjs +++ b/client-side-js/fireEvent.cjs @@ -17,7 +17,7 @@ async function clientSide_fireEvent(webElement, eventName, oOptions, browserInst } oControl.fireEvent(eventName, oOptions) // convert to boolean - done({ status: 0, resuklt: true }) + done({ status: 0, result: true }) } catch (e) { window.wdi5.errorHandling.bind(this, done) } diff --git a/docs/migration.md b/docs/migration.md new file mode 100644 index 00000000..939ae21c --- /dev/null +++ b/docs/migration.md @@ -0,0 +1,119 @@ +# Migrate from a previous version + +## from `^1` to `^2` + +Version >= 2 of `wdi5` is WebdriverIO v8 compatible. This entails a move to ESM as primary module, with CJS compatibility ensured. + +### no more explicit browser driver needed! + +WebdriverIO now automates downloading and starting the appropriate driver corresponding to the `browser` specified in the `capabilites` section of the config file (see also https://webdriver.io/blog/2023/07/31/driver-management): + +```diff +- services: ["chromedriver", "ui5"], ++ services: ["ui5"], + //... + capabilities: [{ + browserName: "chrome" + }] +``` + +Setting `browserName: "chrome"` is enough to tell `wdi5`/`wdio` to run the tests with the stable version of Chrome - no more `"chromedriver"` needed in the `services`! +To switch to Safari on macOS, following the above example is as easy as changing the `browserName`: + +```js +// wdio.conf.js + services: ["ui5"], + //... + capabilities: [{ + browserName: "safari" + }] +``` + +?> this is an _optional_ change - `wdi5` will continue to work also with explicitly denoting the browser driver in `services`! + +### check file system location reference of spec files in wdio.config.(j|t)s + +directory references start from the directory the config file is in now, not from `cwd` or project root: + +**Example**: `wdi5` config file is located adjacent to `webapp`: + +```console +. +├── e2e-test-config +│ └── wdi5.conf.js +# ... +└── webapp + ├── test + │ └── e2e + │ ├── aggregation.test.js + │ ├── allControls.test.js + │ ├── allControlsForce.test.js + │ ├── basic.test.js +# ... +``` + +Config file change: + +```diff +const config = { +- specs: [join("webapp", "test", "e2e", "ui5-late.test.js")], ++ specs: [join("..", "webapp", "test", "e2e", "ui5-late.test.js")], + // ... +} +``` + +**Example**: `wdi5` config file is located in the same directory as the tests: + +```console +. +├── regular-journey.test.ts +├── testlib-journey.test.ts +└── wdio.conf.ts +``` + +Config file change: + +```diff +export const config: wdi5Config = { +- specs: ["./test/e2e/workzone/*.test.ts"], ++ specs: ["./*.test.ts"], + // ... +} +``` + +### usage of devtools automation protocol + +Now requires using the `devtools` package (which is now a dependency of `wdi5`) and explicit configuration in the `*.conf.(j|t)s`-file: + +```diff + export const config: wdi5Config = { + baseUrl: "https://your-app", + services: ["ui5"], + specs: [resolve("test/e2e/Protocol.test.ts")], ++ automationProtocol: "devtools", + capabilities: [ + { + //... + } + ] + } +``` + +### use `wdi5` as ESM module + +With `wdi5` v2, it is possible to write tests in an ESM module environment (see [/examples/ui5-js-app-esm](https://github.com/ui5-community/wdi5/blob/main/examples/ui5-js-app-esm)). The `describe` and `it` syntax remains the same as in an CJS environment. The major difference is in the way `wdi5` and third party modules are imported in ESM-style JavaScript files. + +Sample excerpt: + +```js +// file: basic.test.js +import { wdi5 } from "wdio-ui5-service" // <-- + +describe("...", () => { + it("...", () => { + await browser.asControl(selector).someMethod() + wdi5.getLogger("esm!").log("Hello ESM World!") + }) +}) + +``` diff --git a/examples/ui5-js-app-esm/jsconfig.json b/examples/ui5-js-app-esm/jsconfig.json new file mode 100644 index 00000000..58167ccd --- /dev/null +++ b/examples/ui5-js-app-esm/jsconfig.json @@ -0,0 +1,12 @@ +{ + "compilerOptions": { + "types": [ + "node", + "@openui5/types", + "@wdio/globals/types", + "@wdio/mocha-framework", + "wdio-ui5-service/esm", + "expect-webdriverio" + ] + } +} diff --git a/examples/ui5-js-app-esm/package.json b/examples/ui5-js-app-esm/package.json new file mode 100644 index 00000000..39895fd4 --- /dev/null +++ b/examples/ui5-js-app-esm/package.json @@ -0,0 +1,28 @@ +{ + "name": "ui5-app-esm", + "version": "0.8.15-notimportant", + "private": true, + "description": "sample ESM ui5 app for testing wdi5", + "license": "UNLICENSED", + "author": "j&s-soft GmbH", + "main": "webapp/index.html", + "type": "module", + "scripts": { + "start": "ui5 serve -p 8082", + "wdi5": "wdio ./webapp/test/e2e/wdio.conf.js" + }, + "devDependencies": { + "@ui5/cli": "^3", + "@types/sinon": "^10.0.16", + "sinon": "^15.2.0", + "@wdio/cli": "^8", + "@wdio/local-runner": "^8", + "@wdio/mocha-framework": "^8", + "@wdio/spec-reporter": "^8", + "ui5-middleware-simpleproxy": "latest", + "wdio-ui5-service": "*" + }, + "dependencies": { + "@wdio/sauce-service": "^8" + } +} diff --git a/examples/ui5-js-app-esm/ui5.yaml b/examples/ui5-js-app-esm/ui5.yaml new file mode 100644 index 00000000..c9620c53 --- /dev/null +++ b/examples/ui5-js-app-esm/ui5.yaml @@ -0,0 +1,12 @@ +specVersion: "2.0" +metadata: + name: ui5-app +type: application +server: + customMiddleware: + - name: ui5-middleware-simpleproxy + afterMiddleware: compression + mountPath: /V2 + configuration: + baseUri: "https://services.odata.org/V2" + strictSSL: false diff --git a/examples/ui5-js-app-esm/webapp/Component.js b/examples/ui5-js-app-esm/webapp/Component.js new file mode 100644 index 00000000..49e33a46 --- /dev/null +++ b/examples/ui5-js-app-esm/webapp/Component.js @@ -0,0 +1,33 @@ +sap.ui.define( + [ + "sap/ui/core/UIComponent", + "sap/ui/Device", + "test/Sample/model/models", + "sap/ui/core/ComponentSupport" // make sure to include the ComponentSupport in the bundle + ], + function (UIComponent, Device, models) { + "use strict" + + return UIComponent.extend("test.Sample.Component", { + metadata: { + manifest: "json" + }, + + /** + * The component is initialized by UI5 automatically during the startup of the app and calls the init method once. + * @public + * @override + */ + init: function () { + // call the base component's init function + UIComponent.prototype.init.apply(this, arguments) + + // enable routing + this.getRouter().initialize() + + // set the device model + this.setModel(models.createDeviceModel(), "device") + } + }) + } +) diff --git a/examples/ui5-js-app-esm/webapp/controller/App.controller.js b/examples/ui5-js-app-esm/webapp/controller/App.controller.js new file mode 100644 index 00000000..08aff631 --- /dev/null +++ b/examples/ui5-js-app-esm/webapp/controller/App.controller.js @@ -0,0 +1,5 @@ +sap.ui.define(["test/Sample/controller/BaseController"], function (Controller) { + return Controller.extend("test.Sample.controller.App", { + onInit: function () {} + }) +}) diff --git a/examples/ui5-js-app-esm/webapp/controller/BaseController.js b/examples/ui5-js-app-esm/webapp/controller/BaseController.js new file mode 100644 index 00000000..b1d4eac7 --- /dev/null +++ b/examples/ui5-js-app-esm/webapp/controller/BaseController.js @@ -0,0 +1,63 @@ +sap.ui.define( + ["sap/ui/core/mvc/Controller", "sap/ui/core/routing/History"], + /** + * @param {typeof sap.ui.core.mvc.Controller} Controller + * @param {typeof sap.ui.core.routing.History} History + * @yields {typeof sap.ui.core.mvc.Controller} + */ + function (Controller, History) { + "use strict" + + return Controller.extend("test.Sample.controller.BaseController", { + /** + * inits on controller instantiation + */ + onInit: function () {}, + + /** + * Convenience method for accessing the router in every controller of the application. + * @public + * @returns {sap.ui.core.routing.Router} the router for this component + */ + getRouter: function () { + return this.getOwnerComponent().getRouter() + }, + + /** + * Convenience method for getting the view model by name in every controller of the application. + * @public + * @param {string} sName the model name + * @returns {sap.ui.model.Model} the model instance + */ + getModel: function (sName) { + return this.getView().getModel(sName) + }, + + /** + * Convenience method for getting the resource bundle. + * @public + * @returns {sap.ui.model.resource.ResourceModel} the resourceModel of the component + */ + getResourceBundle: function () { + return this.getOwnerComponent().getModel("i18n").getResourceBundle() + }, + + /** + * Event handler for navigating back. + * It there is a history entry we go one step back in the browser history + * If not, it will replace the current entry of the browser history with the master route. + * @public + */ + onNavBack: function () { + const sPreviousHash = History.getInstance().getPreviousHash() + + if (sPreviousHash !== undefined) { + // eslint-disable-next-line + history.go(-1) + } else { + this.getRouter().navTo("RouteMain", {}, true) + } + } + }) + } +) diff --git a/examples/ui5-js-app-esm/webapp/controller/Calendar.controller.js b/examples/ui5-js-app-esm/webapp/controller/Calendar.controller.js new file mode 100644 index 00000000..8fbbdae0 --- /dev/null +++ b/examples/ui5-js-app-esm/webapp/controller/Calendar.controller.js @@ -0,0 +1,478 @@ +sap.ui.define( + ["./BaseController", "sap/ui/model/json/JSONModel", "sap/m/MessageBox"], + function (Controller, JSONModel, MessageBox) { + "use strict" + + return Controller.extend("test.Sample.controller.Calendar", { + onInit: function () { + // create model + var oModel = new JSONModel() + oModel.setData({ + startDate: new Date("2017", "0", "15", "8", "0"), + people: [ + { + pic: "sap-icon://employee", + name: "John Miller", + role: "team member", + appointments: [ + { + start: new Date("2017", "0", "8", "08", "30"), + end: new Date("2017", "0", "8", "09", "30"), + title: "Meet Max Mustermann", + type: "Type02", + tentative: false + }, + { + start: new Date("2017", "0", "11", "10", "0"), + end: new Date("2017", "0", "11", "12", "0"), + title: "Team meeting", + info: "room 1", + type: "Type01", + pic: "sap-icon://sap-ui5", + tentative: false + }, + { + start: new Date("2017", "0", "12", "11", "30"), + end: new Date("2017", "0", "12", "13", "30"), + title: "Lunch", + info: "canteen", + type: "Type03", + tentative: true + }, + { + start: new Date("2017", "0", "15", "08", "30"), + end: new Date("2017", "0", "15", "09", "30"), + title: "Meet Max Mustermann", + type: "Type02", + tentative: false + }, + { + start: new Date("2017", "0", "15", "10", "0"), + end: new Date("2017", "0", "15", "12", "0"), + title: "Team meeting", + info: "room 1", + type: "Type01", + pic: "sap-icon://sap-ui5", + tentative: false + }, + { + start: new Date("2017", "0", "15", "11", "30"), + end: new Date("2017", "0", "15", "13", "30"), + title: "Lunch", + info: "canteen", + type: "Type03", + tentative: true + }, + { + start: new Date("2017", "0", "15", "13", "30"), + end: new Date("2017", "0", "15", "17", "30"), + title: "Discussion with clients", + info: "online meeting", + type: "Type02", + tentative: false + }, + { + start: new Date("2017", "0", "16", "04", "00"), + end: new Date("2017", "0", "16", "22", "30"), + title: "Discussion of the plan", + info: "Online meeting", + type: "Type04", + tentative: false + }, + { + start: new Date("2017", "0", "18", "08", "30"), + end: new Date("2017", "0", "18", "09", "30"), + title: "Meeting with the manager", + type: "Type02", + tentative: false + }, + { + start: new Date("2017", "0", "18", "11", "30"), + end: new Date("2017", "0", "18", "13", "30"), + title: "Lunch", + info: "canteen", + type: "Type03", + tentative: true + }, + { + start: new Date("2017", "0", "18", "1", "0"), + end: new Date("2017", "0", "18", "22", "0"), + title: "Team meeting", + info: "regular", + type: "Type01", + pic: "sap-icon://sap-ui5", + tentative: false + }, + { + start: new Date("2017", "0", "21", "00", "30"), + end: new Date("2017", "0", "21", "23", "30"), + title: "New Product", + info: "room 105", + type: "Type03", + tentative: true + }, + { + start: new Date("2017", "0", "25", "11", "30"), + end: new Date("2017", "0", "25", "13", "30"), + title: "Lunch", + type: "Type03", + tentative: true + }, + { + start: new Date("2017", "0", "29", "10", "0"), + end: new Date("2017", "0", "29", "12", "0"), + title: "Team meeting", + info: "room 1", + type: "Type01", + pic: "sap-icon://sap-ui5", + tentative: false + }, + { + start: new Date("2017", "0", "30", "08", "30"), + end: new Date("2017", "0", "30", "09", "30"), + title: "Meet Max Mustermann", + type: "Type02", + tentative: false + }, + { + start: new Date("2017", "0", "30", "10", "0"), + end: new Date("2017", "0", "30", "12", "0"), + title: "Team meeting", + info: "room 1", + type: "Type01", + pic: "sap-icon://sap-ui5", + tentative: false + }, + { + start: new Date("2017", "0", "30", "11", "30"), + end: new Date("2017", "0", "30", "13", "30"), + title: "Lunch", + type: "Type03", + tentative: true + }, + { + start: new Date("2017", "0", "30", "13", "30"), + end: new Date("2017", "0", "30", "17", "30"), + title: "Discussion with clients", + type: "Type02", + tentative: false + }, + { + start: new Date("2017", "0", "31", "10", "00"), + end: new Date("2017", "0", "31", "11", "30"), + title: "Meeting of the day", + info: "Special meeting", + type: "Type04", + tentative: false + }, + { + start: new Date("2017", "1", "3", "08", "30"), + end: new Date("2017", "1", "13", "09", "30"), + title: "Meeting with the manager", + type: "Type02", + tentative: false + }, + { + start: new Date("2017", "1", "4", "10", "0"), + end: new Date("2017", "1", "4", "12", "0"), + title: "Team meeting", + info: "room 1", + type: "Type01", + pic: "sap-icon://sap-ui5", + tentative: false + }, + { + start: new Date("2017", "2", "30", "10", "0"), + end: new Date("2017", "4", "33", "12", "0"), + title: "Working out of the building", + type: "Type07", + pic: "sap-icon://sap-ui5", + tentative: false + } + ], + headers: [ + { + start: new Date("2017", "0", "15", "8", "0"), + end: new Date("2017", "0", "15", "10", "0"), + title: "Reminder", + type: "Type06" + }, + { + start: new Date("2017", "0", "15", "17", "0"), + end: new Date("2017", "0", "15", "19", "0"), + title: "Reminder", + type: "Type06" + }, + { + start: new Date("2017", "8", "1", "0", "0"), + end: new Date("2017", "10", "30", "23", "59"), + title: "New quarter", + type: "Type10", + tentative: false + }, + { + start: new Date("2018", "1", "1", "0", "0"), + end: new Date("2018", "3", "30", "23", "59"), + title: "New quarter", + type: "Type10", + tentative: false + } + ] + }, + { + pic: "sap-icon://employee", + name: "Donna Moore", + role: "team member", + appointments: [ + { + start: new Date("2017", "0", "10", "18", "00"), + end: new Date("2017", "0", "10", "19", "10"), + title: "Meet and greet", + info: "Friends meeting", + type: "Type04", + tentative: false + }, + { + start: new Date("2017", "0", "9", "10", "0"), + end: new Date("2017", "0", "13", "12", "0"), + title: "Workshop out of the country", + type: "Type07", + pic: "sap-icon://sap-ui5", + tentative: false + }, + { + start: new Date("2017", "0", "15", "08", "00"), + end: new Date("2017", "0", "15", "09", "30"), + title: "Meet the plan", + info: "Live meeting", + type: "Type04", + tentative: false + }, + { + start: new Date("2017", "0", "15", "10", "0"), + end: new Date("2017", "0", "15", "12", "0"), + title: "Team meeting", + info: "room 1", + type: "Type01", + pic: "sap-icon://sap-ui5", + tentative: false + }, + { + start: new Date("2017", "0", "15", "18", "00"), + end: new Date("2017", "0", "15", "19", "10"), + title: "Discussion of the plan", + info: "Online meeting", + type: "Type04", + tentative: false + }, + { + start: new Date("2017", "0", "16", "10", "0"), + end: new Date("2017", "0", "31", "12", "0"), + title: "Workshop out of the country", + type: "Type07", + pic: "sap-icon://sap-ui5", + tentative: false + }, + { + start: new Date("2018", "0", "1", "0", "0"), + end: new Date("2018", "2", "31", "23", "59"), + title: "New quarter", + type: "Type10", + tentative: false + }, + { + start: new Date("2017", "01", "11", "10", "0"), + end: new Date("2017", "02", "20", "12", "0"), + title: "Team collaboration", + info: "room 1", + type: "Type01", + pic: "sap-icon://sap-ui5", + tentative: false + }, + { + start: new Date("2017", "3", "01", "10", "0"), + end: new Date("2017", "3", "31", "12", "0"), + title: "Workshop out of the country", + type: "Type07", + pic: "sap-icon://sap-ui5", + tentative: false + }, + { + start: new Date("2017", "4", "01", "10", "0"), + end: new Date("2017", "4", "31", "12", "0"), + title: "Out of the office", + type: "Type08", + tentative: false + }, + { + start: new Date("2017", "7", "1", "0", "0"), + end: new Date("2017", "7", "31", "23", "59"), + title: "Vacation", + info: "out of office", + type: "Type04", + tentative: false + } + ], + headers: [ + { + start: new Date("2017", "0", "15", "9", "0"), + end: new Date("2017", "0", "15", "10", "0"), + title: "Payment reminder", + type: "Type06" + }, + { + start: new Date("2017", "0", "15", "16", "30"), + end: new Date("2017", "0", "15", "18", "00"), + title: "Private appointment", + type: "Type06" + } + ] + }, + { + pic: "sap-icon://employee", + name: "Max Mustermann", + role: "team member", + appointments: [ + { + start: new Date("2017", "0", "15", "08", "30"), + end: new Date("2017", "0", "15", "09", "30"), + title: "Meet John Miller", + type: "Type02", + tentative: false + }, + { + start: new Date("2017", "0", "15", "10", "0"), + end: new Date("2017", "0", "15", "12", "0"), + title: "Team meeting", + info: "room 1", + type: "Type01", + pic: "sap-icon://sap-ui5", + tentative: false + }, + { + start: new Date("2017", "0", "15", "13", "00"), + end: new Date("2017", "0", "15", "16", "00"), + title: "Discussion with clients", + info: "online", + type: "Type02", + tentative: false + }, + { + start: new Date("2017", "0", "16", "0", "0"), + end: new Date("2017", "0", "16", "23", "59"), + title: "Vacation", + info: "out of office", + type: "Type04", + tentative: false + }, + { + start: new Date("2017", "0", "17", "1", "0"), + end: new Date("2017", "0", "18", "22", "0"), + title: "Workshop", + info: "regular", + type: "Type07", + pic: "sap-icon://sap-ui5", + tentative: false + }, + { + start: new Date("2017", "0", "19", "08", "30"), + end: new Date("2017", "0", "19", "18", "30"), + title: "Meet John Doe", + type: "Type02", + tentative: false + }, + { + start: new Date("2017", "0", "19", "10", "0"), + end: new Date("2017", "0", "19", "16", "0"), + title: "Team meeting", + info: "room 1", + type: "Type01", + pic: "sap-icon://sap-ui5", + tentative: false + }, + { + start: new Date("2017", "0", "19", "07", "00"), + end: new Date("2017", "0", "19", "17", "30"), + title: "Discussion with clients", + type: "Type02", + tentative: false + }, + { + start: new Date("2017", "0", "20", "0", "0"), + end: new Date("2017", "0", "20", "23", "59"), + title: "Vacation", + info: "out of office", + type: "Type04", + tentative: false + }, + { + start: new Date("2017", "0", "22", "07", "00"), + end: new Date("2017", "0", "27", "17", "30"), + title: "Discussion with clients", + info: "out of office", + type: "Type02", + tentative: false + }, + { + start: new Date("2017", "2", "13", "9", "0"), + end: new Date("2017", "2", "17", "10", "0"), + title: "Payment week", + type: "Type06" + }, + { + start: new Date("2017", "03", "10", "0", "0"), + end: new Date("2017", "05", "16", "23", "59"), + title: "Vacation", + info: "out of office", + type: "Type04", + tentative: false + }, + { + start: new Date("2017", "07", "1", "0", "0"), + end: new Date("2017", "09", "31", "23", "59"), + title: "New quarter", + type: "Type10", + tentative: false + } + ], + headers: [ + { + start: new Date("2017", "0", "16", "0", "0"), + end: new Date("2017", "0", "16", "23", "59"), + title: "Private", + type: "Type05" + } + ] + } + ] + }) + this.getView().setModel(oModel) + }, + + handleAppointmentSelect: function (oEvent) { + var oAppointment = oEvent.getParameter("appointment"), + sSelected + if (oAppointment) { + sSelected = oAppointment.getSelected() ? "selected" : "deselected" + MessageBox.show( + "'" + + oAppointment.getTitle() + + "' " + + sSelected + + ". \n Selected appointments: " + + this.byId("PC1").getSelectedAppointments().length + ) + } else { + var aAppointments = oEvent.getParameter("appointments") + var sValue = aAppointments.length + " Appointments selected" + MessageBox.show(sValue) + } + }, + + handleSelectionFinish: function (oEvent) { + var aSelectedKeys = oEvent.getSource().getSelectedKeys() + this.byId("PC1").setBuiltInViews(aSelectedKeys) + } + }) + } +) diff --git a/examples/ui5-js-app-esm/webapp/controller/Main.controller.js b/examples/ui5-js-app-esm/webapp/controller/Main.controller.js new file mode 100644 index 00000000..9d442ed4 --- /dev/null +++ b/examples/ui5-js-app-esm/webapp/controller/Main.controller.js @@ -0,0 +1,98 @@ +sap.ui.define( + [ + "test/Sample/controller/BaseController", + "sap/m/MessageToast", + "sap/ui/model/json/JSONModel", + "sap/ui/core/Fragment" + ], + (Controller, MessageToast, JSONModel, Fragment) => { + return Controller.extend("test.Sample.controller.Main", { + onInit() { + this.getOwnerComponent().getModel().read("/Customers('TRAIH')") + + const jData = { + inputValue: "test Input Value !!!", + buttonText: "Don't press me !!! -> binded", + checkbox: false, + barcode: "" + } + // TODO: + // searchValue: "search Value" + + let testModel = new JSONModel(jData) + this.getView().setModel(testModel, "testModel") + + this.initCombobox() + }, + + initCombobox: function () { + // set explored app's demo model on this sample + var oModel = new JSONModel() + oModel.loadData("model/countries.json") + this.getView().setModel(oModel, "Countries") + }, + + navCalendar() { + return this.getOwnerComponent().getRouter().navTo("RouteCalendar") + }, + + navFwd() { + return this.getOwnerComponent().getRouter().navTo("RouteOther") + }, + + onPress(oEvent) { + MessageToast.show(`${oEvent.getSource().getId()} pressed`) + }, + onBoo(oEvent) { + MessageToast.show(`👻`) + }, + onSearch(oEvent) { + this.getView().byId("idSearchResult").setText(oEvent.getSource().getValue()) + }, + onTest(oEvent) { + this.onBoo(oEvent) + }, + onSelect(oEvent) { + const selectedProperty = oEvent.getSource().getProperty("selected") + const selectedParameter = oEvent.getParameter("selected") + MessageToast.show(`selectedProperty: ${selectedProperty} selectedParameter: ${selectedParameter}`) + }, + scanBarcode(oEvent) { + var _self = this + cordova.plugins.barcodeScanner.scan( + function (result) { + // update in model + _self.getView().getModel("testModel").setProperty("/barcode", result.scanCode) + + MessageToast.show( + "We got a barcode\n" + + "Result: " + + result.scanCode + + "\n" + + "Format: " + + result.format + + "\n" + + "Cancelled: " + + result.cancelled + ) + }, + function (error) { + MessageToast.show("Scanning failed: " + error) + } + ) + }, + + async openDialog() { + if (!this.dialog) { + this.dialog = await Fragment.load({ name: "test.Sample.view.Dialog", controller: this }) + this.dialog.setModel(this.getView().getModel("i18n"), "i18n") + } + this.dialog.open() + }, + + close() { + this.dialog.close() + } + }) + } +) diff --git a/examples/ui5-js-app-esm/webapp/controller/Other.controller.js b/examples/ui5-js-app-esm/webapp/controller/Other.controller.js new file mode 100644 index 00000000..a109f150 --- /dev/null +++ b/examples/ui5-js-app-esm/webapp/controller/Other.controller.js @@ -0,0 +1,27 @@ +sap.ui.define( + ["test/Sample/controller/BaseController", "sap/m/MessageToast", "sap/m/StandardListItem"], + function (Controller, MessageToast, StandardListItem) { + "use strict" + + return Controller.extend("test.Sample.controller.Other", { + onInit: function () {}, + + onItemPress(oEvent) { + this.getView().byId("idTextFieldClickResult").setText(oEvent.getParameter("listItem").data("key")) + + MessageToast.show(oEvent.getParameter("listItem").data("key")) + }, + + onAddLineItem(oEvent) { + this.getView() + .byId("PeopleList") + .addItem( + new StandardListItem({ + title: "FirstName LastName", + type: "Navigation" + }) + ) + } + }) + } +) diff --git a/examples/ui5-js-app-esm/webapp/css/style.css b/examples/ui5-js-app-esm/webapp/css/style.css new file mode 100644 index 00000000..7d876b94 --- /dev/null +++ b/examples/ui5-js-app-esm/webapp/css/style.css @@ -0,0 +1 @@ +/* Enter your custom styles here */ diff --git a/examples/ui5-js-app-esm/webapp/i18n/i18n.properties b/examples/ui5-js-app-esm/webapp/i18n/i18n.properties new file mode 100644 index 00000000..0817a112 --- /dev/null +++ b/examples/ui5-js-app-esm/webapp/i18n/i18n.properties @@ -0,0 +1,22 @@ +appTitle=Sample +appDescription=App Description + +### + +startPage.userButton.text=User Test Text +startPage.navButton.text=to Other view +startPage.currentUI5.text=most current UI5 version available +startPage.title.text=UI5 demo +startPage.text.username=Username + +### + +otherPage.title=Another View... +otherPage.listHeader=...bites the dust! + +### + +dialog.title=Here we are! +dialog.text=born to be kings +dialog.close=cut + diff --git a/examples/ui5-js-app-esm/webapp/i18n/i18n_en.properties b/examples/ui5-js-app-esm/webapp/i18n/i18n_en.properties new file mode 100644 index 00000000..49c81d88 --- /dev/null +++ b/examples/ui5-js-app-esm/webapp/i18n/i18n_en.properties @@ -0,0 +1,20 @@ +appTitle=Sample +appDescription=App Description + +### + +startPage.navButton.text=to Other view +startPage.currentUI5.text=most current UI5 version available +startPage.title.text=UI5 demo +startPage.text.username=Username + +### + +otherPage.title=Another View... +otherPage.listHeader=...bites the dust! + +### + +dialog.title=Here we are! +dialog.text=born to be kings +dialog.close=cut \ No newline at end of file diff --git a/examples/ui5-js-app-esm/webapp/index.html b/examples/ui5-js-app-esm/webapp/index.html new file mode 100644 index 00000000..ac141e19 --- /dev/null +++ b/examples/ui5-js-app-esm/webapp/index.html @@ -0,0 +1,29 @@ + + + + + + Sample UI5 Application + + + + + + + +
+ + diff --git a/examples/ui5-js-app-esm/webapp/manifest.json b/examples/ui5-js-app-esm/webapp/manifest.json new file mode 100644 index 00000000..7de344de --- /dev/null +++ b/examples/ui5-js-app-esm/webapp/manifest.json @@ -0,0 +1,141 @@ +{ + "_version": "1.12.0", + "sap.app": { + "id": "test.Sample", + "type": "application", + "i18n": "i18n/i18n.properties", + "applicationVersion": { + "version": "${version}" + }, + "title": "{{appTitle}}", + "description": "{{appDescription}}", + "resources": "resources.json", + "ach": "ach", + "dataSources": { + "BackendDataSource": { + "uri": "/V2/Northwind/Northwind.svc/", + "type": "OData", + "settings": { + "odataVersion": "2.0" + } + }, + "LatestUI5Datasource": { + "uri": "", + "type": "JSON" + } + } + }, + "sap.ui": { + "technology": "UI5", + "icons": { + "icon": "", + "favIcon": "", + "phone": "", + "phone@2": "", + "tablet": "", + "tablet@2": "" + }, + "deviceTypes": { + "desktop": true, + "tablet": true, + "phone": true + } + }, + "sap.ui5": { + "rootView": { + "viewName": "test.Sample.view.App", + "type": "XML", + "async": true, + "id": "app" + }, + "dependencies": { + "minUI5Version": "1.68.1", + "libs": { + "sap.m": {}, + "sap.ui.core": {}, + "sap.ui.layout": {} + } + }, + "contentDensities": { + "compact": true, + "cozy": true + }, + "models": { + "i18n": { + "type": "sap.ui.model.resource.ResourceModel", + "settings": { + "bundleName": "test.Sample.i18n.i18n" + } + }, + "": { + "dataSource": "BackendDataSource", + "settings": { + "useBatch": false, + "autoExpandSelect": true, + "operationMode": "Server", + "groupId": "$direct", + "synchronizationMode": "None" + } + }, + "LatestUI5": { + "type": "sap.ui.model.json.JSONModel", + "dataSource": "LatestUI5Datasource" + } + }, + "routing": { + "config": { + "routerClass": "sap.m.routing.Router", + "viewType": "XML", + "async": true, + "viewPath": "test.Sample.view", + "controlAggregation": "pages", + "controlId": "app" + }, + "routes": [ + { + "name": "RouteMain", + "pattern": "", + "target": ["TargetMain"] + }, + { + "name": "RouteCalendar", + "pattern": "calendar", + "target": ["TargetCalendar"] + }, + { + "name": "RouteMainNamed", + "pattern": "main", + "target": ["TargetMain"] + }, + { + "name": "RouteOther", + "pattern": "other", + "target": ["TargetOther"] + } + ], + "targets": { + "TargetMain": { + "viewType": "XML", + "transition": "slide", + "clearControlAggregation": false, + "viewId": "Main", + "viewName": "Main" + }, + "TargetOther": { + "viewType": "XML", + "transition": "slide", + "clearControlAggregation": false, + "viewId": "Other", + "viewName": "Other" + }, + "TargetCalendar": { + "viewType": "XML", + "transition": "slide", + "clearControlAggregation": false, + "viewId": "Calendar", + "viewName": "Calendar" + } + } + } + } +} diff --git a/examples/ui5-js-app-esm/webapp/model/countries.json b/examples/ui5-js-app-esm/webapp/model/countries.json new file mode 100644 index 00000000..e1741b7c --- /dev/null +++ b/examples/ui5-js-app-esm/webapp/model/countries.json @@ -0,0 +1,36 @@ +{ + "CountriesCollection": [ + { + "key": "DZ", + "text": "Algeria" + }, + { + "key": "AR", + "text": "Argentina" + }, + { + "key": "AU", + "text": "Australia" + }, + { + "key": "AT", + "text": "Austria" + }, + { + "key": "BH", + "text": "Bahrain" + }, + { + "key": "BE", + "text": "Belgium" + }, + { + "key": "BA", + "text": "Bosnia and Herzegovina" + }, + { + "key": "BR", + "text": "Brazil" + } + ] +} diff --git a/examples/ui5-js-app-esm/webapp/model/models.js b/examples/ui5-js-app-esm/webapp/model/models.js new file mode 100644 index 00000000..cf0fa502 --- /dev/null +++ b/examples/ui5-js-app-esm/webapp/model/models.js @@ -0,0 +1,11 @@ +sap.ui.define(["sap/ui/model/json/JSONModel", "sap/ui/Device"], function (JSONModel, Device) { + "use strict" + + return { + createDeviceModel: function () { + var oModel = new JSONModel(Device) + oModel.setDefaultBindingMode("OneWay") + return oModel + } + } +}) diff --git a/examples/ui5-js-app-esm/webapp/proxyrc.json b/examples/ui5-js-app-esm/webapp/proxyrc.json new file mode 100644 index 00000000..82ef5867 --- /dev/null +++ b/examples/ui5-js-app-esm/webapp/proxyrc.json @@ -0,0 +1,7 @@ +{ + "/V2/": { + "target": "https://services.odata.org/V2/", + "secure": false, + "changeOrigin": true + } +} diff --git a/examples/ui5-js-app-esm/webapp/test/e2e/esm.test.js b/examples/ui5-js-app-esm/webapp/test/e2e/esm.test.js new file mode 100644 index 00000000..39153b9e --- /dev/null +++ b/examples/ui5-js-app-esm/webapp/test/e2e/esm.test.js @@ -0,0 +1,30 @@ +import { wdi5 } from "wdio-ui5-service" +import * as sinon from "sinon" + +describe("ui5 basic", () => { + it("should use the ESM style logger", () => { + const logSpy = sinon.spy(console, "log") + const Logger = wdi5.getLogger("esm!") + Logger.log("Hello ESM World!") + expect(logSpy.getCall(0).args[1]).toContain("esm!") + logSpy.restore() + }) + + it("window should have the right title", async () => { + const title = await browser.getTitle() + expect(title).toEqual("Sample UI5 Application") + }) + + it("wdi5 should use a control selector with dots and colons", async () => { + const selector = { + selector: { + id: "Title::NoAction.h1", + viewName: "test.Sample.view.Main" + } + } + const text = await /** @type {import("wdio-ui5-service/esm/lib/wdi5-control.js").WDI5Control} */ ( + await browser.asControl(selector) + ).getText() + expect(text).toEqual("UI5 demo") + }) +}) diff --git a/examples/ui5-js-app-esm/webapp/test/e2e/wdio.conf.js b/examples/ui5-js-app-esm/webapp/test/e2e/wdio.conf.js new file mode 100644 index 00000000..7ebe4841 --- /dev/null +++ b/examples/ui5-js-app-esm/webapp/test/e2e/wdio.conf.js @@ -0,0 +1,27 @@ +export const config = { + wdi5: { + logLevel: "verbose" + }, + baseUrl: "http://localhost:8082/index.html", + + services: ["ui5"], + specs: ["./**/*.test.js"], + maxInstances: 1, + capabilities: [ + { + maxInstances: 1, + browserName: "chrome", + "goog:chromeOptions": { + args: + process.argv.indexOf("--headless") > -1 + ? ["window-size=1440,800", "--headless"] + : ["window-size=1440,800"] + } + } + ], + logLevel: "error", + + reporters: ["spec"], + + framework: "mocha" +} diff --git a/examples/ui5-js-app-esm/webapp/view/App.view.xml b/examples/ui5-js-app-esm/webapp/view/App.view.xml new file mode 100644 index 00000000..2814732b --- /dev/null +++ b/examples/ui5-js-app-esm/webapp/view/App.view.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/examples/ui5-js-app-esm/webapp/view/Calendar.view.xml b/examples/ui5-js-app-esm/webapp/view/Calendar.view.xml new file mode 100644 index 00000000..0388c4a3 --- /dev/null +++ b/examples/ui5-js-app-esm/webapp/view/Calendar.view.xml @@ -0,0 +1,44 @@ + + + + + + + + + </toolbarContent> + <rows> + <PlanningCalendarRow icon="{pic}" title="{name}" text="{role}" appointments="{path : 'appointments', templateShareable: false}" intervalHeaders="{path: 'headers', templateShareable: false}"> + <customData> + <core:CustomData key="emp-name" value="{name}" writeToDom="true"/> + </customData> + <appointments> + <unified:CalendarAppointment startDate="{start}" endDate="{end}" icon="{pic}" title="{title}" text="{info}" type="{type}" tentative="{tentative}"> + </unified:CalendarAppointment> + </appointments> + <intervalHeaders> + <unified:CalendarAppointment startDate="{start}" endDate="{end}" icon="{pic}" title="{title}" type="{type}"> + </unified:CalendarAppointment> + </intervalHeaders> + </PlanningCalendarRow> + </rows> + </PlanningCalendar> + <Label text="Add available built-in views to the example:"/> + <MultiComboBox selectionFinish="handleSelectionFinish" width="230px" placeholder="Choose built-in views"> + <items> + <core:Item key="Hour" text="Hour" /> + <core:Item key="Day" text="Day" /> + <core:Item key="Month" text="Month" /> + <core:Item key="Week" text="1 week" /> + <core:Item key="One Month" text="1 month" /> + </items> + </MultiComboBox> + </VBox> + </content> + </Page> + +</mvc:View> diff --git a/examples/ui5-js-app-esm/webapp/view/Dialog.fragment.xml b/examples/ui5-js-app-esm/webapp/view/Dialog.fragment.xml new file mode 100644 index 00000000..3eaf4820 --- /dev/null +++ b/examples/ui5-js-app-esm/webapp/view/Dialog.fragment.xml @@ -0,0 +1,15 @@ +<core:FragmentDefinition xmlns="sap.m" + xmlns:core="sap.ui.core"> + <Dialog id="Dialog" + title="{i18n>dialog.title}" + type="Message"> + <content> + <Text text="{i18n>dialog.text}" /> + </content> + <endButton> + <Button text="{i18n>dialog.close}" + press="close"></Button> + </endButton> + + </Dialog> +</core:FragmentDefinition> \ No newline at end of file diff --git a/examples/ui5-js-app-esm/webapp/view/Main.view.xml b/examples/ui5-js-app-esm/webapp/view/Main.view.xml new file mode 100644 index 00000000..1210ff60 --- /dev/null +++ b/examples/ui5-js-app-esm/webapp/view/Main.view.xml @@ -0,0 +1,76 @@ +<mvc:View controllerName="test.Sample.controller.Main" + xmlns:core="sap.ui.core" + xmlns:mvc="sap.ui.core.mvc" displayBlock="true" + xmlns="sap.m"> + + <Page id="page" title="{i18n>appTitle}"> + <headerContent> + <core:Icon color="#1873B4" src="sap-icon://sap-ui5" size="2rem" /> + <Text text="{LatestUI5>/latest}" /> + </headerContent> + <content> + <Title level="H1" id="Title::NoAction.h1" titleStyle="H1" text="{i18n>startPage.title.text}" width="100%" textAlign="Center" /> + <HBox> + <VBox alignItems="Center" justifyContent="Center" height="100%"> + + <Button icon="sap-icon://forward" id="NavFwdButton" text="{i18n>startPage.navButton.text}" press="navFwd" /> + <Button icon="sap-icon://forward" id="NavFwdButtonDisabled" text="can't click :(" press="navFwd" busy="true" /> + <Button icon="sap-icon://forward" id="NavCalendarButton" text="Naviagte to Planningcalendar" press="navCalendar" /> + <Button icon="sap-icon://user-edit" id="user-test-button" text="{i18n>startPage.userButton.text}" /> + <Button text="IA Sync" id="idIaSync" press="onPress" /> + <Text text="{i18n>startPage.text.username}" /> + <Input id="mainUserInput" value="{/Customers('TRAIH')/ContactName}" /> + <Panel expandable="true" headerText="Header Text"> + <headerToolbar> + <OverflowToolbar> + <Title text="Custom Toolbar with a header text" /> + </OverflowToolbar> + </headerToolbar> + <content> + <Text text="Lorem ipsum dolor st amet" /> + </content> + </Panel> + <Label labelFor="idDateTime" text="labelFor DateTimePicker" /> + <DateTimePicker id="idDateTime" placeholder="Enter Date ..." /> + <Button text="{testModel>/buttonText}" press="onTest" class="myTestClass" /> + <Input value="{testModel>/inputValue}" /> + <CheckBox id="idCheckbox" selected="{testModel>/checkbox}" text="test checkbox" select="onSelect" /> + <Button text="open Barcodescanner" press="scanBarcode" id="barcodescannerplugin" /> + <Input id="barcodeValue" value="{testModel>/barcode}" /> + <Input id="invisibleInputField" value="bla" visible="false" /> + <Button text="open Dialog" press="openDialog" id="openDialogButton" /> + + </VBox> + <VBox> + <Label text="Country Combobox" /> + <ComboBox id="combobox" items="{ + path: 'Countries>/CountriesCollection', + sorter: { path: 'text' } + }"> + <core:Item key="{Countries>key}" text="{Countries>text}" /> + </ComboBox> + <Label text="Country MultiCombobox" /> + <MultiComboBox id="multiComboBox" items="{ + path: 'Countries>/CountriesCollection', + sorter: { path: 'text' } + }"> + <core:Item key="{Countries>key}" text="{Countries>text}" /> + </MultiComboBox> + <Label text="sap.m.SearchField" /> + + <SearchField id="idSearchfield" value="{testModel>/searchValue}" placeholder="Search..." search="onSearch" /> + <Text id="idSearchResult" text="" /> + + <Label text="sap.m.Select" /> + <Select id="select" items="{ + path: 'Countries>/CountriesCollection', + sorter: { path: 'text' } + }"> + <core:Item key="{Countries>key}" text="{Countries>text}" /> + </Select> + </VBox> + </HBox> + </content> + </Page> + +</mvc:View> diff --git a/examples/ui5-js-app-esm/webapp/view/Other.view.xml b/examples/ui5-js-app-esm/webapp/view/Other.view.xml new file mode 100644 index 00000000..1592fcdf --- /dev/null +++ b/examples/ui5-js-app-esm/webapp/view/Other.view.xml @@ -0,0 +1,44 @@ +<mvc:View controllerName="test.Sample.controller.Other" + xmlns:mvc="sap.ui.core.mvc" + displayBlock="true" + xmlns="sap.m" + xmlns:data="http://schemas.sap.com/sapui5/extension/sap.ui.core.CustomData/1"> + + <Page id="OtherPage" + title="{i18n>otherPage.title}" + showNavButton="true" + navButtonPress="onNavBack"> + <content> + <List id="PeopleList" + headerText="{i18n>otherPage.listHeader}" + items="{/Employees}" + itemPress="onItemPress"> + <StandardListItem title="{FirstName} {LastName}" + type="Navigation" + data:key="{FirstName} {LastName}" /> + </List> + + <VBox id="VBoxx" + class="sapUiMediumMargin"> + <Label text="Pressed List Item Selection" /> + <Text id="idTextFieldClickResult" + text="some text to be replaced by the selection" /> + <Button id="idAddLineItemButton" + text="add Line Item" + press=".onAddLineItem" /> + </VBox> + + <List id="PeopleListSelect" + headerText="People List with CheckBox" + items="{/Employees}"> + <CustomListItem> + <HBox> + <CheckBox + text="{FirstName} {LastName}" + select="onSelect" /> + </HBox> + </CustomListItem> + </List> + </content> + </Page> +</mvc:View> diff --git a/examples/ui5-js-app/webapp/test/e2e/basic.test.js b/examples/ui5-js-app/webapp/test/e2e/basic.test.js index 97ffeb57..968d7562 100644 --- a/examples/ui5-js-app/webapp/test/e2e/basic.test.js +++ b/examples/ui5-js-app/webapp/test/e2e/basic.test.js @@ -34,8 +34,9 @@ describe("ui5 basic", () => { } } - // ui5 - const titleWUi5 = await browser.asControl(selector).getText() + const titleWUi5 = await /** @type {import("wdio-ui5-service/cjs/lib/wdi5-control.js").WDI5Control} */ ( + await browser.asControl(selector) + ).getText() expect(titleWUi5).toEqual("UI5 demo") }) diff --git a/examples/ui5-ts-app/test/e2e/workzone/regular-journey.test.ts b/examples/ui5-ts-app/test/e2e/workzone/regular-journey.test.ts index 9777cb41..774a478a 100644 --- a/examples/ui5-ts-app/test/e2e/workzone/regular-journey.test.ts +++ b/examples/ui5-ts-app/test/e2e/workzone/regular-journey.test.ts @@ -1,6 +1,33 @@ -/* eslint-disable @typescript-eslint/no-empty-function */ -describe.skip("drive in Work Zone with standard wdi5/wdio APIs", () => { - it("should see the List Report page", async () => {}) +import { wdi5 } from "wdio-ui5-service" +describe("drive in Work Zone with standard wdi5/wdio APIs", () => { + it("should click the avatar button in the workzone shell", async () => { + await wdi5.toWorkZoneShell() + await browser + .asControl<sap.m.Avatar>({ + selector: { + id: "userActionsMenuHeaderButton" + } + }) + .press() + const popover = await browser.asControl<sap.m.Popover>({ + selector: { + id: "sapUshellUserActionsMenuPopover", + controlType: "sap.m.Popover", + interaction: "root" + } + }) - it("should see the Object Pages load and then returns to list", async () => {}) + expect(await popover.isOpen()).toBeTruthy() + }) + + it("should find the table in the travel app", async () => { + await wdi5.toWorkZoneApp() + const table = await browser.asControl<sap.ui.mdc.Table>({ + selector: { + id: "sap.fe.cap.travel::TravelList--fe::table::Travel::LineItem" + } + }) + const actions = await table.getActions(true) + expect(actions.length).toBeGreaterThanOrEqual(1) + }) }) diff --git a/examples/ui5-ts-app/test/e2e/workzone/wdio-ui5-workzone.conf.ts b/examples/ui5-ts-app/test/e2e/workzone/wdio-ui5-workzone.conf.ts index d7260910..5fe25008 100644 --- a/examples/ui5-ts-app/test/e2e/workzone/wdio-ui5-workzone.conf.ts +++ b/examples/ui5-ts-app/test/e2e/workzone/wdio-ui5-workzone.conf.ts @@ -7,7 +7,8 @@ process.env.wdi5_password = process.env.wdi5_wz_password export const config: wdi5Config = { wdi5: { btpWorkZoneEnablement: true, - logLevel: "verbose" + logLevel: "verbose", + waitForUI5Timeout: 25000 }, baseUrl: "https://cswdev.launchpad.cfapps.eu10.hana.ondemand.com/site/csw#travel-process", diff --git a/package-lock.json b/package-lock.json index e26d8ed1..80cb3e01 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,47 +12,48 @@ ".", "examples/fe-app", "examples/ui5-js-app", + "examples/ui5-js-app-esm", "examples/ui5-ts-app", "examples/cucumber", "examples/cap-bookshop-wdi5" ], "dependencies": { - "devtools": "^8.15.6", + "devtools": "^8.16.3", "dotenv": "^16.3.1", "semver": "^7.5.4" }, "devDependencies": { "@commitlint/cli": "^17.7.1", "@commitlint/config-conventional": "^17.7.0", - "@sap/approuter": "14.3.0", + "@sap/approuter": "14.3.1", "@sap/ux-ui5-fe-mockserver-middleware": "^1.6.5", "@types/openui5": "^1.117.0", "@types/sinon": "^10.0.16", - "@typescript-eslint/eslint-plugin": "^6.4.1", - "@typescript-eslint/parser": "^6.4.1", + "@typescript-eslint/eslint-plugin": "^6.6.0", + "@typescript-eslint/parser": "^6.6.0", "@ui5/cli": "^3", "@wdio/sauce-service": "^8", "cross-env": "^7.0.3", "deepmerge": "^4.3.1", "docsify-cli": "4.4.4", - "eslint": "^8.47.0", + "eslint": "^8.48.0", "eslint-config-prettier": "^9.0.0", "eslint-plugin-prettier": "^5.0.0", "fs-extra": "^11.1.1", "husky": "^8.0.3", "lint-staged": "^14.0.1", "marky": "^1.2.5", - "mbt": "^1.2.24", + "mbt": "^1.2.25", "mocha": "^10.2.0", "npm-run-all": "^4.1.5", - "prettier": "^3.0.2", + "prettier": "^3.0.3", "replace-in-file": "^7.0.1", "rimraf": "^5.0.1", "sinon": "^15.2.0", "soerver": "^0.0.3", "standard-version": "^9.5.0", "ts-node": "^10.9.1", - "typescript": "^5.1.6", + "typescript": "^5.2.2", "wait-on": "^7.0.1" }, "engines": { @@ -156,6 +157,25 @@ "wdio-ui5-service": "*" } }, + "examples/ui5-js-app-esm": { + "name": "ui5-app-esm", + "version": "0.8.15-notimportant", + "license": "UNLICENSED", + "dependencies": { + "@wdio/sauce-service": "^8" + }, + "devDependencies": { + "@types/sinon": "^10.0.16", + "@ui5/cli": "^3", + "@wdio/cli": "^8", + "@wdio/local-runner": "^8", + "@wdio/mocha-framework": "^8", + "@wdio/spec-reporter": "^8", + "sinon": "^15.2.0", + "ui5-middleware-simpleproxy": "latest", + "wdio-ui5-service": "*" + } + }, "examples/ui5-ts-app": { "version": "0.8.15-notimportant", "license": "Apache-2.0", @@ -4057,73 +4077,6 @@ "xml-js": "1.6.11" } }, - "node_modules/@sap-ux/fe-fpm-writer": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@sap-ux/fe-fpm-writer/-/fe-fpm-writer-0.23.0.tgz", - "integrity": "sha512-zVs48ufHW3bKbHqRir4RNB2XxQzvJSyEjpUqUQNloEPM291kJPiLkRQdloFA6P+pJ+VGZo/uJF284RQCNtrVOA==", - "dev": true, - "dependencies": { - "@xmldom/xmldom": "0.8.6", - "ejs": "3.1.7", - "mem-fs": "2.1.0", - "mem-fs-editor": "9.4.0", - "semver": "7.5.3", - "xml-formatter": "2.6.1", - "xpath": "0.0.32" - }, - "engines": { - "node": ">= 14.16.0 < 15.0.0 || >=16.1.0 < 17.0.0 || >=18.0.0 < 19.0.0", - "pnpm": ">=6.26.1 < 7.0.0 || >=7.1.0" - } - }, - "node_modules/@sap-ux/fe-fpm-writer/node_modules/ejs": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.7.tgz", - "integrity": "sha512-BIar7R6abbUxDA3bfXrO4DSgwo8I+fB5/1zgujl3HLLjwd6+9iOnrT+t3grn2qbk9vOgBubXOFwX2m9axoFaGw==", - "dev": true, - "dependencies": { - "jake": "^10.8.5" - }, - "bin": { - "ejs": "bin/cli.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@sap-ux/fe-fpm-writer/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@sap-ux/fe-fpm-writer/node_modules/semver": { - "version": "7.5.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", - "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@sap-ux/fe-fpm-writer/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, "node_modules/@sap-ux/fe-mockserver-core": { "version": "1.1.117", "resolved": "https://registry.npmjs.org/@sap-ux/fe-mockserver-core/-/fe-mockserver-core-1.1.117.tgz", @@ -4252,9 +4205,9 @@ } }, "node_modules/@sap/approuter": { - "version": "14.3.0", - "resolved": "https://registry.npmjs.org/@sap/approuter/-/approuter-14.3.0.tgz", - "integrity": "sha512-W2atSrNCaMJU0fT3hKULGkgkdbwaAMugzQy4ggtu1p0drVz4eWEMm6tYfqhAgljwK2qfzWHHIWq/Tj4Blyc1VQ==", + "version": "14.3.1", + "resolved": "https://registry.npmjs.org/@sap/approuter/-/approuter-14.3.1.tgz", + "integrity": "sha512-Ax9U8MmF0guUgzZQrZ16iJZJqmy/e2EhXVQ3+7IS3ol9SXmNk7L60hgh8llxo7yd373VndAxrRWegnjER9a/3w==", "dev": true, "dependencies": { "@sap/audit-logging": "5.6.3", @@ -8060,6 +8013,7 @@ "version": "1.17.11", "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.11.tgz", "integrity": "sha512-HC8G7c1WmaF2ekqpnFq626xd3Zz0uvaqFmBJNRZCGEZCXkvSdJoNFn/8Ygbd9fKNQj8UzLdCETaI0UWPAjK7IA==", + "dev": true, "dependencies": { "@types/node": "*" } @@ -8114,12 +8068,6 @@ "integrity": "sha512-trNJ/vtMZYMLhfN45uLq4ShQSw0/S7xCTLLVM+WM1rmFpba/VS42jVUgaO3w/NOLiWR/09lnYk0yMaA/atdIsg==", "dev": true }, - "node_modules/@types/minimatch": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", - "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", - "dev": true - }, "node_modules/@types/minimist": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", @@ -15662,7 +15610,7 @@ "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "node_modules/@wdio/cli/node_modules/execa/node_modules/get-stream": { + "node_modules/@wdio/cli/node_modules/get-stream": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", @@ -15673,30 +15621,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@wdio/cli/node_modules/got": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/got/-/got-13.0.0.tgz", - "integrity": "sha512-XfBk1CxOOScDcMr9O1yKkNaQyy865NbYs+F7dr4H0LZMVgCj2Le59k6PqbNHoL5ToeaEQUYh6c6yMfVcc6SJxA==", - "dependencies": { - "@sindresorhus/is": "^5.2.0", - "@szmarczak/http-timer": "^5.0.1", - "cacheable-lookup": "^7.0.0", - "cacheable-request": "^10.2.8", - "decompress-response": "^6.0.0", - "form-data-encoder": "^2.1.2", - "get-stream": "^6.0.1", - "http2-wrapper": "^2.1.10", - "lowercase-keys": "^3.0.0", - "p-cancelable": "^3.0.0", - "responselike": "^3.0.0" - }, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sindresorhus/got?sponsor=1" - } - }, "node_modules/@wdio/cli/node_modules/human-signals": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", @@ -15705,17 +15629,6 @@ "node": ">=16.17.0" } }, - "node_modules/@wdio/cli/node_modules/is-plain-obj": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", - "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/@wdio/cli/node_modules/is-stream": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", @@ -15807,113 +15720,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@wdio/cli/node_modules/puppeteer-core": { - "version": "20.9.0", - "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-20.9.0.tgz", - "integrity": "sha512-H9fYZQzMTRrkboEfPmf7m3CLDN6JvbxXA3qTtS+dFt27tR+CsFHzPsT6pzp6lYL6bJbAPaR0HaPO6uSi+F94Pg==", - "dependencies": { - "@puppeteer/browsers": "1.4.6", - "chromium-bidi": "0.4.16", - "cross-fetch": "4.0.0", - "debug": "4.3.4", - "devtools-protocol": "0.0.1147663", - "ws": "8.13.0" - }, - "engines": { - "node": ">=16.3.0" - }, - "peerDependencies": { - "typescript": ">= 4.7.4" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@wdio/cli/node_modules/puppeteer-core/node_modules/@puppeteer/browsers": { - "version": "1.4.6", - "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-1.4.6.tgz", - "integrity": "sha512-x4BEjr2SjOPowNeiguzjozQbsc6h437ovD/wu+JpaenxVLm3jkgzHY2xOslMTp50HoTvQreMjiexiGQw1sqZlQ==", - "dependencies": { - "debug": "4.3.4", - "extract-zip": "2.0.1", - "progress": "2.0.3", - "proxy-agent": "6.3.0", - "tar-fs": "3.0.4", - "unbzip2-stream": "1.4.3", - "yargs": "17.7.1" - }, - "bin": { - "browsers": "lib/cjs/main-cli.js" - }, - "engines": { - "node": ">=16.3.0" - }, - "peerDependencies": { - "typescript": ">= 4.7.4" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@wdio/cli/node_modules/puppeteer-core/node_modules/devtools-protocol": { - "version": "0.0.1147663", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1147663.tgz", - "integrity": "sha512-hyWmRrexdhbZ1tcJUGpO95ivbRhWXz++F4Ko+n21AY5PNln2ovoJw+8ZMNDTtip+CNFQfrtLVh/w4009dXO/eQ==" - }, - "node_modules/@wdio/cli/node_modules/puppeteer-core/node_modules/ws": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", - "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/@wdio/cli/node_modules/puppeteer-core/node_modules/yargs": { - "version": "17.7.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz", - "integrity": "sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==", - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@wdio/cli/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/@wdio/cli/node_modules/signal-exit": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", @@ -16033,1232 +15839,7 @@ } } }, - "node_modules/@wdio/cli/node_modules/ws": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.14.0.tgz", - "integrity": "sha512-WR0RJE9Ehsio6U4TuM+LmunEsjQ5ncHlw4sn9ihD6RoJKZrVyH9FWV3dmnwu8B2aNib1OvG2X6adUCyFpQyWcg==", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/@wdio/cli/node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "engines": { - "node": ">=12" - } - }, - "node_modules/@wdio/cli/node_modules/zip-stream": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-5.0.1.tgz", - "integrity": "sha512-UfZ0oa0C8LI58wJ+moL46BDIMgCQbnsb+2PoiJYtonhBsMh2bq1eRBVkvjfVsqbEHd9/EgKPUuL9saSSsec8OA==", - "dependencies": { - "archiver-utils": "^4.0.1", - "compress-commons": "^5.0.1", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">= 12.0.0" - } - }, - "node_modules/@wdio/config": { - "version": "8.16.3", - "resolved": "https://registry.npmjs.org/@wdio/config/-/config-8.16.3.tgz", - "integrity": "sha512-jSiv+lG/hHmVz933oXw+7rI51wGQSsxpxZTOjSylrQz6pngUrB/RxApPSX4VLPZfKxkucxHQ4PO5nuJ8satusg==", - "dependencies": { - "@wdio/logger": "8.11.0", - "@wdio/types": "8.16.3", - "@wdio/utils": "8.16.3", - "decamelize": "^6.0.0", - "deepmerge-ts": "^5.0.0", - "glob": "^10.2.2", - "import-meta-resolve": "^3.0.0", - "read-pkg-up": "^10.0.0" - }, - "engines": { - "node": "^16.13 || >=18" - } - }, - "node_modules/@wdio/cucumber-framework": { - "version": "8.16.4", - "resolved": "https://registry.npmjs.org/@wdio/cucumber-framework/-/cucumber-framework-8.16.4.tgz", - "integrity": "sha512-7Xi8GqvOq/CC/iKpkLxGTxfm6hUWxkXHLql9vKefqvzgL85QJhy2/zOOia3m0OgV3tQJ3ZzlwteYgw7+fpFoAg==", - "dev": true, - "dependencies": { - "@cucumber/cucumber": "9.4.0", - "@cucumber/gherkin": "26.2.0", - "@cucumber/messages": "22.0.0", - "@cucumber/tag-expressions": "5.0.6", - "@types/node": "^20.1.0", - "@wdio/logger": "8.11.0", - "@wdio/types": "8.16.3", - "@wdio/utils": "8.16.3", - "glob": "^10.2.2", - "is-glob": "^4.0.0" - }, - "engines": { - "node": "^16.13 || >=18" - } - }, - "node_modules/@wdio/globals": { - "version": "8.16.4", - "resolved": "https://registry.npmjs.org/@wdio/globals/-/globals-8.16.4.tgz", - "integrity": "sha512-Ia+59jZ+ZonrdZk/Vk98m7AEHZWUZBoJtRwOx5IPXeWCSdi+Sz2+lQzEzSGWJv+iYxsI7qI5Lyv66Th4e5SiLg==", - "engines": { - "node": "^16.13 || >=18" - }, - "optionalDependencies": { - "expect-webdriverio": "^4.2.5", - "webdriverio": "8.16.4" - } - }, - "node_modules/@wdio/globals/node_modules/@wdio/config": { - "version": "8.16.3", - "resolved": "https://registry.npmjs.org/@wdio/config/-/config-8.16.3.tgz", - "integrity": "sha512-jSiv+lG/hHmVz933oXw+7rI51wGQSsxpxZTOjSylrQz6pngUrB/RxApPSX4VLPZfKxkucxHQ4PO5nuJ8satusg==", - "optional": true, - "peer": true, - "dependencies": { - "@wdio/logger": "8.11.0", - "@wdio/types": "8.16.3", - "@wdio/utils": "8.16.3", - "decamelize": "^6.0.0", - "deepmerge-ts": "^5.0.0", - "glob": "^10.2.2", - "import-meta-resolve": "^3.0.0", - "read-pkg-up": "^10.0.0" - }, - "engines": { - "node": "^16.13 || >=18" - } - }, - "node_modules/@wdio/globals/node_modules/@wdio/types": { - "version": "8.16.3", - "resolved": "https://registry.npmjs.org/@wdio/types/-/types-8.16.3.tgz", - "integrity": "sha512-cH6eKNKkx5ZVJxf7omwtqt88N/mI8Hn2qnXe4DHIYNC4wSDFPhSsuurRhH7s7fnk3biLEQfinuc3cxV0HefSVw==", - "optional": true, - "peer": true, - "dependencies": { - "@types/node": "^20.1.0" - }, - "engines": { - "node": "^16.13 || >=18" - } - }, - "node_modules/@wdio/globals/node_modules/@wdio/utils": { - "version": "8.16.3", - "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-8.16.3.tgz", - "integrity": "sha512-bX/sYOM+tI4hjMIcvSdL522c2xwkas6pII6AUhuBT2UIUkJnp7+OHijJ1l5kHAzRewCdcL3W4dm9exPH2URU+Q==", - "optional": true, - "peer": true, - "dependencies": { - "@puppeteer/browsers": "^1.6.0", - "@wdio/logger": "8.11.0", - "@wdio/types": "8.16.3", - "decamelize": "^6.0.0", - "deepmerge-ts": "^5.1.0", - "edgedriver": "^5.3.5", - "geckodriver": "^4.2.0", - "get-port": "^7.0.0", - "got": "^13.0.0", - "import-meta-resolve": "^3.0.0", - "locate-app": "^2.1.0", - "safaridriver": "^0.1.0", - "wait-port": "^1.0.4" - }, - "engines": { - "node": "^16.13 || >=18" - } - }, - "node_modules/@wdio/globals/node_modules/@wdio/utils/node_modules/got": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/got/-/got-13.0.0.tgz", - "integrity": "sha512-XfBk1CxOOScDcMr9O1yKkNaQyy865NbYs+F7dr4H0LZMVgCj2Le59k6PqbNHoL5ToeaEQUYh6c6yMfVcc6SJxA==", - "optional": true, - "peer": true, - "dependencies": { - "@sindresorhus/is": "^5.2.0", - "@szmarczak/http-timer": "^5.0.1", - "cacheable-lookup": "^7.0.0", - "cacheable-request": "^10.2.8", - "decompress-response": "^6.0.0", - "form-data-encoder": "^2.1.2", - "get-stream": "^6.0.1", - "http2-wrapper": "^2.1.10", - "lowercase-keys": "^3.0.0", - "p-cancelable": "^3.0.0", - "responselike": "^3.0.0" - }, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sindresorhus/got?sponsor=1" - } - }, - "node_modules/@wdio/globals/node_modules/archiver": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/archiver/-/archiver-6.0.1.tgz", - "integrity": "sha512-CXGy4poOLBKptiZH//VlWdFuUC1RESbdZjGjILwBuZ73P7WkAUN0htfSfBq/7k6FRFlpu7bg4JOkj1vU9G6jcQ==", - "optional": true, - "peer": true, - "dependencies": { - "archiver-utils": "^4.0.1", - "async": "^3.2.4", - "buffer-crc32": "^0.2.1", - "readable-stream": "^3.6.0", - "readdir-glob": "^1.1.2", - "tar-stream": "^3.0.0", - "zip-stream": "^5.0.1" - }, - "engines": { - "node": ">= 12.0.0" - } - }, - "node_modules/@wdio/globals/node_modules/archiver-utils": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-4.0.1.tgz", - "integrity": "sha512-Q4Q99idbvzmgCTEAAhi32BkOyq8iVI5EwdO0PmBDSGIzzjYNdcFn7Q7k3OzbLy4kLUPXfJtG6fO2RjftXbobBg==", - "optional": true, - "peer": true, - "dependencies": { - "glob": "^8.0.0", - "graceful-fs": "^4.2.0", - "lazystream": "^1.0.0", - "lodash": "^4.17.15", - "normalize-path": "^3.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">= 12.0.0" - } - }, - "node_modules/@wdio/globals/node_modules/archiver-utils/node_modules/glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "optional": true, - "peer": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@wdio/globals/node_modules/archiver-utils/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "optional": true, - "peer": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@wdio/globals/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "optional": true, - "peer": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@wdio/globals/node_modules/chromium-bidi": { - "version": "0.4.16", - "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.4.16.tgz", - "integrity": "sha512-7ZbXdWERxRxSwo3txsBjjmc/NLxqb1Bk30mRb0BMS4YIaiV6zvKZqL/UAH+DdqcDYayDWk2n/y8klkBDODrPvA==", - "optional": true, - "peer": true, - "dependencies": { - "mitt": "3.0.0" - }, - "peerDependencies": { - "devtools-protocol": "*" - } - }, - "node_modules/@wdio/globals/node_modules/compress-commons": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-5.0.1.tgz", - "integrity": "sha512-MPh//1cERdLtqwO3pOFLeXtpuai0Y2WCd5AhtKxznqM7WtaMYaOEMSgn45d9D10sIHSfIKE603HlOp8OPGrvag==", - "optional": true, - "peer": true, - "dependencies": { - "crc-32": "^1.2.0", - "crc32-stream": "^5.0.0", - "normalize-path": "^3.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">= 12.0.0" - } - }, - "node_modules/@wdio/globals/node_modules/crc32-stream": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-5.0.0.tgz", - "integrity": "sha512-B0EPa1UK+qnpBZpG+7FgPCu0J2ETLpXq09o9BkLkEAhdB6Z61Qo4pJ3JYu0c+Qi+/SAL7QThqnzS06pmSSyZaw==", - "optional": true, - "peer": true, - "dependencies": { - "crc-32": "^1.2.0", - "readable-stream": "^3.4.0" - }, - "engines": { - "node": ">= 12.0.0" - } - }, - "node_modules/@wdio/globals/node_modules/cross-fetch": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz", - "integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==", - "optional": true, - "peer": true, - "dependencies": { - "node-fetch": "^2.6.12" - } - }, - "node_modules/@wdio/globals/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "optional": true, - "peer": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@wdio/globals/node_modules/devtools-protocol": { - "version": "0.0.1188743", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1188743.tgz", - "integrity": "sha512-FZDQC58vLiGR2mjSgsMzU8aEJieovMonIyxf38b775eYdIfAYgSzyAWnDf0Eq6ouF/L9qcbqR8jcQeIC34jp/w==", - "optional": true, - "peer": true - }, - "node_modules/@wdio/globals/node_modules/is-plain-obj": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", - "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", - "optional": true, - "peer": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@wdio/globals/node_modules/ky": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ky/-/ky-1.0.1.tgz", - "integrity": "sha512-UvcwpQO0LOuZwG0Ti3VDo6w57KYt+r4bWEYlNaMt82hgyFtse86QtOGum1RzsZni31FndXQl6NvtDArfunt2JQ==", - "optional": true, - "peer": true, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sindresorhus/ky?sponsor=1" - } - }, - "node_modules/@wdio/globals/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", - "optional": true, - "peer": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@wdio/globals/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "optional": true, - "peer": true - }, - "node_modules/@wdio/globals/node_modules/puppeteer-core": { - "version": "20.9.0", - "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-20.9.0.tgz", - "integrity": "sha512-H9fYZQzMTRrkboEfPmf7m3CLDN6JvbxXA3qTtS+dFt27tR+CsFHzPsT6pzp6lYL6bJbAPaR0HaPO6uSi+F94Pg==", - "optional": true, - "peer": true, - "dependencies": { - "@puppeteer/browsers": "1.4.6", - "chromium-bidi": "0.4.16", - "cross-fetch": "4.0.0", - "debug": "4.3.4", - "devtools-protocol": "0.0.1147663", - "ws": "8.13.0" - }, - "engines": { - "node": ">=16.3.0" - }, - "peerDependencies": { - "typescript": ">= 4.7.4" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@wdio/globals/node_modules/puppeteer-core/node_modules/@puppeteer/browsers": { - "version": "1.4.6", - "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-1.4.6.tgz", - "integrity": "sha512-x4BEjr2SjOPowNeiguzjozQbsc6h437ovD/wu+JpaenxVLm3jkgzHY2xOslMTp50HoTvQreMjiexiGQw1sqZlQ==", - "optional": true, - "peer": true, - "dependencies": { - "debug": "4.3.4", - "extract-zip": "2.0.1", - "progress": "2.0.3", - "proxy-agent": "6.3.0", - "tar-fs": "3.0.4", - "unbzip2-stream": "1.4.3", - "yargs": "17.7.1" - }, - "bin": { - "browsers": "lib/cjs/main-cli.js" - }, - "engines": { - "node": ">=16.3.0" - }, - "peerDependencies": { - "typescript": ">= 4.7.4" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@wdio/globals/node_modules/puppeteer-core/node_modules/devtools-protocol": { - "version": "0.0.1147663", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1147663.tgz", - "integrity": "sha512-hyWmRrexdhbZ1tcJUGpO95ivbRhWXz++F4Ko+n21AY5PNln2ovoJw+8ZMNDTtip+CNFQfrtLVh/w4009dXO/eQ==", - "optional": true, - "peer": true - }, - "node_modules/@wdio/globals/node_modules/puppeteer-core/node_modules/ws": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", - "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", - "optional": true, - "peer": true, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/@wdio/globals/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "optional": true, - "peer": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/@wdio/globals/node_modules/tar-stream": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.6.tgz", - "integrity": "sha512-B/UyjYwPpMBv+PaFSWAmtYjwdrlEaZQEhMIBFNC5oEG8lpiW8XjcSdmEaClj28ArfKScKHs2nshz3k2le6crsg==", - "optional": true, - "peer": true, - "dependencies": { - "b4a": "^1.6.4", - "fast-fifo": "^1.2.0", - "streamx": "^2.15.0" - } - }, - "node_modules/@wdio/globals/node_modules/webdriver": { - "version": "8.16.4", - "resolved": "https://registry.npmjs.org/webdriver/-/webdriver-8.16.4.tgz", - "integrity": "sha512-iL8yt6JrH6GqWCMyyZ8/4UMH1Pkez0VCYtkF5Fwwy6gLbP7q4iOVIFjKXP6Cg5gA2aoJvf9TLZ4cFbGOvsZXCw==", - "optional": true, - "peer": true, - "dependencies": { - "@types/node": "^20.1.0", - "@types/ws": "^8.5.3", - "@wdio/config": "8.16.3", - "@wdio/logger": "8.11.0", - "@wdio/protocols": "8.14.6", - "@wdio/types": "8.16.3", - "@wdio/utils": "8.16.3", - "deepmerge-ts": "^5.1.0", - "got": "^ 12.6.1", - "ky": "^1.0.0", - "ws": "^8.8.0" - }, - "engines": { - "node": "^16.13 || >=18" - } - }, - "node_modules/@wdio/globals/node_modules/webdriverio": { - "version": "8.16.4", - "resolved": "https://registry.npmjs.org/webdriverio/-/webdriverio-8.16.4.tgz", - "integrity": "sha512-gt1f7qlfGzx8kKvGBxeOtYqbxYAi929fIFNnE4nDDxOzBL6Pd2ctStiqMjxeCOsZ5Z5sDDKw//P6FSRYnhNiaA==", - "optional": true, - "peer": true, - "dependencies": { - "@types/node": "^20.1.0", - "@wdio/config": "8.16.3", - "@wdio/logger": "8.11.0", - "@wdio/protocols": "8.14.6", - "@wdio/repl": "8.10.1", - "@wdio/types": "8.16.3", - "@wdio/utils": "8.16.3", - "archiver": "^6.0.0", - "aria-query": "^5.0.0", - "css-shorthand-properties": "^1.1.1", - "css-value": "^0.0.1", - "devtools-protocol": "^0.0.1188743", - "grapheme-splitter": "^1.0.2", - "import-meta-resolve": "^3.0.0", - "is-plain-obj": "^4.1.0", - "lodash.clonedeep": "^4.5.0", - "lodash.zip": "^4.2.0", - "minimatch": "^9.0.0", - "puppeteer-core": "^20.9.0", - "query-selector-shadow-dom": "^1.0.0", - "resq": "^1.9.1", - "rgb2hex": "0.2.5", - "serialize-error": "^11.0.1", - "webdriver": "8.16.4" - }, - "engines": { - "node": "^16.13 || >=18" - }, - "peerDependencies": { - "devtools": "^8.14.0" - }, - "peerDependenciesMeta": { - "devtools": { - "optional": true - } - } - }, - "node_modules/@wdio/globals/node_modules/ws": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.14.0.tgz", - "integrity": "sha512-WR0RJE9Ehsio6U4TuM+LmunEsjQ5ncHlw4sn9ihD6RoJKZrVyH9FWV3dmnwu8B2aNib1OvG2X6adUCyFpQyWcg==", - "optional": true, - "peer": true, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/@wdio/globals/node_modules/yargs": { - "version": "17.7.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz", - "integrity": "sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==", - "optional": true, - "peer": true, - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@wdio/globals/node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "optional": true, - "peer": true, - "engines": { - "node": ">=12" - } - }, - "node_modules/@wdio/globals/node_modules/zip-stream": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-5.0.1.tgz", - "integrity": "sha512-UfZ0oa0C8LI58wJ+moL46BDIMgCQbnsb+2PoiJYtonhBsMh2bq1eRBVkvjfVsqbEHd9/EgKPUuL9saSSsec8OA==", - "optional": true, - "peer": true, - "dependencies": { - "archiver-utils": "^4.0.1", - "compress-commons": "^5.0.1", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">= 12.0.0" - } - }, - "node_modules/@wdio/local-runner": { - "version": "8.16.4", - "resolved": "https://registry.npmjs.org/@wdio/local-runner/-/local-runner-8.16.4.tgz", - "integrity": "sha512-lIEcS6RDwGL4JyxOUdt9y2bKhJS7jMX1bdxfKSt9HUhZsBK0deoFMrMqtwRoF8HsKLt58gfHu2ADi3rES0wUNA==", - "dependencies": { - "@types/node": "^20.1.0", - "@wdio/logger": "8.11.0", - "@wdio/repl": "8.10.1", - "@wdio/runner": "8.16.4", - "@wdio/types": "8.16.3", - "async-exit-hook": "^2.0.1", - "split2": "^4.1.0", - "stream-buffers": "^3.0.2" - }, - "engines": { - "node": "^16.13 || >=18" - } - }, - "node_modules/@wdio/local-runner/node_modules/@wdio/types": { - "version": "8.16.3", - "resolved": "https://registry.npmjs.org/@wdio/types/-/types-8.16.3.tgz", - "integrity": "sha512-cH6eKNKkx5ZVJxf7omwtqt88N/mI8Hn2qnXe4DHIYNC4wSDFPhSsuurRhH7s7fnk3biLEQfinuc3cxV0HefSVw==", - "dependencies": { - "@types/node": "^20.1.0" - }, - "engines": { - "node": "^16.13 || >=18" - } - }, - "node_modules/@wdio/logger": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-8.11.0.tgz", - "integrity": "sha512-IsuKSaYi7NKEdgA57h8muzlN/MVp1dQG+V4C//7g4m03YJUnNQLvDhJzLjdeNTfvZy61U7foQSyt+3ktNzZkXA==", - "dependencies": { - "chalk": "^5.1.2", - "loglevel": "^1.6.0", - "loglevel-plugin-prefix": "^0.8.4", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": "^16.13 || >=18" - } - }, - "node_modules/@wdio/logger/node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@wdio/mocha-framework": { - "version": "8.16.3", - "resolved": "https://registry.npmjs.org/@wdio/mocha-framework/-/mocha-framework-8.16.3.tgz", - "integrity": "sha512-aORPOQPiSQ5g26BSbaQkfO3MQUlpa99ZByc4tZPvQl84/Do0rvCP3JWfE4Db1YehStVKpisGwK7fUA6fpWkFQA==", - "dependencies": { - "@types/mocha": "^10.0.0", - "@types/node": "^20.1.0", - "@wdio/logger": "8.11.0", - "@wdio/types": "8.16.3", - "@wdio/utils": "8.16.3", - "mocha": "^10.0.0" - }, - "engines": { - "node": "^16.13 || >=18" - } - }, - "node_modules/@wdio/mocha-framework/node_modules/@wdio/types": { - "version": "8.16.3", - "resolved": "https://registry.npmjs.org/@wdio/types/-/types-8.16.3.tgz", - "integrity": "sha512-cH6eKNKkx5ZVJxf7omwtqt88N/mI8Hn2qnXe4DHIYNC4wSDFPhSsuurRhH7s7fnk3biLEQfinuc3cxV0HefSVw==", - "dependencies": { - "@types/node": "^20.1.0" - }, - "engines": { - "node": "^16.13 || >=18" - } - }, - "node_modules/@wdio/mocha-framework/node_modules/@wdio/utils": { - "version": "8.16.3", - "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-8.16.3.tgz", - "integrity": "sha512-bX/sYOM+tI4hjMIcvSdL522c2xwkas6pII6AUhuBT2UIUkJnp7+OHijJ1l5kHAzRewCdcL3W4dm9exPH2URU+Q==", - "dependencies": { - "@puppeteer/browsers": "^1.6.0", - "@wdio/logger": "8.11.0", - "@wdio/types": "8.16.3", - "decamelize": "^6.0.0", - "deepmerge-ts": "^5.1.0", - "edgedriver": "^5.3.5", - "geckodriver": "^4.2.0", - "get-port": "^7.0.0", - "got": "^13.0.0", - "import-meta-resolve": "^3.0.0", - "locate-app": "^2.1.0", - "safaridriver": "^0.1.0", - "wait-port": "^1.0.4" - }, - "engines": { - "node": "^16.13 || >=18" - } - }, - "node_modules/@wdio/mocha-framework/node_modules/got": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/got/-/got-13.0.0.tgz", - "integrity": "sha512-XfBk1CxOOScDcMr9O1yKkNaQyy865NbYs+F7dr4H0LZMVgCj2Le59k6PqbNHoL5ToeaEQUYh6c6yMfVcc6SJxA==", - "dependencies": { - "@sindresorhus/is": "^5.2.0", - "@szmarczak/http-timer": "^5.0.1", - "cacheable-lookup": "^7.0.0", - "cacheable-request": "^10.2.8", - "decompress-response": "^6.0.0", - "form-data-encoder": "^2.1.2", - "get-stream": "^6.0.1", - "http2-wrapper": "^2.1.10", - "lowercase-keys": "^3.0.0", - "p-cancelable": "^3.0.0", - "responselike": "^3.0.0" - }, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sindresorhus/got?sponsor=1" - } - }, - "node_modules/@wdio/protocols": { - "version": "8.14.6", - "resolved": "https://registry.npmjs.org/@wdio/protocols/-/protocols-8.14.6.tgz", - "integrity": "sha512-KM2taEMUDEt1of0Na/6kIv/aNzX0pmr0etpKRci4QrWPQ1O11dXxWjkatFILQz6qOVKvQ0v+vkTPQRUllmH+uQ==" - }, - "node_modules/@wdio/repl": { - "version": "8.10.1", - "resolved": "https://registry.npmjs.org/@wdio/repl/-/repl-8.10.1.tgz", - "integrity": "sha512-VZ1WFHTNKjR8Ga97TtV2SZM6fvRjWbYI2i/f4pJB4PtusorKvONAMJf2LQcUBIyzbVobqr7KSrcjmSwRolI+yw==", - "dependencies": { - "@types/node": "^20.1.0" - }, - "engines": { - "node": "^16.13 || >=18" - } - }, - "node_modules/@wdio/reporter": { - "version": "8.15.6", - "resolved": "https://registry.npmjs.org/@wdio/reporter/-/reporter-8.15.6.tgz", - "integrity": "sha512-0gxFIdg9EeFijbsQDJW1WVnZxeNprRP+PCkZxZjdkHjX8II9rsYF7XpMdhAWaebqwNLWcZI3/xB9zOTeLgjaFg==", - "dev": true, - "dependencies": { - "@types/node": "^20.1.0", - "@wdio/logger": "8.11.0", - "@wdio/types": "8.16.3", - "diff": "^5.0.0", - "object-inspect": "^1.12.0" - }, - "engines": { - "node": "^16.13 || >=18" - } - }, - "node_modules/@wdio/runner": { - "version": "8.16.4", - "resolved": "https://registry.npmjs.org/@wdio/runner/-/runner-8.16.4.tgz", - "integrity": "sha512-sIVLAU+BRuBYQDbLpP5M80rvbiYdvJU7OREz5AMTOAwdJRaq9SXBX6IW01bxTYn7O10f/ajYU4pn1LYUaPrKlw==", - "dependencies": { - "@types/node": "^20.1.0", - "@wdio/config": "8.16.3", - "@wdio/globals": "8.16.4", - "@wdio/logger": "8.11.0", - "@wdio/types": "8.16.3", - "@wdio/utils": "8.16.3", - "deepmerge-ts": "^5.0.0", - "expect-webdriverio": "^4.2.5", - "gaze": "^1.1.2", - "webdriver": "8.16.4", - "webdriverio": "8.16.4" - }, - "engines": { - "node": "^16.13 || >=18" - } - }, - "node_modules/@wdio/runner/node_modules/@wdio/config": { - "version": "8.16.3", - "resolved": "https://registry.npmjs.org/@wdio/config/-/config-8.16.3.tgz", - "integrity": "sha512-jSiv+lG/hHmVz933oXw+7rI51wGQSsxpxZTOjSylrQz6pngUrB/RxApPSX4VLPZfKxkucxHQ4PO5nuJ8satusg==", - "dependencies": { - "@wdio/logger": "8.11.0", - "@wdio/types": "8.16.3", - "@wdio/utils": "8.16.3", - "decamelize": "^6.0.0", - "deepmerge-ts": "^5.0.0", - "glob": "^10.2.2", - "import-meta-resolve": "^3.0.0", - "read-pkg-up": "^10.0.0" - }, - "engines": { - "node": "^16.13 || >=18" - } - }, - "node_modules/@wdio/runner/node_modules/@wdio/types": { - "version": "8.16.3", - "resolved": "https://registry.npmjs.org/@wdio/types/-/types-8.16.3.tgz", - "integrity": "sha512-cH6eKNKkx5ZVJxf7omwtqt88N/mI8Hn2qnXe4DHIYNC4wSDFPhSsuurRhH7s7fnk3biLEQfinuc3cxV0HefSVw==", - "dependencies": { - "@types/node": "^20.1.0" - }, - "engines": { - "node": "^16.13 || >=18" - } - }, - "node_modules/@wdio/runner/node_modules/@wdio/utils": { - "version": "8.16.3", - "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-8.16.3.tgz", - "integrity": "sha512-bX/sYOM+tI4hjMIcvSdL522c2xwkas6pII6AUhuBT2UIUkJnp7+OHijJ1l5kHAzRewCdcL3W4dm9exPH2URU+Q==", - "dependencies": { - "@puppeteer/browsers": "^1.6.0", - "@wdio/logger": "8.11.0", - "@wdio/types": "8.16.3", - "decamelize": "^6.0.0", - "deepmerge-ts": "^5.1.0", - "edgedriver": "^5.3.5", - "geckodriver": "^4.2.0", - "get-port": "^7.0.0", - "got": "^13.0.0", - "import-meta-resolve": "^3.0.0", - "locate-app": "^2.1.0", - "safaridriver": "^0.1.0", - "wait-port": "^1.0.4" - }, - "engines": { - "node": "^16.13 || >=18" - } - }, - "node_modules/@wdio/runner/node_modules/@wdio/utils/node_modules/got": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/got/-/got-13.0.0.tgz", - "integrity": "sha512-XfBk1CxOOScDcMr9O1yKkNaQyy865NbYs+F7dr4H0LZMVgCj2Le59k6PqbNHoL5ToeaEQUYh6c6yMfVcc6SJxA==", - "dependencies": { - "@sindresorhus/is": "^5.2.0", - "@szmarczak/http-timer": "^5.0.1", - "cacheable-lookup": "^7.0.0", - "cacheable-request": "^10.2.8", - "decompress-response": "^6.0.0", - "form-data-encoder": "^2.1.2", - "get-stream": "^6.0.1", - "http2-wrapper": "^2.1.10", - "lowercase-keys": "^3.0.0", - "p-cancelable": "^3.0.0", - "responselike": "^3.0.0" - }, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sindresorhus/got?sponsor=1" - } - }, - "node_modules/@wdio/runner/node_modules/archiver": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/archiver/-/archiver-6.0.1.tgz", - "integrity": "sha512-CXGy4poOLBKptiZH//VlWdFuUC1RESbdZjGjILwBuZ73P7WkAUN0htfSfBq/7k6FRFlpu7bg4JOkj1vU9G6jcQ==", - "dependencies": { - "archiver-utils": "^4.0.1", - "async": "^3.2.4", - "buffer-crc32": "^0.2.1", - "readable-stream": "^3.6.0", - "readdir-glob": "^1.1.2", - "tar-stream": "^3.0.0", - "zip-stream": "^5.0.1" - }, - "engines": { - "node": ">= 12.0.0" - } - }, - "node_modules/@wdio/runner/node_modules/archiver-utils": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-4.0.1.tgz", - "integrity": "sha512-Q4Q99idbvzmgCTEAAhi32BkOyq8iVI5EwdO0PmBDSGIzzjYNdcFn7Q7k3OzbLy4kLUPXfJtG6fO2RjftXbobBg==", - "dependencies": { - "glob": "^8.0.0", - "graceful-fs": "^4.2.0", - "lazystream": "^1.0.0", - "lodash": "^4.17.15", - "normalize-path": "^3.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">= 12.0.0" - } - }, - "node_modules/@wdio/runner/node_modules/archiver-utils/node_modules/glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@wdio/runner/node_modules/archiver-utils/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@wdio/runner/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@wdio/runner/node_modules/chromium-bidi": { - "version": "0.4.16", - "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.4.16.tgz", - "integrity": "sha512-7ZbXdWERxRxSwo3txsBjjmc/NLxqb1Bk30mRb0BMS4YIaiV6zvKZqL/UAH+DdqcDYayDWk2n/y8klkBDODrPvA==", - "dependencies": { - "mitt": "3.0.0" - }, - "peerDependencies": { - "devtools-protocol": "*" - } - }, - "node_modules/@wdio/runner/node_modules/compress-commons": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-5.0.1.tgz", - "integrity": "sha512-MPh//1cERdLtqwO3pOFLeXtpuai0Y2WCd5AhtKxznqM7WtaMYaOEMSgn45d9D10sIHSfIKE603HlOp8OPGrvag==", - "dependencies": { - "crc-32": "^1.2.0", - "crc32-stream": "^5.0.0", - "normalize-path": "^3.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">= 12.0.0" - } - }, - "node_modules/@wdio/runner/node_modules/crc32-stream": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-5.0.0.tgz", - "integrity": "sha512-B0EPa1UK+qnpBZpG+7FgPCu0J2ETLpXq09o9BkLkEAhdB6Z61Qo4pJ3JYu0c+Qi+/SAL7QThqnzS06pmSSyZaw==", - "dependencies": { - "crc-32": "^1.2.0", - "readable-stream": "^3.4.0" - }, - "engines": { - "node": ">= 12.0.0" - } - }, - "node_modules/@wdio/runner/node_modules/cross-fetch": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz", - "integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==", - "dependencies": { - "node-fetch": "^2.6.12" - } - }, - "node_modules/@wdio/runner/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/@wdio/runner/node_modules/devtools-protocol": { - "version": "0.0.1188743", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1188743.tgz", - "integrity": "sha512-FZDQC58vLiGR2mjSgsMzU8aEJieovMonIyxf38b775eYdIfAYgSzyAWnDf0Eq6ouF/L9qcbqR8jcQeIC34jp/w==" - }, - "node_modules/@wdio/runner/node_modules/is-plain-obj": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", - "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@wdio/runner/node_modules/ky": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ky/-/ky-1.0.1.tgz", - "integrity": "sha512-UvcwpQO0LOuZwG0Ti3VDo6w57KYt+r4bWEYlNaMt82hgyFtse86QtOGum1RzsZni31FndXQl6NvtDArfunt2JQ==", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sindresorhus/ky?sponsor=1" - } - }, - "node_modules/@wdio/runner/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@wdio/runner/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "node_modules/@wdio/runner/node_modules/puppeteer-core": { - "version": "20.9.0", - "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-20.9.0.tgz", - "integrity": "sha512-H9fYZQzMTRrkboEfPmf7m3CLDN6JvbxXA3qTtS+dFt27tR+CsFHzPsT6pzp6lYL6bJbAPaR0HaPO6uSi+F94Pg==", - "dependencies": { - "@puppeteer/browsers": "1.4.6", - "chromium-bidi": "0.4.16", - "cross-fetch": "4.0.0", - "debug": "4.3.4", - "devtools-protocol": "0.0.1147663", - "ws": "8.13.0" - }, - "engines": { - "node": ">=16.3.0" - }, - "peerDependencies": { - "typescript": ">= 4.7.4" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@wdio/runner/node_modules/puppeteer-core/node_modules/@puppeteer/browsers": { - "version": "1.4.6", - "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-1.4.6.tgz", - "integrity": "sha512-x4BEjr2SjOPowNeiguzjozQbsc6h437ovD/wu+JpaenxVLm3jkgzHY2xOslMTp50HoTvQreMjiexiGQw1sqZlQ==", - "dependencies": { - "debug": "4.3.4", - "extract-zip": "2.0.1", - "progress": "2.0.3", - "proxy-agent": "6.3.0", - "tar-fs": "3.0.4", - "unbzip2-stream": "1.4.3", - "yargs": "17.7.1" - }, - "bin": { - "browsers": "lib/cjs/main-cli.js" - }, - "engines": { - "node": ">=16.3.0" - }, - "peerDependencies": { - "typescript": ">= 4.7.4" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@wdio/runner/node_modules/puppeteer-core/node_modules/devtools-protocol": { - "version": "0.0.1147663", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1147663.tgz", - "integrity": "sha512-hyWmRrexdhbZ1tcJUGpO95ivbRhWXz++F4Ko+n21AY5PNln2ovoJw+8ZMNDTtip+CNFQfrtLVh/w4009dXO/eQ==" - }, - "node_modules/@wdio/runner/node_modules/puppeteer-core/node_modules/ws": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", - "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/@wdio/runner/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/@wdio/runner/node_modules/tar-stream": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.6.tgz", - "integrity": "sha512-B/UyjYwPpMBv+PaFSWAmtYjwdrlEaZQEhMIBFNC5oEG8lpiW8XjcSdmEaClj28ArfKScKHs2nshz3k2le6crsg==", - "dependencies": { - "b4a": "^1.6.4", - "fast-fifo": "^1.2.0", - "streamx": "^2.15.0" - } - }, - "node_modules/@wdio/runner/node_modules/webdriver": { - "version": "8.16.4", - "resolved": "https://registry.npmjs.org/webdriver/-/webdriver-8.16.4.tgz", - "integrity": "sha512-iL8yt6JrH6GqWCMyyZ8/4UMH1Pkez0VCYtkF5Fwwy6gLbP7q4iOVIFjKXP6Cg5gA2aoJvf9TLZ4cFbGOvsZXCw==", - "dependencies": { - "@types/node": "^20.1.0", - "@types/ws": "^8.5.3", - "@wdio/config": "8.16.3", - "@wdio/logger": "8.11.0", - "@wdio/protocols": "8.14.6", - "@wdio/types": "8.16.3", - "@wdio/utils": "8.16.3", - "deepmerge-ts": "^5.1.0", - "got": "^ 12.6.1", - "ky": "^1.0.0", - "ws": "^8.8.0" - }, - "engines": { - "node": "^16.13 || >=18" - } - }, - "node_modules/@wdio/runner/node_modules/webdriverio": { - "version": "8.16.4", - "resolved": "https://registry.npmjs.org/webdriverio/-/webdriverio-8.16.4.tgz", - "integrity": "sha512-gt1f7qlfGzx8kKvGBxeOtYqbxYAi929fIFNnE4nDDxOzBL6Pd2ctStiqMjxeCOsZ5Z5sDDKw//P6FSRYnhNiaA==", - "dependencies": { - "@types/node": "^20.1.0", - "@wdio/config": "8.16.3", - "@wdio/logger": "8.11.0", - "@wdio/protocols": "8.14.6", - "@wdio/repl": "8.10.1", - "@wdio/types": "8.16.3", - "@wdio/utils": "8.16.3", - "archiver": "^6.0.0", - "aria-query": "^5.0.0", - "css-shorthand-properties": "^1.1.1", - "css-value": "^0.0.1", - "devtools-protocol": "^0.0.1188743", - "grapheme-splitter": "^1.0.2", - "import-meta-resolve": "^3.0.0", - "is-plain-obj": "^4.1.0", - "lodash.clonedeep": "^4.5.0", - "lodash.zip": "^4.2.0", - "minimatch": "^9.0.0", - "puppeteer-core": "^20.9.0", - "query-selector-shadow-dom": "^1.0.0", - "resq": "^1.9.1", - "rgb2hex": "0.2.5", - "serialize-error": "^11.0.1", - "webdriver": "8.16.4" - }, - "engines": { - "node": "^16.13 || >=18" - }, - "peerDependencies": { - "devtools": "^8.14.0" - }, - "peerDependenciesMeta": { - "devtools": { - "optional": true - } - } - }, - "node_modules/@wdio/runner/node_modules/ws": { + "node_modules/@wdio/cli/node_modules/ws": { "version": "8.14.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.14.0.tgz", "integrity": "sha512-WR0RJE9Ehsio6U4TuM+LmunEsjQ5ncHlw4sn9ihD6RoJKZrVyH9FWV3dmnwu8B2aNib1OvG2X6adUCyFpQyWcg==", @@ -17278,24 +15859,7 @@ } } }, - "node_modules/@wdio/runner/node_modules/yargs": { - "version": "17.7.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz", - "integrity": "sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==", - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@wdio/runner/node_modules/yargs-parser": { + "node_modules/@wdio/cli/node_modules/yargs-parser": { "version": "21.1.1", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", @@ -17303,7 +15867,7 @@ "node": ">=12" } }, - "node_modules/@wdio/runner/node_modules/zip-stream": { + "node_modules/@wdio/cli/node_modules/zip-stream": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-5.0.1.tgz", "integrity": "sha512-UfZ0oa0C8LI58wJ+moL46BDIMgCQbnsb+2PoiJYtonhBsMh2bq1eRBVkvjfVsqbEHd9/EgKPUuL9saSSsec8OA==", @@ -17316,6 +15880,237 @@ "node": ">= 12.0.0" } }, + "node_modules/@wdio/config": { + "version": "8.16.3", + "resolved": "https://registry.npmjs.org/@wdio/config/-/config-8.16.3.tgz", + "integrity": "sha512-jSiv+lG/hHmVz933oXw+7rI51wGQSsxpxZTOjSylrQz6pngUrB/RxApPSX4VLPZfKxkucxHQ4PO5nuJ8satusg==", + "dependencies": { + "@wdio/logger": "8.11.0", + "@wdio/types": "8.16.3", + "@wdio/utils": "8.16.3", + "decamelize": "^6.0.0", + "deepmerge-ts": "^5.0.0", + "glob": "^10.2.2", + "import-meta-resolve": "^3.0.0", + "read-pkg-up": "^10.0.0" + }, + "engines": { + "node": "^16.13 || >=18" + } + }, + "node_modules/@wdio/cucumber-framework": { + "version": "8.16.4", + "resolved": "https://registry.npmjs.org/@wdio/cucumber-framework/-/cucumber-framework-8.16.4.tgz", + "integrity": "sha512-7Xi8GqvOq/CC/iKpkLxGTxfm6hUWxkXHLql9vKefqvzgL85QJhy2/zOOia3m0OgV3tQJ3ZzlwteYgw7+fpFoAg==", + "dev": true, + "dependencies": { + "@cucumber/cucumber": "9.4.0", + "@cucumber/gherkin": "26.2.0", + "@cucumber/messages": "22.0.0", + "@cucumber/tag-expressions": "5.0.6", + "@types/node": "^20.1.0", + "@wdio/logger": "8.11.0", + "@wdio/types": "8.16.3", + "@wdio/utils": "8.16.3", + "glob": "^10.2.2", + "is-glob": "^4.0.0" + }, + "engines": { + "node": "^16.13 || >=18" + } + }, + "node_modules/@wdio/globals": { + "version": "8.16.4", + "resolved": "https://registry.npmjs.org/@wdio/globals/-/globals-8.16.4.tgz", + "integrity": "sha512-Ia+59jZ+ZonrdZk/Vk98m7AEHZWUZBoJtRwOx5IPXeWCSdi+Sz2+lQzEzSGWJv+iYxsI7qI5Lyv66Th4e5SiLg==", + "engines": { + "node": "^16.13 || >=18" + }, + "optionalDependencies": { + "expect-webdriverio": "^4.2.5", + "webdriverio": "8.16.4" + } + }, + "node_modules/@wdio/local-runner": { + "version": "8.16.4", + "resolved": "https://registry.npmjs.org/@wdio/local-runner/-/local-runner-8.16.4.tgz", + "integrity": "sha512-lIEcS6RDwGL4JyxOUdt9y2bKhJS7jMX1bdxfKSt9HUhZsBK0deoFMrMqtwRoF8HsKLt58gfHu2ADi3rES0wUNA==", + "dependencies": { + "@types/node": "^20.1.0", + "@wdio/logger": "8.11.0", + "@wdio/repl": "8.10.1", + "@wdio/runner": "8.16.4", + "@wdio/types": "8.16.3", + "async-exit-hook": "^2.0.1", + "split2": "^4.1.0", + "stream-buffers": "^3.0.2" + }, + "engines": { + "node": "^16.13 || >=18" + } + }, + "node_modules/@wdio/local-runner/node_modules/@wdio/types": { + "version": "8.16.3", + "resolved": "https://registry.npmjs.org/@wdio/types/-/types-8.16.3.tgz", + "integrity": "sha512-cH6eKNKkx5ZVJxf7omwtqt88N/mI8Hn2qnXe4DHIYNC4wSDFPhSsuurRhH7s7fnk3biLEQfinuc3cxV0HefSVw==", + "dependencies": { + "@types/node": "^20.1.0" + }, + "engines": { + "node": "^16.13 || >=18" + } + }, + "node_modules/@wdio/logger": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-8.11.0.tgz", + "integrity": "sha512-IsuKSaYi7NKEdgA57h8muzlN/MVp1dQG+V4C//7g4m03YJUnNQLvDhJzLjdeNTfvZy61U7foQSyt+3ktNzZkXA==", + "dependencies": { + "chalk": "^5.1.2", + "loglevel": "^1.6.0", + "loglevel-plugin-prefix": "^0.8.4", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": "^16.13 || >=18" + } + }, + "node_modules/@wdio/logger/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@wdio/mocha-framework": { + "version": "8.16.3", + "resolved": "https://registry.npmjs.org/@wdio/mocha-framework/-/mocha-framework-8.16.3.tgz", + "integrity": "sha512-aORPOQPiSQ5g26BSbaQkfO3MQUlpa99ZByc4tZPvQl84/Do0rvCP3JWfE4Db1YehStVKpisGwK7fUA6fpWkFQA==", + "dependencies": { + "@types/mocha": "^10.0.0", + "@types/node": "^20.1.0", + "@wdio/logger": "8.11.0", + "@wdio/types": "8.16.3", + "@wdio/utils": "8.16.3", + "mocha": "^10.0.0" + }, + "engines": { + "node": "^16.13 || >=18" + } + }, + "node_modules/@wdio/mocha-framework/node_modules/@wdio/types": { + "version": "8.16.3", + "resolved": "https://registry.npmjs.org/@wdio/types/-/types-8.16.3.tgz", + "integrity": "sha512-cH6eKNKkx5ZVJxf7omwtqt88N/mI8Hn2qnXe4DHIYNC4wSDFPhSsuurRhH7s7fnk3biLEQfinuc3cxV0HefSVw==", + "dependencies": { + "@types/node": "^20.1.0" + }, + "engines": { + "node": "^16.13 || >=18" + } + }, + "node_modules/@wdio/mocha-framework/node_modules/@wdio/utils": { + "version": "8.16.3", + "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-8.16.3.tgz", + "integrity": "sha512-bX/sYOM+tI4hjMIcvSdL522c2xwkas6pII6AUhuBT2UIUkJnp7+OHijJ1l5kHAzRewCdcL3W4dm9exPH2URU+Q==", + "dependencies": { + "@puppeteer/browsers": "^1.6.0", + "@wdio/logger": "8.11.0", + "@wdio/types": "8.16.3", + "decamelize": "^6.0.0", + "deepmerge-ts": "^5.1.0", + "edgedriver": "^5.3.5", + "geckodriver": "^4.2.0", + "get-port": "^7.0.0", + "got": "^13.0.0", + "import-meta-resolve": "^3.0.0", + "locate-app": "^2.1.0", + "safaridriver": "^0.1.0", + "wait-port": "^1.0.4" + }, + "engines": { + "node": "^16.13 || >=18" + } + }, + "node_modules/@wdio/mocha-framework/node_modules/got": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/got/-/got-13.0.0.tgz", + "integrity": "sha512-XfBk1CxOOScDcMr9O1yKkNaQyy865NbYs+F7dr4H0LZMVgCj2Le59k6PqbNHoL5ToeaEQUYh6c6yMfVcc6SJxA==", + "dependencies": { + "@sindresorhus/is": "^5.2.0", + "@szmarczak/http-timer": "^5.0.1", + "cacheable-lookup": "^7.0.0", + "cacheable-request": "^10.2.8", + "decompress-response": "^6.0.0", + "form-data-encoder": "^2.1.2", + "get-stream": "^6.0.1", + "http2-wrapper": "^2.1.10", + "lowercase-keys": "^3.0.0", + "p-cancelable": "^3.0.0", + "responselike": "^3.0.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" + } + }, + "node_modules/@wdio/protocols": { + "version": "8.14.6", + "resolved": "https://registry.npmjs.org/@wdio/protocols/-/protocols-8.14.6.tgz", + "integrity": "sha512-KM2taEMUDEt1of0Na/6kIv/aNzX0pmr0etpKRci4QrWPQ1O11dXxWjkatFILQz6qOVKvQ0v+vkTPQRUllmH+uQ==" + }, + "node_modules/@wdio/repl": { + "version": "8.10.1", + "resolved": "https://registry.npmjs.org/@wdio/repl/-/repl-8.10.1.tgz", + "integrity": "sha512-VZ1WFHTNKjR8Ga97TtV2SZM6fvRjWbYI2i/f4pJB4PtusorKvONAMJf2LQcUBIyzbVobqr7KSrcjmSwRolI+yw==", + "dependencies": { + "@types/node": "^20.1.0" + }, + "engines": { + "node": "^16.13 || >=18" + } + }, + "node_modules/@wdio/reporter": { + "version": "8.16.3", + "resolved": "https://registry.npmjs.org/@wdio/reporter/-/reporter-8.16.3.tgz", + "integrity": "sha512-sxjFbxeZF0130kwSbHGb1FLP1a+RbW41MI78sa0IKz5SnyTRbjexd9nUuP41cYKZqu+ADgtx+i7sH8+3zuffkA==", + "dependencies": { + "@types/node": "^20.1.0", + "@wdio/logger": "8.11.0", + "@wdio/types": "8.16.3", + "diff": "^5.0.0", + "object-inspect": "^1.12.0" + }, + "engines": { + "node": "^16.13 || >=18" + } + }, + "node_modules/@wdio/runner": { + "version": "8.16.4", + "resolved": "https://registry.npmjs.org/@wdio/runner/-/runner-8.16.4.tgz", + "integrity": "sha512-sIVLAU+BRuBYQDbLpP5M80rvbiYdvJU7OREz5AMTOAwdJRaq9SXBX6IW01bxTYn7O10f/ajYU4pn1LYUaPrKlw==", + "dependencies": { + "@types/node": "^20.1.0", + "@wdio/config": "8.16.3", + "@wdio/globals": "8.16.4", + "@wdio/logger": "8.11.0", + "@wdio/types": "8.16.3", + "@wdio/utils": "8.16.3", + "deepmerge-ts": "^5.0.0", + "expect-webdriverio": "^4.2.5", + "gaze": "^1.1.2", + "webdriver": "8.16.4", + "webdriverio": "8.16.4" + }, + "engines": { + "node": "^16.13 || >=18" + } + }, "node_modules/@wdio/sauce-service": { "version": "8.16.4", "resolved": "https://registry.npmjs.org/@wdio/sauce-service/-/sauce-service-8.16.4.tgz", @@ -17843,6 +16638,12 @@ "integrity": "sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==", "dev": true }, + "node_modules/array-timsort": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-timsort/-/array-timsort-1.0.3.tgz", + "integrity": "sha512-/+3GRL7dDAGEfM6TseQk/U+mi18TU2Ms9I3UlLdUMhz2hbvGNTKdj9xniwXfUqgYhHxRx0+8UnKkvlNwVU+cWQ==", + "dev": true + }, "node_modules/array-union": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", @@ -18174,18 +16975,6 @@ "node": ">=8" } }, - "node_modules/binaryextensions": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/binaryextensions/-/binaryextensions-4.18.0.tgz", - "integrity": "sha512-PQu3Kyv9dM4FnwB7XGj1+HucW+ShvJzJqjuw1JkKVs1mWdwOKVcRjOi+pV9X52A0tNvrPCsPkbFFQb+wE1EAXw==", - "dev": true, - "engines": { - "node": ">=0.8" - }, - "funding": { - "url": "https://bevry.me/fund" - } - }, "node_modules/bl": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", @@ -19564,11 +18353,21 @@ "node": ">= 0.6.x" } }, - "node_modules/commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", - "dev": true + "node_modules/comment-json": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/comment-json/-/comment-json-4.2.3.tgz", + "integrity": "sha512-SsxdiOf064DWoZLH799Ata6u7iV658A11PlWtZATDlXPpKGJnbJZ5Z24ybixAi+LUUqJ/GKowAejtC5GFUG7Tw==", + "dev": true, + "dependencies": { + "array-timsort": "^1.0.3", + "core-util-is": "^1.0.3", + "esprima": "^4.0.1", + "has-own-prop": "^2.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">= 6" + } }, "node_modules/compare-func": { "version": "2.0.0", @@ -22716,58 +21515,6 @@ "webdriverio": "^8.13.1" } }, - "node_modules/express": { - "version": "4.18.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", - "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.1", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.5.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.2.0", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.11.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/express-fileupload": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/express-fileupload/-/express-fileupload-1.4.0.tgz", - "integrity": "sha512-RjzLCHxkv3umDeZKeFeMg8w7qe0V09w3B7oGZprr/oO2H/ISCgNzuqzn7gV3HRWb37GjRk429CCpSLS2KNTqMQ==", - "dependencies": { - "busboy": "^1.6.0" - }, - "engines": { - "node": ">=12.0.0" - } - }, "node_modules/express-session": { "version": "1.17.0", "resolved": "https://registry.npmjs.org/express-session/-/express-session-1.17.0.tgz", @@ -24114,16 +22861,6 @@ "node": ">= 4.0.0" } }, - "node_modules/gifwrap": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/gifwrap/-/gifwrap-0.9.4.tgz", - "integrity": "sha512-MDMwbhASQuVeD4JKd1fKgNgCRL3fGqMM4WaqpNhWO0JiMOAjbQdumbs4BbBZEy9/M00EHEjKN3HieVhCUlwjeQ==", - "dev": true, - "dependencies": { - "image-q": "^4.0.0", - "omggif": "^1.0.10" - } - }, "node_modules/git-raw-commits": { "version": "2.0.11", "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-2.0.11.tgz", @@ -24543,6 +23280,15 @@ "node": ">=8" } }, + "node_modules/has-own-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-own-prop/-/has-own-prop-2.0.0.tgz", + "integrity": "sha512-Pq0h+hvsVm6dDEa8x82GnLSYHOzNDt7f0ddFa3FqcQlgzEiptPqL+XrOJNavjOzSYiYWIrgeVYYgGlLmnxwilQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/has-property-descriptors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", @@ -24764,6 +23510,7 @@ "version": "2.0.6", "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", + "dev": true, "dependencies": { "@types/http-proxy": "^1.17.8", "http-proxy": "^1.18.1", @@ -24787,6 +23534,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "dev": true, "engines": { "node": ">=10" }, @@ -24797,7 +23545,8 @@ "node_modules/http-proxy/node_modules/eventemitter3": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true }, "node_modules/http2-wrapper": { "version": "2.2.0", @@ -25938,9 +24687,10 @@ } }, "node_modules/jsonwebtoken": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.1.tgz", - "integrity": "sha512-K8wx7eJ5TPvEjuiVSkv167EVboBDv9PZdDoF7BgeQnBLVvZWW9clr2PsQHVJDTKaEIH5JBIwHujGcHp7GgI2eg==", + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", + "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==", + "dev": true, "dependencies": { "jws": "^3.2.2", "lodash.includes": "^4.3.0", @@ -26519,7 +25269,8 @@ "node_modules/lodash.includes": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", - "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==" + "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==", + "dev": true }, "node_modules/lodash.isarguments": { "version": "3.1.0", @@ -26530,7 +25281,8 @@ "node_modules/lodash.isboolean": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", - "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==" + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==", + "dev": true }, "node_modules/lodash.isfunction": { "version": "3.0.9", @@ -26541,7 +25293,8 @@ "node_modules/lodash.isinteger": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", - "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==" + "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==", + "dev": true }, "node_modules/lodash.ismatch": { "version": "4.4.0", @@ -26552,12 +25305,20 @@ "node_modules/lodash.isnumber": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", - "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==" + "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==", + "dev": true }, "node_modules/lodash.isplainobject": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==" + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "dev": true + }, + "node_modules/lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", + "dev": true }, "node_modules/lodash.isstring": { "version": "4.0.1", @@ -26585,7 +25346,8 @@ "node_modules/lodash.once": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", - "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==" + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", + "dev": true }, "node_modules/lodash.pickby": { "version": "4.6.0", @@ -29412,12 +28174,6 @@ "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==" }, - "node_modules/phin": { - "version": "2.9.3", - "resolved": "https://registry.npmjs.org/phin/-/phin-2.9.3.tgz", - "integrity": "sha512-CzFr90qM24ju5f88quFC/6qohjC144rehe5n6DH900lgXmUe86+xCKc10ev56gRKC4/BkHUoG4uSiQgBiIXwDA==", - "dev": true - }, "node_modules/picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", @@ -31989,58 +30745,6 @@ "node": ">= 10.x" } }, - "node_modules/sqlite3": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-5.1.6.tgz", - "integrity": "sha512-olYkWoKFVNSSSQNvxVUfjiVbz3YtBwTJj+mfV5zpHmqW3sELx2Cf4QCdirMelhM5Zh+KDVaKgQHqCxrqiWHybw==", - "hasInstallScript": true, - "dependencies": { - "@mapbox/node-pre-gyp": "^1.0.0", - "node-addon-api": "^4.2.0", - "tar": "^6.1.11" - }, - "optionalDependencies": { - "node-gyp": "8.x" - }, - "peerDependencies": { - "node-gyp": "8.x" - }, - "peerDependenciesMeta": { - "node-gyp": { - "optional": true - } - } - }, - "node_modules/ssri": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", - "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", - "optional": true, - "dependencies": { - "minipass": "^3.1.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/ssri/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "optional": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ssri/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "optional": true - }, "node_modules/stack-utils": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", @@ -32682,9 +31386,10 @@ } }, "node_modules/tar": { - "version": "6.1.15", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.15.tgz", - "integrity": "sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz", + "integrity": "sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==", + "dev": true, "dependencies": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", @@ -33368,6 +32073,10 @@ "resolved": "examples/ui5-js-app", "link": true }, + "node_modules/ui5-app-esm": { + "resolved": "examples/ui5-js-app-esm", + "link": true + }, "node_modules/ui5-middleware-livereload": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/ui5-middleware-livereload/-/ui5-middleware-livereload-3.0.0.tgz", @@ -33825,15 +32534,6 @@ "node": ">= 0.8.0" } }, - "node_modules/utif": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/utif/-/utif-2.0.1.tgz", - "integrity": "sha512-Z/S1fNKCicQTf375lIP9G8Sa1H/phcysstNrrSdZKj1f9g58J4NMgb5IgiEZN9/nLMPDwF0W7hdOe9Qq2IYoLg==", - "dev": true, - "dependencies": { - "pako": "^1.0.5" - } - }, "node_modules/util-arity": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/util-arity/-/util-arity-1.1.0.tgz", diff --git a/package.json b/package.json index ca57263c..792ffb85 100644 --- a/package.json +++ b/package.json @@ -31,6 +31,7 @@ ".", "examples/fe-app", "examples/ui5-js-app", + "examples/ui5-js-app-esm", "examples/ui5-ts-app", "examples/cucumber", "examples/cap-bookshop-wdi5" @@ -48,6 +49,7 @@ "// test time": "refers to testing wdio-ui5-service", "_startApp:js": "soerver -d ./examples/ui5-js-app/webapp -p 8888 -x ./examples/ui5-js-app/webapp/proxyrc.json", "_startApp:js-tooling": "npm run serve --workspace=examples/ui5-js-app", + "_startApp:js:esm": "npm start --workspace=examples/ui5-js-app-esm -- -p 8082 ", "_startApp:ts": "npm run start --workspace=examples/ui5-ts-app", "_startApp:fe": "npm run serve --workspace=examples/fe-app", "_startApp:cap": "npm run start --workspace=examples/cap-bookshop-wdi5", @@ -55,8 +57,10 @@ "_test:ts-app": "wait-on tcp:8080 && npm run test --workspace=examples/ui5-ts-app", "_test:cap-app": "wait-on tcp:4004 && npm run wdi5 --workspace=examples/cap-bookshop-wdi5 -- --headless", "_test-h:js-app": "wait-on tcp:8888 && wait-on tcp:8080 && npm run test-h --workspace=examples/ui5-js-app", + "_test-h:js-app:esm": "wait-on tcp:8082 && npm run wdi5 --workspace=examples/ui5-js-app-esm -- --headless ", "_test-h:ts-app": "wait-on tcp:8080 && npm run test -w examples/ui5-ts-app -- --headless && npm run test:lateInject -w examples/ui5-ts-app -- --headless", "test-h:js-app": "run-p -r _startApp:js _startApp:js-tooling _test-h:js-app", + "test-h:js-app:esm": "run-p -r _startApp:js:esm _test-h:js-app:esm", "test:ts-app": "run-p -r _startApp:ts _test:ts-app", "test:cucumber": "npm run test --workspace=examples/cucumber", "test-h:ts-app": "run-p -r _startApp:ts _test-h:ts-app", @@ -77,7 +81,7 @@ "startDoc": "docsify serve ./docs" }, "dependencies": { - "devtools": "^8.15.6", + "devtools": "^8.16.3", "dotenv": "^16.3.1", "semver": "^7.5.4" }, @@ -92,35 +96,35 @@ "devDependencies": { "@commitlint/cli": "^17.7.1", "@commitlint/config-conventional": "^17.7.0", - "@sap/approuter": "14.3.0", + "@sap/approuter": "14.3.1", "@sap/ux-ui5-fe-mockserver-middleware": "^1.6.5", "@types/openui5": "^1.117.0", "@types/sinon": "^10.0.16", - "@typescript-eslint/eslint-plugin": "^6.4.1", - "@typescript-eslint/parser": "^6.4.1", + "@typescript-eslint/eslint-plugin": "^6.6.0", + "@typescript-eslint/parser": "^6.6.0", "@ui5/cli": "^3", "@wdio/sauce-service": "^8", "cross-env": "^7.0.3", "deepmerge": "^4.3.1", "docsify-cli": "4.4.4", - "eslint": "^8.47.0", + "eslint": "^8.48.0", "eslint-config-prettier": "^9.0.0", "eslint-plugin-prettier": "^5.0.0", "fs-extra": "^11.1.1", "husky": "^8.0.3", "lint-staged": "^14.0.1", "marky": "^1.2.5", - "mbt": "^1.2.24", + "mbt": "^1.2.25", "mocha": "^10.2.0", "npm-run-all": "^4.1.5", - "prettier": "^3.0.2", + "prettier": "^3.0.3", "replace-in-file": "^7.0.1", "rimraf": "^5.0.1", "sinon": "^15.2.0", "soerver": "^0.0.3", "standard-version": "^9.5.0", "ts-node": "^10.9.1", - "typescript": "^5.1.6", + "typescript": "^5.2.2", "wait-on": "^7.0.1" }, "engines": { diff --git a/src/service.ts b/src/service.ts index 87776a3d..99f7fa62 100644 --- a/src/service.ts +++ b/src/service.ts @@ -34,7 +34,7 @@ export default class Service implements Services.ServiceInstance { if (this._config.wdi5.skipInjectUI5OnStart) { Logger.warn("skipped wdi5 injection!") } else if (this._config.wdi5.btpWorkZoneEnablement) { - Logger.info("delegating wdi5 injection to Work Zone enablement...") + Logger.info("delegating wdi5 injection to WorkZone enablement...") await this.enableBTPWorkZoneStdEdition(browser[name]) } else { await this.injectUI5(browser[name]) @@ -48,7 +48,7 @@ export default class Service implements Services.ServiceInstance { if (this._config.wdi5.skipInjectUI5OnStart) { Logger.warn("skipped wdi5 injection!") } else if (this._config.wdi5.btpWorkZoneEnablement) { - Logger.info("delegating wdi5 injection to Work Zone enablement...") + Logger.info("delegating wdi5 injection to WorkZone enablement...") await this.enableBTPWorkZoneStdEdition(browser) } else { await this.injectUI5(browser) diff --git a/src/wdi5.ts b/src/wdi5.ts index 73cd2423..d8f72b45 100644 --- a/src/wdi5.ts +++ b/src/wdi5.ts @@ -7,10 +7,35 @@ const authenticatorInstances = {} * a (static) helper class named after the tool */ export class wdi5 { + /** + * get an instance of wdi5's logger for some pretty looking console output + * @param sPrefix displayed within "[ ]" prepending the log message + * @returns an instance of wdi5's logger + */ static getLogger(sPrefix = "wdi5") { return Logger.getInstance(sPrefix) } + /** + * set the browsing context for to the WorkZone _shell_ + * + * so that all methods of the browser object will be executed in the context of the WorkZone shell + */ + static async toWorkZoneShell() { + await browser.switchToParentFrame() + await browser.pause(100) // let the browsing context settle + } + + /** + * set the browsing context for to the WorkZone _app_ + * + * so that all methods of the browser object will be executed in the context of the WorkZone app + */ + static async toWorkZoneApp() { + await browser.switchToFrame(0) + await browser.pause(100) // let the browsing context settle + } + //// REVISIT: not yet/if still needed :) // static wz = new Proxy(this, { // get(target, prop, receiver) {