diff --git a/.github/workflows/checkmarx.yml b/.github/workflows/checkmarx.yml new file mode 100644 index 0000000000..fae9411344 --- /dev/null +++ b/.github/workflows/checkmarx.yml @@ -0,0 +1,21 @@ +name: Checkmarx One Scan +on: + workflow_dispatch: + schedule: + - cron: "0 0 * * *" +jobs: + trigger_scan: + runs-on: ubuntu-latest + steps: + - name: Checkmarx One CLI Action + uses: checkmarx/ast-github-action@main #Github Action version + with: + project_name: Luigi + cx_tenant: sap + base_uri: https://checkmarx.tools.sap + #base_auth_uri: https://checkmarx.tools.sap + cx_client_id: ${{ secrets.CXONE_CLIENT_ID }} + cx_client_secret: ${{ secrets.CXONE_CLIENT_SECRET }} + branch: ${{ github.ref_name }} + additional_params: "--async --scan-types sast -s https://github.com/SAP/luigi.git" + diff --git a/.github/workflows/compatibility.yml b/.github/workflows/compatibility.yml index b1d6ea67ea..df55cd077f 100644 --- a/.github/workflows/compatibility.yml +++ b/.github/workflows/compatibility.yml @@ -5,12 +5,13 @@ on: name: Backwards Compatibility Check env: CYPRESS_CACHE_FOLDER: ~/cypress-binary-cache + CYPRESS_DASHBOARD_RECORD_KEY: ${{ secrets.CYPRESS_DASHBOARD }} GH_TOKEN: ${{ github.token }} jobs: - prepare: + prepare: uses: ./.github/workflows/prepare.yml - with: + with: buildcache_key: compat_buildcache-${{ github.ref }} secrets: inherit @@ -18,11 +19,13 @@ jobs: name: Compatibility Tests needs: prepare runs-on: ubuntu-latest + env: + USE_CYPRESS_DASHBOARD: true # enable when trying to debug steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: - node-version: '20.14.0' + node-version: '20.14.0' - uses: actions/cache@v4 with: path: | diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 77e9ae6c0f..77b3f52a04 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -101,7 +101,7 @@ jobs: runs-on: ubuntu-latest env: - USE_CYPRESS_DASHBOARD: false # enable when trying to debug + USE_CYPRESS_DASHBOARD: true # enable when trying to debug steps: - uses: actions/setup-node@v4 with: diff --git a/CHANGELOG.md b/CHANGELOG.md index 36fc23507b..cf17943fa7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -25,6 +25,33 @@ The lerna-changelog tool detects changes based on PR labels and maps them to sec --> +## [v2.17.0] (2024-10-02) + +#### :rocket: Added +* [#3946](https://github.com/SAP/luigi/pull/3946) Adds option to disable luigiCookie ([@walmazacn](https://github.com/walmazacn)) +* [#3922](https://github.com/SAP/luigi/pull/3922) Adds node property for hiding global search ([@walmazacn](https://github.com/walmazacn)) + +#### :bug: Fixed +* [#3968](https://github.com/SAP/luigi/pull/3968) Fix fdToolLayout background-color ([@JohannesDoberer](https://github.com/JohannesDoberer)) +* [#3964](https://github.com/SAP/luigi/pull/3964) Clean Luigi store ([@JohannesDoberer](https://github.com/JohannesDoberer)) + + + + + + +## [v2.16.0] (2024-09-27) + +#### :rocket: Added +* [#3938](https://github.com/SAP/luigi/pull/3938) LeftNav in btpLayout: make 'expanded' the default state for nav item groups ([@amilewskaa](https://github.com/amilewskaa)) +* [#3915](https://github.com/SAP/luigi/pull/3915) Adds optional renderer for navHeader ([@walmazacn](https://github.com/walmazacn)) + +#### :bug: Fixed +* [#3902](https://github.com/SAP/luigi/pull/3902) Fixes wrong drawer position ([@walmazacn](https://github.com/walmazacn)) + + + + ## [v2.15.0] (2024-08-28) #### :rocket: Added @@ -1853,4 +1880,6 @@ The lerna-changelog tool detects changes based on PR labels and maps them to sec [v2.14.1]: https://github.com/SAP/luigi/compare/v2.14.0...v2.14.1 [v2.14.2]: https://github.com/SAP/luigi/compare/v2.14.1...v2.14.2 [v2.14.3]: https://github.com/SAP/luigi/compare/v2.14.2...v2.14.3 -[v2.15.0]: https://github.com/SAP/luigi/compare/v2.14.3...v2.15.0 \ No newline at end of file +[v2.15.0]: https://github.com/SAP/luigi/compare/v2.14.3...v2.15.0 +[v2.16.0]: https://github.com/SAP/luigi/compare/v2.15.0...v2.16.0 +[v2.17.0]: https://github.com/SAP/luigi/compare/v2.16.0...v2.17.0 \ No newline at end of file diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index c89deb7545..fbedacb077 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -21,7 +21,7 @@ You are welcome to contribute with your pull requests. These steps explain the c > **NOTE:** You should always add [*unit tests*](https://github.com/SAP/luigi/tree/main/core/test) if you are adding code to our repository. - If you've added code that is exposed as an API or configuration, additionally add e2e tests to [js-test-app](https://github.com/SAP/luigi/tree/main/test/e2e-test-application/cypress/e2e/tests/0-js-test-app). +If you've added code that is exposed as an API or configuration, additionally add e2e tests to [js-test-app](https://github.com/SAP/luigi/tree/main/test/e2e-test-application/cypress/e2e/tests/0-js-test-app). To let tests run locally, run `cd test/e2e-js-test-application && npm run dev` and `cd test/e2e-test-application && npm run e2e:open` and click on the test in the *js-test-application* category. @@ -29,6 +29,10 @@ To let tests run locally, run `cd test/e2e-js-test-application && npm run dev` a We use GitHub issues to track bugs. Please ensure your description is clear and includes sufficient instructions to reproduce the issue. +## Contributing with AI-generated code +As artificial intelligence evolves, AI-generated code is becoming valuable for many software projects, including open-source initiatives. While we recognize the potential benefits of incorporating AI-generated content into our open-source projects there a certain requirements that need to be reflected and adhered to when making contributions. + +Please see our [guideline for AI-generated code contributions to SAP Open Source Software Projects](https://github.com/SAP/.github/blob/main/CONTRIBUTING_USING_GENAI.md) for these requirements. + ## License -By contributing to Luigi, you agree that your contributions will be licensed -under its [Apache-2.0 license](LICENSE). +By contributing to Luigi, you agree that your contributions will be licensed under its [Apache-2.0 license](LICENSE). diff --git a/blog/2024-07-10-release-notes.md b/blog/2024-07-10-release-notes.md new file mode 100644 index 0000000000..9383361f35 --- /dev/null +++ b/blog/2024-07-10-release-notes.md @@ -0,0 +1,33 @@ +--- +title: Luigi v2.14 +seoMetaDescription: Release notes for Luigi v2.14 +author: + - Mahati Shankar +layout: blog +--- + +You can read about the new features in Luigi v2.14 in the release notes below. + + + + +#### E2E Tests With Nightwatch, WebdriverIO and Puppeteer + +The testing-utilities library now additionally supports Nightwatch, WebdriverIO and Puppeteer. You can now use these testing frameworks for your e2e tests. + +#### getCurrentRoute Has Been Added + +[getCurrentRoute](https://docs.luigi-project.io/docs/luigi-core-api?section=getcurrentroute) has been added to the Luigi core API which as the name suggests returns the current Luigi route. + +#### getCurrentTheme in WC Client + +The method [getCurrentTheme](https://docs.luigi-project.io/docs/luigi-core-api?section=getcurrenttheme) is now part of the core API so you can now use it in the WebComponent client too. + + +#### Fix Top Nav Children Not Rendered + +Fixed issue where nodes weren't rendered in the top navigation under certain conditions. + +#### Bugfixes + +For a full list of bugfixes in this release, see our [changelog](https://github.com/SAP/luigi/blob/main/CHANGELOG.md). \ No newline at end of file diff --git a/client-frameworks-support/client-support-angular/package-lock.json b/client-frameworks-support/client-support-angular/package-lock.json index 229eb46a2d..51f471dbc3 100644 --- a/client-frameworks-support/client-support-angular/package-lock.json +++ b/client-frameworks-support/client-support-angular/package-lock.json @@ -29,6 +29,7 @@ "@types/jasmine": "~3.6.0", "@types/node": "^12.11.1", "codelyzer": "^6.0.0", + "engine.io": "~6.5.5", "jasmine-core": "~3.8.0", "jasmine-spec-reporter": "~5.0.0", "karma": "~6.3.16", @@ -37,9 +38,11 @@ "karma-jasmine": "~4.0.0", "karma-jasmine-html-reporter": "^1.7.0", "ng-packagr": "^14.2.2", + "socket.io-adapter": "~2.5.5", "ts-node": "~8.3.0", "tslint": "~6.1.0", - "typescript": "~4.6.4" + "typescript": "~4.6.4", + "ws": "~8.17.1" }, "engines": { "node": ">=18.19.1" @@ -5292,10 +5295,11 @@ } }, "node_modules/engine.io": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.5.4.tgz", - "integrity": "sha512-KdVSDKhVKyOi+r5uEabrDLZw2qXStVvCsEB/LN3mw4WFi6Gx50jTyuxYVCwAAC0U46FdnzP/ScKRBTXb/NiEOg==", + "version": "6.5.5", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.5.5.tgz", + "integrity": "sha512-C5Pn8Wk+1vKBoHghJODM63yk8MvrO9EWZUfkAt5HAqIgPE4/8FF0PEGHXtEd40l223+cE5ABWuPzm38PHFXfMA==", "dev": true, + "license": "MIT", "dependencies": { "@types/cookie": "^0.4.1", "@types/cors": "^2.8.12", @@ -5306,7 +5310,7 @@ "cors": "~2.8.5", "debug": "~4.3.1", "engine.io-parser": "~5.2.1", - "ws": "~8.11.0" + "ws": "~8.17.1" }, "engines": { "node": ">=10.2.0" @@ -10674,9 +10678,9 @@ } }, "node_modules/rollup": { - "version": "2.79.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz", - "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==", + "version": "2.79.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.2.tgz", + "integrity": "sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==", "dev": true, "bin": { "rollup": "dist/bin/rollup" @@ -11251,13 +11255,14 @@ } }, "node_modules/socket.io-adapter": { - "version": "2.5.4", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.4.tgz", - "integrity": "sha512-wDNHGXGewWAjQPt3pyeYBtpWSq9cLE5UW1ZUPL/2eGK9jtse/FpXib7epSTsz0Q0m+6sg6Y4KtcFTlah1bdOVg==", + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.5.tgz", + "integrity": "sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg==", "dev": true, + "license": "MIT", "dependencies": { "debug": "~4.3.4", - "ws": "~8.11.0" + "ws": "~8.17.1" } }, "node_modules/socket.io-parser": { @@ -12758,16 +12763,17 @@ "dev": true }, "node_modules/ws": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", - "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", + "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=10.0.0" }, "peerDependencies": { "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" + "utf-8-validate": ">=5.0.2" }, "peerDependenciesMeta": { "bufferutil": { diff --git a/client-frameworks-support/client-support-angular/package.json b/client-frameworks-support/client-support-angular/package.json index c5bffe833e..3e41b843de 100644 --- a/client-frameworks-support/client-support-angular/package.json +++ b/client-frameworks-support/client-support-angular/package.json @@ -34,6 +34,7 @@ "@types/jasmine": "~3.6.0", "@types/node": "^12.11.1", "codelyzer": "^6.0.0", + "engine.io": "~6.5.5", "jasmine-core": "~3.8.0", "jasmine-spec-reporter": "~5.0.0", "karma": "~6.3.16", @@ -42,9 +43,11 @@ "karma-jasmine": "~4.0.0", "karma-jasmine-html-reporter": "^1.7.0", "ng-packagr": "^14.2.2", + "socket.io-adapter": "~2.5.5", "ts-node": "~8.3.0", "tslint": "~6.1.0", - "typescript": "~4.6.4" + "typescript": "~4.6.4", + "ws": "~8.17.1" }, "engines": { "node": ">=18.19.1" diff --git a/client-frameworks-support/client-support-angular/projects/client-support-angular/package.json b/client-frameworks-support/client-support-angular/projects/client-support-angular/package.json index c21f039d00..b474112439 100644 --- a/client-frameworks-support/client-support-angular/projects/client-support-angular/package.json +++ b/client-frameworks-support/client-support-angular/projects/client-support-angular/package.json @@ -22,5 +22,5 @@ "@luigi-project/client": "^2.0.0", "@luigi-project/testing-utilities": "^2.0.0" }, - "version": "2.15.0" + "version": "2.17.0" } \ No newline at end of file diff --git a/client-frameworks-support/client-support-ui5/package-lock.json b/client-frameworks-support/client-support-ui5/package-lock.json index 28046e61e6..cb61ea47c4 100644 --- a/client-frameworks-support/client-support-ui5/package-lock.json +++ b/client-frameworks-support/client-support-ui5/package-lock.json @@ -12,8 +12,8 @@ "@luigi-project/client": "^2.7.3" }, "devDependencies": { - "rollup": "^3.15.0", - "rollup-plugin-copy": "^3.4.0" + "rollup": "^4.22.5", + "rollup-plugin-copy": "^3.5.0" }, "engines": { "node": ">=18.19.1" @@ -59,6 +59,237 @@ "node": ">= 8" } }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.22.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.22.5.tgz", + "integrity": "sha512-SU5cvamg0Eyu/F+kLeMXS7GoahL+OoizlclVFX3l5Ql6yNlywJJ0OuqTzUx0v+aHhPHEB/56CT06GQrRrGNYww==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.22.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.22.5.tgz", + "integrity": "sha512-S4pit5BP6E5R5C8S6tgU/drvgjtYW76FBuG6+ibG3tMvlD1h9LHVF9KmlmaUBQ8Obou7hEyS+0w+IR/VtxwNMQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.22.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.22.5.tgz", + "integrity": "sha512-250ZGg4ipTL0TGvLlfACkIxS9+KLtIbn7BCZjsZj88zSg2Lvu3Xdw6dhAhfe/FjjXPVNCtcSp+WZjVsD3a/Zlw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.22.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.22.5.tgz", + "integrity": "sha512-D8brJEFg5D+QxFcW6jYANu+Rr9SlKtTenmsX5hOSzNYVrK5oLAEMTUgKWYJP+wdKyCdeSwnapLsn+OVRFycuQg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.22.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.22.5.tgz", + "integrity": "sha512-PNqXYmdNFyWNg0ma5LdY8wP+eQfdvyaBAojAXgO7/gs0Q/6TQJVXAXe8gwW9URjbS0YAammur0fynYGiWsKlXw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.22.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.22.5.tgz", + "integrity": "sha512-kSSCZOKz3HqlrEuwKd9TYv7vxPYD77vHSUvM2y0YaTGnFc8AdI5TTQRrM1yIp3tXCKrSL9A7JLoILjtad5t8pQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.22.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.22.5.tgz", + "integrity": "sha512-oTXQeJHRbOnwRnRffb6bmqmUugz0glXaPyspp4gbQOPVApdpRrY/j7KP3lr7M8kTfQTyrBUzFjj5EuHAhqH4/w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.22.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.22.5.tgz", + "integrity": "sha512-qnOTIIs6tIGFKCHdhYitgC2XQ2X25InIbZFor5wh+mALH84qnFHvc+vmWUpyX97B0hNvwNUL4B+MB8vJvH65Fw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.22.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.22.5.tgz", + "integrity": "sha512-TMYu+DUdNlgBXING13rHSfUc3Ky5nLPbWs4bFnT+R6Vu3OvXkTkixvvBKk8uO4MT5Ab6lC3U7x8S8El2q5o56w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.22.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.22.5.tgz", + "integrity": "sha512-PTQq1Kz22ZRvuhr3uURH+U/Q/a0pbxJoICGSprNLAoBEkyD3Sh9qP5I0Asn0y0wejXQBbsVMRZRxlbGFD9OK4A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.22.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.22.5.tgz", + "integrity": "sha512-bR5nCojtpuMss6TDEmf/jnBnzlo+6n1UhgwqUvRoe4VIotC7FG1IKkyJbwsT7JDsF2jxR+NTnuOwiGv0hLyDoQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.22.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.22.5.tgz", + "integrity": "sha512-N0jPPhHjGShcB9/XXZQWuWBKZQnC1F36Ce3sDqWpujsGjDz/CQtOL9LgTrJ+rJC8MJeesMWrMWVLKKNR/tMOCA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.22.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.22.5.tgz", + "integrity": "sha512-uBa2e28ohzNNwjr6Uxm4XyaA1M/8aTgfF2T7UIlElLaeXkgpmIJ2EitVNQxjO9xLLLy60YqAgKn/AqSpCUkE9g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.22.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.22.5.tgz", + "integrity": "sha512-RXT8S1HP8AFN/Kr3tg4fuYrNxZ/pZf1HemC5Tsddc6HzgGnJm0+Lh5rAHJkDuW3StI0ynNXukidROMXYl6ew8w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.22.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.22.5.tgz", + "integrity": "sha512-ElTYOh50InL8kzyUD6XsnPit7jYCKrphmddKAe1/Ytt74apOxDq5YEcbsiKs0fR3vff3jEneMM+3I7jbqaMyBg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.22.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.22.5.tgz", + "integrity": "sha512-+lvL/4mQxSV8MukpkKyyvfwhH266COcWlXE/1qxwN08ajovta3459zrjLghYMgDerlzNwLAcFpvU+WWE5y6nAQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@types/estree": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/fs-extra": { "version": "8.1.2", "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-8.1.2.tgz", @@ -456,26 +687,47 @@ } }, "node_modules/rollup": { - "version": "3.15.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.15.0.tgz", - "integrity": "sha512-F9hrCAhnp5/zx/7HYmftvsNBkMfLfk/dXUh73hPSM2E3CRgap65orDNJbLetoiUFwSAk6iHPLvBrZ5iHYvzqsg==", + "version": "4.22.5", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.22.5.tgz", + "integrity": "sha512-WoinX7GeQOFMGznEcWA1WrTQCd/tpEbMkc3nuMs9BT0CPjMdSjPMTVClwWd4pgSQwJdP65SK9mTCNvItlr5o7w==", "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.6" + }, "bin": { "rollup": "dist/bin/rollup" }, "engines": { - "node": ">=14.18.0", + "node": ">=18.0.0", "npm": ">=8.0.0" }, "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.22.5", + "@rollup/rollup-android-arm64": "4.22.5", + "@rollup/rollup-darwin-arm64": "4.22.5", + "@rollup/rollup-darwin-x64": "4.22.5", + "@rollup/rollup-linux-arm-gnueabihf": "4.22.5", + "@rollup/rollup-linux-arm-musleabihf": "4.22.5", + "@rollup/rollup-linux-arm64-gnu": "4.22.5", + "@rollup/rollup-linux-arm64-musl": "4.22.5", + "@rollup/rollup-linux-powerpc64le-gnu": "4.22.5", + "@rollup/rollup-linux-riscv64-gnu": "4.22.5", + "@rollup/rollup-linux-s390x-gnu": "4.22.5", + "@rollup/rollup-linux-x64-gnu": "4.22.5", + "@rollup/rollup-linux-x64-musl": "4.22.5", + "@rollup/rollup-win32-arm64-msvc": "4.22.5", + "@rollup/rollup-win32-ia32-msvc": "4.22.5", + "@rollup/rollup-win32-x64-msvc": "4.22.5", "fsevents": "~2.3.2" } }, "node_modules/rollup-plugin-copy": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/rollup-plugin-copy/-/rollup-plugin-copy-3.4.0.tgz", - "integrity": "sha512-rGUmYYsYsceRJRqLVlE9FivJMxJ7X6jDlP79fmFkL8sJs7VVMSVyA2yfyL+PGyO/vJs4A87hwhgVfz61njI+uQ==", + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-copy/-/rollup-plugin-copy-3.5.0.tgz", + "integrity": "sha512-wI8D5dvYovRMx/YYKtUNt3Yxaw4ORC9xo6Gt9t22kveWz1enG9QrhVlagzwrxSC455xD1dHMKhIJkbsQ7d48BA==", "dev": true, + "license": "MIT", "dependencies": { "@types/fs-extra": "^8.0.1", "colorette": "^1.1.0", diff --git a/client-frameworks-support/client-support-ui5/package.json b/client-frameworks-support/client-support-ui5/package.json index eecb26146a..3506b268a7 100644 --- a/client-frameworks-support/client-support-ui5/package.json +++ b/client-frameworks-support/client-support-ui5/package.json @@ -7,14 +7,14 @@ "type": "module", "scripts": { "bundle": "npm run build", - "build": "rollup --config" + "build": "rollup --config --bundleConfigAsCjs" }, "dependencies": { "@luigi-project/client": "^2.7.3" }, "devDependencies": { - "rollup": "^3.15.0", - "rollup-plugin-copy": "^3.4.0" + "rollup": "^4.22.5", + "rollup-plugin-copy": "^3.5.0" }, "repository": { "type": "git", diff --git a/client-frameworks-support/testing-utilities/dist/package.json b/client-frameworks-support/testing-utilities/dist/package.json index 885c46bab8..5c583d89fe 100644 --- a/client-frameworks-support/testing-utilities/dist/package.json +++ b/client-frameworks-support/testing-utilities/dist/package.json @@ -19,7 +19,7 @@ "microfrontends", "testing" ], - "version": "2.15.0", + "version": "2.17.0", "engines": { "node": ">=18.19.1" } diff --git a/client-frameworks-support/testing-utilities/package-lock.json b/client-frameworks-support/testing-utilities/package-lock.json index 26aa683c42..08cbcd4437 100644 --- a/client-frameworks-support/testing-utilities/package-lock.json +++ b/client-frameworks-support/testing-utilities/package-lock.json @@ -1,12 +1,12 @@ { "name": "@luigi-project/testing-utilities", - "version": "2.15.0", + "version": "2.17.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@luigi-project/testing-utilities", - "version": "2.15.0", + "version": "2.17.0", "license": "Apache-2.0", "devDependencies": { "ncp": "^2.0.0", diff --git a/client-frameworks-support/testing-utilities/package.json b/client-frameworks-support/testing-utilities/package.json index 96eee47400..0ca54a6c89 100644 --- a/client-frameworks-support/testing-utilities/package.json +++ b/client-frameworks-support/testing-utilities/package.json @@ -29,7 +29,7 @@ "microfrontends", "testing" ], - "version": "2.15.0", + "version": "2.17.0", "engines": { "node": ">=18.19.1" } diff --git a/client/luigi-client-wc-docu-mixin.js b/client/luigi-client-wc-docu-mixin.js new file mode 100644 index 0000000000..e9c52d4839 --- /dev/null +++ b/client/luigi-client-wc-docu-mixin.js @@ -0,0 +1,62 @@ +/** + * + * Publish an event that can be listened to from the container host. + * + * Similar to {@link luigi-client-api.md#sendCustomMessage sendCustomMessage} but for WebComponent based microfrontends only. + * + * @param {CustomEvent} event Custom event to be published + * @memberof Lifecycle + * + * @example + * // case 1: publish an event from a WC based microfrontend + * + * // wcComponent.js + * // sending a message to parent host + * this.LuigiClient.publishEvent(new CustomEvent('sendSomeMsg', { detail: 'My own message' })); + * + * // host.html + * myContainer.addEventListener('custom-message', event => { + * console.log('My custom message from the microfrontend', event.detail.data); + * } + * + * // case 2: publish an event from a compound microfrontend + * + * // secondChild.js + * // Set the custom event name = 'sendInput' and + * // send a message to its parent (main.html) and sibling (firstChild.js) + * this.LuigiClient.publishEvent(new CustomEvent('sendInput', { detail: 'My own message' })); + * + * // main.html + * myContainer.addEventListener('custom-message', event => { + * console.log('My custom message from microfrontend', event.detail.data); + * } + * + * // Note: eventListeners.name must match CustomEvent name above + * // eventListeners.source = input1 = id of secondChild.js, which is where the message being sent from + * compoundConfig = { + * ... + * children: [ + * { + * viewUrl: 'firstChild.js' + * ... + * eventListeners: [ + * { + * source: 'input1', + * name: 'sendInput', + * action: 'update', + * dataConverter: data => { + * console.log( + * 'dataConverter(): Received Custom Message from "input1" MF ' + data + * ); + * return 'new text: ' + data; + * } + * } + * ] + * }, + * { + * viewUrl: 'secondChild.js', + * id: 'input1', + * } + * + */ +export function publishEvent(event) {} diff --git a/client/luigi-client.d.ts b/client/luigi-client.d.ts index b40368e043..0215750fc3 100644 --- a/client/luigi-client.d.ts +++ b/client/luigi-client.d.ts @@ -594,10 +594,14 @@ export declare interface StorageManager { /** * Registers a listener called with the context object and the Luigi Core domain as soon as Luigi is instantiated. Defer your application bootstrap if you depend on authentication data coming from Luigi. * @param {Lifecycle~initListenerCallback} initFn the function that is called once Luigi is initialized, receives current context and origin as parameters + * @param {boolean} disableTpcCheck if set to `true` third party cookie check will be disabled via LuigiClient. * @memberof Lifecycle */ -export function addInitListener(initFn: (context: Context, origin?: string) => void): number; -export type addInitListener = (initFn: (context: Context, origin?: string) => void) => number; +export function addInitListener(initFn: (context: Context, origin?: string) => void, disableTpcCheck?: boolean): number; +export type addInitListener = ( + initFn: (context: Context, origin?: string) => void, + disableTpcCheck?: boolean +) => number; /** * Callback of the addInitListener diff --git a/client/package-lock.json b/client/package-lock.json index 9b31d7081b..9c6a1be430 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -22,7 +22,7 @@ "mixin-deep": ">=1.3.2", "serialize-javascript": ">=3.1.0", "set-value": ">=4.0.1", - "webpack": "^5.89.0", + "webpack": "^5.94.0", "webpack-cli": "^5.1.4" }, "engines": { @@ -1706,33 +1706,36 @@ } }, "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/source-map": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", - "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", "dev": true, + "license": "MIT", "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" } }, "node_modules/@jridgewell/source-map/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", "dev": true, + "license": "MIT", "dependencies": { - "@jridgewell/set-array": "^1.0.1", + "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { "node": ">=6.0.0" @@ -1745,40 +1748,22 @@ "dev": true }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.17", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", - "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" - } - }, - "node_modules/@types/eslint": { - "version": "8.21.1", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.21.1.tgz", - "integrity": "sha512-rc9K8ZpVjNcLs8Fp0dkozd5Pt2Apk1glO4Vgz8ix1u6yFByxfqo5Yavpy65o+93TAe24jr7v+eSBtFLvOQtCRQ==", - "dev": true, - "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "node_modules/@types/eslint-scope": { - "version": "3.7.4", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", - "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dev": true, + "license": "MIT", "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, "node_modules/@types/estree": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/json-schema": { "version": "7.0.11", @@ -1787,19 +1772,21 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.10.4", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.4.tgz", - "integrity": "sha512-D08YG6rr8X90YB56tSIuBaddy/UXAA9RKJoFvrsnogAum/0pmjkgi4+2nx96A330FmioegBWmEYQ+syqCFaveg==", + "version": "22.5.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.5.2.tgz", + "integrity": "sha512-acJsPTEqYqulZS/Yp/S3GgeE6GZ0qYODUR8aVr/DkhHQ8l9nd4j5x1/ZJy9/gHrRlFMqkO6i0I3E27Alu4jjPg==", "dev": true, + "license": "MIT", "dependencies": { - "undici-types": "~5.26.4" + "undici-types": "~6.19.2" } }, "node_modules/@webassemblyjs/ast": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", - "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", + "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", "dev": true, + "license": "MIT", "dependencies": { "@webassemblyjs/helper-numbers": "1.11.6", "@webassemblyjs/helper-wasm-bytecode": "1.11.6" @@ -1809,25 +1796,29 @@ "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@webassemblyjs/helper-api-error": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", - "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==", - "dev": true + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", + "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==", + "dev": true, + "license": "MIT" }, "node_modules/@webassemblyjs/helper-numbers": { "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", "dev": true, + "license": "MIT", "dependencies": { "@webassemblyjs/floating-point-hex-parser": "1.11.6", "@webassemblyjs/helper-api-error": "1.11.6", @@ -1838,18 +1829,20 @@ "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", - "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", + "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", "dev": true, + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6" + "@webassemblyjs/wasm-gen": "1.12.1" } }, "node_modules/@webassemblyjs/ieee754": { @@ -1857,6 +1850,7 @@ "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", "dev": true, + "license": "MIT", "dependencies": { "@xtuc/ieee754": "^1.2.0" } @@ -1866,6 +1860,7 @@ "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@xtuc/long": "4.2.2" } @@ -1874,31 +1869,34 @@ "version": "1.11.6", "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", - "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz", + "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==", "dev": true, + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/helper-wasm-section": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-opt": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6", - "@webassemblyjs/wast-printer": "1.11.6" + "@webassemblyjs/helper-wasm-section": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-opt": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1", + "@webassemblyjs/wast-printer": "1.12.1" } }, "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", - "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz", + "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==", "dev": true, + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/ast": "1.12.1", "@webassemblyjs/helper-wasm-bytecode": "1.11.6", "@webassemblyjs/ieee754": "1.11.6", "@webassemblyjs/leb128": "1.11.6", @@ -1906,24 +1904,26 @@ } }, "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", - "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz", + "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==", "dev": true, + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6" + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1" } }, "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", - "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz", + "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==", "dev": true, + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/ast": "1.12.1", "@webassemblyjs/helper-api-error": "1.11.6", "@webassemblyjs/helper-wasm-bytecode": "1.11.6", "@webassemblyjs/ieee754": "1.11.6", @@ -1932,12 +1932,13 @@ } }, "node_modules/@webassemblyjs/wast-printer": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", - "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz", + "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==", "dev": true, + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/ast": "1.12.1", "@xtuc/long": "4.2.2" } }, @@ -1989,13 +1990,15 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true + "dev": true, + "license": "BSD-3-Clause" }, "node_modules/@xtuc/long": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true + "dev": true, + "license": "Apache-2.0" }, "node_modules/acorn": { "version": "8.8.2", @@ -2009,11 +2012,12 @@ "node": ">=0.4.0" } }, - "node_modules/acorn-import-assertions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", - "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "node_modules/acorn-import-attributes": { + "version": "1.9.5", + "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", + "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", "dev": true, + "license": "MIT", "peerDependencies": { "acorn": "^8" } @@ -2190,9 +2194,9 @@ } }, "node_modules/browserslist": { - "version": "4.21.5", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", - "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", + "version": "4.23.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz", + "integrity": "sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==", "dev": true, "funding": [ { @@ -2202,13 +2206,18 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001449", - "electron-to-chromium": "^1.4.284", - "node-releases": "^2.0.8", - "update-browserslist-db": "^1.0.10" + "caniuse-lite": "^1.0.30001646", + "electron-to-chromium": "^1.5.4", + "node-releases": "^2.0.18", + "update-browserslist-db": "^1.1.0" }, "bin": { "browserslist": "cli.js" @@ -2247,9 +2256,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001566", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001566.tgz", - "integrity": "sha512-ggIhCsTxmITBAMmK8yZjEhCO5/47jKXPu6Dha/wuCS4JePVL+3uiDEBuhu2aIoT+bqTOR8L76Ip1ARL9xYsEJA==", + "version": "1.0.30001655", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001655.tgz", + "integrity": "sha512-jRGVy3iSGO5Uutn2owlb5gR6qsGngTw9ZTb4ali9f3glshcNmJ2noam4Mo9zia5P9Dk3jNNydy7vQjuE5dQmfg==", "dev": true, "funding": [ { @@ -2264,7 +2273,8 @@ "type": "github", "url": "https://github.com/sponsors/ai" } - ] + ], + "license": "CC-BY-4.0" }, "node_modules/chalk": { "version": "2.4.2", @@ -2334,7 +2344,8 @@ "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/commondir": { "version": "1.0.1", @@ -2666,10 +2677,11 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.299", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.299.tgz", - "integrity": "sha512-lQ7ijJghH6pCGbfWXr6EY+KYCMaRSjgsY925r1p/TlpSfVM1VjHTcn1gAc15VM4uwti283X6QtjPTXdpoSGiZQ==", - "dev": true + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.13.tgz", + "integrity": "sha512-lbBcvtIJ4J6sS4tb5TLp1b4LyfCdMkwStzXPyAgVgTRAsep4bvrAGaBOP7ZJtQMNJpSQ9SqG4brWOroNaQtm7Q==", + "dev": true, + "license": "ISC" }, "node_modules/emojis-list": { "version": "3.0.0", @@ -2690,10 +2702,11 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", - "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", + "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", "dev": true, + "license": "MIT", "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" @@ -2721,10 +2734,11 @@ "dev": true }, "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -2955,7 +2969,8 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "dev": true + "dev": true, + "license": "BSD-2-Clause" }, "node_modules/globals": { "version": "11.12.0", @@ -2984,10 +2999,11 @@ } }, "node_modules/graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "dev": true + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" }, "node_modules/has": { "version": "1.0.3", @@ -3161,6 +3177,7 @@ "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*", "merge-stream": "^2.0.0", @@ -3175,6 +3192,7 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -3184,6 +3202,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -3320,7 +3339,8 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/mime-db": { "version": "1.52.0", @@ -3433,10 +3453,11 @@ "dev": true }, "node_modules/node-releases": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", - "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==", - "dev": true + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", + "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", + "dev": true, + "license": "MIT" }, "node_modules/normalize-path": { "version": "3.0.0", @@ -3555,10 +3576,11 @@ } }, "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", + "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==", + "dev": true, + "license": "ISC" }, "node_modules/pify": { "version": "3.0.0", @@ -3906,6 +3928,7 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -3915,6 +3938,7 @@ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "dev": true, + "license": "MIT", "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -3983,15 +4007,17 @@ "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/terser": { - "version": "5.26.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.26.0.tgz", - "integrity": "sha512-dytTGoE2oHgbNV9nTzgBEPaqAWvcJNl66VZ0BkJqlvp71IjO8CxdBx/ykCNb47cLnCmCvRZ6ZR0tLkqvZCdVBQ==", + "version": "5.31.6", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.31.6.tgz", + "integrity": "sha512-PQ4DAriWzKj+qgehQ7LK5bQqCFNMmlhjR2PFFLuqGCpuCAauxemVBWwWOxo3UIwWQx8+Pr61Df++r76wDmkQBg==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.8.2", @@ -4006,16 +4032,17 @@ } }, "node_modules/terser-webpack-plugin": { - "version": "5.3.9", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz", - "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==", + "version": "5.3.10", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", + "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", "dev": true, + "license": "MIT", "dependencies": { - "@jridgewell/trace-mapping": "^0.3.17", + "@jridgewell/trace-mapping": "^0.3.20", "jest-worker": "^27.4.5", "schema-utils": "^3.1.1", "serialize-javascript": "^6.0.1", - "terser": "^5.16.8" + "terser": "^5.26.0" }, "engines": { "node": ">= 10.13.0" @@ -4044,6 +4071,7 @@ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", "dev": true, + "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", @@ -4083,10 +4111,11 @@ "dev": true }, "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", - "dev": true + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "dev": true, + "license": "MIT" }, "node_modules/unicode-canonical-property-names-ecmascript": { "version": "2.0.0", @@ -4147,9 +4176,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", - "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", + "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", "dev": true, "funding": [ { @@ -4159,14 +4188,19 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" + "escalade": "^3.1.2", + "picocolors": "^1.0.1" }, "bin": { - "browserslist-lint": "cli.js" + "update-browserslist-db": "cli.js" }, "peerDependencies": { "browserslist": ">= 4.21.0" @@ -4198,10 +4232,11 @@ } }, "node_modules/watchpack": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", - "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", + "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==", "dev": true, + "license": "MIT", "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" @@ -4211,34 +4246,34 @@ } }, "node_modules/webpack": { - "version": "5.89.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.89.0.tgz", - "integrity": "sha512-qyfIC10pOr70V+jkmud8tMfajraGCZMBWJtrmuBymQKCrLTRejBI8STDp1MCyZu/QTdZSeacCQYpYNQVOzX5kw==", + "version": "5.94.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.94.0.tgz", + "integrity": "sha512-KcsGn50VT+06JH/iunZJedYGUJS5FGjow8wb9c0v5n1Om8O1g4L6LjtfxwlXIATopoQu+vOXXa7gYisWxCoPyg==", "dev": true, + "license": "MIT", "dependencies": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^1.0.0", - "@webassemblyjs/ast": "^1.11.5", - "@webassemblyjs/wasm-edit": "^1.11.5", - "@webassemblyjs/wasm-parser": "^1.11.5", + "@types/estree": "^1.0.5", + "@webassemblyjs/ast": "^1.12.1", + "@webassemblyjs/wasm-edit": "^1.12.1", + "@webassemblyjs/wasm-parser": "^1.12.1", "acorn": "^8.7.1", - "acorn-import-assertions": "^1.9.0", - "browserslist": "^4.14.5", + "acorn-import-attributes": "^1.9.5", + "browserslist": "^4.21.10", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.15.0", + "enhanced-resolve": "^5.17.1", "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", + "graceful-fs": "^4.2.11", "json-parse-even-better-errors": "^2.3.1", "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", "schema-utils": "^3.2.0", "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.7", - "watchpack": "^2.4.0", + "terser-webpack-plugin": "^5.3.10", + "watchpack": "^2.4.1", "webpack-sources": "^3.2.3" }, "bin": { @@ -5587,30 +5622,30 @@ "dev": true }, "@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "dev": true }, "@jridgewell/source-map": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", - "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", "dev": true, "requires": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" }, "dependencies": { "@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", "dev": true, "requires": { - "@jridgewell/set-array": "^1.0.1", + "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/trace-mapping": "^0.3.24" } } } @@ -5622,33 +5657,13 @@ "dev": true }, "@jridgewell/trace-mapping": { - "version": "0.3.17", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", - "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", - "dev": true, - "requires": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" - } - }, - "@types/eslint": { - "version": "8.21.1", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.21.1.tgz", - "integrity": "sha512-rc9K8ZpVjNcLs8Fp0dkozd5Pt2Apk1glO4Vgz8ix1u6yFByxfqo5Yavpy65o+93TAe24jr7v+eSBtFLvOQtCRQ==", - "dev": true, - "requires": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "@types/eslint-scope": { - "version": "3.7.4", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", - "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dev": true, "requires": { - "@types/eslint": "*", - "@types/estree": "*" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, "@types/estree": { @@ -5664,18 +5679,18 @@ "dev": true }, "@types/node": { - "version": "20.10.4", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.4.tgz", - "integrity": "sha512-D08YG6rr8X90YB56tSIuBaddy/UXAA9RKJoFvrsnogAum/0pmjkgi4+2nx96A330FmioegBWmEYQ+syqCFaveg==", + "version": "22.5.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.5.2.tgz", + "integrity": "sha512-acJsPTEqYqulZS/Yp/S3GgeE6GZ0qYODUR8aVr/DkhHQ8l9nd4j5x1/ZJy9/gHrRlFMqkO6i0I3E27Alu4jjPg==", "dev": true, "requires": { - "undici-types": "~5.26.4" + "undici-types": "~6.19.2" } }, "@webassemblyjs/ast": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", - "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", + "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", "dev": true, "requires": { "@webassemblyjs/helper-numbers": "1.11.6", @@ -5695,9 +5710,9 @@ "dev": true }, "@webassemblyjs/helper-buffer": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", - "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", + "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==", "dev": true }, "@webassemblyjs/helper-numbers": { @@ -5718,15 +5733,15 @@ "dev": true }, "@webassemblyjs/helper-wasm-section": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", - "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", + "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6" + "@webassemblyjs/wasm-gen": "1.12.1" } }, "@webassemblyjs/ieee754": { @@ -5754,28 +5769,28 @@ "dev": true }, "@webassemblyjs/wasm-edit": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", - "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz", + "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/helper-wasm-section": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-opt": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6", - "@webassemblyjs/wast-printer": "1.11.6" + "@webassemblyjs/helper-wasm-section": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-opt": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1", + "@webassemblyjs/wast-printer": "1.12.1" } }, "@webassemblyjs/wasm-gen": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", - "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz", + "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/ast": "1.12.1", "@webassemblyjs/helper-wasm-bytecode": "1.11.6", "@webassemblyjs/ieee754": "1.11.6", "@webassemblyjs/leb128": "1.11.6", @@ -5783,24 +5798,24 @@ } }, "@webassemblyjs/wasm-opt": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", - "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz", + "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6" + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1" } }, "@webassemblyjs/wasm-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", - "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz", + "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/ast": "1.12.1", "@webassemblyjs/helper-api-error": "1.11.6", "@webassemblyjs/helper-wasm-bytecode": "1.11.6", "@webassemblyjs/ieee754": "1.11.6", @@ -5809,12 +5824,12 @@ } }, "@webassemblyjs/wast-printer": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", - "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz", + "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/ast": "1.12.1", "@xtuc/long": "4.2.2" } }, @@ -5857,10 +5872,10 @@ "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", "dev": true }, - "acorn-import-assertions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", - "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "acorn-import-attributes": { + "version": "1.9.5", + "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", + "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", "dev": true, "requires": {} }, @@ -5997,15 +6012,15 @@ } }, "browserslist": { - "version": "4.21.5", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", - "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", + "version": "4.23.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz", + "integrity": "sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001449", - "electron-to-chromium": "^1.4.284", - "node-releases": "^2.0.8", - "update-browserslist-db": "^1.0.10" + "caniuse-lite": "^1.0.30001646", + "electron-to-chromium": "^1.5.4", + "node-releases": "^2.0.18", + "update-browserslist-db": "^1.1.0" } }, "buffer-from": { @@ -6038,9 +6053,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001566", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001566.tgz", - "integrity": "sha512-ggIhCsTxmITBAMmK8yZjEhCO5/47jKXPu6Dha/wuCS4JePVL+3uiDEBuhu2aIoT+bqTOR8L76Ip1ARL9xYsEJA==", + "version": "1.0.30001655", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001655.tgz", + "integrity": "sha512-jRGVy3iSGO5Uutn2owlb5gR6qsGngTw9ZTb4ali9f3glshcNmJ2noam4Mo9zia5P9Dk3jNNydy7vQjuE5dQmfg==", "dev": true }, "chalk": { @@ -6361,9 +6376,9 @@ } }, "electron-to-chromium": { - "version": "1.4.299", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.299.tgz", - "integrity": "sha512-lQ7ijJghH6pCGbfWXr6EY+KYCMaRSjgsY925r1p/TlpSfVM1VjHTcn1gAc15VM4uwti283X6QtjPTXdpoSGiZQ==", + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.13.tgz", + "integrity": "sha512-lbBcvtIJ4J6sS4tb5TLp1b4LyfCdMkwStzXPyAgVgTRAsep4bvrAGaBOP7ZJtQMNJpSQ9SqG4brWOroNaQtm7Q==", "dev": true }, "emojis-list": { @@ -6382,9 +6397,9 @@ } }, "enhanced-resolve": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", - "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", + "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", "dev": true, "requires": { "graceful-fs": "^4.2.4", @@ -6404,9 +6419,9 @@ "dev": true }, "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "dev": true }, "escape-string-regexp": { @@ -6617,9 +6632,9 @@ } }, "graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "dev": true }, "has": { @@ -6966,9 +6981,9 @@ "dev": true }, "node-releases": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", - "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==", + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", + "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", "dev": true }, "normalize-path": { @@ -7061,9 +7076,9 @@ } }, "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", + "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==", "dev": true }, "pify": { @@ -7416,9 +7431,9 @@ "dev": true }, "terser": { - "version": "5.26.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.26.0.tgz", - "integrity": "sha512-dytTGoE2oHgbNV9nTzgBEPaqAWvcJNl66VZ0BkJqlvp71IjO8CxdBx/ykCNb47cLnCmCvRZ6ZR0tLkqvZCdVBQ==", + "version": "5.31.6", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.31.6.tgz", + "integrity": "sha512-PQ4DAriWzKj+qgehQ7LK5bQqCFNMmlhjR2PFFLuqGCpuCAauxemVBWwWOxo3UIwWQx8+Pr61Df++r76wDmkQBg==", "dev": true, "requires": { "@jridgewell/source-map": "^0.3.3", @@ -7428,16 +7443,16 @@ } }, "terser-webpack-plugin": { - "version": "5.3.9", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz", - "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==", + "version": "5.3.10", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", + "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", "dev": true, "requires": { - "@jridgewell/trace-mapping": "^0.3.17", + "@jridgewell/trace-mapping": "^0.3.20", "jest-worker": "^27.4.5", "schema-utils": "^3.1.1", "serialize-javascript": "^6.0.1", - "terser": "^5.16.8" + "terser": "^5.26.0" }, "dependencies": { "schema-utils": { @@ -7476,9 +7491,9 @@ "dev": true }, "undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", "dev": true }, "unicode-canonical-property-names-ecmascript": { @@ -7528,13 +7543,13 @@ } }, "update-browserslist-db": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", - "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", + "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", "dev": true, "requires": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" + "escalade": "^3.1.2", + "picocolors": "^1.0.1" } }, "uri-js": { @@ -7559,9 +7574,9 @@ "dev": true }, "watchpack": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", - "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", + "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==", "dev": true, "requires": { "glob-to-regexp": "^0.4.1", @@ -7569,34 +7584,33 @@ } }, "webpack": { - "version": "5.89.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.89.0.tgz", - "integrity": "sha512-qyfIC10pOr70V+jkmud8tMfajraGCZMBWJtrmuBymQKCrLTRejBI8STDp1MCyZu/QTdZSeacCQYpYNQVOzX5kw==", + "version": "5.94.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.94.0.tgz", + "integrity": "sha512-KcsGn50VT+06JH/iunZJedYGUJS5FGjow8wb9c0v5n1Om8O1g4L6LjtfxwlXIATopoQu+vOXXa7gYisWxCoPyg==", "dev": true, "requires": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^1.0.0", - "@webassemblyjs/ast": "^1.11.5", - "@webassemblyjs/wasm-edit": "^1.11.5", - "@webassemblyjs/wasm-parser": "^1.11.5", + "@types/estree": "^1.0.5", + "@webassemblyjs/ast": "^1.12.1", + "@webassemblyjs/wasm-edit": "^1.12.1", + "@webassemblyjs/wasm-parser": "^1.12.1", "acorn": "^8.7.1", - "acorn-import-assertions": "^1.9.0", - "browserslist": "^4.14.5", + "acorn-import-attributes": "^1.9.5", + "browserslist": "^4.21.10", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.15.0", + "enhanced-resolve": "^5.17.1", "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", + "graceful-fs": "^4.2.11", "json-parse-even-better-errors": "^2.3.1", "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", "schema-utils": "^3.2.0", "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.7", - "watchpack": "^2.4.0", + "terser-webpack-plugin": "^5.3.10", + "watchpack": "^2.4.1", "webpack-sources": "^3.2.3" }, "dependencies": { diff --git a/client/package.json b/client/package.json index 600173f667..21afb728af 100644 --- a/client/package.json +++ b/client/package.json @@ -30,7 +30,7 @@ "mixin-deep": ">=1.3.2", "serialize-javascript": ">=3.1.0", "set-value": ">=4.0.1", - "webpack": "^5.89.0", + "webpack": "^5.94.0", "webpack-cli": "^5.1.4" }, "engines": { diff --git a/client/public/package.json b/client/public/package.json index 4b187e953a..b2791aa3c1 100644 --- a/client/public/package.json +++ b/client/public/package.json @@ -17,5 +17,5 @@ "micro-frontends", "microfrontends" ], - "version": "2.15.0" + "version": "2.17.0" } \ No newline at end of file diff --git a/client/src/lifecycleManager.js b/client/src/lifecycleManager.js index ed62c0e1cd..f186c1b6d1 100644 --- a/client/src/lifecycleManager.js +++ b/client/src/lifecycleManager.js @@ -9,6 +9,7 @@ class LifecycleManager extends LuigiClientBase { /** @private */ constructor() { super(); + this.disableTpcCheck = false; this.luigiInitialized = false; this.defaultContextKeys = ['context', 'internal', 'nodeParams', 'pathParams', 'searchParams']; this.setCurrentContext( @@ -91,6 +92,7 @@ class LifecycleManager extends LuigiClientBase { helpers.setLuigiCoreDomain(e.origin); this.luigiInitialized = true; this._notifyInit(e.origin); + this._tpcCheck(); helpers.sendPostMessageToLuigiCore({ msg: 'luigi.init.ok' }); }); @@ -135,10 +137,12 @@ class LifecycleManager extends LuigiClientBase { }, '*' ); - this._tpcCheck(); } _tpcCheck() { + if (this.currentContext?.internal?.thirdPartyCookieCheck?.disabled || this.disableTpcCheck) { + return; + } let tpc = 'enabled'; let cookies = document.cookie; let luigiCookie; @@ -223,11 +227,13 @@ class LifecycleManager extends LuigiClientBase { /** * Registers a listener called with the context object and the Luigi Core domain as soon as Luigi is instantiated. Defer your application bootstrap if you depend on authentication data coming from Luigi. * @param {Lifecycle~initListenerCallback} initFn the function that is called once Luigi is initialized, receives current context and origin as parameters + * @param {boolean} disableTpcCheck if set to `true` third party cookie check will be disabled via LuigiClient. * @memberof Lifecycle * @example * const initListenerId = LuigiClient.addInitListener((context) => storeContextToMF(context)) */ - addInitListener(initFn) { + addInitListener(initFn, disableTpcCheck) { + this.disableTpcCheck = disableTpcCheck; const id = helpers.getRandomId(); this._onInitFns[id] = initFn; if (this.luigiInitialized && helpers.isFunction(initFn)) { @@ -391,7 +397,6 @@ class LifecycleManager extends LuigiClientBase { } /** - * * Returns a list of active feature toggles * @returns {Array} a list of feature toggle names * @memberof Lifecycle @@ -404,7 +409,6 @@ class LifecycleManager extends LuigiClientBase { } /** - * * Sets node parameters in Luigi Core. The parameters will be added to the URL. * @param {Object} params * @param {boolean} keepBrowserHistory @@ -423,7 +427,6 @@ class LifecycleManager extends LuigiClientBase { } /** - * * Returns the node parameters of the active URL. * Node parameters are defined like URL query parameters but with a specific prefix allowing Luigi to pass them to the micro frontend view. The default prefix is **~** and you can use it in the following way: `https://my.luigi.app/home/products?~sort=asc&~page=3`. * @@ -442,7 +445,6 @@ class LifecycleManager extends LuigiClientBase { } /** - * * Returns the dynamic path parameters of the active URL. * Path parameters are defined by navigation nodes with a dynamic **pathSegment** value starting with **:**, such as **productId**. * All path parameters in the current navigation path (as defined by the active URL) are returned. @@ -469,7 +471,7 @@ class LifecycleManager extends LuigiClientBase { } /** - * + * * Sends search query parameters to Luigi Core. The search parameters will be added to the URL if they are first allowed on a node level using {@link navigation-parameters-reference.md#clientpermissionsurlparameters clientPermissions.urlParameters}. * @param {Object} searchParams @@ -489,7 +491,6 @@ class LifecycleManager extends LuigiClientBase { } /** - * * Returns the current client permissions as specified in the navigation node or an empty object. For details, see [Node parameters](navigation-parameters-reference.md). * @returns {Object} client permissions as specified in the navigation node * @memberof Lifecycle @@ -501,6 +502,7 @@ class LifecycleManager extends LuigiClientBase { } /** + * * When the micro frontend is not embedded in the Luigi Core application and there is no init handshake you can set the target origin that is used in postMessage function calls by Luigi Client. Typically used only in custom micro-frontend frameworks that are compatible with LuigiClient API. * @param {string} origin target origin * @memberof Lifecycle @@ -513,6 +515,7 @@ class LifecycleManager extends LuigiClientBase { } /** + * * Sends a custom message to the Luigi Core application. * @param {Object} message an object containing data to be sent to the Luigi Core to process it further. This object is set as an input parameter of the custom message listener on the Luigi Core side * @param {string} message.id a string containing the message id @@ -529,7 +532,6 @@ class LifecycleManager extends LuigiClientBase { } /** - * * Returns the current user settings based on the selected node. * @returns {Object} current user settings * @since 1.7.1 @@ -542,7 +544,6 @@ class LifecycleManager extends LuigiClientBase { } /** - * * Returns the current anchor based on active URL. * @memberof Lifecycle * @since 1.21.0 @@ -555,7 +556,6 @@ class LifecycleManager extends LuigiClientBase { } /** - * * Sends anchor to Luigi Core. The anchor will be added to the URL. * @param {string} anchor * @since 1.21.0 @@ -571,7 +571,6 @@ class LifecycleManager extends LuigiClientBase { } /** - * * This function allows you to change node labels within the same {@link navigation-advanced.md#view-groups view group}, e.g. in your node config: `label: 'my Node {viewGroupData.vg1}'`. * @since 2.2.0 * @param {Object} data a data object containing the view group name and desired label diff --git a/client/src/linkManager.js b/client/src/linkManager.js index 89f84b2f57..7c6ddcbc4d 100644 --- a/client/src/linkManager.js +++ b/client/src/linkManager.js @@ -36,7 +36,6 @@ export class linkManager extends LuigiClientBase { } /** - * * Navigates to the given path in the application hosted by Luigi. It contains either a full absolute path or a relative path without a leading slash that uses the active route as a base. This is the standard navigation. * @memberof linkManager * @param {string} path path to be navigated to @@ -97,7 +96,6 @@ export class linkManager extends LuigiClientBase { } /** - * * Updates path of the modalPathParam when internal navigation occurs. * @memberof linkManager * @param {string} path @@ -125,7 +123,6 @@ export class linkManager extends LuigiClientBase { } /** - * * Offers an alternative way of navigating with intents. This involves specifying a semanticSlug and an object containing * parameters. * This method internally generates a URL of the form `#?intent=-?=` through the given @@ -158,7 +155,6 @@ export class linkManager extends LuigiClientBase { } /** - * * Opens a view in a modal. You can specify the modal's title and size. If you don't specify the title, it is the node label. If there is no node label, the title remains empty. The default size of the modal is `l`, which means 80%. You can also use `m` (60%) and `s` (40%) to set the modal size. Optionally, use it in combination with any of the navigation functions. * @memberof linkManager * @param {string} path navigation path @@ -195,8 +191,8 @@ export class linkManager extends LuigiClientBase { return modalPromise.promise; } - /** - * + /** + * * Updates the current title and size of a modal. If `routing.showModalPathInUrl` is set to `true`, the URL will be updated with the modal settings data. * In addition, you can specify if a new history entry will be created with the updated URL. * @memberof linkManager @@ -219,7 +215,6 @@ export class linkManager extends LuigiClientBase { } /** - * * Opens a view in a split view. You can specify the split view's title and size. If you don't specify the title, it is the node label. If there is no node label, the title remains empty. The default size of the split view is `40`, which means 40% height of the split view. * @memberof linkManager * @param {string} path navigation path @@ -239,7 +234,6 @@ export class linkManager extends LuigiClientBase { } /** - * * Opens a view in a drawer. You can specify the size of the drawer, whether the drawer has a header, and whether a backdrop is active in the background. By default, the header is shown. The backdrop is not visible and has to be activated. The size of the drawer is set to `s` by default, which means 25% of the micro frontend size. You can also use `l`(75%), `m`(50%) or `xs`(15.5%). Optionally, use it in combination with any of the navigation functions. * @memberof linkManager * @param {string} path navigation path @@ -258,7 +252,6 @@ export class linkManager extends LuigiClientBase { } /** - * * Sets the current navigation context to that of a specific parent node which has the {@link navigation-configuration.md navigationContext} field declared in the navigation configuration. This navigation context is then used by the `navigate` function. * @memberof linkManager * @param {string} navigationContext @@ -298,7 +291,6 @@ export class linkManager extends LuigiClientBase { } /** - * * Sets the current navigation base to the parent node that is defined as virtualTree. This method works only when the currently active micro frontend is inside a virtualTree. * @memberof linkManager * @returns {linkManager} link manager instance @@ -314,7 +306,6 @@ export class linkManager extends LuigiClientBase { } /** - * * Enables navigating to sibling nodes without knowing the absolute path. * @memberof linkManager * @returns {linkManager} link manager instance @@ -328,7 +319,6 @@ export class linkManager extends LuigiClientBase { } /** - * * Sends node parameters to the route. The parameters are used by the `navigate` function. Use it optionally in combination with any of the navigation functions and receive it as part of the context object in Luigi Client. * @memberof linkManager * @param {Object} nodeParams @@ -347,7 +337,7 @@ export class linkManager extends LuigiClientBase { } /** - * + * * Sets options to customise route changing behaviour. The parameters are used by the `navigate` function. Use it optionally in combination with any of the navigation functions and receive it as part of the context object in Luigi Client. * @memberof linkManager * @param {Object} options navigation options @@ -376,7 +366,6 @@ export class linkManager extends LuigiClientBase { /** @lends linkManager */ /** - * * Checks if the path you can navigate to exists in the main application. For example, you can use this helper method conditionally to display a DOM element like a button. * @memberof linkManager * @param {string} path path which existence you want to check @@ -432,7 +421,6 @@ export class linkManager extends LuigiClientBase { } /** - * * Checks if there is one or more preserved views. You can use it to show a **back** button. * @memberof linkManager * @returns {boolean} indicating if there is a preserved view you can return to @@ -442,7 +430,6 @@ export class linkManager extends LuigiClientBase { } /** - * * Discards the active view and navigates back to the last visited view. Works with preserved views, and also acts as the substitute of the browser **back** button. **goBackContext** is only available when using preserved views. * @memberof linkManager * @param {any} goBackValue data that is passed in the **goBackContext** field to the last visited view when using preserved views @@ -458,7 +445,7 @@ export class linkManager extends LuigiClientBase { } /** - * + * * Disables the navigation handling for a single navigation request. * It prevents Luigi Core from handling the URL change after `navigate()`. * Used for auto-navigation. @@ -473,6 +460,7 @@ export class linkManager extends LuigiClientBase { } /** + * * Enables navigating to a new tab. * @since 1.16.0 * @example @@ -484,7 +472,7 @@ export class linkManager extends LuigiClientBase { } /** - * + * * Keeps the URL's query parameters for a navigation request. * @param {boolean} preserve By default, it is set to `false`. If it is set to `true`, the URL's query parameters will be kept after navigation. * @since 1.19.0 @@ -498,7 +486,6 @@ export class linkManager extends LuigiClientBase { } /** - * * Gets the luigi route associated with the current micro frontend. * @returns {promise} a promise which resolves to a String value specifying the current luigi route * @since 1.23.0 diff --git a/client/src/luigi-client.js b/client/src/luigi-client.js index 9e6be7adbf..e275a5d0d3 100644 --- a/client/src/luigi-client.js +++ b/client/src/luigi-client.js @@ -26,8 +26,8 @@ class LuigiClient { } } - addInitListener(initFn) { - return lifecycleManager.addInitListener(initFn); + addInitListener(initFn, disableTpcCheck) { + return lifecycleManager.addInitListener(initFn, disableTpcCheck); } removeInitListener(id) { return lifecycleManager.removeInitListener(id); @@ -105,7 +105,6 @@ class LuigiClient { return lifecycleManager.setViewGroupData(value); } - /** * @private */ diff --git a/client/src/storageManager.js b/client/src/storageManager.js index 2a7a8a1385..03323f22fe 100644 --- a/client/src/storageManager.js +++ b/client/src/storageManager.js @@ -4,6 +4,7 @@ import { helpers } from './helpers'; const pendingOperation = new Map(); /** + * * StorageManager allows you to use browser local storage of key/values. Every storage operation is sent to be managed by Luigi Core. * The idea is that different micro frontends can share or persist items using local storage, as long as they come from the same domain and follow the [same-origin policy](https://developer.mozilla.org/en-US/docs/Web/Security/Same-origin_policy). * Since all storage operations are asynchronous (sending an event to Luigi Core that will reply once operation is finished), all the methods return Promises. diff --git a/client/src/uxManager.js b/client/src/uxManager.js index e4bb677745..47d12f85c5 100644 --- a/client/src/uxManager.js +++ b/client/src/uxManager.js @@ -19,7 +19,6 @@ class UxManager extends LuigiClientBase { } /** - * * Adds a backdrop with a loading indicator for the micro frontend frame. This overrides the {@link navigation-parameters-reference.md#node-parameters loadingIndicator.enabled} setting. * @memberof uxManager */ @@ -28,7 +27,6 @@ class UxManager extends LuigiClientBase { } /** - * * Removes the loading indicator. Use it after calling {@link #showLoadingIndicator showLoadingIndicator()} or to hide the indicator when you use the {@link navigation-parameters-reference.md#node-parameters loadingIndicator.hideAutomatically: false} node configuration. * @memberof uxManager */ @@ -37,7 +35,6 @@ class UxManager extends LuigiClientBase { } /** - * * Closes the currently opened micro frontend modal. * @memberof uxManager */ @@ -46,7 +43,6 @@ class UxManager extends LuigiClientBase { } /** - * * Adds a backdrop to block the top and side navigation. It is based on the Fundamental UI Modal, which you can use in your micro frontend to achieve the same behavior. * @memberof uxManager */ @@ -55,7 +51,6 @@ class UxManager extends LuigiClientBase { } /** - * * Removes the backdrop. * @memberof uxManager */ @@ -64,7 +59,6 @@ class UxManager extends LuigiClientBase { } /** - * * This method informs the main application that there are unsaved changes in the current view in the iframe. It can be used to prevent navigation away from the current view, for example with form fields which were edited but not submitted. However, this functionality is not restricted to forms. If you use `withoutSync()` together with `setDirtyStatus()`, this is a special case in which the dirty state logic needs to be handled by the micro frontend. For example, if the user navigates with an Angular router, which would trigger `withoutSync()`, Angular needs to take care about dirty state, prevent the navigation and ask for permission to navigate away, through `uxManager().showConfirmationModal(settings)`. * @param {boolean} isDirty indicates if there are any unsaved changes on the current page or in the component * @memberof uxManager @@ -77,7 +71,6 @@ class UxManager extends LuigiClientBase { } /** - * * Shows a confirmation modal. * @memberof uxManager * @param {Object} settings the settings of the confirmation modal. If you don't provide any value for any of the fields, a default value is used @@ -136,7 +129,6 @@ class UxManager extends LuigiClientBase { } /** - * * Shows an alert. * @memberof uxManager * @param {Object} settings the settings for the alert @@ -215,7 +207,6 @@ class UxManager extends LuigiClientBase { } /** - * * Gets the current locale. * @returns {string} current locale * @memberof uxManager @@ -225,7 +216,7 @@ class UxManager extends LuigiClientBase { } /** - * + * * Sets current locale to the specified one. * * **NOTE:** this must be explicitly allowed on the navigation node level by setting `clientPermissions.changeCurrentLocale` to `true`. (See {@link navigation-parameters-reference.md Node parameters}.) @@ -245,7 +236,7 @@ class UxManager extends LuigiClientBase { } /** - * + * * Checks if the current micro frontend is displayed inside a split view * @returns {boolean} indicating if it is loaded inside a split view * @memberof uxManager @@ -256,6 +247,7 @@ class UxManager extends LuigiClientBase { } /** + * * Checks if the current micro frontend is displayed inside a modal * @returns {boolean} indicating if it is loaded inside a modal * @memberof uxManager @@ -266,7 +258,7 @@ class UxManager extends LuigiClientBase { } /** - * + * * Checks if the current micro frontend is displayed inside a drawer * @returns {boolean} indicating if it is loaded inside a drawer * @memberof uxManager @@ -277,7 +269,6 @@ class UxManager extends LuigiClientBase { } /** - * * Gets the current theme. * @returns {*} current themeObj * @memberof uxManager @@ -287,7 +278,7 @@ class UxManager extends LuigiClientBase { } /** - * + * * Gets the CSS variables from Luigi Core with their key and value. * @returns {Object} CSS variables with their key and value. * @memberof uxManager @@ -299,7 +290,7 @@ class UxManager extends LuigiClientBase { } /** - * + * * Adds the CSS variables from Luigi Core in a \ No newline at end of file + diff --git a/container/src/LuigiContainer.svelte b/container/src/LuigiContainer.svelte index 625a97f7ea..86f9aa0d06 100644 --- a/container/src/LuigiContainer.svelte +++ b/container/src/LuigiContainer.svelte @@ -3,28 +3,29 @@ tag: null, shadow: 'none', props: { - viewurl: { type: 'String', reflect: false, attribute: 'viewurl' }, - deferInit: { type: 'Boolean', attribute: 'defer-init' }, - noShadow: { type: 'Boolean', attribute: 'no-shadow' }, - context: { type: 'String', reflect: false, attribute: 'context' }, - label: { type: 'String', reflect: false, attribute: 'label' }, - webcomponent: { type: 'String', reflect: false, attribute: 'webcomponent' }, - locale: { type: 'String', reflect: false, attribute: 'locale' }, - theme: { type: 'String', reflect: false, attribute: 'theme' }, activeFeatureToggleList: { type: 'Array', reflect: false, attribute: 'active-feature-toggle-list' }, - skipInitCheck: { type: 'Boolean', reflect: false, attribute: 'skip-init-check' }, - nodeParams: { type: 'Object', reflect: false, attribute: 'node-params' }, - userSettings: { type: 'Object', reflect: false, attribute: 'user-settings' }, + allowRules: { type: 'Array', reflect: false, attribute: 'allow-rules' }, anchor: { type: 'String', reflect: false, attribute: 'anchor' }, - searchParams: { type: 'Object', reflect: false, attribute: 'search-params' }, - pathParams: { type: 'Object', reflect: false, attribute: 'path-params' }, + authData: { type: 'Object', reflect: false, attribute: 'auth-data' }, clientPermissions: { type: 'Object', reflect: false, attribute: 'client-permissions' }, + context: { type: 'String', reflect: false, attribute: 'context' }, + deferInit: { type: 'Boolean', attribute: 'defer-init' }, dirtyStatus: { type: 'Boolean', reflect: false, attribute: 'dirty-status' }, - hasBack: { type: 'Boolean', reflect: false, attribute: 'has-back' }, documentTitle: { type: 'String', reflect: false, attribute: 'document-title' }, - allowRules: { type: 'Array', reflect: false, attribute: 'allow-rules' }, + hasBack: { type: 'Boolean', reflect: false, attribute: 'has-back' }, + label: { type: 'String', reflect: false, attribute: 'label' }, + locale: { type: 'String', reflect: false, attribute: 'locale' }, + noShadow: { type: 'Boolean', attribute: 'no-shadow' }, + nodeParams: { type: 'Object', reflect: false, attribute: 'node-params' }, + pathParams: { type: 'Object', reflect: false, attribute: 'path-params' }, sandboxRules: { type: 'Array', reflect: false, attribute: 'sandbox-rules' }, - authData: { type: 'Object', reflect: false, attribute: 'auth-data' } + searchParams: { type: 'Object', reflect: false, attribute: 'search-params' }, + skipCookieCheck: { type: 'String', reflect: false, attribute: 'skip-cookie-check' }, + skipInitCheck: { type: 'Boolean', reflect: false, attribute: 'skip-init-check' }, + theme: { type: 'String', reflect: false, attribute: 'theme' }, + userSettings: { type: 'Object', reflect: false, attribute: 'user-settings' }, + viewurl: { type: 'String', reflect: false, attribute: 'viewurl' }, + webcomponent: { type: 'String', reflect: false, attribute: 'webcomponent' } }, extend: customElementConstructor => { let notInitFn = name => { @@ -62,29 +63,29 @@ import { GenericHelperFunctions } from './utilities/helpers'; import { getAllowRules } from './services/iframe-helpers'; - export let viewurl: string; + export let activeFeatureToggleList: string[]; + export let allowRules: string[]; + export let anchor: string; + export let authData: any; + export let clientPermissions: any; export let context: string; - export let label: string; - export let webcomponent: any; export let deferInit: boolean; - export let noShadow: Boolean; + export let dirtyStatus: boolean; + export let documentTitle: string; + export let hasBack: boolean; + export let label: string; export let locale: string; - export let theme: string; - export let activeFeatureToggleList: string[]; - export let skipInitCheck: boolean; + export let noShadow: Boolean; export let nodeParams: any; - export let searchParams: any; export let pathParams: any; - export let clientPermissions: any; - export let dirtyStatus: boolean; - export let hasBack: boolean; - export let documentTitle: string; - export let allowRules: string[]; export let sandboxRules: string[]; - + export let searchParams: any; + export let skipCookieCheck: 'false' | 'true'; + export let skipInitCheck: boolean; + export let theme: string; export let userSettings: any; - export let anchor: string; - export let authData: any; + export let viewurl: string; + export let webcomponent: any; const iframeHandle: | { @@ -100,22 +101,24 @@ // Only needed for get rid of "unused export property" svelte compiler warnings export const unwarn = () => { return ( - locale && - theme && activeFeatureToggleList && - nodeParams && - searchParams && - pathParams && - clientPermissions && - userSettings && + allowRules && anchor && authData && + clientPermissions && dirtyStatus && - hasBack && documentTitle && - allowRules && + hasBack && + locale && + noShadow && + nodeParams && + pathParams && sandboxRules && - noShadow + searchParams && + skipCookieCheck && + skipInitCheck && + theme && + userSettings ); }; @@ -213,7 +216,7 @@ height: 100%; border: none; } - + main.lui-isolated { line-height: 0; } diff --git a/container/src/services/container.service.ts b/container/src/services/container.service.ts index c25d3d53af..ac67dbcc20 100644 --- a/container/src/services/container.service.ts +++ b/container/src/services/container.service.ts @@ -22,6 +22,7 @@ export class ContainerService { */ sendCustomMessageToIframe(iframeHandle: any, msg: any, msgName?: string) { const messageName = msgName || 'custom'; + if (iframeHandle.iframe.contentWindow) { const iframeUrl = new URL(iframeHandle.iframe.src); messageName === 'custom' @@ -42,22 +43,25 @@ export class ContainerService { */ dispatch(msg: string, targetCnt: HTMLElement, data: any, callback?: Function, callbackName?: string): void { const customEvent = new CustomEvent(msg, { detail: data }); + if (callback && GenericHelperFunctions.isFunction(callback) && callbackName) { (customEvent as any)[callbackName] = data => { callback(data); }; } + targetCnt.dispatchEvent(customEvent); } /** * Retrieves the target container based on the event source. - * + * * @param event The event object representing the source of the container. - @returns {Object| undefined} The target container object or undefined if not found. + * @returns {Object| undefined} The target container object or undefined if not found. */ getTargetContainer(event) { let cnt; + globalThis.__luigi_container_manager.container.forEach(element => { if (element.iframeHandle?.iframe && element.iframeHandle.iframe.contentWindow === event.source) { cnt = element; @@ -106,10 +110,14 @@ export class ContainerService { { msg: LuigiInternalMessageID.SEND_CONTEXT_HANDSHAKE, context: targetCnt.context || {}, - internal: {}, + internal: { + thirdPartyCookieCheck: { + disabled: targetCnt.skipCookieCheck === 'true' + } + }, authData: targetCnt.authData || {} }, - '*' + target.origin ); break; case LuigiInternalMessageID.NAVIGATION_REQUEST: @@ -181,6 +189,7 @@ export class ContainerService { }; window.addEventListener('message', globalThis.__luigi_container_manager.messageListener); } + return globalThis.__luigi_container_manager; } diff --git a/container/src/services/webcomponents.service.ts b/container/src/services/webcomponents.service.ts index 0461c1f6b6..a9d9587c3b 100644 --- a/container/src/services/webcomponents.service.ts +++ b/container/src/services/webcomponents.service.ts @@ -277,6 +277,7 @@ export class WebComponentService { }, publishEvent: ev => { if (eventBusElement && eventBusElement.eventBus) { + // compound component use case only eventBusElement.eventBus.onPublishEvent(ev, nodeId, wc_id); } const payload = { diff --git a/container/test-app/compound/compoundClientAPI.html b/container/test-app/compound/compoundClientAPI.html index 37a6a7495f..9071cc17e2 100644 --- a/container/test-app/compound/compoundClientAPI.html +++ b/container/test-app/compound/compoundClientAPI.html @@ -26,6 +26,7 @@

user-settings='{"language":"it", "date":""}' anchor="testAnchorCompound" defer-init="false" + skip-init-check="true" webcomponent="true" + theme="sap_fiori_3" + locale="en" > @@ -58,9 +62,11 @@

import MFEventID from '../bundle.js'; const compoundContainer = document.getElementById('dashboard'); + compoundContainer.addEventListener(MFEventID.CUSTOM_MESSAGE, e => { - console.log('Publish Event', e.detail); + console.log('CUSTOM_MESSAGE Listener picked up: ', e.detail); }); + compoundContainer.compoundConfig = { renderer: { use: 'grid', @@ -99,6 +105,9 @@

name: 'sendInput', action: 'update', dataConverter: data => { + console.log( + 'dataConverter(): Received Custom Message from "input1" MF ' + data + ); return 'new text: ' + data; } } @@ -156,15 +165,17 @@

compoundContainer.addEventListener( MFEventID.SHOW_CONFIRMATION_MODAL_REQUEST, event => { - console.log(event.detail); - const val = confirm(event.detail.body); + const data = event.detail; + console.log(data); + const val = confirm(data.body); // send back to mf alert.answer with data window.postMessage('alert.answer', data); - event.luigiCallback(val); + if (event.callback) { + event.callback(val); + } } ); compoundContainer.addEventListener(MFEventID.CUSTOM_MESSAGE, event => { - console.log('Custom Event', event); if (event.detail.id !== 'timer') { alert(event.detail.id); } @@ -183,35 +194,38 @@

compoundContainer.addEventListener(MFEventID.SET_ANCHOR_LINK_REQUEST, event => { console.log('anchor', event.detail); }); - - // uxManager(). closeUserSettings openUserSettings collapseLeftSideNav - // setDocumentTitle removeBackdrop hideAppLoadingIndicator + compoundContainer.addEventListener(MFEventID.OPEN_USER_SETTINGS_REQUEST, event => { + console.log('Open User Settings Request received', event.detail); + alert('LuigiClient.uxManager().openUserSettings()'); + }); compoundContainer.addEventListener(MFEventID.CLOSE_USER_SETTINGS_REQUEST, event => { console.log('Close User Settings Request received', event.detail); + alert('LuigiClient.uxManager().closeUserSettings()'); }); - compoundContainer.addEventListener(MFEventID.OPEN_USER_SETTINGS_REQUEST, event => { - console.log('Open User Settings Request received', event.detail); + compoundContainer.addEventListener(MFEventID.REMOVE_BACKDROP_REQUEST, event => { + console.log('Remove Backdrop Request received', event.detail); + alert('LuigiClient.uxManager().removeBackdrop()'); }); compoundContainer.addEventListener(MFEventID.COLLAPSE_LEFT_NAV_REQUEST, event => { console.log('Collapse Left Side Nav Request received', event.detail); + alert('LuigiClient.uxManager().collapseLeftSideNav()'); }); compoundContainer.addEventListener(MFEventID.SET_DOCUMENT_TITLE_REQUEST, event => { console.log('Set Document Title Request received', event.detail); - }); - compoundContainer.addEventListener(MFEventID.REMOVE_BACKDROP_REQUEST, event => { - console.log('Remove Backdrop Request received', event.detail); + compoundContainer.documentTitle = event.detail; }); compoundContainer.addEventListener( MFEventID.HIDE_LOADING_INDICATOR_REQUEST, event => { console.log('Hide Loading Indicator Request received', event.detail); + alert('LuigiClient.uxManager().hideAppLoadingIndicator()'); } ); // linkManager listeners: // path exists compoundContainer.addEventListener(MFEventID.PATH_EXISTS_REQUEST, event => { - console.log('Remove Backdrop Request received', event.detail, event); + console.log('Path Exists Request received', event.detail, event); // send back result with defined 'callback' // event: MFEventID.PathExistsEvent can be used as an event type to get the callback function event.callback(true); diff --git a/container/test-app/compound/helloWorldWC.js b/container/test-app/compound/helloWorldWC.js index e4214bfb75..0bd8936510 100644 --- a/container/test-app/compound/helloWorldWC.js +++ b/container/test-app/compound/helloWorldWC.js @@ -13,8 +13,11 @@ export default class extends HTMLElement { const templateBtn = document.createElement('template'); templateBtn.innerHTML = ''; + const current_locale = document.createElement('template'); + current_locale.innerHTML = ''; + const templateBtn2 = document.createElement('template'); - templateBtn2.innerHTML = ''; + templateBtn2.innerHTML = ''; const addNodeParamsBtn = document.createElement('template'); addNodeParamsBtn.innerHTML = ''; @@ -43,6 +46,12 @@ export default class extends HTMLElement { const getAnchorBtn = document.createElement('template'); getAnchorBtn.innerHTML = ''; + const getFeatureToggleListBtn = document.createElement('template'); + getFeatureToggleListBtn.innerHTML = ''; + + const getThemeBtn = document.createElement('template'); + getThemeBtn.innerHTML = ''; + const setViewGroupDataBtn = document.createElement('template'); setViewGroupDataBtn.innerHTML = ''; @@ -82,6 +91,9 @@ export default class extends HTMLElement { hasBack(), updateTopNavigation(), goBack(), pathExists() `; + const confirmationModalBtn = document.createElement('template'); + confirmationModalBtn.innerHTML = ''; + this._shadowRoot = this.attachShadow({ mode: 'open', delegatesFocus: false @@ -97,6 +109,8 @@ export default class extends HTMLElement { this._shadowRoot.appendChild(getClientPermissionsBtn.content.cloneNode(true)); this._shadowRoot.appendChild(getUserSettingsBtn.content.cloneNode(true)); this._shadowRoot.appendChild(getAnchorBtn.content.cloneNode(true)); + this._shadowRoot.appendChild(getFeatureToggleListBtn.content.cloneNode(true)); + this._shadowRoot.appendChild(getThemeBtn.content.cloneNode(true)); this._shadowRoot.appendChild(getDirtyStatusBtn.content.cloneNode(true)); this._shadowRoot.appendChild(retrieveContextValueBtn.content.cloneNode(true)); this._shadowRoot.appendChild(uxManagerMultipleRequestsBtn.content.cloneNode(true)); @@ -104,10 +118,23 @@ export default class extends HTMLElement { this._shadowRoot.appendChild(linkManagerOpenAsRequestsBtn.content.cloneNode(true)); this._shadowRoot.appendChild(linkManagerUpdateTopPathExistsBackBtn.content.cloneNode(true)); this._shadowRoot.appendChild(setViewGroupDataBtn.content.cloneNode(true)); + this._shadowRoot.appendChild(confirmationModalBtn.content.cloneNode(true)); + this._shadowRoot.appendChild(current_locale.content.cloneNode(true)); this._shadowRoot.appendChild(empty.content.cloneNode(true)); + this.$currentLocaleButton = this._shadowRoot.querySelector('#current_locale'); + this.$currentLocaleButton.addEventListener('click', () => { + if (this.LuigiClient) { + this.LuigiClient.uxManager().showAlert({ + text: 'LuigiClient.getCurrentLocale()=' + this.LuigiClient.getCurrentLocale(), + type: 'info' + }); + } + }); + this.$paragraph = this._shadowRoot.querySelector('p'); + this.$button = this._shadowRoot.querySelector('#aButton'); this.$button.addEventListener('click', () => { if (this.LuigiClient) { @@ -128,20 +155,22 @@ export default class extends HTMLElement { }); } }); - this._shadowRoot.querySelector('.button2').addEventListener('click', () => { + + this.$publishEventBtn = this._shadowRoot.querySelector('#publishEvent'); + this.$publishEventBtn.addEventListener('click', () => { if (this.LuigiClient) { - this.LuigiClient.publishEvent(new CustomEvent('btnClick')); + this.LuigiClient.publishEvent(new CustomEvent('sendInput', { detail: 'My own event data' })); } }); - this.$button2 = this._shadowRoot.querySelector('#addNodeParams'); - this.$button2.addEventListener('click', () => { + this.$addNodeParamsBtn = this._shadowRoot.querySelector('#addNodeParams'); + this.$addNodeParamsBtn.addEventListener('click', () => { if (this.LuigiClient) { this.LuigiClient.addNodeParams({ Luigi: 'rocks' }, true); } }); - this.$button3 = this._shadowRoot.querySelector('#getNodeParams'); - this.$button3.addEventListener('click', () => { + this.$getNodeParamsBtn = this._shadowRoot.querySelector('#getNodeParams'); + this.$getNodeParamsBtn.addEventListener('click', () => { if (this.LuigiClient) { let nodeParams = this.LuigiClient.getNodeParams(false); this.LuigiClient.uxManager().showAlert({ @@ -188,6 +217,7 @@ export default class extends HTMLElement { }); } }); + this.$getAnchorBtn = this._shadowRoot.querySelector('#getAnchor'); this.$getAnchorBtn.addEventListener('click', () => { let getAnchor = this.LuigiClient.getAnchor(); @@ -197,6 +227,26 @@ export default class extends HTMLElement { }); }); + this.$getFeatureToggleListBtn = this._shadowRoot.querySelector('#getFeatureToggleList'); + this.$getFeatureToggleListBtn.addEventListener('click', () => { + const activeFeatureToggleList = this.LuigiClient.getActiveFeatureToggles(); + + this.LuigiClient.uxManager().showAlert({ + text: 'LuigiClient.getActiveFeatureToggles()=' + JSON.stringify(activeFeatureToggleList), + type: 'info' + }); + }); + + this.$getThemeBtn = this._shadowRoot.querySelector('#getTheme'); + this.$getThemeBtn.addEventListener('click', () => { + const currentTheme = this.LuigiClient.uxManager().getCurrentTheme(); + + this.LuigiClient.uxManager().showAlert({ + text: 'LuigiClient.getCurrentTheme()=' + JSON.stringify(currentTheme), + type: 'info' + }); + }); + this.$getDirtyStatusBtn = this._shadowRoot.querySelector('#getDirtyStatus'); this.$getDirtyStatusBtn.addEventListener('click', () => { let dirtyStatus = this.LuigiClient.uxManager().getDirtyStatus(); @@ -217,12 +267,12 @@ export default class extends HTMLElement { this.$uxManagerManyRequests = this._shadowRoot.querySelector('#uxManagerManyRequests'); this.$uxManagerManyRequests.addEventListener('click', () => { - this.LuigiClient.uxManager().closeUserSettings(); this.LuigiClient.uxManager().openUserSettings(); - this.LuigiClient.uxManager().collapseLeftSideNav(); - this.LuigiClient.uxManager().setDocumentTitle('my-title'); + this.LuigiClient.uxManager().closeUserSettings(); this.LuigiClient.uxManager().removeBackdrop(); + this.LuigiClient.uxManager().collapseLeftSideNav(); this.LuigiClient.uxManager().hideAppLoadingIndicator(); + this.LuigiClient.uxManager().setDocumentTitle('my-title'); this.LuigiClient.uxManager().showAlert({ text: 'LuigiClient.uxManager().getDocumentTitle()=' + this.LuigiClient.uxManager().getDocumentTitle(), type: 'info' @@ -231,18 +281,29 @@ export default class extends HTMLElement { this.$linkManagerChainRequests = this._shadowRoot.querySelector('#linkManagerChainRequests'); this.$linkManagerChainRequests.addEventListener('click', () => { + const path = 'hello-world-wc'; + const ctx = { ctx: 123 }; + this.LuigiClient.linkManager() - .fromContext({ ctx: 123 }) - .navigate('hello-world-wc'); + .fromContext(ctx) + .navigate(); this.LuigiClient.linkManager() .fromClosestContext() - .navigate('hello-world-wc'); + .navigate(path); this.LuigiClient.linkManager() .fromVirtualTreeRoot() - .navigate('hello-world-wc'); + .navigate(path); + this.LuigiClient.linkManager() + .fromParent(ctx) + .navigate(path); this.LuigiClient.linkManager() .withParams('my-params') - .navigate('hello-world-wc'); + .navigate(path); + this.LuigiClient.linkManager().navigate(path); + this.LuigiClient.uxManager().showAlert({ + text: 'LuigiClient.linkManager().navigate()', + type: 'info' + }); }); this.$linkManagerOpenAsRequests = this._shadowRoot.querySelector('#linkManagerOpenAsRequests'); @@ -275,6 +336,26 @@ export default class extends HTMLElement { this.$setViewGroupData.addEventListener('click', () => { this.LuigiClient.setViewGroupData({ vg: 'some data' }); }); + + this.$confirmationModalBtn = this._shadowRoot.querySelector('#confirmationModal'); + this.$confirmationModalBtn.addEventListener('click', () => { + const settings = { + type: 'confirmation', + header: 'Confirmation', + body: 'Are you sure you want to do this?', + buttonConfirm: 'Yes', + buttonDismiss: 'No' + }; + + this.LuigiClient.uxManager() + .showConfirmationModal(settings) + .then(() => { + this.LuigiClient.uxManager().showAlert({ + text: 'LuigiClient.uxManager().showConfirmationModal()', + type: 'info' + }); + }); + }); } get context() { diff --git a/container/test-app/iframe/iframe-cookies.html b/container/test-app/iframe/iframe-cookies.html new file mode 100644 index 0000000000..27a7d05bc1 --- /dev/null +++ b/container/test-app/iframe/iframe-cookies.html @@ -0,0 +1,38 @@ + + + + + +

+ This page is used to test **skip-cookie-check** feature for iFrame based LuigiContainer +

+ +
+ + +
+ + + + diff --git a/container/test-app/iframe/microfrontend.html b/container/test-app/iframe/microfrontend.html index 80e1159dc7..b69fc1a4e9 100644 --- a/container/test-app/iframe/microfrontend.html +++ b/container/test-app/iframe/microfrontend.html @@ -4,7 +4,7 @@ - +