diff --git a/.eslintignore b/.eslintignore
deleted file mode 100644
index bb33abf648..0000000000
--- a/.eslintignore
+++ /dev/null
@@ -1,8 +0,0 @@
-# ESLint ignores node_modules, dotfolders and dotfiles by default
-dist
-dist-browser
-release
-
-**/*.log
-**/*.xml
-**/*.html
diff --git a/.eslintrc.json b/.eslintrc.json
deleted file mode 100644
index e6e0831198..0000000000
--- a/.eslintrc.json
+++ /dev/null
@@ -1,26 +0,0 @@
-{
- "extends": ["plugin:react/recommended", "@appium/eslint-config-appium"],
- "parser": "@babel/eslint-parser",
- "plugins": ["import", "react", "react-native", "@babel"],
- "env": {
- "browser": true,
- "mocha": true,
- "node": true
- },
- "settings": {
- "react": {
- "version": "detect"
- }
- },
- "rules": {
- "@babel/arrow-parens": 0,
- "import/no-unresolved": [
- 2,
- {
- "ignore": ["electron"]
- }
- ],
- "react/prop-types": 0,
- "react-native/no-inline-styles": 2
- }
-}
diff --git a/.github/labeler.yml b/.github/labeler.yml
index 5fd8e698f6..84e1cb2bc3 100644
--- a/.github/labeler.yml
+++ b/.github/labeler.yml
@@ -5,6 +5,10 @@ labels:
matcher:
title: '^feat.*?:'
+ - label: 'style'
+ matcher:
+ title: '^style.*?:'
+
- label: 'fix'
matcher:
title: '^fix.*?:'
@@ -24,4 +28,4 @@ labels:
- label: 'i18n'
matcher:
- files: ['assets/locales/**']
+ files: ['app/common/public/locales/**']
diff --git a/.github/release.yml b/.github/release.yml
index 7fb4c62412..0a3c52a74c 100644
--- a/.github/release.yml
+++ b/.github/release.yml
@@ -1,13 +1,13 @@
# Configuration for automatically generated release notes
changelog:
- exclude:
- labels:
- - dependencies
categories:
- title: 🚀 New Features
labels:
- enhancement
+ - title: 🎨 Design Changes
+ labels:
+ - style
- title: 🛠 Fixes
labels:
- fix
@@ -20,3 +20,6 @@ changelog:
- title: 🔍 Other Changes
labels:
- '*'
+ exclude:
+ authors:
+ - renovate[bot]
diff --git a/.github/workflows/auto-labeler.yml b/.github/workflows/auto-labeler.yml
index 600e521347..c2f92a3005 100644
--- a/.github/workflows/auto-labeler.yml
+++ b/.github/workflows/auto-labeler.yml
@@ -13,4 +13,4 @@ jobs:
name: Auto-Label PRs
runs-on: ubuntu-latest
steps:
- - uses: fuxingloh/multi-labeler@v4
+ - uses: fuxingloh/multi-labeler@v5.0.0
diff --git a/.github/workflows/build-docs.yml b/.github/workflows/build-docs.yml
index 562f5075ea..6a05ebeb1d 100644
--- a/.github/workflows/build-docs.yml
+++ b/.github/workflows/build-docs.yml
@@ -18,14 +18,14 @@ jobs:
name: Build Docs
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v7.0.0
- name: Use Node.js LTS
- uses: actions/setup-node@v4
+ uses: actions/setup-node@v6.4.0
with:
node-version: lts/*
cache: 'npm'
- name: Install dependencies (Node.js)
- run: npm install
+ run: npm ci
- name: Install dependencies (Python)
run: npm run install-docs-deps
- name: Build Docs
diff --git a/.github/workflows/crowdin-sync-translations.yml b/.github/workflows/crowdin-sync-translations.yml
index fc762175e0..6134e17c7a 100644
--- a/.github/workflows/crowdin-sync-translations.yml
+++ b/.github/workflows/crowdin-sync-translations.yml
@@ -12,9 +12,9 @@ jobs:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v7.0.0
- name: Use Node.js LTS
- uses: actions/setup-node@v4
+ uses: actions/setup-node@v6.4.0
with:
node-version: lts/*
cache: 'npm'
@@ -27,7 +27,7 @@ jobs:
CROWDIN_PROJECT_ID: 346705
CROWDIN_TOKEN: ${{ secrets.CROWDIN_TOKEN }}
- name: Create Pull Request
- uses: peter-evans/create-pull-request@v6.0.0
+ uses: peter-evans/create-pull-request@v8.1.1
with:
token: ${{ github.token }}
commit-message: 'chore: Update translations'
diff --git a/.github/workflows/crowdin-update-resources.yml b/.github/workflows/crowdin-update-resources.yml
index 7f63b7e82e..e35a7d5a73 100644
--- a/.github/workflows/crowdin-update-resources.yml
+++ b/.github/workflows/crowdin-update-resources.yml
@@ -1,4 +1,4 @@
-# Updates Crowdin with any changes in the English translation file (/assets/locales/en/translation.json)
+# Updates Crowdin with any changes in the English translation file (/app/common/public/locales/en/translation.json)
name: Update Crowdin English Resources
@@ -6,7 +6,7 @@ on:
push:
branches: [main]
paths:
- - 'assets/locales/en/translation.json'
+ - 'app/common/public/locales/en/translation.json'
- '.github/workflows/crowdin-update-resources.yml' # this file
jobs:
@@ -14,9 +14,9 @@ jobs:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v7.0.0
- name: Use Node.js LTS
- uses: actions/setup-node@v4
+ uses: actions/setup-node@v6.4.0
with:
node-version: lts/*
cache: 'npm'
diff --git a/.github/workflows/main-commit-validation.yml b/.github/workflows/main-commit-validation.yml
index a63ad72bf8..fe47adc8a5 100644
--- a/.github/workflows/main-commit-validation.yml
+++ b/.github/workflows/main-commit-validation.yml
@@ -8,9 +8,8 @@ on:
branches: [main]
paths-ignore:
- '.github/ISSUE_TEMPLATE/**'
- - 'assets/locales/**'
+ - 'app/common/public/locales/**'
- 'docs/**'
- - 'sample-session-files/**'
- '.gitignore'
- 'LICENSE'
- 'README.md'
@@ -22,9 +21,9 @@ jobs:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v7.0.0
- name: Use Node.js LTS
- uses: actions/setup-node@v4
+ uses: actions/setup-node@v6.4.0
with:
node-version: lts/*
cache: 'npm'
diff --git a/.github/workflows/package.yml b/.github/workflows/package.yml
new file mode 100644
index 0000000000..764079f77e
--- /dev/null
+++ b/.github/workflows/package.yml
@@ -0,0 +1,66 @@
+# Builds the desktop and plugin versions of the app.
+# The plugin version is published to npm, while the desktop app packages
+# are uploaded to a GitHub release for the latest app version tag.
+
+name: Package and Publish
+
+on:
+ workflow_dispatch:
+ push:
+ tags:
+ - '*'
+
+permissions:
+ contents: write
+ pull-requests: write
+ issues: write
+ id-token: write # to enable use of OIDC for trusted publishing and npm provenance
+
+jobs:
+ electron:
+ strategy:
+ matrix:
+ image: [ubuntu-latest, macos-latest, windows-latest]
+ runs-on: ${{ matrix.image }}
+
+ env:
+ CSC_IDENTITY_AUTO_DISCOVERY: true
+ CSC_LINK: ${{ secrets.CSC_LINK }}
+ CSC_KEY_PASSWORD: ${{ secrets.CSC_KEY_PASSWORD }}
+ GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+
+ steps:
+ - uses: actions/checkout@v7.0.0
+ - name: Use Node.js LTS
+ uses: actions/setup-node@v6.4.0
+ with:
+ node-version: lts/*
+ cache: 'npm'
+ - name: Install dependencies (Node.js)
+ run: npm ci
+ - name: Build electron app
+ run: npm run build:electron
+ - name: build package
+ run: npx electron-builder build --x64 --arm64 --publish always
+ - name: Upload built packages
+ uses: actions/upload-artifact@v7.0.1
+ with:
+ name: artifact-${{ matrix.image }}
+ path: release/
+
+ plugin:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v7.0.0
+ - name: Use Node.js LTS
+ uses: actions/setup-node@v6.4.0
+ with:
+ node-version: lts/*
+ cache: 'npm'
+ - name: Install dependencies (Node.js)
+ run: npm ci
+ - name: generate contents
+ run: npm run build:plugin
+ - name: publish
+ run: npm publish
+ working-directory: plugins
diff --git a/.github/workflows/pr-title.yml b/.github/workflows/pr-title.yml
new file mode 100644
index 0000000000..f8609e4ccf
--- /dev/null
+++ b/.github/workflows/pr-title.yml
@@ -0,0 +1,17 @@
+# Checks that the PR title follows conventional commit standards
+
+name: Conventional Commits
+on:
+ pull_request:
+ types: [opened, edited, synchronize, reopened]
+
+jobs:
+ conventional:
+ name: PR Title
+ runs-on: ubuntu-latest
+ steps:
+ - uses: beemojs/conventional-pr-action@v3.0.0
+ with:
+ config-preset: angular
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
diff --git a/.github/workflows/pr-validation-lint.yml b/.github/workflows/pr-validation-lint.yml
new file mode 100644
index 0000000000..f1481d2715
--- /dev/null
+++ b/.github/workflows/pr-validation-lint.yml
@@ -0,0 +1,27 @@
+# Code validation job, executed on pull request
+# Runs linting and formatting tests
+
+name: PR Validation
+
+on:
+ pull_request:
+ branches: [main]
+
+jobs:
+ lint:
+ name: Lint & Format
+ runs-on: ubuntu-latest
+
+ steps:
+ - uses: actions/checkout@v7.0.0
+ - name: Use Node.js LTS
+ uses: actions/setup-node@v6.4.0
+ with:
+ node-version: lts/*
+ cache: 'npm'
+ - name: Install Dependencies
+ run: npm ci
+ - name: Lint
+ run: npm run test:lint
+ - name: Format
+ run: npm run test:format
diff --git a/.github/workflows/pr-validation.yml b/.github/workflows/pr-validation.yml
index fcd9dca1a4..2cda5a93e8 100644
--- a/.github/workflows/pr-validation.yml
+++ b/.github/workflows/pr-validation.yml
@@ -1,5 +1,5 @@
# Code validation job, executed on pull request
-# Builds the app, and runs lint, unit and integration tests
+# Builds the app, and runs unit and integration tests
name: PR Validation
@@ -8,9 +8,8 @@ on:
branches: [main]
paths-ignore:
- '.github/ISSUE_TEMPLATE/**'
- - 'assets/locales/**'
+ - 'app/common/public/locales/**'
- 'docs/**'
- - 'sample-session-files/**'
- '.gitignore'
- 'LICENSE'
- 'README.md'
@@ -25,9 +24,9 @@ jobs:
runs-on: ${{ matrix.image }}
steps:
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v7.0.0
- name: Use Node.js LTS
- uses: actions/setup-node@v4
+ uses: actions/setup-node@v6.4.0
with:
node-version: lts/*
cache: 'npm'
@@ -37,21 +36,3 @@ jobs:
run: npm run build --if-present
- name: Test
run: npm run test:unit && npm run test:integration
-
- lint:
- name: Lint & Format
- runs-on: ubuntu-latest
-
- steps:
- - uses: actions/checkout@v4
- - name: Use Node.js LTS
- uses: actions/setup-node@v4
- with:
- node-version: lts/*
- cache: 'npm'
- - name: Install Dependencies
- run: npm ci
- - name: Lint
- run: npm run test:lint
- - name: Format
- run: npm run test:format
diff --git a/.github/workflows/publish-docs.yml b/.github/workflows/publish-docs.yml
index ae96b2462f..3328eec76e 100644
--- a/.github/workflows/publish-docs.yml
+++ b/.github/workflows/publish-docs.yml
@@ -1,27 +1,34 @@
# Builds and publishes the Appium Inspector MkDocs documentation
+# Executed on-demand, or after publishing new version packages
name: Publish Docs
on:
workflow_dispatch:
+ workflow_run:
+ workflows: ['Package and Publish']
+ types:
+ - completed
jobs:
build:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v4
+ - uses: actions/checkout@v7.0.0
- name: Use GH Actions credentials
run: |
git config user.name github-actions
git config user.email github-actions@github.com
- name: Use Node.js LTS
- uses: actions/setup-node@v4
+ uses: actions/setup-node@v6.4.0
with:
node-version: lts/*
cache: 'npm'
- name: Install dependencies (Node.js)
- run: npm install
+ run: npm ci
- name: Install dependencies (Python)
run: npm run install-docs-deps
+ - name: Fetch docs branch
+ run: git fetch origin docs-site:docs-site || true
- name: Build and deploy docs
run: npm run publish:docs
diff --git a/.gitignore b/.gitignore
index 918e0689e8..39e5416d01 100644
--- a/.gitignore
+++ b/.gitignore
@@ -4,6 +4,7 @@ dist
dist-browser
release
site
+plugins/package-lock.json
main.map
*.log
diff --git a/.lessrc b/.lessrc
deleted file mode 100644
index f8e14dc469..0000000000
--- a/.lessrc
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "javascriptEnabled": true
-}
diff --git a/.mocharc.js b/.mocharc.js
deleted file mode 100644
index 46e3aa7cf6..0000000000
--- a/.mocharc.js
+++ /dev/null
@@ -1,4 +0,0 @@
-module.exports = {
- require: '@babel/register',
- timeout: 60 * 1000, // 1 minute timeout
-};
diff --git a/LICENSE b/LICENSE
index 607c81441f..d4db1bf81f 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,13 +1,201 @@
-Copyright 2021 OpenJS Foundation.
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
- http://www.apache.org/licenses/LICENSE-2.0
+ 1. Definitions.
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "{}"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright OpenJS Foundation and other contributors, https://openjsf.org/
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
diff --git a/README.md b/README.md
index 3983b6407d..d3887eb6ac 100644
--- a/README.md
+++ b/README.md
@@ -7,10 +7,15 @@
GUI Inspector tool for all kinds of apps, powered by Appium.
+
+

+

[](https://crowdin.com/project/appium-desktop)
+
+
---
@@ -28,7 +33,7 @@ various features for interacting with the app.
When inspecting a mobile app, the Inspector looks like this:
-
+
## Installation
@@ -36,14 +41,17 @@ Appium Inspector is released in two formats:
1. Standalone desktop application for macOS, Windows, and Linux - download it from the
[**Releases**](https://github.com/appium/appium-inspector/releases) section
-2. Web application - **** (note that
- [CORS must be enabled](https://appium.github.io/appium-inspector/latest/troubleshooting/#cannot-start-a-session-using-browser-inspector)
- in order to connect to an Appium server)
+2. Appium server plugin - see the [**plugin README**](./plugins/README.md) for details
Check the [System Requirements](https://appium.github.io/appium-inspector/latest/quickstart/requirements/)
and [Installation](https://appium.github.io/appium-inspector/latest/quickstart/installation/)
documentation for more details.
+> [!NOTE]
+>
+> The Inspector was also formerly released as a web application hosted at . The Appium team no longer has developer access to this site, so even though it remains operational, it is highly unlikely to be updated to a newer Inspector version, and may be taken down without notice. We recommend migrating to the standalone app or the plugin version.
+> The Appium team is exploring the idea of hosting an up-to-date version of the web app in the future.
+
## Features
The Inspector has many features in addition to its app inspection abilities:
@@ -65,73 +73,157 @@ The Inspector has built-in integrations with various cloud service provider plat
-
+
+
+
+
+
-
+
-
+
+
+
+
+
-
-
+
+
+
+
+
+
-
+
+
+
+
+
-
-
+
+
-
-
+
+
+
+
+
+
-
+
-
+
-
+
+
+
+
+
-
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/.postcssrc b/app/.postcssrc
deleted file mode 100644
index 050061e108..0000000000
--- a/app/.postcssrc
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "modules": true
-}
diff --git a/app/common/index.html b/app/common/index.html
new file mode 100644
index 0000000000..b4d191f426
--- /dev/null
+++ b/app/common/index.html
@@ -0,0 +1,12 @@
+
+
+
+
+ Appium Inspector
+
+
+
+
+
+
+
diff --git a/assets/locales/ar/translation.json b/app/common/public/locales/ar/translation.json
similarity index 73%
rename from assets/locales/ar/translation.json
rename to app/common/public/locales/ar/translation.json
index 840c14813e..3e72909034 100644
--- a/assets/locales/ar/translation.json
+++ b/app/common/public/locales/ar/translation.json
@@ -14,7 +14,6 @@
"Zoom Out": "Zoom Out",
"Reset Zoom Level": "Reset Zoom Level",
"Close Window": "Close Window",
- "Open Session File…": "Open Session File…",
"Bring All to Front": "Bring All to Front",
"Help": "المساعدة",
"Appium Documentation": "Appium Documentation",
@@ -41,7 +40,6 @@
"Save Server Arguments Preset": "Save Server Arguments Preset",
"Save": "حفظ",
"Cancel": "إلغاء",
- "datetimeFormat": "MMM Do YYYY, h:mma",
"updateDetails": "تاريخ الإصدار: {{pubDate}}\n\nملاحظات الإصدار: {{notes}}",
"appiumIsAvailable": "Appium Inspector {{name}} is available",
"updateIsBeingDownloaded": "يتم تحميل التحديث الآن. سيتم إعلامك مرة أخرى عند اكتمال التحديث",
@@ -68,20 +66,11 @@
"Could not start session": "تعذر بَدْء الجلسة",
"couldNotConnect": "Could not connect to Appium server URL '{{url}}'. Please check if the server is running and the URL is correct (valid URLs can be found at the start of the Appium server log). If you are using the Inspector's browser version, ensure the server has been started with '--allow-cors'.",
"Invalid URL:": "Invalid URL:",
- "sauceCredentialsRequired": "Sauce username and access key are required!",
- "testingbotCredentialsRequired": "TestingBot key and secret are required!",
- "Perfecto SecurityToken is required": "Perfecto SecurityToken is required",
- "browserstackCredentialsRequired": "Browserstack username and access key are required!",
- "lambdatestCredentialsRequired": "Lambdatest username and access key are required!",
- "bitbarCredentialsRequired": "Bitbar API key required!",
- "kobitonCredentialsRequired": "KOBITON username and api key are required!",
- "experitestAccessKeyURLRequired": "Experitest AccessKey and URL are required",
"experitestAccessKey": "Experitest AccessKey",
"experitestUrl": "Experitest Url",
"locatorStrategy": "استراتيجية محددات المواقع:",
"selector": "المحدد:",
"couldNotObtainScreenshot": "تعذر الحصول على لقطة الشاشة: {{screenshotError}}",
- "selectElementInSource": "Select an element in the source to begin.",
"Press Home Button": "اضغط على زر الصفحة الرئيسية",
"Execute Siri Command": "Execute Siri Command",
"Press Back Button": "Press Back Button",
@@ -100,11 +89,11 @@
"Pause Recording": "إيقاف التسجيل مؤقتا",
"Search for element": "Search for element",
"App Source": "App Source",
+ "Collapse All": "Collapse All",
"Toggle Attributes": "Toggle Attributes",
"Copy XML Source to Clipboard": "Copy XML Source to Clipboard",
"Download Source as .XML File": "Download Source as .XML File",
"Copy Attributes to Clipboard": "Copy Attributes to Clipboard",
- "quitSessionAndClose": "Quit Session & Close Inspector",
"Session Inactive": "Session Inactive",
"Keep Session Running": "ترك الجَلسة مفتوحة",
"Quit Session": "إنهاء الجَلسة",
@@ -132,8 +121,9 @@
"usingXPathNotRecommended": "استخدام محدد المواقع XPath غير مستحسن ويمكن أن يؤدي إلى اختبارات هشه. اطلب من فريق التطوير الخاص بك توفير مواقع الوصول الفريدة بدلاً من ذلك!",
"noAdditionalContextsFound": "No additional contexts have been detected",
"contextDropdownInfo": "Multiple contexts detected; certain elements might only be accessible after switching to a different context. Note that webview inspection in Appium Inspector is less accurate than the DevTools of Chrome or Safari. For more information, see:",
- "idAutocompletionCanBeDisabled": "The requested id selector does not have a package name prefix. This Appium session has package name autocompletion enabled, which may be the reason why no elements were found. To disable this behavior, relaunch this session with the capability 'appium:disableIdLocatorAutocompletion' set to 'true'.",
+ "idAutocompletionCanBeDisabled": "The requested id selector does not have a package name prefix. This Appium session has package name autocompletion enabled, which may be the reason why no elements were found. To disable this behavior, change the 'disableIdLocatorAutocompletion' setting to 'true'.",
"missingAutomationNameForStrategies": "Additional locator strategies may be available. To view them, add the capability 'appium:automationName' when launching the session. Note that this capability is mandatory in Appium 2.",
+ "snapshotMaxDepthReached": "This element is located at the maximum source depth {{selectedElementDepth}}, therefore its child elements (if any) are not shown. To reveal them, change the 'snapshotMaxDepth' setting to a value greater than {{selectedElementDepth}}. Check your driver documentation for the maximum supported value.",
"Tap": "Tap",
"Gathering initial app source…": "Gathering initial app source…",
"couldNotObtainSource": "Could not obtain source: {{errorMsg}}",
@@ -161,15 +151,14 @@
"boolean": "boolean",
"number": "number",
"JSON object": "JSON object",
- "filepath": "filepath",
"connectToExistingSessionInstructions": "If you have an already-running session of the above server type, you can attach an inspector to it directly.",
- "selectSessionIDInDropdown": "Select the Session ID in the dropdown below.",
+ "selectSessionID": "You can manually enter your session ID, or, if the server supports session discovery, simply select from a list of active sessions.",
"allowUnauthorizedCerts": "Allow Unauthorized Certificates",
"Use Proxy": "Use Proxy",
"JSON Representation": "JSON Representation",
"Capability Builder": "Capability Builder",
"Saved Capability Sets": "Saved Capability Sets",
- "Attach to Session": "Attach to Session…",
+ "Attach": "Attach",
"localhost": "localhost",
"Host": "Host",
"Port": "Port",
@@ -195,16 +184,19 @@
"Remote Path": "Remote Path",
"BrowserStack Username": "BrowserStack Username",
"BrowserStack Access Key": "BrowserStack Access Key",
- "LambdaTest Username": "LambdaTest Username",
- "LambdaTest Access Key": "LambdaTest Access Key",
+ "TestMu AI Username": "TestMu AI Username",
+ "TestMu AI Access Key": "TestMu AI Access Key",
"Bitbar API Key": "Bitbar API Key",
"RemoteTestKit AccessToken": "RemoteTestKit AccessToken",
"RobotQA Token": "RobotQA Token",
+ "RobotActions Host": "RobotActions Host",
+ "RobotActions Token": "RobotActions Token",
+ "Add": "Add",
"Name": "Name",
"Description": "Description",
"Created": "Created",
"Actions": "Actions",
- "enterYourSessionId": "Enter your session ID here",
+ "searchSessions": "Search discovered sessions",
"Proxy URL": "Proxy URL",
"Source": "Source",
"Commands": "Commands",
@@ -212,12 +204,14 @@
"Gestures": "Gestures",
"Gesture Builder": "Gesture Builder",
"Saved Gestures": "Saved Gestures",
+ "Create New Gesture": "Create New Gesture",
"gesturesDescription": "Create, save, and execute custom gestures here. Gestures are identical to action chains in the W3C WebDriver Actions API.",
"Session Information": "Session Information",
"Execute Command": "Execute Command",
"commandsDescription": "Run various commands using the current Appium driver. Note that not all drivers support all commands.",
- "Click to Set Coordinates": "Click to Set Coordinates",
- "Set Coordinates Via Field": "Set Coordinates Via Field",
+ "showMoveActionCoordsInPercentage": "Show Coordinates of Move Actions in Screen Dimension Percentages",
+ "showMoveActionCoordsInPixels": "Show Coordinates of Move Actions in Pixels",
+ "toggleMoveActionCoordPicker": "Toggle Setting Coordinates via Clicking on Screenshot",
"Action Type": "Action Type",
"Pointer Up": "Pointer Up",
"Pointer Down": "Pointer Down",
@@ -234,29 +228,23 @@
"Left": "Left",
"Right": "Right",
"Play": "Play",
+ "Export to File": "Export to File",
"Save Capability Set As": "Save Capability Set As…",
"Edit Raw JSON": "Edit Raw JSON",
- "Enter Parameters for:": "Enter Parameters for:",
+ "enterMethodParameters": "Enter Parameters for: '{{methodName}}'",
"invalidJson": "Invalid JSON",
- "Execute Script": "Execute Script",
"App Management": "App Management",
- "Clipboard": "Clipboard",
"File Transfer": "File Transfer",
"Device Interaction": "Device Interaction",
- "Keyboard": "Keyboard",
- "Connectivity": "Connectivity",
- "Performance Data": "Performance Data",
- "System": "System",
"Session": "الجَلسة",
"Web": "الويب",
"Context": "Context",
- "Window (W3C)": "نافذة (W3C)",
"simulatorOnly": "Emulator/simulator only",
"minAndroidSDK": "Minimum Android SDK level",
"Error": "خطأ",
"findingElementInSourceFailed": "Could not find the specified element. The current application source or element ID may have changed, or there may be too many elements with the same coordinates.",
"callToMethodFailed": "Call to '{{methodName}}' failed",
- "methodCallResult": "'{{methodName}}' result",
+ "methodCallResult": "Result for: '{{methodName}}' (type: {{resultType}})",
"TestingBot Key": "TestingBot Key",
"TestingBot Secret": "TestingBot Secret",
"Appium Server": "خادم Appium",
@@ -269,17 +257,75 @@
"Mobitru WebDriver URL": "Mobitru WebDriver URL",
"Mobitru Billing Unit": "Mobitru Billing Unit",
"Mobitru Access Key": "Mobitru Access Key",
- "mobitruCredentialsRequired": "Mobitru Access Key is required",
"Session URL": "Session URL",
"Server Details": "Server Details",
"Session Length": "Session Length",
"Session Details": "Session Details",
"Currently Active App ID": "Currently Active App ID",
- "Session ID": "Session ID",
"confirmDeletion": "Are you sure you want to delete this?",
"Copied!": "Copied!",
"Error Fetching Session URL": "Error Fetching Session URL",
- "noResultsFound": "No results found",
+ "noRunningSessionsFound": "No running sessions found",
"invalidCapType": "Invalid capability type: {{type}}",
- "whitespaceDetected": "Text Starts and/or Ends With Whitespace"
+ "whitespaceDetected": "Text Starts and/or Ends With Whitespace",
+ "duplicateCapabilityNameError": "A capability set with the same name already exists",
+ "unableToImportGestureFiles": "Could not import gestures from the following files: {{fileNames}}",
+ "invalidSessionFile": "Invalid session file",
+ "TV Labs API Key": "TV Labs API Key",
+ "TestcribeAPIKey": "Testcribe API Key",
+ "sessionTestcribeApiKeyDescription": "You can get your api key from https://app.testcribe.com/settings/apiKeys",
+ "missingVendorProperties": "Please provide the following server details for {{vendorName}}: {{vendorProps}}",
+ "missingServerInfo": "Missing server info, could not query sessions",
+ "Username": "Username",
+ "URL": "URL",
+ "WebDriver URL": "WebDriver URL",
+ "API Key": "API Key",
+ "Access Key": "Access Key",
+ "SecurityToken": "SecurityToken",
+ "AccessToken": "AccessToken",
+ "Token": "Token",
+ "Key": "Key",
+ "Secret": "Secret",
+ "Theme": "Theme",
+ "Light Theme": "Light Theme",
+ "Dark Theme": "Dark Theme",
+ "System Theme": "System Theme",
+ "Search Source": "Search Source",
+ "Matching Elements": "Matching Elements",
+ "webmateApiKey": "webmate API Key",
+ "yourProjectId": "Your Project ID",
+ "webmateProjectId": "webmate Project ID",
+ "specifyWebmateHostExplicitly": "Specify webmate host explicitly",
+ "webmateHost": "webmate Host",
+ "Enable": "Enable",
+ "yourFireflinkDevicefarmDomain": "Your Fireflink DeviceFarm Domain (e.g., cloud.fireflink.com)",
+ "yourLicenseId": "Your License ID",
+ "yourProjectName": "Your Project Name",
+ "License ID": "License ID",
+ "Project Name": "Project Name",
+ "Fireflink DeviceFarm Domain": "Fireflink DeviceFarm Domain",
+ "Fireflink DeviceFarm Access Key": "Fireflink DeviceFarm Access Key",
+ "Fireflink DeviceFarm License ID": "Fireflink DeviceFarm License ID",
+ "Fireflink DeviceFarm Project Name": "Fireflink DeviceFarm Project Name",
+ "RabbitQA API Key": "RabbitQA API Key",
+ "RestartSessionMessage": "Device Connection Lost – Restarting the Session…",
+ "ToggleRestartSession": "Toggle Session Reload Upon Device Disconnect",
+ "toggleTableFormatting": "Toggle Table Formatting",
+ "copyResultToClipboard": "Copy Result to Clipboard",
+ "Property": "Property",
+ "noCapsFound": "No session capabilities found. Please use the Capability Builder to edit, add, and save your capability set. Refer to the tutorial at {{url}}",
+ "executeMethods": "Execute Methods",
+ "dynamicCommandsDescription": "Run commands supported by the currently active driver and plugin(s). Note that some commands may only work in specific contexts. Any commands not supported by WebdriverIO are not included in this list.",
+ "dynamicExecuteMethodsDescription": "Run any execute method supported by the currently active driver and plugin(s).",
+ "methodDeprecated": "This method is deprecated",
+ "App Settings": "App Settings",
+ "unableToImportSessionFiles": "Could not import sessions from the following files: {{fileNames}}",
+ "Import from File": "Import from File",
+ "useMjpegStream": "Use MJPEG Stream",
+ "useScreenshotApi": "Use Screenshot API",
+ "Box Model": "Box Model",
+ "detachFromSession": "Detach from Session",
+ "enterSessionID": "Enter session ID for attaching manually",
+ "refreshDiscoveredSessions": "Refresh Discovered Sessions",
+ "toggleMultiDisplayMode": "Toggle Multi-Display Mode"
}
diff --git a/assets/locales/fi/translation.json b/app/common/public/locales/da/translation.json
similarity index 72%
rename from assets/locales/fi/translation.json
rename to app/common/public/locales/da/translation.json
index a0dd36cde1..9ad71e149c 100644
--- a/assets/locales/fi/translation.json
+++ b/app/common/public/locales/da/translation.json
@@ -14,7 +14,6 @@
"Zoom Out": "Zoom Out",
"Reset Zoom Level": "Reset Zoom Level",
"Close Window": "Close Window",
- "Open Session File…": "Open Session File…",
"Bring All to Front": "Bring All to Front",
"Help": "Help",
"Appium Documentation": "Appium Documentation",
@@ -41,7 +40,6 @@
"Save Server Arguments Preset": "Save Server Arguments Preset",
"Save": "Save",
"Cancel": "Cancel",
- "datetimeFormat": "MMM Do YYYY, h:mma",
"updateDetails": "Release Date: {{pubDate}}\n\nRelease Notes: {{notes}}",
"appiumIsAvailable": "Appium Inspector {{name}} is available",
"updateIsBeingDownloaded": "Update is being downloaded now. You will be notified again when it is complete",
@@ -68,20 +66,11 @@
"Could not start session": "Could not start session",
"couldNotConnect": "Could not connect to Appium server URL '{{url}}'. Please check if the server is running and the URL is correct (valid URLs can be found at the start of the Appium server log). If you are using the Inspector's browser version, ensure the server has been started with '--allow-cors'.",
"Invalid URL:": "Invalid URL:",
- "sauceCredentialsRequired": "Sauce username and access key are required!",
- "testingbotCredentialsRequired": "TestingBot key and secret are required!",
- "Perfecto SecurityToken is required": "Perfecto SecurityToken is required",
- "browserstackCredentialsRequired": "Browserstack username and access key are required!",
- "lambdatestCredentialsRequired": "Lambdatest username and access key are required!",
- "bitbarCredentialsRequired": "Bitbar API key required!",
- "kobitonCredentialsRequired": "KOBITON username and api key are required!",
- "experitestAccessKeyURLRequired": "Experitest AccessKey and URL are required",
"experitestAccessKey": "Experitest AccessKey",
"experitestUrl": "Experitest Url",
"locatorStrategy": "Locator Strategy:",
"selector": "Selector:",
"couldNotObtainScreenshot": "Could not obtain screenshot: {{screenshotError}}",
- "selectElementInSource": "Select an element in the source to begin.",
"Press Home Button": "Press Home Button",
"Execute Siri Command": "Execute Siri Command",
"Press Back Button": "Press Back Button",
@@ -100,11 +89,11 @@
"Pause Recording": "Pause Recording",
"Search for element": "Search for element",
"App Source": "App Source",
+ "Collapse All": "Collapse All",
"Toggle Attributes": "Toggle Attributes",
"Copy XML Source to Clipboard": "Copy XML Source to Clipboard",
"Download Source as .XML File": "Download Source as .XML File",
"Copy Attributes to Clipboard": "Copy Attributes to Clipboard",
- "quitSessionAndClose": "Quit Session & Close Inspector",
"Session Inactive": "Session Inactive",
"Keep Session Running": "Keep Session Running",
"Quit Session": "Quit Session",
@@ -132,8 +121,9 @@
"usingXPathNotRecommended": "Using XPath locators is not recommended and can lead to fragile tests. Ask your development team to provide unique accessibility locators instead!",
"noAdditionalContextsFound": "No additional contexts have been detected",
"contextDropdownInfo": "Multiple contexts detected; certain elements might only be accessible after switching to a different context. Note that webview inspection in Appium Inspector is less accurate than the DevTools of Chrome or Safari. For more information, see:",
- "idAutocompletionCanBeDisabled": "The requested id selector does not have a package name prefix. This Appium session has package name autocompletion enabled, which may be the reason why no elements were found. To disable this behavior, relaunch this session with the capability 'appium:disableIdLocatorAutocompletion' set to 'true'.",
+ "idAutocompletionCanBeDisabled": "The requested id selector does not have a package name prefix. This Appium session has package name autocompletion enabled, which may be the reason why no elements were found. To disable this behavior, change the 'disableIdLocatorAutocompletion' setting to 'true'.",
"missingAutomationNameForStrategies": "Additional locator strategies may be available. To view them, add the capability 'appium:automationName' when launching the session. Note that this capability is mandatory in Appium 2.",
+ "snapshotMaxDepthReached": "This element is located at the maximum source depth {{selectedElementDepth}}, therefore its child elements (if any) are not shown. To reveal them, change the 'snapshotMaxDepth' setting to a value greater than {{selectedElementDepth}}. Check your driver documentation for the maximum supported value.",
"Tap": "Tap",
"Gathering initial app source…": "Gathering initial app source…",
"couldNotObtainSource": "Could not obtain source: {{errorMsg}}",
@@ -161,15 +151,14 @@
"boolean": "boolean",
"number": "number",
"JSON object": "JSON object",
- "filepath": "filepath",
"connectToExistingSessionInstructions": "If you have an already-running session of the above server type, you can attach an inspector to it directly.",
- "selectSessionIDInDropdown": "Select the Session ID in the dropdown below.",
+ "selectSessionID": "You can manually enter your session ID, or, if the server supports session discovery, simply select from a list of active sessions.",
"allowUnauthorizedCerts": "Allow Unauthorized Certificates",
"Use Proxy": "Use Proxy",
"JSON Representation": "JSON Representation",
"Capability Builder": "Capability Builder",
"Saved Capability Sets": "Saved Capability Sets",
- "Attach to Session": "Attach to Session…",
+ "Attach": "Attach",
"localhost": "localhost",
"Host": "Host",
"Port": "Port",
@@ -195,16 +184,19 @@
"Remote Path": "Remote Path",
"BrowserStack Username": "BrowserStack Username",
"BrowserStack Access Key": "BrowserStack Access Key",
- "LambdaTest Username": "LambdaTest Username",
- "LambdaTest Access Key": "LambdaTest Access Key",
+ "TestMu AI Username": "TestMu AI Username",
+ "TestMu AI Access Key": "TestMu AI Access Key",
"Bitbar API Key": "Bitbar API Key",
"RemoteTestKit AccessToken": "RemoteTestKit AccessToken",
"RobotQA Token": "RobotQA Token",
+ "RobotActions Host": "RobotActions Host",
+ "RobotActions Token": "RobotActions Token",
+ "Add": "Add",
"Name": "Name",
"Description": "Description",
"Created": "Created",
"Actions": "Actions",
- "enterYourSessionId": "Enter your session ID here",
+ "searchSessions": "Search discovered sessions",
"Proxy URL": "Proxy URL",
"Source": "Source",
"Commands": "Commands",
@@ -212,12 +204,14 @@
"Gestures": "Gestures",
"Gesture Builder": "Gesture Builder",
"Saved Gestures": "Saved Gestures",
+ "Create New Gesture": "Create New Gesture",
"gesturesDescription": "Create, save, and execute custom gestures here. Gestures are identical to action chains in the W3C WebDriver Actions API.",
"Session Information": "Session Information",
"Execute Command": "Execute Command",
"commandsDescription": "Run various commands using the current Appium driver. Note that not all drivers support all commands.",
- "Click to Set Coordinates": "Click to Set Coordinates",
- "Set Coordinates Via Field": "Set Coordinates Via Field",
+ "showMoveActionCoordsInPercentage": "Show Coordinates of Move Actions in Screen Dimension Percentages",
+ "showMoveActionCoordsInPixels": "Show Coordinates of Move Actions in Pixels",
+ "toggleMoveActionCoordPicker": "Toggle Setting Coordinates via Clicking on Screenshot",
"Action Type": "Action Type",
"Pointer Up": "Pointer Up",
"Pointer Down": "Pointer Down",
@@ -234,29 +228,23 @@
"Left": "Left",
"Right": "Right",
"Play": "Play",
+ "Export to File": "Export to File",
"Save Capability Set As": "Save Capability Set As…",
"Edit Raw JSON": "Edit Raw JSON",
- "Enter Parameters for:": "Enter Parameters for:",
+ "enterMethodParameters": "Enter Parameters for: '{{methodName}}'",
"invalidJson": "Invalid JSON",
- "Execute Script": "Execute Script",
"App Management": "App Management",
- "Clipboard": "Clipboard",
"File Transfer": "File Transfer",
"Device Interaction": "Device Interaction",
- "Keyboard": "Keyboard",
- "Connectivity": "Connectivity",
- "Performance Data": "Performance Data",
- "System": "System",
"Session": "Session",
"Web": "Web",
"Context": "Context",
- "Window (W3C)": "Window (W3C)",
"simulatorOnly": "Emulator/simulator only",
"minAndroidSDK": "Minimum Android SDK level",
"Error": "Error",
"findingElementInSourceFailed": "Could not find the specified element. The current application source or element ID may have changed, or there may be too many elements with the same coordinates.",
"callToMethodFailed": "Call to '{{methodName}}' failed",
- "methodCallResult": "'{{methodName}}' result",
+ "methodCallResult": "Result for: '{{methodName}}' (type: {{resultType}})",
"TestingBot Key": "TestingBot Key",
"TestingBot Secret": "TestingBot Secret",
"Appium Server": "Appium Server",
@@ -269,17 +257,75 @@
"Mobitru WebDriver URL": "Mobitru WebDriver URL",
"Mobitru Billing Unit": "Mobitru Billing Unit",
"Mobitru Access Key": "Mobitru Access Key",
- "mobitruCredentialsRequired": "Mobitru Access Key is required",
"Session URL": "Session URL",
"Server Details": "Server Details",
"Session Length": "Session Length",
"Session Details": "Session Details",
"Currently Active App ID": "Currently Active App ID",
- "Session ID": "Session ID",
"confirmDeletion": "Are you sure you want to delete this?",
"Copied!": "Copied!",
"Error Fetching Session URL": "Error Fetching Session URL",
- "noResultsFound": "No results found",
+ "noRunningSessionsFound": "No running sessions found",
"invalidCapType": "Invalid capability type: {{type}}",
- "whitespaceDetected": "Text Starts and/or Ends With Whitespace"
+ "whitespaceDetected": "Text Starts and/or Ends With Whitespace",
+ "duplicateCapabilityNameError": "A capability set with the same name already exists",
+ "unableToImportGestureFiles": "Could not import gestures from the following files: {{fileNames}}",
+ "invalidSessionFile": "Invalid session file",
+ "TV Labs API Key": "TV Labs API Key",
+ "TestcribeAPIKey": "Testcribe API Key",
+ "sessionTestcribeApiKeyDescription": "You can get your api key from https://app.testcribe.com/settings/apiKeys",
+ "missingVendorProperties": "Please provide the following server details for {{vendorName}}: {{vendorProps}}",
+ "missingServerInfo": "Missing server info, could not query sessions",
+ "Username": "Username",
+ "URL": "URL",
+ "WebDriver URL": "WebDriver URL",
+ "API Key": "API Key",
+ "Access Key": "Access Key",
+ "SecurityToken": "SecurityToken",
+ "AccessToken": "AccessToken",
+ "Token": "Token",
+ "Key": "Key",
+ "Secret": "Secret",
+ "Theme": "Theme",
+ "Light Theme": "Light Theme",
+ "Dark Theme": "Dark Theme",
+ "System Theme": "System Theme",
+ "Search Source": "Search Source",
+ "Matching Elements": "Matching Elements",
+ "webmateApiKey": "webmate API Key",
+ "yourProjectId": "Your Project ID",
+ "webmateProjectId": "webmate Project ID",
+ "specifyWebmateHostExplicitly": "Specify webmate host explicitly",
+ "webmateHost": "webmate Host",
+ "Enable": "Enable",
+ "yourFireflinkDevicefarmDomain": "Your Fireflink DeviceFarm Domain (e.g., cloud.fireflink.com)",
+ "yourLicenseId": "Your License ID",
+ "yourProjectName": "Your Project Name",
+ "License ID": "License ID",
+ "Project Name": "Project Name",
+ "Fireflink DeviceFarm Domain": "Fireflink DeviceFarm Domain",
+ "Fireflink DeviceFarm Access Key": "Fireflink DeviceFarm Access Key",
+ "Fireflink DeviceFarm License ID": "Fireflink DeviceFarm License ID",
+ "Fireflink DeviceFarm Project Name": "Fireflink DeviceFarm Project Name",
+ "RabbitQA API Key": "RabbitQA API Key",
+ "RestartSessionMessage": "Device Connection Lost – Restarting the Session…",
+ "ToggleRestartSession": "Toggle Session Reload Upon Device Disconnect",
+ "toggleTableFormatting": "Toggle Table Formatting",
+ "copyResultToClipboard": "Copy Result to Clipboard",
+ "Property": "Property",
+ "noCapsFound": "No session capabilities found. Please use the Capability Builder to edit, add, and save your capability set. Refer to the tutorial at {{url}}",
+ "executeMethods": "Execute Methods",
+ "dynamicCommandsDescription": "Run commands supported by the currently active driver and plugin(s). Note that some commands may only work in specific contexts. Any commands not supported by WebdriverIO are not included in this list.",
+ "dynamicExecuteMethodsDescription": "Run any execute method supported by the currently active driver and plugin(s).",
+ "methodDeprecated": "This method is deprecated",
+ "App Settings": "App Settings",
+ "unableToImportSessionFiles": "Could not import sessions from the following files: {{fileNames}}",
+ "Import from File": "Import from File",
+ "useMjpegStream": "Use MJPEG Stream",
+ "useScreenshotApi": "Use Screenshot API",
+ "Box Model": "Box Model",
+ "detachFromSession": "Detach from Session",
+ "enterSessionID": "Enter session ID for attaching manually",
+ "refreshDiscoveredSessions": "Refresh Discovered Sessions",
+ "toggleMultiDisplayMode": "Toggle Multi-Display Mode"
}
diff --git a/assets/locales/de/translation.json b/app/common/public/locales/de/translation.json
similarity index 73%
rename from assets/locales/de/translation.json
rename to app/common/public/locales/de/translation.json
index c97ce652fe..80379c69aa 100644
--- a/assets/locales/de/translation.json
+++ b/app/common/public/locales/de/translation.json
@@ -14,7 +14,6 @@
"Zoom Out": "Zoom Out",
"Reset Zoom Level": "Reset Zoom Level",
"Close Window": "Close Window",
- "Open Session File…": "Open Session File…",
"Bring All to Front": "Alle nach vorne bringen",
"Help": "Hilfe",
"Appium Documentation": "Appium Documentation",
@@ -41,7 +40,6 @@
"Save Server Arguments Preset": "Voreinstellungen von Serverargumente sichern",
"Save": "Sichern",
"Cancel": "Abbrechen",
- "datetimeFormat": "D.M.YYYY, HH:mm",
"updateDetails": "Release Date: {{pubDate}}\n\nRelease Notes: {{notes}}",
"appiumIsAvailable": "Appium Inspector {{name}} ist verfügbar",
"updateIsBeingDownloaded": "Update is being downloaded now. You will be notified again when it is complete",
@@ -68,20 +66,11 @@
"Could not start session": "Die Session konnte nicht gestartet werden",
"couldNotConnect": "Could not connect to Appium server URL '{{url}}'. Please check if the server is running and the URL is correct (valid URLs can be found at the start of the Appium server log). If you are using the Inspector's browser version, ensure the server has been started with '--allow-cors'.",
"Invalid URL:": "Invalid URL:",
- "sauceCredentialsRequired": "Sauce username and access key are required!",
- "testingbotCredentialsRequired": "TestingBot key and secret are required!",
- "Perfecto SecurityToken is required": "Perfecto SecurityToken is required",
- "browserstackCredentialsRequired": "Browserstack username and access key are required!",
- "lambdatestCredentialsRequired": "Lambdatest username and access key are required!",
- "bitbarCredentialsRequired": "Bitbar API key required!",
- "kobitonCredentialsRequired": "KOBITON username and api key are required!",
- "experitestAccessKeyURLRequired": "Experitest AccessKey and URL are required",
"experitestAccessKey": "Experitest AccessKey",
"experitestUrl": "Experitest Url",
"locatorStrategy": "Locator-Strategie:",
"selector": "Selektor:",
"couldNotObtainScreenshot": "Could not obtain screenshot: {{screenshotError}}",
- "selectElementInSource": "Select an element in the source to begin.",
"Press Home Button": "Press Home Button",
"Execute Siri Command": "Execute Siri Command",
"Press Back Button": "Press Back Button",
@@ -100,11 +89,11 @@
"Pause Recording": "Aufnahme anhalten",
"Search for element": "Nach Element suchen",
"App Source": "App Source",
+ "Collapse All": "Collapse All",
"Toggle Attributes": "Toggle Attributes",
"Copy XML Source to Clipboard": "Die XML-Quelle in der Zwischenablage kopieren",
"Download Source as .XML File": "Download Source as .XML File",
"Copy Attributes to Clipboard": "Copy Attributes to Clipboard",
- "quitSessionAndClose": "Session beenden und Inspektor schließen",
"Session Inactive": "Die Session ist inaktiv",
"Keep Session Running": "Keep Session Running",
"Quit Session": "Session beenden",
@@ -132,8 +121,9 @@
"usingXPathNotRecommended": "Using XPath locators is not recommended and can lead to fragile tests. Ask your development team to provide unique accessibility locators instead!",
"noAdditionalContextsFound": "No additional contexts have been detected",
"contextDropdownInfo": "Multiple contexts detected; certain elements might only be accessible after switching to a different context. Note that webview inspection in Appium Inspector is less accurate than the DevTools of Chrome or Safari. For more information, see:",
- "idAutocompletionCanBeDisabled": "The requested id selector does not have a package name prefix. This Appium session has package name autocompletion enabled, which may be the reason why no elements were found. To disable this behavior, relaunch this session with the capability 'appium:disableIdLocatorAutocompletion' set to 'true'.",
+ "idAutocompletionCanBeDisabled": "The requested id selector does not have a package name prefix. This Appium session has package name autocompletion enabled, which may be the reason why no elements were found. To disable this behavior, change the 'disableIdLocatorAutocompletion' setting to 'true'.",
"missingAutomationNameForStrategies": "Additional locator strategies may be available. To view them, add the capability 'appium:automationName' when launching the session. Note that this capability is mandatory in Appium 2.",
+ "snapshotMaxDepthReached": "This element is located at the maximum source depth {{selectedElementDepth}}, therefore its child elements (if any) are not shown. To reveal them, change the 'snapshotMaxDepth' setting to a value greater than {{selectedElementDepth}}. Check your driver documentation for the maximum supported value.",
"Tap": "Tippen",
"Gathering initial app source…": "Die Anfangsquelle des Programms wird gesammelt…",
"couldNotObtainSource": "Die XML-Quelle wurde nicht erhalten: {{errorMsg}}",
@@ -161,15 +151,14 @@
"boolean": "einen Booleschen Wert",
"number": "Nummer",
"JSON object": "JSON-Objekt",
- "filepath": "Dateipfad",
"connectToExistingSessionInstructions": "If you have an already-running session of the above server type, you can attach an inspector to it directly.",
- "selectSessionIDInDropdown": "Select the Session ID in the dropdown below.",
+ "selectSessionID": "You can manually enter your session ID, or, if the server supports session discovery, simply select from a list of active sessions.",
"allowUnauthorizedCerts": "Allow Unauthorized Certificates",
"Use Proxy": "Proxy verwenden",
"JSON Representation": "JSON Representation",
"Capability Builder": "Capability Builder",
"Saved Capability Sets": "Saved Capability Sets",
- "Attach to Session": "Attach to Session…",
+ "Attach": "Attach",
"localhost": "localhost",
"Host": "Host",
"Port": "Port",
@@ -195,16 +184,19 @@
"Remote Path": "Remote Path",
"BrowserStack Username": "BrowserStack Username",
"BrowserStack Access Key": "BrowserStack Access Key",
- "LambdaTest Username": "LambdaTest Username",
- "LambdaTest Access Key": "LambdaTest Access Key",
+ "TestMu AI Username": "TestMu AI Username",
+ "TestMu AI Access Key": "TestMu AI Access Key",
"Bitbar API Key": "Bitbar API Key",
"RemoteTestKit AccessToken": "RemoteTestKit AccessToken",
"RobotQA Token": "RobotQA Token",
+ "RobotActions Host": "RobotActions Host",
+ "RobotActions Token": "RobotActions Token",
+ "Add": "Add",
"Name": "Name",
"Description": "Description",
"Created": "Created",
"Actions": "Actions",
- "enterYourSessionId": "Enter your session ID here",
+ "searchSessions": "Search discovered sessions",
"Proxy URL": "Proxy-URL",
"Source": "Source",
"Commands": "Commands",
@@ -212,12 +204,14 @@
"Gestures": "Gestures",
"Gesture Builder": "Gesture Builder",
"Saved Gestures": "Saved Gestures",
+ "Create New Gesture": "Create New Gesture",
"gesturesDescription": "Create, save, and execute custom gestures here. Gestures are identical to action chains in the W3C WebDriver Actions API.",
"Session Information": "Session Information",
"Execute Command": "Execute Command",
"commandsDescription": "Run various commands using the current Appium driver. Note that not all drivers support all commands.",
- "Click to Set Coordinates": "Click to Set Coordinates",
- "Set Coordinates Via Field": "Set Coordinates Via Field",
+ "showMoveActionCoordsInPercentage": "Show Coordinates of Move Actions in Screen Dimension Percentages",
+ "showMoveActionCoordsInPixels": "Show Coordinates of Move Actions in Pixels",
+ "toggleMoveActionCoordPicker": "Toggle Setting Coordinates via Clicking on Screenshot",
"Action Type": "Action Type",
"Pointer Up": "Pointer Up",
"Pointer Down": "Pointer Down",
@@ -234,29 +228,23 @@
"Left": "Left",
"Right": "Right",
"Play": "Play",
+ "Export to File": "Export to File",
"Save Capability Set As": "Save Capability Set As…",
"Edit Raw JSON": "Edit Raw JSON",
- "Enter Parameters for:": "Enter Parameters for:",
+ "enterMethodParameters": "Enter Parameters for: '{{methodName}}'",
"invalidJson": "Invalid JSON",
- "Execute Script": "Execute Script",
"App Management": "App Management",
- "Clipboard": "Zwischenablage",
"File Transfer": "File Transfer",
"Device Interaction": "Device Interaction",
- "Keyboard": "Keyboard",
- "Connectivity": "Connectivity",
- "Performance Data": "Leistungsdaten",
- "System": "System",
"Session": "Session",
"Web": "Web",
"Context": "Context",
- "Window (W3C)": "Window (W3C)",
"simulatorOnly": "Emulator/simulator only",
"minAndroidSDK": "Minimum Android SDK level",
"Error": "Fehler",
"findingElementInSourceFailed": "Could not find the specified element. The current application source or element ID may have changed, or there may be too many elements with the same coordinates.",
"callToMethodFailed": "Call to '{{methodName}}' failed",
- "methodCallResult": "Ergebnis von '{{methodName}}'",
+ "methodCallResult": "Result for: '{{methodName}}' (type: {{resultType}})",
"TestingBot Key": "TestingBot-Schlüssel",
"TestingBot Secret": "TestingBot Secret",
"Appium Server": "Appium Server",
@@ -269,17 +257,75 @@
"Mobitru WebDriver URL": "Mobitru WebDriver URL",
"Mobitru Billing Unit": "Mobitru Billing Unit",
"Mobitru Access Key": "Mobitru Access Key",
- "mobitruCredentialsRequired": "Mobitru Access Key is required",
"Session URL": "Session URL",
"Server Details": "Server Details",
"Session Length": "Session Length",
"Session Details": "Session Details",
"Currently Active App ID": "Currently Active App ID",
- "Session ID": "Session ID",
"confirmDeletion": "Are you sure you want to delete this?",
"Copied!": "Copied!",
"Error Fetching Session URL": "Error Fetching Session URL",
- "noResultsFound": "No results found",
+ "noRunningSessionsFound": "No running sessions found",
"invalidCapType": "Invalid capability type: {{type}}",
- "whitespaceDetected": "Text Starts and/or Ends With Whitespace"
+ "whitespaceDetected": "Text Starts and/or Ends With Whitespace",
+ "duplicateCapabilityNameError": "A capability set with the same name already exists",
+ "unableToImportGestureFiles": "Could not import gestures from the following files: {{fileNames}}",
+ "invalidSessionFile": "Invalid session file",
+ "TV Labs API Key": "TV Labs API Key",
+ "TestcribeAPIKey": "Testcribe API Key",
+ "sessionTestcribeApiKeyDescription": "You can get your api key from https://app.testcribe.com/settings/apiKeys",
+ "missingVendorProperties": "Please provide the following server details for {{vendorName}}: {{vendorProps}}",
+ "missingServerInfo": "Missing server info, could not query sessions",
+ "Username": "Username",
+ "URL": "URL",
+ "WebDriver URL": "WebDriver URL",
+ "API Key": "API Key",
+ "Access Key": "Access Key",
+ "SecurityToken": "SecurityToken",
+ "AccessToken": "AccessToken",
+ "Token": "Token",
+ "Key": "Key",
+ "Secret": "Secret",
+ "Theme": "Theme",
+ "Light Theme": "Light Theme",
+ "Dark Theme": "Dark Theme",
+ "System Theme": "System Theme",
+ "Search Source": "Search Source",
+ "Matching Elements": "Matching Elements",
+ "webmateApiKey": "webmate API Key",
+ "yourProjectId": "Your Project ID",
+ "webmateProjectId": "webmate Project ID",
+ "specifyWebmateHostExplicitly": "Specify webmate host explicitly",
+ "webmateHost": "webmate Host",
+ "Enable": "Enable",
+ "yourFireflinkDevicefarmDomain": "Your Fireflink DeviceFarm Domain (e.g., cloud.fireflink.com)",
+ "yourLicenseId": "Your License ID",
+ "yourProjectName": "Your Project Name",
+ "License ID": "License ID",
+ "Project Name": "Project Name",
+ "Fireflink DeviceFarm Domain": "Fireflink DeviceFarm Domain",
+ "Fireflink DeviceFarm Access Key": "Fireflink DeviceFarm Access Key",
+ "Fireflink DeviceFarm License ID": "Fireflink DeviceFarm License ID",
+ "Fireflink DeviceFarm Project Name": "Fireflink DeviceFarm Project Name",
+ "RabbitQA API Key": "RabbitQA API Key",
+ "RestartSessionMessage": "Device Connection Lost – Restarting the Session…",
+ "ToggleRestartSession": "Toggle Session Reload Upon Device Disconnect",
+ "toggleTableFormatting": "Toggle Table Formatting",
+ "copyResultToClipboard": "Copy Result to Clipboard",
+ "Property": "Property",
+ "noCapsFound": "No session capabilities found. Please use the Capability Builder to edit, add, and save your capability set. Refer to the tutorial at {{url}}",
+ "executeMethods": "Execute Methods",
+ "dynamicCommandsDescription": "Run commands supported by the currently active driver and plugin(s). Note that some commands may only work in specific contexts. Any commands not supported by WebdriverIO are not included in this list.",
+ "dynamicExecuteMethodsDescription": "Run any execute method supported by the currently active driver and plugin(s).",
+ "methodDeprecated": "This method is deprecated",
+ "App Settings": "App Settings",
+ "unableToImportSessionFiles": "Could not import sessions from the following files: {{fileNames}}",
+ "Import from File": "Import from File",
+ "useMjpegStream": "Use MJPEG Stream",
+ "useScreenshotApi": "Use Screenshot API",
+ "Box Model": "Box Model",
+ "detachFromSession": "Detach from Session",
+ "enterSessionID": "Enter session ID for attaching manually",
+ "refreshDiscoveredSessions": "Refresh Discovered Sessions",
+ "toggleMultiDisplayMode": "Toggle Multi-Display Mode"
}
diff --git a/assets/locales/en/translation.json b/app/common/public/locales/en/translation.json
similarity index 72%
rename from assets/locales/en/translation.json
rename to app/common/public/locales/en/translation.json
index a0dd36cde1..9ad71e149c 100644
--- a/assets/locales/en/translation.json
+++ b/app/common/public/locales/en/translation.json
@@ -14,7 +14,6 @@
"Zoom Out": "Zoom Out",
"Reset Zoom Level": "Reset Zoom Level",
"Close Window": "Close Window",
- "Open Session File…": "Open Session File…",
"Bring All to Front": "Bring All to Front",
"Help": "Help",
"Appium Documentation": "Appium Documentation",
@@ -41,7 +40,6 @@
"Save Server Arguments Preset": "Save Server Arguments Preset",
"Save": "Save",
"Cancel": "Cancel",
- "datetimeFormat": "MMM Do YYYY, h:mma",
"updateDetails": "Release Date: {{pubDate}}\n\nRelease Notes: {{notes}}",
"appiumIsAvailable": "Appium Inspector {{name}} is available",
"updateIsBeingDownloaded": "Update is being downloaded now. You will be notified again when it is complete",
@@ -68,20 +66,11 @@
"Could not start session": "Could not start session",
"couldNotConnect": "Could not connect to Appium server URL '{{url}}'. Please check if the server is running and the URL is correct (valid URLs can be found at the start of the Appium server log). If you are using the Inspector's browser version, ensure the server has been started with '--allow-cors'.",
"Invalid URL:": "Invalid URL:",
- "sauceCredentialsRequired": "Sauce username and access key are required!",
- "testingbotCredentialsRequired": "TestingBot key and secret are required!",
- "Perfecto SecurityToken is required": "Perfecto SecurityToken is required",
- "browserstackCredentialsRequired": "Browserstack username and access key are required!",
- "lambdatestCredentialsRequired": "Lambdatest username and access key are required!",
- "bitbarCredentialsRequired": "Bitbar API key required!",
- "kobitonCredentialsRequired": "KOBITON username and api key are required!",
- "experitestAccessKeyURLRequired": "Experitest AccessKey and URL are required",
"experitestAccessKey": "Experitest AccessKey",
"experitestUrl": "Experitest Url",
"locatorStrategy": "Locator Strategy:",
"selector": "Selector:",
"couldNotObtainScreenshot": "Could not obtain screenshot: {{screenshotError}}",
- "selectElementInSource": "Select an element in the source to begin.",
"Press Home Button": "Press Home Button",
"Execute Siri Command": "Execute Siri Command",
"Press Back Button": "Press Back Button",
@@ -100,11 +89,11 @@
"Pause Recording": "Pause Recording",
"Search for element": "Search for element",
"App Source": "App Source",
+ "Collapse All": "Collapse All",
"Toggle Attributes": "Toggle Attributes",
"Copy XML Source to Clipboard": "Copy XML Source to Clipboard",
"Download Source as .XML File": "Download Source as .XML File",
"Copy Attributes to Clipboard": "Copy Attributes to Clipboard",
- "quitSessionAndClose": "Quit Session & Close Inspector",
"Session Inactive": "Session Inactive",
"Keep Session Running": "Keep Session Running",
"Quit Session": "Quit Session",
@@ -132,8 +121,9 @@
"usingXPathNotRecommended": "Using XPath locators is not recommended and can lead to fragile tests. Ask your development team to provide unique accessibility locators instead!",
"noAdditionalContextsFound": "No additional contexts have been detected",
"contextDropdownInfo": "Multiple contexts detected; certain elements might only be accessible after switching to a different context. Note that webview inspection in Appium Inspector is less accurate than the DevTools of Chrome or Safari. For more information, see:",
- "idAutocompletionCanBeDisabled": "The requested id selector does not have a package name prefix. This Appium session has package name autocompletion enabled, which may be the reason why no elements were found. To disable this behavior, relaunch this session with the capability 'appium:disableIdLocatorAutocompletion' set to 'true'.",
+ "idAutocompletionCanBeDisabled": "The requested id selector does not have a package name prefix. This Appium session has package name autocompletion enabled, which may be the reason why no elements were found. To disable this behavior, change the 'disableIdLocatorAutocompletion' setting to 'true'.",
"missingAutomationNameForStrategies": "Additional locator strategies may be available. To view them, add the capability 'appium:automationName' when launching the session. Note that this capability is mandatory in Appium 2.",
+ "snapshotMaxDepthReached": "This element is located at the maximum source depth {{selectedElementDepth}}, therefore its child elements (if any) are not shown. To reveal them, change the 'snapshotMaxDepth' setting to a value greater than {{selectedElementDepth}}. Check your driver documentation for the maximum supported value.",
"Tap": "Tap",
"Gathering initial app source…": "Gathering initial app source…",
"couldNotObtainSource": "Could not obtain source: {{errorMsg}}",
@@ -161,15 +151,14 @@
"boolean": "boolean",
"number": "number",
"JSON object": "JSON object",
- "filepath": "filepath",
"connectToExistingSessionInstructions": "If you have an already-running session of the above server type, you can attach an inspector to it directly.",
- "selectSessionIDInDropdown": "Select the Session ID in the dropdown below.",
+ "selectSessionID": "You can manually enter your session ID, or, if the server supports session discovery, simply select from a list of active sessions.",
"allowUnauthorizedCerts": "Allow Unauthorized Certificates",
"Use Proxy": "Use Proxy",
"JSON Representation": "JSON Representation",
"Capability Builder": "Capability Builder",
"Saved Capability Sets": "Saved Capability Sets",
- "Attach to Session": "Attach to Session…",
+ "Attach": "Attach",
"localhost": "localhost",
"Host": "Host",
"Port": "Port",
@@ -195,16 +184,19 @@
"Remote Path": "Remote Path",
"BrowserStack Username": "BrowserStack Username",
"BrowserStack Access Key": "BrowserStack Access Key",
- "LambdaTest Username": "LambdaTest Username",
- "LambdaTest Access Key": "LambdaTest Access Key",
+ "TestMu AI Username": "TestMu AI Username",
+ "TestMu AI Access Key": "TestMu AI Access Key",
"Bitbar API Key": "Bitbar API Key",
"RemoteTestKit AccessToken": "RemoteTestKit AccessToken",
"RobotQA Token": "RobotQA Token",
+ "RobotActions Host": "RobotActions Host",
+ "RobotActions Token": "RobotActions Token",
+ "Add": "Add",
"Name": "Name",
"Description": "Description",
"Created": "Created",
"Actions": "Actions",
- "enterYourSessionId": "Enter your session ID here",
+ "searchSessions": "Search discovered sessions",
"Proxy URL": "Proxy URL",
"Source": "Source",
"Commands": "Commands",
@@ -212,12 +204,14 @@
"Gestures": "Gestures",
"Gesture Builder": "Gesture Builder",
"Saved Gestures": "Saved Gestures",
+ "Create New Gesture": "Create New Gesture",
"gesturesDescription": "Create, save, and execute custom gestures here. Gestures are identical to action chains in the W3C WebDriver Actions API.",
"Session Information": "Session Information",
"Execute Command": "Execute Command",
"commandsDescription": "Run various commands using the current Appium driver. Note that not all drivers support all commands.",
- "Click to Set Coordinates": "Click to Set Coordinates",
- "Set Coordinates Via Field": "Set Coordinates Via Field",
+ "showMoveActionCoordsInPercentage": "Show Coordinates of Move Actions in Screen Dimension Percentages",
+ "showMoveActionCoordsInPixels": "Show Coordinates of Move Actions in Pixels",
+ "toggleMoveActionCoordPicker": "Toggle Setting Coordinates via Clicking on Screenshot",
"Action Type": "Action Type",
"Pointer Up": "Pointer Up",
"Pointer Down": "Pointer Down",
@@ -234,29 +228,23 @@
"Left": "Left",
"Right": "Right",
"Play": "Play",
+ "Export to File": "Export to File",
"Save Capability Set As": "Save Capability Set As…",
"Edit Raw JSON": "Edit Raw JSON",
- "Enter Parameters for:": "Enter Parameters for:",
+ "enterMethodParameters": "Enter Parameters for: '{{methodName}}'",
"invalidJson": "Invalid JSON",
- "Execute Script": "Execute Script",
"App Management": "App Management",
- "Clipboard": "Clipboard",
"File Transfer": "File Transfer",
"Device Interaction": "Device Interaction",
- "Keyboard": "Keyboard",
- "Connectivity": "Connectivity",
- "Performance Data": "Performance Data",
- "System": "System",
"Session": "Session",
"Web": "Web",
"Context": "Context",
- "Window (W3C)": "Window (W3C)",
"simulatorOnly": "Emulator/simulator only",
"minAndroidSDK": "Minimum Android SDK level",
"Error": "Error",
"findingElementInSourceFailed": "Could not find the specified element. The current application source or element ID may have changed, or there may be too many elements with the same coordinates.",
"callToMethodFailed": "Call to '{{methodName}}' failed",
- "methodCallResult": "'{{methodName}}' result",
+ "methodCallResult": "Result for: '{{methodName}}' (type: {{resultType}})",
"TestingBot Key": "TestingBot Key",
"TestingBot Secret": "TestingBot Secret",
"Appium Server": "Appium Server",
@@ -269,17 +257,75 @@
"Mobitru WebDriver URL": "Mobitru WebDriver URL",
"Mobitru Billing Unit": "Mobitru Billing Unit",
"Mobitru Access Key": "Mobitru Access Key",
- "mobitruCredentialsRequired": "Mobitru Access Key is required",
"Session URL": "Session URL",
"Server Details": "Server Details",
"Session Length": "Session Length",
"Session Details": "Session Details",
"Currently Active App ID": "Currently Active App ID",
- "Session ID": "Session ID",
"confirmDeletion": "Are you sure you want to delete this?",
"Copied!": "Copied!",
"Error Fetching Session URL": "Error Fetching Session URL",
- "noResultsFound": "No results found",
+ "noRunningSessionsFound": "No running sessions found",
"invalidCapType": "Invalid capability type: {{type}}",
- "whitespaceDetected": "Text Starts and/or Ends With Whitespace"
+ "whitespaceDetected": "Text Starts and/or Ends With Whitespace",
+ "duplicateCapabilityNameError": "A capability set with the same name already exists",
+ "unableToImportGestureFiles": "Could not import gestures from the following files: {{fileNames}}",
+ "invalidSessionFile": "Invalid session file",
+ "TV Labs API Key": "TV Labs API Key",
+ "TestcribeAPIKey": "Testcribe API Key",
+ "sessionTestcribeApiKeyDescription": "You can get your api key from https://app.testcribe.com/settings/apiKeys",
+ "missingVendorProperties": "Please provide the following server details for {{vendorName}}: {{vendorProps}}",
+ "missingServerInfo": "Missing server info, could not query sessions",
+ "Username": "Username",
+ "URL": "URL",
+ "WebDriver URL": "WebDriver URL",
+ "API Key": "API Key",
+ "Access Key": "Access Key",
+ "SecurityToken": "SecurityToken",
+ "AccessToken": "AccessToken",
+ "Token": "Token",
+ "Key": "Key",
+ "Secret": "Secret",
+ "Theme": "Theme",
+ "Light Theme": "Light Theme",
+ "Dark Theme": "Dark Theme",
+ "System Theme": "System Theme",
+ "Search Source": "Search Source",
+ "Matching Elements": "Matching Elements",
+ "webmateApiKey": "webmate API Key",
+ "yourProjectId": "Your Project ID",
+ "webmateProjectId": "webmate Project ID",
+ "specifyWebmateHostExplicitly": "Specify webmate host explicitly",
+ "webmateHost": "webmate Host",
+ "Enable": "Enable",
+ "yourFireflinkDevicefarmDomain": "Your Fireflink DeviceFarm Domain (e.g., cloud.fireflink.com)",
+ "yourLicenseId": "Your License ID",
+ "yourProjectName": "Your Project Name",
+ "License ID": "License ID",
+ "Project Name": "Project Name",
+ "Fireflink DeviceFarm Domain": "Fireflink DeviceFarm Domain",
+ "Fireflink DeviceFarm Access Key": "Fireflink DeviceFarm Access Key",
+ "Fireflink DeviceFarm License ID": "Fireflink DeviceFarm License ID",
+ "Fireflink DeviceFarm Project Name": "Fireflink DeviceFarm Project Name",
+ "RabbitQA API Key": "RabbitQA API Key",
+ "RestartSessionMessage": "Device Connection Lost – Restarting the Session…",
+ "ToggleRestartSession": "Toggle Session Reload Upon Device Disconnect",
+ "toggleTableFormatting": "Toggle Table Formatting",
+ "copyResultToClipboard": "Copy Result to Clipboard",
+ "Property": "Property",
+ "noCapsFound": "No session capabilities found. Please use the Capability Builder to edit, add, and save your capability set. Refer to the tutorial at {{url}}",
+ "executeMethods": "Execute Methods",
+ "dynamicCommandsDescription": "Run commands supported by the currently active driver and plugin(s). Note that some commands may only work in specific contexts. Any commands not supported by WebdriverIO are not included in this list.",
+ "dynamicExecuteMethodsDescription": "Run any execute method supported by the currently active driver and plugin(s).",
+ "methodDeprecated": "This method is deprecated",
+ "App Settings": "App Settings",
+ "unableToImportSessionFiles": "Could not import sessions from the following files: {{fileNames}}",
+ "Import from File": "Import from File",
+ "useMjpegStream": "Use MJPEG Stream",
+ "useScreenshotApi": "Use Screenshot API",
+ "Box Model": "Box Model",
+ "detachFromSession": "Detach from Session",
+ "enterSessionID": "Enter session ID for attaching manually",
+ "refreshDiscoveredSessions": "Refresh Discovered Sessions",
+ "toggleMultiDisplayMode": "Toggle Multi-Display Mode"
}
diff --git a/assets/locales/es-ES/translation.json b/app/common/public/locales/es-ES/translation.json
similarity index 72%
rename from assets/locales/es-ES/translation.json
rename to app/common/public/locales/es-ES/translation.json
index b0f2443188..323a26a1e0 100644
--- a/assets/locales/es-ES/translation.json
+++ b/app/common/public/locales/es-ES/translation.json
@@ -14,10 +14,9 @@
"Zoom Out": "Zoom Out",
"Reset Zoom Level": "Reset Zoom Level",
"Close Window": "Close Window",
- "Open Session File…": "Open Session File…",
"Bring All to Front": "Traer todo al frente",
"Help": "Ayuda",
- "Appium Documentation": "Appium Documentation",
+ "Appium Documentation": "Documentación de Appium",
"Inspector Documentation": "Inspector Documentation",
"Appium Discussion Forum": "Appium Discussion Forum",
"Report Issues": "Report Issues",
@@ -26,8 +25,8 @@
"Improve Translations": "Improve Translations",
"Check for Updates…": "Check for Updates…",
"File": "Archivo",
- "New Window": "New Window",
- "Hide Appium Inspector": "Hide Appium Inspector",
+ "New Window": "Nueva ventana",
+ "Hide Appium Inspector": "Ocultar inspector de Appium",
"Hide Others": "Ocultar otras",
"Show All": "Mostrar todo",
"Quit Appium Inspector": "Quit Appium Inspector",
@@ -41,7 +40,6 @@
"Save Server Arguments Preset": "Guardar ajuste del servidor",
"Save": "Guardar",
"Cancel": "Cancelar",
- "datetimeFormat": "MMM Do YYYYY, h:mma",
"updateDetails": "Fecha de lanzamiento: {{pubDate}}\n\nnotas: {{notes}}",
"appiumIsAvailable": "Appium Inspector {{name}} está disponible",
"updateIsBeingDownloaded": "La actualización está siendo descargada ahora. Se le notificará de nuevo cuando esté completa",
@@ -68,20 +66,11 @@
"Could not start session": "No se pudo iniciar la sesión",
"couldNotConnect": "Could not connect to Appium server URL '{{url}}'. Please check if the server is running and the URL is correct (valid URLs can be found at the start of the Appium server log). If you are using the Inspector's browser version, ensure the server has been started with '--allow-cors'.",
"Invalid URL:": "Invalid URL:",
- "sauceCredentialsRequired": "¡Se requiere nombre de usuario y clave de acceso para Saucelabs!",
- "testingbotCredentialsRequired": "TestingBot key and secret are required!",
- "Perfecto SecurityToken is required": "Perfecto SecurityToken es requerido",
- "browserstackCredentialsRequired": "¡Se requiere nombre de usuario y clave de acceso para Browserstack!",
- "lambdatestCredentialsRequired": "Lambdatest username and access key are required!",
- "bitbarCredentialsRequired": "¡Clave API de Bitbar requerida!",
- "kobitonCredentialsRequired": "¡Se requiere nombre de usuario y clave api para KOBITON!",
- "experitestAccessKeyURLRequired": "Experitest AccessKey and URL are required",
"experitestAccessKey": "Experitest AccessKey",
"experitestUrl": "Experitest Url",
"locatorStrategy": "Estrategia de localizador:",
"selector": "Selector:",
"couldNotObtainScreenshot": "No se pudo obtener captura de pantalla: {{screenshotError}}",
- "selectElementInSource": "Select an element in the source to begin.",
"Press Home Button": "Press Home Button",
"Execute Siri Command": "Execute Siri Command",
"Press Back Button": "Press Back Button",
@@ -93,18 +82,18 @@
"Tap/Swipe By Coordinates": "Tap/Swipe By Coordinates",
"Download Screenshot": "Download Screenshot",
"Back": "Atrás",
- "Start Refreshing Source": "Start Refreshing Source",
+ "Start Refreshing Source": "Empezar a actualizar la fuente",
"Pause Refreshing Source": "Pause Refreshing Source",
"refreshSource": "Refrescar fuente y captura de pantalla",
"Start Recording": "Iniciar grabación",
"Pause Recording": "Pausar grabación",
"Search for element": "Buscar elemento",
"App Source": "App Source",
+ "Collapse All": "Collapse All",
"Toggle Attributes": "Toggle Attributes",
"Copy XML Source to Clipboard": "Copiar fuente XML al portapapeles",
"Download Source as .XML File": "Download Source as .XML File",
"Copy Attributes to Clipboard": "Copy Attributes to Clipboard",
- "quitSessionAndClose": "Salir de Sesión y Cerrar Inspector",
"Session Inactive": "Sesión inactiva",
"Keep Session Running": "Mantener sesión en ejecución",
"Quit Session": "Salir de sesión",
@@ -132,8 +121,9 @@
"usingXPathNotRecommended": "El uso de los localizadores XPath no es recomendado y puede llevar a pruebas frágiles. ¡Pide a tu equipo de desarrollo que proporcione a los localizadores de accesibilidad únicos en su lugar!",
"noAdditionalContextsFound": "No additional contexts have been detected",
"contextDropdownInfo": "Multiple contexts detected; certain elements might only be accessible after switching to a different context. Note that webview inspection in Appium Inspector is less accurate than the DevTools of Chrome or Safari. For more information, see:",
- "idAutocompletionCanBeDisabled": "The requested id selector does not have a package name prefix. This Appium session has package name autocompletion enabled, which may be the reason why no elements were found. To disable this behavior, relaunch this session with the capability 'appium:disableIdLocatorAutocompletion' set to 'true'.",
+ "idAutocompletionCanBeDisabled": "The requested id selector does not have a package name prefix. This Appium session has package name autocompletion enabled, which may be the reason why no elements were found. To disable this behavior, change the 'disableIdLocatorAutocompletion' setting to 'true'.",
"missingAutomationNameForStrategies": "Additional locator strategies may be available. To view them, add the capability 'appium:automationName' when launching the session. Note that this capability is mandatory in Appium 2.",
+ "snapshotMaxDepthReached": "This element is located at the maximum source depth {{selectedElementDepth}}, therefore its child elements (if any) are not shown. To reveal them, change the 'snapshotMaxDepth' setting to a value greater than {{selectedElementDepth}}. Check your driver documentation for the maximum supported value.",
"Tap": "Tap",
"Gathering initial app source…": "Recolectando código fuente inicial de la aplicación…",
"couldNotObtainSource": "No se pudo obtener fuente: {{errorMsg}}",
@@ -161,15 +151,14 @@
"boolean": "booleano",
"number": "número",
"JSON object": "objeto JSON",
- "filepath": "ruta",
"connectToExistingSessionInstructions": "Si tiene una sesión ya en ejecución, puedes adjuntar un inspector directamente a él.",
- "selectSessionIDInDropdown": "Seleccione la ID de sesión en el desplegable a continuación.",
+ "selectSessionID": "You can manually enter your session ID, or, if the server supports session discovery, simply select from a list of active sessions.",
"allowUnauthorizedCerts": "Permitir certificados no autorizados",
"Use Proxy": "Usar proxy",
"JSON Representation": "JSON Representation",
"Capability Builder": "Capability Builder",
"Saved Capability Sets": "Saved Capability Sets",
- "Attach to Session": "Adjuntar a la sesión…",
+ "Attach": "Attach",
"localhost": "localhost",
"Host": "Host",
"Port": "Puerto",
@@ -195,16 +184,19 @@
"Remote Path": "Ruta Remota",
"BrowserStack Username": "Usuario de BrowserStack",
"BrowserStack Access Key": "Clave de Acceso de BrowserStack",
- "LambdaTest Username": "LambdaTest Username",
- "LambdaTest Access Key": "LambdaTest Access Key",
+ "TestMu AI Username": "TestMu AI Username",
+ "TestMu AI Access Key": "TestMu AI Access Key",
"Bitbar API Key": "Clave de la API de Bitbar",
"RemoteTestKit AccessToken": "RemoteTestKit AccessToken",
"RobotQA Token": "RobotQA Token",
+ "RobotActions Host": "RobotActions Host",
+ "RobotActions Token": "RobotActions Token",
+ "Add": "Add",
"Name": "Nombre",
"Description": "Description",
"Created": "Created",
"Actions": "Actions",
- "enterYourSessionId": "Introduce tu ID de sesión aquí",
+ "searchSessions": "Search discovered sessions",
"Proxy URL": "URL del proxy",
"Source": "Origen",
"Commands": "Commands",
@@ -212,12 +204,14 @@
"Gestures": "Gestures",
"Gesture Builder": "Gesture Builder",
"Saved Gestures": "Saved Gestures",
+ "Create New Gesture": "Create New Gesture",
"gesturesDescription": "Create, save, and execute custom gestures here. Gestures are identical to action chains in the W3C WebDriver Actions API.",
"Session Information": "Session Information",
"Execute Command": "Execute Command",
"commandsDescription": "Run various commands using the current Appium driver. Note that not all drivers support all commands.",
- "Click to Set Coordinates": "Click to Set Coordinates",
- "Set Coordinates Via Field": "Set Coordinates Via Field",
+ "showMoveActionCoordsInPercentage": "Show Coordinates of Move Actions in Screen Dimension Percentages",
+ "showMoveActionCoordsInPixels": "Show Coordinates of Move Actions in Pixels",
+ "toggleMoveActionCoordPicker": "Toggle Setting Coordinates via Clicking on Screenshot",
"Action Type": "Action Type",
"Pointer Up": "Pointer Up",
"Pointer Down": "Pointer Down",
@@ -234,29 +228,23 @@
"Left": "Left",
"Right": "Right",
"Play": "Play",
+ "Export to File": "Export to File",
"Save Capability Set As": "Guardar el conjunto de capacidades como…",
"Edit Raw JSON": "Editar JSON sin procesar",
- "Enter Parameters for:": "Enter Parameters for:",
+ "enterMethodParameters": "Enter Parameters for: '{{methodName}}'",
"invalidJson": "Invalid JSON",
- "Execute Script": "Execute Script",
"App Management": "App Management",
- "Clipboard": "Portapapeles",
"File Transfer": "File Transfer",
"Device Interaction": "Device Interaction",
- "Keyboard": "Keyboard",
- "Connectivity": "Connectivity",
- "Performance Data": "Datos de rendimiento",
- "System": "Sistema",
"Session": "Sesión",
"Web": "Web",
"Context": "Context",
- "Window (W3C)": "Window (W3C)",
"simulatorOnly": "Emulator/simulator only",
"minAndroidSDK": "Minimum Android SDK level",
"Error": "Error",
"findingElementInSourceFailed": "Could not find the specified element. The current application source or element ID may have changed, or there may be too many elements with the same coordinates.",
"callToMethodFailed": "Llamada a '{{methodName}}' falló",
- "methodCallResult": "Resultado de '{{methodName}}'",
+ "methodCallResult": "Result for: '{{methodName}}' (type: {{resultType}})",
"TestingBot Key": "Clave de TestingBot",
"TestingBot Secret": "Secreto de TestingBot",
"Appium Server": "Appium Server",
@@ -269,17 +257,75 @@
"Mobitru WebDriver URL": "Mobitru WebDriver URL",
"Mobitru Billing Unit": "Mobitru Billing Unit",
"Mobitru Access Key": "Mobitru Access Key",
- "mobitruCredentialsRequired": "Mobitru Access Key is required",
"Session URL": "Session URL",
"Server Details": "Server Details",
"Session Length": "Session Length",
"Session Details": "Session Details",
"Currently Active App ID": "Currently Active App ID",
- "Session ID": "Session ID",
"confirmDeletion": "Are you sure you want to delete this?",
"Copied!": "Copied!",
"Error Fetching Session URL": "Error Fetching Session URL",
- "noResultsFound": "No results found",
+ "noRunningSessionsFound": "No running sessions found",
"invalidCapType": "Invalid capability type: {{type}}",
- "whitespaceDetected": "Text Starts and/or Ends With Whitespace"
+ "whitespaceDetected": "Text Starts and/or Ends With Whitespace",
+ "duplicateCapabilityNameError": "A capability set with the same name already exists",
+ "unableToImportGestureFiles": "Could not import gestures from the following files: {{fileNames}}",
+ "invalidSessionFile": "Invalid session file",
+ "TV Labs API Key": "TV Labs API Key",
+ "TestcribeAPIKey": "Testcribe API Key",
+ "sessionTestcribeApiKeyDescription": "You can get your api key from https://app.testcribe.com/settings/apiKeys",
+ "missingVendorProperties": "Please provide the following server details for {{vendorName}}: {{vendorProps}}",
+ "missingServerInfo": "Missing server info, could not query sessions",
+ "Username": "Username",
+ "URL": "URL",
+ "WebDriver URL": "WebDriver URL",
+ "API Key": "API Key",
+ "Access Key": "Access Key",
+ "SecurityToken": "SecurityToken",
+ "AccessToken": "AccessToken",
+ "Token": "Token",
+ "Key": "Key",
+ "Secret": "Secret",
+ "Theme": "Theme",
+ "Light Theme": "Light Theme",
+ "Dark Theme": "Dark Theme",
+ "System Theme": "System Theme",
+ "Search Source": "Search Source",
+ "Matching Elements": "Matching Elements",
+ "webmateApiKey": "webmate API Key",
+ "yourProjectId": "Your Project ID",
+ "webmateProjectId": "webmate Project ID",
+ "specifyWebmateHostExplicitly": "Specify webmate host explicitly",
+ "webmateHost": "webmate Host",
+ "Enable": "Enable",
+ "yourFireflinkDevicefarmDomain": "Your Fireflink DeviceFarm Domain (e.g., cloud.fireflink.com)",
+ "yourLicenseId": "Your License ID",
+ "yourProjectName": "Your Project Name",
+ "License ID": "License ID",
+ "Project Name": "Project Name",
+ "Fireflink DeviceFarm Domain": "Fireflink DeviceFarm Domain",
+ "Fireflink DeviceFarm Access Key": "Fireflink DeviceFarm Access Key",
+ "Fireflink DeviceFarm License ID": "Fireflink DeviceFarm License ID",
+ "Fireflink DeviceFarm Project Name": "Fireflink DeviceFarm Project Name",
+ "RabbitQA API Key": "RabbitQA API Key",
+ "RestartSessionMessage": "Device Connection Lost – Restarting the Session…",
+ "ToggleRestartSession": "Toggle Session Reload Upon Device Disconnect",
+ "toggleTableFormatting": "Toggle Table Formatting",
+ "copyResultToClipboard": "Copy Result to Clipboard",
+ "Property": "Property",
+ "noCapsFound": "No session capabilities found. Please use the Capability Builder to edit, add, and save your capability set. Refer to the tutorial at {{url}}",
+ "executeMethods": "Execute Methods",
+ "dynamicCommandsDescription": "Run commands supported by the currently active driver and plugin(s). Note that some commands may only work in specific contexts. Any commands not supported by WebdriverIO are not included in this list.",
+ "dynamicExecuteMethodsDescription": "Run any execute method supported by the currently active driver and plugin(s).",
+ "methodDeprecated": "This method is deprecated",
+ "App Settings": "App Settings",
+ "unableToImportSessionFiles": "Could not import sessions from the following files: {{fileNames}}",
+ "Import from File": "Import from File",
+ "useMjpegStream": "Use MJPEG Stream",
+ "useScreenshotApi": "Use Screenshot API",
+ "Box Model": "Box Model",
+ "detachFromSession": "Detach from Session",
+ "enterSessionID": "Enter session ID for attaching manually",
+ "refreshDiscoveredSessions": "Refresh Discovered Sessions",
+ "toggleMultiDisplayMode": "Toggle Multi-Display Mode"
}
diff --git a/assets/locales/fa/translation.json b/app/common/public/locales/fa/translation.json
similarity index 75%
rename from assets/locales/fa/translation.json
rename to app/common/public/locales/fa/translation.json
index 9a38a7808e..147a4216d6 100644
--- a/assets/locales/fa/translation.json
+++ b/app/common/public/locales/fa/translation.json
@@ -14,7 +14,6 @@
"Zoom Out": "Zoom Out",
"Reset Zoom Level": "Reset Zoom Level",
"Close Window": "Close Window",
- "Open Session File…": "Open Session File…",
"Bring All to Front": "آوردن همه به جلو",
"Help": "راهنما",
"Appium Documentation": "Appium Documentation",
@@ -41,7 +40,6 @@
"Save Server Arguments Preset": "ذخیره آرگومان های از پیش تعیین شده سرور",
"Save": "ذخیره سازی",
"Cancel": "انصراف",
- "datetimeFormat": "MMM یا YYYY و یا h:mma",
"updateDetails": "تاریخ انتشار: {{pubDate}}\n\nیادداشت انتشار: {{notes}}",
"appiumIsAvailable": "نرمافزار Appium Inspector {{name}} در دسترس است",
"updateIsBeingDownloaded": "بروزرسانی دانلود شده است. هنگام تکمیل به شما اطلاع داده خواهد شد",
@@ -68,20 +66,11 @@
"Could not start session": "امکان شروع جلسه کاری وجود ندارد",
"couldNotConnect": "Could not connect to Appium server URL '{{url}}'. Please check if the server is running and the URL is correct (valid URLs can be found at the start of the Appium server log). If you are using the Inspector's browser version, ensure the server has been started with '--allow-cors'.",
"Invalid URL:": "Invalid URL:",
- "sauceCredentialsRequired": "نام کاربری و کلید دسترسی مورد نیاز است!",
- "testingbotCredentialsRequired": "کاید و رمز TestingBot مورد نیاز است!",
- "Perfecto SecurityToken is required": "Perfecto SecurityToken مورد نیاز است",
- "browserstackCredentialsRequired": "نام کاربری و کلید دسترسی Browserstack مورد نیاز است!",
- "lambdatestCredentialsRequired": "نام کاربری و کلید دسترسی Lambdatest مورد نیاز است!",
- "bitbarCredentialsRequired": "کلید دسترسی سرویس Bitbar مورد نیاز است!",
- "kobitonCredentialsRequired": "نام کاربری و کلید دسترسی KOBITON مورد نیاز است!",
- "experitestAccessKeyURLRequired": "کلید دسترسی و آدرس Experitest مورد نیاز است",
"experitestAccessKey": "کلید دسترسی Experitest",
"experitestUrl": "آدرس Experitest",
"locatorStrategy": "استراتژی مکان یاب:",
"selector": "گزینشگر (selector):",
"couldNotObtainScreenshot": "امکان گرفتن تصویر صفحه وجود ندارد: {{screenshotError}}",
- "selectElementInSource": "برای شروع یک عنصر در کد منبع را انتخاب کنید.",
"Press Home Button": "Press Home Button",
"Execute Siri Command": "Execute Siri Command",
"Press Back Button": "Press Back Button",
@@ -100,11 +89,11 @@
"Pause Recording": "مکث در ضبط",
"Search for element": "جستجو برای عنصر",
"App Source": "App Source",
+ "Collapse All": "Collapse All",
"Toggle Attributes": "Toggle Attributes",
"Copy XML Source to Clipboard": "منبع XML را در كليپ برد كپي کن",
"Download Source as .XML File": "Download Source as .XML File",
"Copy Attributes to Clipboard": "ویژگی ها را در کلیپ بورد کپی کنید",
- "quitSessionAndClose": "ترک جلسه و بستن بازرسی",
"Session Inactive": "جلسه غیر فعال",
"Keep Session Running": "جلسه را در حال اجرا نگه دار",
"Quit Session": "ترک جلسه",
@@ -132,8 +121,9 @@
"usingXPathNotRecommended": "استفاده از مکان یاب XPath توصیه نمی شود و می تواند منجر به تست های شکننده شود. از تیم توسعه خود بخواهید به جای آن مکان یاب های دسترسی منحصر به فرد را ارائه دهند!",
"noAdditionalContextsFound": "No additional contexts have been detected",
"contextDropdownInfo": "Multiple contexts detected; certain elements might only be accessible after switching to a different context. Note that webview inspection in Appium Inspector is less accurate than the DevTools of Chrome or Safari. For more information, see:",
- "idAutocompletionCanBeDisabled": "The requested id selector does not have a package name prefix. This Appium session has package name autocompletion enabled, which may be the reason why no elements were found. To disable this behavior, relaunch this session with the capability 'appium:disableIdLocatorAutocompletion' set to 'true'.",
+ "idAutocompletionCanBeDisabled": "The requested id selector does not have a package name prefix. This Appium session has package name autocompletion enabled, which may be the reason why no elements were found. To disable this behavior, change the 'disableIdLocatorAutocompletion' setting to 'true'.",
"missingAutomationNameForStrategies": "Additional locator strategies may be available. To view them, add the capability 'appium:automationName' when launching the session. Note that this capability is mandatory in Appium 2.",
+ "snapshotMaxDepthReached": "This element is located at the maximum source depth {{selectedElementDepth}}, therefore its child elements (if any) are not shown. To reveal them, change the 'snapshotMaxDepth' setting to a value greater than {{selectedElementDepth}}. Check your driver documentation for the maximum supported value.",
"Tap": "ضربه",
"Gathering initial app source…": "در حال جمعآوری منبع اولیه برنامه…",
"couldNotObtainSource": "امکان گرفتن کد منبع وجود ندارد: {{errorMsg}}",
@@ -161,15 +151,14 @@
"boolean": "مقدار بولین",
"number": "شماره",
"JSON object": "شی JSON",
- "filepath": "آدرس فایل",
"connectToExistingSessionInstructions": "اگر یک session از نوع سرور بالا در حال حاضر در حال اجرا دارید، می توانید یک inspector را مستقیماً به آن متصل کنید.",
- "selectSessionIDInDropdown": "یک Session ID از انتخابگر زیر انتخاب کنید.",
+ "selectSessionID": "You can manually enter your session ID, or, if the server supports session discovery, simply select from a list of active sessions.",
"allowUnauthorizedCerts": "اجازه دادن به گواهینامه های غیر مجاز",
"Use Proxy": "استفاده از پروکسی",
"JSON Representation": "JSON Representation",
"Capability Builder": "Capability Builder",
"Saved Capability Sets": "Saved Capability Sets",
- "Attach to Session": "اتصال به یک Session…",
+ "Attach": "Attach",
"localhost": "localhost",
"Host": "میزبان",
"Port": "پورت",
@@ -195,16 +184,19 @@
"Remote Path": "مسیر راه دور",
"BrowserStack Username": "نام کاربری BrowserStack",
"BrowserStack Access Key": "کلید دسترسی BrowserStack",
- "LambdaTest Username": "نام کاربری LambdaTest",
- "LambdaTest Access Key": "کلید دسترسی LambdaTest",
+ "TestMu AI Username": "TestMu AI Username",
+ "TestMu AI Access Key": "TestMu AI Access Key",
"Bitbar API Key": "کلید API برای Bitbar",
"RemoteTestKit AccessToken": "RemoteTestKit AccessToken",
"RobotQA Token": "RobotQA Token",
+ "RobotActions Host": "RobotActions Host",
+ "RobotActions Token": "RobotActions Token",
+ "Add": "Add",
"Name": "نام",
"Description": "Description",
"Created": "Created",
"Actions": "Actions",
- "enterYourSessionId": "شناسهی Session خود را وارد کنید",
+ "searchSessions": "Search discovered sessions",
"Proxy URL": "آدرس URL پروکسی",
"Source": "منبع",
"Commands": "Commands",
@@ -212,12 +204,14 @@
"Gestures": "Gestures",
"Gesture Builder": "Gesture Builder",
"Saved Gestures": "Saved Gestures",
+ "Create New Gesture": "Create New Gesture",
"gesturesDescription": "Create, save, and execute custom gestures here. Gestures are identical to action chains in the W3C WebDriver Actions API.",
"Session Information": "Session Information",
"Execute Command": "Execute Command",
"commandsDescription": "Run various commands using the current Appium driver. Note that not all drivers support all commands.",
- "Click to Set Coordinates": "Click to Set Coordinates",
- "Set Coordinates Via Field": "Set Coordinates Via Field",
+ "showMoveActionCoordsInPercentage": "Show Coordinates of Move Actions in Screen Dimension Percentages",
+ "showMoveActionCoordsInPixels": "Show Coordinates of Move Actions in Pixels",
+ "toggleMoveActionCoordPicker": "Toggle Setting Coordinates via Clicking on Screenshot",
"Action Type": "Action Type",
"Pointer Up": "Pointer Up",
"Pointer Down": "Pointer Down",
@@ -234,29 +228,23 @@
"Left": "Left",
"Right": "Right",
"Play": "Play",
+ "Export to File": "Export to File",
"Save Capability Set As": "ذخیره Capability Set به عنوان…",
"Edit Raw JSON": "ویرایش JSON خام",
- "Enter Parameters for:": "Enter Parameters for:",
+ "enterMethodParameters": "Enter Parameters for: '{{methodName}}'",
"invalidJson": "Invalid JSON",
- "Execute Script": "Execute Script",
"App Management": "App Management",
- "Clipboard": "کلیپبورد",
"File Transfer": "File Transfer",
"Device Interaction": "Device Interaction",
- "Keyboard": "Keyboard",
- "Connectivity": "Connectivity",
- "Performance Data": "Performance Data",
- "System": "System",
"Session": "Session",
"Web": "Web",
"Context": "Context",
- "Window (W3C)": "Window (W3C)",
"simulatorOnly": "Emulator/simulator only",
"minAndroidSDK": "Minimum Android SDK level",
"Error": "Error",
"findingElementInSourceFailed": "Could not find the specified element. The current application source or element ID may have changed, or there may be too many elements with the same coordinates.",
"callToMethodFailed": "Call to '{{methodName}}' failed",
- "methodCallResult": "'{{methodName}}' result",
+ "methodCallResult": "Result for: '{{methodName}}' (type: {{resultType}})",
"TestingBot Key": "TestingBot Key",
"TestingBot Secret": "TestingBot Secret",
"Appium Server": "Appium Server",
@@ -269,17 +257,75 @@
"Mobitru WebDriver URL": "Mobitru WebDriver URL",
"Mobitru Billing Unit": "Mobitru Billing Unit",
"Mobitru Access Key": "Mobitru Access Key",
- "mobitruCredentialsRequired": "Mobitru Access Key is required",
"Session URL": "Session URL",
"Server Details": "Server Details",
"Session Length": "Session Length",
"Session Details": "Session Details",
"Currently Active App ID": "Currently Active App ID",
- "Session ID": "Session ID",
"confirmDeletion": "Are you sure you want to delete this?",
"Copied!": "Copied!",
"Error Fetching Session URL": "Error Fetching Session URL",
- "noResultsFound": "No results found",
+ "noRunningSessionsFound": "No running sessions found",
"invalidCapType": "Invalid capability type: {{type}}",
- "whitespaceDetected": "Text Starts and/or Ends With Whitespace"
+ "whitespaceDetected": "Text Starts and/or Ends With Whitespace",
+ "duplicateCapabilityNameError": "A capability set with the same name already exists",
+ "unableToImportGestureFiles": "Could not import gestures from the following files: {{fileNames}}",
+ "invalidSessionFile": "Invalid session file",
+ "TV Labs API Key": "TV Labs API Key",
+ "TestcribeAPIKey": "Testcribe API Key",
+ "sessionTestcribeApiKeyDescription": "You can get your api key from https://app.testcribe.com/settings/apiKeys",
+ "missingVendorProperties": "Please provide the following server details for {{vendorName}}: {{vendorProps}}",
+ "missingServerInfo": "Missing server info, could not query sessions",
+ "Username": "Username",
+ "URL": "URL",
+ "WebDriver URL": "WebDriver URL",
+ "API Key": "API Key",
+ "Access Key": "Access Key",
+ "SecurityToken": "SecurityToken",
+ "AccessToken": "AccessToken",
+ "Token": "Token",
+ "Key": "Key",
+ "Secret": "Secret",
+ "Theme": "Theme",
+ "Light Theme": "Light Theme",
+ "Dark Theme": "Dark Theme",
+ "System Theme": "System Theme",
+ "Search Source": "Search Source",
+ "Matching Elements": "Matching Elements",
+ "webmateApiKey": "webmate API Key",
+ "yourProjectId": "Your Project ID",
+ "webmateProjectId": "webmate Project ID",
+ "specifyWebmateHostExplicitly": "Specify webmate host explicitly",
+ "webmateHost": "webmate Host",
+ "Enable": "Enable",
+ "yourFireflinkDevicefarmDomain": "Your Fireflink DeviceFarm Domain (e.g., cloud.fireflink.com)",
+ "yourLicenseId": "Your License ID",
+ "yourProjectName": "Your Project Name",
+ "License ID": "License ID",
+ "Project Name": "Project Name",
+ "Fireflink DeviceFarm Domain": "Fireflink DeviceFarm Domain",
+ "Fireflink DeviceFarm Access Key": "Fireflink DeviceFarm Access Key",
+ "Fireflink DeviceFarm License ID": "Fireflink DeviceFarm License ID",
+ "Fireflink DeviceFarm Project Name": "Fireflink DeviceFarm Project Name",
+ "RabbitQA API Key": "RabbitQA API Key",
+ "RestartSessionMessage": "Device Connection Lost – Restarting the Session…",
+ "ToggleRestartSession": "Toggle Session Reload Upon Device Disconnect",
+ "toggleTableFormatting": "Toggle Table Formatting",
+ "copyResultToClipboard": "Copy Result to Clipboard",
+ "Property": "Property",
+ "noCapsFound": "No session capabilities found. Please use the Capability Builder to edit, add, and save your capability set. Refer to the tutorial at {{url}}",
+ "executeMethods": "Execute Methods",
+ "dynamicCommandsDescription": "Run commands supported by the currently active driver and plugin(s). Note that some commands may only work in specific contexts. Any commands not supported by WebdriverIO are not included in this list.",
+ "dynamicExecuteMethodsDescription": "Run any execute method supported by the currently active driver and plugin(s).",
+ "methodDeprecated": "This method is deprecated",
+ "App Settings": "App Settings",
+ "unableToImportSessionFiles": "Could not import sessions from the following files: {{fileNames}}",
+ "Import from File": "Import from File",
+ "useMjpegStream": "Use MJPEG Stream",
+ "useScreenshotApi": "Use Screenshot API",
+ "Box Model": "Box Model",
+ "detachFromSession": "Detach from Session",
+ "enterSessionID": "Enter session ID for attaching manually",
+ "refreshDiscoveredSessions": "Refresh Discovered Sessions",
+ "toggleMultiDisplayMode": "Toggle Multi-Display Mode"
}
diff --git a/assets/locales/da/translation.json b/app/common/public/locales/fi/translation.json
similarity index 72%
rename from assets/locales/da/translation.json
rename to app/common/public/locales/fi/translation.json
index a0dd36cde1..9ad71e149c 100644
--- a/assets/locales/da/translation.json
+++ b/app/common/public/locales/fi/translation.json
@@ -14,7 +14,6 @@
"Zoom Out": "Zoom Out",
"Reset Zoom Level": "Reset Zoom Level",
"Close Window": "Close Window",
- "Open Session File…": "Open Session File…",
"Bring All to Front": "Bring All to Front",
"Help": "Help",
"Appium Documentation": "Appium Documentation",
@@ -41,7 +40,6 @@
"Save Server Arguments Preset": "Save Server Arguments Preset",
"Save": "Save",
"Cancel": "Cancel",
- "datetimeFormat": "MMM Do YYYY, h:mma",
"updateDetails": "Release Date: {{pubDate}}\n\nRelease Notes: {{notes}}",
"appiumIsAvailable": "Appium Inspector {{name}} is available",
"updateIsBeingDownloaded": "Update is being downloaded now. You will be notified again when it is complete",
@@ -68,20 +66,11 @@
"Could not start session": "Could not start session",
"couldNotConnect": "Could not connect to Appium server URL '{{url}}'. Please check if the server is running and the URL is correct (valid URLs can be found at the start of the Appium server log). If you are using the Inspector's browser version, ensure the server has been started with '--allow-cors'.",
"Invalid URL:": "Invalid URL:",
- "sauceCredentialsRequired": "Sauce username and access key are required!",
- "testingbotCredentialsRequired": "TestingBot key and secret are required!",
- "Perfecto SecurityToken is required": "Perfecto SecurityToken is required",
- "browserstackCredentialsRequired": "Browserstack username and access key are required!",
- "lambdatestCredentialsRequired": "Lambdatest username and access key are required!",
- "bitbarCredentialsRequired": "Bitbar API key required!",
- "kobitonCredentialsRequired": "KOBITON username and api key are required!",
- "experitestAccessKeyURLRequired": "Experitest AccessKey and URL are required",
"experitestAccessKey": "Experitest AccessKey",
"experitestUrl": "Experitest Url",
"locatorStrategy": "Locator Strategy:",
"selector": "Selector:",
"couldNotObtainScreenshot": "Could not obtain screenshot: {{screenshotError}}",
- "selectElementInSource": "Select an element in the source to begin.",
"Press Home Button": "Press Home Button",
"Execute Siri Command": "Execute Siri Command",
"Press Back Button": "Press Back Button",
@@ -100,11 +89,11 @@
"Pause Recording": "Pause Recording",
"Search for element": "Search for element",
"App Source": "App Source",
+ "Collapse All": "Collapse All",
"Toggle Attributes": "Toggle Attributes",
"Copy XML Source to Clipboard": "Copy XML Source to Clipboard",
"Download Source as .XML File": "Download Source as .XML File",
"Copy Attributes to Clipboard": "Copy Attributes to Clipboard",
- "quitSessionAndClose": "Quit Session & Close Inspector",
"Session Inactive": "Session Inactive",
"Keep Session Running": "Keep Session Running",
"Quit Session": "Quit Session",
@@ -132,8 +121,9 @@
"usingXPathNotRecommended": "Using XPath locators is not recommended and can lead to fragile tests. Ask your development team to provide unique accessibility locators instead!",
"noAdditionalContextsFound": "No additional contexts have been detected",
"contextDropdownInfo": "Multiple contexts detected; certain elements might only be accessible after switching to a different context. Note that webview inspection in Appium Inspector is less accurate than the DevTools of Chrome or Safari. For more information, see:",
- "idAutocompletionCanBeDisabled": "The requested id selector does not have a package name prefix. This Appium session has package name autocompletion enabled, which may be the reason why no elements were found. To disable this behavior, relaunch this session with the capability 'appium:disableIdLocatorAutocompletion' set to 'true'.",
+ "idAutocompletionCanBeDisabled": "The requested id selector does not have a package name prefix. This Appium session has package name autocompletion enabled, which may be the reason why no elements were found. To disable this behavior, change the 'disableIdLocatorAutocompletion' setting to 'true'.",
"missingAutomationNameForStrategies": "Additional locator strategies may be available. To view them, add the capability 'appium:automationName' when launching the session. Note that this capability is mandatory in Appium 2.",
+ "snapshotMaxDepthReached": "This element is located at the maximum source depth {{selectedElementDepth}}, therefore its child elements (if any) are not shown. To reveal them, change the 'snapshotMaxDepth' setting to a value greater than {{selectedElementDepth}}. Check your driver documentation for the maximum supported value.",
"Tap": "Tap",
"Gathering initial app source…": "Gathering initial app source…",
"couldNotObtainSource": "Could not obtain source: {{errorMsg}}",
@@ -161,15 +151,14 @@
"boolean": "boolean",
"number": "number",
"JSON object": "JSON object",
- "filepath": "filepath",
"connectToExistingSessionInstructions": "If you have an already-running session of the above server type, you can attach an inspector to it directly.",
- "selectSessionIDInDropdown": "Select the Session ID in the dropdown below.",
+ "selectSessionID": "You can manually enter your session ID, or, if the server supports session discovery, simply select from a list of active sessions.",
"allowUnauthorizedCerts": "Allow Unauthorized Certificates",
"Use Proxy": "Use Proxy",
"JSON Representation": "JSON Representation",
"Capability Builder": "Capability Builder",
"Saved Capability Sets": "Saved Capability Sets",
- "Attach to Session": "Attach to Session…",
+ "Attach": "Attach",
"localhost": "localhost",
"Host": "Host",
"Port": "Port",
@@ -195,16 +184,19 @@
"Remote Path": "Remote Path",
"BrowserStack Username": "BrowserStack Username",
"BrowserStack Access Key": "BrowserStack Access Key",
- "LambdaTest Username": "LambdaTest Username",
- "LambdaTest Access Key": "LambdaTest Access Key",
+ "TestMu AI Username": "TestMu AI Username",
+ "TestMu AI Access Key": "TestMu AI Access Key",
"Bitbar API Key": "Bitbar API Key",
"RemoteTestKit AccessToken": "RemoteTestKit AccessToken",
"RobotQA Token": "RobotQA Token",
+ "RobotActions Host": "RobotActions Host",
+ "RobotActions Token": "RobotActions Token",
+ "Add": "Add",
"Name": "Name",
"Description": "Description",
"Created": "Created",
"Actions": "Actions",
- "enterYourSessionId": "Enter your session ID here",
+ "searchSessions": "Search discovered sessions",
"Proxy URL": "Proxy URL",
"Source": "Source",
"Commands": "Commands",
@@ -212,12 +204,14 @@
"Gestures": "Gestures",
"Gesture Builder": "Gesture Builder",
"Saved Gestures": "Saved Gestures",
+ "Create New Gesture": "Create New Gesture",
"gesturesDescription": "Create, save, and execute custom gestures here. Gestures are identical to action chains in the W3C WebDriver Actions API.",
"Session Information": "Session Information",
"Execute Command": "Execute Command",
"commandsDescription": "Run various commands using the current Appium driver. Note that not all drivers support all commands.",
- "Click to Set Coordinates": "Click to Set Coordinates",
- "Set Coordinates Via Field": "Set Coordinates Via Field",
+ "showMoveActionCoordsInPercentage": "Show Coordinates of Move Actions in Screen Dimension Percentages",
+ "showMoveActionCoordsInPixels": "Show Coordinates of Move Actions in Pixels",
+ "toggleMoveActionCoordPicker": "Toggle Setting Coordinates via Clicking on Screenshot",
"Action Type": "Action Type",
"Pointer Up": "Pointer Up",
"Pointer Down": "Pointer Down",
@@ -234,29 +228,23 @@
"Left": "Left",
"Right": "Right",
"Play": "Play",
+ "Export to File": "Export to File",
"Save Capability Set As": "Save Capability Set As…",
"Edit Raw JSON": "Edit Raw JSON",
- "Enter Parameters for:": "Enter Parameters for:",
+ "enterMethodParameters": "Enter Parameters for: '{{methodName}}'",
"invalidJson": "Invalid JSON",
- "Execute Script": "Execute Script",
"App Management": "App Management",
- "Clipboard": "Clipboard",
"File Transfer": "File Transfer",
"Device Interaction": "Device Interaction",
- "Keyboard": "Keyboard",
- "Connectivity": "Connectivity",
- "Performance Data": "Performance Data",
- "System": "System",
"Session": "Session",
"Web": "Web",
"Context": "Context",
- "Window (W3C)": "Window (W3C)",
"simulatorOnly": "Emulator/simulator only",
"minAndroidSDK": "Minimum Android SDK level",
"Error": "Error",
"findingElementInSourceFailed": "Could not find the specified element. The current application source or element ID may have changed, or there may be too many elements with the same coordinates.",
"callToMethodFailed": "Call to '{{methodName}}' failed",
- "methodCallResult": "'{{methodName}}' result",
+ "methodCallResult": "Result for: '{{methodName}}' (type: {{resultType}})",
"TestingBot Key": "TestingBot Key",
"TestingBot Secret": "TestingBot Secret",
"Appium Server": "Appium Server",
@@ -269,17 +257,75 @@
"Mobitru WebDriver URL": "Mobitru WebDriver URL",
"Mobitru Billing Unit": "Mobitru Billing Unit",
"Mobitru Access Key": "Mobitru Access Key",
- "mobitruCredentialsRequired": "Mobitru Access Key is required",
"Session URL": "Session URL",
"Server Details": "Server Details",
"Session Length": "Session Length",
"Session Details": "Session Details",
"Currently Active App ID": "Currently Active App ID",
- "Session ID": "Session ID",
"confirmDeletion": "Are you sure you want to delete this?",
"Copied!": "Copied!",
"Error Fetching Session URL": "Error Fetching Session URL",
- "noResultsFound": "No results found",
+ "noRunningSessionsFound": "No running sessions found",
"invalidCapType": "Invalid capability type: {{type}}",
- "whitespaceDetected": "Text Starts and/or Ends With Whitespace"
+ "whitespaceDetected": "Text Starts and/or Ends With Whitespace",
+ "duplicateCapabilityNameError": "A capability set with the same name already exists",
+ "unableToImportGestureFiles": "Could not import gestures from the following files: {{fileNames}}",
+ "invalidSessionFile": "Invalid session file",
+ "TV Labs API Key": "TV Labs API Key",
+ "TestcribeAPIKey": "Testcribe API Key",
+ "sessionTestcribeApiKeyDescription": "You can get your api key from https://app.testcribe.com/settings/apiKeys",
+ "missingVendorProperties": "Please provide the following server details for {{vendorName}}: {{vendorProps}}",
+ "missingServerInfo": "Missing server info, could not query sessions",
+ "Username": "Username",
+ "URL": "URL",
+ "WebDriver URL": "WebDriver URL",
+ "API Key": "API Key",
+ "Access Key": "Access Key",
+ "SecurityToken": "SecurityToken",
+ "AccessToken": "AccessToken",
+ "Token": "Token",
+ "Key": "Key",
+ "Secret": "Secret",
+ "Theme": "Theme",
+ "Light Theme": "Light Theme",
+ "Dark Theme": "Dark Theme",
+ "System Theme": "System Theme",
+ "Search Source": "Search Source",
+ "Matching Elements": "Matching Elements",
+ "webmateApiKey": "webmate API Key",
+ "yourProjectId": "Your Project ID",
+ "webmateProjectId": "webmate Project ID",
+ "specifyWebmateHostExplicitly": "Specify webmate host explicitly",
+ "webmateHost": "webmate Host",
+ "Enable": "Enable",
+ "yourFireflinkDevicefarmDomain": "Your Fireflink DeviceFarm Domain (e.g., cloud.fireflink.com)",
+ "yourLicenseId": "Your License ID",
+ "yourProjectName": "Your Project Name",
+ "License ID": "License ID",
+ "Project Name": "Project Name",
+ "Fireflink DeviceFarm Domain": "Fireflink DeviceFarm Domain",
+ "Fireflink DeviceFarm Access Key": "Fireflink DeviceFarm Access Key",
+ "Fireflink DeviceFarm License ID": "Fireflink DeviceFarm License ID",
+ "Fireflink DeviceFarm Project Name": "Fireflink DeviceFarm Project Name",
+ "RabbitQA API Key": "RabbitQA API Key",
+ "RestartSessionMessage": "Device Connection Lost – Restarting the Session…",
+ "ToggleRestartSession": "Toggle Session Reload Upon Device Disconnect",
+ "toggleTableFormatting": "Toggle Table Formatting",
+ "copyResultToClipboard": "Copy Result to Clipboard",
+ "Property": "Property",
+ "noCapsFound": "No session capabilities found. Please use the Capability Builder to edit, add, and save your capability set. Refer to the tutorial at {{url}}",
+ "executeMethods": "Execute Methods",
+ "dynamicCommandsDescription": "Run commands supported by the currently active driver and plugin(s). Note that some commands may only work in specific contexts. Any commands not supported by WebdriverIO are not included in this list.",
+ "dynamicExecuteMethodsDescription": "Run any execute method supported by the currently active driver and plugin(s).",
+ "methodDeprecated": "This method is deprecated",
+ "App Settings": "App Settings",
+ "unableToImportSessionFiles": "Could not import sessions from the following files: {{fileNames}}",
+ "Import from File": "Import from File",
+ "useMjpegStream": "Use MJPEG Stream",
+ "useScreenshotApi": "Use Screenshot API",
+ "Box Model": "Box Model",
+ "detachFromSession": "Detach from Session",
+ "enterSessionID": "Enter session ID for attaching manually",
+ "refreshDiscoveredSessions": "Refresh Discovered Sessions",
+ "toggleMultiDisplayMode": "Toggle Multi-Display Mode"
}
diff --git a/assets/locales/fr/translation.json b/app/common/public/locales/fr/translation.json
similarity index 70%
rename from assets/locales/fr/translation.json
rename to app/common/public/locales/fr/translation.json
index 54e35d35a7..82809b0e3a 100644
--- a/assets/locales/fr/translation.json
+++ b/app/common/public/locales/fr/translation.json
@@ -14,7 +14,6 @@
"Zoom Out": "Zoom Out",
"Reset Zoom Level": "Reset Zoom Level",
"Close Window": "Close Window",
- "Open Session File…": "Open Session File…",
"Bring All to Front": "Tout ramener au premier plan",
"Help": "Aide",
"Appium Documentation": "Appium Documentation",
@@ -41,7 +40,6 @@
"Save Server Arguments Preset": "Save Server Arguments Preset",
"Save": "Sauvegarder",
"Cancel": "Annuler",
- "datetimeFormat": "MMM Do YYYY, h:mma",
"updateDetails": "Date de sortie : {{pubDate}}\n\nNotes de sortie : {{notes}}",
"appiumIsAvailable": "Appium Inspector {{name}} est disponible",
"updateIsBeingDownloaded": "La mise à jour est en cours de téléchargement. Vous serez informé une fois terminée",
@@ -68,43 +66,34 @@
"Could not start session": "Impossible de démarrer la session",
"couldNotConnect": "Could not connect to Appium server URL '{{url}}'. Please check if the server is running and the URL is correct (valid URLs can be found at the start of the Appium server log). If you are using the Inspector's browser version, ensure the server has been started with '--allow-cors'.",
"Invalid URL:": "URL invalide :",
- "sauceCredentialsRequired": "Le nom d'utilisateur Sauce et la clé d'accès sont requis !",
- "testingbotCredentialsRequired": "TestingBot key and secret are required!",
- "Perfecto SecurityToken is required": "Perfecto SecurityToken is required",
- "browserstackCredentialsRequired": "Browserstack username and access key are required!",
- "lambdatestCredentialsRequired": "Lambdatest username and access key are required!",
- "bitbarCredentialsRequired": "Bitbar API key required!",
- "kobitonCredentialsRequired": "KOBITON username and api key are required!",
- "experitestAccessKeyURLRequired": "Experitest AccessKey and URL are required",
"experitestAccessKey": "Experitest AccessKey",
"experitestUrl": "Experitest Url",
"locatorStrategy": "Locator Strategy:",
"selector": "Selector:",
"couldNotObtainScreenshot": "Could not obtain screenshot: {{screenshotError}}",
- "selectElementInSource": "Select an element in the source to begin.",
- "Press Home Button": "Press Home Button",
+ "Press Home Button": "Appuyez sur le bouton Accueil",
"Execute Siri Command": "Exécuter la commande Siri",
"Press Back Button": "Appuyer sur le bouton Retour",
- "Press App Switch Button": "Press App Switch Button",
- "Command": "Command",
- "Show Element Handles": "Show Element Handles",
- "Hide Element Handles": "Hide Element Handles",
- "Select Elements": "Select Elements",
+ "Press App Switch Button": "Appuyez sur le bouton de changement d'application",
+ "Command": "Commande",
+ "Show Element Handles": "Afficher les poignées d'éléments",
+ "Hide Element Handles": "Masquer les poignées d'éléments",
+ "Select Elements": "Sélectionner les éléments",
"Tap/Swipe By Coordinates": "Tap/Swipe By Coordinates",
"Download Screenshot": "Télécharger la capture d'écran",
"Back": "Précédent",
"Start Refreshing Source": "Commencer à actualiser la source",
"Pause Refreshing Source": "Pause Refreshing Source",
"refreshSource": "Refresh Source & Screenshot",
- "Start Recording": "Start Recording",
+ "Start Recording": "Commencer l'enregistrement",
"Pause Recording": "Mettre en pause l'enregistrement",
"Search for element": "Rechercher un élément",
"App Source": "Source de l'application",
+ "Collapse All": "Collapse All",
"Toggle Attributes": "Afficher/Masquer les attributs",
"Copy XML Source to Clipboard": "Copier la source XML dans le presse-papier",
"Download Source as .XML File": "Télécharger la source comme fichier .XML",
"Copy Attributes to Clipboard": "Copier les attributs dans le presse-papiers",
- "quitSessionAndClose": "Quitter la session et fermer l'inspecteur",
"Session Inactive": "Session inactive",
"Keep Session Running": "Garder la session active",
"Quit Session": "Quitter la session",
@@ -132,8 +121,9 @@
"usingXPathNotRecommended": "L'utilisation des localisateurs XPath n'est pas recommandée et peut conduire à des tests fragiles. Demandez à votre équipe de développement de fournir des localisateurs d'accessibilité uniques à la place !",
"noAdditionalContextsFound": "Aucun contexte supplémentaire n'a été trouvé",
"contextDropdownInfo": "Multiples contextes trouvés ; certains éléments pourraient n'être accessibles qu'après changement de contexte. Note : l'inspection webview avec Appium Inspector est moins précise qu'avec DevTools de Chrome ou Safari. Pour en savoir plus, consulter :",
- "idAutocompletionCanBeDisabled": "Le sélecteur d'id demandé n'a pas de préfixe de nom de paquet. Cette session Appium a activé l'auto-complétion du nom du paquet, ce qui peut être la raison pour laquelle aucun élément n'a été trouvé. Pour désactiver ce comportement, relancez cette session avec la capacité 'appium:disableIdLocatorAutocompletion' à 'true'.",
+ "idAutocompletionCanBeDisabled": "The requested id selector does not have a package name prefix. This Appium session has package name autocompletion enabled, which may be the reason why no elements were found. To disable this behavior, change the 'disableIdLocatorAutocompletion' setting to 'true'.",
"missingAutomationNameForStrategies": "Additional locator strategies may be available. To view them, add the capability 'appium:automationName' when launching the session. Note that this capability is mandatory in Appium 2.",
+ "snapshotMaxDepthReached": "This element is located at the maximum source depth {{selectedElementDepth}}, therefore its child elements (if any) are not shown. To reveal them, change the 'snapshotMaxDepth' setting to a value greater than {{selectedElementDepth}}. Check your driver documentation for the maximum supported value.",
"Tap": "Tap",
"Gathering initial app source…": "Gathering initial app source…",
"couldNotObtainSource": "Could not obtain source: {{errorMsg}}",
@@ -161,15 +151,14 @@
"boolean": "boolean",
"number": "number",
"JSON object": "JSON object",
- "filepath": "filepath",
"connectToExistingSessionInstructions": "If you have an already-running session of the above server type, you can attach an inspector to it directly.",
- "selectSessionIDInDropdown": "Select the Session ID in the dropdown below.",
+ "selectSessionID": "You can manually enter your session ID, or, if the server supports session discovery, simply select from a list of active sessions.",
"allowUnauthorizedCerts": "Allow Unauthorized Certificates",
"Use Proxy": "Use Proxy",
"JSON Representation": "JSON Representation",
"Capability Builder": "Capability Builder",
"Saved Capability Sets": "Saved Capability Sets",
- "Attach to Session": "Attach to Session…",
+ "Attach": "Attach",
"localhost": "localhost",
"Host": "Host",
"Port": "Port",
@@ -195,16 +184,19 @@
"Remote Path": "Remote Path",
"BrowserStack Username": "BrowserStack Username",
"BrowserStack Access Key": "BrowserStack Access Key",
- "LambdaTest Username": "LambdaTest Username",
- "LambdaTest Access Key": "LambdaTest Access Key",
+ "TestMu AI Username": "TestMu AI Username",
+ "TestMu AI Access Key": "TestMu AI Access Key",
"Bitbar API Key": "Bitbar API Key",
"RemoteTestKit AccessToken": "RemoteTestKit AccessToken",
"RobotQA Token": "RobotQA Token",
+ "RobotActions Host": "RobotActions Host",
+ "RobotActions Token": "RobotActions Token",
+ "Add": "Add",
"Name": "Name",
"Description": "Description",
"Created": "Created",
"Actions": "Actions",
- "enterYourSessionId": "Enter your session ID here",
+ "searchSessions": "Search discovered sessions",
"Proxy URL": "Proxy URL",
"Source": "Source",
"Commands": "Commands",
@@ -212,12 +204,14 @@
"Gestures": "Gestures",
"Gesture Builder": "Gesture Builder",
"Saved Gestures": "Saved Gestures",
+ "Create New Gesture": "Create New Gesture",
"gesturesDescription": "Create, save, and execute custom gestures here. Gestures are identical to action chains in the W3C WebDriver Actions API.",
"Session Information": "Session Information",
"Execute Command": "Execute Command",
"commandsDescription": "Run various commands using the current Appium driver. Note that not all drivers support all commands.",
- "Click to Set Coordinates": "Click to Set Coordinates",
- "Set Coordinates Via Field": "Set Coordinates Via Field",
+ "showMoveActionCoordsInPercentage": "Show Coordinates of Move Actions in Screen Dimension Percentages",
+ "showMoveActionCoordsInPixels": "Show Coordinates of Move Actions in Pixels",
+ "toggleMoveActionCoordPicker": "Toggle Setting Coordinates via Clicking on Screenshot",
"Action Type": "Action Type",
"Pointer Up": "Pointer Up",
"Pointer Down": "Pointer Down",
@@ -234,29 +228,23 @@
"Left": "Left",
"Right": "Right",
"Play": "Play",
+ "Export to File": "Export to File",
"Save Capability Set As": "Save Capability Set As…",
"Edit Raw JSON": "Edit Raw JSON",
- "Enter Parameters for:": "Enter Parameters for:",
+ "enterMethodParameters": "Enter Parameters for: '{{methodName}}'",
"invalidJson": "Invalid JSON",
- "Execute Script": "Execute Script",
"App Management": "App Management",
- "Clipboard": "Clipboard",
"File Transfer": "File Transfer",
"Device Interaction": "Device Interaction",
- "Keyboard": "Keyboard",
- "Connectivity": "Connectivity",
- "Performance Data": "Performance Data",
- "System": "System",
"Session": "Session",
"Web": "Web",
"Context": "Context",
- "Window (W3C)": "Window (W3C)",
"simulatorOnly": "Émulateur/simulateur uniquement",
"minAndroidSDK": "Version du SDK Android minimum",
"Error": "Erreur",
"findingElementInSourceFailed": "Could not find the specified element. The current application source or element ID may have changed, or there may be too many elements with the same coordinates.",
"callToMethodFailed": "Call to '{{methodName}}' failed",
- "methodCallResult": "'{{methodName}}' result",
+ "methodCallResult": "Result for: '{{methodName}}' (type: {{resultType}})",
"TestingBot Key": "TestingBot Key",
"TestingBot Secret": "TestingBot Secret",
"Appium Server": "Appium Server",
@@ -269,17 +257,75 @@
"Mobitru WebDriver URL": "Mobitru WebDriver URL",
"Mobitru Billing Unit": "Mobitru Billing Unit",
"Mobitru Access Key": "Mobitru Access Key",
- "mobitruCredentialsRequired": "Mobitru Access Key is required",
"Session URL": "Session URL",
"Server Details": "Server Details",
"Session Length": "Session Length",
"Session Details": "Session Details",
"Currently Active App ID": "Currently Active App ID",
- "Session ID": "Session ID",
"confirmDeletion": "Are you sure you want to delete this?",
"Copied!": "Copied!",
"Error Fetching Session URL": "Error Fetching Session URL",
- "noResultsFound": "No results found",
+ "noRunningSessionsFound": "No running sessions found",
"invalidCapType": "Invalid capability type: {{type}}",
- "whitespaceDetected": "Text Starts and/or Ends With Whitespace"
+ "whitespaceDetected": "Text Starts and/or Ends With Whitespace",
+ "duplicateCapabilityNameError": "A capability set with the same name already exists",
+ "unableToImportGestureFiles": "Could not import gestures from the following files: {{fileNames}}",
+ "invalidSessionFile": "Invalid session file",
+ "TV Labs API Key": "TV Labs API Key",
+ "TestcribeAPIKey": "Testcribe API Key",
+ "sessionTestcribeApiKeyDescription": "You can get your api key from https://app.testcribe.com/settings/apiKeys",
+ "missingVendorProperties": "Please provide the following server details for {{vendorName}}: {{vendorProps}}",
+ "missingServerInfo": "Missing server info, could not query sessions",
+ "Username": "Username",
+ "URL": "URL",
+ "WebDriver URL": "WebDriver URL",
+ "API Key": "API Key",
+ "Access Key": "Access Key",
+ "SecurityToken": "SecurityToken",
+ "AccessToken": "AccessToken",
+ "Token": "Token",
+ "Key": "Key",
+ "Secret": "Secret",
+ "Theme": "Theme",
+ "Light Theme": "Light Theme",
+ "Dark Theme": "Dark Theme",
+ "System Theme": "System Theme",
+ "Search Source": "Search Source",
+ "Matching Elements": "Matching Elements",
+ "webmateApiKey": "webmate API Key",
+ "yourProjectId": "Your Project ID",
+ "webmateProjectId": "webmate Project ID",
+ "specifyWebmateHostExplicitly": "Specify webmate host explicitly",
+ "webmateHost": "webmate Host",
+ "Enable": "Enable",
+ "yourFireflinkDevicefarmDomain": "Your Fireflink DeviceFarm Domain (e.g., cloud.fireflink.com)",
+ "yourLicenseId": "Your License ID",
+ "yourProjectName": "Your Project Name",
+ "License ID": "License ID",
+ "Project Name": "Project Name",
+ "Fireflink DeviceFarm Domain": "Fireflink DeviceFarm Domain",
+ "Fireflink DeviceFarm Access Key": "Fireflink DeviceFarm Access Key",
+ "Fireflink DeviceFarm License ID": "Fireflink DeviceFarm License ID",
+ "Fireflink DeviceFarm Project Name": "Fireflink DeviceFarm Project Name",
+ "RabbitQA API Key": "RabbitQA API Key",
+ "RestartSessionMessage": "Device Connection Lost – Restarting the Session…",
+ "ToggleRestartSession": "Toggle Session Reload Upon Device Disconnect",
+ "toggleTableFormatting": "Toggle Table Formatting",
+ "copyResultToClipboard": "Copy Result to Clipboard",
+ "Property": "Property",
+ "noCapsFound": "No session capabilities found. Please use the Capability Builder to edit, add, and save your capability set. Refer to the tutorial at {{url}}",
+ "executeMethods": "Execute Methods",
+ "dynamicCommandsDescription": "Run commands supported by the currently active driver and plugin(s). Note that some commands may only work in specific contexts. Any commands not supported by WebdriverIO are not included in this list.",
+ "dynamicExecuteMethodsDescription": "Run any execute method supported by the currently active driver and plugin(s).",
+ "methodDeprecated": "This method is deprecated",
+ "App Settings": "App Settings",
+ "unableToImportSessionFiles": "Could not import sessions from the following files: {{fileNames}}",
+ "Import from File": "Import from File",
+ "useMjpegStream": "Use MJPEG Stream",
+ "useScreenshotApi": "Use Screenshot API",
+ "Box Model": "Box Model",
+ "detachFromSession": "Detach from Session",
+ "enterSessionID": "Enter session ID for attaching manually",
+ "refreshDiscoveredSessions": "Refresh Discovered Sessions",
+ "toggleMultiDisplayMode": "Toggle Multi-Display Mode"
}
diff --git a/assets/locales/hi/translation.json b/app/common/public/locales/hi/translation.json
similarity index 77%
rename from assets/locales/hi/translation.json
rename to app/common/public/locales/hi/translation.json
index b718d7a907..c43ddfc8dc 100644
--- a/assets/locales/hi/translation.json
+++ b/app/common/public/locales/hi/translation.json
@@ -1,20 +1,19 @@
{
- "appiumInspector": "Appium Inspector",
+ "appiumInspector": "start",
"Edit": "संपादित करें",
"Redo": "फिर से करें",
"Cut": "काटें",
"Copy": "प्रतिलिपि बनाएँ",
"Paste": "चिपकाएँ",
- "Delete": "Delete",
+ "Delete": "डिलीट करें",
"Select All": "सभी का चयन करें",
"Window": "खिडकी",
"Minimize": "न्यूनतम",
- "Zoom": "Zoom",
+ "Zoom": "ज़ूम",
"Zoom In": "Zoom In",
"Zoom Out": "Zoom Out",
"Reset Zoom Level": "Reset Zoom Level",
"Close Window": "Close Window",
- "Open Session File…": "Open Session File…",
"Bring All to Front": "सभी को सामने लाओ",
"Help": "सहायता",
"Appium Documentation": "Appium Documentation",
@@ -41,7 +40,6 @@
"Save Server Arguments Preset": "पूर्व निर्धारित सर्वर आर्गुमेंट सहेजें",
"Save": "सहेजें",
"Cancel": "रद्द करें",
- "datetimeFormat": "MMM Do YYYY, h:mma",
"updateDetails": "रिलीज़ की तारीख: {{pubDate}}\n\nरिलीज़ नोट्स: {{notes}}",
"appiumIsAvailable": "Appium Inspector {{name}} is available",
"updateIsBeingDownloaded": "अपडेट अब डाउनलोड किया जा रहा है। पूरा होने पर आपको फिर से सूचित किया जाएगा",
@@ -68,20 +66,11 @@
"Could not start session": "सत्र शुरू नहीं हो सका",
"couldNotConnect": "Could not connect to Appium server URL '{{url}}'. Please check if the server is running and the URL is correct (valid URLs can be found at the start of the Appium server log). If you are using the Inspector's browser version, ensure the server has been started with '--allow-cors'.",
"Invalid URL:": "Invalid URL:",
- "sauceCredentialsRequired": "सॉस उपयोगकर्ता नाम और एक्सेस कुंजी की आवश्यकता है!",
- "testingbotCredentialsRequired": "टेस्टिंगबोट कुंजी और रहस्य की आवश्यकता है!",
- "Perfecto SecurityToken is required": "परफेक्टो सिक्योरिटी टोकन की आवश्यकता है",
- "browserstackCredentialsRequired": "ब्राउज़र स्टैक उपयोगकर्ता नाम और एक्सेस कुंजी की आवश्यकता है!",
- "lambdatestCredentialsRequired": "Lambdatest username and access key are required!",
- "bitbarCredentialsRequired": "बिटबार एपीआई कुंजी की आवश्यकता!",
- "kobitonCredentialsRequired": "कोबिटों उपयोगकर्ता नाम और एक्सेस कुंजी की आवश्यकता है!",
- "experitestAccessKeyURLRequired": "Experitest AccessKey and URL are required",
"experitestAccessKey": "Experitest AccessKey",
"experitestUrl": "Experitest Url",
"locatorStrategy": "लोकेटर कार्यनीति:",
"selector": "चुननेवाला",
"couldNotObtainScreenshot": "स्क्रीनशॉट प्राप्त नहीं किया जा सका: {{screenshotError}}",
- "selectElementInSource": "शुरू करने के लिए स्रोत में एक एलिमेंट का चयन करें",
"Press Home Button": "Press Home Button",
"Execute Siri Command": "Execute Siri Command",
"Press Back Button": "Press Back Button",
@@ -100,11 +89,11 @@
"Pause Recording": "रिकॉर्डिंग रोकें",
"Search for element": "एलिमेंट की खोज करें",
"App Source": "App Source",
+ "Collapse All": "Collapse All",
"Toggle Attributes": "Toggle Attributes",
"Copy XML Source to Clipboard": "XML स्रोत को क्लिपबोर्ड पर कॉपी करें",
"Download Source as .XML File": "Download Source as .XML File",
"Copy Attributes to Clipboard": "ऐट्रिब्यूट्स को क्लिपबोर्ड पर कॉपी करें",
- "quitSessionAndClose": "सत्र छोड़ो और इंस्पेक्टर बंद करे",
"Session Inactive": "सत्र निष्क्रिय",
"Keep Session Running": "सत्र चालू रखें",
"Quit Session": "सत्र छोड़ो",
@@ -132,8 +121,9 @@
"usingXPathNotRecommended": "XPath लोकेटर का उपयोग करने की अनुशंसा नहीं की जाती है और इससे tests नाजुक हो सकते हैं। इसके बजाय अनूठा एक्सेसिबिलिटी लोकेटर उपलब्ध कराने के लिए अपनी डेवलपमेंट टीम से पूछें!",
"noAdditionalContextsFound": "किसी अतिरिक्त संदर्भ का पता नहीं चला है",
"contextDropdownInfo": "अनेक संधर्ब पाए गए। कुछ तत्व केवल एक अलग संदर्भ को बदलने पर सुलभ हो सकते हैं। ध्यान दें कि एपियम इंस्पेक्टर में वेबव्यू निरीक्षण, क्रोम या सफारी के डेवटूल्स की तुलना में कम सटीक है। अधिक जानकारी के लिए, देखेंः",
- "idAutocompletionCanBeDisabled": "The requested id selector does not have a package name prefix. This Appium session has package name autocompletion enabled, which may be the reason why no elements were found. To disable this behavior, relaunch this session with the capability 'appium:disableIdLocatorAutocompletion' set to 'true'.",
+ "idAutocompletionCanBeDisabled": "The requested id selector does not have a package name prefix. This Appium session has package name autocompletion enabled, which may be the reason why no elements were found. To disable this behavior, change the 'disableIdLocatorAutocompletion' setting to 'true'.",
"missingAutomationNameForStrategies": "Additional locator strategies may be available. To view them, add the capability 'appium:automationName' when launching the session. Note that this capability is mandatory in Appium 2.",
+ "snapshotMaxDepthReached": "This element is located at the maximum source depth {{selectedElementDepth}}, therefore its child elements (if any) are not shown. To reveal them, change the 'snapshotMaxDepth' setting to a value greater than {{selectedElementDepth}}. Check your driver documentation for the maximum supported value.",
"Tap": "टेप करें",
"Gathering initial app source…": "प्रारंभिक एप्लिकेशन स्रोत प्राप्त कर रहा है...",
"couldNotObtainSource": "स्रोत प्राप्त नहीं कर सका:{{errorMsg}}",
@@ -161,15 +151,14 @@
"boolean": "बूलियन",
"number": "क्रमांक",
"JSON object": "JSON ऑब्जेक्ट",
- "filepath": "फ़ाइल पथ",
"connectToExistingSessionInstructions": "यदि आपके पास उपरोक्त सर्वर प्रकार का एक पहले से चल रहा सत्र है, तो आप इसे सीधे एक निरीक्षक संलग्न कर सकते हैं।",
- "selectSessionIDInDropdown": "नीचे दिए गए ड्रॉपडाउन में सत्र आईडी का चयन करें।",
+ "selectSessionID": "You can manually enter your session ID, or, if the server supports session discovery, simply select from a list of active sessions.",
"allowUnauthorizedCerts": "अनधिकृत प्रमाणपत्रों की अनुमति दें",
"Use Proxy": "प्रॉक्सी उपयोग करें",
"JSON Representation": "JSON Representation",
"Capability Builder": "Capability Builder",
"Saved Capability Sets": "Saved Capability Sets",
- "Attach to Session": "सत्र के लिए संलग्न करें",
+ "Attach": "Attach",
"localhost": "लोकलहोस्ट",
"Host": "होस्ट",
"Port": "पोर्ट",
@@ -195,16 +184,19 @@
"Remote Path": "दूरस्थ पथ",
"BrowserStack Username": "ब्राउज़र स्टैक उपयोगकर्ता नाम",
"BrowserStack Access Key": "ब्राउज़र स्टैक एक्सेस कुंजी",
- "LambdaTest Username": "LambdaTest Username",
- "LambdaTest Access Key": "LambdaTest Access Key",
+ "TestMu AI Username": "TestMu AI Username",
+ "TestMu AI Access Key": "TestMu AI Access Key",
"Bitbar API Key": "बिटबार एपीआई कुंजी",
"RemoteTestKit AccessToken": "RemoteTestKit AccessToken",
"RobotQA Token": "RobotQA Token",
+ "RobotActions Host": "RobotActions Host",
+ "RobotActions Token": "RobotActions Token",
+ "Add": "जोड़ें",
"Name": "नाम",
"Description": "Description",
"Created": "Created",
"Actions": "Actions",
- "enterYourSessionId": "यहां अपना सत्र आईडी दर्ज करें",
+ "searchSessions": "Search discovered sessions",
"Proxy URL": "प्रॉक्सी URL",
"Source": "स्रोत",
"Commands": "Commands",
@@ -212,12 +204,14 @@
"Gestures": "Gestures",
"Gesture Builder": "Gesture Builder",
"Saved Gestures": "Saved Gestures",
+ "Create New Gesture": "Create New Gesture",
"gesturesDescription": "Create, save, and execute custom gestures here. Gestures are identical to action chains in the W3C WebDriver Actions API.",
"Session Information": "Session Information",
"Execute Command": "Execute Command",
"commandsDescription": "Run various commands using the current Appium driver. Note that not all drivers support all commands.",
- "Click to Set Coordinates": "Click to Set Coordinates",
- "Set Coordinates Via Field": "Set Coordinates Via Field",
+ "showMoveActionCoordsInPercentage": "Show Coordinates of Move Actions in Screen Dimension Percentages",
+ "showMoveActionCoordsInPixels": "Show Coordinates of Move Actions in Pixels",
+ "toggleMoveActionCoordPicker": "Toggle Setting Coordinates via Clicking on Screenshot",
"Action Type": "Action Type",
"Pointer Up": "Pointer Up",
"Pointer Down": "Pointer Down",
@@ -231,32 +225,26 @@
"Gesture saved": "Gesture saved",
"Gesture saved as": "Gesture saved as '{{gestureName}}'",
"Duplicate pointer names are not allowed": "Duplicate pointer names are not allowed",
- "Left": "Left",
+ "Left": "बायां",
"Right": "Right",
- "Play": "Play",
+ "Play": "चलाएँ",
+ "Export to File": "Export to File",
"Save Capability Set As": "इस रूप में क्षमता सहेजें…",
"Edit Raw JSON": "कच्चे JSON संपादित करें",
- "Enter Parameters for:": "Enter Parameters for:",
+ "enterMethodParameters": "Enter Parameters for: '{{methodName}}'",
"invalidJson": "Invalid JSON",
- "Execute Script": "Execute Script",
"App Management": "App Management",
- "Clipboard": "क्लिपबोर्ड",
"File Transfer": "File Transfer",
"Device Interaction": "Device Interaction",
- "Keyboard": "Keyboard",
- "Connectivity": "Connectivity",
- "Performance Data": "प्रदर्शन डेटा",
- "System": "प्रणाली",
"Session": "सत्र",
"Web": "Web",
"Context": "Context",
- "Window (W3C)": "Window (W3C)",
"simulatorOnly": "Emulator/simulator only",
"minAndroidSDK": "Minimum Android SDK level",
"Error": "त्रुटि",
"findingElementInSourceFailed": "Could not find the specified element. The current application source or element ID may have changed, or there may be too many elements with the same coordinates.",
"callToMethodFailed": "'{{methodName}}' पर कॉल विफल रहा",
- "methodCallResult": "{{methodName}} परिणाम",
+ "methodCallResult": "Result for: '{{methodName}}' (type: {{resultType}})",
"TestingBot Key": "टेस्टिंगबोट की",
"TestingBot Secret": "टेस्टिंगबोट सीक्रेट",
"Appium Server": "Appium Server",
@@ -269,17 +257,75 @@
"Mobitru WebDriver URL": "Mobitru WebDriver URL",
"Mobitru Billing Unit": "Mobitru Billing Unit",
"Mobitru Access Key": "Mobitru Access Key",
- "mobitruCredentialsRequired": "Mobitru Access Key is required",
"Session URL": "Session URL",
"Server Details": "Server Details",
"Session Length": "Session Length",
"Session Details": "Session Details",
"Currently Active App ID": "Currently Active App ID",
- "Session ID": "Session ID",
"confirmDeletion": "Are you sure you want to delete this?",
"Copied!": "Copied!",
"Error Fetching Session URL": "Error Fetching Session URL",
- "noResultsFound": "No results found",
+ "noRunningSessionsFound": "No running sessions found",
"invalidCapType": "Invalid capability type: {{type}}",
- "whitespaceDetected": "Text Starts and/or Ends With Whitespace"
+ "whitespaceDetected": "Text Starts and/or Ends With Whitespace",
+ "duplicateCapabilityNameError": "A capability set with the same name already exists",
+ "unableToImportGestureFiles": "Could not import gestures from the following files: {{fileNames}}",
+ "invalidSessionFile": "Invalid session file",
+ "TV Labs API Key": "TV Labs API Key",
+ "TestcribeAPIKey": "Testcribe API Key",
+ "sessionTestcribeApiKeyDescription": "You can get your api key from https://app.testcribe.com/settings/apiKeys",
+ "missingVendorProperties": "Please provide the following server details for {{vendorName}}: {{vendorProps}}",
+ "missingServerInfo": "Missing server info, could not query sessions",
+ "Username": "Username",
+ "URL": "URL",
+ "WebDriver URL": "WebDriver URL",
+ "API Key": "API Key",
+ "Access Key": "Access Key",
+ "SecurityToken": "SecurityToken",
+ "AccessToken": "AccessToken",
+ "Token": "Token",
+ "Key": "Key",
+ "Secret": "Secret",
+ "Theme": "Theme",
+ "Light Theme": "Light Theme",
+ "Dark Theme": "Dark Theme",
+ "System Theme": "System Theme",
+ "Search Source": "Search Source",
+ "Matching Elements": "Matching Elements",
+ "webmateApiKey": "webmate API Key",
+ "yourProjectId": "Your Project ID",
+ "webmateProjectId": "webmate Project ID",
+ "specifyWebmateHostExplicitly": "Specify webmate host explicitly",
+ "webmateHost": "webmate Host",
+ "Enable": "Enable",
+ "yourFireflinkDevicefarmDomain": "Your Fireflink DeviceFarm Domain (e.g., cloud.fireflink.com)",
+ "yourLicenseId": "Your License ID",
+ "yourProjectName": "Your Project Name",
+ "License ID": "License ID",
+ "Project Name": "Project Name",
+ "Fireflink DeviceFarm Domain": "Fireflink DeviceFarm Domain",
+ "Fireflink DeviceFarm Access Key": "Fireflink DeviceFarm Access Key",
+ "Fireflink DeviceFarm License ID": "Fireflink DeviceFarm License ID",
+ "Fireflink DeviceFarm Project Name": "Fireflink DeviceFarm Project Name",
+ "RabbitQA API Key": "RabbitQA API Key",
+ "RestartSessionMessage": "Device Connection Lost – Restarting the Session…",
+ "ToggleRestartSession": "Toggle Session Reload Upon Device Disconnect",
+ "toggleTableFormatting": "Toggle Table Formatting",
+ "copyResultToClipboard": "Copy Result to Clipboard",
+ "Property": "Property",
+ "noCapsFound": "No session capabilities found. Please use the Capability Builder to edit, add, and save your capability set. Refer to the tutorial at {{url}}",
+ "executeMethods": "Execute Methods",
+ "dynamicCommandsDescription": "Run commands supported by the currently active driver and plugin(s). Note that some commands may only work in specific contexts. Any commands not supported by WebdriverIO are not included in this list.",
+ "dynamicExecuteMethodsDescription": "Run any execute method supported by the currently active driver and plugin(s).",
+ "methodDeprecated": "This method is deprecated",
+ "App Settings": "App Settings",
+ "unableToImportSessionFiles": "Could not import sessions from the following files: {{fileNames}}",
+ "Import from File": "Import from File",
+ "useMjpegStream": "Use MJPEG Stream",
+ "useScreenshotApi": "Use Screenshot API",
+ "Box Model": "Box Model",
+ "detachFromSession": "Detach from Session",
+ "enterSessionID": "Enter session ID for attaching manually",
+ "refreshDiscoveredSessions": "Refresh Discovered Sessions",
+ "toggleMultiDisplayMode": "Toggle Multi-Display Mode"
}
diff --git a/assets/locales/hu/translation.json b/app/common/public/locales/hu/translation.json
similarity index 72%
rename from assets/locales/hu/translation.json
rename to app/common/public/locales/hu/translation.json
index cd4a262e55..b973087a29 100644
--- a/assets/locales/hu/translation.json
+++ b/app/common/public/locales/hu/translation.json
@@ -14,7 +14,6 @@
"Zoom Out": "Zoom Out",
"Reset Zoom Level": "Reset Zoom Level",
"Close Window": "Close Window",
- "Open Session File…": "Open Session File…",
"Bring All to Front": "Összes előtérbe helyezése",
"Help": "Segítség",
"Appium Documentation": "Appium dokumentáció",
@@ -41,7 +40,6 @@
"Save Server Arguments Preset": "Save Server Arguments Preset",
"Save": "Mentés",
"Cancel": "Mégse",
- "datetimeFormat": "YYYY.MMM.Do, h:mma",
"updateDetails": "Release Date: {{pubDate}}\n\nRelease Notes: {{notes}}",
"appiumIsAvailable": "Appium Inspector {{name}} is available",
"updateIsBeingDownloaded": "Update is being downloaded now. You will be notified again when it is complete",
@@ -68,20 +66,11 @@
"Could not start session": "Munkamenet elindítása nem lehetséges",
"couldNotConnect": "Could not connect to Appium server URL '{{url}}'. Please check if the server is running and the URL is correct (valid URLs can be found at the start of the Appium server log). If you are using the Inspector's browser version, ensure the server has been started with '--allow-cors'.",
"Invalid URL:": "Érvénytelen URL:",
- "sauceCredentialsRequired": "Sauce username and access key are required!",
- "testingbotCredentialsRequired": "TestingBot key and secret are required!",
- "Perfecto SecurityToken is required": "Perfecto SecurityToken is required",
- "browserstackCredentialsRequired": "Browserstack username and access key are required!",
- "lambdatestCredentialsRequired": "Lambdatest username and access key are required!",
- "bitbarCredentialsRequired": "Bitbar API key required!",
- "kobitonCredentialsRequired": "KOBITON username and api key are required!",
- "experitestAccessKeyURLRequired": "Experitest AccessKey and URL are required",
"experitestAccessKey": "Experitest AccessKey",
"experitestUrl": "Experitest Url",
"locatorStrategy": "Locator Strategy:",
"selector": "Selector:",
"couldNotObtainScreenshot": "Could not obtain screenshot: {{screenshotError}}",
- "selectElementInSource": "Select an element in the source to begin.",
"Press Home Button": "Press Home Button",
"Execute Siri Command": "Execute Siri Command",
"Press Back Button": "Press Back Button",
@@ -100,11 +89,11 @@
"Pause Recording": "Pause Recording",
"Search for element": "Search for element",
"App Source": "App Source",
+ "Collapse All": "Collapse All",
"Toggle Attributes": "Toggle Attributes",
"Copy XML Source to Clipboard": "Copy XML Source to Clipboard",
"Download Source as .XML File": "Download Source as .XML File",
"Copy Attributes to Clipboard": "Copy Attributes to Clipboard",
- "quitSessionAndClose": "Quit Session & Close Inspector",
"Session Inactive": "Session Inactive",
"Keep Session Running": "Keep Session Running",
"Quit Session": "Quit Session",
@@ -132,8 +121,9 @@
"usingXPathNotRecommended": "Using XPath locators is not recommended and can lead to fragile tests. Ask your development team to provide unique accessibility locators instead!",
"noAdditionalContextsFound": "No additional contexts have been detected",
"contextDropdownInfo": "Multiple contexts detected; certain elements might only be accessible after switching to a different context. Note that webview inspection in Appium Inspector is less accurate than the DevTools of Chrome or Safari. For more information, see:",
- "idAutocompletionCanBeDisabled": "The requested id selector does not have a package name prefix. This Appium session has package name autocompletion enabled, which may be the reason why no elements were found. To disable this behavior, relaunch this session with the capability 'appium:disableIdLocatorAutocompletion' set to 'true'.",
+ "idAutocompletionCanBeDisabled": "The requested id selector does not have a package name prefix. This Appium session has package name autocompletion enabled, which may be the reason why no elements were found. To disable this behavior, change the 'disableIdLocatorAutocompletion' setting to 'true'.",
"missingAutomationNameForStrategies": "Additional locator strategies may be available. To view them, add the capability 'appium:automationName' when launching the session. Note that this capability is mandatory in Appium 2.",
+ "snapshotMaxDepthReached": "This element is located at the maximum source depth {{selectedElementDepth}}, therefore its child elements (if any) are not shown. To reveal them, change the 'snapshotMaxDepth' setting to a value greater than {{selectedElementDepth}}. Check your driver documentation for the maximum supported value.",
"Tap": "Tap",
"Gathering initial app source…": "Gathering initial app source…",
"couldNotObtainSource": "Could not obtain source: {{errorMsg}}",
@@ -161,15 +151,14 @@
"boolean": "boolean",
"number": "number",
"JSON object": "JSON object",
- "filepath": "filepath",
"connectToExistingSessionInstructions": "If you have an already-running session of the above server type, you can attach an inspector to it directly.",
- "selectSessionIDInDropdown": "Select the Session ID in the dropdown below.",
+ "selectSessionID": "You can manually enter your session ID, or, if the server supports session discovery, simply select from a list of active sessions.",
"allowUnauthorizedCerts": "Allow Unauthorized Certificates",
"Use Proxy": "Use Proxy",
"JSON Representation": "JSON Representation",
"Capability Builder": "Capability Builder",
"Saved Capability Sets": "Saved Capability Sets",
- "Attach to Session": "Munkamenethez csatlakozás…",
+ "Attach": "Attach",
"localhost": "localhost",
"Host": "Kiszolgáló",
"Port": "Port",
@@ -195,16 +184,19 @@
"Remote Path": "Remote Path",
"BrowserStack Username": "BrowserStack Username",
"BrowserStack Access Key": "BrowserStack Access Key",
- "LambdaTest Username": "LambdaTest Username",
- "LambdaTest Access Key": "LambdaTest Access Key",
+ "TestMu AI Username": "TestMu AI Username",
+ "TestMu AI Access Key": "TestMu AI Access Key",
"Bitbar API Key": "Bitbar API Key",
"RemoteTestKit AccessToken": "RemoteTestKit AccessToken",
"RobotQA Token": "RobotQA Token",
+ "RobotActions Host": "RobotActions Host",
+ "RobotActions Token": "RobotActions Token",
+ "Add": "Add",
"Name": "Név",
"Description": "Description",
"Created": "Created",
"Actions": "Actions",
- "enterYourSessionId": "Enter your session ID here",
+ "searchSessions": "Search discovered sessions",
"Proxy URL": "Proxy URL",
"Source": "Forrás",
"Commands": "Parancsok",
@@ -212,12 +204,14 @@
"Gestures": "Gesztusok",
"Gesture Builder": "Gesture Builder",
"Saved Gestures": "Mentett gesztusok",
+ "Create New Gesture": "Create New Gesture",
"gesturesDescription": "Create, save, and execute custom gestures here. Gestures are identical to action chains in the W3C WebDriver Actions API.",
"Session Information": "Session Information",
"Execute Command": "Parancs végrehajtás",
"commandsDescription": "Run various commands using the current Appium driver. Note that not all drivers support all commands.",
- "Click to Set Coordinates": "Click to Set Coordinates",
- "Set Coordinates Via Field": "Set Coordinates Via Field",
+ "showMoveActionCoordsInPercentage": "Show Coordinates of Move Actions in Screen Dimension Percentages",
+ "showMoveActionCoordsInPixels": "Show Coordinates of Move Actions in Pixels",
+ "toggleMoveActionCoordPicker": "Toggle Setting Coordinates via Clicking on Screenshot",
"Action Type": "Action Type",
"Pointer Up": "Pointer Up",
"Pointer Down": "Pointer Down",
@@ -234,29 +228,23 @@
"Left": "Bal",
"Right": "Jobb",
"Play": "Lejátszás",
+ "Export to File": "Export to File",
"Save Capability Set As": "Save Capability Set As…",
"Edit Raw JSON": "Edit Raw JSON",
- "Enter Parameters for:": "Enter Parameters for:",
+ "enterMethodParameters": "Enter Parameters for: '{{methodName}}'",
"invalidJson": "Érvénytelen JSON",
- "Execute Script": "Execute Script",
"App Management": "App Management",
- "Clipboard": "Vágólap",
"File Transfer": "Fájlátvitel",
"Device Interaction": "Device Interaction",
- "Keyboard": "Billentyűzet",
- "Connectivity": "Connectivity",
- "Performance Data": "Performance Data",
- "System": "Rendszer",
"Session": "Munkamenet",
"Web": "Web",
"Context": "Kontextus",
- "Window (W3C)": "Ablak (W3C)",
"simulatorOnly": "Emulator/simulator only",
"minAndroidSDK": "Minimum Android SDK verzió",
"Error": "Hiba",
"findingElementInSourceFailed": "A meghatározott elem nem található. A jelenlegi alkalmazás forrás vagy elem ID megváltozhatott, vagy túl sok elem rendelkezik azonos koordinátákkal.",
"callToMethodFailed": "Call to '{{methodName}}' failed",
- "methodCallResult": "'{{methodName}}' eredmény",
+ "methodCallResult": "Result for: '{{methodName}}' (type: {{resultType}})",
"TestingBot Key": "TestingBot Key",
"TestingBot Secret": "TestingBot Secret",
"Appium Server": "Appium Server",
@@ -269,17 +257,75 @@
"Mobitru WebDriver URL": "Mobitru WebDriver URL",
"Mobitru Billing Unit": "Mobitru Billing Unit",
"Mobitru Access Key": "Mobitru Access Key",
- "mobitruCredentialsRequired": "Mobitru Access Key is required",
"Session URL": "Session URL",
"Server Details": "Server Details",
"Session Length": "Session Length",
"Session Details": "Session Details",
"Currently Active App ID": "Currently Active App ID",
- "Session ID": "Session ID",
"confirmDeletion": "Are you sure you want to delete this?",
"Copied!": "Copied!",
"Error Fetching Session URL": "Error Fetching Session URL",
- "noResultsFound": "No results found",
+ "noRunningSessionsFound": "No running sessions found",
"invalidCapType": "Invalid capability type: {{type}}",
- "whitespaceDetected": "Text Starts and/or Ends With Whitespace"
+ "whitespaceDetected": "Text Starts and/or Ends With Whitespace",
+ "duplicateCapabilityNameError": "A capability set with the same name already exists",
+ "unableToImportGestureFiles": "Could not import gestures from the following files: {{fileNames}}",
+ "invalidSessionFile": "Invalid session file",
+ "TV Labs API Key": "TV Labs API Key",
+ "TestcribeAPIKey": "Testcribe API Key",
+ "sessionTestcribeApiKeyDescription": "You can get your api key from https://app.testcribe.com/settings/apiKeys",
+ "missingVendorProperties": "Please provide the following server details for {{vendorName}}: {{vendorProps}}",
+ "missingServerInfo": "Missing server info, could not query sessions",
+ "Username": "Username",
+ "URL": "URL",
+ "WebDriver URL": "WebDriver URL",
+ "API Key": "API Key",
+ "Access Key": "Access Key",
+ "SecurityToken": "SecurityToken",
+ "AccessToken": "AccessToken",
+ "Token": "Token",
+ "Key": "Key",
+ "Secret": "Secret",
+ "Theme": "Theme",
+ "Light Theme": "Light Theme",
+ "Dark Theme": "Dark Theme",
+ "System Theme": "System Theme",
+ "Search Source": "Search Source",
+ "Matching Elements": "Matching Elements",
+ "webmateApiKey": "webmate API Key",
+ "yourProjectId": "Your Project ID",
+ "webmateProjectId": "webmate Project ID",
+ "specifyWebmateHostExplicitly": "Specify webmate host explicitly",
+ "webmateHost": "webmate Host",
+ "Enable": "Enable",
+ "yourFireflinkDevicefarmDomain": "Your Fireflink DeviceFarm Domain (e.g., cloud.fireflink.com)",
+ "yourLicenseId": "Your License ID",
+ "yourProjectName": "Your Project Name",
+ "License ID": "License ID",
+ "Project Name": "Project Name",
+ "Fireflink DeviceFarm Domain": "Fireflink DeviceFarm Domain",
+ "Fireflink DeviceFarm Access Key": "Fireflink DeviceFarm Access Key",
+ "Fireflink DeviceFarm License ID": "Fireflink DeviceFarm License ID",
+ "Fireflink DeviceFarm Project Name": "Fireflink DeviceFarm Project Name",
+ "RabbitQA API Key": "RabbitQA API Key",
+ "RestartSessionMessage": "Device Connection Lost – Restarting the Session…",
+ "ToggleRestartSession": "Toggle Session Reload Upon Device Disconnect",
+ "toggleTableFormatting": "Toggle Table Formatting",
+ "copyResultToClipboard": "Copy Result to Clipboard",
+ "Property": "Property",
+ "noCapsFound": "No session capabilities found. Please use the Capability Builder to edit, add, and save your capability set. Refer to the tutorial at {{url}}",
+ "executeMethods": "Execute Methods",
+ "dynamicCommandsDescription": "Run commands supported by the currently active driver and plugin(s). Note that some commands may only work in specific contexts. Any commands not supported by WebdriverIO are not included in this list.",
+ "dynamicExecuteMethodsDescription": "Run any execute method supported by the currently active driver and plugin(s).",
+ "methodDeprecated": "This method is deprecated",
+ "App Settings": "App Settings",
+ "unableToImportSessionFiles": "Could not import sessions from the following files: {{fileNames}}",
+ "Import from File": "Import from File",
+ "useMjpegStream": "Use MJPEG Stream",
+ "useScreenshotApi": "Use Screenshot API",
+ "Box Model": "Box Model",
+ "detachFromSession": "Detach from Session",
+ "enterSessionID": "Enter session ID for attaching manually",
+ "refreshDiscoveredSessions": "Refresh Discovered Sessions",
+ "toggleMultiDisplayMode": "Toggle Multi-Display Mode"
}
diff --git a/assets/locales/it/translation.json b/app/common/public/locales/it/translation.json
similarity index 72%
rename from assets/locales/it/translation.json
rename to app/common/public/locales/it/translation.json
index b4d43f55f8..fccf1359c2 100644
--- a/assets/locales/it/translation.json
+++ b/app/common/public/locales/it/translation.json
@@ -14,7 +14,6 @@
"Zoom Out": "Zoom Out",
"Reset Zoom Level": "Reset Zoom Level",
"Close Window": "Close Window",
- "Open Session File…": "Open Session File…",
"Bring All to Front": "Porta tutto in primo piano",
"Help": "Aiuto",
"Appium Documentation": "Documentazione di Appium",
@@ -41,7 +40,6 @@
"Save Server Arguments Preset": "Salva le variabili predefinite del server",
"Save": "Salva",
"Cancel": "Annulla",
- "datetimeFormat": "MMM Do YYYY, h:mma",
"updateDetails": "Data di rilascio: {{pubDate}}\n\nNote di rilascio: {{notes}}",
"appiumIsAvailable": "Appium Inspector {{name}} è disponibile",
"updateIsBeingDownloaded": "L'aggiornamento è in fase di scaricamento. Sarai avvisato di nuovo quando sarà completato",
@@ -68,20 +66,11 @@
"Could not start session": "Impossibile avviare la sessione",
"couldNotConnect": "Impossibile connettersi all'URL del server Appium '{{url}}'. Si prega di controllare se il server è in esecuzione e l'URL è corretto (URL validi possono essere trovati all'inizio del log del server Appium). Se stai usando la versione browser dell' Inspector, assicurati che il server sia stato avviato con '--allow-cors'.",
"Invalid URL:": "URL non valido:",
- "sauceCredentialsRequired": "Username e access key di saucelabs sono obbligatori!",
- "testingbotCredentialsRequired": "Chiave e secret di TestingBot sono obbligatori!",
- "Perfecto SecurityToken is required": "Il SecurityToken di Perfecto è obbligatorio",
- "browserstackCredentialsRequired": "Username e access key di Browserstack sono obbligatori!",
- "lambdatestCredentialsRequired": "Username e access key di Lambdatest sono obbligatori!",
- "bitbarCredentialsRequired": "Bitmarm API key è obbligatoria!",
- "kobitonCredentialsRequired": "Username e api key di KOBITON sono obbligatori!",
- "experitestAccessKeyURLRequired": "AccessKey e URL di Experitest sono obbligatori",
"experitestAccessKey": "Experitest AccessKey",
"experitestUrl": "Experitest Url",
"locatorStrategy": "Strategia di localizzazione:",
"selector": "Selettore:",
"couldNotObtainScreenshot": "Impossibile ottenere screenshot: {{screenshotError}}",
- "selectElementInSource": "Seleziona un elemento nel codice per iniziare.",
"Press Home Button": "Premere il pulsante Home",
"Execute Siri Command": "Esegui comando Siri",
"Press Back Button": "Premere il pulsante indietro",
@@ -100,11 +89,11 @@
"Pause Recording": "Metti in pausa la registrazione",
"Search for element": "Cerca un elemento",
"App Source": "Sorgente dell'app",
+ "Collapse All": "Collapse All",
"Toggle Attributes": "Attiva/disattiva attributi",
"Copy XML Source to Clipboard": "Copia il sorgente XML negli appunti",
"Download Source as .XML File": "Scarica Sorgente come file .XML",
"Copy Attributes to Clipboard": "Copia gli attributi negli appunti",
- "quitSessionAndClose": "Termina la sessione e chiudi l'inspector",
"Session Inactive": "Sessione Inattiva",
"Keep Session Running": "Mantieni Sessione In Esecuzione",
"Quit Session": "Termina Sessione",
@@ -132,8 +121,9 @@
"usingXPathNotRecommended": "L'utilizzo di localizzatori XPath non è raccomandato e può portare a test fragili. Chiedi invece al tuo team di sviluppo di fornire localizzatori unici di accessibilità!",
"noAdditionalContextsFound": "Non sono stati rilevati contesti aggiuntivi",
"contextDropdownInfo": "Rilevati contesti multipli; alcuni elementi potrebbero essere accessibili solo dopo il passaggio a un contesto diverso. Si noti che l'ispezione di visualizzazione web in Appium Inspector è meno accurata rispetto ai DevTools di Chrome o Safari. Per maggiori informazioni, consultare:",
- "idAutocompletionCanBeDisabled": "Il selettore id richiesto non ha un prefisso per il nome del pacchetto. Questa sessione Appium ha l'autocompletamento abilitato per il nome del pacchetto, che può essere il motivo per cui nessun elemento è stato trovato. Per disabilitare questo comportamento, riavvia questa sessione con la funzionalità 'appium:disableIdLocatorAutocompletion' impostata su 'true'.",
+ "idAutocompletionCanBeDisabled": "The requested id selector does not have a package name prefix. This Appium session has package name autocompletion enabled, which may be the reason why no elements were found. To disable this behavior, change the 'disableIdLocatorAutocompletion' setting to 'true'.",
"missingAutomationNameForStrategies": "Potrebbero essere disponibili strategie di localizzatore aggiuntive. Per visualizzarle, aggiungi la funzionalità 'appium:automationName' all'avvio della sessione. Si noti che questa capability è obbligatoria con Appium2.",
+ "snapshotMaxDepthReached": "This element is located at the maximum source depth {{selectedElementDepth}}, therefore its child elements (if any) are not shown. To reveal them, change the 'snapshotMaxDepth' setting to a value greater than {{selectedElementDepth}}. Check your driver documentation for the maximum supported value.",
"Tap": "Tocco",
"Gathering initial app source…": "Ottenendo il sorgente iniziale dell'app…",
"couldNotObtainSource": "Impossibile ottenere il sorgente: {{errorMsg}}",
@@ -161,15 +151,14 @@
"boolean": "booleano",
"number": "numero",
"JSON object": "Oggetto JSON",
- "filepath": "percorso",
"connectToExistingSessionInstructions": "Se si dispone di una sessione già in esecuzione del tipo di server sopra, è possibile connettere un Inspector ad essa direttamente.",
- "selectSessionIDInDropdown": "Seleziona l'ID di sessione nel menu a tendina qui sotto.",
+ "selectSessionID": "You can manually enter your session ID, or, if the server supports session discovery, simply select from a list of active sessions.",
"allowUnauthorizedCerts": "Consenti Certificati Non Autorizzati",
"Use Proxy": "Usa Proxy",
"JSON Representation": "Rappresentazione JSON",
"Capability Builder": "Costruttore delle capability",
"Saved Capability Sets": "Capability Salvate",
- "Attach to Session": "Collegati alla sessione…",
+ "Attach": "Attach",
"localhost": "localhost",
"Host": "Host",
"Port": "Porta",
@@ -195,16 +184,19 @@
"Remote Path": "Percorso remoto",
"BrowserStack Username": "Username di BrowserStack",
"BrowserStack Access Key": "Access Key di BrowserStack",
- "LambdaTest Username": "Username di LambdaTest",
- "LambdaTest Access Key": "Access Key di LambdaTest",
+ "TestMu AI Username": "TestMu AI Username",
+ "TestMu AI Access Key": "TestMu AI Access Key",
"Bitbar API Key": "API Key di Bitbar",
"RemoteTestKit AccessToken": "RemoteTestKit AccessToken",
"RobotQA Token": "RobotQA Token",
+ "RobotActions Host": "RobotActions Host",
+ "RobotActions Token": "RobotActions Token",
+ "Add": "Add",
"Name": "Nome",
"Description": "Descrizione",
"Created": "Creato",
"Actions": "Azioni",
- "enterYourSessionId": "Inserisci qui l'ID della sessione",
+ "searchSessions": "Search discovered sessions",
"Proxy URL": "Proxy URL",
"Source": "Sorgente",
"Commands": "Comandi",
@@ -212,12 +204,14 @@
"Gestures": "Gesture",
"Gesture Builder": "Costruttore Gesture",
"Saved Gestures": "Gesture Salvate",
+ "Create New Gesture": "Create New Gesture",
"gesturesDescription": "Qui crea, salva ed esegui gesti personalizzati. I gesti sono identici alle catene di azione nell'API delle azioni WebDriver W3C.",
"Session Information": "Informazioni sulla sessione",
"Execute Command": "Esegui il comando",
"commandsDescription": "Esegue vari comandi usando il driver Appium corrente. Nota che non tutti i driver supportano tutti i comandi.",
- "Click to Set Coordinates": "Fare clic per impostare le coordinate",
- "Set Coordinates Via Field": "Imposta le coordinate tramite l'apposito campo",
+ "showMoveActionCoordsInPercentage": "Show Coordinates of Move Actions in Screen Dimension Percentages",
+ "showMoveActionCoordsInPixels": "Show Coordinates of Move Actions in Pixels",
+ "toggleMoveActionCoordPicker": "Toggle Setting Coordinates via Clicking on Screenshot",
"Action Type": "Tipo di Azione",
"Pointer Up": "Puntatore Su",
"Pointer Down": "Puntatore Giù",
@@ -234,29 +228,23 @@
"Left": "Sinistra",
"Right": "Destra",
"Play": "Avvia",
+ "Export to File": "Export to File",
"Save Capability Set As": "Salva il set di capability come…",
"Edit Raw JSON": "Modifica JSON",
- "Enter Parameters for:": "Inserisci i parametri per:",
+ "enterMethodParameters": "Enter Parameters for: '{{methodName}}'",
"invalidJson": "JSON non valido",
- "Execute Script": "Esegui script",
"App Management": "Gestione app",
- "Clipboard": "Appunti",
"File Transfer": "Trasferimento file",
"Device Interaction": "Interazione con il dispositivo",
- "Keyboard": "Tastiera",
- "Connectivity": "Connettività",
- "Performance Data": "Dati sulle prestazioni",
- "System": "Sistema",
"Session": "Sessione",
"Web": "Web",
"Context": "Contesto",
- "Window (W3C)": "Finestra (W3C)",
"simulatorOnly": "Solo emulatore/simulatore",
"minAndroidSDK": "Livello minimo SDK Android",
"Error": "Errore",
"findingElementInSourceFailed": "Impossibile trovare l'elemento specificato. L'attuale sorgente dell'app o l'ID potrebbe essere cambiato, o ci possono essere troppi elementi con le stesse coordinate.",
"callToMethodFailed": "Chiamata a '{{methodName}}' fallita",
- "methodCallResult": "Risultato di '{{methodName}}'",
+ "methodCallResult": "Result for: '{{methodName}}' (type: {{resultType}})",
"TestingBot Key": "Key di TestingBot",
"TestingBot Secret": "Secret di TestingBot",
"Appium Server": "Server Appium",
@@ -269,17 +257,75 @@
"Mobitru WebDriver URL": "Mobitru WebDriver URL",
"Mobitru Billing Unit": "Unità Di Fatturazione Mobitru",
"Mobitru Access Key": "Mobitru Access Key",
- "mobitruCredentialsRequired": "La chiave di accesso di Mobitru è richiesta",
"Session URL": "URL della sessione",
"Server Details": "Dettagli del server",
"Session Length": "Durata della sessione",
"Session Details": "Dettagli della sessione",
"Currently Active App ID": "Id App Attualmente Attivo",
- "Session ID": "ID Sessione",
"confirmDeletion": "Sei sicuro di voler eliminare questo elemento ?",
"Copied!": "Copiato!",
"Error Fetching Session URL": "Errore Nel Recupero Url Della Sessione",
- "noResultsFound": "Nessun risultato trovato",
+ "noRunningSessionsFound": "No running sessions found",
"invalidCapType": "Tipo di capability non valido: {{type}}",
- "whitespaceDetected": "Il testo inizia e/o termina con uno spazio bianco"
+ "whitespaceDetected": "Il testo inizia e/o termina con uno spazio bianco",
+ "duplicateCapabilityNameError": "A capability set with the same name already exists",
+ "unableToImportGestureFiles": "Could not import gestures from the following files: {{fileNames}}",
+ "invalidSessionFile": "Invalid session file",
+ "TV Labs API Key": "TV Labs API Key",
+ "TestcribeAPIKey": "Testcribe API Key",
+ "sessionTestcribeApiKeyDescription": "You can get your api key from https://app.testcribe.com/settings/apiKeys",
+ "missingVendorProperties": "Please provide the following server details for {{vendorName}}: {{vendorProps}}",
+ "missingServerInfo": "Missing server info, could not query sessions",
+ "Username": "Username",
+ "URL": "URL",
+ "WebDriver URL": "WebDriver URL",
+ "API Key": "API Key",
+ "Access Key": "Access Key",
+ "SecurityToken": "SecurityToken",
+ "AccessToken": "AccessToken",
+ "Token": "Token",
+ "Key": "Key",
+ "Secret": "Secret",
+ "Theme": "Theme",
+ "Light Theme": "Light Theme",
+ "Dark Theme": "Dark Theme",
+ "System Theme": "System Theme",
+ "Search Source": "Search Source",
+ "Matching Elements": "Matching Elements",
+ "webmateApiKey": "webmate API Key",
+ "yourProjectId": "Your Project ID",
+ "webmateProjectId": "webmate Project ID",
+ "specifyWebmateHostExplicitly": "Specify webmate host explicitly",
+ "webmateHost": "webmate Host",
+ "Enable": "Enable",
+ "yourFireflinkDevicefarmDomain": "Your Fireflink DeviceFarm Domain (e.g., cloud.fireflink.com)",
+ "yourLicenseId": "Your License ID",
+ "yourProjectName": "Your Project Name",
+ "License ID": "License ID",
+ "Project Name": "Project Name",
+ "Fireflink DeviceFarm Domain": "Fireflink DeviceFarm Domain",
+ "Fireflink DeviceFarm Access Key": "Fireflink DeviceFarm Access Key",
+ "Fireflink DeviceFarm License ID": "Fireflink DeviceFarm License ID",
+ "Fireflink DeviceFarm Project Name": "Fireflink DeviceFarm Project Name",
+ "RabbitQA API Key": "RabbitQA API Key",
+ "RestartSessionMessage": "Device Connection Lost – Restarting the Session…",
+ "ToggleRestartSession": "Toggle Session Reload Upon Device Disconnect",
+ "toggleTableFormatting": "Toggle Table Formatting",
+ "copyResultToClipboard": "Copy Result to Clipboard",
+ "Property": "Property",
+ "noCapsFound": "No session capabilities found. Please use the Capability Builder to edit, add, and save your capability set. Refer to the tutorial at {{url}}",
+ "executeMethods": "Execute Methods",
+ "dynamicCommandsDescription": "Run commands supported by the currently active driver and plugin(s). Note that some commands may only work in specific contexts. Any commands not supported by WebdriverIO are not included in this list.",
+ "dynamicExecuteMethodsDescription": "Run any execute method supported by the currently active driver and plugin(s).",
+ "methodDeprecated": "This method is deprecated",
+ "App Settings": "App Settings",
+ "unableToImportSessionFiles": "Could not import sessions from the following files: {{fileNames}}",
+ "Import from File": "Import from File",
+ "useMjpegStream": "Use MJPEG Stream",
+ "useScreenshotApi": "Use Screenshot API",
+ "Box Model": "Box Model",
+ "detachFromSession": "Detach from Session",
+ "enterSessionID": "Enter session ID for attaching manually",
+ "refreshDiscoveredSessions": "Refresh Discovered Sessions",
+ "toggleMultiDisplayMode": "Toggle Multi-Display Mode"
}
diff --git a/assets/locales/ja/translation.json b/app/common/public/locales/ja/translation.json
similarity index 71%
rename from assets/locales/ja/translation.json
rename to app/common/public/locales/ja/translation.json
index 676045d94e..2d0c236b36 100644
--- a/assets/locales/ja/translation.json
+++ b/app/common/public/locales/ja/translation.json
@@ -14,7 +14,6 @@
"Zoom Out": "縮小",
"Reset Zoom Level": "拡大/縮小のリセット",
"Close Window": "閉じる",
- "Open Session File…": "セッションファイルを開く",
"Bring All to Front": "すべてを手前に移動",
"Help": "ヘルプ",
"Appium Documentation": "Appium 関連のドキュメント",
@@ -41,11 +40,10 @@
"Save Server Arguments Preset": "サーバー構成を事前設定として保存する",
"Save": "保存",
"Cancel": "キャンセル",
- "datetimeFormat": "YYYY MMM Do, h:mma",
"updateDetails": "リリース日: {{pubDate}}\n\nリリースノート: {{notes}}",
"appiumIsAvailable": "Appium Inspector {{name}} が入手可能です",
"updateIsBeingDownloaded": "更新をダウンロードし始めました。完了し次第、お知らせします。",
- "updateIsDownloaded": "Appium Inspector {{releaseName}} のダウンロードが完了しました。適用するにはアプリを再起動してください(Appium Inspectorをインストール、再起動するまでに数分かかることがあります)",
+ "updateIsDownloaded": "Appium Inspector {{releaseName}} のダウンロードが完了しました。適用するにはアプリを再起動してください(Appium Inspectorをインストール、再起動するまでに数分かかることがあります)",
"updateDownloadFailed": "{{message}} のため更新のダウンロードに失敗しました",
"OK": "OK",
"Install Now": "今すぐインストールする",
@@ -66,22 +64,13 @@
"frameworkNotSupported": "フレームワーク '{{framework}}' がサポートされていません",
"findElementFailure": "'{{methodName}}' の要素検索に失敗しました。ページを更新しやり直してください。",
"Could not start session": "セッションを開始できませんでした。",
- "couldNotConnect": "'{{url}}' に接続できませんでした。 Appiumサーバーが起動、URLが正しいかどうかを確認してください(Appiumサーバーログの先頭に有効なURLが表示されています)。 Browser版Appium Inspectorを使用している場合は、サーバーが '--allow-cors' で起動されていることを確認してください。",
+ "couldNotConnect": "'{{url}}' に接続できませんでした。 Appiumサーバーが起動、URLが正しいかどうかを確認してください(Appiumサーバーログの先頭に有効なURLが表示されています)。 Browser版Appium Inspectorを使用している場合は、サーバーが '--allow-cors' で起動されていることを確認してください。",
"Invalid URL:": "無効なURLです:",
- "sauceCredentialsRequired": "Sauceのユーザー名とアクセス キーが必要です",
- "testingbotCredentialsRequired": "TestingBotのキーとシークレットが必要です",
- "Perfecto SecurityToken is required": "PerfectoのSecurityTokenが必要です",
- "browserstackCredentialsRequired": "Browserstackのユーザ名とアクセスキーが必要です",
- "lambdatestCredentialsRequired": "Lambdatest のユーザー名とアクセスキーが必要です",
- "bitbarCredentialsRequired": "BitbarのAPIキーが必要です",
- "kobitonCredentialsRequired": "Kobitonのユーザ名とアクセスキーが必要です",
- "experitestAccessKeyURLRequired": "ExperitestのAccessKeyとURLが必要です",
"experitestAccessKey": "ExperitestのAccessKey",
"experitestUrl": "ExperitestのURL",
"locatorStrategy": "ロケーター:",
"selector": "セレクタ:",
"couldNotObtainScreenshot": "スクリーンショットの取得に失敗しました: {{screenshotError}}",
- "selectElementInSource": "ソース中の要素を選択してください",
"Press Home Button": "ホームボタンを押す",
"Execute Siri Command": "Siri コマンドを実行する",
"Press Back Button": "戻るボタンを押す",
@@ -100,11 +89,11 @@
"Pause Recording": "記録を一時停止",
"Search for element": "要素を検索する",
"App Source": "アプリのソース",
+ "Collapse All": "Collapse All",
"Toggle Attributes": "属性の切り替え",
"Copy XML Source to Clipboard": "XML形式でソースをクリップボードにコピーする",
"Download Source as .XML File": ".XML ファイルとしてソースをダウンロードする",
"Copy Attributes to Clipboard": "クリップボードに属性をコピーします",
- "quitSessionAndClose": "セッションを閉じ、インスペクターを閉じます",
"Session Inactive": "非アクティブなセッション",
"Keep Session Running": "実行中のセッションを維持します",
"Quit Session": "セッションを閉じる",
@@ -120,7 +109,7 @@
"Start this Kind of Session with Code": "この種のセッションをコードで開始",
"Clear Actions": "操作をクリアする",
"Close Recorder": "レコーダーを閉じる",
- "enableRecordingAndPerformActions": "Enable recording in the application header, then perform some actions to see code show up here",
+ "enableRecordingAndPerformActions": "記録を有効にし、行なった操作に関するコードを表示します",
"Recorder": "レコーダー",
"Attribute": "属性",
"Value": "値",
@@ -132,8 +121,9 @@
"usingXPathNotRecommended": "壊れやすいテストになりやすいため、XPathロケータの利用はおすすめされません。開発者と協力してユニークなaccessibilityロケータへの置き換えを検討してください。",
"noAdditionalContextsFound": "追加のコンテキストはありません",
"contextDropdownInfo": "複数のコンテキストが検出されています。特定の要素は、適切なコンテキストに切り替えた後に操作可能です。 Appium Inspector のWebviewサポートはChromeまたはSafariのDevToolsよりも正確ではないことに注意してください。詳細については、次を参照してください:",
- "idAutocompletionCanBeDisabled": "要求された id セレクターにはパッケージ名の接頭辞がありません。 このAppiumセッションにはパッケージ名の自動補完が有効なため、自動保管により要素が見つからなかった可能性があります。 この自動補完機能を無効にするには、'appium:disableIdLocatorAutocompletion' を 'true' に設定してセッションを開始してください。",
+ "idAutocompletionCanBeDisabled": "要求された id セレクターにはパッケージ名の接頭辞がありません。 このAppiumセッションにはパッケージ名の自動補完が有効なため、自動補完により要素が見つからなかった可能性があります。 この自動補完機能を無効にするには、'appium:disableIdLocatorAutocompletion' を 'true' に設定してセッションを開始してください。",
"missingAutomationNameForStrategies": "追加のロケーターが利用できるかもしれません。これらを表示するには、セッションを起動するときに”appium:automationName\"を追加します。 Appium 2ではこの機能が必須であることに注意してください。",
+ "snapshotMaxDepthReached": "この要素はソースの最深部 {{selectedElementDepth}} に位置しますが、子要素は何も表示されていません。取得可能な子要素を表示するには、Settings API から'snapshotMaxDepth' の値を {{selectedElementDepth}} より大きな値変更してください。可能な最大値はドライバーのドキュメントを確認してください。",
"Tap": "タップ",
"Gathering initial app source…": "アプリのソースを取得しています…",
"couldNotObtainSource": "ソースを取得できませんでした: {{errorMsg}}",
@@ -144,7 +134,7 @@
"saveAs": "名前をつけて保存",
"attachToSession": "セッションに接続する",
"selectedElement": "選択された要素",
- "unnamed": "(Unnamed)",
+ "unnamed": "(名前なし)",
"No Description": "説明なし",
"couldNotFindEntryWithId": "ID {{id}} の要素が見つかりませんでした",
"couldNotFindAnyElements": "要素を見つけられませんでした",
@@ -161,15 +151,14 @@
"boolean": "ブール値",
"number": "数字",
"JSON object": "JSONオブジェクト",
- "filepath": "ファイルパス",
- "connectToExistingSessionInstructions": "上記のサーバタイプにおける実行中セッションがある場合、インスペクタを直接接続することができます",
- "selectSessionIDInDropdown": "以下のドロップダウンからセッションIDを選択してください",
+ "connectToExistingSessionInstructions": "上記のサーバーに実行中のセッションがすでにある場合、インスペクタを直接接続することができます",
+ "selectSessionID": "You can manually enter your session ID, or, if the server supports session discovery, simply select from a list of active sessions.",
"allowUnauthorizedCerts": "認可されていない証明書を許可する",
"Use Proxy": "プロキシを使用する",
"JSON Representation": "JSONで表示",
"Capability Builder": "Capability生成",
"Saved Capability Sets": "保存されたCapability",
- "Attach to Session": "実行中のセッションに接続…",
+ "Attach": "Attach",
"localhost": "ローカルホスト",
"Host": "ホスト",
"Port": "ポート",
@@ -195,16 +184,19 @@
"Remote Path": "リモートパス",
"BrowserStack Username": "Browserstackのユーザ名",
"BrowserStack Access Key": "Browserstackのアクセスキー",
- "LambdaTest Username": "LambdaTest のユーザー名",
- "LambdaTest Access Key": "LambdaTest のアクセスキー",
+ "TestMu AI Username": "TestMu AI Username",
+ "TestMu AI Access Key": "TestMu AI Access Key",
"Bitbar API Key": "BitbarのAPIキー",
"RemoteTestKit AccessToken": "RemoteTestKit AccessToken",
"RobotQA Token": "RobotQA Token",
+ "RobotActions Host": "RobotActions Host",
+ "RobotActions Token": "RobotActions Token",
+ "Add": "追加",
"Name": "キー名",
- "Description": "Description",
- "Created": "Created",
+ "Description": "備考",
+ "Created": "作成日",
"Actions": "操作",
- "enterYourSessionId": "セッションIDを入力してください",
+ "searchSessions": "Search discovered sessions",
"Proxy URL": "プロキシURL",
"Source": "ソース",
"Commands": "コマンド",
@@ -212,12 +204,14 @@
"Gestures": "ジェスチャー",
"Gesture Builder": "ジェスチャーの構築",
"Saved Gestures": "保存されたジェスチャー",
+ "Create New Gesture": "新しい操作を記録する",
"gesturesDescription": "ここでカスタムジェスチャーを作成、保存、実行します。ジェスチャーは W3C WebDriver Actions API と同じです。",
"Session Information": "セッション情報",
"Execute Command": "コマンドを実行",
"commandsDescription": "現在のAppiumドライバを使用してさまざまなコマンドを実行します。すべてのドライバがすべてのコマンドをサポートしているわけではありません。",
- "Click to Set Coordinates": "クリックして座標を設定する",
- "Set Coordinates Via Field": "フィールドで座標を設定する",
+ "showMoveActionCoordsInPercentage": "画面の寸法%に移動アクションの座標を表示する",
+ "showMoveActionCoordsInPixels": "移動アクションの座標をピクセルで表示する",
+ "toggleMoveActionCoordPicker": "スクリーンショットをクリックして座標を設定する",
"Action Type": "Action Type",
"Pointer Up": "Pointer Up",
"Pointer Down": "Pointer Down",
@@ -234,29 +228,23 @@
"Left": "Left",
"Right": "Right",
"Play": "Play",
+ "Export to File": "Export to File",
"Save Capability Set As": "名前をつけてCapabilityを保存",
"Edit Raw JSON": "直接JSONを編集する",
- "Enter Parameters for:": "パラメータを入力する:",
+ "enterMethodParameters": "Enter Parameters for: '{{methodName}}'",
"invalidJson": "無効なJSON形式です",
- "Execute Script": "スクリプトを実行する",
"App Management": "アプリ操作",
- "Clipboard": "クリップボード",
"File Transfer": "ファイル転送",
"Device Interaction": "端末操作",
- "Keyboard": "キーボード",
- "Connectivity": "接続",
- "Performance Data": "パフォーマンスデータ",
- "System": "システム",
"Session": "セッション",
"Web": "Web",
"Context": "コンテキスト",
- "Window (W3C)": "Window (W3C)",
"simulatorOnly": "エミュレータ/シミュレータのみ",
"minAndroidSDK": "最小のAndroid SDK",
"Error": "エラー",
"findingElementInSourceFailed": "指定した要素が見つかりませんでした。 現在のアプリケーションのソースまたは要素IDが変更されているか、または同じ座標を持つ要素が多すぎる可能性があります。",
"callToMethodFailed": "'{{methodName}}'の実行に失敗しました",
- "methodCallResult": "'{{methodName}}' の結果",
+ "methodCallResult": "Result for: '{{methodName}}' (type: {{resultType}})",
"TestingBot Key": "TestingBotキー",
"TestingBot Secret": "TestingBotシークレット",
"Appium Server": "Appiumサーバー",
@@ -269,17 +257,75 @@
"Mobitru WebDriver URL": "Mobitru WebDriver URL",
"Mobitru Billing Unit": "Mobitru 課金ユニット",
"Mobitru Access Key": "Mobitru のアクセスキー",
- "mobitruCredentialsRequired": "Mobitru のアクセスキーが必要です",
"Session URL": "Session URL",
"Server Details": "サーバーの詳細",
"Session Length": "セッションの長さ",
"Session Details": "セッションの詳細",
"Currently Active App ID": "現在アクティブなアプリID",
- "Session ID": "セッション ID",
"confirmDeletion": "削除してもよろしいですか?",
"Copied!": "コピーしました",
"Error Fetching Session URL": "セッションURLの取得に失敗しました",
- "noResultsFound": "一致する結果が見つかりませんでした",
+ "noRunningSessionsFound": "No running sessions found",
"invalidCapType": "無効な Capability: {{type}}",
- "whitespaceDetected": "空白文字で開始または終了します"
+ "whitespaceDetected": "空白文字で開始または終了します",
+ "duplicateCapabilityNameError": "同じ名前のcapabilitiesが既に存在します",
+ "unableToImportGestureFiles": "Could not import gestures from the following files: {{fileNames}}",
+ "invalidSessionFile": "無効なセッションファイル",
+ "TV Labs API Key": "TV LabsのAPIキー",
+ "TestcribeAPIKey": "Testcribe APIキー",
+ "sessionTestcribeApiKeyDescription": "APIキーは https://app.testcribe.com/settings/apiKeys から入手できます",
+ "missingVendorProperties": "{{vendorName}} に関する以下の情報を入力してください : {{vendorProps}}",
+ "missingServerInfo": "サーバー情報がありません。セッションをクエリできませんでした",
+ "Username": "ユーザ名",
+ "URL": "URL",
+ "WebDriver URL": "WebDriver URL",
+ "API Key": "API キー",
+ "Access Key": "アクセスキー",
+ "SecurityToken": "セキュリティトークン",
+ "AccessToken": "アクセストークン",
+ "Token": "トークン",
+ "Key": "キー",
+ "Secret": "シークレット",
+ "Theme": "Theme",
+ "Light Theme": "ライトテーマ",
+ "Dark Theme": "ダークテーマ",
+ "System Theme": "システムテーマ",
+ "Search Source": "Search Source",
+ "Matching Elements": "Matching Elements",
+ "webmateApiKey": "webmate API Key",
+ "yourProjectId": "Your Project ID",
+ "webmateProjectId": "webmate Project ID",
+ "specifyWebmateHostExplicitly": "Specify webmate host explicitly",
+ "webmateHost": "webmate Host",
+ "Enable": "Enable",
+ "yourFireflinkDevicefarmDomain": "Your Fireflink DeviceFarm Domain (e.g., cloud.fireflink.com)",
+ "yourLicenseId": "Your License ID",
+ "yourProjectName": "Your Project Name",
+ "License ID": "License ID",
+ "Project Name": "Project Name",
+ "Fireflink DeviceFarm Domain": "Fireflink DeviceFarm Domain",
+ "Fireflink DeviceFarm Access Key": "Fireflink DeviceFarm Access Key",
+ "Fireflink DeviceFarm License ID": "Fireflink DeviceFarm License ID",
+ "Fireflink DeviceFarm Project Name": "Fireflink DeviceFarm Project Name",
+ "RabbitQA API Key": "RabbitQA API Key",
+ "RestartSessionMessage": "Device Connection Lost – Restarting the Session…",
+ "ToggleRestartSession": "Toggle Session Reload Upon Device Disconnect",
+ "toggleTableFormatting": "Toggle Table Formatting",
+ "copyResultToClipboard": "Copy Result to Clipboard",
+ "Property": "Property",
+ "noCapsFound": "No session capabilities found. Please use the Capability Builder to edit, add, and save your capability set. Refer to the tutorial at {{url}}",
+ "executeMethods": "Execute Methods",
+ "dynamicCommandsDescription": "Run commands supported by the currently active driver and plugin(s). Note that some commands may only work in specific contexts. Any commands not supported by WebdriverIO are not included in this list.",
+ "dynamicExecuteMethodsDescription": "Run any execute method supported by the currently active driver and plugin(s).",
+ "methodDeprecated": "This method is deprecated",
+ "App Settings": "App Settings",
+ "unableToImportSessionFiles": "Could not import sessions from the following files: {{fileNames}}",
+ "Import from File": "Import from File",
+ "useMjpegStream": "Use MJPEG Stream",
+ "useScreenshotApi": "Use Screenshot API",
+ "Box Model": "Box Model",
+ "detachFromSession": "Detach from Session",
+ "enterSessionID": "Enter session ID for attaching manually",
+ "refreshDiscoveredSessions": "Refresh Discovered Sessions",
+ "toggleMultiDisplayMode": "Toggle Multi-Display Mode"
}
diff --git a/assets/locales/kn/translation.json b/app/common/public/locales/kn/translation.json
similarity index 78%
rename from assets/locales/kn/translation.json
rename to app/common/public/locales/kn/translation.json
index 62c06aacf6..39801d6889 100644
--- a/assets/locales/kn/translation.json
+++ b/app/common/public/locales/kn/translation.json
@@ -14,7 +14,6 @@
"Zoom Out": "Zoom Out",
"Reset Zoom Level": "Reset Zoom Level",
"Close Window": "Close Window",
- "Open Session File…": "Open Session File…",
"Bring All to Front": "ಎಲ್ಲಾವನ್ನು ಮುಂದೆ ತನ್ನಿ",
"Help": "ಸಹಾಯ",
"Appium Documentation": "Appium Documentation",
@@ -41,7 +40,6 @@
"Save Server Arguments Preset": "ಸರ್ವರ್ ಆರ್ಗ್ಯುಮೆಂಟ್ಸ್ ಪ್ರಿಸೆಟ್ನ ಸಂಗ್ರಹಿಸಿ",
"Save": "ಸಂಗ್ರಹಿಸಿ",
"Cancel": "ರದ್ದು ಮಾಡಿ",
- "datetimeFormat": "MMM Do YYYY, h:mma",
"updateDetails": "ಬಿಡುಗಡೆ ದಿನಾಂಕ: {{pubDate}}\n\nಬಿಡುಗಡೆ ಕೈಪತ್ರ: {{notes}}",
"appiumIsAvailable": "Appium Inspector {{name}} is available",
"updateIsBeingDownloaded": "ನವೀಕರಣಗಳು ಡೌನ್ಲೋಡ್ ಆಗುತ್ತಿವೆ. ಡೌನ್ಲೋಡ್ ಮುಗಿದ ನಂತರ ನಿಮಗೆ ತಿಳಿಸಲಾಗುವುದು.",
@@ -68,20 +66,11 @@
"Could not start session": "ಸೆಷನ್ ಶುರು ಮಾಡಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ",
"couldNotConnect": "Could not connect to Appium server URL '{{url}}'. Please check if the server is running and the URL is correct (valid URLs can be found at the start of the Appium server log). If you are using the Inspector's browser version, ensure the server has been started with '--allow-cors'.",
"Invalid URL:": "Invalid URL:",
- "sauceCredentialsRequired": "ಸೌಸ್ ವ್ಯವಹಾರಾಂಕಿತ ಮತ್ತು ಆಕ್ಸೆಸ್ ಕೀ ಅವಶ್ಯ ಬೇಕಿದೆ!",
- "testingbotCredentialsRequired": "ಟೆಸ್ಟಿಂಗ್ ಬೋಟ್ ಕೀ ಮತ್ತು ಸೀಕ್ರೆಟ್ ಕೀ ಅವಶ್ಯ ಬೇಕಿದೆ!",
- "Perfecto SecurityToken is required": "ಪೆರ್ಫೆಕ್ಟೋ ಸೆಕ್ಯೂರಿಟಿ ಟೋಕನ್ ಅವಶ್ಯ ಬೇಕಿದೆ",
- "browserstackCredentialsRequired": "ಬ್ರೌಸರ್ಸ್ಟ್ಯಾಕ್ ವ್ಯವಹಾರಾಂಕಿತ ಮತ್ತು ಆಕ್ಸೆಸ್ ಕೀ ಅವಶ್ಯ ಬೇಕಿದೆ!",
- "lambdatestCredentialsRequired": "Lambdatest username and access key are required!",
- "bitbarCredentialsRequired": "ಬಿಟ್ಬಾರ್ API ಕೀ ಅವಶ್ಯ ಬೇಕಿದೆ!",
- "kobitonCredentialsRequired": "ಕೋಬಿಟೋನ್ ವ್ಯವಹಾರಾಂಕಿತ ಮತ್ತು API ಕೀ ಅವಶ್ಯ ಬೇಕಿದೆ!",
- "experitestAccessKeyURLRequired": "Experitest AccessKey and URL are required",
"experitestAccessKey": "Experitest AccessKey",
"experitestUrl": "Experitest Url",
"locatorStrategy": "ಲೊಕೇಟರ್ ಸ್ಟ್ರಾಟೆಜಿ:",
"selector": "ಸೆಲೆಕ್ಟರ್:",
"couldNotObtainScreenshot": "ಸ್ಕ್ರೀನ್ ಶಾಟ್ ಪಡೆಯಲಾಗಲಿಲ್ಲ: {{screenshotError}}",
- "selectElementInSource": "ಶುರು ಮಾಡಲಿಕ್ಕೆ ಸೌರ್ಸ್ನಲ್ಲಿರುವ ಎಲಿಮೆಂಟ್ನ ಆಯ್ಕೆ ಮಾಡಿ.",
"Press Home Button": "Press Home Button",
"Execute Siri Command": "Execute Siri Command",
"Press Back Button": "Press Back Button",
@@ -100,11 +89,11 @@
"Pause Recording": "ರೆಕಾರ್ಡಿಂಗ್ನನ್ನು ವಿರಾಮಿಸಿ",
"Search for element": "ಈ ಎಲಿಮೆಂಟ್ನನ್ನು ಹುಡುಕಿ",
"App Source": "App Source",
+ "Collapse All": "Collapse All",
"Toggle Attributes": "Toggle Attributes",
"Copy XML Source to Clipboard": "XML ಸೋರ್ಸ್ನನ್ನು ಕ್ಲಿಪ್ಬೋರ್ಡ್ಗೆ ನಕಲು ಮಾಡಿ",
"Download Source as .XML File": "Download Source as .XML File",
"Copy Attributes to Clipboard": "ಅಟ್ರಿಬ್ಯೂಟ್ಸ್ನನ್ನು ಕ್ಲಿಪ್ಬೋರ್ಡ್ಗೆ ನಕಲು ಮಾಡಿ",
- "quitSessionAndClose": "ಇನ್ಸ್ಪೆಕ್ಟರ್ನನ್ನು ಮುಚ್ಚಿ ಸೆಷನ್ನಿಂದ ನಿರ್ಗಮಿಸಿ",
"Session Inactive": "ಸೆಷನ್ ನಿಷ್ಕ್ರಿಯವಾಗಿದೆ",
"Keep Session Running": "ಸೆಷನ್ನನ್ನು ಚಾಲ್ತಿಯಲ್ಲಿಡಿ",
"Quit Session": "ಸೆಷನ್ನನ್ನು ನಿರ್ಗಮಿಸಿ",
@@ -132,8 +121,9 @@
"usingXPathNotRecommended": "XPath ಲೋಕೆಟರ್ಸ್ ಬಳಸಬೇಕು ಎಂಬುದು ನಮ್ಮ ಸಲಹೆಯಲ್ಲ ಹಾಗು ಇದು ಟೆಸ್ಟ್ನನ್ನ ಅಸ್ಥಿರ ಮಾಡಬಹುದು. ಅನುಪಮವಾದ ಅಕ್ಸೆಸೆಸಿಬಿಲಿಟಿ ಲೋಕೆಟರ್ಸ್ನನ್ನು ನಿಮ್ಮ ಡೆವಲಪ್ಮೆಂಟ್ ತಂಡದಿಂದ ಕೇಳಿ ಪಡೆದು ಬಳಸಿ!",
"noAdditionalContextsFound": "No additional contexts have been detected",
"contextDropdownInfo": "Multiple contexts detected; certain elements might only be accessible after switching to a different context. Note that webview inspection in Appium Inspector is less accurate than the DevTools of Chrome or Safari. For more information, see:",
- "idAutocompletionCanBeDisabled": "The requested id selector does not have a package name prefix. This Appium session has package name autocompletion enabled, which may be the reason why no elements were found. To disable this behavior, relaunch this session with the capability 'appium:disableIdLocatorAutocompletion' set to 'true'.",
+ "idAutocompletionCanBeDisabled": "The requested id selector does not have a package name prefix. This Appium session has package name autocompletion enabled, which may be the reason why no elements were found. To disable this behavior, change the 'disableIdLocatorAutocompletion' setting to 'true'.",
"missingAutomationNameForStrategies": "Additional locator strategies may be available. To view them, add the capability 'appium:automationName' when launching the session. Note that this capability is mandatory in Appium 2.",
+ "snapshotMaxDepthReached": "This element is located at the maximum source depth {{selectedElementDepth}}, therefore its child elements (if any) are not shown. To reveal them, change the 'snapshotMaxDepth' setting to a value greater than {{selectedElementDepth}}. Check your driver documentation for the maximum supported value.",
"Tap": "ಟ್ಯಾಪ್",
"Gathering initial app source…": "ಅಪ್ಪ್ ಆರಂಭಿಕ ಮೂಲವನ್ನು ಸಂಗ್ರಹಿಸಲಾಗುತ್ತಿದೆ…",
"couldNotObtainSource": "ಮೂಲ ವಿವರವನ್ನು ಪಡೆಯಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ {{errorMsg}}",
@@ -161,15 +151,14 @@
"boolean": "ಬೂಲಿಯನ್",
"number": "ನಂಬರ್",
"JSON object": "JSON ಆಬ್ಜೆಕ್ಟ್",
- "filepath": "ಫೈಲ್ ಪಥ್",
"connectToExistingSessionInstructions": "ನಿಮ್ಮ ಬಳಿ ಮೇಲೆ ಆಯ್ಕೆಯಾದ ಸರ್ವರ್ನ ಚಾಲ್ತಿಯಲ್ಲಿರುವ ಸೆಷನ್ ಇದ್ದಾರೆ, ಅದಕ್ಕೆ ಇನ್ಸ್ಪೆಕ್ಟರ್ನ ನೀವು ಲಗತ್ತಿಸಬಹುದು.",
- "selectSessionIDInDropdown": "ಸೆಷನ್ ಸಂಖ್ಯೆಯನ್ನು ಡ್ರಾಪ್ ಡೌನ್ ಬಾಕ್ಸ್ನಿಂದ ಆಯ್ಕೆ ಮಾಡಿ.",
+ "selectSessionID": "You can manually enter your session ID, or, if the server supports session discovery, simply select from a list of active sessions.",
"allowUnauthorizedCerts": "ಅನಧಿಕೃತ ಸರ್ಟಿಫೀಕೆಟ್ಸ್ನನ್ನು ಅನುಮತಿಸಿ",
"Use Proxy": "ಪ್ರೋಕ್ಸಿ ಬಳಸಿ",
"JSON Representation": "JSON Representation",
"Capability Builder": "Capability Builder",
"Saved Capability Sets": "Saved Capability Sets",
- "Attach to Session": "ಈ ಸರ್ವರ್ ಸೆಷನ್ಗೆ ಲಗತ್ತಿಸಿ…",
+ "Attach": "Attach",
"localhost": "ಲೋಕಲ್ ಹೋಸ್ಟ್",
"Host": "ಹೋಸ್ಟ್",
"Port": "ಪೋರ್ಟ್",
@@ -195,16 +184,19 @@
"Remote Path": "ರಿಮೋಟ್ ವಿಳಾಸ ಪಥ",
"BrowserStack Username": "ಬ್ರೌಸರ್ಸ್ಟ್ಯಾಕ್ ಯೂಸರ್ ನೇಮ್",
"BrowserStack Access Key": "ಬ್ರೌಸರ್ಸ್ಟ್ಯಾಕ್ ಪ್ರವೇಶ ಕೀ",
- "LambdaTest Username": "LambdaTest Username",
- "LambdaTest Access Key": "LambdaTest Access Key",
+ "TestMu AI Username": "TestMu AI Username",
+ "TestMu AI Access Key": "TestMu AI Access Key",
"Bitbar API Key": "ಬಿಟ್ಬಾರ್ API ಕೀ",
"RemoteTestKit AccessToken": "RemoteTestKit AccessToken",
"RobotQA Token": "RobotQA Token",
+ "RobotActions Host": "RobotActions Host",
+ "RobotActions Token": "RobotActions Token",
+ "Add": "Add",
"Name": "ಹೆಸರು",
"Description": "Description",
"Created": "Created",
"Actions": "Actions",
- "enterYourSessionId": "ನಿಮ್ಮ ಸೆಷನ್ ID ಇಲ್ಲಿ ಬರೆಯಿರಿ",
+ "searchSessions": "Search discovered sessions",
"Proxy URL": "ಪ್ರೋಕ್ಸಿ URL",
"Source": "ಸೌರ್ಸ್",
"Commands": "Commands",
@@ -212,12 +204,14 @@
"Gestures": "Gestures",
"Gesture Builder": "Gesture Builder",
"Saved Gestures": "Saved Gestures",
+ "Create New Gesture": "Create New Gesture",
"gesturesDescription": "Create, save, and execute custom gestures here. Gestures are identical to action chains in the W3C WebDriver Actions API.",
"Session Information": "Session Information",
"Execute Command": "Execute Command",
"commandsDescription": "Run various commands using the current Appium driver. Note that not all drivers support all commands.",
- "Click to Set Coordinates": "Click to Set Coordinates",
- "Set Coordinates Via Field": "Set Coordinates Via Field",
+ "showMoveActionCoordsInPercentage": "Show Coordinates of Move Actions in Screen Dimension Percentages",
+ "showMoveActionCoordsInPixels": "Show Coordinates of Move Actions in Pixels",
+ "toggleMoveActionCoordPicker": "Toggle Setting Coordinates via Clicking on Screenshot",
"Action Type": "Action Type",
"Pointer Up": "Pointer Up",
"Pointer Down": "Pointer Down",
@@ -234,29 +228,23 @@
"Left": "Left",
"Right": "Right",
"Play": "Play",
+ "Export to File": "Export to File",
"Save Capability Set As": "ಕ್ಯಾಪೆಬಿಲಿಟಿ ಸೆಟ್ನನ್ನ ಈ ಹೆಸರಲಿ ಸಂಗ್ರಹಿಸಿ…",
"Edit Raw JSON": "ಮೂಲ JSON ತಿದ್ದಿರಿ",
- "Enter Parameters for:": "Enter Parameters for:",
+ "enterMethodParameters": "Enter Parameters for: '{{methodName}}'",
"invalidJson": "Invalid JSON",
- "Execute Script": "Execute Script",
"App Management": "App Management",
- "Clipboard": "ಕ್ಲಿಪ್ಬೋರ್ಡ್",
"File Transfer": "File Transfer",
"Device Interaction": "Device Interaction",
- "Keyboard": "Keyboard",
- "Connectivity": "Connectivity",
- "Performance Data": "ಪರ್ಫಾರ್ಮೆನ್ಸ್ ಡಾಟಾ",
- "System": "ಸಿಸ್ಟಮ್",
"Session": "ಸೆಷನ್",
"Web": "Web",
"Context": "Context",
- "Window (W3C)": "Window (W3C)",
"simulatorOnly": "Emulator/simulator only",
"minAndroidSDK": "Minimum Android SDK level",
"Error": "ಎರರ್",
"findingElementInSourceFailed": "Could not find the specified element. The current application source or element ID may have changed, or there may be too many elements with the same coordinates.",
"callToMethodFailed": "ಈ ಮೆಥಡ್ಗೆ '{{methodName}}' ಕರೆ ವಿಫಲವಾಗಿದೆ",
- "methodCallResult": "'{{methodName}}' ಫಲಿತಾಂಶ",
+ "methodCallResult": "Result for: '{{methodName}}' (type: {{resultType}})",
"TestingBot Key": "ಟೆಸ್ಟಿಂಗ್ ಬೋಟ್ ಕೀ",
"TestingBot Secret": "ಟೆಸ್ಟಿಂಗ್ ಬೋಟ್ ಸೀಕ್ರೆಟ್",
"Appium Server": "Appium Server",
@@ -269,17 +257,75 @@
"Mobitru WebDriver URL": "Mobitru WebDriver URL",
"Mobitru Billing Unit": "Mobitru Billing Unit",
"Mobitru Access Key": "Mobitru Access Key",
- "mobitruCredentialsRequired": "Mobitru Access Key is required",
"Session URL": "Session URL",
"Server Details": "Server Details",
"Session Length": "Session Length",
"Session Details": "Session Details",
"Currently Active App ID": "Currently Active App ID",
- "Session ID": "Session ID",
"confirmDeletion": "Are you sure you want to delete this?",
"Copied!": "Copied!",
"Error Fetching Session URL": "Error Fetching Session URL",
- "noResultsFound": "No results found",
+ "noRunningSessionsFound": "No running sessions found",
"invalidCapType": "Invalid capability type: {{type}}",
- "whitespaceDetected": "Text Starts and/or Ends With Whitespace"
+ "whitespaceDetected": "Text Starts and/or Ends With Whitespace",
+ "duplicateCapabilityNameError": "A capability set with the same name already exists",
+ "unableToImportGestureFiles": "Could not import gestures from the following files: {{fileNames}}",
+ "invalidSessionFile": "Invalid session file",
+ "TV Labs API Key": "TV Labs API Key",
+ "TestcribeAPIKey": "Testcribe API Key",
+ "sessionTestcribeApiKeyDescription": "You can get your api key from https://app.testcribe.com/settings/apiKeys",
+ "missingVendorProperties": "Please provide the following server details for {{vendorName}}: {{vendorProps}}",
+ "missingServerInfo": "Missing server info, could not query sessions",
+ "Username": "Username",
+ "URL": "URL",
+ "WebDriver URL": "WebDriver URL",
+ "API Key": "API Key",
+ "Access Key": "Access Key",
+ "SecurityToken": "SecurityToken",
+ "AccessToken": "AccessToken",
+ "Token": "Token",
+ "Key": "Key",
+ "Secret": "Secret",
+ "Theme": "Theme",
+ "Light Theme": "Light Theme",
+ "Dark Theme": "Dark Theme",
+ "System Theme": "System Theme",
+ "Search Source": "Search Source",
+ "Matching Elements": "Matching Elements",
+ "webmateApiKey": "webmate API Key",
+ "yourProjectId": "Your Project ID",
+ "webmateProjectId": "webmate Project ID",
+ "specifyWebmateHostExplicitly": "Specify webmate host explicitly",
+ "webmateHost": "webmate Host",
+ "Enable": "Enable",
+ "yourFireflinkDevicefarmDomain": "Your Fireflink DeviceFarm Domain (e.g., cloud.fireflink.com)",
+ "yourLicenseId": "Your License ID",
+ "yourProjectName": "Your Project Name",
+ "License ID": "License ID",
+ "Project Name": "Project Name",
+ "Fireflink DeviceFarm Domain": "Fireflink DeviceFarm Domain",
+ "Fireflink DeviceFarm Access Key": "Fireflink DeviceFarm Access Key",
+ "Fireflink DeviceFarm License ID": "Fireflink DeviceFarm License ID",
+ "Fireflink DeviceFarm Project Name": "Fireflink DeviceFarm Project Name",
+ "RabbitQA API Key": "RabbitQA API Key",
+ "RestartSessionMessage": "Device Connection Lost – Restarting the Session…",
+ "ToggleRestartSession": "Toggle Session Reload Upon Device Disconnect",
+ "toggleTableFormatting": "Toggle Table Formatting",
+ "copyResultToClipboard": "Copy Result to Clipboard",
+ "Property": "Property",
+ "noCapsFound": "No session capabilities found. Please use the Capability Builder to edit, add, and save your capability set. Refer to the tutorial at {{url}}",
+ "executeMethods": "Execute Methods",
+ "dynamicCommandsDescription": "Run commands supported by the currently active driver and plugin(s). Note that some commands may only work in specific contexts. Any commands not supported by WebdriverIO are not included in this list.",
+ "dynamicExecuteMethodsDescription": "Run any execute method supported by the currently active driver and plugin(s).",
+ "methodDeprecated": "This method is deprecated",
+ "App Settings": "App Settings",
+ "unableToImportSessionFiles": "Could not import sessions from the following files: {{fileNames}}",
+ "Import from File": "Import from File",
+ "useMjpegStream": "Use MJPEG Stream",
+ "useScreenshotApi": "Use Screenshot API",
+ "Box Model": "Box Model",
+ "detachFromSession": "Detach from Session",
+ "enterSessionID": "Enter session ID for attaching manually",
+ "refreshDiscoveredSessions": "Refresh Discovered Sessions",
+ "toggleMultiDisplayMode": "Toggle Multi-Display Mode"
}
diff --git a/app/common/public/locales/ko/translation.json b/app/common/public/locales/ko/translation.json
new file mode 100644
index 0000000000..af239b53c7
--- /dev/null
+++ b/app/common/public/locales/ko/translation.json
@@ -0,0 +1,331 @@
+{
+ "appiumInspector": "Appium Inspector",
+ "Edit": "변경",
+ "Redo": "재실행",
+ "Cut": "자르기",
+ "Copy": "복사",
+ "Paste": "붙여넣기",
+ "Delete": "삭제",
+ "Select All": "전체 선택",
+ "Window": "윈도우",
+ "Minimize": "축소하기",
+ "Zoom": "줌",
+ "Zoom In": "줌 인",
+ "Zoom Out": "줌 아웃",
+ "Reset Zoom Level": "줌 레벨 리셋",
+ "Close Window": "창 닫기",
+ "Bring All to Front": "모두 전면으로 가져오기",
+ "Help": "도움",
+ "Appium Documentation": "Appium 문서",
+ "Inspector Documentation": "Inspector 문서",
+ "Appium Discussion Forum": "Appium 토론 포럼",
+ "Report Issues": "문제 신고",
+ "About Appium Inspector": "Appium Inspector 대해",
+ "showAppInfo": "App Version: {{appVersion}}\nElectron: {{electronVersion}}\nNode.js: {{nodejsVersion}}\n",
+ "Improve Translations": "번역 개선",
+ "Check for Updates…": "업데이트 확인",
+ "File": "파일",
+ "New Window": "새 창 열기",
+ "Hide Appium Inspector": "Appium Inspector 숨기기",
+ "Hide Others": "다른 프로그램 숨기기",
+ "Show All": "모두 보이기",
+ "Quit Appium Inspector": "Appium Inspector 닫기",
+ "Toggle Full Screen": "풀 스크린",
+ "Languages": "언어",
+ "View": "보기",
+ "Reload": "새로 고침",
+ "Toggle Developer Tools": "Developer Tools 열기",
+ "Undo": "실행 취소",
+ "Restart Now": "지금 재시작하기",
+ "Save Server Arguments Preset": "서버 인수 프리셋 저장",
+ "Save": "저장",
+ "Cancel": "취소",
+ "updateDetails": "출시일: {{pubDate}}\n\n릴리즈 정보: {{notes}}",
+ "appiumIsAvailable": "Appium Inspector {{name}} 사용이 가능합니다",
+ "updateIsBeingDownloaded": "업데이트를 다운로드 중 입니다. 다운로드가 완료되면 다시 알려드립니다.",
+ "updateIsDownloaded": "Appium Inspector {{releaseName}} 다운로드가 완료되었습니다. 업데이트를 적용하려면 다시 시작해야합니다. (참고 : Appium Inspector을 설치하고 다시 시작하는 데 몇 분 정도 걸릴 수 있습니다.)",
+ "updateDownloadFailed": "업데이트 다운로드에 실패했습니다. 이유: {{message}}",
+ "OK": "OK",
+ "Install Now": "지금 설치하기",
+ "Install Later": "나중에 설치하기",
+ "Update Download Started": "업데이트 다운로드 시작",
+ "No update available": "다운로드가 가능한 업데이트가 없습니다",
+ "Appium Inspector is up-to-date": "최신 버전의 Appium Inspector를 사용중입니다",
+ "Later": "나중에",
+ "Update Downloaded": "업데이트 다운로드",
+ "Could not download update": "업데이트를 다운로드 할 수 없습니다",
+ "Unexpected Error:": "예기치 않은 오류",
+ "Please report this issue at:": "이 문제를 신고해 주세요:",
+ "Full error trace:": "전체 오류 추적:",
+ "Copy Error Trace": "오류 추척 복사",
+ "Inspect element": "Element 점검",
+ "Session closed due to inactivity": "비활성으로 인해 세션이 닫혔습니다",
+ "Session has been terminated": "세션이 종료되었습니다",
+ "frameworkNotSupported": "'{{framework}}' 프레임워크는 지원되지 않습니다",
+ "findElementFailure": "'{{methodName}}'에 대한 element를 찾지 못했습니다. 페이지를 새로고침하고 다시 시도해보세요.",
+ "Could not start session": "세션을 시작할 수 없습니다",
+ "couldNotConnect": "Appium 서버 URL '{{url}}'에 연결할 수 없습니다. 서버가 실행 중이고 URL이 올바른지 확인해 주세요(유효한 URL은 Appium 서버 로그 시작 시 확인할 수 있습니다). 인스펙터의 브라우저 버전을 사용하는 경우, 서버가 '--allow-cors'로 시작되었는지 확인하세요.",
+ "Invalid URL:": "잘못된 URL:",
+ "experitestAccessKey": "Experitest AccessKey",
+ "experitestUrl": "Experitest Url",
+ "locatorStrategy": "Locator Strategy:",
+ "selector": "Selector:",
+ "couldNotObtainScreenshot": "스크린샷을 가져올 수 없습니다: {{screenshotError}}",
+ "Press Home Button": "홈 버튼 누르기",
+ "Execute Siri Command": "Siri 명령 실행",
+ "Press Back Button": "이전 버튼 누르기",
+ "Press App Switch Button": "앱 전환 버튼 누르기",
+ "Command": "커맨드",
+ "Show Element Handles": "요소 핸들 표시",
+ "Hide Element Handles": "요소 핸들 숨기기",
+ "Select Elements": "Element 선택하기",
+ "Tap/Swipe By Coordinates": "좌표별 탭/스와이프",
+ "Download Screenshot": "스크린샷 다운로드",
+ "Back": "뒤로가기",
+ "Start Refreshing Source": "소스 새로고침 시작",
+ "Pause Refreshing Source": "소스 새로고침 중지",
+ "refreshSource": "소스 & 스크린샷 새로고침",
+ "Start Recording": "녹화 시작하기",
+ "Pause Recording": "녹화 일시정지",
+ "Search for element": "Element 검색하기",
+ "App Source": "앱 소스",
+ "Collapse All": "모두 접기",
+ "Toggle Attributes": "토글 속성",
+ "Copy XML Source to Clipboard": "XML Source 클립보드에 복사",
+ "Download Source as .XML File": " .XML File로 다운로드",
+ "Copy Attributes to Clipboard": "Attributes 클립보드애 복사하기",
+ "Session Inactive": "세션 비활성",
+ "Keep Session Running": "실행중인 세션 유지",
+ "Quit Session": "세션 종료",
+ "Your session is about to expire": "세션이 곧 만료됩니다",
+ "Enter Keys to Send": "전송할 키 입력",
+ "Find and Select in Source": "소스 찾기 및 선택",
+ "Clear": "Clear",
+ "Send Keys": "Send Keys",
+ "Done": "완료",
+ "Search": "검색",
+ "Show/Hide Boilerplate Code": "Boilerplate Code 보이기/숨기기",
+ "Copy code to clipboard": "Code 클립보드에 복사",
+ "Start this Kind of Session with Code": "이 유형의 세션을 코드로 시작",
+ "Clear Actions": "Clear Actions",
+ "Close Recorder": "Recorder 닫기",
+ "enableRecordingAndPerformActions": "애플리케이션 헤더에서 녹화를 활성화한 뒤, 여기 코드가 표시되도록 몇 가지 동작을 수행하세요",
+ "Recorder": "Recorder",
+ "Attribute": "속성",
+ "Value": "값",
+ "Find By": "Find By",
+ "Selector": "Selector",
+ "Time": "시간 (ms)",
+ "Get Timing": "타이밍 확인하기",
+ "interactionsNotAvailable": "이 요소와의 상호작용을 사용할 수 없을 수 있습니다.",
+ "usingXPathNotRecommended": "XPath 로케이터를 사용하는 것은 권장하지 않으며, 불안정한 테스트로 이어질 수 있습니다. Accessibility 로케이터를 제공하도록 개발 팀에 요청하세요!",
+ "noAdditionalContextsFound": "추가 컨텍스트가 감지되지 않았습니다",
+ "contextDropdownInfo": "여러 컨텍스트가 감지되었습니다. 일부 요소는 다른 컨텍스트로 전환한 후에만 접근할 수 있습니다. Appium Inspector에서의 웹뷰 검사는 Chrome 또는 Safari의 DevTools보다 정확도가 떨어질 수 있습니다. 자세한 내용은 아래를 참조하세요:",
+ "idAutocompletionCanBeDisabled": "요청한 ID 셀렉터에는 패키지 이름 접두사가 없습니다. 이 Appium 세션에서는 패키지 이름 자동 완성 기능이 활성화되어 있어, 이 때문에 요소를 찾지 못했을 수 있습니다. 이 동작을 비활성화하려면 'disableIdLocatorAutocompletion' 설정을 'true'로 변경하세요",
+ "missingAutomationNameForStrategies": "추가 로케이터 전략을 사용할 수 있습니다. 이러한 전략을 보려면 세션을 시작할 때 'appium:automationName' 기능(capability)을 추가하세요. 이 기능은 Appium 2에서 필수입니다",
+ "snapshotMaxDepthReached": "이 요소는 소스 트리의 최대 깊이 {{selectedElementDepth}}에 위치해 있어, 자식 요소(있는 경우)는 표시되지 않습니다. 자식 요소를 보려면 'snapshotMaxDepth' 설정 값을 {{selectedElementDepth}}보다 크게 변경하세요. 설정 가능한 최대 값은 사용하는 드라이버의 문서를 참고하세요.",
+ "Tap": "탭",
+ "Gathering initial app source…": "초기 어플리케이션 소스 수집중…",
+ "couldNotObtainSource": "소스를 얻을 수 없습니다: {{errorMsg}}",
+ "iOS": "iOS",
+ "Android": "Android",
+ "desiredCapabilitiesDocumentation": "Capabilities 문서",
+ "startSession": "세션 시작하기",
+ "saveAs": "새로 저장하기",
+ "attachToSession": "세션에 연결하기",
+ "selectedElement": "선택된 Element",
+ "unnamed": "(이름없음)",
+ "No Description": "설명 없음",
+ "couldNotFindEntryWithId": "ID {{id}}에 해당하는 항목을 찾을 수 없습니다",
+ "couldNotFindAnyElements": "어떠한 element도 찾을 수 없습니다",
+ "elementsCount": "요소 찾기",
+ "xCoordinate": "X: {{x}}",
+ "yCoordinate": "Y: {{y}}",
+ "SauceLabs Data Center": "SauceLabs 데이터 센터",
+ "US-West": "US West 1",
+ "US-East": "US East 4",
+ "EU-Central": "EU Central 1",
+ "proxyThroughSC": "Sauce Connect의 Selenium Relay를 통한 프록시",
+ "SSL": "SSL",
+ "text": "text",
+ "boolean": "boolean",
+ "number": "number",
+ "JSON object": "JSON object",
+ "connectToExistingSessionInstructions": "위의 서버 유형에 대해 이미 실행중인 세션이있는 경우, Inspector에 직접 연결 할 수 있습니다.",
+ "selectSessionID": "You can manually enter your session ID, or, if the server supports session discovery, simply select from a list of active sessions.",
+ "allowUnauthorizedCerts": "승인되지 않은 인증서 허용",
+ "Use Proxy": "Proxy 사용",
+ "JSON Representation": "JSON 표현",
+ "Capability Builder": "Capability 빌더",
+ "Saved Capability Sets": "저장된 Capability 세트",
+ "Attach": "Attach",
+ "localhost": "localhost",
+ "Host": "호스트",
+ "Port": "포트",
+ "usingDataFoundIn": "{{environmentVariable}}에서 발견된 데이터 사용",
+ "yourUsername": "사용자 이름",
+ "Sauce Username": "Sauce 사용자 이름",
+ "Sauce Access Key": "Sauce 엑세스 키",
+ "yourAccessKey": "Your 엑세스 키",
+ "yourApiKey": "Your API 키",
+ "Perfecto Host": "Perfecto 호스트",
+ "Perfecto Port": "Perfecto 포트",
+ "Pcloudy User Name": "Pcloudy 사용자 이름",
+ "Pcloudy Host": "Pcloudy 호스트",
+ "Pcloudy API Key": "Pcloudy API 키",
+ "Add your token": "토큰을 추가하세요",
+ "Perfecto Token": "Perfecto 토큰",
+ "Your Kobiton Username": "Kobiton 사용자 이름",
+ "Kobiton Access Key": "Kobiton 엑세스 키",
+ "serverTabHeasdpinWebDriverURL": "HeadSpin Web Driver URL",
+ "sessionHeadspinWebDriverURLDescription": "자동화 구성 경로를 사용하여 HeadSpin UI 또는 HeadSpin API에서 URL 가져오기",
+ "Remote Host": "원격 호스트",
+ "Remote Port": "원격 포트",
+ "Remote Path": "원격 경로",
+ "BrowserStack Username": "BrowserStack 사용자 이름",
+ "BrowserStack Access Key": "BrowserStack 엑세스 키",
+ "TestMu AI Username": "TestMu AI Username",
+ "TestMu AI Access Key": "TestMu AI Access Key",
+ "Bitbar API Key": "Bitbar API 키",
+ "RemoteTestKit AccessToken": "RemoteTestKit 액세스 토큰",
+ "RobotQA Token": "RobotQA 토큰",
+ "RobotActions Host": "RobotActions Host",
+ "RobotActions Token": "RobotActions Token",
+ "Add": "추가",
+ "Name": "이름",
+ "Description": "설명",
+ "Created": "생성",
+ "Actions": "액션",
+ "searchSessions": "Search discovered sessions",
+ "Proxy URL": "프록시 URL",
+ "Source": "소스",
+ "Commands": "커맨드",
+ "Execute Commands": "커맨드 실행",
+ "Gestures": "제스처",
+ "Gesture Builder": "제스처 빌더",
+ "Saved Gestures": "제스처 저장",
+ "Create New Gesture": "새 제스처 만들기",
+ "gesturesDescription": "여기에서 사용자 정의 제스처를 생성·저장하고 실행할 수 있습니다. 제스처는 W3C WebDriver Actions API의 액션 체인과 동일합니다",
+ "Session Information": "세션 정보",
+ "Execute Command": "커맨드 실행",
+ "commandsDescription": "현재 Appium 드라이버를 사용해 다양한 명령을 실행할 수 있습니다. 모든 드라이버가 모든 명령을 지원하는 것은 아니라는 점에 유의하세요.",
+ "showMoveActionCoordsInPercentage": "이동 동작의 좌표를 화면 크기 대비 백분율로 표시",
+ "showMoveActionCoordsInPixels": "이동 동작의 좌표를 픽셀 단위로 표시",
+ "toggleMoveActionCoordPicker": "스크린샷 클릭으로 좌표 설정 기능을 켜기/끄기",
+ "Action Type": "액션 타입",
+ "Pointer Up": "포인터 위로",
+ "Pointer Down": "포인터 아래로",
+ "Pause": "일시정지",
+ "Move": "이동",
+ "Action Type Not Defined": "액션 타입이 정의되지 않음",
+ "Duration": "지속시간",
+ "Button": "버튼",
+ "Untitled Gesture": "이름없는 제스처",
+ "Add Description": "설명 추가",
+ "Gesture saved": "제스처 저장됨",
+ "Gesture saved as": " '{{gestureName}}'로 제스처 저장됨",
+ "Duplicate pointer names are not allowed": "포인터 이름이 중복될 수 없습니다",
+ "Left": "왼쪽",
+ "Right": "오른쪽",
+ "Play": "플레이",
+ "Export to File": "Export to File",
+ "Save Capability Set As": "Capability 셋 새로 저장하기",
+ "Edit Raw JSON": "Raw JSON 변경",
+ "enterMethodParameters": "Enter Parameters for: '{{methodName}}'",
+ "invalidJson": "잘못된 JSON",
+ "App Management": "앱 관리",
+ "File Transfer": "파일 전송",
+ "Device Interaction": "디바이스 상호작용",
+ "Session": "세션",
+ "Web": "웹",
+ "Context": "컨텍스트",
+ "simulatorOnly": "에뮬레이터/시뮬레이터 전용",
+ "minAndroidSDK": "최소 Android SDK 레벨",
+ "Error": "에러",
+ "findingElementInSourceFailed": "지정된 요소를 찾을 수 없습니다. 현재 애플리케이션 소스나 요소 ID가 변경되었거나, 동일 좌표에 여러 요소가 존재할 수 있습니다.",
+ "callToMethodFailed": "'{{methodName}}' 호출에 실패했습니다",
+ "methodCallResult": "Result for: '{{methodName}}' (type: {{resultType}})",
+ "TestingBot Key": "TestingBot 키",
+ "TestingBot Secret": "TestingBot 시크릿",
+ "Appium Server": "Appium 서버",
+ "Select Cloud Providers": "클라우스 서비스 선택",
+ "Advanced Settings": "고급 설정",
+ "Native App Mode": "Native App 모드",
+ "Web/Hybrid App Mode": "Web/Hybrid App 모드",
+ "autoAddPrefixes": "시작 시 필요한 Appium 벤더 프리픽스를 자동으로 추가",
+ "attachSessionNotRunning": "제공된 서버에서 세션 {{attachSessId}}가 실행 중인지 확인할 수 없습니다. 다시 세션에 연결하기 전에 정보를 확인해 주세요.",
+ "Mobitru WebDriver URL": "Mobitru WebDriver 주소",
+ "Mobitru Billing Unit": "Mobitru 요금 단위",
+ "Mobitru Access Key": "Mobitru 엑세스 키",
+ "Session URL": "세션 URL",
+ "Server Details": "서버 세부 정보",
+ "Session Length": "세션 길이",
+ "Session Details": "세션 세부 정보",
+ "Currently Active App ID": "현재 활성화된 앱 ID",
+ "confirmDeletion": "정말 이 항목을 삭제하시겠습니까?",
+ "Copied!": "복사됨!",
+ "Error Fetching Session URL": "세션 URL 조회 오류",
+ "noRunningSessionsFound": "No running sessions found",
+ "invalidCapType": "유효하지 않은 capability 타입: {{type}}",
+ "whitespaceDetected": "텍스트의 시작 또는 끝에 공백이 있습니다.",
+ "duplicateCapabilityNameError": "같은 이름의 capability 세트가 이미 존재합니다.",
+ "unableToImportGestureFiles": "Could not import gestures from the following files: {{fileNames}}",
+ "invalidSessionFile": "잘못된 세션 파일",
+ "TV Labs API Key": "TV Labs API 키",
+ "TestcribeAPIKey": "Testcribe API 키",
+ "sessionTestcribeApiKeyDescription": "API 키는 https://app.testcribe.com/settings/apiKeys에서 확인할 수 있습니다",
+ "missingVendorProperties": "{{vendorName}}의 서버 정보를 다음과 같이 입력해 주세요: {{vendorProps}}",
+ "missingServerInfo": "서버 정보가 누락되어 세션을 조회할 수 없습니다",
+ "Username": "사용자 이름",
+ "URL": "URL",
+ "WebDriver URL": "WebDriver URL",
+ "API Key": "API Key",
+ "Access Key": "액세스 키",
+ "SecurityToken": "보안 토큰",
+ "AccessToken": "액세스 토큰",
+ "Token": "토큰",
+ "Key": "키",
+ "Secret": "시크릿",
+ "Theme": "Theme",
+ "Light Theme": "라이트 테마",
+ "Dark Theme": "다크 테마",
+ "System Theme": "시스템 테마",
+ "Search Source": "검색 소스",
+ "Matching Elements": "요소 매칭",
+ "webmateApiKey": "webmate API 키",
+ "yourProjectId": "당신의 Project ID",
+ "webmateProjectId": "webmate 프로젝트ID",
+ "specifyWebmateHostExplicitly": "webmate 호스트를 명시적으로 지정",
+ "webmateHost": "webmate 호스트",
+ "Enable": "Enable",
+ "yourFireflinkDevicefarmDomain": "당신의 Fireflink DeviceFarm 도메인 (예: cloud.fireflink.com)",
+ "yourLicenseId": "당신의 라이센스 ID",
+ "yourProjectName": "당신의 프로젝트 이름",
+ "License ID": "라이센스ID",
+ "Project Name": "프로젝트 이름",
+ "Fireflink DeviceFarm Domain": "Fireflink DeviceFarm 도메인",
+ "Fireflink DeviceFarm Access Key": "Fireflink DeviceFarm 액세스 키",
+ "Fireflink DeviceFarm License ID": "Fireflink DeviceFarm 라이센스ID",
+ "Fireflink DeviceFarm Project Name": "Fireflink DeviceFarm 프로젝트 이름",
+ "RabbitQA API Key": "RabbitQA API Key",
+ "RestartSessionMessage": "디바이스 연결이 끊어졌습니다 – 세션을 재시작합니다…",
+ "ToggleRestartSession": "디바이스 연결 해제 시 세션 리로드 토글",
+ "toggleTableFormatting": "테이블 서식 토글",
+ "copyResultToClipboard": "결과를 클립보드에 복사",
+ "Property": "속성",
+ "noCapsFound": "세션 capability 정보를 찾을 수 없습니다. Capability Builder를 사용해 capability 세트를 편집, 추가, 저장하세요. 자세한 내용은 {{url}}의 튜토리얼을 참고하세요",
+ "executeMethods": "메서드 실행",
+ "dynamicCommandsDescription": "현재 활성 드라이버 및 플러그인이 지원하는 명령어만 실행할 수 있습니다. 일부 명령어는 특정 컨텍스트에서만 동작할 수 있으니 유의하세요. WebdriverIO에서 지원하지 않는 명령어는 이 목록에 포함되어 있지 않습니다",
+ "dynamicExecuteMethodsDescription": "현재 활성화된 드라이버와 플러그인에서 지원하는 모든 execute 메서드를 실행할 수 있습니다",
+ "methodDeprecated": "이 메서드는 더 이상 권장되지 않습니다",
+ "App Settings": "App Settings",
+ "unableToImportSessionFiles": "Could not import sessions from the following files: {{fileNames}}",
+ "Import from File": "Import from File",
+ "useMjpegStream": "Use MJPEG Stream",
+ "useScreenshotApi": "Use Screenshot API",
+ "Box Model": "Box Model",
+ "detachFromSession": "Detach from Session",
+ "enterSessionID": "Enter session ID for attaching manually",
+ "refreshDiscoveredSessions": "Refresh Discovered Sessions",
+ "toggleMultiDisplayMode": "Toggle Multi-Display Mode"
+}
diff --git a/assets/locales/nl/translation.json b/app/common/public/locales/lt/translation.json
similarity index 72%
rename from assets/locales/nl/translation.json
rename to app/common/public/locales/lt/translation.json
index a0dd36cde1..9ad71e149c 100644
--- a/assets/locales/nl/translation.json
+++ b/app/common/public/locales/lt/translation.json
@@ -14,7 +14,6 @@
"Zoom Out": "Zoom Out",
"Reset Zoom Level": "Reset Zoom Level",
"Close Window": "Close Window",
- "Open Session File…": "Open Session File…",
"Bring All to Front": "Bring All to Front",
"Help": "Help",
"Appium Documentation": "Appium Documentation",
@@ -41,7 +40,6 @@
"Save Server Arguments Preset": "Save Server Arguments Preset",
"Save": "Save",
"Cancel": "Cancel",
- "datetimeFormat": "MMM Do YYYY, h:mma",
"updateDetails": "Release Date: {{pubDate}}\n\nRelease Notes: {{notes}}",
"appiumIsAvailable": "Appium Inspector {{name}} is available",
"updateIsBeingDownloaded": "Update is being downloaded now. You will be notified again when it is complete",
@@ -68,20 +66,11 @@
"Could not start session": "Could not start session",
"couldNotConnect": "Could not connect to Appium server URL '{{url}}'. Please check if the server is running and the URL is correct (valid URLs can be found at the start of the Appium server log). If you are using the Inspector's browser version, ensure the server has been started with '--allow-cors'.",
"Invalid URL:": "Invalid URL:",
- "sauceCredentialsRequired": "Sauce username and access key are required!",
- "testingbotCredentialsRequired": "TestingBot key and secret are required!",
- "Perfecto SecurityToken is required": "Perfecto SecurityToken is required",
- "browserstackCredentialsRequired": "Browserstack username and access key are required!",
- "lambdatestCredentialsRequired": "Lambdatest username and access key are required!",
- "bitbarCredentialsRequired": "Bitbar API key required!",
- "kobitonCredentialsRequired": "KOBITON username and api key are required!",
- "experitestAccessKeyURLRequired": "Experitest AccessKey and URL are required",
"experitestAccessKey": "Experitest AccessKey",
"experitestUrl": "Experitest Url",
"locatorStrategy": "Locator Strategy:",
"selector": "Selector:",
"couldNotObtainScreenshot": "Could not obtain screenshot: {{screenshotError}}",
- "selectElementInSource": "Select an element in the source to begin.",
"Press Home Button": "Press Home Button",
"Execute Siri Command": "Execute Siri Command",
"Press Back Button": "Press Back Button",
@@ -100,11 +89,11 @@
"Pause Recording": "Pause Recording",
"Search for element": "Search for element",
"App Source": "App Source",
+ "Collapse All": "Collapse All",
"Toggle Attributes": "Toggle Attributes",
"Copy XML Source to Clipboard": "Copy XML Source to Clipboard",
"Download Source as .XML File": "Download Source as .XML File",
"Copy Attributes to Clipboard": "Copy Attributes to Clipboard",
- "quitSessionAndClose": "Quit Session & Close Inspector",
"Session Inactive": "Session Inactive",
"Keep Session Running": "Keep Session Running",
"Quit Session": "Quit Session",
@@ -132,8 +121,9 @@
"usingXPathNotRecommended": "Using XPath locators is not recommended and can lead to fragile tests. Ask your development team to provide unique accessibility locators instead!",
"noAdditionalContextsFound": "No additional contexts have been detected",
"contextDropdownInfo": "Multiple contexts detected; certain elements might only be accessible after switching to a different context. Note that webview inspection in Appium Inspector is less accurate than the DevTools of Chrome or Safari. For more information, see:",
- "idAutocompletionCanBeDisabled": "The requested id selector does not have a package name prefix. This Appium session has package name autocompletion enabled, which may be the reason why no elements were found. To disable this behavior, relaunch this session with the capability 'appium:disableIdLocatorAutocompletion' set to 'true'.",
+ "idAutocompletionCanBeDisabled": "The requested id selector does not have a package name prefix. This Appium session has package name autocompletion enabled, which may be the reason why no elements were found. To disable this behavior, change the 'disableIdLocatorAutocompletion' setting to 'true'.",
"missingAutomationNameForStrategies": "Additional locator strategies may be available. To view them, add the capability 'appium:automationName' when launching the session. Note that this capability is mandatory in Appium 2.",
+ "snapshotMaxDepthReached": "This element is located at the maximum source depth {{selectedElementDepth}}, therefore its child elements (if any) are not shown. To reveal them, change the 'snapshotMaxDepth' setting to a value greater than {{selectedElementDepth}}. Check your driver documentation for the maximum supported value.",
"Tap": "Tap",
"Gathering initial app source…": "Gathering initial app source…",
"couldNotObtainSource": "Could not obtain source: {{errorMsg}}",
@@ -161,15 +151,14 @@
"boolean": "boolean",
"number": "number",
"JSON object": "JSON object",
- "filepath": "filepath",
"connectToExistingSessionInstructions": "If you have an already-running session of the above server type, you can attach an inspector to it directly.",
- "selectSessionIDInDropdown": "Select the Session ID in the dropdown below.",
+ "selectSessionID": "You can manually enter your session ID, or, if the server supports session discovery, simply select from a list of active sessions.",
"allowUnauthorizedCerts": "Allow Unauthorized Certificates",
"Use Proxy": "Use Proxy",
"JSON Representation": "JSON Representation",
"Capability Builder": "Capability Builder",
"Saved Capability Sets": "Saved Capability Sets",
- "Attach to Session": "Attach to Session…",
+ "Attach": "Attach",
"localhost": "localhost",
"Host": "Host",
"Port": "Port",
@@ -195,16 +184,19 @@
"Remote Path": "Remote Path",
"BrowserStack Username": "BrowserStack Username",
"BrowserStack Access Key": "BrowserStack Access Key",
- "LambdaTest Username": "LambdaTest Username",
- "LambdaTest Access Key": "LambdaTest Access Key",
+ "TestMu AI Username": "TestMu AI Username",
+ "TestMu AI Access Key": "TestMu AI Access Key",
"Bitbar API Key": "Bitbar API Key",
"RemoteTestKit AccessToken": "RemoteTestKit AccessToken",
"RobotQA Token": "RobotQA Token",
+ "RobotActions Host": "RobotActions Host",
+ "RobotActions Token": "RobotActions Token",
+ "Add": "Add",
"Name": "Name",
"Description": "Description",
"Created": "Created",
"Actions": "Actions",
- "enterYourSessionId": "Enter your session ID here",
+ "searchSessions": "Search discovered sessions",
"Proxy URL": "Proxy URL",
"Source": "Source",
"Commands": "Commands",
@@ -212,12 +204,14 @@
"Gestures": "Gestures",
"Gesture Builder": "Gesture Builder",
"Saved Gestures": "Saved Gestures",
+ "Create New Gesture": "Create New Gesture",
"gesturesDescription": "Create, save, and execute custom gestures here. Gestures are identical to action chains in the W3C WebDriver Actions API.",
"Session Information": "Session Information",
"Execute Command": "Execute Command",
"commandsDescription": "Run various commands using the current Appium driver. Note that not all drivers support all commands.",
- "Click to Set Coordinates": "Click to Set Coordinates",
- "Set Coordinates Via Field": "Set Coordinates Via Field",
+ "showMoveActionCoordsInPercentage": "Show Coordinates of Move Actions in Screen Dimension Percentages",
+ "showMoveActionCoordsInPixels": "Show Coordinates of Move Actions in Pixels",
+ "toggleMoveActionCoordPicker": "Toggle Setting Coordinates via Clicking on Screenshot",
"Action Type": "Action Type",
"Pointer Up": "Pointer Up",
"Pointer Down": "Pointer Down",
@@ -234,29 +228,23 @@
"Left": "Left",
"Right": "Right",
"Play": "Play",
+ "Export to File": "Export to File",
"Save Capability Set As": "Save Capability Set As…",
"Edit Raw JSON": "Edit Raw JSON",
- "Enter Parameters for:": "Enter Parameters for:",
+ "enterMethodParameters": "Enter Parameters for: '{{methodName}}'",
"invalidJson": "Invalid JSON",
- "Execute Script": "Execute Script",
"App Management": "App Management",
- "Clipboard": "Clipboard",
"File Transfer": "File Transfer",
"Device Interaction": "Device Interaction",
- "Keyboard": "Keyboard",
- "Connectivity": "Connectivity",
- "Performance Data": "Performance Data",
- "System": "System",
"Session": "Session",
"Web": "Web",
"Context": "Context",
- "Window (W3C)": "Window (W3C)",
"simulatorOnly": "Emulator/simulator only",
"minAndroidSDK": "Minimum Android SDK level",
"Error": "Error",
"findingElementInSourceFailed": "Could not find the specified element. The current application source or element ID may have changed, or there may be too many elements with the same coordinates.",
"callToMethodFailed": "Call to '{{methodName}}' failed",
- "methodCallResult": "'{{methodName}}' result",
+ "methodCallResult": "Result for: '{{methodName}}' (type: {{resultType}})",
"TestingBot Key": "TestingBot Key",
"TestingBot Secret": "TestingBot Secret",
"Appium Server": "Appium Server",
@@ -269,17 +257,75 @@
"Mobitru WebDriver URL": "Mobitru WebDriver URL",
"Mobitru Billing Unit": "Mobitru Billing Unit",
"Mobitru Access Key": "Mobitru Access Key",
- "mobitruCredentialsRequired": "Mobitru Access Key is required",
"Session URL": "Session URL",
"Server Details": "Server Details",
"Session Length": "Session Length",
"Session Details": "Session Details",
"Currently Active App ID": "Currently Active App ID",
- "Session ID": "Session ID",
"confirmDeletion": "Are you sure you want to delete this?",
"Copied!": "Copied!",
"Error Fetching Session URL": "Error Fetching Session URL",
- "noResultsFound": "No results found",
+ "noRunningSessionsFound": "No running sessions found",
"invalidCapType": "Invalid capability type: {{type}}",
- "whitespaceDetected": "Text Starts and/or Ends With Whitespace"
+ "whitespaceDetected": "Text Starts and/or Ends With Whitespace",
+ "duplicateCapabilityNameError": "A capability set with the same name already exists",
+ "unableToImportGestureFiles": "Could not import gestures from the following files: {{fileNames}}",
+ "invalidSessionFile": "Invalid session file",
+ "TV Labs API Key": "TV Labs API Key",
+ "TestcribeAPIKey": "Testcribe API Key",
+ "sessionTestcribeApiKeyDescription": "You can get your api key from https://app.testcribe.com/settings/apiKeys",
+ "missingVendorProperties": "Please provide the following server details for {{vendorName}}: {{vendorProps}}",
+ "missingServerInfo": "Missing server info, could not query sessions",
+ "Username": "Username",
+ "URL": "URL",
+ "WebDriver URL": "WebDriver URL",
+ "API Key": "API Key",
+ "Access Key": "Access Key",
+ "SecurityToken": "SecurityToken",
+ "AccessToken": "AccessToken",
+ "Token": "Token",
+ "Key": "Key",
+ "Secret": "Secret",
+ "Theme": "Theme",
+ "Light Theme": "Light Theme",
+ "Dark Theme": "Dark Theme",
+ "System Theme": "System Theme",
+ "Search Source": "Search Source",
+ "Matching Elements": "Matching Elements",
+ "webmateApiKey": "webmate API Key",
+ "yourProjectId": "Your Project ID",
+ "webmateProjectId": "webmate Project ID",
+ "specifyWebmateHostExplicitly": "Specify webmate host explicitly",
+ "webmateHost": "webmate Host",
+ "Enable": "Enable",
+ "yourFireflinkDevicefarmDomain": "Your Fireflink DeviceFarm Domain (e.g., cloud.fireflink.com)",
+ "yourLicenseId": "Your License ID",
+ "yourProjectName": "Your Project Name",
+ "License ID": "License ID",
+ "Project Name": "Project Name",
+ "Fireflink DeviceFarm Domain": "Fireflink DeviceFarm Domain",
+ "Fireflink DeviceFarm Access Key": "Fireflink DeviceFarm Access Key",
+ "Fireflink DeviceFarm License ID": "Fireflink DeviceFarm License ID",
+ "Fireflink DeviceFarm Project Name": "Fireflink DeviceFarm Project Name",
+ "RabbitQA API Key": "RabbitQA API Key",
+ "RestartSessionMessage": "Device Connection Lost – Restarting the Session…",
+ "ToggleRestartSession": "Toggle Session Reload Upon Device Disconnect",
+ "toggleTableFormatting": "Toggle Table Formatting",
+ "copyResultToClipboard": "Copy Result to Clipboard",
+ "Property": "Property",
+ "noCapsFound": "No session capabilities found. Please use the Capability Builder to edit, add, and save your capability set. Refer to the tutorial at {{url}}",
+ "executeMethods": "Execute Methods",
+ "dynamicCommandsDescription": "Run commands supported by the currently active driver and plugin(s). Note that some commands may only work in specific contexts. Any commands not supported by WebdriverIO are not included in this list.",
+ "dynamicExecuteMethodsDescription": "Run any execute method supported by the currently active driver and plugin(s).",
+ "methodDeprecated": "This method is deprecated",
+ "App Settings": "App Settings",
+ "unableToImportSessionFiles": "Could not import sessions from the following files: {{fileNames}}",
+ "Import from File": "Import from File",
+ "useMjpegStream": "Use MJPEG Stream",
+ "useScreenshotApi": "Use Screenshot API",
+ "Box Model": "Box Model",
+ "detachFromSession": "Detach from Session",
+ "enterSessionID": "Enter session ID for attaching manually",
+ "refreshDiscoveredSessions": "Refresh Discovered Sessions",
+ "toggleMultiDisplayMode": "Toggle Multi-Display Mode"
}
diff --git a/assets/locales/ml-IN/translation.json b/app/common/public/locales/ml-IN/translation.json
similarity index 72%
rename from assets/locales/ml-IN/translation.json
rename to app/common/public/locales/ml-IN/translation.json
index e48b16ab8d..268a69baae 100644
--- a/assets/locales/ml-IN/translation.json
+++ b/app/common/public/locales/ml-IN/translation.json
@@ -14,7 +14,6 @@
"Zoom Out": "Zoom Out",
"Reset Zoom Level": "Reset Zoom Level",
"Close Window": "Close Window",
- "Open Session File…": "Open Session File…",
"Bring All to Front": "എല്ലാം മുന്നിലേക്ക് കൊണ്ടുവരുക",
"Help": "സഹായം",
"Appium Documentation": "Appium Documentation",
@@ -41,7 +40,6 @@
"Save Server Arguments Preset": "Save Server Arguments Preset",
"Save": "Save",
"Cancel": "Cancel",
- "datetimeFormat": "MMM Do YYYY, h:mma",
"updateDetails": "Release Date: {{pubDate}}\n\nRelease Notes: {{notes}}",
"appiumIsAvailable": "Appium Inspector {{name}} is available",
"updateIsBeingDownloaded": "Update is being downloaded now. You will be notified again when it is complete",
@@ -68,20 +66,11 @@
"Could not start session": "Could not start session",
"couldNotConnect": "Could not connect to Appium server URL '{{url}}'. Please check if the server is running and the URL is correct (valid URLs can be found at the start of the Appium server log). If you are using the Inspector's browser version, ensure the server has been started with '--allow-cors'.",
"Invalid URL:": "Invalid URL:",
- "sauceCredentialsRequired": "Sauce username and access key are required!",
- "testingbotCredentialsRequired": "TestingBot key and secret are required!",
- "Perfecto SecurityToken is required": "Perfecto SecurityToken is required",
- "browserstackCredentialsRequired": "Browserstack username and access key are required!",
- "lambdatestCredentialsRequired": "Lambdatest username and access key are required!",
- "bitbarCredentialsRequired": "Bitbar API key required!",
- "kobitonCredentialsRequired": "KOBITON username and api key are required!",
- "experitestAccessKeyURLRequired": "Experitest AccessKey and URL are required",
"experitestAccessKey": "Experitest AccessKey",
"experitestUrl": "Experitest Url",
"locatorStrategy": "Locator Strategy:",
"selector": "Selector:",
"couldNotObtainScreenshot": "Could not obtain screenshot: {{screenshotError}}",
- "selectElementInSource": "Select an element in the source to begin.",
"Press Home Button": "Press Home Button",
"Execute Siri Command": "Execute Siri Command",
"Press Back Button": "Press Back Button",
@@ -100,11 +89,11 @@
"Pause Recording": "Pause Recording",
"Search for element": "Search for element",
"App Source": "App Source",
+ "Collapse All": "Collapse All",
"Toggle Attributes": "Toggle Attributes",
"Copy XML Source to Clipboard": "Copy XML Source to Clipboard",
"Download Source as .XML File": "Download Source as .XML File",
"Copy Attributes to Clipboard": "Copy Attributes to Clipboard",
- "quitSessionAndClose": "Quit Session & Close Inspector",
"Session Inactive": "Session Inactive",
"Keep Session Running": "Keep Session Running",
"Quit Session": "Quit Session",
@@ -132,8 +121,9 @@
"usingXPathNotRecommended": "Using XPath locators is not recommended and can lead to fragile tests. Ask your development team to provide unique accessibility locators instead!",
"noAdditionalContextsFound": "No additional contexts have been detected",
"contextDropdownInfo": "Multiple contexts detected; certain elements might only be accessible after switching to a different context. Note that webview inspection in Appium Inspector is less accurate than the DevTools of Chrome or Safari. For more information, see:",
- "idAutocompletionCanBeDisabled": "The requested id selector does not have a package name prefix. This Appium session has package name autocompletion enabled, which may be the reason why no elements were found. To disable this behavior, relaunch this session with the capability 'appium:disableIdLocatorAutocompletion' set to 'true'.",
+ "idAutocompletionCanBeDisabled": "The requested id selector does not have a package name prefix. This Appium session has package name autocompletion enabled, which may be the reason why no elements were found. To disable this behavior, change the 'disableIdLocatorAutocompletion' setting to 'true'.",
"missingAutomationNameForStrategies": "Additional locator strategies may be available. To view them, add the capability 'appium:automationName' when launching the session. Note that this capability is mandatory in Appium 2.",
+ "snapshotMaxDepthReached": "This element is located at the maximum source depth {{selectedElementDepth}}, therefore its child elements (if any) are not shown. To reveal them, change the 'snapshotMaxDepth' setting to a value greater than {{selectedElementDepth}}. Check your driver documentation for the maximum supported value.",
"Tap": "Tap",
"Gathering initial app source…": "Gathering initial app source…",
"couldNotObtainSource": "Could not obtain source: {{errorMsg}}",
@@ -161,15 +151,14 @@
"boolean": "boolean",
"number": "number",
"JSON object": "JSON object",
- "filepath": "filepath",
"connectToExistingSessionInstructions": "If you have an already-running session of the above server type, you can attach an inspector to it directly.",
- "selectSessionIDInDropdown": "Select the Session ID in the dropdown below.",
+ "selectSessionID": "You can manually enter your session ID, or, if the server supports session discovery, simply select from a list of active sessions.",
"allowUnauthorizedCerts": "Allow Unauthorized Certificates",
"Use Proxy": "Use Proxy",
"JSON Representation": "JSON Representation",
"Capability Builder": "Capability Builder",
"Saved Capability Sets": "Saved Capability Sets",
- "Attach to Session": "Attach to Session…",
+ "Attach": "Attach",
"localhost": "localhost",
"Host": "Host",
"Port": "Port",
@@ -195,16 +184,19 @@
"Remote Path": "Remote Path",
"BrowserStack Username": "BrowserStack Username",
"BrowserStack Access Key": "BrowserStack Access Key",
- "LambdaTest Username": "LambdaTest Username",
- "LambdaTest Access Key": "LambdaTest Access Key",
+ "TestMu AI Username": "TestMu AI Username",
+ "TestMu AI Access Key": "TestMu AI Access Key",
"Bitbar API Key": "Bitbar API Key",
"RemoteTestKit AccessToken": "RemoteTestKit AccessToken",
"RobotQA Token": "RobotQA Token",
+ "RobotActions Host": "RobotActions Host",
+ "RobotActions Token": "RobotActions Token",
+ "Add": "Add",
"Name": "Name",
"Description": "Description",
"Created": "Created",
"Actions": "Actions",
- "enterYourSessionId": "Enter your session ID here",
+ "searchSessions": "Search discovered sessions",
"Proxy URL": "Proxy URL",
"Source": "Source",
"Commands": "Commands",
@@ -212,12 +204,14 @@
"Gestures": "Gestures",
"Gesture Builder": "Gesture Builder",
"Saved Gestures": "Saved Gestures",
+ "Create New Gesture": "Create New Gesture",
"gesturesDescription": "Create, save, and execute custom gestures here. Gestures are identical to action chains in the W3C WebDriver Actions API.",
"Session Information": "Session Information",
"Execute Command": "Execute Command",
"commandsDescription": "Run various commands using the current Appium driver. Note that not all drivers support all commands.",
- "Click to Set Coordinates": "Click to Set Coordinates",
- "Set Coordinates Via Field": "Set Coordinates Via Field",
+ "showMoveActionCoordsInPercentage": "Show Coordinates of Move Actions in Screen Dimension Percentages",
+ "showMoveActionCoordsInPixels": "Show Coordinates of Move Actions in Pixels",
+ "toggleMoveActionCoordPicker": "Toggle Setting Coordinates via Clicking on Screenshot",
"Action Type": "Action Type",
"Pointer Up": "Pointer Up",
"Pointer Down": "Pointer Down",
@@ -234,29 +228,23 @@
"Left": "Left",
"Right": "Right",
"Play": "Play",
+ "Export to File": "Export to File",
"Save Capability Set As": "Save Capability Set As…",
"Edit Raw JSON": "Edit Raw JSON",
- "Enter Parameters for:": "Enter Parameters for:",
+ "enterMethodParameters": "Enter Parameters for: '{{methodName}}'",
"invalidJson": "Invalid JSON",
- "Execute Script": "Execute Script",
"App Management": "App Management",
- "Clipboard": "Clipboard",
"File Transfer": "File Transfer",
"Device Interaction": "Device Interaction",
- "Keyboard": "Keyboard",
- "Connectivity": "Connectivity",
- "Performance Data": "Performance Data",
- "System": "System",
"Session": "Session",
"Web": "Web",
"Context": "Context",
- "Window (W3C)": "Window (W3C)",
"simulatorOnly": "Emulator/simulator only",
"minAndroidSDK": "Minimum Android SDK level",
"Error": "Error",
"findingElementInSourceFailed": "Could not find the specified element. The current application source or element ID may have changed, or there may be too many elements with the same coordinates.",
"callToMethodFailed": "Call to '{{methodName}}' failed",
- "methodCallResult": "'{{methodName}}' result",
+ "methodCallResult": "Result for: '{{methodName}}' (type: {{resultType}})",
"TestingBot Key": "TestingBot Key",
"TestingBot Secret": "TestingBot Secret",
"Appium Server": "Appium Server",
@@ -269,17 +257,75 @@
"Mobitru WebDriver URL": "Mobitru WebDriver URL",
"Mobitru Billing Unit": "Mobitru Billing Unit",
"Mobitru Access Key": "Mobitru Access Key",
- "mobitruCredentialsRequired": "Mobitru Access Key is required",
"Session URL": "Session URL",
"Server Details": "Server Details",
"Session Length": "Session Length",
"Session Details": "Session Details",
"Currently Active App ID": "Currently Active App ID",
- "Session ID": "Session ID",
"confirmDeletion": "Are you sure you want to delete this?",
"Copied!": "Copied!",
"Error Fetching Session URL": "Error Fetching Session URL",
- "noResultsFound": "No results found",
+ "noRunningSessionsFound": "No running sessions found",
"invalidCapType": "Invalid capability type: {{type}}",
- "whitespaceDetected": "Text Starts and/or Ends With Whitespace"
+ "whitespaceDetected": "Text Starts and/or Ends With Whitespace",
+ "duplicateCapabilityNameError": "A capability set with the same name already exists",
+ "unableToImportGestureFiles": "Could not import gestures from the following files: {{fileNames}}",
+ "invalidSessionFile": "Invalid session file",
+ "TV Labs API Key": "TV Labs API Key",
+ "TestcribeAPIKey": "Testcribe API Key",
+ "sessionTestcribeApiKeyDescription": "You can get your api key from https://app.testcribe.com/settings/apiKeys",
+ "missingVendorProperties": "Please provide the following server details for {{vendorName}}: {{vendorProps}}",
+ "missingServerInfo": "Missing server info, could not query sessions",
+ "Username": "Username",
+ "URL": "URL",
+ "WebDriver URL": "WebDriver URL",
+ "API Key": "API Key",
+ "Access Key": "Access Key",
+ "SecurityToken": "SecurityToken",
+ "AccessToken": "AccessToken",
+ "Token": "Token",
+ "Key": "Key",
+ "Secret": "Secret",
+ "Theme": "Theme",
+ "Light Theme": "Light Theme",
+ "Dark Theme": "Dark Theme",
+ "System Theme": "System Theme",
+ "Search Source": "Search Source",
+ "Matching Elements": "Matching Elements",
+ "webmateApiKey": "webmate API Key",
+ "yourProjectId": "Your Project ID",
+ "webmateProjectId": "webmate Project ID",
+ "specifyWebmateHostExplicitly": "Specify webmate host explicitly",
+ "webmateHost": "webmate Host",
+ "Enable": "Enable",
+ "yourFireflinkDevicefarmDomain": "Your Fireflink DeviceFarm Domain (e.g., cloud.fireflink.com)",
+ "yourLicenseId": "Your License ID",
+ "yourProjectName": "Your Project Name",
+ "License ID": "License ID",
+ "Project Name": "Project Name",
+ "Fireflink DeviceFarm Domain": "Fireflink DeviceFarm Domain",
+ "Fireflink DeviceFarm Access Key": "Fireflink DeviceFarm Access Key",
+ "Fireflink DeviceFarm License ID": "Fireflink DeviceFarm License ID",
+ "Fireflink DeviceFarm Project Name": "Fireflink DeviceFarm Project Name",
+ "RabbitQA API Key": "RabbitQA API Key",
+ "RestartSessionMessage": "Device Connection Lost – Restarting the Session…",
+ "ToggleRestartSession": "Toggle Session Reload Upon Device Disconnect",
+ "toggleTableFormatting": "Toggle Table Formatting",
+ "copyResultToClipboard": "Copy Result to Clipboard",
+ "Property": "Property",
+ "noCapsFound": "No session capabilities found. Please use the Capability Builder to edit, add, and save your capability set. Refer to the tutorial at {{url}}",
+ "executeMethods": "Execute Methods",
+ "dynamicCommandsDescription": "Run commands supported by the currently active driver and plugin(s). Note that some commands may only work in specific contexts. Any commands not supported by WebdriverIO are not included in this list.",
+ "dynamicExecuteMethodsDescription": "Run any execute method supported by the currently active driver and plugin(s).",
+ "methodDeprecated": "This method is deprecated",
+ "App Settings": "App Settings",
+ "unableToImportSessionFiles": "Could not import sessions from the following files: {{fileNames}}",
+ "Import from File": "Import from File",
+ "useMjpegStream": "Use MJPEG Stream",
+ "useScreenshotApi": "Use Screenshot API",
+ "Box Model": "Box Model",
+ "detachFromSession": "Detach from Session",
+ "enterSessionID": "Enter session ID for attaching manually",
+ "refreshDiscoveredSessions": "Refresh Discovered Sessions",
+ "toggleMultiDisplayMode": "Toggle Multi-Display Mode"
}
diff --git a/app/common/public/locales/nl/translation.json b/app/common/public/locales/nl/translation.json
new file mode 100644
index 0000000000..9ad71e149c
--- /dev/null
+++ b/app/common/public/locales/nl/translation.json
@@ -0,0 +1,331 @@
+{
+ "appiumInspector": "Appium Inspector",
+ "Edit": "Edit",
+ "Redo": "Redo",
+ "Cut": "Cut",
+ "Copy": "Copy",
+ "Paste": "Paste",
+ "Delete": "Delete",
+ "Select All": "Select All",
+ "Window": "Window",
+ "Minimize": "Minimize",
+ "Zoom": "Zoom",
+ "Zoom In": "Zoom In",
+ "Zoom Out": "Zoom Out",
+ "Reset Zoom Level": "Reset Zoom Level",
+ "Close Window": "Close Window",
+ "Bring All to Front": "Bring All to Front",
+ "Help": "Help",
+ "Appium Documentation": "Appium Documentation",
+ "Inspector Documentation": "Inspector Documentation",
+ "Appium Discussion Forum": "Appium Discussion Forum",
+ "Report Issues": "Report Issues",
+ "About Appium Inspector": "About Appium Inspector",
+ "showAppInfo": "App Version: {{appVersion}}\nElectron: {{electronVersion}}\nNode.js: {{nodejsVersion}}\n",
+ "Improve Translations": "Improve Translations",
+ "Check for Updates…": "Check for Updates…",
+ "File": "File",
+ "New Window": "New Window",
+ "Hide Appium Inspector": "Hide Appium Inspector",
+ "Hide Others": "Hide Others",
+ "Show All": "Show All",
+ "Quit Appium Inspector": "Quit Appium Inspector",
+ "Toggle Full Screen": "Toggle Full Screen",
+ "Languages": "Languages",
+ "View": "View",
+ "Reload": "Reload",
+ "Toggle Developer Tools": "Toggle Developer Tools",
+ "Undo": "Undo",
+ "Restart Now": "Restart Now",
+ "Save Server Arguments Preset": "Save Server Arguments Preset",
+ "Save": "Save",
+ "Cancel": "Cancel",
+ "updateDetails": "Release Date: {{pubDate}}\n\nRelease Notes: {{notes}}",
+ "appiumIsAvailable": "Appium Inspector {{name}} is available",
+ "updateIsBeingDownloaded": "Update is being downloaded now. You will be notified again when it is complete",
+ "updateIsDownloaded": "Appium Inspector {{releaseName}} has been downloaded. Must restart to apply the updates (note: it may take several minutes for Appium Inspector to install and restart)",
+ "updateDownloadFailed": "Failed to download update. Reason: {{message}}",
+ "OK": "OK",
+ "Install Now": "Install Now",
+ "Install Later": "Install Later",
+ "Update Download Started": "Update Download Started",
+ "No update available": "No update available",
+ "Appium Inspector is up-to-date": "Appium Inspector is up-to-date",
+ "Later": "Later",
+ "Update Downloaded": "Update Downloaded",
+ "Could not download update": "Could not download update",
+ "Unexpected Error:": "Unexpected Error:",
+ "Please report this issue at:": "Please report this issue at:",
+ "Full error trace:": "Full error trace:",
+ "Copy Error Trace": "Copy Error Trace",
+ "Inspect element": "Inspect element",
+ "Session closed due to inactivity": "Session closed due to inactivity",
+ "Session has been terminated": "Session has been terminated",
+ "frameworkNotSupported": "Framework '{{framework}}' not supported",
+ "findElementFailure": "Failed to find element for '{{methodName}}'. Please refresh page and try again.",
+ "Could not start session": "Could not start session",
+ "couldNotConnect": "Could not connect to Appium server URL '{{url}}'. Please check if the server is running and the URL is correct (valid URLs can be found at the start of the Appium server log). If you are using the Inspector's browser version, ensure the server has been started with '--allow-cors'.",
+ "Invalid URL:": "Invalid URL:",
+ "experitestAccessKey": "Experitest AccessKey",
+ "experitestUrl": "Experitest Url",
+ "locatorStrategy": "Locator Strategy:",
+ "selector": "Selector:",
+ "couldNotObtainScreenshot": "Could not obtain screenshot: {{screenshotError}}",
+ "Press Home Button": "Press Home Button",
+ "Execute Siri Command": "Execute Siri Command",
+ "Press Back Button": "Press Back Button",
+ "Press App Switch Button": "Press App Switch Button",
+ "Command": "Command",
+ "Show Element Handles": "Show Element Handles",
+ "Hide Element Handles": "Hide Element Handles",
+ "Select Elements": "Select Elements",
+ "Tap/Swipe By Coordinates": "Tap/Swipe By Coordinates",
+ "Download Screenshot": "Download Screenshot",
+ "Back": "Back",
+ "Start Refreshing Source": "Start Refreshing Source",
+ "Pause Refreshing Source": "Pause Refreshing Source",
+ "refreshSource": "Refresh Source & Screenshot",
+ "Start Recording": "Start Recording",
+ "Pause Recording": "Pause Recording",
+ "Search for element": "Search for element",
+ "App Source": "App Source",
+ "Collapse All": "Collapse All",
+ "Toggle Attributes": "Toggle Attributes",
+ "Copy XML Source to Clipboard": "Copy XML Source to Clipboard",
+ "Download Source as .XML File": "Download Source as .XML File",
+ "Copy Attributes to Clipboard": "Copy Attributes to Clipboard",
+ "Session Inactive": "Session Inactive",
+ "Keep Session Running": "Keep Session Running",
+ "Quit Session": "Quit Session",
+ "Your session is about to expire": "Your session is about to expire",
+ "Enter Keys to Send": "Enter Keys to Send",
+ "Find and Select in Source": "Find and Select in Source",
+ "Clear": "Clear",
+ "Send Keys": "Send Keys",
+ "Done": "Done",
+ "Search": "Search",
+ "Show/Hide Boilerplate Code": "Show/Hide Boilerplate Code",
+ "Copy code to clipboard": "Copy code to clipboard",
+ "Start this Kind of Session with Code": "Start this Kind of Session with Code",
+ "Clear Actions": "Clear Actions",
+ "Close Recorder": "Close Recorder",
+ "enableRecordingAndPerformActions": "Enable recording in the application header, then perform some actions to see code show up here",
+ "Recorder": "Recorder",
+ "Attribute": "Attribute",
+ "Value": "Value",
+ "Find By": "Find By",
+ "Selector": "Selector",
+ "Time": "Time (ms)",
+ "Get Timing": "Get Timing",
+ "interactionsNotAvailable": "Interactions for this element may not be available",
+ "usingXPathNotRecommended": "Using XPath locators is not recommended and can lead to fragile tests. Ask your development team to provide unique accessibility locators instead!",
+ "noAdditionalContextsFound": "No additional contexts have been detected",
+ "contextDropdownInfo": "Multiple contexts detected; certain elements might only be accessible after switching to a different context. Note that webview inspection in Appium Inspector is less accurate than the DevTools of Chrome or Safari. For more information, see:",
+ "idAutocompletionCanBeDisabled": "The requested id selector does not have a package name prefix. This Appium session has package name autocompletion enabled, which may be the reason why no elements were found. To disable this behavior, change the 'disableIdLocatorAutocompletion' setting to 'true'.",
+ "missingAutomationNameForStrategies": "Additional locator strategies may be available. To view them, add the capability 'appium:automationName' when launching the session. Note that this capability is mandatory in Appium 2.",
+ "snapshotMaxDepthReached": "This element is located at the maximum source depth {{selectedElementDepth}}, therefore its child elements (if any) are not shown. To reveal them, change the 'snapshotMaxDepth' setting to a value greater than {{selectedElementDepth}}. Check your driver documentation for the maximum supported value.",
+ "Tap": "Tap",
+ "Gathering initial app source…": "Gathering initial app source…",
+ "couldNotObtainSource": "Could not obtain source: {{errorMsg}}",
+ "iOS": "iOS",
+ "Android": "Android",
+ "desiredCapabilitiesDocumentation": "Capabilities Documentation",
+ "startSession": "Start Session",
+ "saveAs": "Save As…",
+ "attachToSession": "Attach to Session",
+ "selectedElement": "Selected Element",
+ "unnamed": "(Unnamed)",
+ "No Description": "No Description",
+ "couldNotFindEntryWithId": "Could not find an entry with ID {{id}}",
+ "couldNotFindAnyElements": "Could not find any elements",
+ "elementsCount": "Elements found:",
+ "xCoordinate": "X: {{x}}",
+ "yCoordinate": "Y: {{y}}",
+ "SauceLabs Data Center": "SauceLabs Data Center",
+ "US-West": "US West 1",
+ "US-East": "US East 4",
+ "EU-Central": "EU Central 1",
+ "proxyThroughSC": "Proxy through Sauce Connect's Selenium Relay",
+ "SSL": "SSL",
+ "text": "text",
+ "boolean": "boolean",
+ "number": "number",
+ "JSON object": "JSON object",
+ "connectToExistingSessionInstructions": "If you have an already-running session of the above server type, you can attach an inspector to it directly.",
+ "selectSessionID": "You can manually enter your session ID, or, if the server supports session discovery, simply select from a list of active sessions.",
+ "allowUnauthorizedCerts": "Allow Unauthorized Certificates",
+ "Use Proxy": "Use Proxy",
+ "JSON Representation": "JSON Representation",
+ "Capability Builder": "Capability Builder",
+ "Saved Capability Sets": "Saved Capability Sets",
+ "Attach": "Attach",
+ "localhost": "localhost",
+ "Host": "Host",
+ "Port": "Port",
+ "usingDataFoundIn": "Using data found in {{environmentVariable}}",
+ "yourUsername": "Your Username",
+ "Sauce Username": "Sauce Username",
+ "Sauce Access Key": "Sauce Access Key",
+ "yourAccessKey": "Your Access Key",
+ "yourApiKey": "Your API Key",
+ "Perfecto Host": "Perfecto Host",
+ "Perfecto Port": "Perfecto Port",
+ "Pcloudy User Name": "Pcloudy User Name",
+ "Pcloudy Host": "Pcloudy Host",
+ "Pcloudy API Key": "Pcloudy API Key",
+ "Add your token": "Add your token",
+ "Perfecto Token": "Perfecto Token",
+ "Your Kobiton Username": "Your Kobiton Username",
+ "Kobiton Access Key": "Kobiton Access Key",
+ "serverTabHeasdpinWebDriverURL": "HeadSpin Web Driver URL",
+ "sessionHeadspinWebDriverURLDescription": "Get the URL from the HeadSpin UI or the HeadSpin API using the automation configuration route",
+ "Remote Host": "Remote Host",
+ "Remote Port": "Remote Port",
+ "Remote Path": "Remote Path",
+ "BrowserStack Username": "BrowserStack Username",
+ "BrowserStack Access Key": "BrowserStack Access Key",
+ "TestMu AI Username": "TestMu AI Username",
+ "TestMu AI Access Key": "TestMu AI Access Key",
+ "Bitbar API Key": "Bitbar API Key",
+ "RemoteTestKit AccessToken": "RemoteTestKit AccessToken",
+ "RobotQA Token": "RobotQA Token",
+ "RobotActions Host": "RobotActions Host",
+ "RobotActions Token": "RobotActions Token",
+ "Add": "Add",
+ "Name": "Name",
+ "Description": "Description",
+ "Created": "Created",
+ "Actions": "Actions",
+ "searchSessions": "Search discovered sessions",
+ "Proxy URL": "Proxy URL",
+ "Source": "Source",
+ "Commands": "Commands",
+ "Execute Commands": "Execute Commands",
+ "Gestures": "Gestures",
+ "Gesture Builder": "Gesture Builder",
+ "Saved Gestures": "Saved Gestures",
+ "Create New Gesture": "Create New Gesture",
+ "gesturesDescription": "Create, save, and execute custom gestures here. Gestures are identical to action chains in the W3C WebDriver Actions API.",
+ "Session Information": "Session Information",
+ "Execute Command": "Execute Command",
+ "commandsDescription": "Run various commands using the current Appium driver. Note that not all drivers support all commands.",
+ "showMoveActionCoordsInPercentage": "Show Coordinates of Move Actions in Screen Dimension Percentages",
+ "showMoveActionCoordsInPixels": "Show Coordinates of Move Actions in Pixels",
+ "toggleMoveActionCoordPicker": "Toggle Setting Coordinates via Clicking on Screenshot",
+ "Action Type": "Action Type",
+ "Pointer Up": "Pointer Up",
+ "Pointer Down": "Pointer Down",
+ "Pause": "Pause",
+ "Move": "Move",
+ "Action Type Not Defined": "Action Type Not Defined",
+ "Duration": "Duration",
+ "Button": "Button",
+ "Untitled Gesture": "Untitled Gesture",
+ "Add Description": "Add Description",
+ "Gesture saved": "Gesture saved",
+ "Gesture saved as": "Gesture saved as '{{gestureName}}'",
+ "Duplicate pointer names are not allowed": "Duplicate pointer names are not allowed",
+ "Left": "Left",
+ "Right": "Right",
+ "Play": "Play",
+ "Export to File": "Export to File",
+ "Save Capability Set As": "Save Capability Set As…",
+ "Edit Raw JSON": "Edit Raw JSON",
+ "enterMethodParameters": "Enter Parameters for: '{{methodName}}'",
+ "invalidJson": "Invalid JSON",
+ "App Management": "App Management",
+ "File Transfer": "File Transfer",
+ "Device Interaction": "Device Interaction",
+ "Session": "Session",
+ "Web": "Web",
+ "Context": "Context",
+ "simulatorOnly": "Emulator/simulator only",
+ "minAndroidSDK": "Minimum Android SDK level",
+ "Error": "Error",
+ "findingElementInSourceFailed": "Could not find the specified element. The current application source or element ID may have changed, or there may be too many elements with the same coordinates.",
+ "callToMethodFailed": "Call to '{{methodName}}' failed",
+ "methodCallResult": "Result for: '{{methodName}}' (type: {{resultType}})",
+ "TestingBot Key": "TestingBot Key",
+ "TestingBot Secret": "TestingBot Secret",
+ "Appium Server": "Appium Server",
+ "Select Cloud Providers": "Select Cloud Providers",
+ "Advanced Settings": "Advanced Settings",
+ "Native App Mode": "Native App Mode",
+ "Web/Hybrid App Mode": "Web/Hybrid App Mode",
+ "autoAddPrefixes": "Automatically add necessary Appium vendor prefixes on start",
+ "attachSessionNotRunning": "Could not confirm that session {{attachSessId}} is running on the provided server. Please check details before trying to attach to the session again.",
+ "Mobitru WebDriver URL": "Mobitru WebDriver URL",
+ "Mobitru Billing Unit": "Mobitru Billing Unit",
+ "Mobitru Access Key": "Mobitru Access Key",
+ "Session URL": "Session URL",
+ "Server Details": "Server Details",
+ "Session Length": "Session Length",
+ "Session Details": "Session Details",
+ "Currently Active App ID": "Currently Active App ID",
+ "confirmDeletion": "Are you sure you want to delete this?",
+ "Copied!": "Copied!",
+ "Error Fetching Session URL": "Error Fetching Session URL",
+ "noRunningSessionsFound": "No running sessions found",
+ "invalidCapType": "Invalid capability type: {{type}}",
+ "whitespaceDetected": "Text Starts and/or Ends With Whitespace",
+ "duplicateCapabilityNameError": "A capability set with the same name already exists",
+ "unableToImportGestureFiles": "Could not import gestures from the following files: {{fileNames}}",
+ "invalidSessionFile": "Invalid session file",
+ "TV Labs API Key": "TV Labs API Key",
+ "TestcribeAPIKey": "Testcribe API Key",
+ "sessionTestcribeApiKeyDescription": "You can get your api key from https://app.testcribe.com/settings/apiKeys",
+ "missingVendorProperties": "Please provide the following server details for {{vendorName}}: {{vendorProps}}",
+ "missingServerInfo": "Missing server info, could not query sessions",
+ "Username": "Username",
+ "URL": "URL",
+ "WebDriver URL": "WebDriver URL",
+ "API Key": "API Key",
+ "Access Key": "Access Key",
+ "SecurityToken": "SecurityToken",
+ "AccessToken": "AccessToken",
+ "Token": "Token",
+ "Key": "Key",
+ "Secret": "Secret",
+ "Theme": "Theme",
+ "Light Theme": "Light Theme",
+ "Dark Theme": "Dark Theme",
+ "System Theme": "System Theme",
+ "Search Source": "Search Source",
+ "Matching Elements": "Matching Elements",
+ "webmateApiKey": "webmate API Key",
+ "yourProjectId": "Your Project ID",
+ "webmateProjectId": "webmate Project ID",
+ "specifyWebmateHostExplicitly": "Specify webmate host explicitly",
+ "webmateHost": "webmate Host",
+ "Enable": "Enable",
+ "yourFireflinkDevicefarmDomain": "Your Fireflink DeviceFarm Domain (e.g., cloud.fireflink.com)",
+ "yourLicenseId": "Your License ID",
+ "yourProjectName": "Your Project Name",
+ "License ID": "License ID",
+ "Project Name": "Project Name",
+ "Fireflink DeviceFarm Domain": "Fireflink DeviceFarm Domain",
+ "Fireflink DeviceFarm Access Key": "Fireflink DeviceFarm Access Key",
+ "Fireflink DeviceFarm License ID": "Fireflink DeviceFarm License ID",
+ "Fireflink DeviceFarm Project Name": "Fireflink DeviceFarm Project Name",
+ "RabbitQA API Key": "RabbitQA API Key",
+ "RestartSessionMessage": "Device Connection Lost – Restarting the Session…",
+ "ToggleRestartSession": "Toggle Session Reload Upon Device Disconnect",
+ "toggleTableFormatting": "Toggle Table Formatting",
+ "copyResultToClipboard": "Copy Result to Clipboard",
+ "Property": "Property",
+ "noCapsFound": "No session capabilities found. Please use the Capability Builder to edit, add, and save your capability set. Refer to the tutorial at {{url}}",
+ "executeMethods": "Execute Methods",
+ "dynamicCommandsDescription": "Run commands supported by the currently active driver and plugin(s). Note that some commands may only work in specific contexts. Any commands not supported by WebdriverIO are not included in this list.",
+ "dynamicExecuteMethodsDescription": "Run any execute method supported by the currently active driver and plugin(s).",
+ "methodDeprecated": "This method is deprecated",
+ "App Settings": "App Settings",
+ "unableToImportSessionFiles": "Could not import sessions from the following files: {{fileNames}}",
+ "Import from File": "Import from File",
+ "useMjpegStream": "Use MJPEG Stream",
+ "useScreenshotApi": "Use Screenshot API",
+ "Box Model": "Box Model",
+ "detachFromSession": "Detach from Session",
+ "enterSessionID": "Enter session ID for attaching manually",
+ "refreshDiscoveredSessions": "Refresh Discovered Sessions",
+ "toggleMultiDisplayMode": "Toggle Multi-Display Mode"
+}
diff --git a/app/common/public/locales/no/translation.json b/app/common/public/locales/no/translation.json
new file mode 100644
index 0000000000..9ad71e149c
--- /dev/null
+++ b/app/common/public/locales/no/translation.json
@@ -0,0 +1,331 @@
+{
+ "appiumInspector": "Appium Inspector",
+ "Edit": "Edit",
+ "Redo": "Redo",
+ "Cut": "Cut",
+ "Copy": "Copy",
+ "Paste": "Paste",
+ "Delete": "Delete",
+ "Select All": "Select All",
+ "Window": "Window",
+ "Minimize": "Minimize",
+ "Zoom": "Zoom",
+ "Zoom In": "Zoom In",
+ "Zoom Out": "Zoom Out",
+ "Reset Zoom Level": "Reset Zoom Level",
+ "Close Window": "Close Window",
+ "Bring All to Front": "Bring All to Front",
+ "Help": "Help",
+ "Appium Documentation": "Appium Documentation",
+ "Inspector Documentation": "Inspector Documentation",
+ "Appium Discussion Forum": "Appium Discussion Forum",
+ "Report Issues": "Report Issues",
+ "About Appium Inspector": "About Appium Inspector",
+ "showAppInfo": "App Version: {{appVersion}}\nElectron: {{electronVersion}}\nNode.js: {{nodejsVersion}}\n",
+ "Improve Translations": "Improve Translations",
+ "Check for Updates…": "Check for Updates…",
+ "File": "File",
+ "New Window": "New Window",
+ "Hide Appium Inspector": "Hide Appium Inspector",
+ "Hide Others": "Hide Others",
+ "Show All": "Show All",
+ "Quit Appium Inspector": "Quit Appium Inspector",
+ "Toggle Full Screen": "Toggle Full Screen",
+ "Languages": "Languages",
+ "View": "View",
+ "Reload": "Reload",
+ "Toggle Developer Tools": "Toggle Developer Tools",
+ "Undo": "Undo",
+ "Restart Now": "Restart Now",
+ "Save Server Arguments Preset": "Save Server Arguments Preset",
+ "Save": "Save",
+ "Cancel": "Cancel",
+ "updateDetails": "Release Date: {{pubDate}}\n\nRelease Notes: {{notes}}",
+ "appiumIsAvailable": "Appium Inspector {{name}} is available",
+ "updateIsBeingDownloaded": "Update is being downloaded now. You will be notified again when it is complete",
+ "updateIsDownloaded": "Appium Inspector {{releaseName}} has been downloaded. Must restart to apply the updates (note: it may take several minutes for Appium Inspector to install and restart)",
+ "updateDownloadFailed": "Failed to download update. Reason: {{message}}",
+ "OK": "OK",
+ "Install Now": "Install Now",
+ "Install Later": "Install Later",
+ "Update Download Started": "Update Download Started",
+ "No update available": "No update available",
+ "Appium Inspector is up-to-date": "Appium Inspector is up-to-date",
+ "Later": "Later",
+ "Update Downloaded": "Update Downloaded",
+ "Could not download update": "Could not download update",
+ "Unexpected Error:": "Unexpected Error:",
+ "Please report this issue at:": "Please report this issue at:",
+ "Full error trace:": "Full error trace:",
+ "Copy Error Trace": "Copy Error Trace",
+ "Inspect element": "Inspect element",
+ "Session closed due to inactivity": "Session closed due to inactivity",
+ "Session has been terminated": "Session has been terminated",
+ "frameworkNotSupported": "Framework '{{framework}}' not supported",
+ "findElementFailure": "Failed to find element for '{{methodName}}'. Please refresh page and try again.",
+ "Could not start session": "Could not start session",
+ "couldNotConnect": "Could not connect to Appium server URL '{{url}}'. Please check if the server is running and the URL is correct (valid URLs can be found at the start of the Appium server log). If you are using the Inspector's browser version, ensure the server has been started with '--allow-cors'.",
+ "Invalid URL:": "Invalid URL:",
+ "experitestAccessKey": "Experitest AccessKey",
+ "experitestUrl": "Experitest Url",
+ "locatorStrategy": "Locator Strategy:",
+ "selector": "Selector:",
+ "couldNotObtainScreenshot": "Could not obtain screenshot: {{screenshotError}}",
+ "Press Home Button": "Press Home Button",
+ "Execute Siri Command": "Execute Siri Command",
+ "Press Back Button": "Press Back Button",
+ "Press App Switch Button": "Press App Switch Button",
+ "Command": "Command",
+ "Show Element Handles": "Show Element Handles",
+ "Hide Element Handles": "Hide Element Handles",
+ "Select Elements": "Select Elements",
+ "Tap/Swipe By Coordinates": "Tap/Swipe By Coordinates",
+ "Download Screenshot": "Download Screenshot",
+ "Back": "Back",
+ "Start Refreshing Source": "Start Refreshing Source",
+ "Pause Refreshing Source": "Pause Refreshing Source",
+ "refreshSource": "Refresh Source & Screenshot",
+ "Start Recording": "Start Recording",
+ "Pause Recording": "Pause Recording",
+ "Search for element": "Search for element",
+ "App Source": "App Source",
+ "Collapse All": "Collapse All",
+ "Toggle Attributes": "Toggle Attributes",
+ "Copy XML Source to Clipboard": "Copy XML Source to Clipboard",
+ "Download Source as .XML File": "Download Source as .XML File",
+ "Copy Attributes to Clipboard": "Copy Attributes to Clipboard",
+ "Session Inactive": "Session Inactive",
+ "Keep Session Running": "Keep Session Running",
+ "Quit Session": "Quit Session",
+ "Your session is about to expire": "Your session is about to expire",
+ "Enter Keys to Send": "Enter Keys to Send",
+ "Find and Select in Source": "Find and Select in Source",
+ "Clear": "Clear",
+ "Send Keys": "Send Keys",
+ "Done": "Done",
+ "Search": "Search",
+ "Show/Hide Boilerplate Code": "Show/Hide Boilerplate Code",
+ "Copy code to clipboard": "Copy code to clipboard",
+ "Start this Kind of Session with Code": "Start this Kind of Session with Code",
+ "Clear Actions": "Clear Actions",
+ "Close Recorder": "Close Recorder",
+ "enableRecordingAndPerformActions": "Enable recording in the application header, then perform some actions to see code show up here",
+ "Recorder": "Recorder",
+ "Attribute": "Attribute",
+ "Value": "Value",
+ "Find By": "Find By",
+ "Selector": "Selector",
+ "Time": "Time (ms)",
+ "Get Timing": "Get Timing",
+ "interactionsNotAvailable": "Interactions for this element may not be available",
+ "usingXPathNotRecommended": "Using XPath locators is not recommended and can lead to fragile tests. Ask your development team to provide unique accessibility locators instead!",
+ "noAdditionalContextsFound": "No additional contexts have been detected",
+ "contextDropdownInfo": "Multiple contexts detected; certain elements might only be accessible after switching to a different context. Note that webview inspection in Appium Inspector is less accurate than the DevTools of Chrome or Safari. For more information, see:",
+ "idAutocompletionCanBeDisabled": "The requested id selector does not have a package name prefix. This Appium session has package name autocompletion enabled, which may be the reason why no elements were found. To disable this behavior, change the 'disableIdLocatorAutocompletion' setting to 'true'.",
+ "missingAutomationNameForStrategies": "Additional locator strategies may be available. To view them, add the capability 'appium:automationName' when launching the session. Note that this capability is mandatory in Appium 2.",
+ "snapshotMaxDepthReached": "This element is located at the maximum source depth {{selectedElementDepth}}, therefore its child elements (if any) are not shown. To reveal them, change the 'snapshotMaxDepth' setting to a value greater than {{selectedElementDepth}}. Check your driver documentation for the maximum supported value.",
+ "Tap": "Tap",
+ "Gathering initial app source…": "Gathering initial app source…",
+ "couldNotObtainSource": "Could not obtain source: {{errorMsg}}",
+ "iOS": "iOS",
+ "Android": "Android",
+ "desiredCapabilitiesDocumentation": "Capabilities Documentation",
+ "startSession": "Start Session",
+ "saveAs": "Save As…",
+ "attachToSession": "Attach to Session",
+ "selectedElement": "Selected Element",
+ "unnamed": "(Unnamed)",
+ "No Description": "No Description",
+ "couldNotFindEntryWithId": "Could not find an entry with ID {{id}}",
+ "couldNotFindAnyElements": "Could not find any elements",
+ "elementsCount": "Elements found:",
+ "xCoordinate": "X: {{x}}",
+ "yCoordinate": "Y: {{y}}",
+ "SauceLabs Data Center": "SauceLabs Data Center",
+ "US-West": "US West 1",
+ "US-East": "US East 4",
+ "EU-Central": "EU Central 1",
+ "proxyThroughSC": "Proxy through Sauce Connect's Selenium Relay",
+ "SSL": "SSL",
+ "text": "text",
+ "boolean": "boolean",
+ "number": "number",
+ "JSON object": "JSON object",
+ "connectToExistingSessionInstructions": "If you have an already-running session of the above server type, you can attach an inspector to it directly.",
+ "selectSessionID": "You can manually enter your session ID, or, if the server supports session discovery, simply select from a list of active sessions.",
+ "allowUnauthorizedCerts": "Allow Unauthorized Certificates",
+ "Use Proxy": "Use Proxy",
+ "JSON Representation": "JSON Representation",
+ "Capability Builder": "Capability Builder",
+ "Saved Capability Sets": "Saved Capability Sets",
+ "Attach": "Attach",
+ "localhost": "localhost",
+ "Host": "Host",
+ "Port": "Port",
+ "usingDataFoundIn": "Using data found in {{environmentVariable}}",
+ "yourUsername": "Your Username",
+ "Sauce Username": "Sauce Username",
+ "Sauce Access Key": "Sauce Access Key",
+ "yourAccessKey": "Your Access Key",
+ "yourApiKey": "Your API Key",
+ "Perfecto Host": "Perfecto Host",
+ "Perfecto Port": "Perfecto Port",
+ "Pcloudy User Name": "Pcloudy User Name",
+ "Pcloudy Host": "Pcloudy Host",
+ "Pcloudy API Key": "Pcloudy API Key",
+ "Add your token": "Add your token",
+ "Perfecto Token": "Perfecto Token",
+ "Your Kobiton Username": "Your Kobiton Username",
+ "Kobiton Access Key": "Kobiton Access Key",
+ "serverTabHeasdpinWebDriverURL": "HeadSpin Web Driver URL",
+ "sessionHeadspinWebDriverURLDescription": "Get the URL from the HeadSpin UI or the HeadSpin API using the automation configuration route",
+ "Remote Host": "Remote Host",
+ "Remote Port": "Remote Port",
+ "Remote Path": "Remote Path",
+ "BrowserStack Username": "BrowserStack Username",
+ "BrowserStack Access Key": "BrowserStack Access Key",
+ "TestMu AI Username": "TestMu AI Username",
+ "TestMu AI Access Key": "TestMu AI Access Key",
+ "Bitbar API Key": "Bitbar API Key",
+ "RemoteTestKit AccessToken": "RemoteTestKit AccessToken",
+ "RobotQA Token": "RobotQA Token",
+ "RobotActions Host": "RobotActions Host",
+ "RobotActions Token": "RobotActions Token",
+ "Add": "Add",
+ "Name": "Name",
+ "Description": "Description",
+ "Created": "Created",
+ "Actions": "Actions",
+ "searchSessions": "Search discovered sessions",
+ "Proxy URL": "Proxy URL",
+ "Source": "Source",
+ "Commands": "Commands",
+ "Execute Commands": "Execute Commands",
+ "Gestures": "Gestures",
+ "Gesture Builder": "Gesture Builder",
+ "Saved Gestures": "Saved Gestures",
+ "Create New Gesture": "Create New Gesture",
+ "gesturesDescription": "Create, save, and execute custom gestures here. Gestures are identical to action chains in the W3C WebDriver Actions API.",
+ "Session Information": "Session Information",
+ "Execute Command": "Execute Command",
+ "commandsDescription": "Run various commands using the current Appium driver. Note that not all drivers support all commands.",
+ "showMoveActionCoordsInPercentage": "Show Coordinates of Move Actions in Screen Dimension Percentages",
+ "showMoveActionCoordsInPixels": "Show Coordinates of Move Actions in Pixels",
+ "toggleMoveActionCoordPicker": "Toggle Setting Coordinates via Clicking on Screenshot",
+ "Action Type": "Action Type",
+ "Pointer Up": "Pointer Up",
+ "Pointer Down": "Pointer Down",
+ "Pause": "Pause",
+ "Move": "Move",
+ "Action Type Not Defined": "Action Type Not Defined",
+ "Duration": "Duration",
+ "Button": "Button",
+ "Untitled Gesture": "Untitled Gesture",
+ "Add Description": "Add Description",
+ "Gesture saved": "Gesture saved",
+ "Gesture saved as": "Gesture saved as '{{gestureName}}'",
+ "Duplicate pointer names are not allowed": "Duplicate pointer names are not allowed",
+ "Left": "Left",
+ "Right": "Right",
+ "Play": "Play",
+ "Export to File": "Export to File",
+ "Save Capability Set As": "Save Capability Set As…",
+ "Edit Raw JSON": "Edit Raw JSON",
+ "enterMethodParameters": "Enter Parameters for: '{{methodName}}'",
+ "invalidJson": "Invalid JSON",
+ "App Management": "App Management",
+ "File Transfer": "File Transfer",
+ "Device Interaction": "Device Interaction",
+ "Session": "Session",
+ "Web": "Web",
+ "Context": "Context",
+ "simulatorOnly": "Emulator/simulator only",
+ "minAndroidSDK": "Minimum Android SDK level",
+ "Error": "Error",
+ "findingElementInSourceFailed": "Could not find the specified element. The current application source or element ID may have changed, or there may be too many elements with the same coordinates.",
+ "callToMethodFailed": "Call to '{{methodName}}' failed",
+ "methodCallResult": "Result for: '{{methodName}}' (type: {{resultType}})",
+ "TestingBot Key": "TestingBot Key",
+ "TestingBot Secret": "TestingBot Secret",
+ "Appium Server": "Appium Server",
+ "Select Cloud Providers": "Select Cloud Providers",
+ "Advanced Settings": "Advanced Settings",
+ "Native App Mode": "Native App Mode",
+ "Web/Hybrid App Mode": "Web/Hybrid App Mode",
+ "autoAddPrefixes": "Automatically add necessary Appium vendor prefixes on start",
+ "attachSessionNotRunning": "Could not confirm that session {{attachSessId}} is running on the provided server. Please check details before trying to attach to the session again.",
+ "Mobitru WebDriver URL": "Mobitru WebDriver URL",
+ "Mobitru Billing Unit": "Mobitru Billing Unit",
+ "Mobitru Access Key": "Mobitru Access Key",
+ "Session URL": "Session URL",
+ "Server Details": "Server Details",
+ "Session Length": "Session Length",
+ "Session Details": "Session Details",
+ "Currently Active App ID": "Currently Active App ID",
+ "confirmDeletion": "Are you sure you want to delete this?",
+ "Copied!": "Copied!",
+ "Error Fetching Session URL": "Error Fetching Session URL",
+ "noRunningSessionsFound": "No running sessions found",
+ "invalidCapType": "Invalid capability type: {{type}}",
+ "whitespaceDetected": "Text Starts and/or Ends With Whitespace",
+ "duplicateCapabilityNameError": "A capability set with the same name already exists",
+ "unableToImportGestureFiles": "Could not import gestures from the following files: {{fileNames}}",
+ "invalidSessionFile": "Invalid session file",
+ "TV Labs API Key": "TV Labs API Key",
+ "TestcribeAPIKey": "Testcribe API Key",
+ "sessionTestcribeApiKeyDescription": "You can get your api key from https://app.testcribe.com/settings/apiKeys",
+ "missingVendorProperties": "Please provide the following server details for {{vendorName}}: {{vendorProps}}",
+ "missingServerInfo": "Missing server info, could not query sessions",
+ "Username": "Username",
+ "URL": "URL",
+ "WebDriver URL": "WebDriver URL",
+ "API Key": "API Key",
+ "Access Key": "Access Key",
+ "SecurityToken": "SecurityToken",
+ "AccessToken": "AccessToken",
+ "Token": "Token",
+ "Key": "Key",
+ "Secret": "Secret",
+ "Theme": "Theme",
+ "Light Theme": "Light Theme",
+ "Dark Theme": "Dark Theme",
+ "System Theme": "System Theme",
+ "Search Source": "Search Source",
+ "Matching Elements": "Matching Elements",
+ "webmateApiKey": "webmate API Key",
+ "yourProjectId": "Your Project ID",
+ "webmateProjectId": "webmate Project ID",
+ "specifyWebmateHostExplicitly": "Specify webmate host explicitly",
+ "webmateHost": "webmate Host",
+ "Enable": "Enable",
+ "yourFireflinkDevicefarmDomain": "Your Fireflink DeviceFarm Domain (e.g., cloud.fireflink.com)",
+ "yourLicenseId": "Your License ID",
+ "yourProjectName": "Your Project Name",
+ "License ID": "License ID",
+ "Project Name": "Project Name",
+ "Fireflink DeviceFarm Domain": "Fireflink DeviceFarm Domain",
+ "Fireflink DeviceFarm Access Key": "Fireflink DeviceFarm Access Key",
+ "Fireflink DeviceFarm License ID": "Fireflink DeviceFarm License ID",
+ "Fireflink DeviceFarm Project Name": "Fireflink DeviceFarm Project Name",
+ "RabbitQA API Key": "RabbitQA API Key",
+ "RestartSessionMessage": "Device Connection Lost – Restarting the Session…",
+ "ToggleRestartSession": "Toggle Session Reload Upon Device Disconnect",
+ "toggleTableFormatting": "Toggle Table Formatting",
+ "copyResultToClipboard": "Copy Result to Clipboard",
+ "Property": "Property",
+ "noCapsFound": "No session capabilities found. Please use the Capability Builder to edit, add, and save your capability set. Refer to the tutorial at {{url}}",
+ "executeMethods": "Execute Methods",
+ "dynamicCommandsDescription": "Run commands supported by the currently active driver and plugin(s). Note that some commands may only work in specific contexts. Any commands not supported by WebdriverIO are not included in this list.",
+ "dynamicExecuteMethodsDescription": "Run any execute method supported by the currently active driver and plugin(s).",
+ "methodDeprecated": "This method is deprecated",
+ "App Settings": "App Settings",
+ "unableToImportSessionFiles": "Could not import sessions from the following files: {{fileNames}}",
+ "Import from File": "Import from File",
+ "useMjpegStream": "Use MJPEG Stream",
+ "useScreenshotApi": "Use Screenshot API",
+ "Box Model": "Box Model",
+ "detachFromSession": "Detach from Session",
+ "enterSessionID": "Enter session ID for attaching manually",
+ "refreshDiscoveredSessions": "Refresh Discovered Sessions",
+ "toggleMultiDisplayMode": "Toggle Multi-Display Mode"
+}
diff --git a/app/common/public/locales/pa-IN/translation.json b/app/common/public/locales/pa-IN/translation.json
new file mode 100644
index 0000000000..9ad71e149c
--- /dev/null
+++ b/app/common/public/locales/pa-IN/translation.json
@@ -0,0 +1,331 @@
+{
+ "appiumInspector": "Appium Inspector",
+ "Edit": "Edit",
+ "Redo": "Redo",
+ "Cut": "Cut",
+ "Copy": "Copy",
+ "Paste": "Paste",
+ "Delete": "Delete",
+ "Select All": "Select All",
+ "Window": "Window",
+ "Minimize": "Minimize",
+ "Zoom": "Zoom",
+ "Zoom In": "Zoom In",
+ "Zoom Out": "Zoom Out",
+ "Reset Zoom Level": "Reset Zoom Level",
+ "Close Window": "Close Window",
+ "Bring All to Front": "Bring All to Front",
+ "Help": "Help",
+ "Appium Documentation": "Appium Documentation",
+ "Inspector Documentation": "Inspector Documentation",
+ "Appium Discussion Forum": "Appium Discussion Forum",
+ "Report Issues": "Report Issues",
+ "About Appium Inspector": "About Appium Inspector",
+ "showAppInfo": "App Version: {{appVersion}}\nElectron: {{electronVersion}}\nNode.js: {{nodejsVersion}}\n",
+ "Improve Translations": "Improve Translations",
+ "Check for Updates…": "Check for Updates…",
+ "File": "File",
+ "New Window": "New Window",
+ "Hide Appium Inspector": "Hide Appium Inspector",
+ "Hide Others": "Hide Others",
+ "Show All": "Show All",
+ "Quit Appium Inspector": "Quit Appium Inspector",
+ "Toggle Full Screen": "Toggle Full Screen",
+ "Languages": "Languages",
+ "View": "View",
+ "Reload": "Reload",
+ "Toggle Developer Tools": "Toggle Developer Tools",
+ "Undo": "Undo",
+ "Restart Now": "Restart Now",
+ "Save Server Arguments Preset": "Save Server Arguments Preset",
+ "Save": "Save",
+ "Cancel": "Cancel",
+ "updateDetails": "Release Date: {{pubDate}}\n\nRelease Notes: {{notes}}",
+ "appiumIsAvailable": "Appium Inspector {{name}} is available",
+ "updateIsBeingDownloaded": "Update is being downloaded now. You will be notified again when it is complete",
+ "updateIsDownloaded": "Appium Inspector {{releaseName}} has been downloaded. Must restart to apply the updates (note: it may take several minutes for Appium Inspector to install and restart)",
+ "updateDownloadFailed": "Failed to download update. Reason: {{message}}",
+ "OK": "OK",
+ "Install Now": "Install Now",
+ "Install Later": "Install Later",
+ "Update Download Started": "Update Download Started",
+ "No update available": "No update available",
+ "Appium Inspector is up-to-date": "Appium Inspector is up-to-date",
+ "Later": "Later",
+ "Update Downloaded": "Update Downloaded",
+ "Could not download update": "Could not download update",
+ "Unexpected Error:": "Unexpected Error:",
+ "Please report this issue at:": "Please report this issue at:",
+ "Full error trace:": "Full error trace:",
+ "Copy Error Trace": "Copy Error Trace",
+ "Inspect element": "Inspect element",
+ "Session closed due to inactivity": "Session closed due to inactivity",
+ "Session has been terminated": "Session has been terminated",
+ "frameworkNotSupported": "Framework '{{framework}}' not supported",
+ "findElementFailure": "Failed to find element for '{{methodName}}'. Please refresh page and try again.",
+ "Could not start session": "Could not start session",
+ "couldNotConnect": "Could not connect to Appium server URL '{{url}}'. Please check if the server is running and the URL is correct (valid URLs can be found at the start of the Appium server log). If you are using the Inspector's browser version, ensure the server has been started with '--allow-cors'.",
+ "Invalid URL:": "Invalid URL:",
+ "experitestAccessKey": "Experitest AccessKey",
+ "experitestUrl": "Experitest Url",
+ "locatorStrategy": "Locator Strategy:",
+ "selector": "Selector:",
+ "couldNotObtainScreenshot": "Could not obtain screenshot: {{screenshotError}}",
+ "Press Home Button": "Press Home Button",
+ "Execute Siri Command": "Execute Siri Command",
+ "Press Back Button": "Press Back Button",
+ "Press App Switch Button": "Press App Switch Button",
+ "Command": "Command",
+ "Show Element Handles": "Show Element Handles",
+ "Hide Element Handles": "Hide Element Handles",
+ "Select Elements": "Select Elements",
+ "Tap/Swipe By Coordinates": "Tap/Swipe By Coordinates",
+ "Download Screenshot": "Download Screenshot",
+ "Back": "Back",
+ "Start Refreshing Source": "Start Refreshing Source",
+ "Pause Refreshing Source": "Pause Refreshing Source",
+ "refreshSource": "Refresh Source & Screenshot",
+ "Start Recording": "Start Recording",
+ "Pause Recording": "Pause Recording",
+ "Search for element": "Search for element",
+ "App Source": "App Source",
+ "Collapse All": "Collapse All",
+ "Toggle Attributes": "Toggle Attributes",
+ "Copy XML Source to Clipboard": "Copy XML Source to Clipboard",
+ "Download Source as .XML File": "Download Source as .XML File",
+ "Copy Attributes to Clipboard": "Copy Attributes to Clipboard",
+ "Session Inactive": "Session Inactive",
+ "Keep Session Running": "Keep Session Running",
+ "Quit Session": "Quit Session",
+ "Your session is about to expire": "Your session is about to expire",
+ "Enter Keys to Send": "Enter Keys to Send",
+ "Find and Select in Source": "Find and Select in Source",
+ "Clear": "Clear",
+ "Send Keys": "Send Keys",
+ "Done": "Done",
+ "Search": "Search",
+ "Show/Hide Boilerplate Code": "Show/Hide Boilerplate Code",
+ "Copy code to clipboard": "Copy code to clipboard",
+ "Start this Kind of Session with Code": "Start this Kind of Session with Code",
+ "Clear Actions": "Clear Actions",
+ "Close Recorder": "Close Recorder",
+ "enableRecordingAndPerformActions": "Enable recording in the application header, then perform some actions to see code show up here",
+ "Recorder": "Recorder",
+ "Attribute": "Attribute",
+ "Value": "Value",
+ "Find By": "Find By",
+ "Selector": "Selector",
+ "Time": "Time (ms)",
+ "Get Timing": "Get Timing",
+ "interactionsNotAvailable": "Interactions for this element may not be available",
+ "usingXPathNotRecommended": "Using XPath locators is not recommended and can lead to fragile tests. Ask your development team to provide unique accessibility locators instead!",
+ "noAdditionalContextsFound": "No additional contexts have been detected",
+ "contextDropdownInfo": "Multiple contexts detected; certain elements might only be accessible after switching to a different context. Note that webview inspection in Appium Inspector is less accurate than the DevTools of Chrome or Safari. For more information, see:",
+ "idAutocompletionCanBeDisabled": "The requested id selector does not have a package name prefix. This Appium session has package name autocompletion enabled, which may be the reason why no elements were found. To disable this behavior, change the 'disableIdLocatorAutocompletion' setting to 'true'.",
+ "missingAutomationNameForStrategies": "Additional locator strategies may be available. To view them, add the capability 'appium:automationName' when launching the session. Note that this capability is mandatory in Appium 2.",
+ "snapshotMaxDepthReached": "This element is located at the maximum source depth {{selectedElementDepth}}, therefore its child elements (if any) are not shown. To reveal them, change the 'snapshotMaxDepth' setting to a value greater than {{selectedElementDepth}}. Check your driver documentation for the maximum supported value.",
+ "Tap": "Tap",
+ "Gathering initial app source…": "Gathering initial app source…",
+ "couldNotObtainSource": "Could not obtain source: {{errorMsg}}",
+ "iOS": "iOS",
+ "Android": "Android",
+ "desiredCapabilitiesDocumentation": "Capabilities Documentation",
+ "startSession": "Start Session",
+ "saveAs": "Save As…",
+ "attachToSession": "Attach to Session",
+ "selectedElement": "Selected Element",
+ "unnamed": "(Unnamed)",
+ "No Description": "No Description",
+ "couldNotFindEntryWithId": "Could not find an entry with ID {{id}}",
+ "couldNotFindAnyElements": "Could not find any elements",
+ "elementsCount": "Elements found:",
+ "xCoordinate": "X: {{x}}",
+ "yCoordinate": "Y: {{y}}",
+ "SauceLabs Data Center": "SauceLabs Data Center",
+ "US-West": "US West 1",
+ "US-East": "US East 4",
+ "EU-Central": "EU Central 1",
+ "proxyThroughSC": "Proxy through Sauce Connect's Selenium Relay",
+ "SSL": "SSL",
+ "text": "text",
+ "boolean": "boolean",
+ "number": "number",
+ "JSON object": "JSON object",
+ "connectToExistingSessionInstructions": "If you have an already-running session of the above server type, you can attach an inspector to it directly.",
+ "selectSessionID": "You can manually enter your session ID, or, if the server supports session discovery, simply select from a list of active sessions.",
+ "allowUnauthorizedCerts": "Allow Unauthorized Certificates",
+ "Use Proxy": "Use Proxy",
+ "JSON Representation": "JSON Representation",
+ "Capability Builder": "Capability Builder",
+ "Saved Capability Sets": "Saved Capability Sets",
+ "Attach": "Attach",
+ "localhost": "localhost",
+ "Host": "Host",
+ "Port": "Port",
+ "usingDataFoundIn": "Using data found in {{environmentVariable}}",
+ "yourUsername": "Your Username",
+ "Sauce Username": "Sauce Username",
+ "Sauce Access Key": "Sauce Access Key",
+ "yourAccessKey": "Your Access Key",
+ "yourApiKey": "Your API Key",
+ "Perfecto Host": "Perfecto Host",
+ "Perfecto Port": "Perfecto Port",
+ "Pcloudy User Name": "Pcloudy User Name",
+ "Pcloudy Host": "Pcloudy Host",
+ "Pcloudy API Key": "Pcloudy API Key",
+ "Add your token": "Add your token",
+ "Perfecto Token": "Perfecto Token",
+ "Your Kobiton Username": "Your Kobiton Username",
+ "Kobiton Access Key": "Kobiton Access Key",
+ "serverTabHeasdpinWebDriverURL": "HeadSpin Web Driver URL",
+ "sessionHeadspinWebDriverURLDescription": "Get the URL from the HeadSpin UI or the HeadSpin API using the automation configuration route",
+ "Remote Host": "Remote Host",
+ "Remote Port": "Remote Port",
+ "Remote Path": "Remote Path",
+ "BrowserStack Username": "BrowserStack Username",
+ "BrowserStack Access Key": "BrowserStack Access Key",
+ "TestMu AI Username": "TestMu AI Username",
+ "TestMu AI Access Key": "TestMu AI Access Key",
+ "Bitbar API Key": "Bitbar API Key",
+ "RemoteTestKit AccessToken": "RemoteTestKit AccessToken",
+ "RobotQA Token": "RobotQA Token",
+ "RobotActions Host": "RobotActions Host",
+ "RobotActions Token": "RobotActions Token",
+ "Add": "Add",
+ "Name": "Name",
+ "Description": "Description",
+ "Created": "Created",
+ "Actions": "Actions",
+ "searchSessions": "Search discovered sessions",
+ "Proxy URL": "Proxy URL",
+ "Source": "Source",
+ "Commands": "Commands",
+ "Execute Commands": "Execute Commands",
+ "Gestures": "Gestures",
+ "Gesture Builder": "Gesture Builder",
+ "Saved Gestures": "Saved Gestures",
+ "Create New Gesture": "Create New Gesture",
+ "gesturesDescription": "Create, save, and execute custom gestures here. Gestures are identical to action chains in the W3C WebDriver Actions API.",
+ "Session Information": "Session Information",
+ "Execute Command": "Execute Command",
+ "commandsDescription": "Run various commands using the current Appium driver. Note that not all drivers support all commands.",
+ "showMoveActionCoordsInPercentage": "Show Coordinates of Move Actions in Screen Dimension Percentages",
+ "showMoveActionCoordsInPixels": "Show Coordinates of Move Actions in Pixels",
+ "toggleMoveActionCoordPicker": "Toggle Setting Coordinates via Clicking on Screenshot",
+ "Action Type": "Action Type",
+ "Pointer Up": "Pointer Up",
+ "Pointer Down": "Pointer Down",
+ "Pause": "Pause",
+ "Move": "Move",
+ "Action Type Not Defined": "Action Type Not Defined",
+ "Duration": "Duration",
+ "Button": "Button",
+ "Untitled Gesture": "Untitled Gesture",
+ "Add Description": "Add Description",
+ "Gesture saved": "Gesture saved",
+ "Gesture saved as": "Gesture saved as '{{gestureName}}'",
+ "Duplicate pointer names are not allowed": "Duplicate pointer names are not allowed",
+ "Left": "Left",
+ "Right": "Right",
+ "Play": "Play",
+ "Export to File": "Export to File",
+ "Save Capability Set As": "Save Capability Set As…",
+ "Edit Raw JSON": "Edit Raw JSON",
+ "enterMethodParameters": "Enter Parameters for: '{{methodName}}'",
+ "invalidJson": "Invalid JSON",
+ "App Management": "App Management",
+ "File Transfer": "File Transfer",
+ "Device Interaction": "Device Interaction",
+ "Session": "Session",
+ "Web": "Web",
+ "Context": "Context",
+ "simulatorOnly": "Emulator/simulator only",
+ "minAndroidSDK": "Minimum Android SDK level",
+ "Error": "Error",
+ "findingElementInSourceFailed": "Could not find the specified element. The current application source or element ID may have changed, or there may be too many elements with the same coordinates.",
+ "callToMethodFailed": "Call to '{{methodName}}' failed",
+ "methodCallResult": "Result for: '{{methodName}}' (type: {{resultType}})",
+ "TestingBot Key": "TestingBot Key",
+ "TestingBot Secret": "TestingBot Secret",
+ "Appium Server": "Appium Server",
+ "Select Cloud Providers": "Select Cloud Providers",
+ "Advanced Settings": "Advanced Settings",
+ "Native App Mode": "Native App Mode",
+ "Web/Hybrid App Mode": "Web/Hybrid App Mode",
+ "autoAddPrefixes": "Automatically add necessary Appium vendor prefixes on start",
+ "attachSessionNotRunning": "Could not confirm that session {{attachSessId}} is running on the provided server. Please check details before trying to attach to the session again.",
+ "Mobitru WebDriver URL": "Mobitru WebDriver URL",
+ "Mobitru Billing Unit": "Mobitru Billing Unit",
+ "Mobitru Access Key": "Mobitru Access Key",
+ "Session URL": "Session URL",
+ "Server Details": "Server Details",
+ "Session Length": "Session Length",
+ "Session Details": "Session Details",
+ "Currently Active App ID": "Currently Active App ID",
+ "confirmDeletion": "Are you sure you want to delete this?",
+ "Copied!": "Copied!",
+ "Error Fetching Session URL": "Error Fetching Session URL",
+ "noRunningSessionsFound": "No running sessions found",
+ "invalidCapType": "Invalid capability type: {{type}}",
+ "whitespaceDetected": "Text Starts and/or Ends With Whitespace",
+ "duplicateCapabilityNameError": "A capability set with the same name already exists",
+ "unableToImportGestureFiles": "Could not import gestures from the following files: {{fileNames}}",
+ "invalidSessionFile": "Invalid session file",
+ "TV Labs API Key": "TV Labs API Key",
+ "TestcribeAPIKey": "Testcribe API Key",
+ "sessionTestcribeApiKeyDescription": "You can get your api key from https://app.testcribe.com/settings/apiKeys",
+ "missingVendorProperties": "Please provide the following server details for {{vendorName}}: {{vendorProps}}",
+ "missingServerInfo": "Missing server info, could not query sessions",
+ "Username": "Username",
+ "URL": "URL",
+ "WebDriver URL": "WebDriver URL",
+ "API Key": "API Key",
+ "Access Key": "Access Key",
+ "SecurityToken": "SecurityToken",
+ "AccessToken": "AccessToken",
+ "Token": "Token",
+ "Key": "Key",
+ "Secret": "Secret",
+ "Theme": "Theme",
+ "Light Theme": "Light Theme",
+ "Dark Theme": "Dark Theme",
+ "System Theme": "System Theme",
+ "Search Source": "Search Source",
+ "Matching Elements": "Matching Elements",
+ "webmateApiKey": "webmate API Key",
+ "yourProjectId": "Your Project ID",
+ "webmateProjectId": "webmate Project ID",
+ "specifyWebmateHostExplicitly": "Specify webmate host explicitly",
+ "webmateHost": "webmate Host",
+ "Enable": "Enable",
+ "yourFireflinkDevicefarmDomain": "Your Fireflink DeviceFarm Domain (e.g., cloud.fireflink.com)",
+ "yourLicenseId": "Your License ID",
+ "yourProjectName": "Your Project Name",
+ "License ID": "License ID",
+ "Project Name": "Project Name",
+ "Fireflink DeviceFarm Domain": "Fireflink DeviceFarm Domain",
+ "Fireflink DeviceFarm Access Key": "Fireflink DeviceFarm Access Key",
+ "Fireflink DeviceFarm License ID": "Fireflink DeviceFarm License ID",
+ "Fireflink DeviceFarm Project Name": "Fireflink DeviceFarm Project Name",
+ "RabbitQA API Key": "RabbitQA API Key",
+ "RestartSessionMessage": "Device Connection Lost – Restarting the Session…",
+ "ToggleRestartSession": "Toggle Session Reload Upon Device Disconnect",
+ "toggleTableFormatting": "Toggle Table Formatting",
+ "copyResultToClipboard": "Copy Result to Clipboard",
+ "Property": "Property",
+ "noCapsFound": "No session capabilities found. Please use the Capability Builder to edit, add, and save your capability set. Refer to the tutorial at {{url}}",
+ "executeMethods": "Execute Methods",
+ "dynamicCommandsDescription": "Run commands supported by the currently active driver and plugin(s). Note that some commands may only work in specific contexts. Any commands not supported by WebdriverIO are not included in this list.",
+ "dynamicExecuteMethodsDescription": "Run any execute method supported by the currently active driver and plugin(s).",
+ "methodDeprecated": "This method is deprecated",
+ "App Settings": "App Settings",
+ "unableToImportSessionFiles": "Could not import sessions from the following files: {{fileNames}}",
+ "Import from File": "Import from File",
+ "useMjpegStream": "Use MJPEG Stream",
+ "useScreenshotApi": "Use Screenshot API",
+ "Box Model": "Box Model",
+ "detachFromSession": "Detach from Session",
+ "enterSessionID": "Enter session ID for attaching manually",
+ "refreshDiscoveredSessions": "Refresh Discovered Sessions",
+ "toggleMultiDisplayMode": "Toggle Multi-Display Mode"
+}
diff --git a/assets/locales/pl/translation.json b/app/common/public/locales/pl/translation.json
similarity index 66%
rename from assets/locales/pl/translation.json
rename to app/common/public/locales/pl/translation.json
index 4300b6f802..601bdf14d6 100644
--- a/assets/locales/pl/translation.json
+++ b/app/common/public/locales/pl/translation.json
@@ -5,32 +5,31 @@
"Cut": "Wytnij",
"Copy": "Kopiuj",
"Paste": "Wklej",
- "Delete": "Delete",
+ "Delete": "Usuń",
"Select All": "Zaznacz wszystko",
"Window": "Okno",
"Minimize": "Minimalizuj",
- "Zoom": "Zoom",
- "Zoom In": "Zoom In",
- "Zoom Out": "Zoom Out",
- "Reset Zoom Level": "Reset Zoom Level",
- "Close Window": "Close Window",
- "Open Session File…": "Open Session File…",
+ "Zoom": "",
+ "Zoom In": "Przybliż",
+ "Zoom Out": "Oddal",
+ "Reset Zoom Level": "Wyzeruj poziom powiększenia",
+ "Close Window": "Zamknij okno",
"Bring All to Front": "Umieść wszystko na wierzchu",
"Help": "Pomoc",
"Appium Documentation": "Dokumentacja Appium",
"Inspector Documentation": "Dokumentacja inspektora",
- "Appium Discussion Forum": "Appium Discussion Forum",
- "Report Issues": "Report Issues",
- "About Appium Inspector": "About Appium Inspector",
+ "Appium Discussion Forum": "Forum dyskusyjne Appium",
+ "Report Issues": "Zgłoś problemy",
+ "About Appium Inspector": "O Appium Inspector",
"showAppInfo": "Wersja aplikacji: {{appVersion}}\nElectron: {{electronVersion}}\nNode.js: {{nodejsVersion}}\n",
- "Improve Translations": "Improve Translations",
- "Check for Updates…": "Check for Updates…",
+ "Improve Translations": "Popraw tłumaczenia",
+ "Check for Updates…": "Sprawdź dostępność aktualizacji…",
"File": "Plik",
- "New Window": "New Window",
- "Hide Appium Inspector": "Hide Appium Inspector",
+ "New Window": "Nowe okno",
+ "Hide Appium Inspector": "Ukryj Appium Inspector",
"Hide Others": "Ukryj pozostałe",
"Show All": "Pokaż wszystkie",
- "Quit Appium Inspector": "Quit Appium Inspector",
+ "Quit Appium Inspector": "Wyłącz Appium Inspector",
"Toggle Full Screen": "Przełącz pełny ekran",
"Languages": "Języki",
"View": "Widok",
@@ -41,7 +40,6 @@
"Save Server Arguments Preset": "Zapisz ustawienia argumentów serwera",
"Save": "Zapisz",
"Cancel": "Anuluj",
- "datetimeFormat": "D MMM YYYY h:mm",
"updateDetails": "Data wydania: {{pubDate}}\n\nInformacje o wydaniu: {{notes}}",
"appiumIsAvailable": "Dostępny jest Inspektor Appium {{name}}",
"updateIsBeingDownloaded": "Aktualizacja jest teraz pobierana. Zostaniesz powiadomiony ponownie po jej zakończeniu",
@@ -58,30 +56,21 @@
"Could not download update": "Nie można pobrać aktualizacji",
"Unexpected Error:": "Nieoczekiwany błąd:",
"Please report this issue at:": "Prosimy zgłosić ten problem na stronie:",
- "Full error trace:": "Full error trace:",
- "Copy Error Trace": "Copy Error Trace",
+ "Full error trace:": "Pełny ślad błędu:",
+ "Copy Error Trace": "Skopiuj ślad błędu",
"Inspect element": "Zbadaj element",
"Session closed due to inactivity": "Sesja zamknięta z powodu braku aktywności",
"Session has been terminated": "Sesja została zakończona",
"frameworkNotSupported": "Framework '{{framework}}' nie jest obsługiwany",
"findElementFailure": "Nie udało się znaleźć elementu dla '{{methodName}}'. Odśwież stronę i spróbuj ponownie.",
"Could not start session": "Nie można uruchomić sesji",
- "couldNotConnect": "Could not connect to Appium server URL '{{url}}'. Please check if the server is running and the URL is correct (valid URLs can be found at the start of the Appium server log). If you are using the Inspector's browser version, ensure the server has been started with '--allow-cors'.",
+ "couldNotConnect": "Nie można było połączyć się z URL serwera Appium '{{url}}'. Sprawdź, czy serwer działa poprawnie i adres URL jest prawidłowy (listę adresów URL można znaleźć na początku logów serwera Appium). Jeśli używasz Inspectora w wersji przeglądarkowej, upewnij się, że serwer został uruchomiony z argumentem '--allow-cors'.",
"Invalid URL:": "Nieprawidłowy adres URL:",
- "sauceCredentialsRequired": "Nazwa użytkownika i klucz dostępu Sauce są wymagane!",
- "testingbotCredentialsRequired": "Klucz i sekret TestingBota są wymagane!",
- "Perfecto SecurityToken is required": "Wymagany jest Perfecto SecurityToken",
- "browserstackCredentialsRequired": "Login i klucz dostępu do Browserstack są wymagane!",
- "lambdatestCredentialsRequired": "Nazwa użytkownika i klucz dostępu Lambdatest są wymagane!",
- "bitbarCredentialsRequired": "Wymagany klucz API Bitbar!",
- "kobitonCredentialsRequired": "Nazwa użytkownika i klucz API KOBITON są wymagane!",
- "experitestAccessKeyURLRequired": "Klucz dostępu i adres URL Experitest są wymagane",
"experitestAccessKey": "Klucz dostępu Experitest",
"experitestUrl": "Adres URL Experitest",
"locatorStrategy": "Strategia lokalizacji:",
"selector": "Selektor:",
"couldNotObtainScreenshot": "Nie można uzyskać zrzutu ekranu: {{screenshotError}}",
- "selectElementInSource": "Wybierz element w źródle, aby rozpocząć.",
"Press Home Button": "Naciśnij przycisk domowy",
"Execute Siri Command": "Wykonaj polecenie Siri",
"Press Back Button": "Naciśnij przycisk Wstecz",
@@ -90,7 +79,7 @@
"Show Element Handles": "Pokaż uchwyty elementu",
"Hide Element Handles": "Ukryj uchwyty elementu",
"Select Elements": "Wybierz elementy",
- "Tap/Swipe By Coordinates": "Tap/Swipe By Coordinates",
+ "Tap/Swipe By Coordinates": "Naciśnij/Przesuń na podstawie współrzędnych",
"Download Screenshot": "Pobierz zrzut ekranu",
"Back": "Wstecz",
"Start Refreshing Source": "Rozpocznij odświeżanie źródła",
@@ -100,11 +89,11 @@
"Pause Recording": "Wstrzymaj nagrywanie",
"Search for element": "Szukaj elementu",
"App Source": "Źródło aplikacji",
+ "Collapse All": "Collapse All",
"Toggle Attributes": "Przełącz atrybuty",
"Copy XML Source to Clipboard": "Skopiuj źródło XML do schowka",
"Download Source as .XML File": "Pobierz źródło jako plik .XML",
"Copy Attributes to Clipboard": "Kopiuj atrybuty do schowka",
- "quitSessionAndClose": "Zakończ sesję i zamknij inspektor",
"Session Inactive": "Sesja nieaktywna",
"Keep Session Running": "Kontynuuj sesję",
"Quit Session": "Zakończ sesję",
@@ -115,7 +104,7 @@
"Send Keys": "Wyślij klucze",
"Done": "Gotowe",
"Search": "Szukaj",
- "Show/Hide Boilerplate Code": "Show/Hide Boilerplate Code",
+ "Show/Hide Boilerplate Code": "Pokaż/Ukryj przykładowy kod",
"Copy code to clipboard": "Skopiuj kod do schowka",
"Start this Kind of Session with Code": "Start this Kind of Session with Code",
"Clear Actions": "Wyczyść akcje",
@@ -132,8 +121,9 @@
"usingXPathNotRecommended": "Using XPath locators is not recommended and can lead to fragile tests. Ask your development team to provide unique accessibility locators instead!",
"noAdditionalContextsFound": "No additional contexts have been detected",
"contextDropdownInfo": "Multiple contexts detected; certain elements might only be accessible after switching to a different context. Note that webview inspection in Appium Inspector is less accurate than the DevTools of Chrome or Safari. For more information, see:",
- "idAutocompletionCanBeDisabled": "The requested id selector does not have a package name prefix. This Appium session has package name autocompletion enabled, which may be the reason why no elements were found. To disable this behavior, relaunch this session with the capability 'appium:disableIdLocatorAutocompletion' set to 'true'.",
+ "idAutocompletionCanBeDisabled": "The requested id selector does not have a package name prefix. This Appium session has package name autocompletion enabled, which may be the reason why no elements were found. To disable this behavior, change the 'disableIdLocatorAutocompletion' setting to 'true'.",
"missingAutomationNameForStrategies": "Additional locator strategies may be available. To view them, add the capability 'appium:automationName' when launching the session. Note that this capability is mandatory in Appium 2.",
+ "snapshotMaxDepthReached": "This element is located at the maximum source depth {{selectedElementDepth}}, therefore its child elements (if any) are not shown. To reveal them, change the 'snapshotMaxDepth' setting to a value greater than {{selectedElementDepth}}. Check your driver documentation for the maximum supported value.",
"Tap": "Naciśnij",
"Gathering initial app source…": "Gathering initial app source…",
"couldNotObtainSource": "Could not obtain source: {{errorMsg}}",
@@ -161,15 +151,14 @@
"boolean": "boolean",
"number": "numer",
"JSON object": "Obiekt JSON",
- "filepath": "ścieżka pliku",
"connectToExistingSessionInstructions": "Jeśli masz już uruchomioną sesję powyższego typu serwera, możesz do niej bezpośrednio dołączyć inspektora.",
- "selectSessionIDInDropdown": "Wybierz ID sesji z rozwijanej listy poniżej.",
+ "selectSessionID": "You can manually enter your session ID, or, if the server supports session discovery, simply select from a list of active sessions.",
"allowUnauthorizedCerts": "Zezwalaj na nieautoryzowane certyfikaty",
"Use Proxy": "Użyj serwera proxy",
"JSON Representation": "JSON Representation",
"Capability Builder": "Capability Builder",
"Saved Capability Sets": "Zapisane zestawy możliwości",
- "Attach to Session": "Dołącz do sesji…",
+ "Attach": "Attach",
"localhost": "localhost",
"Host": "Host",
"Port": "Port",
@@ -195,16 +184,19 @@
"Remote Path": "Zdalna ścieżka",
"BrowserStack Username": "Nazwa użytkownika BrowserStack",
"BrowserStack Access Key": "Klucz dostępu BrowserStack",
- "LambdaTest Username": "Nazwa użytkownika LambdaTest",
- "LambdaTest Access Key": "Klucz dostępu LambdaTest",
+ "TestMu AI Username": "TestMu AI Username",
+ "TestMu AI Access Key": "TestMu AI Access Key",
"Bitbar API Key": "Klucz API Bitbar",
"RemoteTestKit AccessToken": "Token dostępu RemoteTestKit",
"RobotQA Token": "Token RobotQA",
+ "RobotActions Host": "RobotActions Host",
+ "RobotActions Token": "RobotActions Token",
+ "Add": "Add",
"Name": "Nazwa",
"Description": "Description",
"Created": "Created",
"Actions": "Actions",
- "enterYourSessionId": "Wprowadź tutaj ID sesji",
+ "searchSessions": "Search discovered sessions",
"Proxy URL": "Adres URL serwera proxy",
"Source": "Źródło",
"Commands": "Komendy",
@@ -212,12 +204,14 @@
"Gestures": "Gesty",
"Gesture Builder": "Kreator gestów",
"Saved Gestures": "Zapisane gesty",
+ "Create New Gesture": "Create New Gesture",
"gesturesDescription": "Create, save, and execute custom gestures here. Gestures are identical to action chains in the W3C WebDriver Actions API.",
"Session Information": "Informacje o sesji",
"Execute Command": "Wykonaj komendę",
"commandsDescription": "Run various commands using the current Appium driver. Note that not all drivers support all commands.",
- "Click to Set Coordinates": "Kliknij, aby ustawić współrzędne",
- "Set Coordinates Via Field": "Ustaw współrzędne przez pola",
+ "showMoveActionCoordsInPercentage": "Show Coordinates of Move Actions in Screen Dimension Percentages",
+ "showMoveActionCoordsInPixels": "Show Coordinates of Move Actions in Pixels",
+ "toggleMoveActionCoordPicker": "Toggle Setting Coordinates via Clicking on Screenshot",
"Action Type": "Rodzaj czynności",
"Pointer Up": "Pointer Up",
"Pointer Down": "Pointer Down",
@@ -234,29 +228,23 @@
"Left": "Lewo",
"Right": "Prawo",
"Play": "Odtwórz",
+ "Export to File": "Export to File",
"Save Capability Set As": "Zapisz zestaw możliwości jako…",
"Edit Raw JSON": "Edytuj Raw JSON",
- "Enter Parameters for:": "Wprowadź parametry dla:",
+ "enterMethodParameters": "Enter Parameters for: '{{methodName}}'",
"invalidJson": "Nieprawidłowy JSON",
- "Execute Script": "Wykonaj skrypt",
"App Management": "Zarządzanie aplikacjami",
- "Clipboard": "Schowek",
"File Transfer": "Przesyłanie plików",
"Device Interaction": "Interakcja urządzenia",
- "Keyboard": "Klawiatura",
- "Connectivity": "Łączność",
- "Performance Data": "Dane o wydajności",
- "System": "System",
"Session": "Sesja",
"Web": "Przeglądarka",
"Context": "Kontekst",
- "Window (W3C)": "Okno (W3C)",
"simulatorOnly": "Tylko emulator/symulator",
"minAndroidSDK": "Minimalny poziom SDK systemu Android",
"Error": "Błąd",
"findingElementInSourceFailed": "Could not find the specified element. The current application source or element ID may have changed, or there may be too many elements with the same coordinates.",
"callToMethodFailed": "Połączenie do '{{methodName}}' nie powiodło się",
- "methodCallResult": "wynik '{{methodName}}'",
+ "methodCallResult": "Result for: '{{methodName}}' (type: {{resultType}})",
"TestingBot Key": "Klucz TestingBot",
"TestingBot Secret": "TestingBot Secret",
"Appium Server": "Serwer Appium",
@@ -269,17 +257,75 @@
"Mobitru WebDriver URL": "Adres URL Mobitru WebDriver",
"Mobitru Billing Unit": "Jednostka rozliczeniowa Mobitru",
"Mobitru Access Key": "Klucz dostępu Mobitru",
- "mobitruCredentialsRequired": "Klucz dostępu Mobitru jest wymagany",
"Session URL": "Session URL",
"Server Details": "Server Details",
"Session Length": "Session Length",
"Session Details": "Session Details",
"Currently Active App ID": "Currently Active App ID",
- "Session ID": "Session ID",
"confirmDeletion": "Are you sure you want to delete this?",
"Copied!": "Copied!",
"Error Fetching Session URL": "Error Fetching Session URL",
- "noResultsFound": "No results found",
+ "noRunningSessionsFound": "No running sessions found",
"invalidCapType": "Invalid capability type: {{type}}",
- "whitespaceDetected": "Text Starts and/or Ends With Whitespace"
+ "whitespaceDetected": "Text Starts and/or Ends With Whitespace",
+ "duplicateCapabilityNameError": "A capability set with the same name already exists",
+ "unableToImportGestureFiles": "Could not import gestures from the following files: {{fileNames}}",
+ "invalidSessionFile": "Invalid session file",
+ "TV Labs API Key": "TV Labs API Key",
+ "TestcribeAPIKey": "Testcribe API Key",
+ "sessionTestcribeApiKeyDescription": "You can get your api key from https://app.testcribe.com/settings/apiKeys",
+ "missingVendorProperties": "Please provide the following server details for {{vendorName}}: {{vendorProps}}",
+ "missingServerInfo": "Missing server info, could not query sessions",
+ "Username": "Username",
+ "URL": "URL",
+ "WebDriver URL": "WebDriver URL",
+ "API Key": "API Key",
+ "Access Key": "Access Key",
+ "SecurityToken": "SecurityToken",
+ "AccessToken": "AccessToken",
+ "Token": "Token",
+ "Key": "Key",
+ "Secret": "Secret",
+ "Theme": "Theme",
+ "Light Theme": "Light Theme",
+ "Dark Theme": "Dark Theme",
+ "System Theme": "System Theme",
+ "Search Source": "Search Source",
+ "Matching Elements": "Matching Elements",
+ "webmateApiKey": "webmate API Key",
+ "yourProjectId": "Your Project ID",
+ "webmateProjectId": "webmate Project ID",
+ "specifyWebmateHostExplicitly": "Specify webmate host explicitly",
+ "webmateHost": "webmate Host",
+ "Enable": "Enable",
+ "yourFireflinkDevicefarmDomain": "Your Fireflink DeviceFarm Domain (e.g., cloud.fireflink.com)",
+ "yourLicenseId": "Your License ID",
+ "yourProjectName": "Your Project Name",
+ "License ID": "License ID",
+ "Project Name": "Project Name",
+ "Fireflink DeviceFarm Domain": "Fireflink DeviceFarm Domain",
+ "Fireflink DeviceFarm Access Key": "Fireflink DeviceFarm Access Key",
+ "Fireflink DeviceFarm License ID": "Fireflink DeviceFarm License ID",
+ "Fireflink DeviceFarm Project Name": "Fireflink DeviceFarm Project Name",
+ "RabbitQA API Key": "RabbitQA API Key",
+ "RestartSessionMessage": "Device Connection Lost – Restarting the Session…",
+ "ToggleRestartSession": "Toggle Session Reload Upon Device Disconnect",
+ "toggleTableFormatting": "Toggle Table Formatting",
+ "copyResultToClipboard": "Copy Result to Clipboard",
+ "Property": "Property",
+ "noCapsFound": "No session capabilities found. Please use the Capability Builder to edit, add, and save your capability set. Refer to the tutorial at {{url}}",
+ "executeMethods": "Execute Methods",
+ "dynamicCommandsDescription": "Run commands supported by the currently active driver and plugin(s). Note that some commands may only work in specific contexts. Any commands not supported by WebdriverIO are not included in this list.",
+ "dynamicExecuteMethodsDescription": "Run any execute method supported by the currently active driver and plugin(s).",
+ "methodDeprecated": "This method is deprecated",
+ "App Settings": "App Settings",
+ "unableToImportSessionFiles": "Could not import sessions from the following files: {{fileNames}}",
+ "Import from File": "Import from File",
+ "useMjpegStream": "Use MJPEG Stream",
+ "useScreenshotApi": "Use Screenshot API",
+ "Box Model": "Box Model",
+ "detachFromSession": "Detach from Session",
+ "enterSessionID": "Enter session ID for attaching manually",
+ "refreshDiscoveredSessions": "Refresh Discovered Sessions",
+ "toggleMultiDisplayMode": "Toggle Multi-Display Mode"
}
diff --git a/assets/locales/pt-BR/translation.json b/app/common/public/locales/pt-BR/translation.json
similarity index 68%
rename from assets/locales/pt-BR/translation.json
rename to app/common/public/locales/pt-BR/translation.json
index ba4b61d888..f2886feb16 100644
--- a/assets/locales/pt-BR/translation.json
+++ b/app/common/public/locales/pt-BR/translation.json
@@ -14,7 +14,6 @@
"Zoom Out": "Diminuir zoom",
"Reset Zoom Level": "Redefinir nível de zoom",
"Close Window": "Fechar Janela",
- "Open Session File…": "Abrir Arquivo de Sessão…",
"Bring All to Front": "Trazer Tudo para Frente",
"Help": "Ajuda",
"Appium Documentation": "• Documentação do Appium",
@@ -41,7 +40,6 @@
"Save Server Arguments Preset": "Salvar Preset de Argumentos do Servidor",
"Save": "Salvar",
"Cancel": "Cancelar",
- "datetimeFormat": "DD de MMMM de YYYY hh:mm",
"updateDetails": "Data de Lançamento: {{pubDate}}\n\nNotas de Lançamento: {{notes}}",
"appiumIsAvailable": "Inspetor do Appium {{name}} está disponível",
"updateIsBeingDownloaded": "A atualização está sendo baixada agora. Você será notificado novamente quando estiver concluída",
@@ -68,20 +66,11 @@
"Could not start session": "Não foi possível iniciar a sessão",
"couldNotConnect": "Não foi possível conectar-se ao URL do servidor Appium '{{url}}'. Verifique se o servidor está em execução e se o URL está correto (URLs válidos podem ser encontrados no início do log do servidor Appium). Se você estiver usando a versão do navegador do Inspector, certifique-se de que o servidor tenha sido iniciado com '--allow-cors'.",
"Invalid URL:": "URL inválida:",
- "sauceCredentialsRequired": "Nome de usuário e chave de acesso SauceLabs são necessários!",
- "testingbotCredentialsRequired": "Chave e segredo do TestingBot são necessários!",
- "Perfecto SecurityToken is required": "Perfecto SecurityToken é necessário",
- "browserstackCredentialsRequired": "Nome de usuário e chave de acesso BrowserStack são necessários!",
- "lambdatestCredentialsRequired": "Nome de usuário e chave de acesso Lambdatest são necessários!",
- "bitbarCredentialsRequired": "Chave API do Bitbar necessária!",
- "kobitonCredentialsRequired": "É necessário o nome de usuário e a chave de api do KOBITON!",
- "experitestAccessKeyURLRequired": "Experitest AccessKey e URL são necessários",
"experitestAccessKey": "Experitest AccessKey",
"experitestUrl": "Experitest Url",
"locatorStrategy": "Estratégia de Localizadores:",
"selector": "Seletor:",
"couldNotObtainScreenshot": "Não foi possível obter captura de tela: {{screenshotError}}",
- "selectElementInSource": "Selecione um elemento no código fonte para começar.",
"Press Home Button": "Pressione o botão Home",
"Execute Siri Command": "Executar Comando Siri",
"Press Back Button": "Pressione o botão voltar",
@@ -90,7 +79,7 @@
"Show Element Handles": "Mostrar Identificadores de Elementos",
"Hide Element Handles": "Ocultar Identificadores de Elementos",
"Select Elements": "Selecionar Elementos",
- "Tap/Swipe By Coordinates": "Toque/deslize por coordenadas.",
+ "Tap/Swipe By Coordinates": "Toque/deslize por coordenadas",
"Download Screenshot": "Baixar Captura de Tela",
"Back": "Voltar",
"Start Refreshing Source": "Iniciar Atualização do Código Fonte",
@@ -100,11 +89,11 @@
"Pause Recording": "Pausar gravação",
"Search for element": "Pesquisar por elemento",
"App Source": "Fonte do aplicativo",
+ "Collapse All": "Recolher Todos",
"Toggle Attributes": "Alternar Atributos",
"Copy XML Source to Clipboard": "Copiar Código XML para Área de Transferência",
"Download Source as .XML File": "Baixar Fonte como Arquivo .XML",
"Copy Attributes to Clipboard": "Copiar Atributos para Área de Transferência",
- "quitSessionAndClose": "Sair da sessão e Fechar Inspetor",
"Session Inactive": "Sessão inativa",
"Keep Session Running": "Manter sessão em execução",
"Quit Session": "Sair da Sessão",
@@ -120,7 +109,7 @@
"Start this Kind of Session with Code": "Inicie este tipo de sessão com código",
"Clear Actions": "Limpar Ações",
"Close Recorder": "Fechar Gravador",
- "enableRecordingAndPerformActions": "Enable recording in the application header, then perform some actions to see code show up here",
+ "enableRecordingAndPerformActions": "Ative a gravação no cabeçalho do aplicativo e, em seguida, execute algumas ações para ver o código exibido aqui",
"Recorder": "Gravador",
"Attribute": "Atributo",
"Value": "Valor",
@@ -132,8 +121,9 @@
"usingXPathNotRecommended": "Usar localizadores XPath não é recomendado e pode levar a testes frágeis. Peça a sua equipe de desenvolvimento para fornecer localizadores de acessibilidade únicos!",
"noAdditionalContextsFound": "Nenhum contexto adicional foi detectado",
"contextDropdownInfo": "Múltiplos contextos detectados; certos elementos só podem ser acessíveis após mudar para um contexto diferente. Note que a inspeção da web no Appium Inspector é menos precisa do que o DevTools do Chrome ou do Safari. Para mais informações, consulte:",
- "idAutocompletionCanBeDisabled": "O seletor de ID solicitado não tem um prefixo de nome de pacote. Esta sessão Appium tem a auto-completar do nome de pacote habilitada, que pode ser a razão pela qual nenhum elemento foi encontrado. Para desativar esse comportamento, reinicie esta sessão com o recurso 'appium:disableIdLocatorAutocompletion' definido como 'true'.",
+ "idAutocompletionCanBeDisabled": "O id de seletor solicitado não tem um prefixo de nome de pacote. Esta sessão Appium tem a auto-conclusão do nome de pacote habilitada, que pode ser a razão pela qual nenhum elemento foi encontrado. Para desativar esse comportamento, altere a definição 'disableIdLocatorAutocompletion' para 'true'.",
"missingAutomationNameForStrategies": "Estratégias de localizador adicionais podem estar disponíveis. Para visualizá-las, adicione o recurso 'appium:automationName' ao iniciar a sessão. Note que este recurso é obrigatório no Appium 2.",
+ "snapshotMaxDepthReached": "Esse elemento está localizado na profundidade máxima da fonte {{selectedElementDepth}}, portanto seus elementos filhos (se houver) não serão mostrados. Para revelá-los, altere a configuração 'snapshotMaxDepth' para um valor maior que {{selectedElementDepth}}. Verifique sua documentação de driver para ver o valor máximo suportado.",
"Tap": "Tocar",
"Gathering initial app source…": "Coletando o fonte inicial do app…",
"couldNotObtainSource": "Não foi possível obter o fonte: {{errorMsg}}",
@@ -161,15 +151,14 @@
"boolean": "boleano",
"number": "número",
"JSON object": "Objeto JSON",
- "filepath": "caminho do arquivo",
"connectToExistingSessionInstructions": "Se você já tiver uma sessão em execução do tipo de servidor acima, você pode anexar um inspetor diretamente a ele.",
- "selectSessionIDInDropdown": "Selecione o ID da sessão no dropdown abaixo.",
+ "selectSessionID": "You can manually enter your session ID, or, if the server supports session discovery, simply select from a list of active sessions.",
"allowUnauthorizedCerts": "Permitir Certificados Não Autorizados",
"Use Proxy": "Usar Proxy",
"JSON Representation": "Representação JSON",
- "Capability Builder": "Capability Builder",
+ "Capability Builder": "Construtor de Recursos",
"Saved Capability Sets": "Conjuntos de Recursos Salvos",
- "Attach to Session": "Anexar à Sessão…",
+ "Attach": "Attach",
"localhost": "localhost",
"Host": "Host",
"Port": "Porta",
@@ -195,16 +184,19 @@
"Remote Path": "Caminho Remoto",
"BrowserStack Username": "Nome de usuário do BrowserStack",
"BrowserStack Access Key": "Chave de acesso BrowserStack",
- "LambdaTest Username": "Nome de usuário do LambdaTest",
- "LambdaTest Access Key": "Chave de Acesso LambdaTest",
+ "TestMu AI Username": "Usuário TestMu AI",
+ "TestMu AI Access Key": "Chave de acesso TestMu AI",
"Bitbar API Key": "Chave API da Bitbar",
"RemoteTestKit AccessToken": "Token de Acesso Remoto TestKit",
"RobotQA Token": "Token de RobotQA",
+ "RobotActions Host": "RobotActions Host",
+ "RobotActions Token": "RobotActions Token",
+ "Add": "Adicionar",
"Name": "Nome",
"Description": "Descrição",
"Created": "Criado",
"Actions": "Ações",
- "enterYourSessionId": "Digite seu ID da sessão aqui",
+ "searchSessions": "Pesquisar sessões descobertas",
"Proxy URL": "URL do proxy",
"Source": "Fonte",
"Commands": "Comandos",
@@ -212,12 +204,14 @@
"Gestures": "Gestos",
"Gesture Builder": "Construtor de Gesto",
"Saved Gestures": "Gestos salvos",
+ "Create New Gesture": "Criar novo gesto",
"gesturesDescription": "Crie, salve e execute gestos personalizados aqui. Gestos são idênticos às cadeias de ações na API de ações do W3C WebDriver.",
"Session Information": "Informações da Sessão",
"Execute Command": "Executar Comando",
"commandsDescription": "Executa vários comandos usando o driver de Appium. Observe que nem todos os drivers suportam todos os comandos.",
- "Click to Set Coordinates": "Clique para definir coordenadas",
- "Set Coordinates Via Field": "Definir Coordenadas Via Campo",
+ "showMoveActionCoordsInPercentage": "Mostrar Coordenadas de Ações de Mover no Percentual de Dimensão da Tela",
+ "showMoveActionCoordsInPixels": "Mostrar Coordenadas das Ações de mover em Pixels",
+ "toggleMoveActionCoordPicker": "Alternar Configurações de Coordenadas clicando na Captura de Tela",
"Action Type": "Tipo da Ação",
"Pointer Up": "Liberar toque",
"Pointer Down": "Tocar e segurar",
@@ -234,29 +228,23 @@
"Left": "Esquerda",
"Right": "Direita",
"Play": "Executar",
+ "Export to File": "Exportar para Arquivo",
"Save Capability Set As": "Salvar Conjunto de Recursos como…",
"Edit Raw JSON": "Editar JSON bruto",
- "Enter Parameters for:": "Digite os parâmetros para:",
+ "enterMethodParameters": "Inserir parâmetros para: '{{methodName}}'",
"invalidJson": "JSON inválido",
- "Execute Script": "Executar script",
"App Management": "Gerenciamento de aplicativos",
- "Clipboard": "Área de Transferência",
"File Transfer": "Transferência de Arquivo",
"Device Interaction": "Interação do dispositivo",
- "Keyboard": "Teclado",
- "Connectivity": "Conectividade",
- "Performance Data": "Dados de desempenho",
- "System": "Sistema",
"Session": "Sessão",
"Web": "Web",
"Context": "Contexto",
- "Window (W3C)": "Janela (W3C)",
"simulatorOnly": "Somente emulador/simulador",
"minAndroidSDK": "Nível mínimo de SDK do Android",
"Error": "Erro",
"findingElementInSourceFailed": "Não foi possível encontrar o elemento especificado. O ID atual do aplicativo fonte ou do elemento pode ter sido alterado, ou pode haver muitos elementos com as mesmas coordenadas.",
"callToMethodFailed": "Chamada para '{{methodName}}' falhou",
- "methodCallResult": "resultado '{{methodName}}'",
+ "methodCallResult": "Resultado para: '{{methodName}}' (tipo: {{resultType}})",
"TestingBot Key": "Chave TestingBot",
"TestingBot Secret": "Segredo TestingBot",
"Appium Server": "Servidor Appium",
@@ -266,20 +254,78 @@
"Web/Hybrid App Mode": "Modo Web / Híbrido do App",
"autoAddPrefixes": "Adicionar automaticamente os prefixos necessários do fornecedor de Appium ao iniciar",
"attachSessionNotRunning": "Não foi possível confirmar que a sessão {{attachSessId}} está em execução no servidor fornecido. Por favor, verifique os detalhes antes de tentar anexar a sessão novamente.",
- "Mobitru WebDriver URL": "Mobitru WebDriver URL",
- "Mobitru Billing Unit": "Mobitru Billing Unit",
- "Mobitru Access Key": "Mobitru Access Key",
- "mobitruCredentialsRequired": "Mobitru Access Key is required",
+ "Mobitru WebDriver URL": "URL do WebDrive Mobitru",
+ "Mobitru Billing Unit": "Unidade de Cobrança Mobitru",
+ "Mobitru Access Key": "Chave de Acesso Mobitru",
"Session URL": "URL da sessão",
"Server Details": "Detalhes do servidor",
"Session Length": "Duração da Sessão",
"Session Details": "Detalhes da Sessão",
"Currently Active App ID": "ID do App ativo atualmente",
- "Session ID": "ID da sessão",
"confirmDeletion": "Você tem certeza de que deseja apagar isto?",
"Copied!": "Copiado!",
"Error Fetching Session URL": "Erro ao buscar URL da sessão",
- "noResultsFound": "Nenhum resultado encontrado",
+ "noRunningSessionsFound": "Nenhuma sessão em execução encontrada",
"invalidCapType": "Tipo de recurso inválido: {{type}}",
- "whitespaceDetected": "Texto começa e/ou termina com espaço em branco"
+ "whitespaceDetected": "Texto começa e/ou termina com espaço em branco",
+ "duplicateCapabilityNameError": "Já existe um conjunto de recursos com o mesmo nome",
+ "unableToImportGestureFiles": "Não foi possível importar os gestos dos seguintes arquivos: {{fileNames}}",
+ "invalidSessionFile": "Arquivo de sessão inválido",
+ "TV Labs API Key": "Chave API do TV Labs",
+ "TestcribeAPIKey": "Chave API do Testcribe",
+ "sessionTestcribeApiKeyDescription": "Você pode obter sua chave de api em https://app.testcribe.com/settings/apiKeys",
+ "missingVendorProperties": "Por favor, forneça os seguintes detalhes do servidor para {{vendorName}}: {{vendorProps}}",
+ "missingServerInfo": "Informações do servidor faltando, não foi possível pesquisar por sessões",
+ "Username": "Nome de Usuário",
+ "URL": "URL",
+ "WebDriver URL": "URL do WebDrive",
+ "API Key": "Chave de API",
+ "Access Key": "Chave de Acesso",
+ "SecurityToken": "Token de Segurança",
+ "AccessToken": "Token de Acesso",
+ "Token": "Token",
+ "Key": "Chave",
+ "Secret": "Segredo",
+ "Theme": "Tema",
+ "Light Theme": "Tema Claro",
+ "Dark Theme": "Tema Escuro",
+ "System Theme": "Tema do Sistema",
+ "Search Source": "Procurar Fonte",
+ "Matching Elements": "Elementos correspondentes",
+ "webmateApiKey": "Chave de API da Webmate",
+ "yourProjectId": "ID do seu Projeto",
+ "webmateProjectId": "ID do Projeto Webmate",
+ "specifyWebmateHostExplicitly": "Especificar host Webmate explicitamente",
+ "webmateHost": "Host Webmate",
+ "Enable": "Ativar",
+ "yourFireflinkDevicefarmDomain": "Seu domínio DeviceFarm Fireflink (por exemplo, cloud.fireflink.com)",
+ "yourLicenseId": "Seu ID da licença",
+ "yourProjectName": "Nome do seu projeto",
+ "License ID": "ID da licença",
+ "Project Name": "Nome do Projeto",
+ "Fireflink DeviceFarm Domain": "Domínio da DeviceFarm Fireflink",
+ "Fireflink DeviceFarm Access Key": "Chave de acesso da DeviceFarm Fireflink",
+ "Fireflink DeviceFarm License ID": "ID da licença da DeviceFarm Fireflink",
+ "Fireflink DeviceFarm Project Name": "Nome do Projeto da DeviceFarm Fireflink",
+ "RabbitQA API Key": "Chave da API RabbitQA",
+ "RestartSessionMessage": "Conexão com dispositivo perdida - Reiniciando a Sessão…",
+ "ToggleRestartSession": "Disparar recarregamento de sessão após desconectar dispositivo",
+ "toggleTableFormatting": "Alternar formatação da tabela",
+ "copyResultToClipboard": "Copiar Resultado para Área de Transferência",
+ "Property": "Propriedade",
+ "noCapsFound": "Nenhum recurso de sessão encontrado. Por favor, use o Criador de recursos para editar, adicionar e salvar seu conjunto de recursos. Consulte o tutorial em {{url}}",
+ "executeMethods": "Executar Métodos",
+ "dynamicCommandsDescription": "Execute comandos suportados pelo driver ativo atualmente e plugin(s). Observe que alguns comandos só podem funcionar em contextos específicos. Qualquer comando não suportado pelo WebdriverIO não está incluído nesta lista.",
+ "dynamicExecuteMethodsDescription": "Execute qualquer método de execução suportado pelos driver e plugin(s) ativos atualmente.",
+ "methodDeprecated": "Este método está obsoleto",
+ "App Settings": "Configurações do Aplicativo",
+ "unableToImportSessionFiles": "Não foi possível importar os gestos dos seguintes arquivos: {{fileNames}}",
+ "Import from File": "Importar de Arquivo",
+ "useMjpegStream": "Usar stream MJPEG",
+ "useScreenshotApi": "Usar API de Captura de tela",
+ "Box Model": "Modelo da caixa",
+ "detachFromSession": "Desanexar da sessão",
+ "enterSessionID": "Insira a ID de sessão para anexar manualmente",
+ "refreshDiscoveredSessions": "Atualizar Sessões Descobertas",
+ "toggleMultiDisplayMode": "Ativar/desativar Modo Exibição Múltipla"
}
diff --git a/assets/locales/pt-PT/translation.json b/app/common/public/locales/pt-PT/translation.json
similarity index 73%
rename from assets/locales/pt-PT/translation.json
rename to app/common/public/locales/pt-PT/translation.json
index add6c10e25..b63f0015ba 100644
--- a/assets/locales/pt-PT/translation.json
+++ b/app/common/public/locales/pt-PT/translation.json
@@ -14,7 +14,6 @@
"Zoom Out": "Zoom Out",
"Reset Zoom Level": "Reset Zoom Level",
"Close Window": "Close Window",
- "Open Session File…": "Open Session File…",
"Bring All to Front": "Trazer Tudo para Frente",
"Help": "Ajuda",
"Appium Documentation": "Documentação do Appium",
@@ -41,7 +40,6 @@
"Save Server Arguments Preset": "Salvar predefinição de argumentos do servidor",
"Save": "Salvar",
"Cancel": "Cancelar",
- "datetimeFormat": "D MMM YYYY, h:m",
"updateDetails": "Data de Lançamento: {{pubDate}}\n\nNotas de Lançamento: {{notes}}",
"appiumIsAvailable": "Inspetor Appium {{name}} está disponível",
"updateIsBeingDownloaded": "A atualização está sendo baixada agora. Você será notificado novamente quando estiver concluída",
@@ -68,20 +66,11 @@
"Could not start session": "Não foi possível iniciar a sessão",
"couldNotConnect": "Could not connect to Appium server URL '{{url}}'. Please check if the server is running and the URL is correct (valid URLs can be found at the start of the Appium server log). If you are using the Inspector's browser version, ensure the server has been started with '--allow-cors'.",
"Invalid URL:": "Invalid URL:",
- "sauceCredentialsRequired": "Nome de usuário e chave de acesso Sauce são necessários!",
- "testingbotCredentialsRequired": "TestingBot key and secret are required!",
- "Perfecto SecurityToken is required": "Perfecto SecurityToken is required",
- "browserstackCredentialsRequired": "Nome de usuário e chave de acesso Browserstack são necessários!",
- "lambdatestCredentialsRequired": "Nome de usuário e chave de acesso Lambdatest são necessários!",
- "bitbarCredentialsRequired": "Chave da API Bitbar necessária!",
- "kobitonCredentialsRequired": "Nome de usuário e chave de API KOBITON são necessários!",
- "experitestAccessKeyURLRequired": "Chaves de acesso Experitest e URL são necessários",
"experitestAccessKey": "Chave de acesso Experitest",
"experitestUrl": "Experitest Url",
"locatorStrategy": "Locator Strategy:",
"selector": "Seletor:",
"couldNotObtainScreenshot": "Could not obtain screenshot: {{screenshotError}}",
- "selectElementInSource": "Select an element in the source to begin.",
"Press Home Button": "Pressione o botão Home",
"Execute Siri Command": "Executar Comando Siri",
"Press Back Button": "Pressione o botão Voltar",
@@ -100,11 +89,11 @@
"Pause Recording": "Pausar Gravação",
"Search for element": "Procurar pelo elemento",
"App Source": "Fonte do aplicativo",
+ "Collapse All": "Collapse All",
"Toggle Attributes": "Alternar atributos",
"Copy XML Source to Clipboard": "Copiar XML Fonte para Área de Transferência",
"Download Source as .XML File": "Baixar Fonte como Arquivo .XML",
"Copy Attributes to Clipboard": "Copiar Atributos para Área de Transferência",
- "quitSessionAndClose": "Sair da Sessão & Fechar o Inspetor",
"Session Inactive": "Sessão Inativa",
"Keep Session Running": "Manter Sessão em Execução",
"Quit Session": "Sair da Sessão",
@@ -132,8 +121,9 @@
"usingXPathNotRecommended": "Using XPath locators is not recommended and can lead to fragile tests. Ask your development team to provide unique accessibility locators instead!",
"noAdditionalContextsFound": "No additional contexts have been detected",
"contextDropdownInfo": "Multiple contexts detected; certain elements might only be accessible after switching to a different context. Note that webview inspection in Appium Inspector is less accurate than the DevTools of Chrome or Safari. For more information, see:",
- "idAutocompletionCanBeDisabled": "The requested id selector does not have a package name prefix. This Appium session has package name autocompletion enabled, which may be the reason why no elements were found. To disable this behavior, relaunch this session with the capability 'appium:disableIdLocatorAutocompletion' set to 'true'.",
+ "idAutocompletionCanBeDisabled": "The requested id selector does not have a package name prefix. This Appium session has package name autocompletion enabled, which may be the reason why no elements were found. To disable this behavior, change the 'disableIdLocatorAutocompletion' setting to 'true'.",
"missingAutomationNameForStrategies": "Additional locator strategies may be available. To view them, add the capability 'appium:automationName' when launching the session. Note that this capability is mandatory in Appium 2.",
+ "snapshotMaxDepthReached": "This element is located at the maximum source depth {{selectedElementDepth}}, therefore its child elements (if any) are not shown. To reveal them, change the 'snapshotMaxDepth' setting to a value greater than {{selectedElementDepth}}. Check your driver documentation for the maximum supported value.",
"Tap": "Tocar",
"Gathering initial app source…": "Gathering initial app source…",
"couldNotObtainSource": "Could not obtain source: {{errorMsg}}",
@@ -161,15 +151,14 @@
"boolean": "booleano",
"number": "número",
"JSON object": "Objeto JSON",
- "filepath": "filepath",
"connectToExistingSessionInstructions": "If you have an already-running session of the above server type, you can attach an inspector to it directly.",
- "selectSessionIDInDropdown": "Select the Session ID in the dropdown below.",
+ "selectSessionID": "You can manually enter your session ID, or, if the server supports session discovery, simply select from a list of active sessions.",
"allowUnauthorizedCerts": "Permitir Certificados Não Autorizados",
"Use Proxy": "Use Proxy",
"JSON Representation": "JSON Representation",
"Capability Builder": "Capability Builder",
"Saved Capability Sets": "Saved Capability Sets",
- "Attach to Session": "Anexar à sessão…",
+ "Attach": "Attach",
"localhost": "localhost",
"Host": "Host",
"Port": "Porto",
@@ -195,16 +184,19 @@
"Remote Path": "Caminho Remoto",
"BrowserStack Username": "Usuário BrowserStack",
"BrowserStack Access Key": "Chave de acesso BrowserStack",
- "LambdaTest Username": "LambdaTest Username",
- "LambdaTest Access Key": "LambdaTest Access Key",
+ "TestMu AI Username": "TestMu AI Username",
+ "TestMu AI Access Key": "TestMu AI Access Key",
"Bitbar API Key": "Bitbar API Key",
"RemoteTestKit AccessToken": "RemoteTestKit AccessToken",
"RobotQA Token": "RobotQA Token",
+ "RobotActions Host": "RobotActions Host",
+ "RobotActions Token": "RobotActions Token",
+ "Add": "Add",
"Name": "Nome",
"Description": "Description",
"Created": "Created",
"Actions": "Actions",
- "enterYourSessionId": "Enter your session ID here",
+ "searchSessions": "Search discovered sessions",
"Proxy URL": "Proxy URL",
"Source": "Fonte",
"Commands": "Comandos",
@@ -212,12 +204,14 @@
"Gestures": "Gestos",
"Gesture Builder": "Construtor de Gesto",
"Saved Gestures": "Gestos salvos",
+ "Create New Gesture": "Create New Gesture",
"gesturesDescription": "Crie, salve e execute gestos personalizados aqui. Gestos são idênticos às cadeias de ação na API de ações do W3C WebDriver.",
"Session Information": "Informação da sessão",
"Execute Command": "Executar Comando",
"commandsDescription": "Run various commands using the current Appium driver. Note that not all drivers support all commands.",
- "Click to Set Coordinates": "Clique para definir coordenadas",
- "Set Coordinates Via Field": "Definir Coordenadas Via Campo",
+ "showMoveActionCoordsInPercentage": "Show Coordinates of Move Actions in Screen Dimension Percentages",
+ "showMoveActionCoordsInPixels": "Show Coordinates of Move Actions in Pixels",
+ "toggleMoveActionCoordPicker": "Toggle Setting Coordinates via Clicking on Screenshot",
"Action Type": "Tipo de Ação",
"Pointer Up": "Pointer Up",
"Pointer Down": "Pointer Down",
@@ -234,29 +228,23 @@
"Left": "Esquerda",
"Right": "Direita",
"Play": "Reproduzir",
+ "Export to File": "Export to File",
"Save Capability Set As": "Save Capability Set As…",
"Edit Raw JSON": "Edit Raw JSON",
- "Enter Parameters for:": "Enter Parameters for:",
+ "enterMethodParameters": "Enter Parameters for: '{{methodName}}'",
"invalidJson": "Invalid JSON",
- "Execute Script": "Execute Script",
"App Management": "App Management",
- "Clipboard": "Área de Transferência",
"File Transfer": "File Transfer",
"Device Interaction": "Device Interaction",
- "Keyboard": "Keyboard",
- "Connectivity": "Connectivity",
- "Performance Data": "Dados de Desempenho",
- "System": "Sistema",
"Session": "Sessão",
"Web": "Web",
"Context": "Contexto",
- "Window (W3C)": "Janela (W3C)",
"simulatorOnly": "Emulator/simulator only",
"minAndroidSDK": "Minimum Android SDK level",
"Error": "Erro",
"findingElementInSourceFailed": "Could not find the specified element. The current application source or element ID may have changed, or there may be too many elements with the same coordinates.",
"callToMethodFailed": "Chamada para '{{methodName}}' falhou",
- "methodCallResult": "Resultado de '{{methodName}}'",
+ "methodCallResult": "Result for: '{{methodName}}' (type: {{resultType}})",
"TestingBot Key": "Chave TestingBot",
"TestingBot Secret": "Segredo TestingBot",
"Appium Server": "Servidor Appium",
@@ -269,17 +257,75 @@
"Mobitru WebDriver URL": "Mobitru WebDriver URL",
"Mobitru Billing Unit": "Mobitru Billing Unit",
"Mobitru Access Key": "Mobitru Access Key",
- "mobitruCredentialsRequired": "Mobitru Access Key is required",
"Session URL": "Session URL",
"Server Details": "Server Details",
"Session Length": "Session Length",
"Session Details": "Session Details",
"Currently Active App ID": "Currently Active App ID",
- "Session ID": "Session ID",
"confirmDeletion": "Are you sure you want to delete this?",
"Copied!": "Copied!",
"Error Fetching Session URL": "Error Fetching Session URL",
- "noResultsFound": "No results found",
+ "noRunningSessionsFound": "No running sessions found",
"invalidCapType": "Invalid capability type: {{type}}",
- "whitespaceDetected": "Text Starts and/or Ends With Whitespace"
+ "whitespaceDetected": "Text Starts and/or Ends With Whitespace",
+ "duplicateCapabilityNameError": "A capability set with the same name already exists",
+ "unableToImportGestureFiles": "Could not import gestures from the following files: {{fileNames}}",
+ "invalidSessionFile": "Invalid session file",
+ "TV Labs API Key": "TV Labs API Key",
+ "TestcribeAPIKey": "Testcribe API Key",
+ "sessionTestcribeApiKeyDescription": "You can get your api key from https://app.testcribe.com/settings/apiKeys",
+ "missingVendorProperties": "Please provide the following server details for {{vendorName}}: {{vendorProps}}",
+ "missingServerInfo": "Missing server info, could not query sessions",
+ "Username": "Username",
+ "URL": "URL",
+ "WebDriver URL": "WebDriver URL",
+ "API Key": "API Key",
+ "Access Key": "Access Key",
+ "SecurityToken": "SecurityToken",
+ "AccessToken": "AccessToken",
+ "Token": "Token",
+ "Key": "Key",
+ "Secret": "Secret",
+ "Theme": "Theme",
+ "Light Theme": "Light Theme",
+ "Dark Theme": "Dark Theme",
+ "System Theme": "System Theme",
+ "Search Source": "Search Source",
+ "Matching Elements": "Matching Elements",
+ "webmateApiKey": "webmate API Key",
+ "yourProjectId": "Your Project ID",
+ "webmateProjectId": "webmate Project ID",
+ "specifyWebmateHostExplicitly": "Specify webmate host explicitly",
+ "webmateHost": "webmate Host",
+ "Enable": "Enable",
+ "yourFireflinkDevicefarmDomain": "Your Fireflink DeviceFarm Domain (e.g., cloud.fireflink.com)",
+ "yourLicenseId": "Your License ID",
+ "yourProjectName": "Your Project Name",
+ "License ID": "License ID",
+ "Project Name": "Project Name",
+ "Fireflink DeviceFarm Domain": "Fireflink DeviceFarm Domain",
+ "Fireflink DeviceFarm Access Key": "Fireflink DeviceFarm Access Key",
+ "Fireflink DeviceFarm License ID": "Fireflink DeviceFarm License ID",
+ "Fireflink DeviceFarm Project Name": "Fireflink DeviceFarm Project Name",
+ "RabbitQA API Key": "RabbitQA API Key",
+ "RestartSessionMessage": "Device Connection Lost – Restarting the Session…",
+ "ToggleRestartSession": "Toggle Session Reload Upon Device Disconnect",
+ "toggleTableFormatting": "Toggle Table Formatting",
+ "copyResultToClipboard": "Copy Result to Clipboard",
+ "Property": "Property",
+ "noCapsFound": "No session capabilities found. Please use the Capability Builder to edit, add, and save your capability set. Refer to the tutorial at {{url}}",
+ "executeMethods": "Execute Methods",
+ "dynamicCommandsDescription": "Run commands supported by the currently active driver and plugin(s). Note that some commands may only work in specific contexts. Any commands not supported by WebdriverIO are not included in this list.",
+ "dynamicExecuteMethodsDescription": "Run any execute method supported by the currently active driver and plugin(s).",
+ "methodDeprecated": "This method is deprecated",
+ "App Settings": "App Settings",
+ "unableToImportSessionFiles": "Could not import sessions from the following files: {{fileNames}}",
+ "Import from File": "Import from File",
+ "useMjpegStream": "Use MJPEG Stream",
+ "useScreenshotApi": "Use Screenshot API",
+ "Box Model": "Box Model",
+ "detachFromSession": "Detach from Session",
+ "enterSessionID": "Enter session ID for attaching manually",
+ "refreshDiscoveredSessions": "Refresh Discovered Sessions",
+ "toggleMultiDisplayMode": "Toggle Multi-Display Mode"
}
diff --git a/assets/locales/ru/translation.json b/app/common/public/locales/ru/translation.json
similarity index 71%
rename from assets/locales/ru/translation.json
rename to app/common/public/locales/ru/translation.json
index b63b9e1b29..33f2eaa169 100644
--- a/assets/locales/ru/translation.json
+++ b/app/common/public/locales/ru/translation.json
@@ -14,7 +14,6 @@
"Zoom Out": "Отдалить",
"Reset Zoom Level": "Сброс масштаба",
"Close Window": "Закрыть окно",
- "Open Session File…": "Открыть файл сессии…",
"Bring All to Front": "На передний план",
"Help": "Помощь",
"Appium Documentation": "Документация Appium",
@@ -41,7 +40,6 @@
"Save Server Arguments Preset": "Сохранить пресет аргументов сервера",
"Save": "Сохранить",
"Cancel": "Отмена",
- "datetimeFormat": "MMM Do YYYY, h:mma",
"updateDetails": "Дата релиза: {{pubDate}}\n\nПримечания к релизу: {{notes}}",
"appiumIsAvailable": "Доступен инспектор Appium {{name}}",
"updateIsBeingDownloaded": "Обновление загружается. Вы будете уведомлены сразу по завершению",
@@ -67,21 +65,12 @@
"findElementFailure": "Не удалось найти элемент для '{{methodName}}'. Пожалуйста, обновите страницу и повторите попытку.",
"Could not start session": "Не удалось запустить сессию",
"couldNotConnect": "Не удалось подключиться к URL сервера Appium '{{url}}'. Пожалуйста, проверьте, работает ли сервер и правилен ли URL. Корректные адреса можно найти в начале журнала сервера Appium. Если используется версия браузера Inspector, убедитесь, что сервер запущен с флагом --allow-cors.",
- "Invalid URL:": "Неверный URL:",
- "sauceCredentialsRequired": "Требуется имя пользователя и ключ доступа к Sauce!",
- "testingbotCredentialsRequired": "Требуется ключ и секрет API TestingBot!",
- "Perfecto SecurityToken is required": "Требуется SecurityToken Perfecto",
- "browserstackCredentialsRequired": "Требуется имя пользователя и ключ доступа Browserstack!",
- "lambdatestCredentialsRequired": "Требуется имя пользователя и ключ доступа LambdaTest!",
- "bitbarCredentialsRequired": "Требуется ключ API Bitbar!",
- "kobitonCredentialsRequired": "Требуется имя пользователя и ключ API KOBITON!",
- "experitestAccessKeyURLRequired": "Требуются URL и ключ доступа к Experitest",
+ "Invalid URL:": "Негодный URL:",
"experitestAccessKey": "Ключ доступа к Experitest",
"experitestUrl": "URL Experitest",
"locatorStrategy": "Стратегия поиска:",
"selector": "Селектор:",
"couldNotObtainScreenshot": "Не удалось получить скриншот: {{screenshotError}}",
- "selectElementInSource": "Выберите элемент в источнике.",
"Press Home Button": "Нажать кнопку \"Домой\"",
"Execute Siri Command": "Выполнить команду Siri",
"Press Back Button": "Нажать кнопку \"Назад\"",
@@ -100,11 +89,11 @@
"Pause Recording": "Приостановить запись",
"Search for element": "Поиск элемента",
"App Source": "Источник приложения",
+ "Collapse All": "Свернуть все",
"Toggle Attributes": "Свернуть/развернуть атрибуты",
"Copy XML Source to Clipboard": "Копировать XML в буфер обмена",
"Download Source as .XML File": "Скачать исходный код как .XML файл",
"Copy Attributes to Clipboard": "Копировать атрибуты в буфер обмена",
- "quitSessionAndClose": "Выйти из сессии и закрыть инспектор",
"Session Inactive": "Сессия неактивна",
"Keep Session Running": "Оставить сессию запущенной",
"Quit Session": "Покинуть сессию",
@@ -132,8 +121,9 @@
"usingXPathNotRecommended": "XPath не рекомендуется и может привести к \"хрупким\" тестам. Попросите вашу команду разработчиков предоставить уникальные локаторы для поиска элементов!",
"noAdditionalContextsFound": "Дополнительные контексты не были обнаружены",
"contextDropdownInfo": "Обнаружено несколько контекстов; некоторые элементы могут быть доступны только после переключения на другой контекст. Обратите внимание, что осмотр webview в Appium Inspector менее точен, чем в DevTools Chrome или Safari. Подробнее:",
- "idAutocompletionCanBeDisabled": "Запрошенный id-селектор не имеет префикса имени пакета. Эта сессия автоматически дополняет имя пакета. Возможно, поэтому элементы не найдены. Чтобы отключить автодополнение, перезапустите сессию с возможностью 'appium:disableIdLocatorAutocompletion' и ее значением 'true'.",
+ "idAutocompletionCanBeDisabled": "Запрошенный id-селектор не имеет префикса имени пакета. Эта сессия автоматически дополняет имя пакета, и, возможно, поэтому элементы не найдены. Чтобы отключить автодополнение, измените параметр 'disableIdLocatorAutocompletion' на 'true'.",
"missingAutomationNameForStrategies": "Возможно, доступны дополнительные стратегии локаторов. Для их просмотра при запуске сессии добавьте возможность 'appium:automationName'. Обратите внимание, что эта возможность в Appium 2 обязательна.",
+ "snapshotMaxDepthReached": "Этот элемент находится на максимальной глубине источника {{selectedElementDepth}}, поэтому его дочерние элементы (если таковые имеются) не отображаются. Чтобы показать их, измените параметр 'snapshotMaxDepth' на значение больше {{selectedElementDepth}}. Обращаетесь в документацию вашего драйвера для максимально поддерживаемого значения.",
"Tap": "Нажать",
"Gathering initial app source…": "Сбор исходного кода приложения…",
"couldNotObtainSource": "Не удалось получить исходный код: {{errorMsg}}",
@@ -161,19 +151,18 @@
"boolean": "логическое значение",
"number": "число",
"JSON object": "JSON-объект",
- "filepath": "путь к файлу",
"connectToExistingSessionInstructions": "Если у вас уже есть выполняемая сессия, можно напрямую подключить к ней инспектор.",
- "selectSessionIDInDropdown": "Выберите идентификатор сессии в выпадающем списке ниже",
+ "selectSessionID": "You can manually enter your session ID, or, if the server supports session discovery, simply select from a list of active sessions.",
"allowUnauthorizedCerts": "Неавторизованные сертификаты",
"Use Proxy": "Использовать прокси",
"JSON Representation": "Представление в JSON",
"Capability Builder": "Создатель возможностей",
"Saved Capability Sets": "Сохраненные наборы возможностей",
- "Attach to Session": "Прикрепиться к сессии…",
+ "Attach": "Attach",
"localhost": "localhost",
"Host": "Хост",
"Port": "Порт",
- "usingDataFoundIn": "Использование данных из переменной среды {{environmentVariable}}",
+ "usingDataFoundIn": "Подстановка данных из переменной среды {{environmentVariable}}",
"yourUsername": "Ваше имя пользователя",
"Sauce Username": "Имя пользователя Sauce",
"Sauce Access Key": "Ключ доступа Sauce",
@@ -195,16 +184,19 @@
"Remote Path": "Удаленный путь",
"BrowserStack Username": "Имя пользователя BrowserStack",
"BrowserStack Access Key": "Ключ доступа BrowserStack",
- "LambdaTest Username": "Имя пользователя LambdaTest",
- "LambdaTest Access Key": "Ключ доступа LambdaTest",
+ "TestMu AI Username": "Имя пользователя TestMU AI",
+ "TestMu AI Access Key": "Ключ доступа TestMu AI",
"Bitbar API Key": "Ключ API Bitbar",
"RemoteTestKit AccessToken": "Токен доступа RemoteTestKit",
"RobotQA Token": "Токен RobotQA",
+ "RobotActions Host": "RobotActions Host",
+ "RobotActions Token": "RobotActions Token",
+ "Add": "Добавить",
"Name": "Название",
"Description": "Описание",
"Created": "Создано",
"Actions": "Действия",
- "enterYourSessionId": "Введите идентификатор сессии здесь",
+ "searchSessions": "Search discovered sessions",
"Proxy URL": "URL прокси-сервера",
"Source": "Источник",
"Commands": "Команды",
@@ -212,12 +204,14 @@
"Gestures": "Жесты",
"Gesture Builder": "Конструктор жестов",
"Saved Gestures": "Сохраненные жесты",
+ "Create New Gesture": "Создать новый жест",
"gesturesDescription": "Создавайте, сохраняйте и выполняйте пользовательские жесты здесь. Жесты идентичны цепочкам действий в API веб-драйвера Actions стандарта W3C.",
"Session Information": "Информация о сессии",
"Execute Command": "Выполнить команду",
"commandsDescription": "Выполняйте различные команды с помощью текущего драйвера Appium. Обратите внимание, что не все драйверы поддерживают все команды.",
- "Click to Set Coordinates": "Кликните, чтобы установить координаты",
- "Set Coordinates Via Field": "Установить координаты через поле",
+ "showMoveActionCoordsInPercentage": "Показать координаты перемещений в процентах от размеров экрана",
+ "showMoveActionCoordsInPixels": "Показать координаты перемещений в пикселях",
+ "toggleMoveActionCoordPicker": "Вкл./выкл. настройку координат при нажатии на скриншот",
"Action Type": "Тип действия",
"Pointer Up": "Указатель вверх",
"Pointer Down": "Указатель вниз",
@@ -234,29 +228,23 @@
"Left": "Левая",
"Right": "Правая",
"Play": "Воспроизвести",
+ "Export to File": "Экспортировать в файл",
"Save Capability Set As": "Сохранить набор возможностей как…",
"Edit Raw JSON": "Изменить JSON",
- "Enter Parameters for:": "Введите параметры для:",
+ "enterMethodParameters": "Введите параметры для: '{{methodName}}'",
"invalidJson": "Неверный JSON",
- "Execute Script": "Выполнение скрипта",
"App Management": "Управление приложениями",
- "Clipboard": "Буфер обмена",
"File Transfer": "Передача файлов",
"Device Interaction": "Взаимодействие с устройством",
- "Keyboard": "Клавиатура",
- "Connectivity": "Подключения",
- "Performance Data": "Данные производительности",
- "System": "Система",
"Session": "Сессия",
"Web": "Веб",
"Context": "Контекст",
- "Window (W3C)": "Окно (W3C)",
"simulatorOnly": "Только эмулятор/симулятор",
"minAndroidSDK": "Минимальный уровень Android SDK",
"Error": "Ошибка",
"findingElementInSourceFailed": "Не удалось найти указанный элемент. Возможно, текущий источник приложения или ID элемента изменился, или в источнике слишком много элементов с одинаковыми координатами.",
"callToMethodFailed": "Вызов '{{methodName}}' не удался",
- "methodCallResult": "Результат '{{methodName}}'",
+ "methodCallResult": "Результат для: '{{methodName}}' (тип: {{resultType}})",
"TestingBot Key": "Ключ API TestingBot",
"TestingBot Secret": "Секрет API TestingBot",
"Appium Server": "Сервер Appium",
@@ -269,17 +257,75 @@
"Mobitru WebDriver URL": "URL вебдрайвера Mobitru",
"Mobitru Billing Unit": "Блок биллинга Mobitru",
"Mobitru Access Key": "Ключ доступа Mobitru",
- "mobitruCredentialsRequired": "Требуется ключ доступа Mobitru",
"Session URL": "URL сессии",
"Server Details": "Детали сервера",
"Session Length": "Длина сессии",
"Session Details": "Детали сессии",
"Currently Active App ID": "Идентификатор активного приложения",
- "Session ID": "ID сессии",
"confirmDeletion": "Вы уверены, что хотите удалить это?",
"Copied!": "Скопировано!",
"Error Fetching Session URL": "Ошибка извлечения URL сессии",
- "noResultsFound": "Результатов не найдено",
- "invalidCapType": "Неверный тип возможности: {{type}}",
- "whitespaceDetected": "Текст начинается и/или заканчивается с пробелом"
+ "noRunningSessionsFound": "No running sessions found",
+ "invalidCapType": "Негодный тип возможности: {{type}}",
+ "whitespaceDetected": "Текст начинается и/или заканчивается с пробелом",
+ "duplicateCapabilityNameError": "Набор возможностей с таким именем уже существует",
+ "unableToImportGestureFiles": "Не удалось импортировать жесты из следующих файлов: {{fileNames}}",
+ "invalidSessionFile": "Негодный файл сессии",
+ "TV Labs API Key": "API ключ TV Labs",
+ "TestcribeAPIKey": "API ключ Testcribe",
+ "sessionTestcribeApiKeyDescription": "Вы можете получить ваш ключ API от https://app.testcribe.com/settings/apiKeys",
+ "missingVendorProperties": "Пожалуйста, укажите следующие данные сервера для {{vendorName}}: {{vendorProps}}",
+ "missingServerInfo": "Отсутствует информация о сервере, не удалось запросить сессии",
+ "Username": "Имя пользователя",
+ "URL": "URL",
+ "WebDriver URL": "URL вебдрайвера",
+ "API Key": "Ключ API",
+ "Access Key": "Ключ доступа",
+ "SecurityToken": "SecurityToken",
+ "AccessToken": "AccessToken",
+ "Token": "Токен",
+ "Key": "Ключ",
+ "Secret": "Секрет",
+ "Theme": "Тема",
+ "Light Theme": "Светлая тема",
+ "Dark Theme": "Тёмная тема",
+ "System Theme": "Системная тема",
+ "Search Source": "Искать в источнике",
+ "Matching Elements": "Совпадающие элементы",
+ "webmateApiKey": "API ключ webmate",
+ "yourProjectId": "ID вашего проекта",
+ "webmateProjectId": "ID проекта webmate",
+ "specifyWebmateHostExplicitly": "Указать конкретный хост webmate",
+ "webmateHost": "Хост webmate",
+ "Enable": "Включить",
+ "yourFireflinkDevicefarmDomain": "Ваш домен Fireflink DeviceFarm (например, cloud.fireflink.com)",
+ "yourLicenseId": "ID вашей лицензии",
+ "yourProjectName": "Название вашего проекта",
+ "License ID": "ID лицензии",
+ "Project Name": "Название проекта",
+ "Fireflink DeviceFarm Domain": "Домен Fireflink DeviceFarm",
+ "Fireflink DeviceFarm Access Key": "Ключ доступа Fireflink DeviceFarm",
+ "Fireflink DeviceFarm License ID": "ID лицензии Fireflink DeviceFarm",
+ "Fireflink DeviceFarm Project Name": "Имя проекта Fireflink DeviceFarm",
+ "RabbitQA API Key": "API ключ RabbitQA",
+ "RestartSessionMessage": "Соединение с устройством потеряно – сессия перезагружается…",
+ "ToggleRestartSession": "Перезагрузить сессию при потере соединения с устройством",
+ "toggleTableFormatting": "Переключить форматирование таблицей",
+ "copyResultToClipboard": "Копировать результат",
+ "Property": "Свойство",
+ "noCapsFound": "Способности сеанса не найдены. Пожалуйста, используйте конструктор способностей для редактирования, добавления и сохранения набора возможностей. Больше информации: {{url}}",
+ "executeMethods": "Методы выполнения",
+ "dynamicCommandsDescription": "Исполняете команды, поддерживаемые активным драйвером и плагином(-ами). Обратите внимание, что некоторые команды могут работать только в определенных контекстах. Любые команды, не поддерживаемые WebdriverIO, не включены в этот список.",
+ "dynamicExecuteMethodsDescription": "Исполняете любой метод выполнения, поддерживаемый активным драйвером и плагином(-ами).",
+ "methodDeprecated": "Этот метод устарел",
+ "App Settings": "Настройки приложения",
+ "unableToImportSessionFiles": "Не удалось импортировать сессии из следующих файлов: {{fileNames}}",
+ "Import from File": "Импортировать из файла",
+ "useMjpegStream": "Использовать поток MJPEG",
+ "useScreenshotApi": "Использовать скриншот API",
+ "Box Model": "Модель блока",
+ "detachFromSession": "Отсоединиться от сессии",
+ "enterSessionID": "Enter session ID for attaching manually",
+ "refreshDiscoveredSessions": "Refresh Discovered Sessions",
+ "toggleMultiDisplayMode": "Toggle Multi-Display Mode"
}
diff --git a/app/common/public/locales/sv-SE/translation.json b/app/common/public/locales/sv-SE/translation.json
new file mode 100644
index 0000000000..9ad71e149c
--- /dev/null
+++ b/app/common/public/locales/sv-SE/translation.json
@@ -0,0 +1,331 @@
+{
+ "appiumInspector": "Appium Inspector",
+ "Edit": "Edit",
+ "Redo": "Redo",
+ "Cut": "Cut",
+ "Copy": "Copy",
+ "Paste": "Paste",
+ "Delete": "Delete",
+ "Select All": "Select All",
+ "Window": "Window",
+ "Minimize": "Minimize",
+ "Zoom": "Zoom",
+ "Zoom In": "Zoom In",
+ "Zoom Out": "Zoom Out",
+ "Reset Zoom Level": "Reset Zoom Level",
+ "Close Window": "Close Window",
+ "Bring All to Front": "Bring All to Front",
+ "Help": "Help",
+ "Appium Documentation": "Appium Documentation",
+ "Inspector Documentation": "Inspector Documentation",
+ "Appium Discussion Forum": "Appium Discussion Forum",
+ "Report Issues": "Report Issues",
+ "About Appium Inspector": "About Appium Inspector",
+ "showAppInfo": "App Version: {{appVersion}}\nElectron: {{electronVersion}}\nNode.js: {{nodejsVersion}}\n",
+ "Improve Translations": "Improve Translations",
+ "Check for Updates…": "Check for Updates…",
+ "File": "File",
+ "New Window": "New Window",
+ "Hide Appium Inspector": "Hide Appium Inspector",
+ "Hide Others": "Hide Others",
+ "Show All": "Show All",
+ "Quit Appium Inspector": "Quit Appium Inspector",
+ "Toggle Full Screen": "Toggle Full Screen",
+ "Languages": "Languages",
+ "View": "View",
+ "Reload": "Reload",
+ "Toggle Developer Tools": "Toggle Developer Tools",
+ "Undo": "Undo",
+ "Restart Now": "Restart Now",
+ "Save Server Arguments Preset": "Save Server Arguments Preset",
+ "Save": "Save",
+ "Cancel": "Cancel",
+ "updateDetails": "Release Date: {{pubDate}}\n\nRelease Notes: {{notes}}",
+ "appiumIsAvailable": "Appium Inspector {{name}} is available",
+ "updateIsBeingDownloaded": "Update is being downloaded now. You will be notified again when it is complete",
+ "updateIsDownloaded": "Appium Inspector {{releaseName}} has been downloaded. Must restart to apply the updates (note: it may take several minutes for Appium Inspector to install and restart)",
+ "updateDownloadFailed": "Failed to download update. Reason: {{message}}",
+ "OK": "OK",
+ "Install Now": "Install Now",
+ "Install Later": "Install Later",
+ "Update Download Started": "Update Download Started",
+ "No update available": "No update available",
+ "Appium Inspector is up-to-date": "Appium Inspector is up-to-date",
+ "Later": "Later",
+ "Update Downloaded": "Update Downloaded",
+ "Could not download update": "Could not download update",
+ "Unexpected Error:": "Unexpected Error:",
+ "Please report this issue at:": "Please report this issue at:",
+ "Full error trace:": "Full error trace:",
+ "Copy Error Trace": "Copy Error Trace",
+ "Inspect element": "Inspect element",
+ "Session closed due to inactivity": "Session closed due to inactivity",
+ "Session has been terminated": "Session has been terminated",
+ "frameworkNotSupported": "Framework '{{framework}}' not supported",
+ "findElementFailure": "Failed to find element for '{{methodName}}'. Please refresh page and try again.",
+ "Could not start session": "Could not start session",
+ "couldNotConnect": "Could not connect to Appium server URL '{{url}}'. Please check if the server is running and the URL is correct (valid URLs can be found at the start of the Appium server log). If you are using the Inspector's browser version, ensure the server has been started with '--allow-cors'.",
+ "Invalid URL:": "Invalid URL:",
+ "experitestAccessKey": "Experitest AccessKey",
+ "experitestUrl": "Experitest Url",
+ "locatorStrategy": "Locator Strategy:",
+ "selector": "Selector:",
+ "couldNotObtainScreenshot": "Could not obtain screenshot: {{screenshotError}}",
+ "Press Home Button": "Press Home Button",
+ "Execute Siri Command": "Execute Siri Command",
+ "Press Back Button": "Press Back Button",
+ "Press App Switch Button": "Press App Switch Button",
+ "Command": "Command",
+ "Show Element Handles": "Show Element Handles",
+ "Hide Element Handles": "Hide Element Handles",
+ "Select Elements": "Select Elements",
+ "Tap/Swipe By Coordinates": "Tap/Swipe By Coordinates",
+ "Download Screenshot": "Download Screenshot",
+ "Back": "Back",
+ "Start Refreshing Source": "Start Refreshing Source",
+ "Pause Refreshing Source": "Pause Refreshing Source",
+ "refreshSource": "Refresh Source & Screenshot",
+ "Start Recording": "Start Recording",
+ "Pause Recording": "Pause Recording",
+ "Search for element": "Search for element",
+ "App Source": "App Source",
+ "Collapse All": "Collapse All",
+ "Toggle Attributes": "Toggle Attributes",
+ "Copy XML Source to Clipboard": "Copy XML Source to Clipboard",
+ "Download Source as .XML File": "Download Source as .XML File",
+ "Copy Attributes to Clipboard": "Copy Attributes to Clipboard",
+ "Session Inactive": "Session Inactive",
+ "Keep Session Running": "Keep Session Running",
+ "Quit Session": "Quit Session",
+ "Your session is about to expire": "Your session is about to expire",
+ "Enter Keys to Send": "Enter Keys to Send",
+ "Find and Select in Source": "Find and Select in Source",
+ "Clear": "Clear",
+ "Send Keys": "Send Keys",
+ "Done": "Done",
+ "Search": "Search",
+ "Show/Hide Boilerplate Code": "Show/Hide Boilerplate Code",
+ "Copy code to clipboard": "Copy code to clipboard",
+ "Start this Kind of Session with Code": "Start this Kind of Session with Code",
+ "Clear Actions": "Clear Actions",
+ "Close Recorder": "Close Recorder",
+ "enableRecordingAndPerformActions": "Enable recording in the application header, then perform some actions to see code show up here",
+ "Recorder": "Recorder",
+ "Attribute": "Attribute",
+ "Value": "Value",
+ "Find By": "Find By",
+ "Selector": "Selector",
+ "Time": "Time (ms)",
+ "Get Timing": "Get Timing",
+ "interactionsNotAvailable": "Interactions for this element may not be available",
+ "usingXPathNotRecommended": "Using XPath locators is not recommended and can lead to fragile tests. Ask your development team to provide unique accessibility locators instead!",
+ "noAdditionalContextsFound": "No additional contexts have been detected",
+ "contextDropdownInfo": "Multiple contexts detected; certain elements might only be accessible after switching to a different context. Note that webview inspection in Appium Inspector is less accurate than the DevTools of Chrome or Safari. For more information, see:",
+ "idAutocompletionCanBeDisabled": "The requested id selector does not have a package name prefix. This Appium session has package name autocompletion enabled, which may be the reason why no elements were found. To disable this behavior, change the 'disableIdLocatorAutocompletion' setting to 'true'.",
+ "missingAutomationNameForStrategies": "Additional locator strategies may be available. To view them, add the capability 'appium:automationName' when launching the session. Note that this capability is mandatory in Appium 2.",
+ "snapshotMaxDepthReached": "This element is located at the maximum source depth {{selectedElementDepth}}, therefore its child elements (if any) are not shown. To reveal them, change the 'snapshotMaxDepth' setting to a value greater than {{selectedElementDepth}}. Check your driver documentation for the maximum supported value.",
+ "Tap": "Tap",
+ "Gathering initial app source…": "Gathering initial app source…",
+ "couldNotObtainSource": "Could not obtain source: {{errorMsg}}",
+ "iOS": "iOS",
+ "Android": "Android",
+ "desiredCapabilitiesDocumentation": "Capabilities Documentation",
+ "startSession": "Start Session",
+ "saveAs": "Save As…",
+ "attachToSession": "Attach to Session",
+ "selectedElement": "Selected Element",
+ "unnamed": "(Unnamed)",
+ "No Description": "No Description",
+ "couldNotFindEntryWithId": "Could not find an entry with ID {{id}}",
+ "couldNotFindAnyElements": "Could not find any elements",
+ "elementsCount": "Elements found:",
+ "xCoordinate": "X: {{x}}",
+ "yCoordinate": "Y: {{y}}",
+ "SauceLabs Data Center": "SauceLabs Data Center",
+ "US-West": "US West 1",
+ "US-East": "US East 4",
+ "EU-Central": "EU Central 1",
+ "proxyThroughSC": "Proxy through Sauce Connect's Selenium Relay",
+ "SSL": "SSL",
+ "text": "text",
+ "boolean": "boolean",
+ "number": "number",
+ "JSON object": "JSON object",
+ "connectToExistingSessionInstructions": "If you have an already-running session of the above server type, you can attach an inspector to it directly.",
+ "selectSessionID": "You can manually enter your session ID, or, if the server supports session discovery, simply select from a list of active sessions.",
+ "allowUnauthorizedCerts": "Allow Unauthorized Certificates",
+ "Use Proxy": "Use Proxy",
+ "JSON Representation": "JSON Representation",
+ "Capability Builder": "Capability Builder",
+ "Saved Capability Sets": "Saved Capability Sets",
+ "Attach": "Attach",
+ "localhost": "localhost",
+ "Host": "Host",
+ "Port": "Port",
+ "usingDataFoundIn": "Using data found in {{environmentVariable}}",
+ "yourUsername": "Your Username",
+ "Sauce Username": "Sauce Username",
+ "Sauce Access Key": "Sauce Access Key",
+ "yourAccessKey": "Your Access Key",
+ "yourApiKey": "Your API Key",
+ "Perfecto Host": "Perfecto Host",
+ "Perfecto Port": "Perfecto Port",
+ "Pcloudy User Name": "Pcloudy User Name",
+ "Pcloudy Host": "Pcloudy Host",
+ "Pcloudy API Key": "Pcloudy API Key",
+ "Add your token": "Add your token",
+ "Perfecto Token": "Perfecto Token",
+ "Your Kobiton Username": "Your Kobiton Username",
+ "Kobiton Access Key": "Kobiton Access Key",
+ "serverTabHeasdpinWebDriverURL": "HeadSpin Web Driver URL",
+ "sessionHeadspinWebDriverURLDescription": "Get the URL from the HeadSpin UI or the HeadSpin API using the automation configuration route",
+ "Remote Host": "Remote Host",
+ "Remote Port": "Remote Port",
+ "Remote Path": "Remote Path",
+ "BrowserStack Username": "BrowserStack Username",
+ "BrowserStack Access Key": "BrowserStack Access Key",
+ "TestMu AI Username": "TestMu AI Username",
+ "TestMu AI Access Key": "TestMu AI Access Key",
+ "Bitbar API Key": "Bitbar API Key",
+ "RemoteTestKit AccessToken": "RemoteTestKit AccessToken",
+ "RobotQA Token": "RobotQA Token",
+ "RobotActions Host": "RobotActions Host",
+ "RobotActions Token": "RobotActions Token",
+ "Add": "Add",
+ "Name": "Name",
+ "Description": "Description",
+ "Created": "Created",
+ "Actions": "Actions",
+ "searchSessions": "Search discovered sessions",
+ "Proxy URL": "Proxy URL",
+ "Source": "Source",
+ "Commands": "Commands",
+ "Execute Commands": "Execute Commands",
+ "Gestures": "Gestures",
+ "Gesture Builder": "Gesture Builder",
+ "Saved Gestures": "Saved Gestures",
+ "Create New Gesture": "Create New Gesture",
+ "gesturesDescription": "Create, save, and execute custom gestures here. Gestures are identical to action chains in the W3C WebDriver Actions API.",
+ "Session Information": "Session Information",
+ "Execute Command": "Execute Command",
+ "commandsDescription": "Run various commands using the current Appium driver. Note that not all drivers support all commands.",
+ "showMoveActionCoordsInPercentage": "Show Coordinates of Move Actions in Screen Dimension Percentages",
+ "showMoveActionCoordsInPixels": "Show Coordinates of Move Actions in Pixels",
+ "toggleMoveActionCoordPicker": "Toggle Setting Coordinates via Clicking on Screenshot",
+ "Action Type": "Action Type",
+ "Pointer Up": "Pointer Up",
+ "Pointer Down": "Pointer Down",
+ "Pause": "Pause",
+ "Move": "Move",
+ "Action Type Not Defined": "Action Type Not Defined",
+ "Duration": "Duration",
+ "Button": "Button",
+ "Untitled Gesture": "Untitled Gesture",
+ "Add Description": "Add Description",
+ "Gesture saved": "Gesture saved",
+ "Gesture saved as": "Gesture saved as '{{gestureName}}'",
+ "Duplicate pointer names are not allowed": "Duplicate pointer names are not allowed",
+ "Left": "Left",
+ "Right": "Right",
+ "Play": "Play",
+ "Export to File": "Export to File",
+ "Save Capability Set As": "Save Capability Set As…",
+ "Edit Raw JSON": "Edit Raw JSON",
+ "enterMethodParameters": "Enter Parameters for: '{{methodName}}'",
+ "invalidJson": "Invalid JSON",
+ "App Management": "App Management",
+ "File Transfer": "File Transfer",
+ "Device Interaction": "Device Interaction",
+ "Session": "Session",
+ "Web": "Web",
+ "Context": "Context",
+ "simulatorOnly": "Emulator/simulator only",
+ "minAndroidSDK": "Minimum Android SDK level",
+ "Error": "Error",
+ "findingElementInSourceFailed": "Could not find the specified element. The current application source or element ID may have changed, or there may be too many elements with the same coordinates.",
+ "callToMethodFailed": "Call to '{{methodName}}' failed",
+ "methodCallResult": "Result for: '{{methodName}}' (type: {{resultType}})",
+ "TestingBot Key": "TestingBot Key",
+ "TestingBot Secret": "TestingBot Secret",
+ "Appium Server": "Appium Server",
+ "Select Cloud Providers": "Select Cloud Providers",
+ "Advanced Settings": "Advanced Settings",
+ "Native App Mode": "Native App Mode",
+ "Web/Hybrid App Mode": "Web/Hybrid App Mode",
+ "autoAddPrefixes": "Automatically add necessary Appium vendor prefixes on start",
+ "attachSessionNotRunning": "Could not confirm that session {{attachSessId}} is running on the provided server. Please check details before trying to attach to the session again.",
+ "Mobitru WebDriver URL": "Mobitru WebDriver URL",
+ "Mobitru Billing Unit": "Mobitru Billing Unit",
+ "Mobitru Access Key": "Mobitru Access Key",
+ "Session URL": "Session URL",
+ "Server Details": "Server Details",
+ "Session Length": "Session Length",
+ "Session Details": "Session Details",
+ "Currently Active App ID": "Currently Active App ID",
+ "confirmDeletion": "Are you sure you want to delete this?",
+ "Copied!": "Copied!",
+ "Error Fetching Session URL": "Error Fetching Session URL",
+ "noRunningSessionsFound": "No running sessions found",
+ "invalidCapType": "Invalid capability type: {{type}}",
+ "whitespaceDetected": "Text Starts and/or Ends With Whitespace",
+ "duplicateCapabilityNameError": "A capability set with the same name already exists",
+ "unableToImportGestureFiles": "Could not import gestures from the following files: {{fileNames}}",
+ "invalidSessionFile": "Invalid session file",
+ "TV Labs API Key": "TV Labs API Key",
+ "TestcribeAPIKey": "Testcribe API Key",
+ "sessionTestcribeApiKeyDescription": "You can get your api key from https://app.testcribe.com/settings/apiKeys",
+ "missingVendorProperties": "Please provide the following server details for {{vendorName}}: {{vendorProps}}",
+ "missingServerInfo": "Missing server info, could not query sessions",
+ "Username": "Username",
+ "URL": "URL",
+ "WebDriver URL": "WebDriver URL",
+ "API Key": "API Key",
+ "Access Key": "Access Key",
+ "SecurityToken": "SecurityToken",
+ "AccessToken": "AccessToken",
+ "Token": "Token",
+ "Key": "Key",
+ "Secret": "Secret",
+ "Theme": "Theme",
+ "Light Theme": "Light Theme",
+ "Dark Theme": "Dark Theme",
+ "System Theme": "System Theme",
+ "Search Source": "Search Source",
+ "Matching Elements": "Matching Elements",
+ "webmateApiKey": "webmate API Key",
+ "yourProjectId": "Your Project ID",
+ "webmateProjectId": "webmate Project ID",
+ "specifyWebmateHostExplicitly": "Specify webmate host explicitly",
+ "webmateHost": "webmate Host",
+ "Enable": "Enable",
+ "yourFireflinkDevicefarmDomain": "Your Fireflink DeviceFarm Domain (e.g., cloud.fireflink.com)",
+ "yourLicenseId": "Your License ID",
+ "yourProjectName": "Your Project Name",
+ "License ID": "License ID",
+ "Project Name": "Project Name",
+ "Fireflink DeviceFarm Domain": "Fireflink DeviceFarm Domain",
+ "Fireflink DeviceFarm Access Key": "Fireflink DeviceFarm Access Key",
+ "Fireflink DeviceFarm License ID": "Fireflink DeviceFarm License ID",
+ "Fireflink DeviceFarm Project Name": "Fireflink DeviceFarm Project Name",
+ "RabbitQA API Key": "RabbitQA API Key",
+ "RestartSessionMessage": "Device Connection Lost – Restarting the Session…",
+ "ToggleRestartSession": "Toggle Session Reload Upon Device Disconnect",
+ "toggleTableFormatting": "Toggle Table Formatting",
+ "copyResultToClipboard": "Copy Result to Clipboard",
+ "Property": "Property",
+ "noCapsFound": "No session capabilities found. Please use the Capability Builder to edit, add, and save your capability set. Refer to the tutorial at {{url}}",
+ "executeMethods": "Execute Methods",
+ "dynamicCommandsDescription": "Run commands supported by the currently active driver and plugin(s). Note that some commands may only work in specific contexts. Any commands not supported by WebdriverIO are not included in this list.",
+ "dynamicExecuteMethodsDescription": "Run any execute method supported by the currently active driver and plugin(s).",
+ "methodDeprecated": "This method is deprecated",
+ "App Settings": "App Settings",
+ "unableToImportSessionFiles": "Could not import sessions from the following files: {{fileNames}}",
+ "Import from File": "Import from File",
+ "useMjpegStream": "Use MJPEG Stream",
+ "useScreenshotApi": "Use Screenshot API",
+ "Box Model": "Box Model",
+ "detachFromSession": "Detach from Session",
+ "enterSessionID": "Enter session ID for attaching manually",
+ "refreshDiscoveredSessions": "Refresh Discovered Sessions",
+ "toggleMultiDisplayMode": "Toggle Multi-Display Mode"
+}
diff --git a/assets/locales/te/translation.json b/app/common/public/locales/te/translation.json
similarity index 80%
rename from assets/locales/te/translation.json
rename to app/common/public/locales/te/translation.json
index 84939b4e10..c2f6a6b2ee 100644
--- a/assets/locales/te/translation.json
+++ b/app/common/public/locales/te/translation.json
@@ -14,7 +14,6 @@
"Zoom Out": "Zoom Out",
"Reset Zoom Level": "Reset Zoom Level",
"Close Window": "Close Window",
- "Open Session File…": "Open Session File…",
"Bring All to Front": "అందరినీ ముందుకి తీసుకురండి",
"Help": "సహాయం",
"Appium Documentation": "Appium Documentation",
@@ -41,7 +40,6 @@
"Save Server Arguments Preset": "సేవ్ సర్వర్ ఆర్గ్యుమెంట్స్ ప్రీసెట్",
"Save": "సేవ్ చేయండి",
"Cancel": "రద్దు చేయండి",
- "datetimeFormat": "నెల తేదీ సంవత్సరం,గంట:నిమిషం> MMM Do YYYY, h:mma",
"updateDetails": "విడుదల తారీఖు: {{pubDate}}\nవిడుదల గమనికలు: {{notes}}",
"appiumIsAvailable": "Appium Inspector {{name}} అందుబాటులో ఉంది",
"updateIsBeingDownloaded": "అప్డేట్ ఇప్పుడు డౌన్లోడ్ చేయబడుతోంది. ఇది పూర్తయిన తర్వాత మీకు మళ్లీ తెలియజేయబడుతుంది",
@@ -68,20 +66,11 @@
"Could not start session": "సెషన్ను ప్రారంభించడం సాధ్యపడలేదు",
"couldNotConnect": "Could not connect to Appium server URL '{{url}}'. Please check if the server is running and the URL is correct (valid URLs can be found at the start of the Appium server log). If you are using the Inspector's browser version, ensure the server has been started with '--allow-cors'.",
"Invalid URL:": "Invalid URL:",
- "sauceCredentialsRequired": "సాస్ వినియోగదారు పేరు మరియు యాక్సెస్ కీ అవసరం!",
- "testingbotCredentialsRequired": "TestingBot కీ మరియు రహస్యం అవసరం!",
- "Perfecto SecurityToken is required": "పర్ఫెక్టో సెక్యూరిటీ టోకెన్ అవసరం",
- "browserstackCredentialsRequired": "బ్రౌజర్స్టాక్ వినియోగదారు పేరు మరియు యాక్సెస్ కీ అవసరం!",
- "lambdatestCredentialsRequired": "లాంబ్డా పరీక్ష వినియోగదారు పేరు మరియు యాక్సెస్ కీ అవసరం!",
- "bitbarCredentialsRequired": "బిట్ బార్ API కీ అవసరం!",
- "kobitonCredentialsRequired": "KOBITON వినియోగదారు పేరు మరియు api కీ అవసరం!",
- "experitestAccessKeyURLRequired": "Experitest యాక్సెస్కీ మరియు URL అవసరం",
"experitestAccessKey": "Experitest యాక్సెస్కీ",
"experitestUrl": "Experitest యొక్క Url",
"locatorStrategy": "లొకేటర్ వ్యూహం:",
"selector": "సెలెక్టర్:",
"couldNotObtainScreenshot": "'{{screenshotError}}' దీని కారణంగా స్క్రీన్షాట్ను పొందడం సాధ్యపడలేదు",
- "selectElementInSource": "ప్రారంభించడానికి మూలంలో ఒక మూలకాన్ని ఎంచుకోండి.",
"Press Home Button": "Press Home Button",
"Execute Siri Command": "Execute Siri Command",
"Press Back Button": "Press Back Button",
@@ -100,11 +89,11 @@
"Pause Recording": "రికార్డింగ్ను పాజ్ చేయండి",
"Search for element": "మూలకం కోసం శోధించండి",
"App Source": "App Source",
+ "Collapse All": "Collapse All",
"Toggle Attributes": "Toggle Attributes",
"Copy XML Source to Clipboard": "XML మూలాన్ని క్లిప్బోర్డ్కి కాపీ చేయండి",
"Download Source as .XML File": "Download Source as .XML File",
"Copy Attributes to Clipboard": "అట్రిబ్యూట్లను క్లిప్బోర్డ్కి కాపీ చేయండి",
- "quitSessionAndClose": "సెషన్ నుండి నిష్క్రమించండి & ఇన్స్పెక్టర్ మూసివేయండి",
"Session Inactive": "సెషన్ నిష్క్రియంగా ఉంది",
"Keep Session Running": "సెషన్ను కొనసాగించండి",
"Quit Session": "సెషన్ నుండి నిష్క్రమించండి",
@@ -132,8 +121,9 @@
"usingXPathNotRecommended": "XPath లొకేటర్లను ఉపయోగించడం సిఫారసు చేయబడలేదు మరియు పెళుసుగా ఉండే పరీక్షలకు దారితీయవచ్చు. బదులుగా ప్రత్యేకమైన యాక్సెసిబిలిటీ లొకేటర్లను అందించమని మీ డెవలప్మెంట్ బృందాన్ని అడగండి!",
"noAdditionalContextsFound": "అదనపు సందర్భాలు ఏవీ కనుగొనబడలేదు",
"contextDropdownInfo": "బహుళ సందర్భాలు కనుగొనబడ్డాయి; కొన్ని అంశాలు వేరే సందర్భానికి మారిన తర్వాత మాత్రమే ప్రాప్తించును. Appium ఇన్స్పెక్టర్లోని వెబ్వ్యూ తనిఖీ, Chrome లేదా Safari యొక్క DevTools కంటే తక్కువ ఖచ్చితమైనదని గమనించండి. మరింత సమాచారం కోసం, చూడండి:",
- "idAutocompletionCanBeDisabled": "The requested id selector does not have a package name prefix. This Appium session has package name autocompletion enabled, which may be the reason why no elements were found. To disable this behavior, relaunch this session with the capability 'appium:disableIdLocatorAutocompletion' set to 'true'.",
+ "idAutocompletionCanBeDisabled": "The requested id selector does not have a package name prefix. This Appium session has package name autocompletion enabled, which may be the reason why no elements were found. To disable this behavior, change the 'disableIdLocatorAutocompletion' setting to 'true'.",
"missingAutomationNameForStrategies": "Additional locator strategies may be available. To view them, add the capability 'appium:automationName' when launching the session. Note that this capability is mandatory in Appium 2.",
+ "snapshotMaxDepthReached": "This element is located at the maximum source depth {{selectedElementDepth}}, therefore its child elements (if any) are not shown. To reveal them, change the 'snapshotMaxDepth' setting to a value greater than {{selectedElementDepth}}. Check your driver documentation for the maximum supported value.",
"Tap": "నొక్కండి",
"Gathering initial app source…": "ప్రారంభ అప్లికేషన్ మూలాన్ని సేకరిస్తోంది…",
"couldNotObtainSource": "'{{errorMsg}}' కారణంగా మూలాన్ని పొందడం సాధ్యపడలేదు",
@@ -161,15 +151,14 @@
"boolean": "బూలియన్",
"number": "సంఖ్య",
"JSON object": "JSON వస్తువు",
- "filepath": "ఫైల్ మార్గం",
"connectToExistingSessionInstructions": "మీరు పై సర్వర్ రకానికి చెందిన సెషన్ను ఇప్పటికే అమలు చేస్తున్నట్లయితే, మీరు నేరుగా దానికి ఇన్స్పెక్టర్ని జోడించవచ్చు.",
- "selectSessionIDInDropdown": "దిగువ డ్రాప్డౌన్లో సెషన్ IDని ఎంచుకోండి.",
+ "selectSessionID": "You can manually enter your session ID, or, if the server supports session discovery, simply select from a list of active sessions.",
"allowUnauthorizedCerts": "అనధికార ధృవపత్రాలను అనుమతించండి",
"Use Proxy": "ప్రతినిధిని ఉపయోగించండి",
"JSON Representation": "JSON Representation",
"Capability Builder": "Capability Builder",
"Saved Capability Sets": "Saved Capability Sets",
- "Attach to Session": "సెషన్కు అటాచ్ చేయండి…",
+ "Attach": "Attach",
"localhost": "స్థానిక హోస్ట్",
"Host": "హోస్ట్",
"Port": "పోర్ట్",
@@ -195,16 +184,19 @@
"Remote Path": "రిమోట్ మార్గం",
"BrowserStack Username": "బ్రౌజర్స్టాక్ వినియోగదారు పేరు",
"BrowserStack Access Key": "బ్రౌజర్స్టాక్ యాక్సెస్ కీ",
- "LambdaTest Username": "లాంబ్డా టెస్ట్ వినియోగదారు పేరు",
- "LambdaTest Access Key": "లాంబ్డా టెస్ట్ యాక్సెస్ కీ",
+ "TestMu AI Username": "TestMu AI Username",
+ "TestMu AI Access Key": "TestMu AI Access Key",
"Bitbar API Key": "బిట్ బార్ API కీ",
"RemoteTestKit AccessToken": "RemoteTestKit AccessToken",
"RobotQA Token": "RobotQA Token",
+ "RobotActions Host": "RobotActions Host",
+ "RobotActions Token": "RobotActions Token",
+ "Add": "Add",
"Name": "పేరు",
"Description": "Description",
"Created": "Created",
"Actions": "Actions",
- "enterYourSessionId": "మీ సెషన్ IDని ఇక్కడ నమోదు చేయండి",
+ "searchSessions": "Search discovered sessions",
"Proxy URL": "బదులుగా నియమించు URL",
"Source": "మూలం",
"Commands": "Commands",
@@ -212,12 +204,14 @@
"Gestures": "Gestures",
"Gesture Builder": "Gesture Builder",
"Saved Gestures": "Saved Gestures",
+ "Create New Gesture": "Create New Gesture",
"gesturesDescription": "Create, save, and execute custom gestures here. Gestures are identical to action chains in the W3C WebDriver Actions API.",
"Session Information": "Session Information",
"Execute Command": "Execute Command",
"commandsDescription": "Run various commands using the current Appium driver. Note that not all drivers support all commands.",
- "Click to Set Coordinates": "Click to Set Coordinates",
- "Set Coordinates Via Field": "Set Coordinates Via Field",
+ "showMoveActionCoordsInPercentage": "Show Coordinates of Move Actions in Screen Dimension Percentages",
+ "showMoveActionCoordsInPixels": "Show Coordinates of Move Actions in Pixels",
+ "toggleMoveActionCoordPicker": "Toggle Setting Coordinates via Clicking on Screenshot",
"Action Type": "Action Type",
"Pointer Up": "Pointer Up",
"Pointer Down": "Pointer Down",
@@ -234,29 +228,23 @@
"Left": "Left",
"Right": "Right",
"Play": "Play",
+ "Export to File": "Export to File",
"Save Capability Set As": "సామర్థ్యాన్ని ఇలా సెట్ చేయండి...",
"Edit Raw JSON": "రా JSONని సవరించండి",
- "Enter Parameters for:": "Enter Parameters for:",
+ "enterMethodParameters": "Enter Parameters for: '{{methodName}}'",
"invalidJson": "Invalid JSON",
- "Execute Script": "Execute Script",
"App Management": "App Management",
- "Clipboard": "క్లిప్బోర్డ్",
"File Transfer": "File Transfer",
"Device Interaction": "Device Interaction",
- "Keyboard": "Keyboard",
- "Connectivity": "Connectivity",
- "Performance Data": "పనితీరు డేటా",
- "System": "వ్యవస్థ",
"Session": "సెషన్",
"Web": "Web",
"Context": "Context",
- "Window (W3C)": "Window (W3C)",
"simulatorOnly": "Emulator/simulator only",
"minAndroidSDK": "Minimum Android SDK level",
"Error": "లోపం",
"findingElementInSourceFailed": "Could not find the specified element. The current application source or element ID may have changed, or there may be too many elements with the same coordinates.",
"callToMethodFailed": "'{{methodName}}'కి కాల్ విఫలమైంది",
- "methodCallResult": "'{{methodName}}' ఫలితం",
+ "methodCallResult": "Result for: '{{methodName}}' (type: {{resultType}})",
"TestingBot Key": "టెస్టింగ్బాట్ కీ",
"TestingBot Secret": "టెస్టింగ్బాట్ సీక్రెట్",
"Appium Server": "Appium Server",
@@ -269,17 +257,75 @@
"Mobitru WebDriver URL": "Mobitru WebDriver URL",
"Mobitru Billing Unit": "Mobitru Billing Unit",
"Mobitru Access Key": "Mobitru Access Key",
- "mobitruCredentialsRequired": "Mobitru Access Key is required",
"Session URL": "Session URL",
"Server Details": "Server Details",
"Session Length": "Session Length",
"Session Details": "Session Details",
"Currently Active App ID": "Currently Active App ID",
- "Session ID": "Session ID",
"confirmDeletion": "Are you sure you want to delete this?",
"Copied!": "Copied!",
"Error Fetching Session URL": "Error Fetching Session URL",
- "noResultsFound": "No results found",
+ "noRunningSessionsFound": "No running sessions found",
"invalidCapType": "Invalid capability type: {{type}}",
- "whitespaceDetected": "Text Starts and/or Ends With Whitespace"
+ "whitespaceDetected": "Text Starts and/or Ends With Whitespace",
+ "duplicateCapabilityNameError": "A capability set with the same name already exists",
+ "unableToImportGestureFiles": "Could not import gestures from the following files: {{fileNames}}",
+ "invalidSessionFile": "Invalid session file",
+ "TV Labs API Key": "TV Labs API Key",
+ "TestcribeAPIKey": "Testcribe API Key",
+ "sessionTestcribeApiKeyDescription": "You can get your api key from https://app.testcribe.com/settings/apiKeys",
+ "missingVendorProperties": "Please provide the following server details for {{vendorName}}: {{vendorProps}}",
+ "missingServerInfo": "Missing server info, could not query sessions",
+ "Username": "Username",
+ "URL": "URL",
+ "WebDriver URL": "WebDriver URL",
+ "API Key": "API Key",
+ "Access Key": "Access Key",
+ "SecurityToken": "SecurityToken",
+ "AccessToken": "AccessToken",
+ "Token": "Token",
+ "Key": "Key",
+ "Secret": "Secret",
+ "Theme": "Theme",
+ "Light Theme": "Light Theme",
+ "Dark Theme": "Dark Theme",
+ "System Theme": "System Theme",
+ "Search Source": "Search Source",
+ "Matching Elements": "Matching Elements",
+ "webmateApiKey": "webmate API Key",
+ "yourProjectId": "Your Project ID",
+ "webmateProjectId": "webmate Project ID",
+ "specifyWebmateHostExplicitly": "Specify webmate host explicitly",
+ "webmateHost": "webmate Host",
+ "Enable": "Enable",
+ "yourFireflinkDevicefarmDomain": "Your Fireflink DeviceFarm Domain (e.g., cloud.fireflink.com)",
+ "yourLicenseId": "Your License ID",
+ "yourProjectName": "Your Project Name",
+ "License ID": "License ID",
+ "Project Name": "Project Name",
+ "Fireflink DeviceFarm Domain": "Fireflink DeviceFarm Domain",
+ "Fireflink DeviceFarm Access Key": "Fireflink DeviceFarm Access Key",
+ "Fireflink DeviceFarm License ID": "Fireflink DeviceFarm License ID",
+ "Fireflink DeviceFarm Project Name": "Fireflink DeviceFarm Project Name",
+ "RabbitQA API Key": "RabbitQA API Key",
+ "RestartSessionMessage": "Device Connection Lost – Restarting the Session…",
+ "ToggleRestartSession": "Toggle Session Reload Upon Device Disconnect",
+ "toggleTableFormatting": "Toggle Table Formatting",
+ "copyResultToClipboard": "Copy Result to Clipboard",
+ "Property": "Property",
+ "noCapsFound": "No session capabilities found. Please use the Capability Builder to edit, add, and save your capability set. Refer to the tutorial at {{url}}",
+ "executeMethods": "Execute Methods",
+ "dynamicCommandsDescription": "Run commands supported by the currently active driver and plugin(s). Note that some commands may only work in specific contexts. Any commands not supported by WebdriverIO are not included in this list.",
+ "dynamicExecuteMethodsDescription": "Run any execute method supported by the currently active driver and plugin(s).",
+ "methodDeprecated": "This method is deprecated",
+ "App Settings": "App Settings",
+ "unableToImportSessionFiles": "Could not import sessions from the following files: {{fileNames}}",
+ "Import from File": "Import from File",
+ "useMjpegStream": "Use MJPEG Stream",
+ "useScreenshotApi": "Use Screenshot API",
+ "Box Model": "Box Model",
+ "detachFromSession": "Detach from Session",
+ "enterSessionID": "Enter session ID for attaching manually",
+ "refreshDiscoveredSessions": "Refresh Discovered Sessions",
+ "toggleMultiDisplayMode": "Toggle Multi-Display Mode"
}
diff --git a/assets/locales/tr/translation.json b/app/common/public/locales/tr/translation.json
similarity index 71%
rename from assets/locales/tr/translation.json
rename to app/common/public/locales/tr/translation.json
index c6ee79a5d5..dc5b491161 100644
--- a/assets/locales/tr/translation.json
+++ b/app/common/public/locales/tr/translation.json
@@ -14,7 +14,6 @@
"Zoom Out": "Zoom Out",
"Reset Zoom Level": "Reset Zoom Level",
"Close Window": "Close Window",
- "Open Session File…": "Open Session File…",
"Bring All to Front": "Bring All to Front",
"Help": "Help",
"Appium Documentation": "Appium Documentation",
@@ -41,7 +40,6 @@
"Save Server Arguments Preset": "Save Server Arguments Preset",
"Save": "Save",
"Cancel": "Cancel",
- "datetimeFormat": "MMM Do YYYY, h:mma",
"updateDetails": "Release Date: {{pubDate}}\n\nRelease Notes: {{notes}}",
"appiumIsAvailable": "Appium Inspector {{name}} is available",
"updateIsBeingDownloaded": "Update is being downloaded now. You will be notified again when it is complete",
@@ -68,20 +66,11 @@
"Could not start session": "Could not start session",
"couldNotConnect": "Could not connect to Appium server URL '{{url}}'. Please check if the server is running and the URL is correct (valid URLs can be found at the start of the Appium server log). If you are using the Inspector's browser version, ensure the server has been started with '--allow-cors'.",
"Invalid URL:": "Invalid URL:",
- "sauceCredentialsRequired": "Sauce username and access key are required!",
- "testingbotCredentialsRequired": "TestingBot key and secret are required!",
- "Perfecto SecurityToken is required": "Perfecto SecurityToken is required",
- "browserstackCredentialsRequired": "Browserstack username and access key are required!",
- "lambdatestCredentialsRequired": "Lambdatest username and access key are required!",
- "bitbarCredentialsRequired": "Bitbar API key required!",
- "kobitonCredentialsRequired": "KOBITON username and api key are required!",
- "experitestAccessKeyURLRequired": "Experitest AccessKey and URL are required",
"experitestAccessKey": "Experitest AccessKey",
"experitestUrl": "Experitest Url",
"locatorStrategy": "Locator Strategy:",
"selector": "Selector:",
"couldNotObtainScreenshot": "Could not obtain screenshot: {{screenshotError}}",
- "selectElementInSource": "Select an element in the source to begin.",
"Press Home Button": "Press Home Button",
"Execute Siri Command": "Execute Siri Command",
"Press Back Button": "Press Back Button",
@@ -100,11 +89,11 @@
"Pause Recording": "Kaydı Duraklat",
"Search for element": "Öğe Ara",
"App Source": "Uygulama kaynağı",
+ "Collapse All": "Collapse All",
"Toggle Attributes": "Nitelikleri Değiştir",
"Copy XML Source to Clipboard": "Copy XML Source to Clipboard",
"Download Source as .XML File": "Download Source as .XML File",
"Copy Attributes to Clipboard": "Copy Attributes to Clipboard",
- "quitSessionAndClose": "Quit Session & Close Inspector",
"Session Inactive": "Session Inactive",
"Keep Session Running": "Keep Session Running",
"Quit Session": "Quit Session",
@@ -132,8 +121,9 @@
"usingXPathNotRecommended": "XPath konumlayıcıların kullanılması önerilmez ve hassas testlere yol açabilir. Bunun yerine geliştirme ekibinizden benzersiz erişilebilirlik konum belirleyicileri sağlamasını isteyin!",
"noAdditionalContextsFound": "Hiçbir ek bağlam algılanmadı",
"contextDropdownInfo": "Birden fazla bağlam algılandı; belirli öğelere yalnızca farklı bir bağlama geçtikten sonra erişilebilir. Appium Inspector'daki web görünümü denetiminin Chrome veya Safari'nin DevTools'una göre daha az doğru olduğunu unutmayın. Daha fazla bilgi için bakınız:",
- "idAutocompletionCanBeDisabled": "İstenen kimlik seçicinin paket adı öneki yok. Bu Appium oturumunda paket adı otomatik tamamlama özelliği etkinleştirildi; hiçbir öğenin bulunamamasının nedeni bu olabilir. Bu davranışı devre dışı bırakmak için, bu oturumu 'appium:disableIdLocatorAutocompletion' özelliği 'true' olarak ayarlanmış şekilde yeniden başlatın.",
+ "idAutocompletionCanBeDisabled": "The requested id selector does not have a package name prefix. This Appium session has package name autocompletion enabled, which may be the reason why no elements were found. To disable this behavior, change the 'disableIdLocatorAutocompletion' setting to 'true'.",
"missingAutomationNameForStrategies": "Ek konum belirleme stratejileri mevcut olabilir. Bunları görüntülemek için oturumu başlatırken 'appium:automationName' özelliğini ekleyin. Bu yeteneğin Appium 2'de zorunlu olduğunu unutmayın.",
+ "snapshotMaxDepthReached": "This element is located at the maximum source depth {{selectedElementDepth}}, therefore its child elements (if any) are not shown. To reveal them, change the 'snapshotMaxDepth' setting to a value greater than {{selectedElementDepth}}. Check your driver documentation for the maximum supported value.",
"Tap": "Zamanla",
"Gathering initial app source…": "Gathering initial app source…",
"couldNotObtainSource": "Could not obtain source: {{errorMsg}}",
@@ -161,15 +151,14 @@
"boolean": "boolean",
"number": "number",
"JSON object": "JSON object",
- "filepath": "filepath",
"connectToExistingSessionInstructions": "If you have an already-running session of the above server type, you can attach an inspector to it directly.",
- "selectSessionIDInDropdown": "Select the Session ID in the dropdown below.",
+ "selectSessionID": "You can manually enter your session ID, or, if the server supports session discovery, simply select from a list of active sessions.",
"allowUnauthorizedCerts": "Allow Unauthorized Certificates",
"Use Proxy": "Use Proxy",
"JSON Representation": "JSON Representation",
"Capability Builder": "Capability Builder",
"Saved Capability Sets": "Saved Capability Sets",
- "Attach to Session": "Attach to Session…",
+ "Attach": "Attach",
"localhost": "localhost",
"Host": "Host",
"Port": "Port",
@@ -195,16 +184,19 @@
"Remote Path": "Remote Path",
"BrowserStack Username": "BrowserStack Username",
"BrowserStack Access Key": "BrowserStack Access Key",
- "LambdaTest Username": "LambdaTest Username",
- "LambdaTest Access Key": "LambdaTest Access Key",
+ "TestMu AI Username": "TestMu AI Username",
+ "TestMu AI Access Key": "TestMu AI Access Key",
"Bitbar API Key": "Bitbar API Key",
"RemoteTestKit AccessToken": "RemoteTestKit AccessToken",
"RobotQA Token": "RobotQA Token",
+ "RobotActions Host": "RobotActions Host",
+ "RobotActions Token": "RobotActions Token",
+ "Add": "Add",
"Name": "Name",
"Description": "Description",
"Created": "Created",
"Actions": "Actions",
- "enterYourSessionId": "Enter your session ID here",
+ "searchSessions": "Search discovered sessions",
"Proxy URL": "Proxy URL",
"Source": "Source",
"Commands": "Commands",
@@ -212,12 +204,14 @@
"Gestures": "Gestures",
"Gesture Builder": "Gesture Builder",
"Saved Gestures": "Saved Gestures",
+ "Create New Gesture": "Create New Gesture",
"gesturesDescription": "Create, save, and execute custom gestures here. Gestures are identical to action chains in the W3C WebDriver Actions API.",
"Session Information": "Session Information",
"Execute Command": "Execute Command",
"commandsDescription": "Run various commands using the current Appium driver. Note that not all drivers support all commands.",
- "Click to Set Coordinates": "Click to Set Coordinates",
- "Set Coordinates Via Field": "Set Coordinates Via Field",
+ "showMoveActionCoordsInPercentage": "Show Coordinates of Move Actions in Screen Dimension Percentages",
+ "showMoveActionCoordsInPixels": "Show Coordinates of Move Actions in Pixels",
+ "toggleMoveActionCoordPicker": "Toggle Setting Coordinates via Clicking on Screenshot",
"Action Type": "Action Type",
"Pointer Up": "Pointer Up",
"Pointer Down": "Pointer Down",
@@ -234,29 +228,23 @@
"Left": "Left",
"Right": "Right",
"Play": "Play",
+ "Export to File": "Export to File",
"Save Capability Set As": "Save Capability Set As…",
"Edit Raw JSON": "Edit Raw JSON",
- "Enter Parameters for:": "Enter Parameters for:",
+ "enterMethodParameters": "Enter Parameters for: '{{methodName}}'",
"invalidJson": "Invalid JSON",
- "Execute Script": "Execute Script",
"App Management": "App Management",
- "Clipboard": "Clipboard",
"File Transfer": "File Transfer",
"Device Interaction": "Device Interaction",
- "Keyboard": "Keyboard",
- "Connectivity": "Connectivity",
- "Performance Data": "Performance Data",
- "System": "System",
"Session": "Session",
"Web": "Web",
"Context": "Context",
- "Window (W3C)": "Window (W3C)",
"simulatorOnly": "Emulator/simulator only",
"minAndroidSDK": "Minimum Android SDK level",
"Error": "Error",
"findingElementInSourceFailed": "Could not find the specified element. The current application source or element ID may have changed, or there may be too many elements with the same coordinates.",
"callToMethodFailed": "Call to '{{methodName}}' failed",
- "methodCallResult": "'{{methodName}}' result",
+ "methodCallResult": "Result for: '{{methodName}}' (type: {{resultType}})",
"TestingBot Key": "TestingBot Key",
"TestingBot Secret": "TestingBot Secret",
"Appium Server": "Appium Server",
@@ -269,17 +257,75 @@
"Mobitru WebDriver URL": "Mobitru WebDriver URL",
"Mobitru Billing Unit": "Mobitru Billing Unit",
"Mobitru Access Key": "Mobitru Access Key",
- "mobitruCredentialsRequired": "Mobitru Access Key is required",
"Session URL": "Session URL",
"Server Details": "Server Details",
"Session Length": "Session Length",
"Session Details": "Session Details",
"Currently Active App ID": "Currently Active App ID",
- "Session ID": "Session ID",
"confirmDeletion": "Are you sure you want to delete this?",
"Copied!": "Copied!",
"Error Fetching Session URL": "Error Fetching Session URL",
- "noResultsFound": "No results found",
+ "noRunningSessionsFound": "No running sessions found",
"invalidCapType": "Invalid capability type: {{type}}",
- "whitespaceDetected": "Text Starts and/or Ends With Whitespace"
+ "whitespaceDetected": "Text Starts and/or Ends With Whitespace",
+ "duplicateCapabilityNameError": "A capability set with the same name already exists",
+ "unableToImportGestureFiles": "Could not import gestures from the following files: {{fileNames}}",
+ "invalidSessionFile": "Invalid session file",
+ "TV Labs API Key": "TV Labs API Key",
+ "TestcribeAPIKey": "Testcribe API Key",
+ "sessionTestcribeApiKeyDescription": "You can get your api key from https://app.testcribe.com/settings/apiKeys",
+ "missingVendorProperties": "Please provide the following server details for {{vendorName}}: {{vendorProps}}",
+ "missingServerInfo": "Missing server info, could not query sessions",
+ "Username": "Username",
+ "URL": "URL",
+ "WebDriver URL": "WebDriver URL",
+ "API Key": "API Key",
+ "Access Key": "Access Key",
+ "SecurityToken": "SecurityToken",
+ "AccessToken": "AccessToken",
+ "Token": "Token",
+ "Key": "Key",
+ "Secret": "Secret",
+ "Theme": "Theme",
+ "Light Theme": "Light Theme",
+ "Dark Theme": "Dark Theme",
+ "System Theme": "System Theme",
+ "Search Source": "Search Source",
+ "Matching Elements": "Matching Elements",
+ "webmateApiKey": "webmate API Key",
+ "yourProjectId": "Your Project ID",
+ "webmateProjectId": "webmate Project ID",
+ "specifyWebmateHostExplicitly": "Specify webmate host explicitly",
+ "webmateHost": "webmate Host",
+ "Enable": "Enable",
+ "yourFireflinkDevicefarmDomain": "Your Fireflink DeviceFarm Domain (e.g., cloud.fireflink.com)",
+ "yourLicenseId": "Your License ID",
+ "yourProjectName": "Your Project Name",
+ "License ID": "License ID",
+ "Project Name": "Project Name",
+ "Fireflink DeviceFarm Domain": "Fireflink DeviceFarm Domain",
+ "Fireflink DeviceFarm Access Key": "Fireflink DeviceFarm Access Key",
+ "Fireflink DeviceFarm License ID": "Fireflink DeviceFarm License ID",
+ "Fireflink DeviceFarm Project Name": "Fireflink DeviceFarm Project Name",
+ "RabbitQA API Key": "RabbitQA API Key",
+ "RestartSessionMessage": "Device Connection Lost – Restarting the Session…",
+ "ToggleRestartSession": "Toggle Session Reload Upon Device Disconnect",
+ "toggleTableFormatting": "Toggle Table Formatting",
+ "copyResultToClipboard": "Copy Result to Clipboard",
+ "Property": "Property",
+ "noCapsFound": "No session capabilities found. Please use the Capability Builder to edit, add, and save your capability set. Refer to the tutorial at {{url}}",
+ "executeMethods": "Execute Methods",
+ "dynamicCommandsDescription": "Run commands supported by the currently active driver and plugin(s). Note that some commands may only work in specific contexts. Any commands not supported by WebdriverIO are not included in this list.",
+ "dynamicExecuteMethodsDescription": "Run any execute method supported by the currently active driver and plugin(s).",
+ "methodDeprecated": "This method is deprecated",
+ "App Settings": "App Settings",
+ "unableToImportSessionFiles": "Could not import sessions from the following files: {{fileNames}}",
+ "Import from File": "Import from File",
+ "useMjpegStream": "Use MJPEG Stream",
+ "useScreenshotApi": "Use Screenshot API",
+ "Box Model": "Box Model",
+ "detachFromSession": "Detach from Session",
+ "enterSessionID": "Enter session ID for attaching manually",
+ "refreshDiscoveredSessions": "Refresh Discovered Sessions",
+ "toggleMultiDisplayMode": "Toggle Multi-Display Mode"
}
diff --git a/assets/locales/uk/translation.json b/app/common/public/locales/uk/translation.json
similarity index 70%
rename from assets/locales/uk/translation.json
rename to app/common/public/locales/uk/translation.json
index 6cbedc0000..912cf8707c 100644
--- a/assets/locales/uk/translation.json
+++ b/app/common/public/locales/uk/translation.json
@@ -14,7 +14,6 @@
"Zoom Out": "Зменшити",
"Reset Zoom Level": "Скинути рівень масштабування",
"Close Window": "Закрити вікно",
- "Open Session File…": "Відкрити файл сесії…",
"Bring All to Front": "Помістити все на передній план",
"Help": "Допомога",
"Appium Documentation": "Документація Appium",
@@ -41,7 +40,6 @@
"Save Server Arguments Preset": "Зберегти налаштування параметрів сервера",
"Save": "Зберегти",
"Cancel": "Скасувати",
- "datetimeFormat": "D.M.YYYY, HH:mm",
"updateDetails": "Дата релізу: {{pubDate}}\n\nНотатки до релізу: {{notes}}",
"appiumIsAvailable": "Appium інспектор {{name}} доступний",
"updateIsBeingDownloaded": "Оновлення завантажується. Ви будете повідомлені, щойно процес завершиться",
@@ -68,20 +66,11 @@
"Could not start session": "Не вдалося почати сеанс",
"couldNotConnect": "Не вдалося з'єднатися з Appium сервером за URL-адресою '{{url}}. Перевірте, чи сервер запущений і чи правильний URL (дійсні URL-адреси можна знайти на початку журнала Appium). Якщо ви використовуєте Inspector версію браузера, переконайтеся, що сервер запущено з '--allow-cors'.",
"Invalid URL:": "Невірний URL:",
- "sauceCredentialsRequired": "Необхідні ім'я користувача та ключ доступу від Sauce!",
- "testingbotCredentialsRequired": "Необхідні ключ та секрет від TestingBot!",
- "Perfecto SecurityToken is required": "Необхідний Perfecto SecurityToken",
- "browserstackCredentialsRequired": "Необхідні ім'я користувача та ключ доступу від Browserstack!",
- "lambdatestCredentialsRequired": "Необхідні ім'я користувача та ключ доступу від Lambdatest!",
- "bitbarCredentialsRequired": "Потрібен API ключ Bitbar!",
- "kobitonCredentialsRequired": "Необхідні ім'я користувача та API ключ від KOBITON!",
- "experitestAccessKeyURLRequired": "Ключ доступу Experitest та адреса є обов'язковими",
"experitestAccessKey": "Ключ доступу Experitest",
"experitestUrl": "Адреса Experitest",
"locatorStrategy": "Стратегія локатора:",
"selector": "Селектор:",
"couldNotObtainScreenshot": "Не вдалося отримати скриншот: {{screenshotError}}",
- "selectElementInSource": "Виберіть елемент у джерелі, щоб почати.",
"Press Home Button": "Натисніть кнопку \"Додому\"",
"Execute Siri Command": "Виконати команду Siri",
"Press Back Button": "Натисніть кнопку \"Назад\"",
@@ -100,11 +89,11 @@
"Pause Recording": "Призупинити запис",
"Search for element": "Пошук елемента",
"App Source": "Джерело програми",
+ "Collapse All": "Згорнути все",
"Toggle Attributes": "Перемкнути атрибути",
"Copy XML Source to Clipboard": "Скопіювати XML в буфер обміну",
"Download Source as .XML File": "Завантажити джерело як .XML файл",
"Copy Attributes to Clipboard": "Скопіювати атрибути в буфер обміну",
- "quitSessionAndClose": "Завершити сесію та закрити інспектор",
"Session Inactive": "Сесія неактивна",
"Keep Session Running": "Зберігати сесію активною",
"Quit Session": "Завершити сесію",
@@ -132,8 +121,9 @@
"usingXPathNotRecommended": "Використання локаторів XPath не рекомендується і може призвести до нестабільності тестів. Попросіть свою команду розробників натомість присвоїти елементам унікальні локатори.",
"noAdditionalContextsFound": "Додаткові контексти не були виявлені",
"contextDropdownInfo": "Виявлено декілька контекстів; певні елементи можуть бути доступні лише після перемикання в інший контекст. Зауважте, що перевірка веб-перегляду в Appium Inspector менш точна, ніж інструменти розробника Chrome або Safari. Для отримання додаткової інформації дивіться:",
- "idAutocompletionCanBeDisabled": "Запитаний код селектора не має префіксу назви пакета. Цей сеанс Appium має увімкнену функцію автозавершення назви пакета. Це може бути причиною того, що не знайдено елементів. Для відключення цієї поведінки, перезапустіть цей сеанс з можливістю 'appium:disableIdLocatorAutocompletion' встановлено в 'true'.",
+ "idAutocompletionCanBeDisabled": "Запитаний селектор ідентифікатора не має префіксу назви пакета. Цей сеанс Appium має увімкнену функцію автозавершення назви пакета. Це може бути причиною того, що елементи не знайдено. Щоб вимкнути таку поведінку, змініть параметр 'disableIdLocatorAutocompletion' у значення 'true'.",
"missingAutomationNameForStrategies": "Додаткові стратегії розташування можуть бути доступні. Для їх перегляду додайте «appium:automationName» під час запуску сесії. Зауважте, що ця можливість обов'язкова в Appium 2.",
+ "snapshotMaxDepthReached": "Цей елемент розташований на максимальній глибині джерела {{selectedElementDepth}}, тому його дочірні елементи (якщо такі є) не відображаються. Щоб розкрити їх, змініть параметр \"snapshotMaxDepth\" на значення, більше ніж {{selectedElementDepth}}. Перевірте документацію драйвера щодо максимального підтримуваного значення.",
"Tap": "Торкніться",
"Gathering initial app source…": "Збирання початкового коду програми…",
"couldNotObtainSource": "Не вдалося отримати вихідний код: {{errorMsg}}",
@@ -161,15 +151,14 @@
"boolean": "логічний тип",
"number": "число",
"JSON object": "JSON-об'єкт",
- "filepath": "шлях до файлу",
"connectToExistingSessionInstructions": "Якщо у вас вже є сесія вищевказаного типу сервера, ви можете приєднатися інспектором безпосередньо до неї.",
- "selectSessionIDInDropdown": "Виберіть ID сесії у списку нижче.",
+ "selectSessionID": "Ви можете вручну ввести ідентифікатор сесії, або якщо сервер підтримує виявлення сесії, просто виберіть зі списку активних сесій.",
"allowUnauthorizedCerts": "Дозволити не довірені сертифікати",
"Use Proxy": "Використовувати проксі",
"JSON Representation": "Представлення JSON",
"Capability Builder": "Конструктор можливостей",
"Saved Capability Sets": "Збережені набори сесійних опцій",
- "Attach to Session": "Приєднатись до сесії…",
+ "Attach": "Прикріпити",
"localhost": "localhost",
"Host": "Хост",
"Port": "Порт",
@@ -195,16 +184,19 @@
"Remote Path": "Віддалений шлях",
"BrowserStack Username": "Логін від BrowserStack",
"BrowserStack Access Key": "Ключ доступу для BrowserStack",
- "LambdaTest Username": "Логін від LambdaTest",
- "LambdaTest Access Key": "Ключ доступу від LambdaTest",
+ "TestMu AI Username": "Імʼя користувача TestMu AI",
+ "TestMu AI Access Key": "Ключ доступу TestMu AI",
"Bitbar API Key": "API-ключ Bitbar",
"RemoteTestKit AccessToken": "Токен доступу RemoteTestKit",
"RobotQA Token": "RobotQA токен",
+ "RobotActions Host": "RobotActions хост",
+ "RobotActions Token": "RobotActions токен",
+ "Add": "Додати",
"Name": "Ім’я",
"Description": "Опис",
"Created": "Створено",
"Actions": "Дії",
- "enterYourSessionId": "Введіть свій ідентифікатор сесії тут",
+ "searchSessions": "Пошук відкритих сесій",
"Proxy URL": "Адреса проксі",
"Source": "Вихідний код",
"Commands": "Команди",
@@ -212,12 +204,14 @@
"Gestures": "Жести",
"Gesture Builder": "Конструктор жестів",
"Saved Gestures": "Збережені жести",
+ "Create New Gesture": "Створити новий жест",
"gesturesDescription": "Створюйте, зберігайте та виконувати користувацькі жести тут. Жести ідентичні ланцюжкам дій в W3C WebDriver Actions API.",
"Session Information": "Інформація про сеанс користувача",
"Execute Command": "Виконати команду",
"commandsDescription": "Виконайте різні команди, використовуючи поточний драйвер Appium. Зверніть увагу, що не всі драйвера підтримують всі команди.",
- "Click to Set Coordinates": "Натисніть, щоб встановити координати",
- "Set Coordinates Via Field": "Встановити координатне полів Via",
+ "showMoveActionCoordsInPercentage": "Показати координати дій переміщення у відсотках до розмірів екрана",
+ "showMoveActionCoordsInPixels": "Показувати координати дії переміщення в пікселях",
+ "toggleMoveActionCoordPicker": "Перемкнути налаштування координат через натискання на скріншот",
"Action Type": "Тип дії",
"Pointer Up": "Підняти вказівник",
"Pointer Down": "Опустити вказівник",
@@ -234,29 +228,23 @@
"Left": "Ліва",
"Right": "Права",
"Play": "Запустити",
+ "Export to File": "Експорт у файл",
"Save Capability Set As": "Зберегти набір опцій як…",
"Edit Raw JSON": "Редагувати сирий JSON",
- "Enter Parameters for:": "Введіть параметри для:",
+ "enterMethodParameters": "Введіть параметри для: '{{methodName}}'",
"invalidJson": "Невалідний JSON",
- "Execute Script": "Виконати скрипт",
"App Management": "Керування додатками",
- "Clipboard": "Буфер обміну",
"File Transfer": "Передавання файлів",
"Device Interaction": "Пристрій взаємодії",
- "Keyboard": "Клавіатура",
- "Connectivity": "Підключення",
- "Performance Data": "Дані про продуктивність",
- "System": "Система",
"Session": "Сесія",
"Web": "Веб",
"Context": "Контекст",
- "Window (W3C)": "Вікно (W3C)",
"simulatorOnly": "Лише емулятор / симулятор",
"minAndroidSDK": "Мінімальний рівень Android SDK",
"Error": "Помилка",
"findingElementInSourceFailed": "Не вдалося знайти вказаний елемент. Можливо, було змінено поточний вихідний код додатка або ідентифікатор елемента, або ж може бути забагато елементів з тими ж координатами.",
"callToMethodFailed": "Не вдалося викликати '{{methodName}}'",
- "methodCallResult": "'{{methodName}} результат",
+ "methodCallResult": "Результат для: '{{methodName}}' (тип: {{resultType}})",
"TestingBot Key": "Ключ TestingBot",
"TestingBot Secret": "Секрет TestingBot",
"Appium Server": "Appium сервер",
@@ -269,17 +257,75 @@
"Mobitru WebDriver URL": "Mobitru WebDriver посилання",
"Mobitru Billing Unit": "Платіжний блок Mobitru",
"Mobitru Access Key": "Mobitru ключ доступу",
- "mobitruCredentialsRequired": "Потрібен ключ доступу Mobitru",
"Session URL": "URL сесії",
"Server Details": "Деталі сервера",
"Session Length": "Тривалість сесії",
"Session Details": "Деталі сесії",
"Currently Active App ID": "Поточний Активний ID додатка",
- "Session ID": "ID сесії",
"confirmDeletion": "Ви дійсно бажаєте видалити це?",
"Copied!": "Скопійовано!",
"Error Fetching Session URL": "Помилка отримання URL-адреси сесії",
- "noResultsFound": "Результатів не знайдено",
+ "noRunningSessionsFound": "Не знайдено запущених сесій",
"invalidCapType": "Недійсний тип можливості: {{type}}",
- "whitespaceDetected": "Текст починається та/або закінчується пробілом"
+ "whitespaceDetected": "Текст починається та/або закінчується пробілом",
+ "duplicateCapabilityNameError": "Набір можливостей з таким ім'ям вже існує",
+ "unableToImportGestureFiles": "Неможливо імпортувати жести з наступних файлів: {{fileNames}}",
+ "invalidSessionFile": "Некоректний файл сеансу",
+ "TV Labs API Key": "TV Labs API ключ",
+ "TestcribeAPIKey": "Тестування API-ключа",
+ "sessionTestcribeApiKeyDescription": "Ви можете отримати свій API-ключ з https://app.testcribe.com/settings/apiKeys",
+ "missingVendorProperties": "Будь ласка, надайте наступну інформацію про сервер для {{vendorName}}: {{vendorProps}}",
+ "missingServerInfo": "Немає інформації про сервер, не вдалося отримати запит сесій",
+ "Username": "Ім'я користувача",
+ "URL": "URL-адреса",
+ "WebDriver URL": "URL-адреса WebDriver",
+ "API Key": "API ключ",
+ "Access Key": "Ключ доступу",
+ "SecurityToken": "Token безпеки",
+ "AccessToken": "Token доступу",
+ "Token": "Токен",
+ "Key": "Ключ",
+ "Secret": "Секретний ключ",
+ "Theme": "Тема",
+ "Light Theme": "Світла тема",
+ "Dark Theme": "Темна тема",
+ "System Theme": "Тема системи",
+ "Search Source": "Пошук джерела",
+ "Matching Elements": "Відповідні елементи",
+ "webmateApiKey": "ключ API webmate",
+ "yourProjectId": "ID вашого проекту",
+ "webmateProjectId": "ID проекту webmate",
+ "specifyWebmateHostExplicitly": "Укажіть хост webmate явно",
+ "webmateHost": "webmate хост",
+ "Enable": "Увімкнути",
+ "yourFireflinkDevicefarmDomain": "Ваш домен для Fireflink DeviceFarm (напр., cloud.fireflink.com)",
+ "yourLicenseId": "Ваш код ліцензії",
+ "yourProjectName": "Назва вашого проекту",
+ "License ID": "Ідентифікатор ліцензії",
+ "Project Name": "Назва проєкту",
+ "Fireflink DeviceFarm Domain": "Домен Fireflink DeviceFarm",
+ "Fireflink DeviceFarm Access Key": "Ключ доступу на Fireflink DeviceFarm",
+ "Fireflink DeviceFarm License ID": "Ідентифікатор ліцензії на DeviceFarm Fireflink",
+ "Fireflink DeviceFarm Project Name": "Назва проекту Fireflink DeviceFarm",
+ "RabbitQA API Key": "Ключ API для RabbitQA",
+ "RestartSessionMessage": "Втрачено підключення до пристрою – перезавантаження сесії…",
+ "ToggleRestartSession": "Перемикання сесії після відключення пристрою",
+ "toggleTableFormatting": "Перемкнути таблицю форматувань",
+ "copyResultToClipboard": "Копіювати результат до буфера обміну",
+ "Property": "Властивість",
+ "noCapsFound": "Можливості сеансу не знайдено. Будь ласка, скористайтеся Конструктором можливостей, щоб редагувати, додавати та зберігати свій набір можливостей. Див. навчальний посібник за адресою {{url}}",
+ "executeMethods": "Виконати методи",
+ "dynamicCommandsDescription": "Запустити команди, які підтримуються зараз активним драйвером та плагінами. Зверніть увагу, що деякі команди можуть працювати лише в певних контекстах. Будь-які команди, які не підтримуються WebdriverIO не включені в цей список.",
+ "dynamicExecuteMethodsDescription": "Запустити будь-який процес, який підтримується активним драйвером та плагінами.",
+ "methodDeprecated": "Цей метод є застарілим",
+ "App Settings": "Налаштування застосунку",
+ "unableToImportSessionFiles": "Неможливо імпортувати сеанси з наступних файлів: {{fileNames}}",
+ "Import from File": "Імпорт з файлу",
+ "useMjpegStream": "Використовувати MJPEG потік",
+ "useScreenshotApi": "Використовувати API знімки екрану",
+ "Box Model": "Коробкова модель",
+ "detachFromSession": "Відʼєднатися від сесії",
+ "enterSessionID": "Введіть ідентифікатор сесії для приєднання вручну",
+ "refreshDiscoveredSessions": "Оновити відкриті сесії",
+ "toggleMultiDisplayMode": "Перемкнути багатоекранний режим"
}
diff --git a/app/common/public/locales/vi/translation.json b/app/common/public/locales/vi/translation.json
new file mode 100644
index 0000000000..9ad71e149c
--- /dev/null
+++ b/app/common/public/locales/vi/translation.json
@@ -0,0 +1,331 @@
+{
+ "appiumInspector": "Appium Inspector",
+ "Edit": "Edit",
+ "Redo": "Redo",
+ "Cut": "Cut",
+ "Copy": "Copy",
+ "Paste": "Paste",
+ "Delete": "Delete",
+ "Select All": "Select All",
+ "Window": "Window",
+ "Minimize": "Minimize",
+ "Zoom": "Zoom",
+ "Zoom In": "Zoom In",
+ "Zoom Out": "Zoom Out",
+ "Reset Zoom Level": "Reset Zoom Level",
+ "Close Window": "Close Window",
+ "Bring All to Front": "Bring All to Front",
+ "Help": "Help",
+ "Appium Documentation": "Appium Documentation",
+ "Inspector Documentation": "Inspector Documentation",
+ "Appium Discussion Forum": "Appium Discussion Forum",
+ "Report Issues": "Report Issues",
+ "About Appium Inspector": "About Appium Inspector",
+ "showAppInfo": "App Version: {{appVersion}}\nElectron: {{electronVersion}}\nNode.js: {{nodejsVersion}}\n",
+ "Improve Translations": "Improve Translations",
+ "Check for Updates…": "Check for Updates…",
+ "File": "File",
+ "New Window": "New Window",
+ "Hide Appium Inspector": "Hide Appium Inspector",
+ "Hide Others": "Hide Others",
+ "Show All": "Show All",
+ "Quit Appium Inspector": "Quit Appium Inspector",
+ "Toggle Full Screen": "Toggle Full Screen",
+ "Languages": "Languages",
+ "View": "View",
+ "Reload": "Reload",
+ "Toggle Developer Tools": "Toggle Developer Tools",
+ "Undo": "Undo",
+ "Restart Now": "Restart Now",
+ "Save Server Arguments Preset": "Save Server Arguments Preset",
+ "Save": "Save",
+ "Cancel": "Cancel",
+ "updateDetails": "Release Date: {{pubDate}}\n\nRelease Notes: {{notes}}",
+ "appiumIsAvailable": "Appium Inspector {{name}} is available",
+ "updateIsBeingDownloaded": "Update is being downloaded now. You will be notified again when it is complete",
+ "updateIsDownloaded": "Appium Inspector {{releaseName}} has been downloaded. Must restart to apply the updates (note: it may take several minutes for Appium Inspector to install and restart)",
+ "updateDownloadFailed": "Failed to download update. Reason: {{message}}",
+ "OK": "OK",
+ "Install Now": "Install Now",
+ "Install Later": "Install Later",
+ "Update Download Started": "Update Download Started",
+ "No update available": "No update available",
+ "Appium Inspector is up-to-date": "Appium Inspector is up-to-date",
+ "Later": "Later",
+ "Update Downloaded": "Update Downloaded",
+ "Could not download update": "Could not download update",
+ "Unexpected Error:": "Unexpected Error:",
+ "Please report this issue at:": "Please report this issue at:",
+ "Full error trace:": "Full error trace:",
+ "Copy Error Trace": "Copy Error Trace",
+ "Inspect element": "Inspect element",
+ "Session closed due to inactivity": "Session closed due to inactivity",
+ "Session has been terminated": "Session has been terminated",
+ "frameworkNotSupported": "Framework '{{framework}}' not supported",
+ "findElementFailure": "Failed to find element for '{{methodName}}'. Please refresh page and try again.",
+ "Could not start session": "Could not start session",
+ "couldNotConnect": "Could not connect to Appium server URL '{{url}}'. Please check if the server is running and the URL is correct (valid URLs can be found at the start of the Appium server log). If you are using the Inspector's browser version, ensure the server has been started with '--allow-cors'.",
+ "Invalid URL:": "Invalid URL:",
+ "experitestAccessKey": "Experitest AccessKey",
+ "experitestUrl": "Experitest Url",
+ "locatorStrategy": "Locator Strategy:",
+ "selector": "Selector:",
+ "couldNotObtainScreenshot": "Could not obtain screenshot: {{screenshotError}}",
+ "Press Home Button": "Press Home Button",
+ "Execute Siri Command": "Execute Siri Command",
+ "Press Back Button": "Press Back Button",
+ "Press App Switch Button": "Press App Switch Button",
+ "Command": "Command",
+ "Show Element Handles": "Show Element Handles",
+ "Hide Element Handles": "Hide Element Handles",
+ "Select Elements": "Select Elements",
+ "Tap/Swipe By Coordinates": "Tap/Swipe By Coordinates",
+ "Download Screenshot": "Download Screenshot",
+ "Back": "Back",
+ "Start Refreshing Source": "Start Refreshing Source",
+ "Pause Refreshing Source": "Pause Refreshing Source",
+ "refreshSource": "Refresh Source & Screenshot",
+ "Start Recording": "Start Recording",
+ "Pause Recording": "Pause Recording",
+ "Search for element": "Search for element",
+ "App Source": "App Source",
+ "Collapse All": "Collapse All",
+ "Toggle Attributes": "Toggle Attributes",
+ "Copy XML Source to Clipboard": "Copy XML Source to Clipboard",
+ "Download Source as .XML File": "Download Source as .XML File",
+ "Copy Attributes to Clipboard": "Copy Attributes to Clipboard",
+ "Session Inactive": "Session Inactive",
+ "Keep Session Running": "Keep Session Running",
+ "Quit Session": "Quit Session",
+ "Your session is about to expire": "Your session is about to expire",
+ "Enter Keys to Send": "Enter Keys to Send",
+ "Find and Select in Source": "Find and Select in Source",
+ "Clear": "Clear",
+ "Send Keys": "Send Keys",
+ "Done": "Done",
+ "Search": "Search",
+ "Show/Hide Boilerplate Code": "Show/Hide Boilerplate Code",
+ "Copy code to clipboard": "Copy code to clipboard",
+ "Start this Kind of Session with Code": "Start this Kind of Session with Code",
+ "Clear Actions": "Clear Actions",
+ "Close Recorder": "Close Recorder",
+ "enableRecordingAndPerformActions": "Enable recording in the application header, then perform some actions to see code show up here",
+ "Recorder": "Recorder",
+ "Attribute": "Attribute",
+ "Value": "Value",
+ "Find By": "Find By",
+ "Selector": "Selector",
+ "Time": "Time (ms)",
+ "Get Timing": "Get Timing",
+ "interactionsNotAvailable": "Interactions for this element may not be available",
+ "usingXPathNotRecommended": "Using XPath locators is not recommended and can lead to fragile tests. Ask your development team to provide unique accessibility locators instead!",
+ "noAdditionalContextsFound": "No additional contexts have been detected",
+ "contextDropdownInfo": "Multiple contexts detected; certain elements might only be accessible after switching to a different context. Note that webview inspection in Appium Inspector is less accurate than the DevTools of Chrome or Safari. For more information, see:",
+ "idAutocompletionCanBeDisabled": "The requested id selector does not have a package name prefix. This Appium session has package name autocompletion enabled, which may be the reason why no elements were found. To disable this behavior, change the 'disableIdLocatorAutocompletion' setting to 'true'.",
+ "missingAutomationNameForStrategies": "Additional locator strategies may be available. To view them, add the capability 'appium:automationName' when launching the session. Note that this capability is mandatory in Appium 2.",
+ "snapshotMaxDepthReached": "This element is located at the maximum source depth {{selectedElementDepth}}, therefore its child elements (if any) are not shown. To reveal them, change the 'snapshotMaxDepth' setting to a value greater than {{selectedElementDepth}}. Check your driver documentation for the maximum supported value.",
+ "Tap": "Tap",
+ "Gathering initial app source…": "Gathering initial app source…",
+ "couldNotObtainSource": "Could not obtain source: {{errorMsg}}",
+ "iOS": "iOS",
+ "Android": "Android",
+ "desiredCapabilitiesDocumentation": "Capabilities Documentation",
+ "startSession": "Start Session",
+ "saveAs": "Save As…",
+ "attachToSession": "Attach to Session",
+ "selectedElement": "Selected Element",
+ "unnamed": "(Unnamed)",
+ "No Description": "No Description",
+ "couldNotFindEntryWithId": "Could not find an entry with ID {{id}}",
+ "couldNotFindAnyElements": "Could not find any elements",
+ "elementsCount": "Elements found:",
+ "xCoordinate": "X: {{x}}",
+ "yCoordinate": "Y: {{y}}",
+ "SauceLabs Data Center": "SauceLabs Data Center",
+ "US-West": "US West 1",
+ "US-East": "US East 4",
+ "EU-Central": "EU Central 1",
+ "proxyThroughSC": "Proxy through Sauce Connect's Selenium Relay",
+ "SSL": "SSL",
+ "text": "text",
+ "boolean": "boolean",
+ "number": "number",
+ "JSON object": "JSON object",
+ "connectToExistingSessionInstructions": "If you have an already-running session of the above server type, you can attach an inspector to it directly.",
+ "selectSessionID": "You can manually enter your session ID, or, if the server supports session discovery, simply select from a list of active sessions.",
+ "allowUnauthorizedCerts": "Allow Unauthorized Certificates",
+ "Use Proxy": "Use Proxy",
+ "JSON Representation": "JSON Representation",
+ "Capability Builder": "Capability Builder",
+ "Saved Capability Sets": "Saved Capability Sets",
+ "Attach": "Attach",
+ "localhost": "localhost",
+ "Host": "Host",
+ "Port": "Port",
+ "usingDataFoundIn": "Using data found in {{environmentVariable}}",
+ "yourUsername": "Your Username",
+ "Sauce Username": "Sauce Username",
+ "Sauce Access Key": "Sauce Access Key",
+ "yourAccessKey": "Your Access Key",
+ "yourApiKey": "Your API Key",
+ "Perfecto Host": "Perfecto Host",
+ "Perfecto Port": "Perfecto Port",
+ "Pcloudy User Name": "Pcloudy User Name",
+ "Pcloudy Host": "Pcloudy Host",
+ "Pcloudy API Key": "Pcloudy API Key",
+ "Add your token": "Add your token",
+ "Perfecto Token": "Perfecto Token",
+ "Your Kobiton Username": "Your Kobiton Username",
+ "Kobiton Access Key": "Kobiton Access Key",
+ "serverTabHeasdpinWebDriverURL": "HeadSpin Web Driver URL",
+ "sessionHeadspinWebDriverURLDescription": "Get the URL from the HeadSpin UI or the HeadSpin API using the automation configuration route",
+ "Remote Host": "Remote Host",
+ "Remote Port": "Remote Port",
+ "Remote Path": "Remote Path",
+ "BrowserStack Username": "BrowserStack Username",
+ "BrowserStack Access Key": "BrowserStack Access Key",
+ "TestMu AI Username": "TestMu AI Username",
+ "TestMu AI Access Key": "TestMu AI Access Key",
+ "Bitbar API Key": "Bitbar API Key",
+ "RemoteTestKit AccessToken": "RemoteTestKit AccessToken",
+ "RobotQA Token": "RobotQA Token",
+ "RobotActions Host": "RobotActions Host",
+ "RobotActions Token": "RobotActions Token",
+ "Add": "Add",
+ "Name": "Name",
+ "Description": "Description",
+ "Created": "Created",
+ "Actions": "Actions",
+ "searchSessions": "Search discovered sessions",
+ "Proxy URL": "Proxy URL",
+ "Source": "Source",
+ "Commands": "Commands",
+ "Execute Commands": "Execute Commands",
+ "Gestures": "Gestures",
+ "Gesture Builder": "Gesture Builder",
+ "Saved Gestures": "Saved Gestures",
+ "Create New Gesture": "Create New Gesture",
+ "gesturesDescription": "Create, save, and execute custom gestures here. Gestures are identical to action chains in the W3C WebDriver Actions API.",
+ "Session Information": "Session Information",
+ "Execute Command": "Execute Command",
+ "commandsDescription": "Run various commands using the current Appium driver. Note that not all drivers support all commands.",
+ "showMoveActionCoordsInPercentage": "Show Coordinates of Move Actions in Screen Dimension Percentages",
+ "showMoveActionCoordsInPixels": "Show Coordinates of Move Actions in Pixels",
+ "toggleMoveActionCoordPicker": "Toggle Setting Coordinates via Clicking on Screenshot",
+ "Action Type": "Action Type",
+ "Pointer Up": "Pointer Up",
+ "Pointer Down": "Pointer Down",
+ "Pause": "Pause",
+ "Move": "Move",
+ "Action Type Not Defined": "Action Type Not Defined",
+ "Duration": "Duration",
+ "Button": "Button",
+ "Untitled Gesture": "Untitled Gesture",
+ "Add Description": "Add Description",
+ "Gesture saved": "Gesture saved",
+ "Gesture saved as": "Gesture saved as '{{gestureName}}'",
+ "Duplicate pointer names are not allowed": "Duplicate pointer names are not allowed",
+ "Left": "Left",
+ "Right": "Right",
+ "Play": "Play",
+ "Export to File": "Export to File",
+ "Save Capability Set As": "Save Capability Set As…",
+ "Edit Raw JSON": "Edit Raw JSON",
+ "enterMethodParameters": "Enter Parameters for: '{{methodName}}'",
+ "invalidJson": "Invalid JSON",
+ "App Management": "App Management",
+ "File Transfer": "File Transfer",
+ "Device Interaction": "Device Interaction",
+ "Session": "Session",
+ "Web": "Web",
+ "Context": "Context",
+ "simulatorOnly": "Emulator/simulator only",
+ "minAndroidSDK": "Minimum Android SDK level",
+ "Error": "Error",
+ "findingElementInSourceFailed": "Could not find the specified element. The current application source or element ID may have changed, or there may be too many elements with the same coordinates.",
+ "callToMethodFailed": "Call to '{{methodName}}' failed",
+ "methodCallResult": "Result for: '{{methodName}}' (type: {{resultType}})",
+ "TestingBot Key": "TestingBot Key",
+ "TestingBot Secret": "TestingBot Secret",
+ "Appium Server": "Appium Server",
+ "Select Cloud Providers": "Select Cloud Providers",
+ "Advanced Settings": "Advanced Settings",
+ "Native App Mode": "Native App Mode",
+ "Web/Hybrid App Mode": "Web/Hybrid App Mode",
+ "autoAddPrefixes": "Automatically add necessary Appium vendor prefixes on start",
+ "attachSessionNotRunning": "Could not confirm that session {{attachSessId}} is running on the provided server. Please check details before trying to attach to the session again.",
+ "Mobitru WebDriver URL": "Mobitru WebDriver URL",
+ "Mobitru Billing Unit": "Mobitru Billing Unit",
+ "Mobitru Access Key": "Mobitru Access Key",
+ "Session URL": "Session URL",
+ "Server Details": "Server Details",
+ "Session Length": "Session Length",
+ "Session Details": "Session Details",
+ "Currently Active App ID": "Currently Active App ID",
+ "confirmDeletion": "Are you sure you want to delete this?",
+ "Copied!": "Copied!",
+ "Error Fetching Session URL": "Error Fetching Session URL",
+ "noRunningSessionsFound": "No running sessions found",
+ "invalidCapType": "Invalid capability type: {{type}}",
+ "whitespaceDetected": "Text Starts and/or Ends With Whitespace",
+ "duplicateCapabilityNameError": "A capability set with the same name already exists",
+ "unableToImportGestureFiles": "Could not import gestures from the following files: {{fileNames}}",
+ "invalidSessionFile": "Invalid session file",
+ "TV Labs API Key": "TV Labs API Key",
+ "TestcribeAPIKey": "Testcribe API Key",
+ "sessionTestcribeApiKeyDescription": "You can get your api key from https://app.testcribe.com/settings/apiKeys",
+ "missingVendorProperties": "Please provide the following server details for {{vendorName}}: {{vendorProps}}",
+ "missingServerInfo": "Missing server info, could not query sessions",
+ "Username": "Username",
+ "URL": "URL",
+ "WebDriver URL": "WebDriver URL",
+ "API Key": "API Key",
+ "Access Key": "Access Key",
+ "SecurityToken": "SecurityToken",
+ "AccessToken": "AccessToken",
+ "Token": "Token",
+ "Key": "Key",
+ "Secret": "Secret",
+ "Theme": "Theme",
+ "Light Theme": "Light Theme",
+ "Dark Theme": "Dark Theme",
+ "System Theme": "System Theme",
+ "Search Source": "Search Source",
+ "Matching Elements": "Matching Elements",
+ "webmateApiKey": "webmate API Key",
+ "yourProjectId": "Your Project ID",
+ "webmateProjectId": "webmate Project ID",
+ "specifyWebmateHostExplicitly": "Specify webmate host explicitly",
+ "webmateHost": "webmate Host",
+ "Enable": "Enable",
+ "yourFireflinkDevicefarmDomain": "Your Fireflink DeviceFarm Domain (e.g., cloud.fireflink.com)",
+ "yourLicenseId": "Your License ID",
+ "yourProjectName": "Your Project Name",
+ "License ID": "License ID",
+ "Project Name": "Project Name",
+ "Fireflink DeviceFarm Domain": "Fireflink DeviceFarm Domain",
+ "Fireflink DeviceFarm Access Key": "Fireflink DeviceFarm Access Key",
+ "Fireflink DeviceFarm License ID": "Fireflink DeviceFarm License ID",
+ "Fireflink DeviceFarm Project Name": "Fireflink DeviceFarm Project Name",
+ "RabbitQA API Key": "RabbitQA API Key",
+ "RestartSessionMessage": "Device Connection Lost – Restarting the Session…",
+ "ToggleRestartSession": "Toggle Session Reload Upon Device Disconnect",
+ "toggleTableFormatting": "Toggle Table Formatting",
+ "copyResultToClipboard": "Copy Result to Clipboard",
+ "Property": "Property",
+ "noCapsFound": "No session capabilities found. Please use the Capability Builder to edit, add, and save your capability set. Refer to the tutorial at {{url}}",
+ "executeMethods": "Execute Methods",
+ "dynamicCommandsDescription": "Run commands supported by the currently active driver and plugin(s). Note that some commands may only work in specific contexts. Any commands not supported by WebdriverIO are not included in this list.",
+ "dynamicExecuteMethodsDescription": "Run any execute method supported by the currently active driver and plugin(s).",
+ "methodDeprecated": "This method is deprecated",
+ "App Settings": "App Settings",
+ "unableToImportSessionFiles": "Could not import sessions from the following files: {{fileNames}}",
+ "Import from File": "Import from File",
+ "useMjpegStream": "Use MJPEG Stream",
+ "useScreenshotApi": "Use Screenshot API",
+ "Box Model": "Box Model",
+ "detachFromSession": "Detach from Session",
+ "enterSessionID": "Enter session ID for attaching manually",
+ "refreshDiscoveredSessions": "Refresh Discovered Sessions",
+ "toggleMultiDisplayMode": "Toggle Multi-Display Mode"
+}
diff --git a/app/common/public/locales/zh-CN/translation.json b/app/common/public/locales/zh-CN/translation.json
new file mode 100644
index 0000000000..954243c6e5
--- /dev/null
+++ b/app/common/public/locales/zh-CN/translation.json
@@ -0,0 +1,331 @@
+{
+ "appiumInspector": "Appium Inspector",
+ "Edit": "编辑",
+ "Redo": "恢复",
+ "Cut": "剪切",
+ "Copy": "复制",
+ "Paste": "粘贴",
+ "Delete": "删除",
+ "Select All": "全部选择",
+ "Window": "窗口",
+ "Minimize": "最小化",
+ "Zoom": "缩放",
+ "Zoom In": "放大",
+ "Zoom Out": "缩小",
+ "Reset Zoom Level": "重置缩放级别",
+ "Close Window": "关闭窗口",
+ "Bring All to Front": "前置全部窗口",
+ "Help": "帮助",
+ "Appium Documentation": "Appium 文档",
+ "Inspector Documentation": "Inspector 文档",
+ "Appium Discussion Forum": "Appium论坛",
+ "Report Issues": "报告问题",
+ "About Appium Inspector": "关于Appium Inspector",
+ "showAppInfo": "App 版本: {{appVersion}}\nElectron: {{electronVersion}}\nNode.js: {{nodejsVersion}}\n",
+ "Improve Translations": "帮助我们翻译",
+ "Check for Updates…": "检查更新",
+ "File": "文件",
+ "New Window": "新窗口",
+ "Hide Appium Inspector": "隐藏Appium Inspector",
+ "Hide Others": "隐藏其他窗口",
+ "Show All": "显示全部窗口",
+ "Quit Appium Inspector": "退出 Appium Inspector",
+ "Toggle Full Screen": "切换至全屏",
+ "Languages": "切换语言",
+ "View": "视图",
+ "Reload": "重新加载",
+ "Toggle Developer Tools": "切换开发者工具",
+ "Undo": "撤销",
+ "Restart Now": "立即重启",
+ "Save Server Arguments Preset": "保存服务器预设参数",
+ "Save": "保存",
+ "Cancel": "取消",
+ "updateDetails": "发布日期: {{pubDate}}\n\n版本注释: {{notes}}",
+ "appiumIsAvailable": "Appium Inspector {{name}} 可用",
+ "updateIsBeingDownloaded": "更新正在下载。完成后将再次通知您",
+ "updateIsDownloaded": "Appium Inspector {{releaseName}} 已经下载。必须重新启动以应用更新(注意:它可能需要几分钟时间,以便安装并重启)",
+ "updateDownloadFailed": "下载更新失败。原因: {{message}}",
+ "OK": "OK",
+ "Install Now": "马上安装",
+ "Install Later": "稍后安装",
+ "Update Download Started": "已经成功下载更新",
+ "No update available": "没有可用的更新",
+ "Appium Inspector is up-to-date": "Appium Inspector 是最新的",
+ "Later": "稍后",
+ "Update Downloaded": "已经成功下载更新",
+ "Could not download update": "无法下载更新",
+ "Unexpected Error:": "意外错误:",
+ "Please report this issue at:": "请在以下地方报告这个问题:",
+ "Full error trace:": "完整错误跟踪:",
+ "Copy Error Trace": "复制错误跟踪",
+ "Inspect element": "检查元素",
+ "Session closed due to inactivity": "会话因无活动而关闭",
+ "Session has been terminated": "会话已终止",
+ "frameworkNotSupported": "框架 \"{{framework}}\" 不受支持",
+ "findElementFailure": "找不到 '{{methodName}}' 的元素。请刷新页面并重试。",
+ "Could not start session": "无法启动会话",
+ "couldNotConnect": "无法连接到 Appium 服务器: URL '{{url}}'. 请检查服务器是否正在运行 并且 URL 是否正确 (正确的 URLs 可以在Appium的服务器日志开头中找到). 如果你使用的是Inspector的web版本,确保服务器以'--allow-cors'选项启动",
+ "Invalid URL:": "无效链接",
+ "experitestAccessKey": "AccessKey",
+ "experitestUrl": "Url",
+ "locatorStrategy": "定位策略:",
+ "selector": "选择器:",
+ "couldNotObtainScreenshot": "无法获取屏幕截图: {{screenshotError}}",
+ "Press Home Button": "按主页按钮",
+ "Execute Siri Command": "执行 Siri 命令",
+ "Press Back Button": "按返回按钮",
+ "Press App Switch Button": "按下应用切换按钮",
+ "Command": "Command 键",
+ "Show Element Handles": "显示元素处理器",
+ "Hide Element Handles": "隐藏元素处理器",
+ "Select Elements": "选择元素",
+ "Tap/Swipe By Coordinates": "根据坐标点击/滑动",
+ "Download Screenshot": "下载屏幕截图",
+ "Back": "返回",
+ "Start Refreshing Source": "开始刷新源",
+ "Pause Refreshing Source": "暂停刷新源",
+ "refreshSource": "刷新源和屏幕截图",
+ "Start Recording": "开始录制",
+ "Pause Recording": "暂停录制",
+ "Search for element": "搜索元素",
+ "App Source": "应用源",
+ "Collapse All": "折叠全部",
+ "Toggle Attributes": "切换属性",
+ "Copy XML Source to Clipboard": "将 XML 源复制到剪贴板",
+ "Download Source as .XML File": "下载源文件为 .XML 文件",
+ "Copy Attributes to Clipboard": "复制属性到剪贴板",
+ "Session Inactive": "会话不活动",
+ "Keep Session Running": "保持会话运行",
+ "Quit Session": "退出会话",
+ "Your session is about to expire": "您的会话即将过期",
+ "Enter Keys to Send": "输入要发送的密钥",
+ "Find and Select in Source": "选择文件",
+ "Clear": "清空",
+ "Send Keys": "发送密钥",
+ "Done": "完成",
+ "Search": "查找",
+ "Show/Hide Boilerplate Code": "显示/隐藏样板代码",
+ "Copy code to clipboard": "将代码复制到剪贴板",
+ "Start this Kind of Session with Code": "用代码开始这个类别的会话",
+ "Clear Actions": "清除操作",
+ "Close Recorder": "关闭录制",
+ "enableRecordingAndPerformActions": "在应用程序标题栏中启用录制,然后执行一些操作以查看此处显示的代码",
+ "Recorder": "录制",
+ "Attribute": "属性",
+ "Value": "值",
+ "Find By": "查找",
+ "Selector": "选择器",
+ "Time": "时间 (ms)",
+ "Get Timing": "获取计时",
+ "interactionsNotAvailable": "此元素的交互可能不可用",
+ "usingXPathNotRecommended": "不建议使用 XPath 定位器,这可能会导致脆弱的测试。请您的开发团队提供独特的辅助定位器!",
+ "noAdditionalContextsFound": "没有检测到其他环境",
+ "contextDropdownInfo": "检测到多个上下文;某些元素可能只有在切换到不同的上下文后才能访问。请注意,Appium Inspector 中的 webview 检查不如 Chrome 或 Safari 的开发者工具准确。更多信息,请参见:",
+ "idAutocompletionCanBeDisabled": "请求的 id 选择器没有包名前缀。此 Appium 会话启用了包名自动完成功能,这可能是找不到元素的原因。要禁用此行为,请将 'disableIdLocatorAutocompletion' 设置更改为 'true'。",
+ "missingAutomationNameForStrategies": "可能有更多的定位器策略。要查看它们,请在启动会话时添加名为“appium:automationName”的capability选项。 注意,在Appium 2中这种能力是强制性的。",
+ "snapshotMaxDepthReached": "此元素位于最大源深度 {{selectedElementDepth}},因此不显示其子元素(如果有)。要显示它们,请将 'snapshotMaxDepth' 设置更改为大于 {{selectedElementDepth}} 的值。查看驱动程序文档以了解支持的最大值。",
+ "Tap": "点击",
+ "Gathering initial app source…": "收集初始应用源…",
+ "couldNotObtainSource": "无法获取源代码: {{errorMsg}}",
+ "iOS": "iOS",
+ "Android": "Android",
+ "desiredCapabilitiesDocumentation": "Capabilities文档",
+ "startSession": "启动会话",
+ "saveAs": "另存为...",
+ "attachToSession": "附加到会话",
+ "selectedElement": "选定的元素",
+ "unnamed": "(未命名)",
+ "No Description": "暂无描述",
+ "couldNotFindEntryWithId": "找不到 ID 为 {{id}} 的条目",
+ "couldNotFindAnyElements": "找不到任何元素",
+ "elementsCount": "查找到的元素",
+ "xCoordinate": "X: {{x}}",
+ "yCoordinate": "Y: {{y}}",
+ "SauceLabs Data Center": "SauceLabs 数据中心",
+ "US-West": "美国西部1",
+ "US-East": "美国西部4",
+ "EU-Central": "欧洲中部1",
+ "proxyThroughSC": "通过 Sauce Connect 的 Selenium Relay 代理",
+ "SSL": "SSL",
+ "text": "文本",
+ "boolean": "布尔值",
+ "number": "数字",
+ "JSON object": "JSON 对象",
+ "connectToExistingSessionInstructions": "如果您有上述服务器类型的已运行会话, 则可以直接将检查器附加到该会话。",
+ "selectSessionID": "You can manually enter your session ID, or, if the server supports session discovery, simply select from a list of active sessions.",
+ "allowUnauthorizedCerts": "允许未经授权的证书",
+ "Use Proxy": "使用代理",
+ "JSON Representation": "JSON表示",
+ "Capability Builder": "能力构建器",
+ "Saved Capability Sets": "已保存的能力集",
+ "Attach": "添加",
+ "localhost": "本地主机",
+ "Host": "主机",
+ "Port": "端口",
+ "usingDataFoundIn": "使用在 {{environmentVariable}} 中找到的数据",
+ "yourUsername": "您的用户名",
+ "Sauce Username": "Sauce 用户名",
+ "Sauce Access Key": "Sauce 访问密钥",
+ "yourAccessKey": "您的访问密钥",
+ "yourApiKey": "您的 API 密钥",
+ "Perfecto Host": "Perfecto 主机",
+ "Perfecto Port": "Perfecto 端口",
+ "Pcloudy User Name": "Pcloudy 用户名",
+ "Pcloudy Host": "Pcloudy 主机",
+ "Pcloudy API Key": "Pcloudy API 密钥",
+ "Add your token": "添加您的 Token",
+ "Perfecto Token": "Perfecto Token",
+ "Your Kobiton Username": "您的 Kobiton 用户名",
+ "Kobiton Access Key": "Kobiton 访问密钥",
+ "serverTabHeasdpinWebDriverURL": "HeadSpin Web Driver URL",
+ "sessionHeadspinWebDriverURLDescription": "使用自动配置路由从 HeadSpin UI 或 HeadSpin API获取 URL",
+ "Remote Host": "远程主机",
+ "Remote Port": "远程端口",
+ "Remote Path": "远程路径",
+ "BrowserStack Username": "BrowserStack 用户名",
+ "BrowserStack Access Key": "BrowserStack 访问密钥",
+ "TestMu AI Username": "TestMu AI Username",
+ "TestMu AI Access Key": "TestMu AI 访问密钥",
+ "Bitbar API Key": "Bitbar API 密钥",
+ "RemoteTestKit AccessToken": "RemoteTestKit 访问令牌",
+ "RobotQA Token": "RobotQA 令牌",
+ "RobotActions Host": "RobotActions Host",
+ "RobotActions Token": "RobotActions Token",
+ "Add": "添加",
+ "Name": "名称",
+ "Description": "描述",
+ "Created": "已创建",
+ "Actions": "操作",
+ "searchSessions": "搜索发现的会话",
+ "Proxy URL": "代理 URL",
+ "Source": "源",
+ "Commands": "命令",
+ "Execute Commands": "执行命令",
+ "Gestures": "手势",
+ "Gesture Builder": "手势构建器",
+ "Saved Gestures": "已保存的手势",
+ "Create New Gesture": "Create New Gesture",
+ "gesturesDescription": "在此创建、保存和执行自定义手势。手势与 W3C WebDriver Actions API 中的动作链相同。",
+ "Session Information": "会话信息",
+ "Execute Command": "执行命令",
+ "commandsDescription": "使用当前 Appium 驱动程序运行各种命令。请注意,并非所有驱动程序都支持所有命令。",
+ "showMoveActionCoordsInPercentage": "以屏幕尺寸百分比显示移动动作的坐标",
+ "showMoveActionCoordsInPixels": "以像素显示移动动作的坐标",
+ "toggleMoveActionCoordPicker": "通过点击截图切换设置坐标",
+ "Action Type": "操作类型",
+ "Pointer Up": "指针抬起",
+ "Pointer Down": "指针按下",
+ "Pause": "暂停",
+ "Move": "移动",
+ "Action Type Not Defined": "操作类型未定义",
+ "Duration": "期限",
+ "Button": "按钮",
+ "Untitled Gesture": "未命名手势",
+ "Add Description": "添加描述",
+ "Gesture saved": "手势已保存",
+ "Gesture saved as": "手势已保存为 '{{gestureName}}'",
+ "Duplicate pointer names are not allowed": "不允许重复的指针名称",
+ "Left": "左方向键",
+ "Right": "右方向键",
+ "Play": "播放",
+ "Export to File": "导出至文件",
+ "Save Capability Set As": "保存能力设置为…",
+ "Edit Raw JSON": "直接编辑 JSON",
+ "enterMethodParameters": "输入此方法的参数: '{{methodName}}'",
+ "invalidJson": "无效的 JSON",
+ "App Management": "应用管理",
+ "File Transfer": "文件传输",
+ "Device Interaction": "设备交互",
+ "Session": "Session会话",
+ "Web": "Web",
+ "Context": "上下文",
+ "simulatorOnly": "模拟器/仅模拟器",
+ "minAndroidSDK": "最小的Android SDK版本",
+ "Error": "错误",
+ "findingElementInSourceFailed": "找不到指定的元素。 当前应用程序来源或元素 ID 可能已经改变,或者可能有太多具有相同坐标的元素。",
+ "callToMethodFailed": "调用 '{{methodName}}' 失败",
+ "methodCallResult": "'{{methodName}}' 方法的执行结果(类型为: {{resultType}})",
+ "TestingBot Key": "TestingBot 键",
+ "TestingBot Secret": "TestingBot Secret",
+ "Appium Server": "Appium 服务",
+ "Select Cloud Providers": "选择云提供商",
+ "Advanced Settings": "高级设置",
+ "Native App Mode": "Native App Mode",
+ "Web/Hybrid App Mode": "Web/Hybrid App Mode",
+ "autoAddPrefixes": "启动时自动添加必要的 Appium 供应商前缀",
+ "attachSessionNotRunning": "无法确认会话 {{attachSessId}} 在提供的服务器上运行。请在尝试再次附加到会话之前检查详细信息。",
+ "Mobitru WebDriver URL": "Mobitru WebDriver URL",
+ "Mobitru Billing Unit": "Mobitru 计费单位",
+ "Mobitru Access Key": "Mobitru 访问密钥",
+ "Session URL": "会话URL",
+ "Server Details": "服务器详细信息",
+ "Session Length": "会话长度",
+ "Session Details": "会话详情",
+ "Currently Active App ID": "当前活动的应用程序 ID",
+ "confirmDeletion": "您确定要删除吗?",
+ "Copied!": "复制成功!",
+ "Error Fetching Session URL": "获取会话URL 时出错",
+ "noRunningSessionsFound": "未找到正在运行的会话",
+ "invalidCapType": "无效的capability类型: {{type}}",
+ "whitespaceDetected": "文本开始和/或以空格结束",
+ "duplicateCapabilityNameError": "已存在同名的能力设置",
+ "unableToImportGestureFiles": "无法从{{fileNames}}中导入手势文件",
+ "invalidSessionFile": "无效的会话文件",
+ "TV Labs API Key": "TV Labs API 密钥",
+ "TestcribeAPIKey": "Testcribe API 密钥",
+ "sessionTestcribeApiKeyDescription": "你可以从 https://app.testcribe.com/settings/apiKeys 获取你的 API 密钥",
+ "missingVendorProperties": "请提供以下 {{vendorName}} 的服务器详细信息:{{vendorProps}}",
+ "missingServerInfo": "缺少服务器信息,无法查询会话",
+ "Username": "用户名",
+ "URL": "URL",
+ "WebDriver URL": "WebDriver URL",
+ "API Key": "API 密钥",
+ "Access Key": "访问密钥",
+ "SecurityToken": "安全令牌",
+ "AccessToken": "访问令牌",
+ "Token": "令牌",
+ "Key": "密钥",
+ "Secret": "密钥",
+ "Theme": "主题",
+ "Light Theme": "浅色主题",
+ "Dark Theme": "深色主题",
+ "System Theme": "系统主题",
+ "Search Source": "搜索来源",
+ "Matching Elements": "匹配元素",
+ "webmateApiKey": "webmate API 密钥",
+ "yourProjectId": "您的项目 ID",
+ "webmateProjectId": "webmate 项目 ID",
+ "specifyWebmateHostExplicitly": "明确指定webmate 主机",
+ "webmateHost": "webmate 主机",
+ "Enable": "启用",
+ "yourFireflinkDevicefarmDomain": "您的 Fireflink 设备域名(例如,Cloud.fireflink.com)",
+ "yourLicenseId": "您的许可证ID",
+ "yourProjectName": "您的项目名称",
+ "License ID": "许可证ID",
+ "Project Name": "项目名称",
+ "Fireflink DeviceFarm Domain": "Fireflink 设备农场域名",
+ "Fireflink DeviceFarm Access Key": "Fireflink 设备农场访问密钥",
+ "Fireflink DeviceFarm License ID": "Fireflink 设备农场许可证ID",
+ "Fireflink DeviceFarm Project Name": "Fireflink 设备农场项目名称",
+ "RabbitQA API Key": "RabbitQA API 密钥",
+ "RestartSessionMessage": "设备连接丢失——重启会话…",
+ "ToggleRestartSession": "设备断开时切换会话重新加载",
+ "toggleTableFormatting": "切换表格式",
+ "copyResultToClipboard": "复制结果到剪贴板",
+ "Property": "属性",
+ "noCapsFound": "未找到会话支持的功能。请使用功能构建器以编辑,添加并保存你的功能集。参考教程 {{url}}",
+ "executeMethods": "执行方法",
+ "dynamicCommandsDescription": "运行当前活动驱动程序和插件支持的命令。请注意,某些命令只能在特定环境中工作。 所有WebdriverIO 不支持的命令都不包含在这个列表中。",
+ "dynamicExecuteMethodsDescription": "运行当前活动驱动程序和插件支持的任何执行方法。",
+ "methodDeprecated": "此方法已被弃用",
+ "App Settings": "应用设置",
+ "unableToImportSessionFiles": "无法从以下文件中导入会话: {{fileNames}}",
+ "Import from File": "从文件导入",
+ "useMjpegStream": "使用 MJPEG 流",
+ "useScreenshotApi": "使用屏幕截图 API",
+ "Box Model": "方框模型",
+ "detachFromSession": "从会话中分离",
+ "enterSessionID": "请输入会话ID以手动连接",
+ "refreshDiscoveredSessions": "刷新发现的会话",
+ "toggleMultiDisplayMode": "Toggle Multi-Display Mode"
+}
diff --git a/assets/locales/zh-TW/translation.json b/app/common/public/locales/zh-TW/translation.json
similarity index 72%
rename from assets/locales/zh-TW/translation.json
rename to app/common/public/locales/zh-TW/translation.json
index 8e16c818b0..22537d9892 100644
--- a/assets/locales/zh-TW/translation.json
+++ b/app/common/public/locales/zh-TW/translation.json
@@ -14,7 +14,6 @@
"Zoom Out": "Zoom Out",
"Reset Zoom Level": "Reset Zoom Level",
"Close Window": "Close Window",
- "Open Session File…": "Open Session File…",
"Bring All to Front": "全部移到最上層",
"Help": "說明",
"Appium Documentation": "Appium Documentation",
@@ -41,7 +40,6 @@
"Save Server Arguments Preset": "Save Server Arguments Preset",
"Save": "Save",
"Cancel": "Cancel",
- "datetimeFormat": "MMM Do YYYY, h:mma",
"updateDetails": "Release Date: {{pubDate}}\n\nRelease Notes: {{notes}}",
"appiumIsAvailable": "Appium Inspector {{name}} is available",
"updateIsBeingDownloaded": "Update is being downloaded now. You will be notified again when it is complete",
@@ -68,20 +66,11 @@
"Could not start session": "Could not start session",
"couldNotConnect": "Could not connect to Appium server URL '{{url}}'. Please check if the server is running and the URL is correct (valid URLs can be found at the start of the Appium server log). If you are using the Inspector's browser version, ensure the server has been started with '--allow-cors'.",
"Invalid URL:": "Invalid URL:",
- "sauceCredentialsRequired": "Sauce username and access key are required!",
- "testingbotCredentialsRequired": "TestingBot key and secret are required!",
- "Perfecto SecurityToken is required": "Perfecto SecurityToken is required",
- "browserstackCredentialsRequired": "Browserstack username and access key are required!",
- "lambdatestCredentialsRequired": "Lambdatest username and access key are required!",
- "bitbarCredentialsRequired": "Bitbar API key required!",
- "kobitonCredentialsRequired": "KOBITON username and api key are required!",
- "experitestAccessKeyURLRequired": "Experitest AccessKey and URL are required",
"experitestAccessKey": "Experitest AccessKey",
"experitestUrl": "Experitest Url",
"locatorStrategy": "Locator Strategy:",
"selector": "Selector:",
"couldNotObtainScreenshot": "Could not obtain screenshot: {{screenshotError}}",
- "selectElementInSource": "Select an element in the source to begin.",
"Press Home Button": "Press Home Button",
"Execute Siri Command": "Execute Siri Command",
"Press Back Button": "Press Back Button",
@@ -100,11 +89,11 @@
"Pause Recording": "Pause Recording",
"Search for element": "Search for element",
"App Source": "App Source",
+ "Collapse All": "Collapse All",
"Toggle Attributes": "Toggle Attributes",
"Copy XML Source to Clipboard": "Copy XML Source to Clipboard",
"Download Source as .XML File": "Download Source as .XML File",
"Copy Attributes to Clipboard": "Copy Attributes to Clipboard",
- "quitSessionAndClose": "Quit Session & Close Inspector",
"Session Inactive": "Session Inactive",
"Keep Session Running": "Keep Session Running",
"Quit Session": "Quit Session",
@@ -132,8 +121,9 @@
"usingXPathNotRecommended": "Using XPath locators is not recommended and can lead to fragile tests. Ask your development team to provide unique accessibility locators instead!",
"noAdditionalContextsFound": "No additional contexts have been detected",
"contextDropdownInfo": "Multiple contexts detected; certain elements might only be accessible after switching to a different context. Note that webview inspection in Appium Inspector is less accurate than the DevTools of Chrome or Safari. For more information, see:",
- "idAutocompletionCanBeDisabled": "The requested id selector does not have a package name prefix. This Appium session has package name autocompletion enabled, which may be the reason why no elements were found. To disable this behavior, relaunch this session with the capability 'appium:disableIdLocatorAutocompletion' set to 'true'.",
+ "idAutocompletionCanBeDisabled": "The requested id selector does not have a package name prefix. This Appium session has package name autocompletion enabled, which may be the reason why no elements were found. To disable this behavior, change the 'disableIdLocatorAutocompletion' setting to 'true'.",
"missingAutomationNameForStrategies": "Additional locator strategies may be available. To view them, add the capability 'appium:automationName' when launching the session. Note that this capability is mandatory in Appium 2.",
+ "snapshotMaxDepthReached": "This element is located at the maximum source depth {{selectedElementDepth}}, therefore its child elements (if any) are not shown. To reveal them, change the 'snapshotMaxDepth' setting to a value greater than {{selectedElementDepth}}. Check your driver documentation for the maximum supported value.",
"Tap": "Tap",
"Gathering initial app source…": "Gathering initial app source…",
"couldNotObtainSource": "Could not obtain source: {{errorMsg}}",
@@ -161,15 +151,14 @@
"boolean": "boolean",
"number": "number",
"JSON object": "JSON object",
- "filepath": "filepath",
"connectToExistingSessionInstructions": "If you have an already-running session of the above server type, you can attach an inspector to it directly.",
- "selectSessionIDInDropdown": "Select the Session ID in the dropdown below.",
+ "selectSessionID": "You can manually enter your session ID, or, if the server supports session discovery, simply select from a list of active sessions.",
"allowUnauthorizedCerts": "Allow Unauthorized Certificates",
"Use Proxy": "Use Proxy",
"JSON Representation": "JSON Representation",
"Capability Builder": "Capability Builder",
"Saved Capability Sets": "Saved Capability Sets",
- "Attach to Session": "Attach to Session…",
+ "Attach": "Attach",
"localhost": "localhost",
"Host": "Host",
"Port": "Port",
@@ -195,16 +184,19 @@
"Remote Path": "Remote Path",
"BrowserStack Username": "BrowserStack Username",
"BrowserStack Access Key": "BrowserStack Access Key",
- "LambdaTest Username": "LambdaTest Username",
- "LambdaTest Access Key": "LambdaTest Access Key",
+ "TestMu AI Username": "TestMu AI Username",
+ "TestMu AI Access Key": "TestMu AI Access Key",
"Bitbar API Key": "Bitbar API Key",
"RemoteTestKit AccessToken": "RemoteTestKit AccessToken",
"RobotQA Token": "RobotQA Token",
+ "RobotActions Host": "RobotActions Host",
+ "RobotActions Token": "RobotActions Token",
+ "Add": "Add",
"Name": "Name",
"Description": "Description",
"Created": "Created",
"Actions": "Actions",
- "enterYourSessionId": "Enter your session ID here",
+ "searchSessions": "Search discovered sessions",
"Proxy URL": "Proxy URL",
"Source": "Source",
"Commands": "Commands",
@@ -212,12 +204,14 @@
"Gestures": "Gestures",
"Gesture Builder": "Gesture Builder",
"Saved Gestures": "Saved Gestures",
+ "Create New Gesture": "Create New Gesture",
"gesturesDescription": "Create, save, and execute custom gestures here. Gestures are identical to action chains in the W3C WebDriver Actions API.",
"Session Information": "Session Information",
"Execute Command": "Execute Command",
"commandsDescription": "Run various commands using the current Appium driver. Note that not all drivers support all commands.",
- "Click to Set Coordinates": "Click to Set Coordinates",
- "Set Coordinates Via Field": "Set Coordinates Via Field",
+ "showMoveActionCoordsInPercentage": "Show Coordinates of Move Actions in Screen Dimension Percentages",
+ "showMoveActionCoordsInPixels": "Show Coordinates of Move Actions in Pixels",
+ "toggleMoveActionCoordPicker": "Toggle Setting Coordinates via Clicking on Screenshot",
"Action Type": "Action Type",
"Pointer Up": "Pointer Up",
"Pointer Down": "Pointer Down",
@@ -234,29 +228,23 @@
"Left": "Left",
"Right": "Right",
"Play": "Play",
+ "Export to File": "Export to File",
"Save Capability Set As": "Save Capability Set As…",
"Edit Raw JSON": "Edit Raw JSON",
- "Enter Parameters for:": "Enter Parameters for:",
+ "enterMethodParameters": "Enter Parameters for: '{{methodName}}'",
"invalidJson": "Invalid JSON",
- "Execute Script": "Execute Script",
"App Management": "App Management",
- "Clipboard": "Clipboard",
"File Transfer": "File Transfer",
"Device Interaction": "Device Interaction",
- "Keyboard": "Keyboard",
- "Connectivity": "Connectivity",
- "Performance Data": "Performance Data",
- "System": "System",
"Session": "Session",
"Web": "Web",
"Context": "Context",
- "Window (W3C)": "Window (W3C)",
"simulatorOnly": "Emulator/simulator only",
"minAndroidSDK": "Minimum Android SDK level",
"Error": "Error",
"findingElementInSourceFailed": "Could not find the specified element. The current application source or element ID may have changed, or there may be too many elements with the same coordinates.",
"callToMethodFailed": "Call to '{{methodName}}' failed",
- "methodCallResult": "'{{methodName}}' result",
+ "methodCallResult": "Result for: '{{methodName}}' (type: {{resultType}})",
"TestingBot Key": "TestingBot Key",
"TestingBot Secret": "TestingBot Secret",
"Appium Server": "Appium Server",
@@ -269,17 +257,75 @@
"Mobitru WebDriver URL": "Mobitru WebDriver URL",
"Mobitru Billing Unit": "Mobitru Billing Unit",
"Mobitru Access Key": "Mobitru Access Key",
- "mobitruCredentialsRequired": "Mobitru Access Key is required",
"Session URL": "Session URL",
"Server Details": "Server Details",
"Session Length": "Session Length",
"Session Details": "Session Details",
"Currently Active App ID": "Currently Active App ID",
- "Session ID": "Session ID",
"confirmDeletion": "Are you sure you want to delete this?",
"Copied!": "Copied!",
"Error Fetching Session URL": "Error Fetching Session URL",
- "noResultsFound": "No results found",
+ "noRunningSessionsFound": "No running sessions found",
"invalidCapType": "Invalid capability type: {{type}}",
- "whitespaceDetected": "Text Starts and/or Ends With Whitespace"
+ "whitespaceDetected": "Text Starts and/or Ends With Whitespace",
+ "duplicateCapabilityNameError": "A capability set with the same name already exists",
+ "unableToImportGestureFiles": "Could not import gestures from the following files: {{fileNames}}",
+ "invalidSessionFile": "Invalid session file",
+ "TV Labs API Key": "TV Labs API Key",
+ "TestcribeAPIKey": "Testcribe API Key",
+ "sessionTestcribeApiKeyDescription": "You can get your api key from https://app.testcribe.com/settings/apiKeys",
+ "missingVendorProperties": "Please provide the following server details for {{vendorName}}: {{vendorProps}}",
+ "missingServerInfo": "Missing server info, could not query sessions",
+ "Username": "Username",
+ "URL": "URL",
+ "WebDriver URL": "WebDriver URL",
+ "API Key": "API Key",
+ "Access Key": "Access Key",
+ "SecurityToken": "SecurityToken",
+ "AccessToken": "AccessToken",
+ "Token": "Token",
+ "Key": "Key",
+ "Secret": "Secret",
+ "Theme": "Theme",
+ "Light Theme": "Light Theme",
+ "Dark Theme": "Dark Theme",
+ "System Theme": "System Theme",
+ "Search Source": "Search Source",
+ "Matching Elements": "Matching Elements",
+ "webmateApiKey": "webmate API Key",
+ "yourProjectId": "Your Project ID",
+ "webmateProjectId": "webmate Project ID",
+ "specifyWebmateHostExplicitly": "Specify webmate host explicitly",
+ "webmateHost": "webmate Host",
+ "Enable": "Enable",
+ "yourFireflinkDevicefarmDomain": "Your Fireflink DeviceFarm Domain (e.g., cloud.fireflink.com)",
+ "yourLicenseId": "Your License ID",
+ "yourProjectName": "Your Project Name",
+ "License ID": "License ID",
+ "Project Name": "Project Name",
+ "Fireflink DeviceFarm Domain": "Fireflink DeviceFarm Domain",
+ "Fireflink DeviceFarm Access Key": "Fireflink DeviceFarm Access Key",
+ "Fireflink DeviceFarm License ID": "Fireflink DeviceFarm License ID",
+ "Fireflink DeviceFarm Project Name": "Fireflink DeviceFarm Project Name",
+ "RabbitQA API Key": "RabbitQA API Key",
+ "RestartSessionMessage": "Device Connection Lost – Restarting the Session…",
+ "ToggleRestartSession": "Toggle Session Reload Upon Device Disconnect",
+ "toggleTableFormatting": "Toggle Table Formatting",
+ "copyResultToClipboard": "Copy Result to Clipboard",
+ "Property": "Property",
+ "noCapsFound": "No session capabilities found. Please use the Capability Builder to edit, add, and save your capability set. Refer to the tutorial at {{url}}",
+ "executeMethods": "Execute Methods",
+ "dynamicCommandsDescription": "Run commands supported by the currently active driver and plugin(s). Note that some commands may only work in specific contexts. Any commands not supported by WebdriverIO are not included in this list.",
+ "dynamicExecuteMethodsDescription": "Run any execute method supported by the currently active driver and plugin(s).",
+ "methodDeprecated": "This method is deprecated",
+ "App Settings": "App Settings",
+ "unableToImportSessionFiles": "Could not import sessions from the following files: {{fileNames}}",
+ "Import from File": "Import from File",
+ "useMjpegStream": "Use MJPEG Stream",
+ "useScreenshotApi": "Use Screenshot API",
+ "Box Model": "Box Model",
+ "detachFromSession": "Detach from Session",
+ "enterSessionID": "Enter session ID for attaching manually",
+ "refreshDiscoveredSessions": "Refresh Discovered Sessions",
+ "toggleMultiDisplayMode": "Toggle Multi-Display Mode"
}
diff --git a/app/common/renderer/actions/SessionBuilder.js b/app/common/renderer/actions/SessionBuilder.js
new file mode 100644
index 0000000000..2072c49356
--- /dev/null
+++ b/app/common/renderer/actions/SessionBuilder.js
@@ -0,0 +1,1108 @@
+import _ from 'lodash';
+import sanitize from 'sanitize-filename';
+
+import {
+ SAVED_SESSIONS,
+ SERVER_ARGS,
+ SESSION_SERVER_PARAMS,
+ SESSION_SERVER_TYPE,
+ VISIBLE_PROVIDERS,
+} from '../../shared/setting-defs.js';
+import {
+ DEFAULT_SESSION_NAME,
+ SERVER_TYPES,
+ SESSION_BUILDER_TABS,
+ SESSION_FILE_VERSIONS,
+} from '../constants/session-builder.js';
+import {APP_MODE} from '../constants/session-inspector.js';
+import {DEFAULT_SERVER_PROPS} from '../constants/webdriver.js';
+import i18n from '../i18next.js';
+import WDSessionStarter from '../lib/appium/session-starter.js';
+import {VENDOR_MAP} from '../lib/vendor/map.js';
+import {getSetting, loadSessionFileIfOpened, setSetting} from '../polyfills.js';
+import {
+ fetchSessionInformation,
+ formatSeleniumGridSessions,
+} from '../utils/attaching-to-session.js';
+import {downloadFile, readTextFromUploadedFiles} from '../utils/file-handling.js';
+import {log} from '../utils/logger.js';
+import {notification} from '../utils/notification.js';
+import {addVendorPrefixes, getRandomId} from '../utils/other.js';
+import {parseSessionFileContents} from '../utils/sessionfile-parsing.js';
+import {quitSession, setSessionDetails} from './SessionInspector.js';
+
+export const NEW_SESSION_REQUESTED = 'NEW_SESSION_REQUESTED';
+export const NEW_SESSION_LOADING = 'NEW_SESSION_LOADING';
+export const NEW_SESSION_DONE = 'NEW_SESSION_DONE';
+export const CHANGE_CAPABILITY = 'CHANGE_CAPABILITY';
+export const SAVE_SESSION_REQUESTED = 'SAVE_SESSION_REQUESTED';
+export const SAVE_SESSION_DONE = 'SAVE_SESSION_DONE';
+export const GET_SAVED_SESSIONS_REQUESTED = 'GET_SAVED_SESSIONS_REQUESTED';
+export const GET_SAVED_SESSIONS_DONE = 'GET_SAVED_SESSIONS_DONE';
+export const SET_CAPABILITY_PARAM = 'SET_CAPABILITY_PARAM';
+export const ADD_CAPABILITY = 'ADD_CAPABILITY';
+export const REMOVE_CAPABILITY = 'REMOVE_CAPABILITY';
+export const SWITCHED_TABS = 'SWITCHED_TABS';
+export const SET_CAPS_AND_SERVER = 'SET_CAPS_AND_SERVER';
+export const SAVE_AS_MODAL_REQUESTED = 'SAVE_AS_MODAL_REQUESTED';
+export const HIDE_SAVE_AS_MODAL_REQUESTED = 'HIDE_SAVE_AS_MODAL_REQUESTED';
+export const SET_SAVE_AS_TEXT = 'SET_SAVE_AS_TEXT';
+export const DELETE_SAVED_SESSION_REQUESTED = 'DELETE_SAVED_SESSION_REQUESTED';
+export const DELETE_SAVED_SESSION_DONE = 'DELETE_SAVED_SESSION_DONE';
+export const CHANGE_SERVER_TYPE = 'CHANGE_SERVER_TYPE';
+export const SET_SERVER_PARAM = 'SET_SERVER_PARAM';
+export const SET_SERVER = 'SET_SERVER';
+
+export const GET_SESSIONS_REQUESTED = 'GET_SESSIONS_REQUESTED';
+export const GET_SESSIONS_DONE = 'GET_SESSIONS_DONE';
+
+export const ENABLE_DESIRED_CAPS_NAME_EDITOR = 'ENABLE_DESIRED_CAPS_NAME_EDITOR';
+export const ABORT_DESIRED_CAPS_NAME_EDITOR = 'ABORT_DESIRED_CAPS_NAME_EDITOR';
+export const SAVE_DESIRED_CAPS_NAME = 'SAVE_DESIRED_CAPS_NAME';
+export const SET_DESIRED_CAPS_NAME = 'SET_DESIRED_CAPS_NAME';
+
+export const ENABLE_DESIRED_CAPS_EDITOR = 'ENABLE_DESIRED_CAPS_EDITOR';
+export const ABORT_DESIRED_CAPS_EDITOR = 'ABORT_DESIRED_CAPS_EDITOR';
+export const SAVE_RAW_DESIRED_CAPS = 'SAVE_RAW_DESIRED_CAPS';
+export const SET_RAW_DESIRED_CAPS = 'SET_RAW_DESIRED_CAPS';
+export const SHOW_DESIRED_CAPS_JSON_ERROR = 'SHOW_DESIRED_CAPS_JSON_ERROR';
+
+export const IS_ADDING_CLOUD_PROVIDER = 'IS_ADDING_CLOUD_PROVIDER';
+
+export const SET_PROVIDERS = 'SET_PROVIDERS';
+
+export const SET_ADD_VENDOR_PREFIXES = 'SET_ADD_VENDOR_PREFIXES';
+
+export const SET_CAPABILITY_NAME_ERROR = 'SET_CAPABILITY_NAME_ERROR';
+export const SET_STATE_FROM_URL = 'SET_STATE_FROM_URL';
+export const SET_STATE_FROM_FILE = 'SET_STATE_FROM_FILE';
+
+export const SESSION_UPLOAD_REQUESTED = 'SESSION_UPLOAD_REQUESTED';
+export const SESSION_UPLOAD_DONE = 'SESSION_UPLOAD_DONE';
+
+const CAPS_NEW_COMMAND = 'appium:newCommandTimeout';
+const CAPS_CONNECT_HARDWARE_KEYBOARD = 'appium:connectHardwareKeyboard';
+const CAPS_NATIVE_WEB_SCREENSHOT = 'appium:nativeWebScreenshot';
+const CAPS_ENSURE_WEBVIEW_HAVE_PAGES = 'appium:ensureWebviewsHavePages';
+const CAPS_INCLUDE_SAFARI_IN_WEBVIEWS = 'appium:includeSafariInWebviews';
+
+const AUTO_START_URL_PARAM = '1'; // what should be passed in to ?autoStart= to turn it on
+
+const MJPEG_CAP = 'mjpegScreenshotUrl';
+const MJPEG_PORT_CAP = 'mjpegServerPort';
+
+// Multiple requests sometimes send a new session request
+// after establishing a session.
+// This situation could happen easier on cloud vendors,
+// so let's set zero so far.
+// TODO: increase this retry when we get issues
+export const CONN_RETRIES = 0;
+const CONN_TIMEOUT = 5 * 60 * 1000;
+
+// 1 hour default newCommandTimeout
+const NEW_COMMAND_TIMEOUT_SEC = 3600;
+
+/**
+ * Unwraps nested capability structures returned by the TestMu AI server.
+ * The server may wrap capabilities under a 'capabilities' key and/or a 'desired' key.
+ */
+function unwrapTestMuAICaps(caps) {
+ if (!caps) {
+ return caps;
+ }
+ if ('capabilities' in caps) {
+ caps = caps.capabilities;
+ }
+ if ('desired' in caps) {
+ caps = caps.desired;
+ }
+ return caps;
+}
+
+let isFirstRun = true; // we only want to auto start a session on a first run
+
+const JSON_TYPES = ['object', 'number', 'boolean'];
+
+export function getCapsObject(caps) {
+ return Object.assign(
+ {},
+ ...caps
+ .filter((cap) => cap.enabled)
+ .map((cap) => {
+ if (JSON_TYPES.indexOf(cap.type) !== -1) {
+ try {
+ let obj = JSON.parse(cap.value);
+ return {[cap.name]: obj};
+ } catch {}
+ }
+ return {[cap.name]: cap.value};
+ }),
+ );
+}
+
+export function showError(e, params = {methodName: null, secs: 5, url: null}) {
+ const {secs, url} = params;
+ let {methodName} = params;
+ let errMessage;
+ if (e['jsonwire-error'] && e['jsonwire-error'].status === 7) {
+ // FIXME: we probably should set 'findElement' as the method name
+ // if it is also number.
+ if (methodName === 10) {
+ methodName = 'findElements';
+ }
+ errMessage = i18n.t('findElementFailure', {methodName});
+ if (e.message) {
+ errMessage += ` Original error: '${e.message}'`;
+ }
+ } else if (e.data) {
+ try {
+ e.data = JSON.parse(e.data);
+ } catch {}
+ if (e.data.value?.message) {
+ errMessage = e.data.value.message;
+ } else {
+ errMessage = e.data;
+ }
+ } else if (e.message) {
+ errMessage = e.message;
+ } else if (e.code) {
+ errMessage = e.code;
+ } else {
+ errMessage = i18n.t('Could not start session');
+ }
+ if (
+ errMessage === 'ECONNREFUSED' ||
+ _.includes(errMessage, 'Failed to fetch') ||
+ _.includes(errMessage, 'The requested resource could not be found')
+ ) {
+ errMessage = i18n.t('couldNotConnect', {url});
+ }
+
+ log.error(errMessage);
+ notification.error({
+ title: methodName ? i18n.t('callToMethodFailed', {methodName}) : i18n.t('Error'),
+ description: errMessage,
+ duration: secs,
+ });
+}
+
+/**
+ * Change the caps object, along with the server details and then go back to the new session tab
+ */
+export function setCapsAndServer(server, serverType, caps, uuid, name) {
+ return (dispatch) => {
+ dispatch({type: SET_CAPS_AND_SERVER, server, serverType, caps, uuid, name});
+ };
+}
+
+/**
+ * Change a single desired capability
+ */
+export function changeCapability(key, value) {
+ return (dispatch) => {
+ dispatch({type: CHANGE_CAPABILITY, key, value});
+ };
+}
+
+/**
+ * Push a capability to the list
+ */
+export function addCapability() {
+ return (dispatch) => {
+ dispatch({type: ADD_CAPABILITY});
+ };
+}
+
+/**
+ * Update value of a capability parameter
+ */
+export function setCapabilityParam(id, name, value) {
+ return (dispatch) => {
+ dispatch({type: SET_CAPABILITY_PARAM, id, name, value});
+ };
+}
+
+/**
+ * Delete a capability from the list
+ */
+export function removeCapability(id) {
+ return (dispatch) => {
+ dispatch({type: REMOVE_CAPABILITY, id});
+ };
+}
+
+/**
+ * Start a new appium session with the given caps
+ */
+export function newSession(originalCaps, attachSessId = null) {
+ return async (dispatch, getState) => {
+ let session = getState().builder;
+
+ // first add vendor prefixes to caps if requested
+ let prefixedCaps = originalCaps;
+ if (!attachSessId && session.addVendorPrefixes) {
+ const {server, serverType, capsUUID, capsName} = session;
+ prefixedCaps = addVendorPrefixes(originalCaps);
+ setCapsAndServer(server, serverType, prefixedCaps, capsUUID, capsName)(dispatch);
+ }
+
+ dispatch({type: NEW_SESSION_REQUESTED});
+
+ let sessionCaps = prefixedCaps ? getCapsObject(prefixedCaps) : {};
+ sessionCaps = addCustomCaps(sessionCaps);
+
+ const vendorProperties = await retrieveVendorProperties({
+ server: session.server,
+ serverType: session.serverType,
+ sessionCaps,
+ });
+
+ if (!vendorProperties) {
+ return false;
+ }
+
+ dispatch({type: NEW_SESSION_LOADING});
+
+ // Assemble server options from the vendor properties
+
+ let {host, port, username, accessKey, https, path, headers} = vendorProperties;
+ const protocol = https ? 'https' : 'http';
+
+ // if the server path is '' (or any other kind of falsy) set it to default
+ path = path || DEFAULT_SERVER_PROPS.path;
+ host = host || DEFAULT_SERVER_PROPS.hostname;
+ port = port || DEFAULT_SERVER_PROPS.port;
+
+ const serverUrl = `${protocol}://${host}:${port}${path === '/' ? '' : path}`;
+
+ const serverOpts = {
+ hostname: host,
+ port: parseInt(port, 10),
+ protocol,
+ path,
+ headers,
+ connectionRetryCount: CONN_RETRIES,
+ connectionRetryTimeout: CONN_TIMEOUT,
+ logLevel: DEFAULT_SERVER_PROPS.logLevel,
+ };
+ if (username && accessKey) {
+ serverOpts.user = username;
+ serverOpts.key = accessKey;
+ }
+
+ // If a newCommandTimeout wasn't provided, set it to 60 * 60 so that sessions don't close on users in short term.
+ // I saw sometimes infinite session timeout was not so good for cloud providers.
+ // So, let me define this value as NEW_COMMAND_TIMEOUT_SEC by default.
+ if (_.isUndefined(sessionCaps[CAPS_NEW_COMMAND])) {
+ sessionCaps[CAPS_NEW_COMMAND] = NEW_COMMAND_TIMEOUT_SEC;
+ }
+
+ // If someone didn't specify connectHardwareKeyboard, set it to true by
+ // default
+ if (_.isUndefined(sessionCaps[CAPS_CONNECT_HARDWARE_KEYBOARD])) {
+ sessionCaps[CAPS_CONNECT_HARDWARE_KEYBOARD] = true;
+ }
+
+ let driver;
+ try {
+ if (attachSessId) {
+ // When attaching to a session id, webdriver does not fully populate client information, so
+ // we should supplement by attaching session capabilities that we are attaching to, if they
+ // exist in our cache of running appium sessions. Otherwise (in the case where we are
+ // autostarting and attaching to a new session, retrieve session details via a server call)
+ serverOpts.isMobile = true;
+ const attachedSession = session.runningAppiumSessions.find(
+ (session) => session.id === attachSessId,
+ );
+ let attachedSessionCaps = {};
+ if (attachedSession) {
+ attachedSessionCaps = attachedSession.capabilities;
+ if (session.serverType === SERVER_TYPES.TESTMUAI) {
+ attachedSessionCaps = unwrapTestMuAICaps(attachedSessionCaps);
+ }
+ } else {
+ try {
+ const detailsUrl = `${serverUrl}/session/${attachSessId}`;
+ const res = await fetchSessionInformation({
+ url: detailsUrl,
+ headers,
+ timeout: CONN_TIMEOUT,
+ });
+ attachedSessionCaps =
+ session.serverType === SERVER_TYPES.TESTMUAI
+ ? unwrapTestMuAICaps(res.value)
+ : res.value;
+ } catch (err) {
+ // rethrow the error as session not running, but first log the original error to console
+ log.error(err);
+ throw new Error(i18n.t('attachSessionNotRunning', {attachSessId}), {cause: err});
+ }
+ }
+ // Chrome MJSONWP mode returns "platform" instead of "platformName"
+ const platformName = attachedSessionCaps.platformName || attachedSessionCaps.platform;
+ serverOpts.isIOS = Boolean(platformName.match(/iOS/i));
+ serverOpts.isAndroid = Boolean(platformName.match(/Android/i));
+ driver = WDSessionStarter.attachToSession(attachSessId, serverOpts, attachedSessionCaps);
+ } else {
+ driver = await WDSessionStarter.newSession(serverOpts, sessionCaps);
+ }
+ } catch (err) {
+ showError(err, {secs: 0, url: serverUrl});
+ return false;
+ } finally {
+ dispatch({type: NEW_SESSION_DONE});
+ // Save the current server settings
+ await setSetting(SESSION_SERVER_PARAMS, session.server);
+ }
+
+ // The homepage arg in ChromeDriver is not working with Appium. iOS can have a default url, but
+ // we want to keep the process equal to prevent complexity so we launch a default url here to make
+ // sure we don't start with an empty page which will not show proper HTML in the inspector
+ // When attaching to an existing session, sessionCaps doesn't carry browserName,
+ // so read it from driver.capabilities (populated from the running session after attach).
+ const {browserName = ''} = attachSessId ? driver.capabilities : sessionCaps;
+ let appMode = APP_MODE.NATIVE;
+
+ if (browserName.trim() !== '') {
+ appMode = APP_MODE.WEB_HYBRID;
+ // Don't hijack the page when attaching to an existing session.
+ if (!attachSessId) {
+ try {
+ await driver.navigateTo('https://appium.io');
+ } catch {}
+ }
+ }
+
+ let mjpegScreenshotUrl =
+ driver.capabilities[`appium:${MJPEG_CAP}`] || driver.capabilities[MJPEG_CAP] || null;
+
+ let mjpegScreenshotPort =
+ driver.capabilities[`appium:${MJPEG_PORT_CAP}`] ||
+ driver.capabilities[MJPEG_PORT_CAP] ||
+ null;
+
+ if (session.serverType === SERVER_TYPES.FIREFLINKDEVICEFARM) {
+ mjpegScreenshotUrl = null;
+ mjpegScreenshotPort = null;
+ }
+
+ // Build mjpegScreenshotUrl if mjpegServerPort in session capabilities
+ if (!mjpegScreenshotUrl && mjpegScreenshotPort) {
+ mjpegScreenshotUrl = `${protocol}://${host}:${mjpegScreenshotPort}`;
+ }
+
+ const action = setSessionDetails({
+ serverDetails: {
+ username,
+ accessKey,
+ headers,
+ serverUrl,
+ serverUrlParts: {
+ protocol,
+ host,
+ port,
+ path,
+ },
+ mjpegScreenshotUrl,
+ },
+ driver,
+ sessionCaps,
+ appMode,
+ isUsingMjpegMode: mjpegScreenshotUrl !== null,
+ });
+ action(dispatch);
+ return true;
+ };
+}
+
+/**
+ * Saves the caps and server details
+ */
+export function saveSession(sessionParams, checkDuplicateName = false) {
+ return async (dispatch) => {
+ const {server, serverType, caps, name, uuid: foundUUID} = sessionParams;
+ const savedSessions = (await getSetting(SAVED_SESSIONS)) || [];
+ if (checkDuplicateName) {
+ const duplicateSessionNameExists = savedSessions.some((session) => session.name === name);
+ if (duplicateSessionNameExists) {
+ return dispatch({type: SET_CAPABILITY_NAME_ERROR});
+ }
+ }
+ dispatch({type: SAVE_SESSION_REQUESTED});
+
+ let uuid = foundUUID;
+ if (!uuid) {
+ // If it's a new session, add it to the list
+ uuid = getRandomId();
+ const newSavedSession = {
+ date: Date.now(),
+ name,
+ uuid,
+ caps,
+ server,
+ serverType,
+ };
+ savedSessions.push(newSavedSession);
+ } else {
+ // If it's an existing session, overwrite it
+ for (const session of savedSessions) {
+ if (session.uuid === uuid) {
+ session.name = name;
+ session.caps = caps;
+ session.server = server;
+ session.serverType = serverType;
+ break;
+ }
+ }
+ }
+ await setSetting(SAVED_SESSIONS, savedSessions);
+ await getSavedSessions()(dispatch);
+ dispatch({type: SET_CAPS_AND_SERVER, server, serverType, caps, uuid, name});
+ dispatch({type: SAVE_SESSION_DONE});
+ };
+}
+
+/**
+ * Get the sessions saved by the user
+ */
+export function getSavedSessions() {
+ return async (dispatch) => {
+ dispatch({type: GET_SAVED_SESSIONS_REQUESTED});
+ let savedSessions = await getSetting(SAVED_SESSIONS);
+ dispatch({type: GET_SAVED_SESSIONS_DONE, savedSessions});
+ };
+}
+
+/**
+ * Switch to a different Session Builder tab
+ */
+export function switchTabs(key) {
+ return (dispatch, getState) => {
+ dispatch({type: SWITCHED_TABS, key});
+ // if switching to Attach to Session tab, also retrieve the running sessions
+ if (key === SESSION_BUILDER_TABS.ATTACH_TO_SESSION) {
+ getRunningSessions()(dispatch, getState);
+ }
+ };
+}
+
+/**
+ * Open a 'Save As' modal
+ */
+export function requestSaveAsModal() {
+ return (dispatch) => {
+ dispatch({type: SAVE_AS_MODAL_REQUESTED});
+ };
+}
+
+/**
+ * Hide the 'Save As' modal
+ */
+export function hideSaveAsModal() {
+ return (dispatch) => {
+ dispatch({type: HIDE_SAVE_AS_MODAL_REQUESTED});
+ };
+}
+
+/**
+ * Set the text to save capabilities as
+ */
+export function setSaveAsText(saveAsText) {
+ return (dispatch) => {
+ dispatch({type: SET_SAVE_AS_TEXT, saveAsText});
+ };
+}
+
+/**
+ * Delete a saved session
+ */
+export function deleteSavedSession(uuid) {
+ return async (dispatch) => {
+ dispatch({type: DELETE_SAVED_SESSION_REQUESTED, uuid});
+ let savedSessions = await getSetting(SAVED_SESSIONS);
+ let newSessions = savedSessions.filter((session) => session.uuid !== uuid);
+ await setSetting(SAVED_SESSIONS, newSessions);
+ dispatch({type: DELETE_SAVED_SESSION_DONE});
+ dispatch({type: GET_SAVED_SESSIONS_DONE, savedSessions: newSessions});
+ };
+}
+
+/**
+ * Change the server type
+ */
+export function changeServerType(serverType) {
+ return async (dispatch) => {
+ await setSetting(SESSION_SERVER_TYPE, serverType);
+ dispatch({type: CHANGE_SERVER_TYPE, serverType});
+ };
+}
+
+/**
+ * Set a server parameter (host, port, etc...)
+ */
+export function setServerParam(name, value, serverType) {
+ return async (dispatch, getState) => {
+ serverType = serverType || getState().builder.serverType;
+ await setSetting(SESSION_SERVER_TYPE, serverType);
+ dispatch({type: SET_SERVER_PARAM, serverType, name, value});
+ };
+}
+
+/**
+ * Set the local server hostname and port to whatever was saved in 'actions/StartServer.js' so that it
+ * defaults to what the currently running appium server is
+ */
+export function setLocalServerParams() {
+ return async (dispatch, getState) => {
+ let serverArgs = await getSetting(SERVER_ARGS);
+ // Get saved server args from settings and set local server settings to it. If there are no saved args, set local
+ // host and port to undefined
+ if (serverArgs) {
+ dispatch({
+ type: SET_SERVER_PARAM,
+ serverType: SERVER_TYPES.LOCAL,
+ name: 'port',
+ value: serverArgs.port,
+ });
+ dispatch({
+ type: SET_SERVER_PARAM,
+ serverType: SERVER_TYPES.LOCAL,
+ name: 'hostname',
+ value: 'localhost',
+ });
+ } else {
+ dispatch({
+ type: SET_SERVER_PARAM,
+ serverType: SERVER_TYPES.LOCAL,
+ name: 'port',
+ value: undefined,
+ });
+ dispatch({
+ type: SET_SERVER_PARAM,
+ serverType: SERVER_TYPES.LOCAL,
+ name: 'hostname',
+ value: undefined,
+ });
+ if (getState().builder.serverType === 'local') {
+ const action = changeServerType('remote');
+ await action(dispatch, getState);
+ }
+ }
+ };
+}
+
+/**
+ * Set the server parameters to whatever they were last saved as.
+ * Params are saved whenever there's a new session
+ */
+export function setSavedServerParams() {
+ return async (dispatch, getState) => {
+ let server = await getSetting(SESSION_SERVER_PARAMS);
+ let serverType = await getSetting(SESSION_SERVER_TYPE);
+ let currentProviders = getState().builder.visibleProviders;
+
+ if (server) {
+ // if we have a cloud provider as a saved server, but for some reason the
+ // cloud provider is no longer in the list, revert server type to remote
+ if (_.values(SERVER_TYPES).includes(serverType) && !currentProviders.includes(serverType)) {
+ serverType = SERVER_TYPES.REMOTE;
+ }
+ dispatch({type: SET_SERVER, server, serverType});
+ }
+ };
+}
+
+/**
+ * Checks if the app was launched by opening a file -
+ * if yes, switch to capability builder and set the current details from the file contents
+ */
+export function initFromSessionFile() {
+ return async (dispatch, getState) => {
+ let sessionFileString;
+ try {
+ sessionFileString = await loadSessionFileIfOpened();
+ } catch (err) {
+ log.warn(`Error loading session file on startup: ${err.message}`);
+ }
+ if (!sessionFileString) {
+ return null;
+ }
+ const sessionJSON = parseAndValidateSessionFileString(sessionFileString);
+ if (sessionJSON) {
+ dispatch({type: SET_STATE_FROM_FILE, sessionJSON});
+ switchTabs(SESSION_BUILDER_TABS.CAPS_BUILDER)(dispatch, getState);
+ } else {
+ notification.error({
+ title: i18n.t('invalidSessionFile'),
+ duration: 0,
+ });
+ }
+ };
+}
+
+/**
+ * Reads one or more .appiumsession files, then extracts, validates, and saves
+ * their details as new session sets.
+ * Duplicate session names are intentionally OK
+ */
+export function importSessionFiles(fileList) {
+ return async (dispatch) => {
+ dispatch({type: SESSION_UPLOAD_REQUESTED});
+ const sessions = await readTextFromUploadedFiles(fileList);
+ const invalidSessionFiles = [];
+ const parsedSessions = [];
+ for (const session of sessions) {
+ const {fileName, content, error} = session;
+ // Some error occurred while reading the uploaded file
+ if (error) {
+ invalidSessionFiles.push(fileName);
+ continue;
+ }
+ const sessionJSON = parseAndValidateSessionFileString(content);
+ if (!sessionJSON) {
+ invalidSessionFiles.push(fileName);
+ continue;
+ }
+ parsedSessions.push(sessionJSON);
+ }
+
+ for (const parsedSession of parsedSessions) {
+ await saveSession(parsedSession)(dispatch);
+ }
+ dispatch({type: SESSION_UPLOAD_DONE});
+
+ if (!_.isEmpty(invalidSessionFiles)) {
+ notification.error({
+ title: i18n.t('unableToImportSessionFiles', {fileNames: invalidSessionFiles.join(', ')}),
+ duration: 0,
+ });
+ }
+ };
+}
+
+/**
+ * Packages the current server and capability details in an .appiumsession file
+ */
+export function exportSavedSession(session) {
+ return async () => {
+ const cleanedName = session.name?.trim() || DEFAULT_SESSION_NAME;
+ const cleanedServer = {
+ [session.serverType]: session.server[session.serverType],
+ [SERVER_TYPES.ADVANCED]: session.server[SERVER_TYPES.ADVANCED],
+ };
+ const cleanedCaps = session.caps.map((cap) => _.omit(cap, 'id'));
+ const sessionFileDetails = {
+ version: SESSION_FILE_VERSIONS.LATEST,
+ name: cleanedName,
+ server: cleanedServer,
+ caps: cleanedCaps,
+ };
+ const href = `data:text/json;charset=utf-8,${encodeURIComponent(
+ JSON.stringify(sessionFileDetails, null, 2),
+ )}`;
+ const escapedName = sanitize(cleanedName, {replacement: '_'});
+ const fileName = `${escapedName}.appiumsession`;
+ downloadFile(href, fileName);
+ };
+}
+
+/**
+ * Retrieve all running sessions for the currently configured server details
+ */
+export function getRunningSessions() {
+ return async (dispatch, getState) => {
+ const avoidServerTypes = ['sauce'];
+ const state = getState().builder;
+ const {server, serverType} = state;
+ const vendorProperties = await retrieveVendorProperties({
+ server,
+ serverType,
+ sessionCaps: {},
+ });
+
+ if (!vendorProperties) {
+ return;
+ }
+
+ let {path, host, port, username, accessKey, https, headers} = vendorProperties;
+
+ if (username && accessKey) {
+ const authToken = btoa(`${username}:${accessKey}`);
+
+ headers = {
+ ...headers,
+ Authorization: `Basic ${authToken}`,
+ };
+ }
+
+ // if we have a standard remote server, fill out connection info based on placeholder defaults
+ // in case the user hasn't adjusted those fields
+ if (serverType === SERVER_TYPES.REMOTE) {
+ host = host || DEFAULT_SERVER_PROPS.hostname;
+ port = port || DEFAULT_SERVER_PROPS.port;
+ path = path || DEFAULT_SERVER_PROPS.path;
+ }
+
+ // no need to get sessions if we don't have complete server info
+ if (!host || !port || !path) {
+ showError(new Error(i18n.t('missingServerInfo')));
+ return;
+ }
+
+ dispatch({type: GET_SESSIONS_REQUESTED});
+ if (avoidServerTypes.includes(serverType)) {
+ dispatch({type: GET_SESSIONS_DONE});
+ return;
+ }
+
+ if (serverType === SERVER_TYPES.TESTMUAI) {
+ const sessions = await fetchTestMuAISessions(host, headers);
+ dispatch({type: GET_SESSIONS_DONE, sessions});
+ return;
+ }
+
+ const protocol = https ? 'https' : 'http';
+ const adjPath = path.endsWith('/') ? path : `${path}/`;
+ const baseUrl = `${protocol}://${host}:${port}${adjPath}`;
+ const sessions = await fetchAllSessions(baseUrl, headers);
+ dispatch({type: GET_SESSIONS_DONE, sessions});
+ };
+}
+
+export function startDesiredCapsNameEditor() {
+ return (dispatch) => {
+ dispatch({type: ENABLE_DESIRED_CAPS_NAME_EDITOR});
+ };
+}
+
+export function abortDesiredCapsNameEditor() {
+ return (dispatch) => {
+ dispatch({type: ABORT_DESIRED_CAPS_NAME_EDITOR});
+ };
+}
+
+export function saveDesiredCapsName() {
+ return (dispatch, getState) => {
+ const {server, serverType, caps, capsUUID, desiredCapsName} = getState().builder;
+ dispatch({type: SAVE_DESIRED_CAPS_NAME, name: desiredCapsName});
+ saveSession({server, serverType, caps, name: desiredCapsName, uuid: capsUUID}, true)(dispatch);
+ };
+}
+
+export function setDesiredCapsName(desiredCapsName) {
+ return (dispatch) => {
+ dispatch({type: SET_DESIRED_CAPS_NAME, desiredCapsName});
+ };
+}
+
+export function startDesiredCapsEditor() {
+ return (dispatch) => {
+ dispatch({type: ENABLE_DESIRED_CAPS_EDITOR});
+ };
+}
+
+export function abortDesiredCapsEditor() {
+ return (dispatch) => {
+ dispatch({type: ABORT_DESIRED_CAPS_EDITOR});
+ };
+}
+
+// Overwrite the current caps array with the raw data:
+// * New caps get a new id, type, and enabled state set to true;
+// * Existing caps keep their id and enabled state, but their type is updated.
+export function saveRawDesiredCaps(currentCapsArray, rawDesiredCaps) {
+ return (dispatch) => {
+ try {
+ const rawCapsObj = JSON.parse(rawDesiredCaps);
+
+ // Since the user may change the order of existing caps in the raw array,
+ // we cannot use the element index - however, since the raw cap names are unique
+ // (due to being JSON keys), use that as the identifier.
+ // But if the user has changed the name of an existing cap, treat it as a new cap.
+
+ // First, convert the current caps array to an object, in order to use name indexing.
+ // This also removes any entries with duplicate names (the capability builder allows duplicates),
+ // which is fine, since JSON only allows the latest entry anyway.
+ const currentCapsObj = _.fromPairs(
+ currentCapsArray.map((cap) => [cap.name, _.omit(cap, 'name')]),
+ );
+
+ // Translate the raw caps JSON to array format
+ const newCapsArray = Object.entries(rawCapsObj).map(([name, value]) => ({
+ id: getRandomId(),
+ enabled: true,
+ ...currentCapsObj[name], // overrides id and enabled, if present
+ type: typeof value === 'string' ? 'text' : typeof value,
+ name,
+ value,
+ }));
+ dispatch({type: SAVE_RAW_DESIRED_CAPS, caps: newCapsArray});
+ } catch (e) {
+ dispatch({type: SHOW_DESIRED_CAPS_JSON_ERROR, message: e.message});
+ }
+ };
+}
+
+export function setRawDesiredCaps(rawDesiredCaps) {
+ return (dispatch, getState) => {
+ const state = getState().builder;
+ let isValidCapsJson = true;
+ let invalidCapsJsonReason;
+ if (state.isValidatingCapsJson) {
+ try {
+ JSON.parse(rawDesiredCaps);
+ } catch (e) {
+ isValidCapsJson = false;
+ invalidCapsJsonReason = e.message;
+ }
+ }
+ dispatch({type: SET_RAW_DESIRED_CAPS, rawDesiredCaps, isValidCapsJson, invalidCapsJsonReason});
+ };
+}
+
+export function addCloudProvider() {
+ return (dispatch) => {
+ dispatch({type: IS_ADDING_CLOUD_PROVIDER, isAddingProvider: true});
+ };
+}
+
+export function stopAddCloudProvider() {
+ return (dispatch) => {
+ dispatch({type: IS_ADDING_CLOUD_PROVIDER, isAddingProvider: false});
+ };
+}
+
+export function addVisibleProvider(provider) {
+ return async (dispatch, getState) => {
+ let currentProviders = getState().builder.visibleProviders;
+ const providers = _.union(currentProviders, [provider]);
+ await setSetting(VISIBLE_PROVIDERS, providers);
+ dispatch({type: SET_PROVIDERS, providers});
+ };
+}
+
+export function removeVisibleProvider(provider) {
+ return async (dispatch, getState) => {
+ const {serverType, visibleProviders} = getState().builder;
+ if (serverType === provider) {
+ const action = changeServerType('remote');
+ await action(dispatch, getState);
+ }
+ const providers = _.without(visibleProviders, provider);
+ await setSetting(VISIBLE_PROVIDERS, providers);
+ dispatch({type: SET_PROVIDERS, providers});
+ };
+}
+
+export function setVisibleProviders() {
+ return async (dispatch) => {
+ const providers = await getSetting(VISIBLE_PROVIDERS);
+ dispatch({type: SET_PROVIDERS, providers});
+ };
+}
+
+export function bindWindowClose() {
+ return (dispatch, getState) => {
+ window.addEventListener('beforeunload', async () => {
+ let {driver} = getState().inspector;
+ if (driver) {
+ try {
+ const action = quitSession();
+ await action(dispatch, getState);
+ } catch {}
+ }
+ });
+ };
+}
+
+export function setAddVendorPrefixes(addVendorPrefixes) {
+ return (dispatch) => {
+ dispatch({type: SET_ADD_VENDOR_PREFIXES, addVendorPrefixes});
+ };
+}
+
+/**
+ * Extract port from URL and set it in server state when running in browser/plugin mode
+ * This is useful when the inspector is accessed via the plugin at http://localhost:PORT/inspector
+ * The port from the URL takes precedence when running in plugin mode
+ */
+export function setPortFromUrl() {
+ return async (dispatch, getState) => {
+ if (typeof window === 'undefined' || !window.location) {
+ return;
+ }
+
+ try {
+ const url = new URL(window.location.href);
+ const port = url.port;
+
+ if (port && (url.pathname === '/inspector' || url.pathname.startsWith('/inspector/'))) {
+ const parsedPort = parseInt(port, 10);
+ if (!isNaN(parsedPort) && parsedPort > 0 && parsedPort <= 65535) {
+ await setServerParam('port', parsedPort.toString())(dispatch, getState);
+ }
+ }
+ } catch (e) {
+ log.debug('Could not extract port from URL:', e);
+ }
+ };
+}
+
+export function initFromQueryString(loadNewSession) {
+ return (dispatch, getState) => {
+ if (!isFirstRun) {
+ return;
+ }
+
+ isFirstRun = false;
+
+ const url = new URL(window.location.href);
+ const initialState = url.searchParams.get('state');
+ const autoStartSession = url.searchParams.get('autoStart');
+
+ if (initialState) {
+ try {
+ const state = JSON.parse(initialState);
+ dispatch({type: SET_STATE_FROM_URL, state});
+ } catch {
+ showError(new Error('Could not parse initial state from URL'), {secs: 0});
+ }
+ }
+
+ if (autoStartSession === AUTO_START_URL_PARAM) {
+ // at this point these can only be set using SET_STATE_FROM_URL
+ const {attachSessId, caps} = getState().builder;
+ if (attachSessId) {
+ return loadNewSession(null, attachSessId);
+ }
+ loadNewSession(caps);
+ }
+ };
+}
+
+function parseAndValidateSessionFileString(sessionFileString) {
+ const sessionJSON = parseSessionFileContents(sessionFileString);
+ if (sessionJSON === null) {
+ return null;
+ }
+ sessionJSON.serverType = Object.keys(sessionJSON.server).find(
+ (type) => type !== SERVER_TYPES.ADVANCED,
+ );
+ sessionJSON.visibleProviders =
+ sessionJSON.serverType !== SERVER_TYPES.REMOTE ? [sessionJSON.serverType] : [];
+ return sessionJSON;
+}
+
+/**
+ * @returns {Promise}
+ */
+async function retrieveVendorProperties({server, serverType, sessionCaps}) {
+ //
+ // To register a new session vendor:
+ // - Implement a new class inherited from BaseVendor in app/common/renderer/lib/vendor/.ts
+ // - Add the newly created class to the VENDOR_MAP defined in app/common/renderer/lib/vendor/map.ts
+ //
+ const VendorClass = VENDOR_MAP[serverType];
+
+ if (!VendorClass) {
+ log.info(`No vendor mapping is defined for the server type '${serverType}'. Using defaults`);
+
+ return {};
+ }
+
+ log.info(`Using ${VendorClass.name}`);
+
+ try {
+ const vendor = new VendorClass(server, sessionCaps);
+ return await vendor.apply();
+ } catch (e) {
+ showError(e);
+ return false;
+ }
+}
+
+async function fetchAllSessions(baseUrl, headers) {
+ const appiumSessionsEndpoint = `${baseUrl}appium/sessions`; // Appium 3+
+ const oldAppiumSessionsEndpoint = `${baseUrl}sessions`; // Appium 1-2
+ const seleniumSessionsEndpoint = `${baseUrl}status`;
+
+ async function fetchSessionsFromEndpoint(url) {
+ try {
+ const res = await fetchSessionInformation({url, headers});
+ return url === seleniumSessionsEndpoint ? formatSeleniumGridSessions(res) : (res.value ?? []);
+ } catch {
+ return [];
+ }
+ }
+
+ const [appiumSessions, oldAppiumSessions, seleniumSessions] = await Promise.all([
+ fetchSessionsFromEndpoint(appiumSessionsEndpoint),
+ fetchSessionsFromEndpoint(oldAppiumSessionsEndpoint),
+ fetchSessionsFromEndpoint(seleniumSessionsEndpoint),
+ ]);
+
+ return [...appiumSessions, ...oldAppiumSessions, ...seleniumSessions];
+}
+
+/**
+ * Fetch running sessions for a TestMu AI server.
+ *
+ * Combines the provider's session-list API (derived from the hub host) with the
+ * standard /wd/hub/sessions endpoint, tolerating failures from either source so
+ * one unavailable endpoint doesn't hide the sessions from the other.
+ *
+ * @param {string} host
+ * @param {object} headers
+ * @returns {Promise}
+ */
+async function fetchTestMuAISessions(host, headers) {
+ const sessionListHost = host
+ .replace(/^mobile-hub\./, 'api.')
+ .replace(/^mobile-hub-/, 'api-')
+ .replace(/^hub-/, 'api-');
+ const sessionListUrl = `https://${sessionListHost}/automation/api/v1/appium/inspector/sessions`;
+ const hubSessionsUrl = `https://${host}/wd/hub/sessions`;
+
+ async function fetchSessionsFromEndpoint(url) {
+ try {
+ const res = await fetchSessionInformation({url, headers});
+ return res.value ?? [];
+ } catch (err) {
+ log.error(`Failed to fetch running sessions from ${url}`, err);
+ return [];
+ }
+ }
+
+ const [webSessions, appSessions] = await Promise.all([
+ fetchSessionsFromEndpoint(sessionListUrl),
+ fetchSessionsFromEndpoint(hubSessionsUrl),
+ ]);
+
+ return [...webSessions, ...appSessions];
+}
+
+/**
+ * Add custom capabilities
+ *
+ * @param {object} caps
+ */
+function addCustomCaps(caps) {
+ const {platformName = ''} = caps;
+ const androidCustomCaps = {};
+ // @TODO: remove when this is defaulted in the newest Appium 1.8.x release
+ androidCustomCaps[CAPS_ENSURE_WEBVIEW_HAVE_PAGES] = true;
+ // Make sure the screenshot is taken of the whole screen when the ChromeDriver is used
+ androidCustomCaps[CAPS_NATIVE_WEB_SCREENSHOT] = true;
+
+ const iosCustomCaps = {};
+ // Always add the includeSafariInWebviews for future HTML detection
+ // This will ensure that if you use AD to switch between App and browser
+ // that it can detect Safari as a webview
+ iosCustomCaps[CAPS_INCLUDE_SAFARI_IN_WEBVIEWS] = true;
+
+ return {
+ ...caps,
+ ...(platformName.toLowerCase() === 'android' ? androidCustomCaps : {}),
+ ...(platformName.toLowerCase() === 'ios' ? iosCustomCaps : {}),
+ };
+}
diff --git a/app/renderer/actions/Inspector.js b/app/common/renderer/actions/SessionInspector.js
similarity index 61%
rename from app/renderer/actions/Inspector.js
rename to app/common/renderer/actions/SessionInspector.js
index ba864622cb..ebe2855ce0 100644
--- a/app/renderer/actions/Inspector.js
+++ b/app/common/renderer/actions/SessionInspector.js
@@ -1,16 +1,30 @@
import _ from 'lodash';
-import {v4 as UUID} from 'uuid';
-
-import i18n from '../../configs/i18next.config.renderer';
-import {SAVED_FRAMEWORK, SET_SAVED_GESTURES, getSetting, setSetting} from '../../shared/settings';
-import {APP_MODE, getLocators} from '../components/Inspector/shared';
-import AppiumClient, {NATIVE_APP} from '../lib/appium-client';
-import frameworks from '../lib/client-frameworks';
-import {xmlToJSON} from '../util';
-import {showError} from './Session';
+import sanitize from 'sanitize-filename';
+
+import {SAVED_CLIENT_FRAMEWORK, SET_SAVED_GESTURES} from '../../shared/setting-defs.js';
+import {APP_MODE, NATIVE_APP, UNKNOWN_ERROR} from '../constants/session-inspector.js';
+import i18n from '../i18next.js';
+import InspectorDriver from '../lib/appium/inspector-driver.js';
+import {CLIENT_FRAMEWORK_MAP} from '../lib/client-frameworks/map.js';
+import {getSetting, setSetting} from '../polyfills.js';
+import {downloadFile, readTextFromUploadedFiles} from '../utils/file-handling.js';
+import {parseGestureFileContents} from '../utils/gesturefile-parsing.js';
+import {getSuggestedLocators} from '../utils/locator-generation/common.js';
+import {getOptimalXPath} from '../utils/locator-generation/xpath.js';
+import {log} from '../utils/logger.js';
+import {notification} from '../utils/notification.js';
+import {getRandomId} from '../utils/other.js';
+import {
+ findDOMNodeByPath,
+ findJSONElementByPath,
+ xmlToDOM,
+ xmlToJSON,
+} from '../utils/source-parsing.js';
+import {newSession, showError} from './SessionBuilder.js';
export const SET_SESSION_DETAILS = 'SET_SESSION_DETAILS';
export const SET_SOURCE_AND_SCREENSHOT = 'SET_SOURCE_AND_SCREENSHOT';
+export const STORE_SESSION_SETTINGS = 'STORE_SESSION_SETTINGS';
export const SESSION_DONE = 'SESSION_DONE';
export const SELECT_ELEMENT = 'SELECT_ELEMENT';
export const UNSELECT_ELEMENT = 'UNSELECT_ELEMENT';
@@ -19,11 +33,8 @@ export const SET_INTERACTIONS_NOT_AVAILABLE = 'SET_INTERACTIONS_NOT_AVAILABLE';
export const METHOD_CALL_REQUESTED = 'METHOD_CALL_REQUESTED';
export const METHOD_CALL_DONE = 'METHOD_CALL_DONE';
export const SET_EXPANDED_PATHS = 'SET_EXPANDED_PATHS';
-export const SELECT_HOVERED_ELEMENT = 'SELECT_HOVERED_ELEMENT';
-export const UNSELECT_HOVERED_ELEMENT = 'UNSELECT_HOVERED_ELEMENT';
+export const SET_OPTIMAL_LOCATORS = 'SET_OPTIMAL_LOCATORS';
-export const SELECT_HOVERED_CENTROID = 'SELECT_HOVERED_CENTROID';
-export const UNSELECT_HOVERED_CENTROID = 'UNSELECT_HOVERED_CENTROID';
export const SELECT_CENTROID = 'SELECT_CENTROID';
export const UNSELECT_CENTROID = 'UNSELECT_CENTROID';
export const SET_SHOW_CENTROIDS = 'SET_SHOW_CENTROIDS';
@@ -35,7 +46,7 @@ export const SET_SESSION_TIME = 'SET_SESSION_TIME';
export const START_RECORDING = 'START_RECORDING';
export const PAUSE_RECORDING = 'PAUSE_RECORDING';
export const CLEAR_RECORDING = 'CLEAR_RECORDING';
-export const SET_ACTION_FRAMEWORK = 'SET_ACTION_FRAMEWORK';
+export const SET_CLIENT_FRAMEWORK = 'SET_CLIENT_FRAMEWORK';
export const RECORD_ACTION = 'RECORD_ACTION';
export const SET_SHOW_BOILERPLATE = 'SET_SHOW_BOILERPLATE';
@@ -56,10 +67,13 @@ export const FINDING_ELEMENT_IN_SOURCE_COMPLETED = 'FINDING_ELEMENT_IN_SOURCE_CO
export const CLEAR_SEARCH_RESULTS = 'CLEAR_SEARCH_RESULTS';
export const ADD_ASSIGNED_VAR_CACHE = 'ADD_ASSIGNED_VAR_CACHE';
export const CLEAR_ASSIGNED_VAR_CACHE = 'CLEAR_ASSIGNED_VAR_CACHE';
+export const SET_MJPEG_STATE = 'SET_MJPEG_STATE';
export const SET_SCREENSHOT_INTERACTION_MODE = 'SET_SCREENSHOT_INTERACTION_MODE';
export const SET_APP_MODE = 'SET_APP_MODE';
export const SET_SEARCHED_FOR_ELEMENT_BOUNDS = 'SET_SEARCHED_FOR_ELEMENT_BOUNDS';
export const CLEAR_SEARCHED_FOR_ELEMENT_BOUNDS = 'CLEAR_SEARCHED_FOR_ELEMENT_BOUNDS';
+export const SET_FOUND_DISPLAYS = 'SET_FOUND_DISPLAYS';
+export const SET_CURRENT_DISPLAY_ID = 'SET_CURRENT_DISPLAY_ID';
export const SET_COORD_START = 'SET_COORD_START';
export const SET_COORD_END = 'SET_COORD_END';
@@ -67,25 +81,22 @@ export const CLEAR_COORD_ACTION = 'CLEAR_COORD_ACTION';
export const PROMPT_KEEP_ALIVE = 'PROMPT_KEEP_ALIVE';
export const HIDE_PROMPT_KEEP_ALIVE = 'HIDE_PROMPT_KEEP_ALIVE';
-export const SELECT_INTERACTION_MODE = 'SELECT_INTERACTION_MODE';
-
-export const ENTERING_COMMAND_ARGS = 'ENTERING_COMMAND_ARGS';
-export const CANCEL_PENDING_COMMAND = 'CANCEL_PENDING_COMMAND';
-export const SET_COMMAND_ARG = 'SET_COMMAND_ARG';
+export const SELECT_INSPECTOR_TAB = 'SELECT_INSPECTOR_TAB';
export const SET_CONTEXT = 'SET_CONTEXT';
export const SET_APP_ID = 'SET_APP_ID';
export const SET_SERVER_STATUS = 'SET_SERVER_STATUS';
+export const SET_FLAT_SESSION_CAPS = 'SET_FLAT_SESSION_CAPS';
export const SET_KEEP_ALIVE_INTERVAL = 'SET_KEEP_ALIVE_INTERVAL';
export const SET_USER_WAIT_TIMEOUT = 'SET_USER_WAIT_TIMEOUT';
export const SET_LAST_ACTIVE_MOMENT = 'SET_LAST_ACTIVE_MOMENT';
-export const SET_VISIBLE_COMMAND_RESULT = 'SET_VISIBLE_COMMAND_RESULT';
-
export const SET_AWAITING_MJPEG_STREAM = 'SET_AWAITING_MJPEG_STREAM';
+export const GESTURE_UPLOAD_REQUESTED = 'GESTURE_UPLOAD_REQUESTED';
+export const GESTURE_UPLOAD_DONE = 'GESTURE_UPLOAD_DONE';
export const SHOW_GESTURE_EDITOR = 'SHOW_GESTURE_EDITOR';
export const HIDE_GESTURE_EDITOR = 'HIDE_GESTURE_EDITOR';
export const GET_SAVED_GESTURES_REQUESTED = 'GET_SAVED_GESTURES_REQUESTED';
@@ -102,7 +113,9 @@ export const SET_GESTURE_TAP_COORDS_MODE = 'SET_GESTURE_TAP_COORDS_MODE';
export const CLEAR_TAP_COORDINATES = 'CLEAR_TAP_COORDINATES';
export const TOGGLE_SHOW_ATTRIBUTES = 'TOGGLE_SHOW_ATTRIBUTES';
-export const TOGGLE_REFRESHING_STATE = 'TOGGLE_REFRESHING_STATE';
+export const SET_REFRESHING_STATE = 'SET_REFRESHING_STATE';
+
+export const SET_AUTO_SESSION_RESTART = 'SET_AUTO_SESSION_RESTART';
const KEEP_ALIVE_PING_INTERVAL = 20 * 1000;
const NO_NEW_COMMAND_LIMIT = 24 * 60 * 60 * 1000; // Set timeout to 24 hours
@@ -115,12 +128,12 @@ const findElement = _.debounce(async function (strategyMap, dispatch, getState,
strategy,
selector,
});
- let {elementId, variableName, variableType} = await action(dispatch, getState);
+ let {elementId} = await action(dispatch, getState);
- // Set the elementId, variableName and variableType for the selected element
+ // Set the elementId for the selected element
// (check first that the selectedElementPath didn't change, to avoid race conditions)
if (elementId && getState().inspector.selectedElementPath === path) {
- return dispatch({type: SET_SELECTED_ELEMENT_ID, elementId, variableName, variableType});
+ return dispatch({type: SET_SELECTED_ELEMENT_ID, elementId});
}
}
@@ -129,9 +142,12 @@ const findElement = _.debounce(async function (strategyMap, dispatch, getState,
export function selectElement(path) {
return async (dispatch, getState) => {
+ const {sourceJSON, sourceXML, expandedPaths, currentContext, automationName} =
+ getState().inspector;
+ const isNative = currentContext === NATIVE_APP;
// Set the selected element in the source tree
- dispatch({type: SELECT_ELEMENT, path});
- const {selectedElement, sourceXML, expandedPaths} = getState().inspector;
+ const selectedElement = findJSONElementByPath(path, sourceJSON);
+ dispatch({type: SELECT_ELEMENT, selectedElement});
// Expand all of this element's ancestors so that it's visible in the source tree
// Make a copy of the array to avoid state mutation
@@ -146,9 +162,9 @@ export function selectElement(path) {
}
dispatch({type: SET_EXPANDED_PATHS, paths: copiedExpandedPaths});
- // Find the optimal selection strategy. If none found, fall back to XPath.
- const strategyMap = _.toPairs(getLocators(selectedElement.attributes, sourceXML));
- strategyMap.push(['xpath', selectedElement.xpath]);
+ // Calculate the recommended locator strategies
+ const strategyMap = getSuggestedLocators(selectedElement, sourceXML, isNative, automationName);
+ dispatch({type: SET_OPTIMAL_LOCATORS, strategyMap});
// Debounce find element so that if another element is selected shortly after, cancel the previous search
await findElement(strategyMap, dispatch, getState, path);
@@ -173,101 +189,100 @@ export function unselectCentroid() {
};
}
-export function selectHoveredCentroid(path) {
- return (dispatch) => {
- dispatch({type: SELECT_HOVERED_CENTROID, path});
- };
-}
-
-export function unselectHoveredCentroid() {
- return (dispatch) => {
- dispatch({type: UNSELECT_HOVERED_CENTROID});
- };
-}
-
-export function selectHoveredElement(path) {
- return (dispatch) => {
- dispatch({type: SELECT_HOVERED_ELEMENT, path});
- };
-}
-
-export function unselectHoveredElement() {
- return (dispatch) => {
- dispatch({type: UNSELECT_HOVERED_ELEMENT});
- };
-}
-
/**
* Requests a method call on appium
*/
export function applyClientMethod(params) {
return async (dispatch, getState) => {
const isRecording =
- params.methodName !== 'quit' &&
+ params.methodName !== 'deleteSession' &&
params.methodName !== 'getPageSource' &&
params.methodName !== 'gesture' &&
- params.methodName !== 'status' &&
getState().inspector.isRecording;
- try {
- dispatch({type: METHOD_CALL_REQUESTED});
- const callAction = callClientMethod(params);
- const {
+ dispatch({type: METHOD_CALL_REQUESTED});
+ const callAction = callClientMethod(params);
+ const {
+ contexts,
+ contextsError,
+ commandRes,
+ currentContext,
+ currentContextError,
+ source,
+ screenshot,
+ windowSize,
+ sourceError,
+ screenshotError,
+ windowSizeError,
+ variableName,
+ variableIndex,
+ strategy,
+ selector,
+ } = await callAction(dispatch, getState);
+
+ // TODO: Implement recorder code for gestures
+ if (isRecording) {
+ // Add 'findAndAssign' line of code. Don't do it for arrays though. Arrays already have 'find' expression
+ if (strategy && selector && !variableIndex && variableIndex !== 0) {
+ const findAction = findAndAssign(strategy, selector, variableName, false);
+ findAction(dispatch, getState);
+ }
+
+ // now record the actual action
+ let args = [variableName, variableIndex];
+ args = args.concat(params.args || []);
+ dispatch({type: RECORD_ACTION, action: params.methodName, params: args});
+ }
+ dispatch({type: METHOD_CALL_DONE});
+
+ if (source) {
+ dispatch({
+ type: SET_SOURCE_AND_SCREENSHOT,
contexts,
- contextsError,
- commandRes,
currentContext,
- currentContextError,
- source,
+ sourceJSON: xmlToJSON(source),
+ sourceXML: source,
screenshot,
windowSize,
+ contextsError,
+ currentContextError,
sourceError,
screenshotError,
windowSizeError,
- variableName,
- variableIndex,
- strategy,
- selector,
- } = await callAction(dispatch, getState);
-
- // TODO: Implement recorder code for gestures
- if (isRecording) {
- // Add 'findAndAssign' line of code. Don't do it for arrays though. Arrays already have 'find' expression
- if (strategy && selector && !variableIndex && variableIndex !== 0) {
- const findAction = findAndAssign(strategy, selector, variableName, false);
- findAction(dispatch, getState);
- }
-
- // now record the actual action
- let args = [variableName, variableIndex];
- args = args.concat(params.args || []);
- dispatch({type: RECORD_ACTION, action: params.methodName, params: args});
- }
- dispatch({type: METHOD_CALL_DONE});
+ });
+ }
+ window.dispatchEvent(new Event('resize'));
+ return commandRes;
+ };
+}
- if (source) {
- dispatch({
- type: SET_SOURCE_AND_SCREENSHOT,
- contexts,
- currentContext,
- source: source && xmlToJSON(source),
- sourceXML: source,
- screenshot,
- windowSize,
- contextsError,
- currentContextError,
- sourceError,
- screenshotError,
- windowSizeError,
- });
- }
- window.dispatchEvent(new Event('resize'));
- return commandRes;
- } catch (error) {
- console.log(error); // eslint-disable-line no-console
- let methodName = params.methodName === 'click' ? 'tap' : params.methodName;
- showError(error, {methodName, secs: 10});
- dispatch({type: METHOD_CALL_DONE});
+export function restartSession(error, params) {
+ return async (dispatch, getState) => {
+ if (error?.name !== UNKNOWN_ERROR) {
+ showError(error, {methodName: params.methodName, secs: 10});
+ return dispatch({type: METHOD_CALL_DONE});
}
+ showError(error, {methodName: params.methodName, secs: 3});
+ notification.info({
+ title: i18n.t('RestartSessionMessage'),
+ duration: 3,
+ });
+ const quitSes = quitSession();
+ const newSes = newSession(getState().builder.caps);
+ const getPageSrc = applyClientMethod({methodName: 'getPageSource'});
+ const storeSessionSet = storeSessionSettings();
+ const getSavedClientFrame = getSavedClientFramework();
+ const runKeepAliveLp = runKeepAliveLoop();
+ const setSesTime = setSessionTime(Date.now());
+
+ await quitSes(dispatch, getState);
+ await newSes(dispatch, getState);
+ await getPageSrc(dispatch, getState);
+ await storeSessionSet(dispatch, getState);
+ await getSavedClientFrame(dispatch);
+ runKeepAliveLp(dispatch, getState);
+ setSesTime(dispatch);
+ dispatch({type: SET_AUTO_SESSION_RESTART, autoSessionRestart: true});
+ dispatch({type: METHOD_CALL_DONE});
};
}
@@ -286,14 +301,17 @@ export function setExpandedPaths(paths) {
/**
* Quit the session and go back to the new session window
*/
-export function quitSession(reason, killedByUser = true) {
+export function quitSession({reason, manualQuit = true, detachOnly = false} = {}) {
return async (dispatch, getState) => {
const killAction = killKeepAliveLoop();
killAction(dispatch, getState);
- const applyAction = applyClientMethod({methodName: 'quit'});
- await applyAction(dispatch, getState);
+ if (!detachOnly) {
+ const applyAction = applyClientMethod({methodName: 'deleteSession'});
+ await applyAction(dispatch, getState);
+ }
dispatch({type: QUIT_SESSION_DONE});
- if (!killedByUser) {
+ InspectorDriver.clearInstance(); // clear the 'cached' driver instance
+ if (!manualQuit) {
showError(new Error(reason || i18n.t('Session has been terminated')), {secs: 0});
}
};
@@ -318,20 +336,20 @@ export function clearRecording() {
};
}
-export function getSavedActionFramework() {
+export function getSavedClientFramework() {
return async (dispatch) => {
- let framework = await getSetting(SAVED_FRAMEWORK);
- dispatch({type: SET_ACTION_FRAMEWORK, framework});
+ let framework = await getSetting(SAVED_CLIENT_FRAMEWORK);
+ dispatch({type: SET_CLIENT_FRAMEWORK, framework});
};
}
-export function setActionFramework(framework) {
+export function setClientFramework(framework) {
return async (dispatch) => {
- if (!frameworks[framework]) {
+ if (!CLIENT_FRAMEWORK_MAP[framework]) {
throw new Error(i18n.t('frameworkNotSupported', {framework}));
}
- await setSetting(SAVED_FRAMEWORK, framework);
- dispatch({type: SET_ACTION_FRAMEWORK, framework});
+ await setSetting(SAVED_CLIENT_FRAMEWORK, framework);
+ dispatch({type: SET_CLIENT_FRAMEWORK, framework});
};
}
@@ -348,9 +366,30 @@ export function toggleShowBoilerplate() {
};
}
-export function setSessionDetails({driver, sessionDetails, mode, mjpegScreenshotUrl}) {
+export function setSessionDetails({serverDetails, driver, sessionCaps, appMode, isUsingMjpegMode}) {
return (dispatch) => {
- dispatch({type: SET_SESSION_DETAILS, driver, sessionDetails, mode, mjpegScreenshotUrl});
+ dispatch({
+ type: SET_SESSION_DETAILS,
+ serverDetails,
+ driver,
+ sessionCaps,
+ appMode,
+ isUsingMjpegMode,
+ });
+ };
+}
+
+export function storeSessionSettings(updatedSessionSettings = null) {
+ return async (dispatch, getState) => {
+ let sessionSettings = updatedSessionSettings;
+ if (sessionSettings === null) {
+ const action = applyClientMethod({
+ methodName: 'getSettings',
+ skipRefresh: true,
+ });
+ sessionSettings = await action(dispatch, getState);
+ }
+ dispatch({type: STORE_SESSION_SETTINGS, sessionSettings});
};
}
@@ -384,6 +423,38 @@ export function setSiriCommandValue(siriCommandValue) {
};
}
+export function toggleMultiDisplayMode(displays) {
+ return async (dispatch, getState) => {
+ if (displays) {
+ // Toggling off: reset to the default display (0), then set displays to null
+ await setCurrentDisplayId(0)(dispatch, getState);
+ return dispatch({type: SET_FOUND_DISPLAYS, displays: null});
+ }
+ // Toggling on: run search, set displays and currentDisplayId
+ // Any errors will be surfaced as part of callClientMethod
+ const action = applyClientMethod({
+ methodName: 'executeScript',
+ args: ['mobile:listDisplays', []],
+ skipRefresh: true,
+ });
+ const foundDisplays = await action(dispatch, getState);
+ dispatch({type: SET_FOUND_DISPLAYS, displays: foundDisplays});
+ dispatch({type: SET_CURRENT_DISPLAY_ID, displayId: 0});
+ };
+}
+
+export function setCurrentDisplayId(displayId) {
+ return async (dispatch, getState) => {
+ const action = applyClientMethod({
+ methodName: 'updateSettings',
+ // without enableMultiWindows: true, app source is retrieved from default display
+ args: [{currentDisplayId: displayId, enableMultiWindows: true}],
+ });
+ await action(dispatch, getState);
+ dispatch({type: SET_CURRENT_DISPLAY_ID, displayId});
+ };
+}
+
export function setLocatorTestValue(locatorTestValue) {
return (dispatch) => {
dispatch({type: SET_LOCATOR_TEST_VALUE, locatorTestValue});
@@ -404,12 +475,15 @@ export function setContext(context) {
export function searchForElement(strategy, selector) {
return async (dispatch, getState) => {
+ const isRecording = getState().inspector.isRecording;
dispatch({type: SEARCHING_FOR_ELEMENTS});
try {
const callAction = callClientMethod({strategy, selector, fetchArray: true});
let {elements, variableName, executionTime} = await callAction(dispatch, getState);
- const findAction = findAndAssign(strategy, selector, variableName, true);
- findAction(dispatch, getState);
+ if (isRecording) {
+ const findAction = findAndAssign(strategy, selector, variableName, true);
+ findAction(dispatch, getState);
+ }
elements = elements.map((el) => el.id);
dispatch({type: SEARCHING_FOR_ELEMENTS_COMPLETED, elements, executionTime});
} catch (error) {
@@ -469,10 +543,9 @@ export function setLocatorTestElement(elementId) {
try {
const action = callClientMethod({
elementId,
- methodName: 'getRect',
+ methodName: 'getElementRect',
skipRefresh: true,
skipRecord: true,
- ignoreResult: true,
});
const {commandRes} = await action(dispatch, getState);
dispatch({
@@ -480,7 +553,7 @@ export function setLocatorTestElement(elementId) {
location: {x: commandRes.x, y: commandRes.y},
size: {width: commandRes.width, height: commandRes.height},
});
- } catch (ign) {}
+ } catch {}
}
};
}
@@ -489,30 +562,30 @@ export function setLocatorTestElement(elementId) {
* Given an element ID found through search, and its bounds,
* attempt to find and select this element in the source tree
*/
-export function selectLocatedElement(source, bounds, id) {
+export function selectLocatedElement(sourceJSON, sourceXML, bounds, id) {
const UPPER_FILTER_LIMIT = 10;
// Parse the source tree and find all nodes whose bounds match the expected bounds
- // Return the path + xpath of each node
+ // Return the path of each node
function findPathsMatchingBounds() {
- if (!bounds || !source.children || !source.children[0].attributes) {
+ if (!bounds || !sourceJSON.children?.[0]?.attributes) {
return null;
}
- if (source.children[0].attributes.bounds) {
+ if (sourceJSON.children[0].attributes.bounds) {
const [endX, endY] = [
bounds.location.x + bounds.size.width,
bounds.location.y + bounds.size.height,
];
const coords = `[${bounds.location.x},${bounds.location.y}][${endX},${endY}]`;
- return findPathsFromCoords(source.children, coords);
- } else if (source.children[0].attributes.x) {
+ return findPathsFromCoords(sourceJSON.children, coords);
+ } else if (sourceJSON.children[0].attributes.x) {
const combinedBounds = {
x: String(bounds.location.x),
y: String(bounds.location.y),
height: String(bounds.size.height),
width: String(bounds.size.width),
};
- return findPathsFromBounds(source.children, combinedBounds);
+ return findPathsFromBounds(sourceJSON.children, combinedBounds);
}
return null;
}
@@ -522,7 +595,7 @@ export function selectLocatedElement(source, bounds, id) {
let collectedPaths = [];
for (const tree of trees) {
if (tree.attributes.bounds === coords) {
- collectedPaths.push([tree.path, tree.xpath]);
+ collectedPaths.push(tree.path);
}
if (tree.children.length) {
collectedPaths.push(...findPathsFromCoords(tree.children, coords));
@@ -541,7 +614,7 @@ export function selectLocatedElement(source, bounds, id) {
tree.attributes.height === bounds.height &&
tree.attributes.width === bounds.width
) {
- collectedPaths.push([tree.path, tree.xpath]);
+ collectedPaths.push(tree.path);
}
if (tree.children.length) {
collectedPaths.push(...findPathsFromBounds(tree.children, bounds));
@@ -557,21 +630,24 @@ export function selectLocatedElement(source, bounds, id) {
return null;
}
if (foundPaths.length === 1) {
- return foundPaths[0][0];
+ return foundPaths[0];
} else if (foundPaths.length !== 0 && foundPaths.length <= UPPER_FILTER_LIMIT) {
return await findElementWithMatchingId(foundPaths, dispatch, getState);
}
return null;
}
- // Calls Appium findElement for each provided xpath, and returns the path
- // of the element whose ID matches the expected ID
+ // For each provided path, get its xpath and call Appium findElement
+ // Return the path of the element whose ID matches the expected ID
async function findElementWithMatchingId(foundPaths, dispatch, getState) {
+ const sourceDoc = xmlToDOM(sourceXML);
for (const path of foundPaths) {
- const action = callClientMethod({strategy: 'xpath', selector: path[1]});
+ const domNode = findDOMNodeByPath(path, sourceDoc);
+ const xpath = getOptimalXPath(sourceDoc, domNode);
+ const action = callClientMethod({strategy: 'xpath', selector: xpath});
const {el} = await action(dispatch, getState);
if (el && el.elementId === id) {
- return path[0];
+ return path;
}
}
return null;
@@ -598,15 +674,21 @@ export function clearSearchResults() {
};
}
+export function setMjpegState(targetMjpegState) {
+ return (dispatch) => {
+ dispatch({type: SET_MJPEG_STATE, targetMjpegState});
+ };
+}
+
export function selectScreenshotInteractionMode(screenshotInteractionMode) {
return (dispatch) => {
dispatch({type: SET_SCREENSHOT_INTERACTION_MODE, screenshotInteractionMode});
};
}
-export function toggleRefreshingState() {
+export function setRefreshingState(refreshStates) {
return (dispatch) => {
- dispatch({type: TOGGLE_REFRESHING_STATE});
+ dispatch({type: SET_REFRESHING_STATE, refreshStates});
};
}
@@ -620,7 +702,7 @@ export function selectAppMode(mode) {
await action(dispatch, getState);
}
if (appMode !== mode && mode === APP_MODE.NATIVE) {
- const action = applyClientMethod({methodName: 'switchContext', args: [NATIVE_APP]});
+ const action = applyClientMethod({methodName: 'switchAppiumContext', args: [NATIVE_APP]});
await action(dispatch, getState);
}
};
@@ -641,30 +723,42 @@ export function getActiveAppId(isIOS, isAndroid) {
const action = applyClientMethod({
methodName: 'executeScript',
args: ['mobile:activeAppInfo', []],
+ skipRefresh: true,
});
const {bundleId} = await action(dispatch, getState);
dispatch({type: SET_APP_ID, appId: bundleId});
}
if (isAndroid) {
- const action = applyClientMethod({methodName: 'getCurrentPackage'});
+ const action = applyClientMethod({
+ methodName: 'executeScript',
+ args: ['mobile:getCurrentPackage', []],
+ skipRefresh: true,
+ });
const appPackage = await action(dispatch, getState);
dispatch({type: SET_APP_ID, appId: appPackage});
}
} catch (err) {
- // eslint-disable-next-line no-console
- console.error(`Could not Retrieve Active App ID: ${err}`);
+ log.error(`Could not Retrieve Active App ID: ${err}`);
}
};
}
export function getServerStatus() {
return async (dispatch, getState) => {
- const status = applyClientMethod({methodName: 'status'});
+ const status = applyClientMethod({methodName: 'status', skipRefresh: true});
const {build} = await status(dispatch, getState);
dispatch({type: SET_SERVER_STATUS, status: build});
};
}
+export function getFlatSessionCaps() {
+ return async (dispatch, getState) => {
+ const action = applyClientMethod({methodName: 'getSession', skipRefresh: true});
+ const flatSessionCaps = await action(dispatch, getState);
+ dispatch({type: SET_FLAT_SESSION_CAPS, flatSessionCaps});
+ };
+}
+
// Start the session timer once session starts
export function setSessionTime(time) {
return (dispatch) => {
@@ -690,27 +784,29 @@ export function clearCoordAction() {
};
}
-export function selectInteractionMode(interaction) {
+export function selectInspectorTab(interaction) {
return (dispatch) => {
- dispatch({type: SELECT_INTERACTION_MODE, interaction});
+ dispatch({type: SELECT_INSPECTOR_TAB, interaction});
};
}
-export function startEnteringCommandArgs(commandName, command) {
- return (dispatch) => {
- dispatch({type: ENTERING_COMMAND_ARGS, commandName, command});
- };
-}
-
-export function cancelPendingCommand() {
- return (dispatch) => {
- dispatch({type: CANCEL_PENDING_COMMAND});
- };
-}
+export function getSupportedSessionMethods() {
+ return async (_dispatch, getState) => {
+ async function safelyCallCommand(methodName) {
+ try {
+ const action = executeDriverCommand({methodName});
+ const {commandRes} = await action(getState);
+ return commandRes;
+ } catch {
+ return [];
+ }
+ }
-export function setCommandArg(index, value) {
- return (dispatch) => {
- dispatch({type: SET_COMMAND_ARG, index, value});
+ const [commands, executeMethods] = await Promise.all([
+ safelyCallCommand('getAppiumCommands'),
+ safelyCallCommand('getAppiumExtensions'),
+ ]);
+ return {commands, executeMethods};
};
}
@@ -730,10 +826,10 @@ export function runKeepAliveLoop() {
const keepAliveInterval = setInterval(async () => {
const {lastActiveMoment, showKeepAlivePrompt} = getState().inspector;
- console.log('Pinging Appium server to keep session active'); // eslint-disable-line no-console
+ log.info('Pinging Appium server to keep session active');
try {
await driver.getTimeouts(); // Pings the Appium server to keep it alive
- } catch (ign) {}
+ } catch {}
const now = Date.now();
// If the new command limit has been surpassed, prompt user if they want to keep session going
@@ -750,13 +846,9 @@ export function runKeepAliveLoop() {
*/
export function killKeepAliveLoop() {
return (dispatch, getState) => {
- const {keepAliveInterval, userWaitTimeout} = getState().inspector;
+ const {keepAliveInterval} = getState().inspector;
clearInterval(keepAliveInterval);
- if (userWaitTimeout) {
- clearTimeout(userWaitTimeout);
- }
dispatch({type: SET_KEEP_ALIVE_INTERVAL, keepAliveInterval: null});
- dispatch({type: SET_USER_WAIT_TIMEOUT, userWaitTimeout: null});
};
}
@@ -777,12 +869,13 @@ export function keepSessionAlive() {
export function callClientMethod(params) {
return async (dispatch, getState) => {
- const {driver, appMode, mjpegScreenshotUrl, isSourceRefreshOn} = getState().inspector;
- const {methodName, ignoreResult = true} = params;
+ const {driver, appMode, isUsingMjpegMode, isSourceRefreshOn, autoSessionRestart} =
+ getState().inspector;
params.appMode = appMode;
+ params.autoSessionRestart = autoSessionRestart;
// don't retrieve screenshot if we're already using the mjpeg stream
- if (mjpegScreenshotUrl) {
+ if (isUsingMjpegMode) {
params.skipScreenshot = true;
}
@@ -790,36 +883,35 @@ export function callClientMethod(params) {
params.skipRefresh = true;
}
- console.log(`Calling client method with params:`); // eslint-disable-line no-console
- console.log(params); // eslint-disable-line no-console
- const action = keepSessionAlive();
- action(dispatch, getState);
- const client = AppiumClient.instance(driver);
- const res = await client.run(params);
- let {commandRes} = res;
-
- // Ignore empty objects
- if (_.isObject(res) && _.isEmpty(res)) {
- commandRes = null;
- }
-
- if (!ignoreResult) {
- // if the user is running actions manually, we want to show the full response with the
- // ability to scroll etc...
- const result = JSON.stringify(commandRes, null, ' ');
- const truncatedResult = _.truncate(result, {length: 2000});
- console.log(`Result of client command was:`); // eslint-disable-line no-console
- console.log(truncatedResult); // eslint-disable-line no-console
- setVisibleCommandResult(result, methodName)(dispatch);
+ log.info(`Calling client method with params:`);
+ log.info(params);
+ try {
+ const action = keepSessionAlive();
+ action(dispatch, getState);
+ const inspectorDriver = InspectorDriver.instance(driver);
+ const res = await inspectorDriver.run(params);
+ res.elementId = res.id;
+ return res;
+ } catch (error) {
+ log.error(error);
+ if (getState().inspector.autoSessionRestart) {
+ const restartSes = restartSession(error, params);
+ return await restartSes(dispatch, getState);
+ }
+ showError(error, {methodName: params.methodName, secs: 10});
+ dispatch({type: METHOD_CALL_DONE});
}
- res.elementId = res.id;
- return res;
};
}
-export function setVisibleCommandResult(result, methodName) {
- return (dispatch) => {
- dispatch({type: SET_VISIBLE_COMMAND_RESULT, result, methodName});
+// Simple alternative to callClientMethod, for when we only want to
+// run the command without any side-effects
+export function executeDriverCommand(params) {
+ return async (getState) => {
+ const {driver} = getState().inspector;
+ params.skipRefresh = true;
+ const inspectorDriver = InspectorDriver.instance(driver);
+ return await inspectorDriver.run(params);
};
}
@@ -829,22 +921,74 @@ export function setAwaitingMjpegStream(isAwaiting) {
};
}
-export function saveGesture(params) {
+export function importGestureFiles(fileList) {
return async (dispatch) => {
- let savedGestures = (await getSetting(SET_SAVED_GESTURES)) || [];
- if (!params.id) {
- params.id = UUID();
- params.date = Date.now();
- savedGestures.push(params);
- } else {
- for (const gesture of savedGestures) {
- if (gesture.id === params.id) {
- gesture.name = params.name;
- gesture.description = params.description;
- gesture.actions = params.actions;
+ dispatch({type: GESTURE_UPLOAD_REQUESTED});
+ const gestures = await readTextFromUploadedFiles(fileList);
+ const invalidGestureFiles = [];
+ const parsedGestures = [];
+ for (const gesture of gestures) {
+ const {fileName, content, error} = gesture;
+ // Some error occurred while reading the uploaded file
+ if (error) {
+ invalidGestureFiles.push(fileName);
+ continue;
+ }
+ const gestureJSON = parseAndValidateGestureFileString(content);
+ if (!gestureJSON) {
+ invalidGestureFiles.push(fileName);
+ continue;
+ }
+ parsedGestures.push(gestureJSON);
+ }
+
+ for (const parsedGesture of parsedGestures) {
+ await saveGesture(parsedGesture)(dispatch);
+ }
+ dispatch({type: GESTURE_UPLOAD_DONE});
+
+ if (!_.isEmpty(invalidGestureFiles)) {
+ notification.error({
+ title: i18n.t('unableToImportGestureFiles', {fileNames: invalidGestureFiles.join(', ')}),
+ duration: 0,
+ });
+ }
+ };
+}
+
+export function exportSavedGesture(gestureJSON) {
+ return async () => {
+ const cleanedName = `gesture-${gestureJSON.name}`;
+ const gestureToExport = _.omit(gestureJSON, ['id', 'date']);
+ const href = `data:text/json;charset=utf-8,${encodeURIComponent(
+ JSON.stringify(gestureToExport, null, 2),
+ )}`;
+ const escapedName = sanitize(cleanedName, {replacement: '_'});
+ const fileName = `${escapedName}.json`;
+ downloadFile(href, fileName);
+ };
+}
+
+export function saveGesture(gesture) {
+ return async (dispatch) => {
+ const savedGestures = (await getSetting(SET_SAVED_GESTURES)) || [];
+
+ if (gesture.id) {
+ // Editing an already saved gesture
+ for (const savedGesture of savedGestures) {
+ if (savedGesture.id === gesture.id) {
+ savedGesture.name = gesture.name;
+ savedGesture.description = gesture.description;
+ savedGesture.actions = gesture.actions;
}
}
+ } else {
+ // Adding a new gesture
+ gesture.id = getRandomId();
+ gesture.date = Date.now();
+ savedGestures.push(gesture);
}
+
await setSetting(SET_SAVED_GESTURES, savedGestures);
const action = getSavedGestures();
await action(dispatch);
@@ -938,3 +1082,18 @@ export function toggleShowAttributes() {
dispatch({type: TOGGLE_SHOW_ATTRIBUTES});
};
}
+
+export function toggleAutoSessionRestart() {
+ return (dispatch, getState) => {
+ const autoSessionRestart = !getState().inspector.autoSessionRestart;
+ dispatch({type: SET_AUTO_SESSION_RESTART, autoSessionRestart});
+ };
+}
+
+function parseAndValidateGestureFileString(gestureFileString) {
+ const gestureJSON = parseGestureFileContents(gestureFileString);
+ if (gestureJSON === null) {
+ return null;
+ }
+ return _.omit(gestureJSON, ['id', 'date']);
+}
diff --git a/app/common/renderer/actions/index.js b/app/common/renderer/actions/index.js
new file mode 100644
index 0000000000..33277c6120
--- /dev/null
+++ b/app/common/renderer/actions/index.js
@@ -0,0 +1,7 @@
+import * as sessionBuilderActions from './SessionBuilder.js';
+import * as sessionInspectorActions from './SessionInspector.js';
+
+export default {
+ ...sessionInspectorActions,
+ ...sessionBuilderActions,
+};
diff --git a/app/renderer/images/bitbar_logo.svg b/app/common/renderer/assets/images/bitbar_logo.svg
similarity index 100%
rename from app/renderer/images/bitbar_logo.svg
rename to app/common/renderer/assets/images/bitbar_logo.svg
diff --git a/app/common/renderer/assets/images/browserstack_logo.svg b/app/common/renderer/assets/images/browserstack_logo.svg
new file mode 100644
index 0000000000..dfd660b64a
--- /dev/null
+++ b/app/common/renderer/assets/images/browserstack_logo.svg
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/common/renderer/assets/images/browserstack_logo_dark.svg b/app/common/renderer/assets/images/browserstack_logo_dark.svg
new file mode 100644
index 0000000000..94af15fa24
--- /dev/null
+++ b/app/common/renderer/assets/images/browserstack_logo_dark.svg
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/renderer/images/experitest_logo.svg b/app/common/renderer/assets/images/experitest_logo.svg
similarity index 100%
rename from app/renderer/images/experitest_logo.svg
rename to app/common/renderer/assets/images/experitest_logo.svg
diff --git a/app/common/renderer/assets/images/fireflink_devicefarm_logo.svg b/app/common/renderer/assets/images/fireflink_devicefarm_logo.svg
new file mode 100644
index 0000000000..825bfb0df5
--- /dev/null
+++ b/app/common/renderer/assets/images/fireflink_devicefarm_logo.svg
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/common/renderer/assets/images/fireflink_devicefarm_logo_dark.svg b/app/common/renderer/assets/images/fireflink_devicefarm_logo_dark.svg
new file mode 100644
index 0000000000..b4fa09af52
--- /dev/null
+++ b/app/common/renderer/assets/images/fireflink_devicefarm_logo_dark.svg
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/common/renderer/assets/images/headspin_logo.svg b/app/common/renderer/assets/images/headspin_logo.svg
new file mode 100644
index 0000000000..3399edf48e
--- /dev/null
+++ b/app/common/renderer/assets/images/headspin_logo.svg
@@ -0,0 +1,46 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/common/renderer/assets/images/icon.png b/app/common/renderer/assets/images/icon.png
new file mode 100644
index 0000000000..91bc513520
Binary files /dev/null and b/app/common/renderer/assets/images/icon.png differ
diff --git a/app/common/renderer/assets/images/kobiton_logo.svg b/app/common/renderer/assets/images/kobiton_logo.svg
new file mode 100644
index 0000000000..f390de94d6
--- /dev/null
+++ b/app/common/renderer/assets/images/kobiton_logo.svg
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/common/renderer/assets/images/kobiton_logo_dark.svg b/app/common/renderer/assets/images/kobiton_logo_dark.svg
new file mode 100644
index 0000000000..69c29ff82f
--- /dev/null
+++ b/app/common/renderer/assets/images/kobiton_logo_dark.svg
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/renderer/images/loader.svg b/app/common/renderer/assets/images/loader.svg
similarity index 100%
rename from app/renderer/images/loader.svg
rename to app/common/renderer/assets/images/loader.svg
diff --git a/app/renderer/images/mobitru_logo.svg b/app/common/renderer/assets/images/mobitru_logo.svg
similarity index 99%
rename from app/renderer/images/mobitru_logo.svg
rename to app/common/renderer/assets/images/mobitru_logo.svg
index 25e100e650..cb4da6fe7b 100644
--- a/app/renderer/images/mobitru_logo.svg
+++ b/app/common/renderer/assets/images/mobitru_logo.svg
@@ -1,4 +1,4 @@
-
+
@@ -116,4 +116,4 @@
-
+
\ No newline at end of file
diff --git a/app/common/renderer/assets/images/pcloudy_logo.svg b/app/common/renderer/assets/images/pcloudy_logo.svg
new file mode 100644
index 0000000000..a09214d78e
--- /dev/null
+++ b/app/common/renderer/assets/images/pcloudy_logo.svg
@@ -0,0 +1,91 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/common/renderer/assets/images/pcloudy_logo_dark.svg b/app/common/renderer/assets/images/pcloudy_logo_dark.svg
new file mode 100644
index 0000000000..ed49b07c14
--- /dev/null
+++ b/app/common/renderer/assets/images/pcloudy_logo_dark.svg
@@ -0,0 +1,87 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/renderer/images/perfecto_logo.svg b/app/common/renderer/assets/images/perfecto_logo.svg
similarity index 100%
rename from app/renderer/images/perfecto_logo.svg
rename to app/common/renderer/assets/images/perfecto_logo.svg
diff --git a/app/common/renderer/assets/images/rabbitqa_logo.svg b/app/common/renderer/assets/images/rabbitqa_logo.svg
new file mode 100644
index 0000000000..cb4d2b1437
--- /dev/null
+++ b/app/common/renderer/assets/images/rabbitqa_logo.svg
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/common/renderer/assets/images/rabbitqa_logo_dark.svg b/app/common/renderer/assets/images/rabbitqa_logo_dark.svg
new file mode 100644
index 0000000000..a11fa133a8
--- /dev/null
+++ b/app/common/renderer/assets/images/rabbitqa_logo_dark.svg
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/common/renderer/assets/images/remotetestkit_logo.svg b/app/common/renderer/assets/images/remotetestkit_logo.svg
new file mode 100644
index 0000000000..f282345fed
--- /dev/null
+++ b/app/common/renderer/assets/images/remotetestkit_logo.svg
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/common/renderer/assets/images/robotactions_logo.svg b/app/common/renderer/assets/images/robotactions_logo.svg
new file mode 100644
index 0000000000..14e364647b
--- /dev/null
+++ b/app/common/renderer/assets/images/robotactions_logo.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/common/renderer/assets/images/robotactions_logo_dark.svg b/app/common/renderer/assets/images/robotactions_logo_dark.svg
new file mode 100644
index 0000000000..cb88492cf4
--- /dev/null
+++ b/app/common/renderer/assets/images/robotactions_logo_dark.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/app/common/renderer/assets/images/robotqa_logo.svg b/app/common/renderer/assets/images/robotqa_logo.svg
new file mode 100644
index 0000000000..92452c40d5
--- /dev/null
+++ b/app/common/renderer/assets/images/robotqa_logo.svg
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/common/renderer/assets/images/robotqa_logo_dark.svg b/app/common/renderer/assets/images/robotqa_logo_dark.svg
new file mode 100644
index 0000000000..d9e2e6f188
--- /dev/null
+++ b/app/common/renderer/assets/images/robotqa_logo_dark.svg
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/common/renderer/assets/images/sauce_logo.svg b/app/common/renderer/assets/images/sauce_logo.svg
new file mode 100644
index 0000000000..e6557105ec
--- /dev/null
+++ b/app/common/renderer/assets/images/sauce_logo.svg
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/common/renderer/assets/images/sauce_logo_dark.svg b/app/common/renderer/assets/images/sauce_logo_dark.svg
new file mode 100644
index 0000000000..7e829759a6
--- /dev/null
+++ b/app/common/renderer/assets/images/sauce_logo_dark.svg
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/common/renderer/assets/images/testcribe_logo.svg b/app/common/renderer/assets/images/testcribe_logo.svg
new file mode 100644
index 0000000000..d5e2e3347f
--- /dev/null
+++ b/app/common/renderer/assets/images/testcribe_logo.svg
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/common/renderer/assets/images/testcribe_logo_dark.svg b/app/common/renderer/assets/images/testcribe_logo_dark.svg
new file mode 100644
index 0000000000..0cea881bda
--- /dev/null
+++ b/app/common/renderer/assets/images/testcribe_logo_dark.svg
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/renderer/images/testingbot_logo.svg b/app/common/renderer/assets/images/testingbot_logo.svg
similarity index 99%
rename from app/renderer/images/testingbot_logo.svg
rename to app/common/renderer/assets/images/testingbot_logo.svg
index 7acf719f9d..0c957f9aa3 100644
--- a/app/renderer/images/testingbot_logo.svg
+++ b/app/common/renderer/assets/images/testingbot_logo.svg
@@ -1,5 +1,5 @@
-
+
Untitled
Created with Sketch.
diff --git a/app/common/renderer/assets/images/testingbot_logo_dark.svg b/app/common/renderer/assets/images/testingbot_logo_dark.svg
new file mode 100644
index 0000000000..b41137c4df
--- /dev/null
+++ b/app/common/renderer/assets/images/testingbot_logo_dark.svg
@@ -0,0 +1,11 @@
+
+
+ Untitled
+ Created with Sketch.
+
+
+
+ TestingBot
+
+
+
\ No newline at end of file
diff --git a/app/common/renderer/assets/images/testmuai_logo.svg b/app/common/renderer/assets/images/testmuai_logo.svg
new file mode 100644
index 0000000000..017998d231
--- /dev/null
+++ b/app/common/renderer/assets/images/testmuai_logo.svg
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/common/renderer/assets/images/testmuai_logo_dark.svg b/app/common/renderer/assets/images/testmuai_logo_dark.svg
new file mode 100644
index 0000000000..1e94f42f0b
--- /dev/null
+++ b/app/common/renderer/assets/images/testmuai_logo_dark.svg
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/common/renderer/assets/images/tvlabs_logo.svg b/app/common/renderer/assets/images/tvlabs_logo.svg
new file mode 100644
index 0000000000..d1a4256ec4
--- /dev/null
+++ b/app/common/renderer/assets/images/tvlabs_logo.svg
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/common/renderer/assets/images/tvlabs_logo_dark.svg b/app/common/renderer/assets/images/tvlabs_logo_dark.svg
new file mode 100644
index 0000000000..e4d703bf16
--- /dev/null
+++ b/app/common/renderer/assets/images/tvlabs_logo_dark.svg
@@ -0,0 +1,75 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/common/renderer/assets/images/webmate_logo.svg b/app/common/renderer/assets/images/webmate_logo.svg
new file mode 100644
index 0000000000..ac97134c34
--- /dev/null
+++ b/app/common/renderer/assets/images/webmate_logo.svg
@@ -0,0 +1,46 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/common/renderer/assets/images/webmate_logo_dark.svg b/app/common/renderer/assets/images/webmate_logo_dark.svg
new file mode 100644
index 0000000000..2a65ac7352
--- /dev/null
+++ b/app/common/renderer/assets/images/webmate_logo_dark.svg
@@ -0,0 +1,46 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/common/renderer/assets/stylesheets/main.css b/app/common/renderer/assets/stylesheets/main.css
new file mode 100644
index 0000000000..495c6ad103
--- /dev/null
+++ b/app/common/renderer/assets/stylesheets/main.css
@@ -0,0 +1,93 @@
+@import 'antd/dist/reset.css';
+
+body.dark {
+ color-scheme: dark;
+}
+
+body {
+ min-height: 610px;
+ min-width: 870px;
+ color: #222 !important;
+ box-sizing: border-box;
+}
+
+body::-webkit-scrollbar {
+ width: 0px;
+ background: transparent;
+}
+
+body::-webkit-scrollbar-corner {
+ background: transparent;
+}
+
+#root,
+.ant-app,
+.ant-layout {
+ height: 100%;
+}
+
+.window {
+ background-color: #cde4f5 !important;
+ width: 100%;
+ height: 100%;
+}
+
+.list-group-item.active {
+ background-color: #662d91 !important;
+}
+
+.ant-spin,
+.ant-spin-container {
+ height: 100%;
+}
+
+.ant-input-group .ant-select {
+ height: 100%;
+}
+
+.ant-input-group .ant-select-selection {
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0;
+ height: 100%;
+ padding-top: 0;
+}
+
+.ant-input-group .ant-select-selection .ant-select-selection-selected-value {
+ padding-top: 2px;
+}
+
+.ant-input-group .ant-input-group-addon {
+ padding-left: 8px;
+}
+
+.ant-input-group .select-container {
+ height: 32px;
+}
+
+.ant-space-addon {
+ padding: 0 8px;
+ white-space: nowrap;
+}
+
+.ant-btn-icon {
+ font-size: 14px;
+ display: flex;
+ justify-content: center;
+}
+
+.anticon {
+ font-size: 14px;
+}
+
+.ant-switch .anticon {
+ font-size: 12px;
+}
+
+.ant-switch-inner-checked,
+.ant-switch-inner-unchecked {
+ font-size: 12px !important;
+}
+
+.ant-splitter-bar {
+ margin: 6px;
+}
diff --git a/app/common/renderer/assets/stylesheets/prism-dark.css b/app/common/renderer/assets/stylesheets/prism-dark.css
new file mode 100644
index 0000000000..e99f94e6b9
--- /dev/null
+++ b/app/common/renderer/assets/stylesheets/prism-dark.css
@@ -0,0 +1,200 @@
+/**
+ * One Dark theme for prism.js
+ * Based on Atom's One Dark theme: https://github.com/atom/atom/tree/master/packages/one-dark-syntax
+ * Modified from https://github.com/PrismJS/prism-themes/blob/master/themes/prism-one-dark.css
+ */
+
+/**
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2015 PrismJS
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+code[class*='language-'],
+pre[class*='language-'] {
+ color: hsl(220, 14%, 71%);
+ direction: ltr;
+ text-align: left;
+ white-space: pre-wrap;
+ word-spacing: normal;
+ word-break: break-word;
+ -moz-tab-size: 2;
+ -o-tab-size: 2;
+ tab-size: 2;
+ -webkit-hyphens: none;
+ -moz-hyphens: none;
+ -ms-hyphens: none;
+ hyphens: none;
+}
+
+/* Selection */
+code[class*='language-']::-moz-selection,
+code[class*='language-'] *::-moz-selection,
+pre[class*='language-'] *::-moz-selection {
+ background: hsl(220, 13%, 28%);
+ color: inherit;
+ text-shadow: none;
+}
+
+code[class*='language-']::selection,
+code[class*='language-'] *::selection,
+pre[class*='language-'] *::selection {
+ background: hsl(220, 13%, 28%);
+ color: inherit;
+ text-shadow: none;
+}
+
+/* Inline code */
+:not(pre) > code[class*='language-'] {
+ padding: 0.2em 0.3em;
+ border-radius: 0.3em;
+ white-space: normal;
+}
+
+/* Print */
+@media print {
+ code[class*='language-'],
+ pre[class*='language-'] {
+ text-shadow: none;
+ }
+}
+
+.token.comment,
+.token.prolog,
+.token.cdata {
+ color: hsl(220, 10%, 40%);
+}
+
+.token.doctype,
+.token.punctuation,
+.token.entity {
+ color: hsl(220, 14%, 71%);
+}
+
+.token.attr-name,
+.token.class-name,
+.token.boolean,
+.token.constant,
+.token.number,
+.token.atrule {
+ color: hsl(29, 54%, 61%);
+}
+
+.token.keyword {
+ color: hsl(286, 60%, 67%);
+}
+
+.token.property,
+.token.tag,
+.token.symbol,
+.token.deleted,
+.token.important {
+ color: hsl(355, 65%, 65%);
+}
+
+.token.selector,
+.token.string,
+.token.char,
+.token.builtin,
+.token.inserted,
+.token.regex,
+.token.attr-value,
+.token.attr-value > .token.punctuation {
+ color: hsl(95, 38%, 62%);
+}
+
+.token.variable,
+.token.operator,
+.token.function {
+ color: hsl(207, 82%, 66%);
+}
+
+.token.url {
+ color: hsl(187, 47%, 55%);
+}
+
+/* HTML overrides */
+.token.attr-value > .token.punctuation.attr-equals,
+.token.special-attr > .token.attr-value > .token.value.css {
+ color: hsl(220, 14%, 71%);
+}
+
+/* CSS overrides */
+.language-css .token.selector {
+ color: hsl(355, 65%, 65%);
+}
+
+.language-css .token.property {
+ color: hsl(220, 14%, 71%);
+}
+
+.language-css .token.function,
+.language-css .token.url > .token.function {
+ color: hsl(187, 47%, 55%);
+}
+
+.language-css .token.url > .token.string.url {
+ color: hsl(95, 38%, 62%);
+}
+
+.language-css .token.important,
+.language-css .token.atrule .token.rule {
+ color: hsl(286, 60%, 67%);
+}
+
+/* JS overrides */
+.language-javascript .token.operator {
+ color: hsl(286, 60%, 67%);
+}
+
+.language-javascript
+ .token.template-string
+ > .token.interpolation
+ > .token.interpolation-punctuation.punctuation {
+ color: hsl(5, 48%, 51%);
+}
+
+/* JSON overrides */
+.language-json .token.operator {
+ color: hsl(220, 14%, 71%);
+}
+
+.language-json .token.null.keyword {
+ color: hsl(29, 54%, 61%);
+}
+
+/* General */
+.token.bold {
+ font-weight: bold;
+}
+
+.token.comment,
+.token.italic {
+ font-style: italic;
+}
+
+.token.entity {
+ cursor: help;
+}
+
+.token.namespace {
+ opacity: 0.8;
+}
diff --git a/app/common/renderer/assets/stylesheets/prism-light.css b/app/common/renderer/assets/stylesheets/prism-light.css
new file mode 100644
index 0000000000..64be18c58c
--- /dev/null
+++ b/app/common/renderer/assets/stylesheets/prism-light.css
@@ -0,0 +1,190 @@
+/**
+ * One Light theme for prism.js
+ * Based on Atom's One Light theme: https://github.com/atom/atom/tree/master/packages/one-light-syntax
+ * Modified from https://github.com/PrismJS/prism-themes/blob/master/themes/prism-one-light.css
+ */
+
+/**
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2015 PrismJS
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+code[class*='language-'],
+pre[class*='language-'] {
+ color: hsl(230, 8%, 24%);
+ direction: ltr;
+ text-align: left;
+ white-space: pre-wrap;
+ word-spacing: normal;
+ word-break: break-word;
+ -moz-tab-size: 2;
+ -o-tab-size: 2;
+ tab-size: 2;
+ -webkit-hyphens: none;
+ -moz-hyphens: none;
+ -ms-hyphens: none;
+ hyphens: none;
+}
+
+/* Selection */
+code[class*='language-']::-moz-selection,
+code[class*='language-'] *::-moz-selection,
+pre[class*='language-'] *::-moz-selection {
+ background: hsl(230, 1%, 90%);
+ color: inherit;
+}
+
+code[class*='language-']::selection,
+code[class*='language-'] *::selection,
+pre[class*='language-'] *::selection {
+ background: hsl(230, 1%, 90%);
+ color: inherit;
+}
+
+/* Inline code */
+:not(pre) > code[class*='language-'] {
+ padding: 0.2em 0.3em;
+ border-radius: 0.3em;
+ white-space: normal;
+}
+
+.token.comment,
+.token.prolog,
+.token.cdata {
+ color: hsl(230, 4%, 64%);
+}
+
+.token.doctype,
+.token.punctuation,
+.token.entity {
+ color: hsl(230, 8%, 24%);
+}
+
+.token.attr-name,
+.token.class-name,
+.token.boolean,
+.token.constant,
+.token.number,
+.token.atrule {
+ color: hsl(35, 99%, 36%);
+}
+
+.token.keyword {
+ color: hsl(301, 63%, 40%);
+}
+
+.token.property,
+.token.tag,
+.token.symbol,
+.token.deleted,
+.token.important {
+ color: hsl(5, 74%, 59%);
+}
+
+.token.selector,
+.token.string,
+.token.char,
+.token.builtin,
+.token.inserted,
+.token.regex,
+.token.attr-value,
+.token.attr-value > .token.punctuation {
+ color: hsl(119, 34%, 47%);
+}
+
+.token.variable,
+.token.operator,
+.token.function {
+ color: hsl(221, 87%, 60%);
+}
+
+.token.url {
+ color: hsl(198, 99%, 37%);
+}
+
+/* HTML overrides */
+.token.attr-value > .token.punctuation.attr-equals,
+.token.special-attr > .token.attr-value > .token.value.css {
+ color: hsl(230, 8%, 24%);
+}
+
+/* CSS overrides */
+.language-css .token.selector {
+ color: hsl(5, 74%, 59%);
+}
+
+.language-css .token.property {
+ color: hsl(230, 8%, 24%);
+}
+
+.language-css .token.function,
+.language-css .token.url > .token.function {
+ color: hsl(198, 99%, 37%);
+}
+
+.language-css .token.url > .token.string.url {
+ color: hsl(119, 34%, 47%);
+}
+
+.language-css .token.important,
+.language-css .token.atrule .token.rule {
+ color: hsl(301, 63%, 40%);
+}
+
+/* JS overrides */
+.language-javascript .token.operator {
+ color: hsl(301, 63%, 40%);
+}
+
+.language-javascript
+ .token.template-string
+ > .token.interpolation
+ > .token.interpolation-punctuation.punctuation {
+ color: hsl(344, 84%, 43%);
+}
+
+/* JSON overrides */
+.language-json .token.operator {
+ color: hsl(230, 8%, 24%);
+}
+
+.language-json .token.null.keyword {
+ color: hsl(35, 99%, 36%);
+}
+
+/* General */
+.token.bold {
+ font-weight: bold;
+}
+
+.token.comment,
+.token.italic {
+ font-style: italic;
+}
+
+.token.entity {
+ cursor: help;
+}
+
+.token.namespace {
+ opacity: 0.8;
+}
diff --git a/app/renderer/stylesheets/splash.global.less b/app/common/renderer/assets/stylesheets/splash.css
similarity index 86%
rename from app/renderer/stylesheets/splash.global.less
rename to app/common/renderer/assets/stylesheets/splash.css
index af48ac9f49..dce6c4ac32 100644
--- a/app/renderer/stylesheets/splash.global.less
+++ b/app/common/renderer/assets/stylesheets/splash.css
@@ -1,5 +1,3 @@
-@import './common.global.less';
-
#root {
display: flex;
flex-direction: column;
@@ -10,6 +8,7 @@
#splashImage {
height: 150px;
width: 150px;
+ margin-top: 35px;
}
#loader {
diff --git a/app/renderer/components/ErrorBoundary/ErrorBoundary.js b/app/common/renderer/components/ErrorBoundary/ErrorBoundary.jsx
similarity index 66%
rename from app/renderer/components/ErrorBoundary/ErrorBoundary.js
rename to app/common/renderer/components/ErrorBoundary/ErrorBoundary.jsx
index 3cb6631b21..70b4a41a26 100644
--- a/app/renderer/components/ErrorBoundary/ErrorBoundary.js
+++ b/app/common/renderer/components/ErrorBoundary/ErrorBoundary.jsx
@@ -1,13 +1,13 @@
-import React from 'react';
+import {Component} from 'react';
-import {clipboard} from '../../polyfills';
-import ErrorMessage from './ErrorMessage';
+import {copyToClipboard} from '../../utils/other.js';
+import ErrorMessage from './ErrorMessage.jsx';
const copyTrace = (trace) => {
- clipboard.writeText(trace);
+ copyToClipboard(trace);
};
-export default class ErrorBoundary extends React.Component {
+export default class ErrorBoundary extends Component {
constructor(props) {
super(props);
this.state = {
diff --git a/app/common/renderer/components/ErrorBoundary/ErrorMessage.jsx b/app/common/renderer/components/ErrorBoundary/ErrorMessage.jsx
new file mode 100644
index 0000000000..1e3bb955d1
--- /dev/null
+++ b/app/common/renderer/components/ErrorBoundary/ErrorMessage.jsx
@@ -0,0 +1,47 @@
+import {IconFiles} from '@tabler/icons-react';
+import {Alert, Button, Tooltip} from 'antd';
+import {useTranslation} from 'react-i18next';
+
+import {ALERT} from '../../constants/antd-types.js';
+import {LINKS} from '../../constants/common.js';
+import {openLink} from '../../polyfills.js';
+import styles from './ErrorMessage.module.css';
+
+const ErrorMessage = ({error, copyTrace}) => {
+ const {t} = useTranslation();
+
+ return (
+
+ );
+};
+
+export default ErrorMessage;
diff --git a/app/renderer/components/ErrorBoundary/ErrorMessage.css b/app/common/renderer/components/ErrorBoundary/ErrorMessage.module.css
similarity index 100%
rename from app/renderer/components/ErrorBoundary/ErrorMessage.css
rename to app/common/renderer/components/ErrorBoundary/ErrorMessage.module.css
diff --git a/app/common/renderer/components/FileUploader.jsx b/app/common/renderer/components/FileUploader.jsx
new file mode 100644
index 0000000000..c633330287
--- /dev/null
+++ b/app/common/renderer/components/FileUploader.jsx
@@ -0,0 +1,35 @@
+import {IconFileImport} from '@tabler/icons-react';
+import {Button, Upload} from 'antd';
+import {useRef} from 'react';
+
+const FileUploader = (props) => {
+ const {multiple, onUpload, type, title} = props;
+
+ const fileCounterRef = useRef(1);
+
+ // If multiple files are uploaded at once, this function is called once for every file.
+ // In order to upload everything only once, use a counter to track invocation count.
+ const beforeUpload = (_file, list) => {
+ if (fileCounterRef.current >= list.length) {
+ onUpload(list);
+ fileCounterRef.current = 1;
+ } else {
+ fileCounterRef.current += 1;
+ }
+ return false;
+ };
+
+ return (
+
+ }>{title}
+
+ );
+};
+
+export default FileUploader;
diff --git a/app/common/renderer/components/Notification.jsx b/app/common/renderer/components/Notification.jsx
new file mode 100644
index 0000000000..9c959c692f
--- /dev/null
+++ b/app/common/renderer/components/Notification.jsx
@@ -0,0 +1,23 @@
+import {App} from 'antd';
+import {useEffect} from 'react';
+
+import {NOTIFICATION_EVENT} from '../utils/notification.js';
+
+export default function Notification() {
+ const {notification} = App.useApp();
+
+ useEffect(() => {
+ const handleMessage = (event) => {
+ const {args, type} = event.detail;
+ notification[type](args);
+ };
+
+ document.addEventListener(NOTIFICATION_EVENT, handleMessage);
+
+ return () => {
+ document.removeEventListener(NOTIFICATION_EVENT, handleMessage);
+ };
+ }, [notification]);
+
+ return null;
+}
diff --git a/app/common/renderer/components/SessionBuilder/AppSettings/AppSettings.jsx b/app/common/renderer/components/SessionBuilder/AppSettings/AppSettings.jsx
new file mode 100644
index 0000000000..cab886c650
--- /dev/null
+++ b/app/common/renderer/components/SessionBuilder/AppSettings/AppSettings.jsx
@@ -0,0 +1,36 @@
+import {IconSettings} from '@tabler/icons-react';
+import {Button, Form, Modal, Tooltip} from 'antd';
+import {useState} from 'react';
+import {useTranslation} from 'react-i18next';
+
+import ChangeLanguage from './ChangeLanguage.jsx';
+import ToggleTheme from './ToggleTheme.jsx';
+
+const AppSettings = () => {
+ const [modalOpen, setModalOpen] = useState(false);
+ const {t} = useTranslation();
+
+ return (
+ <>
+
+ } onClick={() => setModalOpen(true)} />
+
+
+ setModalOpen(false)}
+ centered
+ >
+
+
+ >
+ );
+};
+
+export default AppSettings;
diff --git a/app/common/renderer/components/SessionBuilder/AppSettings/ChangeLanguage.jsx b/app/common/renderer/components/SessionBuilder/AppSettings/ChangeLanguage.jsx
new file mode 100644
index 0000000000..986d6f83e3
--- /dev/null
+++ b/app/common/renderer/components/SessionBuilder/AppSettings/ChangeLanguage.jsx
@@ -0,0 +1,44 @@
+import {Form, Select} from 'antd';
+import {useEffect, useState} from 'react';
+import {useTranslation} from 'react-i18next';
+
+import {languageList} from '../../../../shared/i18next.config.js';
+import {PREFERRED_LANGUAGE} from '../../../../shared/setting-defs.js';
+import {setSetting, updateLanguage} from '../../../polyfills.js';
+
+const ChangeLanguage = () => {
+ const {t, i18n} = useTranslation();
+ const [language, setLanguage] = useState(i18n.language);
+
+ useEffect(() => {
+ const handler = (lng) => setLanguage(lng);
+ i18n.on('languageChanged', handler);
+ return () => i18n.off('languageChanged', handler);
+ }, [i18n]);
+
+ const languageOptions = languageList.map((language) => ({
+ value: language.code,
+ label: `${language.name} (${language.original})`,
+ }));
+
+ const handleLanguageChange = async (val) => {
+ setLanguage(val);
+ await i18n.changeLanguage(val);
+ await setSetting(PREFERRED_LANGUAGE, val);
+ updateLanguage(val);
+ };
+
+ return (
+
+
+
+ );
+};
+
+export default ChangeLanguage;
diff --git a/app/common/renderer/components/SessionBuilder/AppSettings/ToggleTheme.jsx b/app/common/renderer/components/SessionBuilder/AppSettings/ToggleTheme.jsx
new file mode 100644
index 0000000000..ffc1c738df
--- /dev/null
+++ b/app/common/renderer/components/SessionBuilder/AppSettings/ToggleTheme.jsx
@@ -0,0 +1,52 @@
+import {IconMoon, IconSun, IconSunMoon} from '@tabler/icons-react';
+import {Button, Col, Form, Row} from 'antd';
+import {useTranslation} from 'react-i18next';
+
+import {BUTTON} from '../../../constants/antd-types.js';
+import {useTheme} from '../../../hooks/use-theme.jsx';
+
+const ToggleTheme = () => {
+ const {preferredTheme, updateTheme} = useTheme();
+ const {t} = useTranslation();
+
+ const themes = [
+ {
+ value: 'light',
+ label: t('Light Theme'),
+ icon: ,
+ },
+ {
+ value: 'dark',
+ label: t('Dark Theme'),
+ icon: ,
+ },
+ {
+ value: 'system',
+ label: t('System Theme'),
+ icon: ,
+ },
+ ];
+
+ return (
+
+
+ {themes.map(({value, label, icon}) => (
+
+ updateTheme(value)}
+ >
+ {label}
+
+
+ ))}
+
+
+ );
+};
+
+export default ToggleTheme;
diff --git a/app/common/renderer/components/SessionBuilder/AttachToSessionTab/AttachToSession.jsx b/app/common/renderer/components/SessionBuilder/AttachToSessionTab/AttachToSession.jsx
new file mode 100644
index 0000000000..8434f630cd
--- /dev/null
+++ b/app/common/renderer/components/SessionBuilder/AttachToSessionTab/AttachToSession.jsx
@@ -0,0 +1,43 @@
+import {Empty, Space, Spin} from 'antd';
+import {useTranslation} from 'react-i18next';
+
+import styles from './AttachToSession.module.css';
+import AttachToSessionInstructions from './AttachToSessionInstructions.jsx';
+import DiscoveredSessions from './DiscoveredSessions.jsx';
+import ManualIdInputAndRefreshBtn from './ManualIdInputAndRefreshBtn.jsx';
+
+/**
+ * The full Attach to Session tab.
+ */
+const AttachToSession = ({
+ serverType,
+ runningAppiumSessions,
+ gettingSessions,
+ getRunningSessions,
+ loadNewSession,
+}) => {
+ const {t} = useTranslation();
+
+ return (
+
+
+
+
+ {runningAppiumSessions.length !== 0 ? (
+
+ ) : (
+
+ )}
+
+
+ );
+};
+
+export default AttachToSession;
diff --git a/app/common/renderer/components/SessionBuilder/AttachToSessionTab/AttachToSession.module.css b/app/common/renderer/components/SessionBuilder/AttachToSessionTab/AttachToSession.module.css
new file mode 100644
index 0000000000..fa80b628d2
--- /dev/null
+++ b/app/common/renderer/components/SessionBuilder/AttachToSessionTab/AttachToSession.module.css
@@ -0,0 +1,4 @@
+.spaceContainer {
+ display: flex;
+ word-break: break-word;
+}
diff --git a/app/common/renderer/components/SessionBuilder/AttachToSessionTab/AttachToSessionInstructions.jsx b/app/common/renderer/components/SessionBuilder/AttachToSessionTab/AttachToSessionInstructions.jsx
new file mode 100644
index 0000000000..da7301bd8f
--- /dev/null
+++ b/app/common/renderer/components/SessionBuilder/AttachToSessionTab/AttachToSessionInstructions.jsx
@@ -0,0 +1,23 @@
+import {Card} from 'antd';
+import {useTranslation} from 'react-i18next';
+
+import builderStyles from '../SessionBuilder.module.css';
+
+/**
+ * Instructions describing the purpose and usage of the attach to session tab.
+ */
+const AttachToSessionInstructions = () => {
+ const {t} = useTranslation();
+
+ return (
+
+
+ {t('connectToExistingSessionInstructions')}
+
+ {t('selectSessionID')}
+
+
+ );
+};
+
+export default AttachToSessionInstructions;
diff --git a/app/common/renderer/components/SessionBuilder/AttachToSessionTab/DiscoveredSessionCard.jsx b/app/common/renderer/components/SessionBuilder/AttachToSessionTab/DiscoveredSessionCard.jsx
new file mode 100644
index 0000000000..f18a95bf2a
--- /dev/null
+++ b/app/common/renderer/components/SessionBuilder/AttachToSessionTab/DiscoveredSessionCard.jsx
@@ -0,0 +1,65 @@
+import {
+ IconApps,
+ IconClockHour4,
+ IconDeviceMobile,
+ IconDeviceMobileCog,
+ IconLinkPlus,
+ IconTag,
+} from '@tabler/icons-react';
+import {Button, Card, Col, Flex, Row, Space, Typography} from 'antd';
+import {useTranslation} from 'react-i18next';
+
+import {BUTTON} from '../../../constants/antd-types.js';
+import {getSessionInfo} from '../../../utils/attaching-to-session.js';
+import styles from './AttachToSession.module.css';
+
+const addIcon = (Icon, label) => (
+
+
+ {label}
+
+);
+
+/**
+ * Card for a single discovered session.
+ */
+const DiscoveredSessionCard = ({session, serverType, loadNewSession}) => {
+ const {t} = useTranslation();
+ const sessionDetails = getSessionInfo(session, serverType);
+
+ return (
+
+
+
+
+ {sessionDetails.id}
+
+ }
+ onClick={() => loadNewSession(null, sessionDetails.id)}
+ >
+ {t('Attach')}
+
+
+ {sessionDetails.sessionName && {addIcon(IconTag, sessionDetails.sessionName)}
}
+
+ {sessionDetails.deviceId && (
+ {addIcon(IconDeviceMobile, sessionDetails.deviceId)}
+ )}
+ {addIcon(IconDeviceMobileCog, sessionDetails.platformInfo)}
+
+ {sessionDetails.appId || sessionDetails.timestamp ? (
+
+ {sessionDetails.appId && {addIcon(IconApps, sessionDetails.appId)}}
+ {sessionDetails.timestamp && (
+ {addIcon(IconClockHour4, sessionDetails.timestamp)}
+ )}
+
+ ) : null}
+
+
+ );
+};
+
+export default DiscoveredSessionCard;
diff --git a/app/common/renderer/components/SessionBuilder/AttachToSessionTab/DiscoveredSessions.jsx b/app/common/renderer/components/SessionBuilder/AttachToSessionTab/DiscoveredSessions.jsx
new file mode 100644
index 0000000000..47ebebdfc7
--- /dev/null
+++ b/app/common/renderer/components/SessionBuilder/AttachToSessionTab/DiscoveredSessions.jsx
@@ -0,0 +1,27 @@
+import {Col, Row} from 'antd';
+
+import DiscoveredSessionCard from './DiscoveredSessionCard.jsx';
+
+/**
+ * Grid container for all discovered sessions.
+ */
+const DiscoveredSessions = ({runningAppiumSessions, serverType, loadNewSession}) => {
+ // list is reversed in order to place the most recent sessions at the top
+ const sortedRunningSessions = [...runningAppiumSessions].reverse();
+
+ return (
+
+ {sortedRunningSessions.map((session) => (
+
+
+
+ ))}
+
+ );
+};
+
+export default DiscoveredSessions;
diff --git a/app/common/renderer/components/SessionBuilder/AttachToSessionTab/ManualIdInputAndRefreshBtn.jsx b/app/common/renderer/components/SessionBuilder/AttachToSessionTab/ManualIdInputAndRefreshBtn.jsx
new file mode 100644
index 0000000000..2f702e17b5
--- /dev/null
+++ b/app/common/renderer/components/SessionBuilder/AttachToSessionTab/ManualIdInputAndRefreshBtn.jsx
@@ -0,0 +1,42 @@
+import {IconLinkPlus, IconRefresh} from '@tabler/icons-react';
+import {Button, Col, Input, Row, Space} from 'antd';
+import {useState} from 'react';
+import {useTranslation} from 'react-i18next';
+
+import {BUTTON} from '../../../constants/antd-types.js';
+
+/**
+ * Input field and button for manually entering a session ID to attach to,
+ * as well as a button to refresh the list of discovered sessions.
+ */
+const ManualIdInputAndRefreshBtn = ({loadNewSession, getRunningSessions}) => {
+ const {t} = useTranslation();
+ const [manualSessionId, setManualSessionId] = useState(null);
+
+ return (
+
+
+
+ setManualSessionId(e.target.value)}
+ />
+ loadNewSession(null, manualSessionId)}
+ icon={ }
+ >
+ {t('attachToSession')}
+
+
+
+ }>
+ {t('refreshDiscoveredSessions')}
+
+
+ );
+};
+
+export default ManualIdInputAndRefreshBtn;
diff --git a/app/common/renderer/components/SessionBuilder/CapabilityBuilderTab/CapabilityBuilderTab.module.css b/app/common/renderer/components/SessionBuilder/CapabilityBuilderTab/CapabilityBuilderTab.module.css
new file mode 100644
index 0000000000..d6507bd04e
--- /dev/null
+++ b/app/common/renderer/components/SessionBuilder/CapabilityBuilderTab/CapabilityBuilderTab.module.css
@@ -0,0 +1,21 @@
+.capsBoxFont {
+ font-family: monospace;
+}
+
+.newSessionForm {
+ overflow-y: auto;
+ overflow-x: hidden;
+ height: 100%;
+}
+
+.newSessionForm::-webkit-scrollbar {
+ width: 0px;
+}
+
+.newSessionForm :global(.ant-form-item) {
+ margin-bottom: 0.5em;
+}
+
+.addCapabilityButton {
+ float: right;
+}
diff --git a/app/common/renderer/components/SessionBuilder/CapabilityBuilderTab/CapabilityControl.jsx b/app/common/renderer/components/SessionBuilder/CapabilityBuilderTab/CapabilityControl.jsx
new file mode 100644
index 0000000000..32e459d3bf
--- /dev/null
+++ b/app/common/renderer/components/SessionBuilder/CapabilityBuilderTab/CapabilityControl.jsx
@@ -0,0 +1,72 @@
+import {Input, Switch} from 'antd';
+import {useTranslation} from 'react-i18next';
+
+import {INPUT} from '../../../constants/antd-types.js';
+import {CAPABILITY_TYPES} from '../../../constants/session-builder.js';
+import styles from './CapabilityBuilderTab.module.css';
+
+const CapabilityControl = ({cap, onSetCapabilityParam, onPressEnter, isEditingDesiredCaps, id}) => {
+ const {t} = useTranslation();
+
+ switch (cap.type) {
+ case CAPABILITY_TYPES.TEXT:
+ case CAPABILITY_TYPES.FILE:
+ return (
+ onSetCapabilityParam(e.target.value)}
+ onPressEnter={onPressEnter}
+ className={styles.capsBoxFont}
+ />
+ );
+ case CAPABILITY_TYPES.BOOL:
+ return (
+ onSetCapabilityParam(value)}
+ />
+ );
+ case CAPABILITY_TYPES.NUM:
+ return (
+
+ !isNaN(parseInt(e.target.value, 10))
+ ? onSetCapabilityParam(parseInt(e.target.value, 10))
+ : onSetCapabilityParam(undefined)
+ }
+ onPressEnter={onPressEnter}
+ className={styles.capsBoxFont}
+ />
+ );
+ case CAPABILITY_TYPES.OBJECT:
+ case CAPABILITY_TYPES.JSON_OBJECT:
+ return (
+ onSetCapabilityParam(e.target.value)}
+ className={styles.capsBoxFont}
+ />
+ );
+ default:
+ throw new Error(t('invalidCapType', {type: cap.type}));
+ }
+};
+
+export default CapabilityControl;
diff --git a/app/common/renderer/components/SessionBuilder/CapabilityBuilderTab/CapabilityEditor.jsx b/app/common/renderer/components/SessionBuilder/CapabilityBuilderTab/CapabilityEditor.jsx
new file mode 100644
index 0000000000..300ef69965
--- /dev/null
+++ b/app/common/renderer/components/SessionBuilder/CapabilityBuilderTab/CapabilityEditor.jsx
@@ -0,0 +1,221 @@
+import {IconPlus, IconTrash} from '@tabler/icons-react';
+import {
+ Button,
+ Checkbox,
+ Col,
+ Form,
+ Input,
+ Modal,
+ Row,
+ Select,
+ Space,
+ Splitter,
+ Tooltip,
+} from 'antd';
+import {useEffect, useRef} from 'react';
+import {useTranslation} from 'react-i18next';
+
+import {CAPABILITY_TYPES} from '../../../constants/session-builder.js';
+import CapabilityJSON from '../CapabilityJSON/CapabilityJSON.jsx';
+import builderStyles from '../SessionBuilder.module.css';
+import styles from './CapabilityBuilderTab.module.css';
+import CapabilityControl from './CapabilityControl.jsx';
+
+const whitespaces = /^\s|\s$/;
+
+const whitespaceMsg = (value, t) => {
+ const leadingSpace = /^\s/.test(value);
+ const trailingSpace = /\s$/.test(value);
+
+ if (leadingSpace || trailingSpace) {
+ return t('whitespaceDetected');
+ }
+};
+
+// Callback when the type of a capability is changed
+const handleSetType = (setCapabilityParam, cap, typeVal) => {
+ setCapabilityParam(cap.id, 'type', typeVal);
+
+ // Translate the current value to the new type
+ let translatedValue = cap.value;
+ switch (typeVal) {
+ case CAPABILITY_TYPES.BOOL:
+ if (translatedValue === 'true') {
+ translatedValue = true;
+ } else if (translatedValue === 'false') {
+ translatedValue = false;
+ } else {
+ translatedValue = !!translatedValue;
+ }
+ break;
+ case CAPABILITY_TYPES.NUM:
+ translatedValue = parseInt(translatedValue, 10) || 0;
+ break;
+ case CAPABILITY_TYPES.TEXT:
+ case CAPABILITY_TYPES.OBJECT:
+ translatedValue = translatedValue + '';
+ break;
+ default:
+ break;
+ }
+ setCapabilityParam(cap.id, 'value', translatedValue);
+};
+
+const CapabilityEditor = (props) => {
+ const {
+ setCapabilityParam,
+ caps,
+ addCapability,
+ removeCapability,
+ saveSession,
+ hideSaveAsModal,
+ saveAsText,
+ showSaveAsModal,
+ setSaveAsText,
+ isEditingDesiredCaps,
+ setAddVendorPrefixes,
+ addVendorPrefixes,
+ server,
+ serverType,
+ isDuplicateCapsName,
+ } = props;
+
+ const onSaveAsOk = () => saveSession({server, serverType, caps, name: saveAsText}, true);
+ const latestCapFieldRef = useRef(null);
+ const {t} = useTranslation();
+
+ // if we have more than one cap and the most recent cap name is empty,
+ // it means we've just added a new cap field, so focus that input element
+ useEffect(() => {
+ if (caps.length > 1 && latestCapFieldRef.current && !latestCapFieldRef.current.input.value) {
+ latestCapFieldRef.current.focus();
+ }
+ }, [caps.length, latestCapFieldRef]);
+
+ return (
+
+
+
+
+
+
+
+
+ {t('Name')}
+ setSaveAsText(e.target.value)}
+ value={saveAsText}
+ onPressEnter={onSaveAsOk}
+ status={isDuplicateCapsName ? 'error' : ''}
+ />
+
+ {isDuplicateCapsName && (
+ {t('duplicateCapabilityNameError')}
+ )}
+
+
+
+ );
+};
+
+export default CapabilityEditor;
diff --git a/app/common/renderer/components/SessionBuilder/CapabilityJSON/CapabilityJSON.jsx b/app/common/renderer/components/SessionBuilder/CapabilityJSON/CapabilityJSON.jsx
new file mode 100644
index 0000000000..d56811ad76
--- /dev/null
+++ b/app/common/renderer/components/SessionBuilder/CapabilityJSON/CapabilityJSON.jsx
@@ -0,0 +1,157 @@
+import {IconDeviceFloppy, IconEdit, IconX} from '@tabler/icons-react';
+import {Alert, Button, Card, Input, Row, Tooltip} from 'antd';
+import {useTranslation} from 'react-i18next';
+import {Refractor, registerLanguage} from 'react-refractor';
+import json from 'refractor/json';
+
+import {getCapsObject} from '../../../actions/SessionBuilder.js';
+import {ALERT} from '../../../constants/antd-types.js';
+import builderStyles from '../SessionBuilder.module.css';
+import styles from './CapabilityJSON.module.css';
+
+registerLanguage(json);
+
+const CapabilityJSON = (props) => {
+ const {
+ caps,
+ title,
+ desiredCapsName,
+ isEditingDesiredCapsName,
+ isEditingDesiredCaps,
+ startDesiredCapsEditor,
+ abortDesiredCapsEditor,
+ saveRawDesiredCaps,
+ setRawDesiredCaps,
+ rawDesiredCaps,
+ isValidCapsJson,
+ invalidCapsJsonReason,
+ isDuplicateCapsName,
+ } = props;
+
+ const {t} = useTranslation();
+
+ const getHighlightedCaps = (caps) => {
+ const formattedJson = JSON.stringify(getCapsObject(caps), null, 2);
+ return ;
+ };
+
+ const setCapsTitle = () => {
+ const {setDesiredCapsName, saveDesiredCapsName} = props;
+ if (!title) {
+ return t('JSON Representation');
+ } else if (!isEditingDesiredCapsName) {
+ return title;
+ } else {
+ return (
+
+ setDesiredCapsName(e.target.value)}
+ value={desiredCapsName}
+ className={styles.capsEditorTitleInput}
+ onPressEnter={saveDesiredCapsName}
+ status={isDuplicateCapsName ? 'error' : ''}
+ />
+ {isDuplicateCapsName && (
+ {t('duplicateCapabilityNameError')}
+ )}
+
+ );
+ }
+ };
+
+ const setCapsTitleButtons = () => {
+ const {startDesiredCapsNameEditor, abortDesiredCapsNameEditor, saveDesiredCapsName} = props;
+ if (!title) {
+ return null;
+ } else if (!isEditingDesiredCapsName) {
+ return (
+
+ }
+ className={styles.capsNameEditorButton}
+ />
+
+ );
+ } else {
+ return (
+ <>
+
+ }
+ className={styles.capsNameEditorButton}
+ />
+
+
+ }
+ className={styles.capsNameEditorButton}
+ />
+
+ >
+ );
+ }
+ };
+
+ return (
+ caps && (
+
+
+ {isEditingDesiredCaps && (
+
+ }
+ className={styles.capsEditorButton}
+ />
+
+ )}
+ {isEditingDesiredCaps && (
+
+ saveRawDesiredCaps(caps, rawDesiredCaps)}
+ icon={ }
+ className={styles.capsEditorButton}
+ />
+
+ )}
+ {!isEditingDesiredCaps && (
+
+ } />
+
+ )}
+
+ {isEditingDesiredCaps && (
+
+
setRawDesiredCaps(e.target.value)}
+ value={rawDesiredCaps}
+ className={`${styles.capsEditorBody} ${
+ isValidCapsJson ? styles.capsEditorBodyFull : styles.capsEditorBodyResized
+ }`}
+ />
+ {!isValidCapsJson && }
+
+ )}
+ {!isEditingDesiredCaps && (
+ {getHighlightedCaps(caps)}
+ )}
+
+ )
+ );
+};
+
+export default CapabilityJSON;
diff --git a/app/common/renderer/components/SessionBuilder/CapabilityJSON/CapabilityJSON.module.css b/app/common/renderer/components/SessionBuilder/CapabilityJSON/CapabilityJSON.module.css
new file mode 100644
index 0000000000..dcb4a96726
--- /dev/null
+++ b/app/common/renderer/components/SessionBuilder/CapabilityJSON/CapabilityJSON.module.css
@@ -0,0 +1,77 @@
+.capsEditorTitle {
+ width: 100%;
+ height: 24px;
+}
+
+.capsEditorTitleInput {
+ height: 24px;
+ padding: 0;
+ font-size: 14px;
+}
+
+.capsNameEditorButton {
+ margin: 0 6px 0 0;
+ padding: 0;
+}
+
+.formattedCaps {
+ height: 100%;
+}
+
+.formattedCapsBody {
+ padding-top: 24px;
+}
+
+.formattedCaps :global(.ant-card-head-title) {
+ padding-right: 6px;
+ height: 65px;
+ width: 100%;
+ display: flex;
+ align-items: center;
+}
+
+.formattedCaps :global(.ant-card-body) {
+ height: calc(100% - 66px);
+ padding: 0 14px 0 24px;
+ flex: 1;
+ overflow-y: auto;
+}
+
+.formattedCaps :global(.ant-card-extra) {
+ padding: 15px 0;
+}
+
+.capsEditorControls {
+ position: absolute;
+ right: 0;
+ padding: 28px;
+ z-index: 1;
+}
+
+.capsEditorButton {
+ margin: 0 0 0 4px;
+}
+
+.capsEditor {
+ width: 100%;
+ height: 100%;
+ padding: 24px 0;
+}
+
+.capsEditorBody {
+ width: 100%;
+ padding: 0;
+ margin: -1px;
+ resize: none !important;
+ font-family: SFMono-Regular, Consolas, 'Liberation Mono', Menlo, Courier, monospace;
+ font-size: 1em;
+}
+
+.capsEditorBodyFull {
+ height: 100% !important;
+}
+
+.capsEditorBodyResized {
+ height: calc(100% - 44px) !important;
+ margin-bottom: 6px;
+}
diff --git a/app/common/renderer/components/SessionBuilder/SavedCapabilitySetsTab/SavedCapabilitySets.jsx b/app/common/renderer/components/SessionBuilder/SavedCapabilitySetsTab/SavedCapabilitySets.jsx
new file mode 100644
index 0000000000..fa0f13da0a
--- /dev/null
+++ b/app/common/renderer/components/SessionBuilder/SavedCapabilitySetsTab/SavedCapabilitySets.jsx
@@ -0,0 +1,181 @@
+import {IconEdit, IconFileExport, IconTrash} from '@tabler/icons-react';
+import {Button, Card, Popconfirm, Space, Spin, Splitter, Table, Tooltip} from 'antd';
+import dayjs from 'dayjs';
+import {useTranslation} from 'react-i18next';
+
+import {
+ SAVED_SESSIONS_TABLE_VALUES,
+ SESSION_BUILDER_TABS,
+ SESSION_FILE_EXTENSION,
+} from '../../../constants/session-builder.js';
+import FileUploader from '../../FileUploader.jsx';
+import CapabilityJSON from '../CapabilityJSON/CapabilityJSON.jsx';
+import styles from './SavedCapabilitySets.module.css';
+
+const dataSource = (savedSessions, t) => {
+ if (!savedSessions) {
+ return [];
+ }
+ return savedSessions.map((session) => ({
+ key: session.uuid,
+ name: session.name || t('unnamed'),
+ date: dayjs(session.date).format('YYYY-MM-DD'),
+ }));
+};
+
+const getSessionById = (savedSessions, id, t) => {
+ for (let session of savedSessions) {
+ if (session.uuid === id) {
+ return session;
+ }
+ }
+ throw new Error(t('couldNotFindEntryWithId', {id}));
+};
+
+const SavedCapabilitySets = (props) => {
+ const {
+ savedSessions,
+ exportSavedSession,
+ deleteSavedSession,
+ capsUUID,
+ switchTabs,
+ importSessionFiles,
+ isUploadingSessionFiles,
+ } = props;
+
+ const {t} = useTranslation();
+
+ const handleCapsAndServer = (uuid) => {
+ const {
+ setCapsAndServer,
+ server,
+ serverType,
+ isEditingDesiredCapsName,
+ abortDesiredCapsNameEditor,
+ isEditingDesiredCaps,
+ abortDesiredCapsEditor,
+ } = props;
+ const session = getSessionById(savedSessions, uuid, t);
+
+ // Disable any editors before changing the selected caps
+ if (isEditingDesiredCapsName) {
+ abortDesiredCapsNameEditor();
+ }
+ if (isEditingDesiredCaps) {
+ abortDesiredCapsEditor();
+ }
+
+ // In case user has CAPS saved from older version of Inspector which
+ // doesn't contain server and serverType within the session object
+ setCapsAndServer(
+ session.server || server,
+ session.serverType || serverType,
+ session.caps,
+ session.uuid,
+ session.name,
+ );
+ };
+
+ const findAndExportSavedSession = (uuid) => {
+ const session = getSessionById(savedSessions, uuid, t);
+ exportSavedSession(session);
+ };
+
+ const columns = [
+ {
+ title: t('Name'),
+ dataIndex: 'name',
+ key: 'name',
+ },
+ {
+ title: t('Created'),
+ dataIndex: 'date',
+ key: 'date',
+ width: SAVED_SESSIONS_TABLE_VALUES.DATE_COLUMN_WIDTH,
+ },
+ {
+ title: t('Actions'),
+ key: 'action',
+ width: SAVED_SESSIONS_TABLE_VALUES.ACTIONS_COLUMN_WIDTH,
+ render: (_, record) => (
+
+
+ }
+ onClick={() => {
+ handleCapsAndServer(record.key);
+ switchTabs(SESSION_BUILDER_TABS.CAPS_BUILDER);
+ }}
+ />
+
+
+ }
+ onClick={() => findAndExportSavedSession(record.key)}
+ />
+
+
+ deleteSavedSession(record.key)}
+ >
+ } />
+
+
+
+ ),
+ },
+ ];
+
+ return (
+
+
+
+
+ ({onClick: () => handleCapsAndServer(row.key)})}
+ rowSelection={{
+ selectedRowKeys: [capsUUID],
+ hideSelectAll: true,
+ columnWidth: 0,
+ renderCell: () => null,
+ }}
+ scroll={{y: 'calc(100% - 37px)'}}
+ footer={() => (
+
+ )}
+ />
+
+
+
+
+
+
+
+ );
+};
+
+export default SavedCapabilitySets;
diff --git a/app/common/renderer/components/SessionBuilder/SavedCapabilitySetsTab/SavedCapabilitySets.module.css b/app/common/renderer/components/SessionBuilder/SavedCapabilitySetsTab/SavedCapabilitySets.module.css
new file mode 100644
index 0000000000..4b126e6653
--- /dev/null
+++ b/app/common/renderer/components/SessionBuilder/SavedCapabilitySetsTab/SavedCapabilitySets.module.css
@@ -0,0 +1,7 @@
+.capabilitySetsTable :global(.ant-table) {
+ height: 100%;
+}
+
+.capabilitySetsTable :global(.ant-table-sticky-holder) {
+ z-index: 2 !important;
+}
diff --git a/app/common/renderer/components/SessionBuilder/ServerDetails/AdvancedServerParams.jsx b/app/common/renderer/components/SessionBuilder/ServerDetails/AdvancedServerParams.jsx
new file mode 100644
index 0000000000..8e010e6dcb
--- /dev/null
+++ b/app/common/renderer/components/SessionBuilder/ServerDetails/AdvancedServerParams.jsx
@@ -0,0 +1,80 @@
+import {Checkbox, Col, Collapse, Form, Input, Row} from 'antd';
+import {useTranslation} from 'react-i18next';
+
+import {SERVER_ADVANCED_PARAMS, SERVER_TYPES} from '../../../constants/session-builder.js';
+import styles from './ServerDetails.module.css';
+
+const AdvancedServerParams = ({server, setServerParam, serverType}) => {
+ const {t} = useTranslation();
+ return (
+
+
+
+
+ {serverType !== SERVER_TYPES.TESTMUAI && (
+
+
+
+ setServerParam(
+ SERVER_ADVANCED_PARAMS.ALLOW_UNAUTHORIZED,
+ e.target.checked,
+ SERVER_TYPES.ADVANCED,
+ )
+ }
+ >
+ {t('allowUnauthorizedCerts')}
+
+
+
+ )}
+
+
+
+ setServerParam(
+ SERVER_ADVANCED_PARAMS.USE_PROXY,
+ e.target.checked,
+ SERVER_TYPES.ADVANCED,
+ )
+ }
+ >
+ {t('Use Proxy')}
+
+
+
+
+
+
+ setServerParam(
+ SERVER_ADVANCED_PARAMS.PROXY,
+ e.target.value,
+ SERVER_TYPES.ADVANCED,
+ )
+ }
+ placeholder={t('Proxy URL')}
+ value={server.advanced.proxy}
+ />
+
+
+
+ ),
+ },
+ ]}
+ />
+
+
+
+ );
+};
+
+export default AdvancedServerParams;
diff --git a/app/renderer/components/Session/CloudProviderSelector.js b/app/common/renderer/components/SessionBuilder/ServerDetails/CloudProviderSelector.jsx
similarity index 84%
rename from app/renderer/components/Session/CloudProviderSelector.js
rename to app/common/renderer/components/SessionBuilder/ServerDetails/CloudProviderSelector.jsx
index d87f81934a..5765b8756f 100644
--- a/app/renderer/components/Session/CloudProviderSelector.js
+++ b/app/common/renderer/components/SessionBuilder/ServerDetails/CloudProviderSelector.jsx
@@ -1,13 +1,14 @@
import {Button, Col, Modal, Row} from 'antd';
import _ from 'lodash';
-import React from 'react';
+import {useTranslation} from 'react-i18next';
-import {BUTTON} from '../AntdTypes';
-import CloudProviders from './CloudProviders';
-import SessionStyles from './Session.css';
+import {BUTTON} from '../../../constants/antd-types.js';
+import CloudProviders from './CloudProviders.jsx';
+import styles from './ServerDetails.module.css';
const CloudProviderSelector = (props) => {
- const {visibleProviders = [], isAddingCloudProvider, stopAddCloudProvider, t} = props;
+ const {visibleProviders = [], isAddingCloudProvider, stopAddCloudProvider} = props;
+ const {t} = useTranslation();
const footer = (
@@ -28,7 +29,7 @@ const CloudProviderSelector = (props) => {
return (
{
style={style}
onClick={() => toggleVisibleProvider(providerName)}
>
-
+ {provider.logo}
)
diff --git a/app/common/renderer/components/SessionBuilder/ServerDetails/CloudProviders.jsx b/app/common/renderer/components/SessionBuilder/ServerDetails/CloudProviders.jsx
new file mode 100644
index 0000000000..048631c3d4
--- /dev/null
+++ b/app/common/renderer/components/SessionBuilder/ServerDetails/CloudProviders.jsx
@@ -0,0 +1,217 @@
+import BitBarLogo from '../../../assets/images/bitbar_logo.svg';
+import BrowserStackLogo from '../../../assets/images/browserstack_logo.svg';
+import BrowserStackLogoDark from '../../../assets/images/browserstack_logo_dark.svg';
+import ExperitestLogo from '../../../assets/images/experitest_logo.svg';
+import FireflinkDeviceFarmLogo from '../../../assets/images/fireflink_devicefarm_logo.svg';
+import FireflinkDeviceFarmLogoDark from '../../../assets/images/fireflink_devicefarm_logo_dark.svg';
+import HeadSpinLogo from '../../../assets/images/headspin_logo.svg';
+import KobitonLogo from '../../../assets/images/kobiton_logo.svg';
+import KobitonLogoDark from '../../../assets/images/kobiton_logo_dark.svg';
+import MobitruLogo from '../../../assets/images/mobitru_logo.svg';
+import PcloudyLogo from '../../../assets/images/pcloudy_logo.svg';
+import PcloudyLogoDark from '../../../assets/images/pcloudy_logo_dark.svg';
+import PerfectoLogo from '../../../assets/images/perfecto_logo.svg';
+import RabbitQALogo from '../../../assets/images/rabbitqa_logo.svg';
+import RabbitQALogoDark from '../../../assets/images/rabbitqa_logo_dark.svg';
+import RemoteTestKitLogo from '../../../assets/images/remotetestkit_logo.svg';
+import RobotActionsLogo from '../../../assets/images/robotactions_logo.svg';
+import RobotActionsLogoDark from '../../../assets/images/robotactions_logo_dark.svg';
+import RobotQALogo from '../../../assets/images/robotqa_logo.svg';
+import RobotQALogoDark from '../../../assets/images/robotqa_logo_dark.svg';
+import SauceLogo from '../../../assets/images/sauce_logo.svg';
+import SauceLogoDark from '../../../assets/images/sauce_logo_dark.svg';
+import TestcribeLogo from '../../../assets/images/testcribe_logo.svg';
+import TestcribeLogoDark from '../../../assets/images/testcribe_logo_dark.svg';
+import TestingBotLogo from '../../../assets/images/testingbot_logo.svg';
+import TestingBotLogoDark from '../../../assets/images/testingbot_logo_dark.svg';
+import TestMuAILogo from '../../../assets/images/testmuai_logo.svg';
+import TestMuAILogoDark from '../../../assets/images/testmuai_logo_dark.svg';
+import TVLabsLogo from '../../../assets/images/tvlabs_logo.svg';
+import TVLabsLogoDark from '../../../assets/images/tvlabs_logo_dark.svg';
+import WebmateLogo from '../../../assets/images/webmate_logo.svg';
+import WebmateLogoDark from '../../../assets/images/webmate_logo_dark.svg';
+import {SERVER_TYPES} from '../../../constants/session-builder.js';
+import {useTheme} from '../../../hooks/use-theme.jsx';
+import styles from './ServerDetails.module.css';
+import ServerTabBitbar from './ServerTabBitbar.jsx';
+import ServerTabBrowserstack from './ServerTabBrowserstack.jsx';
+import ServerTabExperitest from './ServerTabExperitest.jsx';
+import ServerTabFireflinkDeviceFarm from './ServerTabFireflinkDeviceFarm.jsx';
+import ServerTabHeadspin from './ServerTabHeadspin.jsx';
+import ServerTabKobiton from './ServerTabKobiton.jsx';
+import ServerTabMobitru from './ServerTabMobitru.jsx';
+import ServerTabPcloudy from './ServerTabPcloudy.jsx';
+import ServerTabPerfecto from './ServerTabPerfecto.jsx';
+import ServerTabRabbitQA from './ServerTabRabbitqa.jsx';
+import ServerTabRemoteTestKit from './ServerTabRemoteTestKit.jsx';
+import ServerTabRobotActions from './ServerTabRobotActions.jsx';
+import ServerTabRobotQA from './ServerTabRobotQA.jsx';
+import ServerTabSauce from './ServerTabSauce.jsx';
+import ServerTabTestcribe from './ServerTabTestcribe.jsx';
+import ServerTabTestingbot from './ServerTabTestingbot.jsx';
+import ServerTabTestMuAI from './ServerTabTestMuAI.jsx';
+import ServerTabTVLabs from './ServerTabTVLabs.jsx';
+import ServerTabWebmate from './ServerTabWebmate.jsx';
+
+const providers = {
+ [SERVER_TYPES.SAUCE]: {
+ tab: ServerTabSauce,
+ logos: {
+ light: SauceLogo,
+ dark: SauceLogoDark,
+ },
+ },
+ [SERVER_TYPES.HEADSPIN]: {
+ tab: ServerTabHeadspin,
+ logos: {
+ light: HeadSpinLogo,
+ dark: null,
+ },
+ },
+ [SERVER_TYPES.BROWSERSTACK]: {
+ tab: ServerTabBrowserstack,
+ logos: {
+ light: BrowserStackLogo,
+ dark: BrowserStackLogoDark,
+ },
+ },
+ [SERVER_TYPES.TESTMUAI]: {
+ tab: ServerTabTestMuAI,
+ logos: {
+ light: TestMuAILogo,
+ dark: TestMuAILogoDark,
+ },
+ },
+ [SERVER_TYPES.TESTINGBOT]: {
+ tab: ServerTabTestingbot,
+ logos: {
+ light: TestingBotLogo,
+ dark: TestingBotLogoDark,
+ },
+ },
+ [SERVER_TYPES.EXPERITEST]: {
+ tab: ServerTabExperitest,
+ logos: {
+ light: ExperitestLogo,
+ dark: null,
+ },
+ },
+ [SERVER_TYPES.ROBOTQA]: {
+ tab: ServerTabRobotQA,
+ logos: {
+ light: RobotQALogo,
+ dark: RobotQALogoDark,
+ },
+ },
+ [SERVER_TYPES.REMOTETESTKIT]: {
+ tab: ServerTabRemoteTestKit,
+ logos: {
+ light: RemoteTestKitLogo,
+ dark: null,
+ },
+ },
+ [SERVER_TYPES.BITBAR]: {
+ tab: ServerTabBitbar,
+ logos: {
+ light: BitBarLogo,
+ dark: null,
+ },
+ },
+ [SERVER_TYPES.KOBITON]: {
+ tab: ServerTabKobiton,
+ logos: {
+ light: KobitonLogo,
+ dark: KobitonLogoDark,
+ },
+ },
+ [SERVER_TYPES.PERFECTO]: {
+ tab: ServerTabPerfecto,
+ logos: {
+ light: PerfectoLogo,
+ dark: null,
+ },
+ },
+ [SERVER_TYPES.PCLOUDY]: {
+ tab: ServerTabPcloudy,
+ logos: {
+ light: PcloudyLogo,
+ dark: PcloudyLogoDark,
+ },
+ },
+ [SERVER_TYPES.MOBITRU]: {
+ tab: ServerTabMobitru,
+ logos: {
+ light: MobitruLogo,
+ dark: null,
+ },
+ },
+ [SERVER_TYPES.TVLABS]: {
+ tab: ServerTabTVLabs,
+ logos: {
+ light: TVLabsLogo,
+ dark: TVLabsLogoDark,
+ },
+ },
+ [SERVER_TYPES.TESTCRIBE]: {
+ tab: ServerTabTestcribe,
+ logos: {
+ light: TestcribeLogo,
+ dark: TestcribeLogoDark,
+ },
+ },
+ [SERVER_TYPES.WEBMATE]: {
+ tab: ServerTabWebmate,
+ logos: {
+ light: WebmateLogo,
+ dark: WebmateLogoDark,
+ },
+ },
+ [SERVER_TYPES.FIREFLINKDEVICEFARM]: {
+ tab: ServerTabFireflinkDeviceFarm,
+ logos: {
+ light: FireflinkDeviceFarmLogo,
+ dark: FireflinkDeviceFarmLogoDark,
+ },
+ },
+ [SERVER_TYPES.RABBITQA]: {
+ tab: ServerTabRabbitQA,
+ logos: {
+ light: RabbitQALogo,
+ dark: RabbitQALogoDark,
+ },
+ },
+ [SERVER_TYPES.ROBOTACTIONS]: {
+ tab: ServerTabRobotActions,
+ logos: {
+ light: RobotActionsLogo,
+ dark: RobotActionsLogoDark,
+ },
+ },
+};
+
+const ProviderLogo = ({serverType}) => {
+ const {isDarkTheme} = useTheme();
+ const {logos} = providers[serverType];
+
+ if (!logos) {
+ return null;
+ }
+
+ const logo = isDarkTheme && logos.dark ? logos.dark : logos.light;
+
+ return ;
+};
+
+const CloudProviders = Object.entries(providers).reduce((acc, [serverType, provider]) => {
+ const logo = ;
+
+ acc[serverType] = {
+ tabhead: () => {logo} ,
+ tab: (props) => ,
+ logo,
+ };
+
+ return acc;
+}, {});
+
+export default CloudProviders;
diff --git a/app/common/renderer/components/SessionBuilder/ServerDetails/ServerDetails.module.css b/app/common/renderer/components/SessionBuilder/ServerDetails/ServerDetails.module.css
new file mode 100644
index 0000000000..1beb59e1ba
--- /dev/null
+++ b/app/common/renderer/components/SessionBuilder/ServerDetails/ServerDetails.module.css
@@ -0,0 +1,44 @@
+.advancedSettingsContainerCol {
+ width: 100%;
+}
+
+.advancedSettingsContainer :global(.ant-form-item) {
+ margin: 0;
+}
+
+.tabText img {
+ height: 20px;
+ filter: grayscale(100%);
+}
+
+:global(.ant-tabs-tab-active) .tabText img {
+ filter: none;
+}
+
+.cloudProviderModal {
+ min-width: 600px;
+ max-width: 100%;
+}
+
+.cloudProviderModal :global(.ant-row) {
+ margin-bottom: 16px;
+}
+
+.cloudProviderModal :global(.ant-modal-body button) {
+ width: 100%;
+ padding: 4px;
+}
+
+.cloudProviderModal :global(.ant-modal-body button img) {
+ height: 100%;
+}
+
+.addonDataCenterRadioContainer {
+ padding-left: 8px;
+ min-height: 32px;
+}
+
+.addonCheckbox {
+ align-items: center;
+ min-height: 32px;
+}
diff --git a/app/renderer/components/Session/ServerTabBitbar.js b/app/common/renderer/components/SessionBuilder/ServerDetails/ServerTabBitbar.jsx
similarity index 59%
rename from app/renderer/components/Session/ServerTabBitbar.js
rename to app/common/renderer/components/SessionBuilder/ServerDetails/ServerTabBitbar.jsx
index ca76bf072d..65e5803edf 100644
--- a/app/renderer/components/Session/ServerTabBitbar.js
+++ b/app/common/renderer/components/SessionBuilder/ServerDetails/ServerTabBitbar.jsx
@@ -1,7 +1,7 @@
-import {Col, Form, Input, Row} from 'antd';
-import React from 'react';
+import {Col, Input, Row, Space} from 'antd';
+import {useTranslation} from 'react-i18next';
-import {INPUT} from '../AntdTypes';
+import {INPUT} from '../../../constants/antd-types.js';
const bitbarApiKeyPlaceholder = (t) => {
if (process.env.BITBAR_API_KEY) {
@@ -10,23 +10,24 @@ const bitbarApiKeyPlaceholder = (t) => {
return t('yourApiKey');
};
-const ServerTabBitbar = ({server, setServerParam, t}) => (
-
-);
+ );
+};
export default ServerTabBitbar;
diff --git a/app/renderer/components/Session/ServerTabBrowserstack.js b/app/common/renderer/components/SessionBuilder/ServerDetails/ServerTabBrowserstack.jsx
similarity index 68%
rename from app/renderer/components/Session/ServerTabBrowserstack.js
rename to app/common/renderer/components/SessionBuilder/ServerDetails/ServerTabBrowserstack.jsx
index 866640a057..c9cf5d19e3 100644
--- a/app/renderer/components/Session/ServerTabBrowserstack.js
+++ b/app/common/renderer/components/SessionBuilder/ServerDetails/ServerTabBrowserstack.jsx
@@ -1,7 +1,7 @@
-import {Col, Form, Input, Row} from 'antd';
-import React from 'react';
+import {Col, Input, Row, Space} from 'antd';
+import {useTranslation} from 'react-i18next';
-import {INPUT} from '../AntdTypes';
+import {INPUT} from '../../../constants/antd-types.js';
const browserstackUsernamePlaceholder = (t) => {
if (process.env.BROWSERSTACK_USERNAME) {
@@ -17,34 +17,35 @@ const browserstackAccessKeyPlaceholder = (t) => {
return t('yourAccessKey');
};
-const ServerTabBrowserstack = ({server, setServerParam, t}) => (
-
-);
+ );
+};
export default ServerTabBrowserstack;
diff --git a/app/common/renderer/components/SessionBuilder/ServerDetails/ServerTabCustom.jsx b/app/common/renderer/components/SessionBuilder/ServerDetails/ServerTabCustom.jsx
new file mode 100644
index 0000000000..aed35c10f0
--- /dev/null
+++ b/app/common/renderer/components/SessionBuilder/ServerDetails/ServerTabCustom.jsx
@@ -0,0 +1,59 @@
+import {Checkbox, Col, Input, Row, Space} from 'antd';
+import {useTranslation} from 'react-i18next';
+
+import {DEFAULT_SERVER_PROPS} from '../../../constants/webdriver.js';
+import styles from './ServerDetails.module.css';
+
+const ServerTabCustom = ({server, setServerParam}) => {
+ const {t} = useTranslation();
+ return (
+
+
+
+ {t('Remote Host')}
+ setServerParam('hostname', e.target.value)}
+ />
+
+
+
+
+ {t('Remote Port')}
+ setServerParam('port', e.target.value)}
+ />
+
+
+
+
+ {t('Remote Path')}
+ setServerParam('path', e.target.value)}
+ />
+
+
+
+
+
+
+ );
+};
+
+export default ServerTabCustom;
diff --git a/app/common/renderer/components/SessionBuilder/ServerDetails/ServerTabExperitest.jsx b/app/common/renderer/components/SessionBuilder/ServerDetails/ServerTabExperitest.jsx
new file mode 100644
index 0000000000..ebdd4597d5
--- /dev/null
+++ b/app/common/renderer/components/SessionBuilder/ServerDetails/ServerTabExperitest.jsx
@@ -0,0 +1,36 @@
+import {Col, Input, Row, Space} from 'antd';
+import {useTranslation} from 'react-i18next';
+
+import {PROVIDER_VALUES} from '../../../constants/session-builder.js';
+
+const ServerTabExperitest = ({server, setServerParam}) => {
+ const {t} = useTranslation();
+ return (
+
+
+
+ {t('experitestUrl')}
+ setServerParam('url', evt.target.value)}
+ />
+
+
+
+
+ {t('experitestAccessKey')}
+ setServerParam('accessKey', evt.target.value)}
+ />
+
+
+
+ );
+};
+
+export default ServerTabExperitest;
diff --git a/app/common/renderer/components/SessionBuilder/ServerDetails/ServerTabFireflinkDeviceFarm.jsx b/app/common/renderer/components/SessionBuilder/ServerDetails/ServerTabFireflinkDeviceFarm.jsx
new file mode 100644
index 0000000000..777f316a59
--- /dev/null
+++ b/app/common/renderer/components/SessionBuilder/ServerDetails/ServerTabFireflinkDeviceFarm.jsx
@@ -0,0 +1,90 @@
+import {Col, Flex, Input, Row, Space} from 'antd';
+import {useTranslation} from 'react-i18next';
+
+import {INPUT} from '../../../constants/antd-types.js';
+
+const fireflinkDeviceFarmDomainPlaceholder = (t) => {
+ if (process.env.FIREFLINKDEVICEFARM_DOMAIN) {
+ return t('usingDataFoundIn', {environmentVariable: 'FIREFLINKDEVICEFARM_DOMAIN'});
+ }
+ return t('yourFireflinkDevicefarmDomain');
+};
+const fireflinkDeviceFarmAccessKeyPlaceholder = (t) => {
+ if (process.env.FIREFLINKDEVICEFARM_ACCESS_KEY) {
+ return t('usingDataFoundIn', {environmentVariable: 'FIREFLINKDEVICEFARM_ACCESS_KEY'});
+ }
+ return t('yourAccessKey');
+};
+
+const fireflinkDeviceFarmLicenseIdPlaceholder = (t) => {
+ if (process.env.FIREFLINKDEVICEFARM_LICENSE_ID) {
+ return t('usingDataFoundIn', {environmentVariable: 'FIREFLINKDEVICEFARM_LICENSE_ID'});
+ }
+ return t('yourLicenseId');
+};
+
+const fireflinkDeviceFarmprojectNamePlaceholder = (t) => {
+ if (process.env.FIREFLINKDEVICEFARM_PROJECT_ID) {
+ return t('usingDataFoundIn', {environmentVariable: 'FIREFLINKDEVICEFARM_PROJECT_ID'});
+ }
+ return t('yourProjectName');
+};
+
+const ServerTabFireflinkDeviceFarm = ({server, setServerParam}) => {
+ const {t} = useTranslation();
+ return (
+
+
+
+
+ {t('Fireflink DeviceFarm Domain')}
+ setServerParam('host', e.target.value)}
+ />
+
+
+
+
+ {t('Fireflink DeviceFarm Access Key')}
+ setServerParam('accessKey', e.target.value)}
+ />
+
+
+
+
+
+
+ {t('Fireflink DeviceFarm License ID')}
+ setServerParam('licenseId', e.target.value)}
+ />
+
+
+
+
+ {t('Fireflink DeviceFarm Project Name')}
+ setServerParam('projectName', e.target.value)}
+ />
+
+
+
+
+ );
+};
+
+export default ServerTabFireflinkDeviceFarm;
diff --git a/app/common/renderer/components/SessionBuilder/ServerDetails/ServerTabHeadspin.jsx b/app/common/renderer/components/SessionBuilder/ServerDetails/ServerTabHeadspin.jsx
new file mode 100644
index 0000000000..6342f693f7
--- /dev/null
+++ b/app/common/renderer/components/SessionBuilder/ServerDetails/ServerTabHeadspin.jsx
@@ -0,0 +1,27 @@
+import {Col, Input, Row, Space} from 'antd';
+import {useTranslation} from 'react-i18next';
+
+import {PROVIDER_VALUES} from '../../../constants/session-builder.js';
+import builderStyles from '../SessionBuilder.module.css';
+
+const ServerTabHeadspin = ({server, setServerParam}) => {
+ const {t} = useTranslation();
+ return (
+
+
+
+ {t('serverTabHeasdpinWebDriverURL')}
+ setServerParam('webDriverUrl', e.target.value)}
+ />
+
+ {t('sessionHeadspinWebDriverURLDescription')}
+
+
+ );
+};
+
+export default ServerTabHeadspin;
diff --git a/app/renderer/components/Session/ServerTabKobiton.js b/app/common/renderer/components/SessionBuilder/ServerDetails/ServerTabKobiton.jsx
similarity index 67%
rename from app/renderer/components/Session/ServerTabKobiton.js
rename to app/common/renderer/components/SessionBuilder/ServerDetails/ServerTabKobiton.jsx
index c4ae28d90b..648a35f708 100644
--- a/app/renderer/components/Session/ServerTabKobiton.js
+++ b/app/common/renderer/components/SessionBuilder/ServerDetails/ServerTabKobiton.jsx
@@ -1,7 +1,7 @@
-import {Col, Form, Input, Row} from 'antd';
-import React from 'react';
+import {Col, Input, Row, Space} from 'antd';
+import {useTranslation} from 'react-i18next';
-import {INPUT} from '../AntdTypes';
+import {INPUT} from '../../../constants/antd-types.js';
const kobitonUsernamePlaceholder = (t) => {
if (process.env.KOBITON_USERNAME) {
@@ -17,34 +17,35 @@ const kobitonAccessKeyPlaceholder = (t) => {
return t('yourAccessKey');
};
-const ServerTabKobiton = ({server, setServerParam, t}) => (
-
-);
+ );
+};
export default ServerTabKobiton;
diff --git a/app/common/renderer/components/SessionBuilder/ServerDetails/ServerTabMobitru.jsx b/app/common/renderer/components/SessionBuilder/ServerDetails/ServerTabMobitru.jsx
new file mode 100644
index 0000000000..dc5c56d69a
--- /dev/null
+++ b/app/common/renderer/components/SessionBuilder/ServerDetails/ServerTabMobitru.jsx
@@ -0,0 +1,73 @@
+import {Col, Flex, Input, Row, Space} from 'antd';
+import {useTranslation} from 'react-i18next';
+
+import {INPUT} from '../../../constants/antd-types.js';
+
+const mobitrWebDriverUrlPlaceholder = (t) => {
+ if (process.env.MOBITRU_WEBDRIVER_URL) {
+ return t('usingDataFoundIn', {environmentVariable: 'MOBITRU_WEBDRIVER_URL'});
+ }
+ return 'https://app.mobitru.com/wd/hub';
+};
+
+const mobitruBillingUnitPlaceholder = (t) => {
+ if (process.env.MOBITRU_BILLING_UNIT) {
+ return t('usingDataFoundIn', {environmentVariable: 'MOBITRU_BILLING_UNIT'});
+ }
+ return 'personal';
+};
+
+const mobitruAccessKeyPlaceholder = (t) => {
+ if (process.env.MOBITRU_ACCESS_KEY) {
+ return t('usingDataFoundIn', {environmentVariable: 'MOBITRU_ACCESS_KEY'});
+ }
+ return t('yourAccessKey');
+};
+
+const ServerTabMobitru = ({server, setServerParam}) => {
+ const {t} = useTranslation();
+ return (
+
+
+
+
+ {t('Mobitru WebDriver URL')}
+ setServerParam('webDriverUrl', e.target.value)}
+ />
+
+
+
+
+
+
+ {t('Mobitru Billing Unit')}
+ setServerParam('username', e.target.value)}
+ />
+
+
+
+
+ {t('Mobitru Access Key')}
+ setServerParam('accessKey', e.target.value)}
+ />
+
+
+
+
+ );
+};
+
+export default ServerTabMobitru;
diff --git a/app/common/renderer/components/SessionBuilder/ServerDetails/ServerTabPcloudy.jsx b/app/common/renderer/components/SessionBuilder/ServerDetails/ServerTabPcloudy.jsx
new file mode 100644
index 0000000000..bd48bfa746
--- /dev/null
+++ b/app/common/renderer/components/SessionBuilder/ServerDetails/ServerTabPcloudy.jsx
@@ -0,0 +1,50 @@
+import {Col, Input, Row, Space} from 'antd';
+import {useTranslation} from 'react-i18next';
+
+import {INPUT} from '../../../constants/antd-types.js';
+import {PROVIDER_VALUES} from '../../../constants/session-builder.js';
+
+const ServerTabPcloudy = ({server, setServerParam}) => {
+ const {t} = useTranslation();
+ return (
+
+
+
+ {t('Pcloudy Host')}
+ setServerParam('hostname', e.target.value)}
+ />
+
+
+
+
+ {t('Pcloudy User Name')}
+ setServerParam('username', e.target.value)}
+ />
+
+
+
+
+ {t('Pcloudy API Key')}
+ setServerParam('accessKey', e.target.value)}
+ />
+
+
+
+ );
+};
+
+export default ServerTabPcloudy;
diff --git a/app/renderer/components/Session/ServerTabPerfecto.js b/app/common/renderer/components/SessionBuilder/ServerDetails/ServerTabPerfecto.jsx
similarity index 53%
rename from app/renderer/components/Session/ServerTabPerfecto.js
rename to app/common/renderer/components/SessionBuilder/ServerDetails/ServerTabPerfecto.jsx
index eaad62c724..fe46a8df88 100644
--- a/app/renderer/components/Session/ServerTabPerfecto.js
+++ b/app/common/renderer/components/SessionBuilder/ServerDetails/ServerTabPerfecto.jsx
@@ -1,9 +1,8 @@
-import {Checkbox, Col, Form, Input, Row} from 'antd';
-import React from 'react';
+import {Checkbox, Col, Input, Row, Space} from 'antd';
+import {useTranslation} from 'react-i18next';
-import SessionStyles from './Session.css';
-
-const cloudPerfectoUrl = 'cloud.Perfectomobile.com';
+import {PROVIDER_VALUES} from '../../../constants/session-builder.js';
+import styles from './ServerDetails.module.css';
const portPlaceholder = (server) => (server.perfecto.ssl ? '443' : '80');
@@ -14,55 +13,54 @@ const perfectoTokenPlaceholder = (t) => {
return t('Add your token');
};
-const ServerTabPerfecto = ({server, setServerParam, t}) => (
-
-);
+ );
+};
export default ServerTabPerfecto;
diff --git a/app/common/renderer/components/SessionBuilder/ServerDetails/ServerTabRabbitqa.jsx b/app/common/renderer/components/SessionBuilder/ServerDetails/ServerTabRabbitqa.jsx
new file mode 100644
index 0000000000..97fed82acc
--- /dev/null
+++ b/app/common/renderer/components/SessionBuilder/ServerDetails/ServerTabRabbitqa.jsx
@@ -0,0 +1,27 @@
+import {Col, Input, Row, Space} from 'antd';
+import {useTranslation} from 'react-i18next';
+
+import {INPUT} from '../../../constants/antd-types.js';
+import {PROVIDER_VALUES} from '../../../constants/session-builder.js';
+
+const ServerTabRabbitQA = ({server, setServerParam}) => {
+ const {t} = useTranslation();
+ return (
+
+
+
+ {t('RabbitQA API Key')}
+ setServerParam('apiKey', e.target.value)}
+ />
+
+
+
+ );
+};
+
+export default ServerTabRabbitQA;
diff --git a/app/common/renderer/components/SessionBuilder/ServerDetails/ServerTabRemoteTestKit.jsx b/app/common/renderer/components/SessionBuilder/ServerDetails/ServerTabRemoteTestKit.jsx
new file mode 100644
index 0000000000..66f1526bba
--- /dev/null
+++ b/app/common/renderer/components/SessionBuilder/ServerDetails/ServerTabRemoteTestKit.jsx
@@ -0,0 +1,25 @@
+import {Col, Input, Row, Space} from 'antd';
+import {useTranslation} from 'react-i18next';
+
+import {INPUT} from '../../../constants/antd-types.js';
+
+const ServerTabRemoteTestkit = ({server, setServerParam}) => {
+ const {t} = useTranslation();
+ return (
+
+
+
+ {t('RemoteTestKit AccessToken')}
+ setServerParam('token', e.target.value)}
+ />
+
+
+
+ );
+};
+
+export default ServerTabRemoteTestkit;
diff --git a/app/common/renderer/components/SessionBuilder/ServerDetails/ServerTabRobotActions.jsx b/app/common/renderer/components/SessionBuilder/ServerDetails/ServerTabRobotActions.jsx
new file mode 100644
index 0000000000..2bb12e7983
--- /dev/null
+++ b/app/common/renderer/components/SessionBuilder/ServerDetails/ServerTabRobotActions.jsx
@@ -0,0 +1,48 @@
+import {Col, Input, Row, Space} from 'antd';
+import {useTranslation} from 'react-i18next';
+
+import {INPUT} from '../../../constants/antd-types.js';
+
+const robotActionsTokenPlaceholder = (t) => {
+ if (process.env.ROBOTACTIONS_TOKEN) {
+ return t('usingDataFoundIn', {environmentVariable: 'ROBOTACTIONS_TOKEN'});
+ }
+ return t('yourApiKey');
+};
+
+const ServerTabRobotActions = ({server, setServerParam}) => {
+ const {t} = useTranslation();
+ return (
+
+
+
+
+ {t('RobotActions Host')}
+ setServerParam('host', e.target.value)}
+ />
+
+
+
+
+
+
+ {t('RobotActions Token')}
+ setServerParam('token', e.target.value)}
+ />
+
+
+
+
+ );
+};
+
+export default ServerTabRobotActions;
diff --git a/app/renderer/components/Session/ServerTabRobotQA.js b/app/common/renderer/components/SessionBuilder/ServerDetails/ServerTabRobotQA.jsx
similarity index 62%
rename from app/renderer/components/Session/ServerTabRobotQA.js
rename to app/common/renderer/components/SessionBuilder/ServerDetails/ServerTabRobotQA.jsx
index 1fc2c0a5ae..4ba969ce0c 100644
--- a/app/renderer/components/Session/ServerTabRobotQA.js
+++ b/app/common/renderer/components/SessionBuilder/ServerDetails/ServerTabRobotQA.jsx
@@ -1,5 +1,5 @@
-import {Col, Form, Input, Row} from 'antd';
-import React from 'react';
+import {Col, Input, Row, Space} from 'antd';
+import {useTranslation} from 'react-i18next';
const robotQATokenPlaceholder = (t) => {
if (process.env.ROBOTQA_TOKEN) {
@@ -8,22 +8,23 @@ const robotQATokenPlaceholder = (t) => {
return t('Add your token');
};
-const ServerTabRobotQA = ({server, setServerParam, t}) => (
-
-);
+ );
+};
export default ServerTabRobotQA;
diff --git a/app/common/renderer/components/SessionBuilder/ServerDetails/ServerTabSauce.jsx b/app/common/renderer/components/SessionBuilder/ServerDetails/ServerTabSauce.jsx
new file mode 100644
index 0000000000..738cd153d4
--- /dev/null
+++ b/app/common/renderer/components/SessionBuilder/ServerDetails/ServerTabSauce.jsx
@@ -0,0 +1,104 @@
+import {Checkbox, Col, Flex, Input, Radio, Row, Space} from 'antd';
+import {useTranslation} from 'react-i18next';
+
+import {INPUT} from '../../../constants/antd-types.js';
+import styles from './ServerDetails.module.css';
+
+const sauceUsernamePlaceholder = (t) => {
+ if (process.env.SAUCE_USERNAME) {
+ return t('usingDataFoundIn', {environmentVariable: 'SAUCE_USERNAME'});
+ }
+ return t('yourUsername');
+};
+
+const sauceAccessKeyPlaceholder = (t) => {
+ if (process.env.SAUCE_ACCESS_KEY) {
+ return t('usingDataFoundIn', {environmentVariable: 'SAUCE_ACCESS_KEY'});
+ }
+ return t('yourAccessKey');
+};
+
+const ServerTabSauce = ({server, setServerParam}) => {
+ const {t} = useTranslation();
+ return (
+
+
+
+
+ {t('Sauce Username')}
+ setServerParam('username', e.target.value)}
+ />
+
+
+
+
+ {t('Sauce Access Key')}
+ setServerParam('accessKey', e.target.value)}
+ />
+
+
+
+
+
+
+ {t('SauceLabs Data Center')}
+ setServerParam('dataCenter', e.target.value)}
+ >
+ {t('US-West')}
+ {t('US-East')}
+ {t('EU-Central')}
+
+
+
+
+ setServerParam('useSCProxy', e.target.checked)}
+ >
+ {t('proxyThroughSC')}
+
+
+
+
+ {t('Host')}
+ setServerParam('scHost', e.target.value)}
+ />
+
+
+
+
+ {t('Port')}
+ setServerParam('scPort', e.target.value)}
+ />
+
+
+
+
+ );
+};
+
+export default ServerTabSauce;
diff --git a/app/common/renderer/components/SessionBuilder/ServerDetails/ServerTabTVLabs.jsx b/app/common/renderer/components/SessionBuilder/ServerDetails/ServerTabTVLabs.jsx
new file mode 100644
index 0000000000..c54e01c942
--- /dev/null
+++ b/app/common/renderer/components/SessionBuilder/ServerDetails/ServerTabTVLabs.jsx
@@ -0,0 +1,33 @@
+import {Col, Input, Row, Space} from 'antd';
+import {useTranslation} from 'react-i18next';
+
+import {INPUT} from '../../../constants/antd-types.js';
+
+const tvlabsApiKeyPlaceholder = (t) => {
+ if (process.env.TVLABS_API_KEY) {
+ return t('usingDataFoundIn', {environmentVariable: 'TVLABS_API_KEY'});
+ }
+ return t('yourApiKey');
+};
+
+const ServerTabTVLabs = ({server, setServerParam}) => {
+ const {t} = useTranslation();
+ return (
+
+
+
+ {t('TV Labs API Key')}
+ setServerParam('apiKey', e.target.value)}
+ />
+
+
+
+ );
+};
+
+export default ServerTabTVLabs;
diff --git a/app/common/renderer/components/SessionBuilder/ServerDetails/ServerTabTestMuAI.jsx b/app/common/renderer/components/SessionBuilder/ServerDetails/ServerTabTestMuAI.jsx
new file mode 100644
index 0000000000..443495f223
--- /dev/null
+++ b/app/common/renderer/components/SessionBuilder/ServerDetails/ServerTabTestMuAI.jsx
@@ -0,0 +1,51 @@
+import {Col, Input, Row, Space} from 'antd';
+import {useTranslation} from 'react-i18next';
+
+import {INPUT} from '../../../constants/antd-types.js';
+
+const testMuAIUsernamePlaceholder = (t) => {
+ if (process.env.LAMBDATEST_USERNAME) {
+ return t('usingDataFoundIn', {environmentVariable: 'LAMBDATEST_USERNAME'});
+ }
+ return t('yourUsername');
+};
+
+const testMuAIAccessKeyPlaceholder = (t) => {
+ if (process.env.LAMBDATEST_ACCESS_KEY) {
+ return t('usingDataFoundIn', {environmentVariable: 'LAMBDATEST_ACCESS_KEY'});
+ }
+ return t('yourAccessKey');
+};
+
+const ServerTabTestMuAI = ({server, setServerParam}) => {
+ const {t} = useTranslation();
+ return (
+
+
+
+ {t('TestMu AI Username')}
+ setServerParam('username', e.target.value)}
+ />
+
+
+
+
+ {t('TestMu AI Access Key')}
+ setServerParam('accessKey', e.target.value)}
+ />
+
+
+
+ );
+};
+
+export default ServerTabTestMuAI;
diff --git a/app/common/renderer/components/SessionBuilder/ServerDetails/ServerTabTestcribe.jsx b/app/common/renderer/components/SessionBuilder/ServerDetails/ServerTabTestcribe.jsx
new file mode 100644
index 0000000000..d291d1581c
--- /dev/null
+++ b/app/common/renderer/components/SessionBuilder/ServerDetails/ServerTabTestcribe.jsx
@@ -0,0 +1,27 @@
+import {Col, Input, Row, Space} from 'antd';
+import {useTranslation} from 'react-i18next';
+
+import {PROVIDER_VALUES} from '../../../constants/session-builder.js';
+import builderStyles from '../SessionBuilder.module.css';
+
+const ServerTabTestcribe = ({server, setServerParam}) => {
+ const {t} = useTranslation();
+ return (
+
+
+
+ {t('TestcribeAPIKey')}
+ setServerParam('apiKey', e.target.value)}
+ />
+
+ {t('sessionTestcribeApiKeyDescription')}
+
+
+ );
+};
+
+export default ServerTabTestcribe;
diff --git a/app/common/renderer/components/SessionBuilder/ServerDetails/ServerTabTestingbot.jsx b/app/common/renderer/components/SessionBuilder/ServerDetails/ServerTabTestingbot.jsx
new file mode 100644
index 0000000000..021387f232
--- /dev/null
+++ b/app/common/renderer/components/SessionBuilder/ServerDetails/ServerTabTestingbot.jsx
@@ -0,0 +1,51 @@
+import {Col, Input, Row, Space} from 'antd';
+import {useTranslation} from 'react-i18next';
+
+import {INPUT} from '../../../constants/antd-types.js';
+
+const testingbotUsernamePlaceholder = (t) => {
+ if (process.env.TB_KEY) {
+ return t('usingDataFoundIn', {environmentVariable: 'TB_KEY'});
+ }
+ return t('yourUsername');
+};
+
+const testingbotAccessKeyPlaceholder = (t) => {
+ if (process.env.TB_SECRET) {
+ return t('usingDataFoundIn', {environmentVariable: 'TB_SECRET'});
+ }
+ return t('yourAccessKey');
+};
+
+const ServerTabTestingbot = ({server, setServerParam}) => {
+ const {t} = useTranslation();
+ return (
+
+
+
+ {t('TestingBot Key')}
+ setServerParam('username', e.target.value)}
+ />
+
+
+
+
+ {t('TestingBot Secret')}
+ setServerParam('accessKey', e.target.value)}
+ />
+
+
+
+ );
+};
+
+export default ServerTabTestingbot;
diff --git a/app/common/renderer/components/SessionBuilder/ServerDetails/ServerTabWebmate.jsx b/app/common/renderer/components/SessionBuilder/ServerDetails/ServerTabWebmate.jsx
new file mode 100644
index 0000000000..4c24e6457e
--- /dev/null
+++ b/app/common/renderer/components/SessionBuilder/ServerDetails/ServerTabWebmate.jsx
@@ -0,0 +1,72 @@
+import {Checkbox, Col, Flex, Input, Row, Space} from 'antd';
+import {useTranslation} from 'react-i18next';
+
+import {INPUT} from '../../../constants/antd-types.js';
+import styles from './ServerDetails.module.css';
+
+const ServerTabWebmate = ({server, setServerParam}) => {
+ const {t} = useTranslation();
+ return (
+
+
+
+
+ {t('webmateApiKey')}
+ setServerParam('apiKey', e.target.value)}
+ />
+
+
+
+
+ {t('webmateProjectId')}
+ setServerParam('projectId', e.target.value)}
+ />
+
+
+
+
+
+ setServerParam('useCustomHost', e.target.checked)}
+ >
+ {t('specifyWebmateHostExplicitly')}
+
+
+
+
+ {t('webmateHost')}
+ setServerParam('seleniumHost', e.target.value)}
+ />
+
+
+
+
+ );
+};
+
+export default ServerTabWebmate;
diff --git a/app/common/renderer/components/SessionBuilder/SessionBuilder.jsx b/app/common/renderer/components/SessionBuilder/SessionBuilder.jsx
new file mode 100644
index 0000000000..7a17d0d0bb
--- /dev/null
+++ b/app/common/renderer/components/SessionBuilder/SessionBuilder.jsx
@@ -0,0 +1,227 @@
+import {IconLink} from '@tabler/icons-react';
+import {Badge, Button, Divider, Space, Spin, Tabs} from 'antd';
+import _ from 'lodash';
+import {useCallback, useEffect} from 'react';
+import {useTranslation} from 'react-i18next';
+import {useNavigate} from 'react-router';
+
+import {BUTTON} from '../../constants/antd-types.js';
+import {LINKS} from '../../constants/common.js';
+import {
+ ADD_CLOUD_PROVIDER_TAB_KEY,
+ SERVER_TYPES,
+ SESSION_BUILDER_TABS,
+} from '../../constants/session-builder.js';
+import {openLink} from '../../polyfills.js';
+import {log} from '../../utils/logger.js';
+import AppSettings from './AppSettings/AppSettings.jsx';
+import AttachToSession from './AttachToSessionTab/AttachToSession.jsx';
+import CapabilityEditor from './CapabilityBuilderTab/CapabilityEditor.jsx';
+import SavedCapabilitySets from './SavedCapabilitySetsTab/SavedCapabilitySets.jsx';
+import AdvancedServerParams from './ServerDetails/AdvancedServerParams.jsx';
+import CloudProviders from './ServerDetails/CloudProviders.jsx';
+import CloudProviderSelector from './ServerDetails/CloudProviderSelector.jsx';
+import ServerTabCustom from './ServerDetails/ServerTabCustom.jsx';
+import styles from './SessionBuilder.module.css';
+
+// There are 3 possible cases for an empty capability set:
+// * Default Inspector state, which has 1 predefined capability without name or value
+// * User-modified state with all capabilities manually removed (empty list)
+// * null, if attachSessId is provided
+const isCapabilitySetEmpty = (caps) =>
+ _.isEmpty(caps) || (caps.length === 1 && !('name' in caps[0]) && !('value' in caps[0]));
+
+const Session = (props) => {
+ const {
+ tabKey,
+ switchTabs,
+ serverType,
+ server,
+ visibleProviders = [],
+ caps,
+ capsUUID,
+ capsName,
+ isCapsDirty,
+ isEditingDesiredCaps,
+ requestSaveAsModal,
+ saveSession,
+ newSession,
+ savedSessions,
+ newSessionLoading,
+ setLocalServerParams,
+ getSavedSessions,
+ setSavedServerParams,
+ initFromSessionFile,
+ setVisibleProviders,
+ bindWindowClose,
+ initFromQueryString,
+ setPortFromUrl,
+ showError,
+ } = props;
+
+ const navigate = useNavigate();
+ const {t} = useTranslation();
+
+ const isAttaching = tabKey === 'attach';
+
+ const handleSelectServerTab = async (tab) => {
+ const {changeServerType, addCloudProvider} = props;
+ if (tab === ADD_CLOUD_PROVIDER_TAB_KEY) {
+ addCloudProvider();
+ return;
+ }
+ await changeServerType(tab);
+ };
+
+ const loadNewSession = useCallback(
+ async (caps, attachSessId = null) => {
+ if (isCapabilitySetEmpty(caps) && !attachSessId) {
+ return showError(new Error(t('noCapsFound', {url: LINKS.ADD_CAPS_DOCS})), {secs: 0});
+ }
+ if (await newSession(_.cloneDeep(caps), attachSessId)) {
+ navigate('/inspector', {replace: true});
+ }
+ },
+ [navigate, newSession, showError, t],
+ );
+
+ useEffect(() => {
+ (async () => {
+ try {
+ bindWindowClose();
+ switchTabs(SESSION_BUILDER_TABS.CAPS_BUILDER);
+ await getSavedSessions();
+ await setVisibleProviders();
+ await setSavedServerParams();
+ await setLocalServerParams();
+ await setPortFromUrl();
+ initFromQueryString(loadNewSession);
+ await initFromSessionFile();
+ } catch (e) {
+ log.error(e);
+ }
+ })();
+ }, [
+ // none of these will actually change, since they are coming from Redux
+ bindWindowClose,
+ getSavedSessions,
+ initFromQueryString,
+ initFromSessionFile,
+ loadNewSession,
+ setLocalServerParams,
+ setPortFromUrl,
+ setSavedServerParams,
+ setVisibleProviders,
+ switchTabs,
+ ]);
+
+ return [
+
+
+
+
handleSelectServerTab(tab)}
+ className={styles.serverTabs}
+ items={[
+ {
+ label: t('Appium Server'),
+ key: SERVER_TYPES.REMOTE,
+ children: ,
+ },
+ ..._(visibleProviders).map((providerName) => {
+ const provider = CloudProviders[providerName];
+ if (!provider) {
+ return true;
+ }
+ return {
+ label: {provider.tabhead()}
,
+ key: providerName,
+ children: provider.tab(props),
+ };
+ }),
+ {
+ label: {t('Select Cloud Providers')} ,
+ key: ADD_CLOUD_PROVIDER_TAB_KEY,
+ },
+ ]}
+ />
+
+
+
+
,
+ },
+ {
+ label: (
+
+ {t('Saved Capability Sets')}{' '}
+
+
+ ),
+ key: SESSION_BUILDER_TABS.SAVED_CAPS,
+ className: styles.scrollingTab,
+ children:
,
+ },
+ {
+ label: t('attachToSession'),
+ key: SESSION_BUILDER_TABS.ATTACH_TO_SESSION,
+ className: styles.scrollingTab,
+ children:
,
+ },
+ ]}
+ />
+
+
+ }
+ onClick={() => openLink(LINKS.CAPS_DOCS)}
+ >
+ {t('desiredCapabilitiesDocumentation')}
+
+ {!isAttaching && (
+
+ {capsUUID && (
+
+ saveSession({server, serverType, caps, name: capsName, uuid: capsUUID})
+ }
+ disabled={!isCapsDirty || isEditingDesiredCaps}
+ >
+ {t('Save')}
+
+ )}
+
+ {t('saveAs')}
+
+
+ )}
+ {!isAttaching && (
+ loadNewSession(caps)}
+ className={styles.startSessionBtn}
+ >
+ {t('startSession')}
+
+ )}
+
+
+ ,
+ ,
+ ];
+};
+
+export default Session;
diff --git a/app/common/renderer/components/SessionBuilder/SessionBuilder.module.css b/app/common/renderer/components/SessionBuilder/SessionBuilder.module.css
new file mode 100644
index 0000000000..7b307eeca8
--- /dev/null
+++ b/app/common/renderer/components/SessionBuilder/SessionBuilder.module.css
@@ -0,0 +1,106 @@
+.sessionContainer {
+ width: 100%;
+ height: 100%;
+ padding: 1em;
+ display: flex;
+ flex-flow: column;
+}
+
+.sessionContainer :global(.ant-divider-horizontal) {
+ margin: 0px;
+}
+
+.sessionContainer :global(.ant-tabs-tab .anticon.anticon-close-square) {
+ color: red;
+ margin-left: 10px;
+}
+
+.sessionContainer :global(.addCloudProviderTab) {
+ font-style: italic;
+}
+
+.sessionHeader {
+ display: flex;
+ justify-content: space-between;
+}
+
+.sessionFooter {
+ margin-top: 15px;
+ text-align: right;
+ height: 30px;
+}
+
+.sessionFooter .desiredCapsLink {
+ float: left;
+}
+
+.serverTabs {
+ padding-bottom: 8px;
+ flex: 1;
+ max-width: 95%;
+}
+
+.serverTabs :global(.ant-tabs-bar) {
+ padding-top: 2em;
+ margin-top: -1em;
+}
+
+.serverTabs :global(.ant-tabs-nav-wrap) {
+ -webkit-app-region: drag;
+}
+
+.serverTabs :global(.ant-tabs-tab) {
+ -webkit-app-region: no-drag;
+}
+
+.serverTabs :global(.ant-form > .ant-row > div) {
+ padding-bottom: 12px;
+}
+
+.serverTabs :global(.ant-form-item) {
+ margin: 0;
+}
+
+.scrollingTabCont {
+ margin-top: 15px;
+ margin-bottom: 15px;
+ flex-grow: 1;
+ display: flex;
+ flex-direction: column;
+ overflow: auto;
+}
+
+.scrollingTabCont :global(.ant-tabs-bar) {
+ margin-bottom: 0px;
+}
+
+.scrollingTabCont :global(.ant-tabs-content) {
+ height: 100%;
+}
+
+.scrollingTab {
+ scrollbar-width: none; /* -webkit-scrollbar for Firefox */
+ overflow-y: scroll;
+ height: 100%;
+}
+
+.scrollingTab::-webkit-scrollbar {
+ width: 0px;
+}
+
+.startSessionBtn {
+ margin-left: 1em;
+}
+
+.localDesc {
+ font-style: italic;
+ color: #666;
+ margin: 0;
+ padding: 6px 8px 0 8px;
+}
+
+.errorMessage {
+ padding-top: 1px;
+ color: #ff4d4f;
+ font-size: 12px;
+}
diff --git a/app/common/renderer/components/SessionInspector/CommandsTab/CommandResultModal.jsx b/app/common/renderer/components/SessionInspector/CommandsTab/CommandResultModal.jsx
new file mode 100644
index 0000000000..34125ccf84
--- /dev/null
+++ b/app/common/renderer/components/SessionInspector/CommandsTab/CommandResultModal.jsx
@@ -0,0 +1,241 @@
+import {IconFiles, IconTable} from '@tabler/icons-react';
+import {Button, Col, Modal, Row, Space, Table, Tooltip} from 'antd';
+import _ from 'lodash';
+import {useState} from 'react';
+import {useTranslation} from 'react-i18next';
+
+import {BUTTON} from '../../../constants/antd-types.js';
+import {copyToClipboard} from '../../../utils/other.js';
+import styles from './Commands.module.css';
+
+const LABEL_PROPERTY = 'property';
+const LABEL_VALUE = 'value';
+
+const stringifyValue = (val) => (_.isObject(val) ? JSON.stringify(val, null, 2) : String(val));
+
+const CommandResultTableCell = ({value}) => {
+ const {t} = useTranslation();
+ const displayText = stringifyValue(value);
+ return (
+
+ copyToClipboard(displayText)}>
+ {displayText}
+
+
+ );
+};
+
+const CommandResultFormattedTable = ({result, isPrimitive}) => {
+ const {t} = useTranslation();
+ // Specify properties for each column
+ const createColumn = (colDataArray, colName, options = {}) => ({
+ title:
+ colName === LABEL_PROPERTY ? t('Property') : colName === LABEL_VALUE ? t('Value') : colName,
+ dataIndex: colName,
+ key: colName,
+ ellipsis: {showTitle: false},
+ render: (value) => ,
+ sorter: (a, b) => {
+ const av = String(a[colName] ?? '');
+ const bv = String(b[colName] ?? '');
+ return av.localeCompare(bv, undefined, {numeric: true});
+ },
+ // hide filters for object values, and convert all others to strings to handle booleans
+ filters: [...new Set(colDataArray)]
+ .filter((item) => !_.isObject(item))
+ .map((item) => ({
+ text: String(item),
+ value: String(item),
+ })),
+ onFilter: (value, record) => String(record[colName]) === value,
+ ...options,
+ });
+
+ // Render primitive data: create single row and column.
+ // The table header will also be hidden due to `isPrimitive`.
+ const handlePrimitiveData = (data) => {
+ const flattenedData = [{value: data}];
+ const columns = [createColumn([data], LABEL_VALUE, {minWidth: 120})];
+ return {flattenedData, columns};
+ };
+
+ // Render an object: create 2 columns, one for keys, the other for values
+ const handleObjectData = (data) => {
+ const flattenedData = Object.entries(data).map(([key, value]) => ({
+ property: key,
+ value,
+ }));
+ const columns = [
+ createColumn(Object.keys(data), LABEL_PROPERTY, {width: '30%', minWidth: 120}),
+ createColumn(Object.values(data), LABEL_VALUE, {width: '70%', minWidth: 200}),
+ ];
+ return {flattenedData, columns};
+ };
+
+ // Render an array of non-objects (primitives or arrays): create a single column
+ const handleArrayOfNonObjects = (data) => {
+ const flattenedData = data.map((item) => ({value: item}));
+ const columns = [createColumn(data, LABEL_VALUE, {minWidth: 120})];
+ return {flattenedData, columns};
+ };
+
+ // Render array of objects: create a separate column for each key
+ // Will not render any non-object entries!
+ const handleArrayOfObjects = (data) => {
+ // Filter to only objects (excluding arrays) to avoid runtime errors
+ const safeData = data.filter((entry) => _.isObject(entry) && !Array.isArray(entry));
+ const allObjectKeys = [...new Set(safeData.flatMap(Object.keys))];
+ const columns = allObjectKeys.map((key) =>
+ createColumn(
+ safeData.map((entry) => entry[key]),
+ key,
+ {minWidth: 100},
+ ),
+ );
+ return {flattenedData: safeData, columns};
+ };
+
+ // Render a different type of table depending on the result type
+ const createTableResult = (data) => {
+ let tableContents;
+ if (Array.isArray(data)) {
+ if (_.isObject(data[0]) && !Array.isArray(data[0])) {
+ tableContents = handleArrayOfObjects(data);
+ } else {
+ tableContents = handleArrayOfNonObjects(data);
+ }
+ } else if (_.isObject(data)) {
+ tableContents = handleObjectData(data);
+ } else {
+ tableContents = handlePrimitiveData(data);
+ }
+ const {flattenedData, columns} = tableContents;
+ const dataSource = flattenedData.map((item, index) => ({
+ key: index.toString(),
+ ...item,
+ }));
+
+ return {dataSource, columns};
+ };
+
+ const {dataSource, columns} = createTableResult(result);
+
+ return (
+
+ );
+};
+
+const CommandResultRawTable = ({result}) => {
+ const dataSource = [{key: 0, rawValue: result}];
+ const columns = [
+ {
+ dataIndex: 'rawValue',
+ key: 'rawValue',
+ minWidth: 120,
+ render: (value) => {value} ,
+ },
+ ];
+ return (
+
+ );
+};
+
+const CommandResultModalFooter = ({
+ result,
+ closeCommandModal,
+ setFormatResult,
+ formatResult,
+ isPrimitive,
+}) => {
+ const {t} = useTranslation();
+ return (
+
+
+
+
+ }
+ disabled={isPrimitive}
+ type={formatResult ? BUTTON.PRIMARY : BUTTON.DEFAULT}
+ onClick={() => setFormatResult(!formatResult)}
+ />
+
+
+ }
+ disabled={formatResult}
+ onClick={() => copyToClipboard(result)}
+ />
+
+
+
+
+ closeCommandModal()} type={BUTTON.PRIMARY}>
+ {t('OK')}
+
+
+
+ );
+};
+
+const CommandResultModal = ({commandName, commandResult, clearCurrentCommand}) => {
+ const {t} = useTranslation();
+ const [formatResult, setFormatResult] = useState(false);
+
+ const resultType =
+ commandResult === null ? 'null' : Array.isArray(commandResult) ? 'array' : typeof commandResult;
+ const isPrimitive = resultType !== 'object' && resultType !== 'array';
+ const stringifiedResult = stringifyValue(commandResult);
+
+ const closeCommandModal = () => {
+ clearCurrentCommand();
+ setFormatResult(false);
+ };
+
+ return (
+ closeCommandModal()}
+ width={{md: '80%', lg: '70%', xl: '60%', xxl: '50%'}}
+ className={styles.commandResultModal}
+ footer={
+
+ }
+ >
+ {formatResult ? (
+
+ ) : (
+
+ )}
+
+ );
+};
+
+export default CommandResultModal;
diff --git a/app/common/renderer/components/SessionInspector/CommandsTab/Commands.jsx b/app/common/renderer/components/SessionInspector/CommandsTab/Commands.jsx
new file mode 100644
index 0000000000..71320c37bb
--- /dev/null
+++ b/app/common/renderer/components/SessionInspector/CommandsTab/Commands.jsx
@@ -0,0 +1,169 @@
+import {IconTerminal} from '@tabler/icons-react';
+import {Card, Flex, Input, Modal, Space, Typography} from 'antd';
+import _ from 'lodash';
+import {useEffect, useRef, useState} from 'react';
+import {useTranslation} from 'react-i18next';
+
+import {
+ adjustParamValueType,
+ transformCommandsMap,
+ transformExecMethodsMap,
+} from '../../../utils/commands-tab.js';
+import inspectorStyles from '../SessionInspector.module.css';
+import CommandResultModal from './CommandResultModal.jsx';
+import styles from './Commands.module.css';
+import MethodMapCommandsList from './MethodMapCommandsList.jsx';
+import StaticCommandsList from './StaticCommandsList.jsx';
+
+const COMMAND_EXECUTE_SCRIPT = 'executeScript';
+const COMMAND_UPDATE_SETTINGS = 'updateSettings';
+
+const formatParamInputLabel = (param) => {
+ const monoName = {param.name} ;
+ if (param.required) {
+ return (
+ <>
+ * {monoName}
+ >
+ );
+ }
+ return monoName;
+};
+
+const Commands = (props) => {
+ const {applyClientMethod, getSupportedSessionMethods, storeSessionSettings} = props;
+ const {t} = useTranslation();
+
+ const [hasMethodsMap, setHasMethodsMap] = useState(null);
+ const [driverCommands, setDriverCommands] = useState(null);
+ const [driverExecuteMethods, setDriverExecuteMethods] = useState(null);
+
+ const [curCommandDetails, setCurCommandDetails] = useState(null);
+ const curCommandParamValsRef = useRef([]);
+
+ const [commandResult, setCommandResult] = useState(undefined);
+
+ const startCommand = (commandDetails) => {
+ setCurCommandDetails(commandDetails);
+ if (_.isEmpty(commandDetails.details.params)) {
+ prepareAndRunCommand(commandDetails);
+ }
+ };
+
+ const prepareCommand = (cmdName, cmdParams, isExecute) => {
+ const adjustedCmdName = isExecute ? COMMAND_EXECUTE_SCRIPT : cmdName;
+ let adjustedCmdParams = curCommandParamValsRef.current.map(adjustParamValueType);
+
+ // If we are about to run an execute method,
+ // the parameters array needs to be turned into an object,
+ // and the command name added as a separate parameter.
+ if (isExecute) {
+ const cmdParamNames = _.map(cmdParams, 'name');
+ const mappedCmdParams = _.zipObject(cmdParamNames, adjustedCmdParams);
+ adjustedCmdParams = [cmdName, mappedCmdParams];
+ }
+
+ // The WebDriver spec for 'executeScript' requires 'args' to be an array
+ // (https://w3c.github.io/webdriver/#dfn-extract-the-script-arguments-from-a-request),
+ // but if the script doesn't use any arguments, we allow the user to omit it.
+ // So we can have 5 cases for 'args': undefined, {}, [], {...}, [{...}]
+ if (adjustedCmdName === COMMAND_EXECUTE_SCRIPT) {
+ if (_.isEmpty(adjustedCmdParams[1])) {
+ adjustedCmdParams[1] = [];
+ } else if (_.isPlainObject(adjustedCmdParams[1])) {
+ adjustedCmdParams[1] = [adjustedCmdParams[1]];
+ }
+ }
+ return [adjustedCmdName, adjustedCmdParams];
+ };
+
+ const runCommand = async (methodName, args, skipRefresh) => {
+ const res = await applyClientMethod({
+ methodName,
+ args,
+ skipRefresh,
+ });
+ setCommandResult(res);
+ };
+
+ const prepareAndRunCommand = (commandDetails) => {
+ const {
+ name: cmdName,
+ details: {params: cmdParams, refresh = false},
+ isExecute = false,
+ } = commandDetails;
+
+ const [newCmdName, newCmdParams] = prepareCommand(cmdName, cmdParams, isExecute);
+ // Do not await - let the command run in the background without blocking the UI
+ runCommand(newCmdName, newCmdParams, !refresh);
+
+ // if updating settings, store the updated values
+ if (newCmdName === COMMAND_UPDATE_SETTINGS) {
+ storeSessionSettings(newCmdParams[0]);
+ }
+ };
+
+ const clearCurrentCommand = () => {
+ setCommandResult(undefined);
+ setCurCommandDetails(null);
+ curCommandParamValsRef.current = [];
+ };
+
+ useEffect(() => {
+ (async () => {
+ const {commands, executeMethods} = await getSupportedSessionMethods();
+ setHasMethodsMap(!(_.isEmpty(commands) && _.isEmpty(executeMethods)));
+ setDriverCommands(transformCommandsMap(commands));
+ setDriverExecuteMethods(transformExecMethodsMap(executeMethods));
+ })();
+ }, [getSupportedSessionMethods]);
+
+ return (
+
+
+ {t('Execute Commands')}
+
+ }
+ className={inspectorStyles.interactionTabCard}
+ >
+
+ {hasMethodsMap === false && }
+ {hasMethodsMap && (
+
+ )}
+ {!!curCommandDetails && (
+ prepareAndRunCommand(curCommandDetails)}
+ onCancel={() => clearCurrentCommand()}
+ footer={(_, {OkBtn}) => }
+ >
+ {_.map(curCommandDetails.details.params, (param, index) => (
+
+ {formatParamInputLabel(param)}
+ (curCommandParamValsRef.current[index] = e.target.value)} />
+
+ ))}
+
+ )}
+ {commandResult !== undefined && (
+
+ )}
+
+
+ );
+};
+
+export default Commands;
diff --git a/app/common/renderer/components/SessionInspector/CommandsTab/Commands.module.css b/app/common/renderer/components/SessionInspector/CommandsTab/Commands.module.css
new file mode 100644
index 0000000000..b65158c5c6
--- /dev/null
+++ b/app/common/renderer/components/SessionInspector/CommandsTab/Commands.module.css
@@ -0,0 +1,68 @@
+.commandsContainer {
+ height: 100%;
+}
+
+.commandsContainer :global(.ant-select) {
+ width: 100%;
+}
+
+.commandsContainer :global(.ant-btn) {
+ width: 100%;
+}
+
+.btnContainer {
+ padding: 8px;
+ height: 100%;
+}
+
+.methodMapTab {
+ height: 100%;
+ display: flex;
+ flex-direction: column;
+}
+
+.methodMapGrid {
+ overflow-y: auto;
+}
+
+.commandArgInputRow {
+ padding: 4px 0 0 0;
+}
+
+.commandResultModal :global(.ant-modal-footer) {
+ text-align: unset;
+}
+
+.commandResultModalOkButtonCol {
+ display: flex;
+ justify-content: flex-end;
+}
+
+.commandResultRawPreBlock {
+ margin: 0;
+}
+
+.commandResultTable :global(.ant-table-tbody > tr > td) {
+ vertical-align: top;
+}
+
+.commandResultTableCell {
+ margin: 0;
+ white-space: pre-wrap;
+ cursor: pointer;
+}
+
+.methodBtn {
+ white-space: normal;
+ word-break: break-all;
+ height: 100%;
+ min-height: 30px;
+}
+
+.deprecatedMethod {
+ background-color: #f8f8e3;
+}
+
+:global(.dark) .deprecatedMethod {
+ background-color: #292919;
+}
diff --git a/app/common/renderer/components/SessionInspector/CommandsTab/MethodMapCommandsList.jsx b/app/common/renderer/components/SessionInspector/CommandsTab/MethodMapCommandsList.jsx
new file mode 100644
index 0000000000..6c5d4ec8dd
--- /dev/null
+++ b/app/common/renderer/components/SessionInspector/CommandsTab/MethodMapCommandsList.jsx
@@ -0,0 +1,107 @@
+import {IconSearch} from '@tabler/icons-react';
+import {Button, Col, Divider, Input, Row, Tabs, Tooltip} from 'antd';
+import _ from 'lodash';
+import {useState} from 'react';
+import {useTranslation} from 'react-i18next';
+
+import {filterMethodPairs} from '../../../utils/commands-tab.js';
+import inspectorStyles from '../SessionInspector.module.css';
+import styles from './Commands.module.css';
+
+// Dynamic list of driver commands, generated from the driver's method map responses.
+// Unlike StaticCommandsList, we cannot predict the contents of the method map response,
+// and we also want to be able to filter it, so just render all methods in a single grid.
+const MethodMapCommandsList = (props) => {
+ const {driverCommands, driverExecuteMethods, startCommand} = props;
+ const {t} = useTranslation();
+
+ const [searchQuery, setSearchQuery] = useState('');
+
+ const hasNoCommands = _.isEmpty(driverCommands);
+ const hasNoExecuteMethods = _.isEmpty(driverExecuteMethods);
+
+ const filteredDriverCommands = filterMethodPairs(driverCommands, searchQuery);
+ const filteredDriverExecuteMethods = filterMethodPairs(driverExecuteMethods, searchQuery);
+
+ const methodButton = (methodName, methodDetails, isExecute) => (
+
+ {!methodDetails.deprecated && !methodDetails.info && (
+
startCommand({name: methodName, details: methodDetails, isExecute})}
+ >
+ {methodName}
+
+ )}
+ {(methodDetails.deprecated || methodDetails.info) && (
+
+ {methodDetails.deprecated && {t('methodDeprecated')}
}
+ {methodDetails.info && {methodDetails.info}
}
+ >
+ }
+ destroyOnHidden={true}
+ >
+ startCommand({name: methodName, details: methodDetails, isExecute})}
+ >
+ {methodName}
+
+
+ )}
+
+ );
+
+ const methodMapContent = (driverMethods, isExecute) => (
+ <>
+ {isExecute ? t('dynamicExecuteMethodsDescription') : t('dynamicCommandsDescription')}
+
+
+
+ {driverMethods.map(([methodName, methodDetails]) => (
+
+ {methodButton(methodName, methodDetails, isExecute)}
+
+ ))}
+
+
+ >
+ );
+
+ return (
+ setSearchQuery(e.target.value)}
+ value={searchQuery}
+ allowClear
+ prefix={ }
+ />
+ }
+ />
+ );
+};
+
+export default MethodMapCommandsList;
diff --git a/app/common/renderer/components/SessionInspector/CommandsTab/StaticCommandsList.jsx b/app/common/renderer/components/SessionInspector/CommandsTab/StaticCommandsList.jsx
new file mode 100644
index 0000000000..5818d065c8
--- /dev/null
+++ b/app/common/renderer/components/SessionInspector/CommandsTab/StaticCommandsList.jsx
@@ -0,0 +1,51 @@
+import {Button, Col, Collapse, Row, Space} from 'antd';
+import _ from 'lodash';
+import {useTranslation} from 'react-i18next';
+
+import {COMMAND_DEFINITIONS, TOP_LEVEL_COMMANDS} from '../../../constants/commands.js';
+import inspectorStyles from '../SessionInspector.module.css';
+import styles from './Commands.module.css';
+
+// Static list of driver commands, shown only for drivers that do not support
+// the listCommands/listExtensions endpoints
+const StaticCommandsList = ({startCommand}) => {
+ const {t} = useTranslation();
+
+ return (
+
+ {t('commandsDescription')}
+
+ {_.toPairs(TOP_LEVEL_COMMANDS).map(([cmdName, cmdDetails]) => (
+
+
+ startCommand({name: cmdName, details: cmdDetails})}>
+ {cmdName}
+
+
+
+ ))}
+
+ ({
+ key: commandGroup,
+ label: t(commandGroup),
+ children: (
+
+ {_.toPairs(commands).map(([cmdName, cmdDetails]) => (
+
+
+ startCommand({name: cmdName, details: cmdDetails})}>
+ {cmdName}
+
+
+
+ ))}
+
+ ),
+ }))}
+ />
+
+ );
+};
+
+export default StaticCommandsList;
diff --git a/app/common/renderer/components/SessionInspector/GesturesTab/GestureEditor.jsx b/app/common/renderer/components/SessionInspector/GesturesTab/GestureEditor.jsx
new file mode 100644
index 0000000000..af330c1b6b
--- /dev/null
+++ b/app/common/renderer/components/SessionInspector/GesturesTab/GestureEditor.jsx
@@ -0,0 +1,727 @@
+import {
+ IconArrowBigDownLine,
+ IconArrowBigRightLines,
+ IconArrowBigUpLine,
+ IconArrowLeft,
+ IconFocus2,
+ IconHandMove,
+ IconPlayerPause,
+ IconPlayerPlay,
+ IconPlus,
+ IconQuestionMark,
+ IconX,
+} from '@tabler/icons-react';
+import {
+ Button,
+ Card,
+ Col,
+ Divider,
+ Flex,
+ Input,
+ Popover,
+ Row,
+ Select,
+ Space,
+ Steps,
+ Tabs,
+ Tooltip,
+} from 'antd';
+import _ from 'lodash';
+import {useCallback, useEffect, useState} from 'react';
+import {useTranslation} from 'react-i18next';
+
+import {NOTIF, TABLE_TAB} from '../../../constants/antd-types.js';
+import {
+ CURSOR,
+ DEFAULT_POINTER,
+ POINTER_COLORS,
+ POINTER_DOWN_BTNS,
+ POINTER_MOVE_COORDS_TYPE,
+ POINTER_MOVE_DEFAULT_DURATION,
+ POINTER_TYPES,
+ POINTER_TYPES_MAP,
+ TICK_PROPS,
+} from '../../../constants/gestures.js';
+import {SCREENSHOT_INTERACTION_MODE} from '../../../constants/screenshot.js';
+import {notification} from '../../../utils/notification.js';
+import {percentageToPixels, pixelsToPercentage} from '../../../utils/other.js';
+import inspectorStyles from '../SessionInspector.module.css';
+import styles from './Gestures.module.css';
+
+const {POINTER_UP, POINTER_DOWN, PAUSE, POINTER_MOVE, FILLER} = POINTER_TYPES;
+
+/**
+ * Shows the gesture editor interface
+ */
+const GestureEditor = (props) => {
+ const {
+ loadedGesture,
+ saveGesture,
+ tickCoordinates,
+ selectedTick,
+ selectTick,
+ unselectTick,
+ windowSize,
+ displayGesture,
+ } = props;
+ const {t} = useTranslation();
+
+ const defaultGestureName = t('Untitled Gesture');
+ const defaultGestureDescription = t('Add Description');
+
+ const [pointers, setPointers] = useState(loadedGesture?.actions ?? DEFAULT_POINTER);
+ const [name, setName] = useState(loadedGesture?.name ?? defaultGestureName);
+ const [description, setDescription] = useState(
+ loadedGesture?.description ?? defaultGestureDescription,
+ );
+ const [coordType, setCoordType] = useState(POINTER_MOVE_COORDS_TYPE.PERCENTAGES);
+ const [activePointerId, setActivePointerId] = useState('1');
+
+ const onSave = () => {
+ const {id, date} = loadedGesture;
+ if (duplicatePointerNames(pointers)) {
+ return null;
+ }
+ const gesture = {
+ name,
+ description,
+ id,
+ date,
+ actions: getConvertedPointers(POINTER_MOVE_COORDS_TYPE.PERCENTAGES),
+ };
+ saveGesture(gesture);
+ displayNotificationMsg(NOTIF.SUCCESS, t('Gesture saved'));
+ };
+
+ const onSaveAs = () => {
+ if (duplicatePointerNames(pointers)) {
+ return null;
+ }
+ const gesture = {
+ name,
+ description,
+ actions: getConvertedPointers(POINTER_MOVE_COORDS_TYPE.PERCENTAGES),
+ };
+ saveGesture(gesture);
+ displayNotificationMsg(NOTIF.SUCCESS, t('Gesture saved as', {gestureName: name}));
+ onBack();
+ };
+
+ const onPlay = () => {
+ const {applyClientMethod} = props;
+ if (duplicatePointerNames(pointers)) {
+ return null;
+ }
+ const formattedPointers = getW3CPointers();
+ applyClientMethod({methodName: SCREENSHOT_INTERACTION_MODE.GESTURE, args: [formattedPointers]});
+ };
+
+ const onBack = () => {
+ const {hideGestureEditor, removeLoadedGesture, removeGestureDisplay} = props;
+ unselectTick();
+ removeGestureDisplay();
+ removeLoadedGesture();
+ hideGestureEditor();
+ };
+
+ // Check if pointer names are duplicates before saving/playing
+ const duplicatePointerNames = (localPointers) => {
+ const duplicates = {};
+ for (const pointer of localPointers) {
+ if (duplicates[pointer.name]) {
+ displayNotificationMsg(NOTIF.ERROR, t('Duplicate pointer names are not allowed'));
+ return true;
+ } else {
+ duplicates[pointer.name] = pointer;
+ }
+ }
+ return false;
+ };
+
+ const displayNotificationMsg = (type, msg) => {
+ notification[type]({
+ title: msg,
+ duration: 5,
+ });
+ };
+
+ // Change gesture datastructure to fit Webdriver spec
+ const getW3CPointers = () => {
+ const newPointers = {};
+ const currentPointers = getConvertedPointers(POINTER_MOVE_COORDS_TYPE.PIXELS);
+ for (const pointer of currentPointers) {
+ newPointers[pointer.name] = pointer.ticks.map((tick) => _.omit(tick, 'id'));
+ }
+ return newPointers;
+ };
+
+ // This converts all the coordinates in the gesture to px/%
+ const getConvertedPointers = useCallback(
+ (type) => {
+ const {width, height} = windowSize;
+ if (type === coordType) {
+ return pointers;
+ }
+ const newPointers = _.cloneDeep(pointers);
+ for (const pointer of newPointers) {
+ for (const tick of pointer.ticks) {
+ if (tick.type === POINTER_TYPES.POINTER_MOVE) {
+ if (type === POINTER_MOVE_COORDS_TYPE.PIXELS) {
+ tick.x = percentageToPixels(tick.x, width);
+ tick.y = percentageToPixels(tick.y, height);
+ } else {
+ tick.x = pixelsToPercentage(tick.x, width);
+ tick.y = pixelsToPercentage(tick.y, height);
+ }
+ }
+ }
+ }
+ return newPointers;
+ },
+ [coordType, pointers, windowSize],
+ );
+
+ const getDefaultMoveDuration = useCallback(
+ (ticks, tickId, x2, y2, coordFromTap) => {
+ const {width, height} = windowSize;
+ const ticksExceptCurrent = ticks.filter((tick) => tick.id !== tickId);
+ const prevPointerMoves = [];
+ for (const tick of ticksExceptCurrent) {
+ if (tick.type === POINTER_MOVE && tick.x !== undefined && tick.y !== undefined) {
+ prevPointerMoves.push({x: tick.x, y: tick.y});
+ }
+ }
+ const len = prevPointerMoves.length;
+ if (len === 0) {
+ return 0;
+ }
+ const obj = {x1: prevPointerMoves[len - 1].x, y1: prevPointerMoves[len - 1].y, x2, y2};
+ if (coordType === POINTER_MOVE_COORDS_TYPE.PERCENTAGES) {
+ obj.x1 = percentageToPixels(obj.x1, width);
+ obj.y1 = percentageToPixels(obj.y1, height);
+ // No need to convert coordinates from tap since they are in px
+ if (!coordFromTap) {
+ obj.x2 = percentageToPixels(obj.x2, width);
+ obj.y2 = percentageToPixels(obj.y2, height);
+ }
+ }
+ const calcLength = (v1, v2) => Math.sqrt(v1 ** 2 + v2 ** 2);
+ const calcDiff = (v1, v2) => Math.abs(v2) - Math.abs(v1);
+ const xDiff = calcDiff(obj.x1, obj.x2);
+ const yDiff = calcDiff(obj.y1, obj.y2);
+ const maxScreenLength = calcLength(width, height);
+ const lineLength = calcLength(xDiff, yDiff);
+ const lineLengthPct = lineLength / maxScreenLength;
+ return Math.round(lineLengthPct * POINTER_MOVE_DEFAULT_DURATION);
+ },
+ [coordType, windowSize],
+ );
+
+ // Update tapped coordinates within local state
+ const updateCoordinates = useCallback(
+ (tickKey, updateX, updateY) => {
+ if (!updateX || !updateY) {
+ return null;
+ }
+ const {width, height} = windowSize;
+ const copiedPointers = _.cloneDeep(pointers);
+ const currentPointer = copiedPointers.find((pointer) => pointer.id === tickKey[0]);
+ const currentTick = currentPointer.ticks.find((tick) => tick.id === tickKey);
+ const x = parseFloat(updateX);
+ const y = parseFloat(updateY);
+ if (coordType === POINTER_MOVE_COORDS_TYPE.PERCENTAGES) {
+ currentTick.x = pixelsToPercentage(x, width);
+ currentTick.y = pixelsToPercentage(y, height);
+ } else {
+ currentTick.x = x;
+ currentTick.y = y;
+ }
+
+ if (currentTick.duration === undefined) {
+ currentTick.duration = getDefaultMoveDuration(
+ currentPointer.ticks,
+ currentTick.id,
+ x,
+ y,
+ true,
+ );
+ }
+ setPointers(copiedPointers);
+ },
+ [coordType, getDefaultMoveDuration, pointers, windowSize],
+ );
+
+ const addPointer = () => {
+ const key = pointers.length + 1;
+ const pointerId = String(key);
+ const copiedPointers = _.cloneDeep(pointers);
+ copiedPointers.push({
+ name: `pointer${key}`,
+ ticks: [{id: `${key}.1`}],
+ id: pointerId,
+ color: POINTER_COLORS[key - 1],
+ });
+ setPointers(copiedPointers);
+ setActivePointerId(pointerId);
+ };
+
+ const deletePointer = (targetKey) => {
+ // 'newActivePointerId' variable keeps track of the previous pointer before deleting the current one
+ // its default is the first pointer
+ let newActivePointerId = '1';
+ const pointersExceptCurrent = pointers.filter((pointer) => pointer.id !== targetKey);
+ const newPointers = pointersExceptCurrent.map((pointer, index) => {
+ const id = String(index + 1);
+ if (id !== pointer.id) {
+ pointer.id = id;
+ pointer.color = POINTER_COLORS[index];
+ pointer.ticks = pointer.ticks.map((tick) => {
+ tick.id = `${id}.${tick.id[2]}`;
+ return tick;
+ });
+ } else {
+ newActivePointerId = pointer.id;
+ }
+ return pointer;
+ });
+ unselectTick();
+ setPointers(newPointers);
+ setActivePointerId(newActivePointerId);
+ };
+
+ const addTick = (pointerKey) => {
+ const copiedPointers = _.cloneDeep(pointers);
+ const currentPointer = copiedPointers.find((pointer) => pointer.id === pointerKey);
+ const id = `${pointerKey}.${currentPointer.ticks.length + 1}`;
+ currentPointer.ticks.push({id});
+ setPointers(copiedPointers);
+ };
+
+ const deleteTick = (pointerKey, tickKey) => {
+ const copiedPointers = _.cloneDeep(pointers);
+ const currentPointer = copiedPointers.find((pointer) => pointer.id === pointerKey);
+ const ticksToKeep = currentPointer.ticks.filter((tick) => tick.id !== tickKey);
+ const newTicks = ticksToKeep.map((tick, index) => {
+ const id = String(index + 1);
+ if (tick.id !== id) {
+ tick.id = `${tick.id[0]}.${id}`;
+ }
+ return tick;
+ });
+ currentPointer.ticks = newTicks;
+ unselectTick();
+ setPointers(copiedPointers);
+ };
+
+ // Updates the current tick within local state
+ const updateTick = (tick, msg, value) => {
+ const copiedPointers = _.cloneDeep(pointers);
+ const currentPointer = copiedPointers.find((p) => p.id === tick.id[0]);
+ const targetTickIdx = currentPointer.ticks.findIndex((t) => t.id === tick.id);
+ // currentTick can be assigned a new tick object if made changes to pointer types
+ let currentTick = currentPointer.ticks[targetTickIdx];
+
+ // We create an entire new tick for changes in pointer types to ensure previous properties are removed
+ if (msg === TICK_PROPS.POINTER_TYPE) {
+ if (value === POINTER_MOVE) {
+ selectTick(tick.id);
+ }
+ currentTick = {
+ id: tick.id,
+ type: value,
+ ...([POINTER_DOWN, POINTER_UP].includes(value) && {button: POINTER_DOWN_BTNS.LEFT}),
+ ...(value === PAUSE && {duration: 0}),
+ };
+ } else {
+ // We just modify the existing tick values
+ currentTick[msg] = parseFloat(value);
+
+ // set default duration for if not set already
+ if (
+ currentTick.x !== undefined &&
+ currentTick.y !== undefined &&
+ currentTick.duration === undefined
+ ) {
+ currentTick.duration = getDefaultMoveDuration(
+ currentPointer.ticks,
+ tick.id,
+ currentTick.x,
+ currentTick.y,
+ false,
+ );
+ }
+ }
+
+ currentPointer.ticks[targetTickIdx] = currentTick;
+ setPointers(copiedPointers);
+ };
+
+ // Reformats the gesture only for the timeline by populating the 'filler' ticks for each pointer
+ // to match same length to keep timeline lengths consistent and accurate
+ const updateGestureForTimeline = () => {
+ const copiedPointers = _.cloneDeep(pointers);
+ const allTickLengths = copiedPointers.map((pointer) => pointer.ticks.length);
+ const maxTickLength = Math.max(...allTickLengths);
+ return copiedPointers.map((pointer) => {
+ const currentLength = pointer.ticks.length;
+ if (currentLength > 0 && currentLength < maxTickLength) {
+ const fillers = Array.from({length: maxTickLength - currentLength}, () => ({
+ type: FILLER,
+ }));
+ pointer.ticks.push(...fillers);
+ }
+ return pointer;
+ });
+ };
+
+ const updatePointerName = (pointerName, pointerIndex) => {
+ const copiedPointers = _.cloneDeep(pointers);
+ copiedPointers[pointerIndex].name = pointerName;
+ setPointers(copiedPointers);
+ };
+
+ // Draw gesture whenever pointers change
+ useEffect(() => {
+ const convertedPointers = getConvertedPointers(POINTER_MOVE_COORDS_TYPE.PIXELS);
+ displayGesture(convertedPointers);
+ }, [displayGesture, getConvertedPointers, pointers]);
+
+ // Retrieve coordinates when user taps screenshot
+ // Defer state updates to the next animation frame to avoid synchronous setState in effect
+ useEffect(() => {
+ if (!tickCoordinates || !selectedTick) {
+ return;
+ }
+ let rafId = requestAnimationFrame(() => {
+ updateCoordinates(selectedTick, tickCoordinates.x, tickCoordinates.y);
+ });
+ return () => cancelAnimationFrame(rafId);
+ }, [selectedTick, tickCoordinates, updateCoordinates]);
+
+ const headerTitle = (
+
+ setName(e.target.value)}
+ size="small"
+ />
+
+ );
+
+ const headerButtons = (
+
+
+
+ {
+ setPointers(getConvertedPointers(POINTER_MOVE_COORDS_TYPE.PERCENTAGES));
+ setCoordType(POINTER_MOVE_COORDS_TYPE.PERCENTAGES);
+ }}
+ >
+ %
+
+
+
+ {
+ setPointers(getConvertedPointers(POINTER_MOVE_COORDS_TYPE.PIXELS));
+ setCoordType(POINTER_MOVE_COORDS_TYPE.PIXELS);
+ }}
+ >
+ px
+
+
+
+
+ } onClick={() => onPlay()} />
+
+
+ onSaveAs()}>{t('saveAs')}
+ onSave()} disabled={!loadedGesture}>
+ {t('Save')}
+
+
+
+ );
+
+ const headerDescription = (
+
+
+ setDescription(e.target.value)}
+ size="small"
+ />
+
+
+ );
+
+ const header = (
+ <>
+
+
+ } onClick={() => onBack()} />
+
+ {headerTitle}
+ {headerButtons}
+
+ {headerDescription}
+ >
+ );
+
+ const regularTimelineIcon = (tick) => {
+ const {type, duration, button, x, y} = tick;
+ return (
+ {t(POINTER_TYPES_MAP[type])}}
+ content={
+
+ {duration !== undefined && (
+
+ {t('Duration')}: {duration}ms
+
+ )}
+ {button !== undefined && (
+
+ {t('Button')}: {button === POINTER_DOWN_BTNS.LEFT ? t('Left') : t('Right')}
+
+ )}
+ {x !== undefined && (
+
+ X: {x}
+ {coordType === POINTER_MOVE_COORDS_TYPE.PIXELS ? 'px' : '%'}
+
+ )}
+ {y !== undefined && (
+
+ Y: {y}
+ {coordType === POINTER_MOVE_COORDS_TYPE.PIXELS ? 'px' : '%'}
+
+ )}
+ {type === undefined &&
{t('Action Type Not Defined')}
}
+
+ }
+ >
+ {type === POINTER_MOVE && }
+ {type === POINTER_DOWN && }
+ {type === POINTER_UP && }
+ {type === PAUSE && }
+ {type === undefined && }
+
+ );
+ };
+
+ const timeline = updateGestureForTimeline().map((pointer) => (
+
+
+ tick.type !== FILLER
+ ? {
+ status: 'finish',
+ icon: regularTimelineIcon(tick),
+ }
+ : {
+ status: 'wait',
+ icon: ,
+ },
+ )}
+ />
+
+ ));
+
+ const tickButton = (tick) => (
+
+
+ updateTick(tick, TICK_PROPS.BUTTON, POINTER_DOWN_BTNS.LEFT)}
+ >
+ {t('Left')}
+
+ updateTick(tick, TICK_PROPS.BUTTON, POINTER_DOWN_BTNS.RIGHT)}
+ >
+ {t('Right')}
+
+
+
+ );
+
+ const tickDuration = (tick) => (
+
+
+ updateTick(tick, TICK_PROPS.DURATION, e.target.value)}
+ />
+ ms
+
+
+ );
+
+ const tickCoords = (tick) => (
+
+
+ updateTick(tick, TICK_PROPS.X, e.target.value)}
+ />
+ updateTick(tick, TICK_PROPS.Y, e.target.value)}
+ />
+
+
+ );
+
+ const tickType = (tick) => (
+
+ updateTick(tick, TICK_PROPS.POINTER_TYPE, e)}
+ options={[
+ {value: POINTER_MOVE, label: t(POINTER_TYPES_MAP.pointerMove)},
+ {value: POINTER_DOWN, label: t(POINTER_TYPES_MAP.pointerDown)},
+ {value: POINTER_UP, label: t(POINTER_TYPES_MAP.pointerUp)},
+ {value: PAUSE, label: t(POINTER_TYPES_MAP.pause)},
+ ]}
+ />
+
+ );
+
+ const tapCoordinatesBtn = (tickId) => (
+
+ }
+ onClick={() => (selectedTick === tickId ? unselectTick() : selectTick(tickId))}
+ />
+
+ );
+
+ const tickCard = (tick) => (
+
+ {tick.type === POINTER_MOVE && tapCoordinatesBtn(tick.id)}
+
+ }
+ onClick={() => deleteTick(tick.id[0], tick.id)}
+ />
+
+ >
+ }
+ >
+
+ {tickType(tick)}
+ {(tick.type === POINTER_MOVE || tick.type === PAUSE) && tickDuration(tick)}
+ {(tick.type === POINTER_DOWN || tick.type === POINTER_UP) && tickButton(tick)}
+ {tick.type === POINTER_MOVE && tickCoords(tick)}
+
+
+ );
+
+ const pointerTicksGrid = (pointer) => (
+
+ {pointer.ticks.map((tick) => (
+
+ {tickCard(tick)}
+
+ ))}
+
+
+
+ } onClick={() => addTick(pointer.id)} />
+
+
+
+
+ );
+
+ const pointerTabs = pointers.map((pointer, index) => ({
+ label: (
+
+ updatePointerName(e.target.value, index)}
+ />
+
+ ),
+ key: pointer.id,
+ closable: pointer.id !== '1',
+ children: pointerTicksGrid(pointer),
+ }));
+
+ return (
+
+
+ {t('Gesture Builder')}
+
+ }
+ className={inspectorStyles.interactionTabCard}
+ >
+ {header}
+
+ {timeline}
+
+ setActivePointerId(pointerId)}
+ activeKey={activePointerId}
+ onEdit={(targetKey, action) =>
+ action === TABLE_TAB.ADD ? addPointer() : deletePointer(targetKey)
+ }
+ hideAdd={pointers.length === 5}
+ centered={true}
+ tabBarGutter={10}
+ items={pointerTabs}
+ />
+
+ );
+};
+
+export default GestureEditor;
diff --git a/app/common/renderer/components/SessionInspector/GesturesTab/Gestures.module.css b/app/common/renderer/components/SessionInspector/GesturesTab/Gestures.module.css
new file mode 100644
index 0000000000..773b78c7f6
--- /dev/null
+++ b/app/common/renderer/components/SessionInspector/GesturesTab/Gestures.module.css
@@ -0,0 +1,82 @@
+.gestureHeaderTitle {
+ font-size: 18px;
+ font-weight: 500;
+ box-shadow: none !important;
+ border-width: 0px !important;
+}
+
+.gestureHeaderDescription {
+ padding-left: 32px;
+}
+
+.gestureHeaderDescriptionInput {
+ font-size: 15px;
+ font-weight: 400;
+ color: #636363;
+ box-shadow: none !important;
+ border-width: 0px !important;
+}
+
+.gestureEditorDivider {
+ margin: 10px 0;
+}
+
+.timelineTickTitle {
+ text-align: center;
+}
+
+.gestureTimeline {
+ width: 90%;
+ margin: -10px 0;
+ min-height: 32px;
+}
+
+.gestureTimeline :global(.ant-steps-item-finish .ant-steps-item-icon),
+.gestureTimeline :global(.ant-steps-item-rail-finish) {
+ color: var(--timelineColor);
+ border-color: var(--timelineColor);
+}
+
+.gestureTimeline :global(.ant-steps-item-wait .ant-steps-item-icon),
+.gestureTimeline :global(.ant-steps-item-rail-wait) {
+ color: #ffffff;
+ border-color: #ffffff;
+}
+
+:global(.dark) .gestureTimeline :global(.ant-steps-item-wait .ant-steps-item-icon),
+:global(.dark) .gestureTimeline :global(.ant-steps-item-rail-wait) {
+ color: #141414;
+ border-color: #141414;
+}
+
+.tickInputBox {
+ display: block;
+ text-align: center;
+}
+
+.tickCard :global(.ant-card-head) {
+ min-height: unset;
+ padding: 0px;
+ border-bottom: none;
+}
+
+.tickCard :global(.ant-card-body) {
+ padding-top: 6px;
+ height: calc(100% - 25px);
+}
+
+.tickPlusBtnWrapper {
+ height: 100%;
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ align-items: center;
+}
+
+.pointerTitle {
+ max-width: 65px;
+ padding: 0 0 0 0;
+ text-align: center;
+ text-decoration: underline;
+ text-decoration-thickness: 20%;
+}
diff --git a/app/common/renderer/components/SessionInspector/GesturesTab/SavedGestures.jsx b/app/common/renderer/components/SessionInspector/GesturesTab/SavedGestures.jsx
new file mode 100644
index 0000000000..d7784d0543
--- /dev/null
+++ b/app/common/renderer/components/SessionInspector/GesturesTab/SavedGestures.jsx
@@ -0,0 +1,201 @@
+import {
+ IconEdit,
+ IconFileExport,
+ IconHandMove,
+ IconPlayerPlay,
+ IconPlus,
+ IconTrash,
+} from '@tabler/icons-react';
+import {Button, Card, Flex, Popconfirm, Space, Spin, Table, Tooltip} from 'antd';
+import dayjs from 'dayjs';
+import _ from 'lodash';
+import {useEffect} from 'react';
+import {useTranslation} from 'react-i18next';
+
+import {POINTER_TYPES, SAVED_GESTURE_PROPS} from '../../../constants/gestures.js';
+import {SCREENSHOT_INTERACTION_MODE} from '../../../constants/screenshot.js';
+import {percentageToPixels} from '../../../utils/other.js';
+import FileUploader from '../../FileUploader.jsx';
+import inspectorStyles from '../SessionInspector.module.css';
+
+const dataSource = (savedGestures, t) => {
+ if (!savedGestures) {
+ return [];
+ }
+ return savedGestures.map((gesture) => ({
+ key: gesture.id,
+ Name: gesture.name || t('unnamed'),
+ Created: dayjs(gesture.date).format('YYYY-MM-DD'),
+ Description: gesture.description || t('No Description'),
+ }));
+};
+
+const getGestureByID = (savedGestures, id, t) => {
+ for (const gesture of savedGestures) {
+ if (gesture.id === id) {
+ return gesture;
+ }
+ }
+ throw new Error(t('couldNotFindEntryWithId', {id}));
+};
+
+const SavedGestures = (props) => {
+ const {
+ savedGestures,
+ showGestureEditor,
+ displayGesture,
+ removeGestureDisplay,
+ getSavedGestures,
+ isUploadingGestureFiles,
+ importGestureFiles,
+ exportSavedGesture,
+ } = props;
+ const {t} = useTranslation();
+
+ const onRowMouseOver = (rowKey) => ({
+ onMouseEnter: () => {
+ const gesture = getGestureByID(savedGestures, rowKey, t);
+ const pointers = convertCoordinates(gesture.actions);
+ displayGesture(pointers);
+ },
+ onMouseLeave: () => {
+ removeGestureDisplay();
+ },
+ });
+
+ const loadSavedGesture = (gesture) => {
+ const {setLoadedGesture} = props;
+ setLoadedGesture(gesture);
+ showGestureEditor();
+ };
+
+ const handleDelete = (id) => {
+ const {deleteSavedGesture} = props;
+ removeGestureDisplay();
+ deleteSavedGesture(id);
+ };
+
+ const onPlay = (gesture) => {
+ const {applyClientMethod} = props;
+ const pointers = convertCoordinates(gesture.actions);
+ const actions = formatGesture(pointers);
+ applyClientMethod({methodName: SCREENSHOT_INTERACTION_MODE.GESTURE, args: [actions]});
+ };
+
+ const formatGesture = (pointers) => {
+ const actions = {};
+ for (const pointer of pointers) {
+ actions[pointer.name] = pointer.ticks.map((tick) => _.omit(tick, 'id'));
+ }
+ return actions;
+ };
+
+ const convertCoordinates = (pointers) => {
+ const {windowSize} = props;
+ const newPointers = JSON.parse(JSON.stringify(pointers));
+ for (const pointer of newPointers) {
+ for (const tick of pointer.ticks) {
+ if (tick.type === POINTER_TYPES.POINTER_MOVE) {
+ tick.x = percentageToPixels(tick.x, windowSize.width);
+ tick.y = percentageToPixels(tick.y, windowSize.height);
+ }
+ }
+ }
+ return newPointers;
+ };
+
+ const columns = Object.keys(SAVED_GESTURE_PROPS).map((key) => {
+ if (SAVED_GESTURE_PROPS[key] === SAVED_GESTURE_PROPS.ACTIONS) {
+ return {
+ title: t(SAVED_GESTURE_PROPS[key]),
+ key: SAVED_GESTURE_PROPS[key],
+ render: (_, record) => {
+ const gesture = getGestureByID(savedGestures, record.key, t);
+ return (
+
+
+ }
+ onClick={() => onPlay(gesture)}
+ />
+
+
+ } onClick={() => loadSavedGesture(gesture)} />
+
+
+ }
+ onClick={() => exportSavedGesture(gesture)}
+ />
+
+
+ handleDelete(gesture.id)}
+ >
+ } />
+
+
+
+ );
+ },
+ };
+ } else {
+ return {
+ title: t(SAVED_GESTURE_PROPS[key]),
+ dataIndex: SAVED_GESTURE_PROPS[key],
+ key: SAVED_GESTURE_PROPS[key],
+ };
+ }
+ });
+
+ useEffect(() => {
+ getSavedGestures();
+ }, [getSavedGestures]);
+
+ return (
+
+
+ {t('Saved Gestures')}
+
+ }
+ className={inspectorStyles.interactionTabCard}
+ >
+
+ {t('gesturesDescription')}
+
+ onRowMouseOver(row.key)}
+ pagination={false}
+ dataSource={dataSource(savedGestures, t)}
+ columns={columns}
+ scroll={{y: 'calc(100vh - 32em)'}}
+ footer={() => (
+
+ }>
+ {t('Create New Gesture')}
+
+
+
+ )}
+ />
+
+
+
+ );
+};
+
+export default SavedGestures;
diff --git a/app/common/renderer/components/SessionInspector/Header/ElementLocator.jsx b/app/common/renderer/components/SessionInspector/Header/ElementLocator.jsx
new file mode 100644
index 0000000000..3e9fbdf9d8
--- /dev/null
+++ b/app/common/renderer/components/SessionInspector/Header/ElementLocator.jsx
@@ -0,0 +1,82 @@
+import {Alert, Button, Input, Row, Space} from 'antd';
+import {useTranslation} from 'react-i18next';
+
+import {ALERT, BUTTON} from '../../../constants/antd-types.js';
+import {DRIVERS} from '../../../constants/common.js';
+import {
+ NATIVE_APP,
+ NATIVE_COMMON_LOCATOR_STRATEGY_MAP,
+ NATIVE_DRIVER_LOCATOR_STRATEGY_MAP,
+ WEB_LOCATOR_STRATEGY_MAP,
+} from '../../../constants/session-inspector.js';
+import inspectorStyles from '../SessionInspector.module.css';
+import styles from './Header.module.css';
+
+const locatorStrategies = (automationName, currentContext) => {
+ if (currentContext && currentContext !== NATIVE_APP) {
+ return Object.values(WEB_LOCATOR_STRATEGY_MAP);
+ }
+ const strategies = Object.values(NATIVE_COMMON_LOCATOR_STRATEGY_MAP);
+ switch (automationName) {
+ case DRIVERS.XCUITEST:
+ case DRIVERS.MAC2:
+ strategies.push(
+ NATIVE_DRIVER_LOCATOR_STRATEGY_MAP.PREDICATE,
+ NATIVE_DRIVER_LOCATOR_STRATEGY_MAP.CLASS_CHAIN,
+ );
+ break;
+ case DRIVERS.ESPRESSO:
+ strategies.push(
+ NATIVE_DRIVER_LOCATOR_STRATEGY_MAP.DATAMATCHER,
+ NATIVE_DRIVER_LOCATOR_STRATEGY_MAP.VIEWTAG,
+ );
+ break;
+ case DRIVERS.UIAUTOMATOR2:
+ strategies.push(NATIVE_DRIVER_LOCATOR_STRATEGY_MAP.UIAUTOMATOR);
+ break;
+ }
+ return strategies;
+};
+
+const ElementLocator = (props) => {
+ const {
+ setLocatorTestValue,
+ locatorTestValue,
+ setLocatorTestStrategy,
+ locatorTestStrategy,
+ automationName,
+ currentContext,
+ } = props;
+ const {t} = useTranslation();
+
+ return (
+
+ {t('locatorStrategy')}
+
+ {locatorStrategies(automationName, currentContext).map(([strategyValue, strategyName]) => (
+ setLocatorTestStrategy(strategyValue)}
+ key={strategyValue}
+ >
+ {strategyName}
+
+ ))}
+
+ {!automationName && (
+
+ )}
+ {t('selector')}
+ setLocatorTestValue(e.target.value)}
+ value={locatorTestValue}
+ allowClear={true}
+ rows={3}
+ />
+
+ );
+};
+
+export default ElementLocator;
diff --git a/app/common/renderer/components/SessionInspector/Header/Header.module.css b/app/common/renderer/components/SessionInspector/Header/Header.module.css
new file mode 100644
index 0000000000..cbe5c7dfbb
--- /dev/null
+++ b/app/common/renderer/components/SessionInspector/Header/Header.module.css
@@ -0,0 +1,70 @@
+.locatorStrategyBtn {
+ margin: 2px;
+ min-width: 24%;
+ max-width: 49%;
+ flex-grow: 1;
+}
+
+.locatorSelectorTextArea {
+ width: 100%;
+}
+
+.locatorSelectorTextArea textarea {
+ font-family: monospace;
+}
+
+.wideTooltip {
+ max-width: 400px;
+}
+
+.headerButtons {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ padding: 10px 0;
+ gap: 10px;
+ width: 100%;
+ height: 50px;
+ -webkit-app-region: drag;
+}
+
+.headerButtons :global(.ant-divider-horizontal) {
+ margin: 0px;
+}
+
+.headerButtons .ant-btn {
+ height: auto !important;
+ width: auto !important;
+}
+
+.headerButtons :global(.ant-space-item) {
+ -webkit-app-region: no-drag;
+}
+
+.searchResultsList {
+ width: 100%;
+ flex: 1;
+ min-height: 24px;
+ max-height: 150px;
+ overflow: auto;
+ border-style: solid;
+ border-width: 1px;
+ border-color: #303030;
+ border-radius: 6px 6px 0 0;
+}
+
+.searchResultsList :global(.ant-table-cell) {
+ padding: 4px 6px !important;
+ height: 25px;
+ text-align: left;
+ font-family: monospace;
+}
+
+.searchResultsActions {
+ width: 350px;
+}
+
+.searchResultsKeyInput {
+ height: 32px;
+ width: calc(100% - 64px);
+}
diff --git a/app/common/renderer/components/SessionInspector/Header/HeaderButtons.jsx b/app/common/renderer/components/SessionInspector/Header/HeaderButtons.jsx
new file mode 100644
index 0000000000..e4791da29e
--- /dev/null
+++ b/app/common/renderer/components/SessionInspector/Header/HeaderButtons.jsx
@@ -0,0 +1,310 @@
+import {
+ IconCarouselHorizontal,
+ IconChevronLeft,
+ IconCircle,
+ IconExclamationCircle,
+ IconHome,
+ IconInfoCircle,
+ IconMessageChatbot,
+ IconPlayerPause,
+ IconPlayerPlay,
+ IconPlugConnectedX,
+ IconRecycle,
+ IconRefresh,
+ IconSearch,
+ IconSquare,
+ IconTriangleSquareCircle,
+ IconVideo,
+ IconWorld,
+ IconX,
+} from '@tabler/icons-react';
+import {Button, Divider, Select, Space, Tooltip} from 'antd';
+import {useTranslation} from 'react-i18next';
+
+import {BUTTON} from '../../../constants/antd-types.js';
+import {DRIVERS, LINKS} from '../../../constants/common.js';
+import {APP_MODE} from '../../../constants/session-inspector.js';
+import {openLink} from '../../../polyfills.js';
+import styles from './Header.module.css';
+import LocatorTestModal from './LocatorTestModal.jsx';
+import SiriCommandModal from './SiriCommandModal.jsx';
+
+const HeaderButtons = (props) => {
+ const {
+ selectAppMode,
+ appMode,
+ isUsingMjpegMode,
+ isSourceRefreshOn,
+ setRefreshingState,
+ isRecording,
+ startRecording,
+ pauseRecording,
+ showLocatorTestModal,
+ showSiriCommandModal,
+ applyClientMethod,
+ quitSessionAndReturn,
+ driver,
+ contexts,
+ currentContext,
+ setContext,
+ autoSessionRestart,
+ toggleAutoSessionRestart,
+ toggleMultiDisplayMode,
+ displays,
+ setCurrentDisplayId,
+ currentDisplayId,
+ automationName,
+ } = props;
+ const {t} = useTranslation();
+
+ const deviceControls = (
+
+ {driver && driver.isIOS && (
+ <>
+
+ }
+ onClick={() =>
+ applyClientMethod({
+ methodName: 'executeScript',
+ args: ['mobile:pressButton', [{name: 'home'}]],
+ })
+ }
+ />
+
+
+ }
+ onClick={showSiriCommandModal}
+ />
+
+ >
+ )}
+ {driver && driver.isAndroid && (
+ <>
+
+ }
+ onClick={() =>
+ applyClientMethod({
+ methodName: 'executeScript',
+ args: ['mobile:pressKey', [{keycode: 4}]],
+ })
+ }
+ />
+
+
+ }
+ onClick={() =>
+ applyClientMethod({
+ methodName: 'executeScript',
+ args: ['mobile:pressKey', [{keycode: 3}]],
+ })
+ }
+ />
+
+
+ }
+ onClick={() =>
+ applyClientMethod({
+ methodName: 'executeScript',
+ args: ['mobile:pressKey', [{keycode: 187}]],
+ })
+ }
+ />
+
+ >
+ )}
+
+ );
+
+ const displayControls = (
+
+
+ }
+ type={displays ? BUTTON.PRIMARY : BUTTON.DEFAULT}
+ onClick={() => toggleMultiDisplayMode(displays)}
+ />
+
+ {displays && (
+ value !== currentDisplayId && setCurrentDisplayId(value)}
+ options={displays.map(({id, name}) => ({
+ value: id,
+ label: name ? `${name} (ID ${id})` : id,
+ }))}
+ />
+ )}
+
+ );
+
+ const appModeControls = (
+
+
+ }
+ onClick={() => selectAppMode(APP_MODE.NATIVE)}
+ type={appMode === APP_MODE.NATIVE ? BUTTON.PRIMARY : BUTTON.DEFAULT}
+ />
+
+
+ }
+ onClick={() => selectAppMode(APP_MODE.WEB_HYBRID)}
+ type={appMode === APP_MODE.WEB_HYBRID ? BUTTON.PRIMARY : BUTTON.DEFAULT}
+ />
+
+ {contexts && contexts.length === 1 && (
+
+ }
+ styles={{root: {backgroundColor: '#faad14', color: '#ffffff'}}}
+ />
+
+ )}
+ {contexts && contexts.length > 1 && (
+ <>
+ {
+ setContext(value);
+ applyClientMethod({methodName: 'switchAppiumContext', args: [value]});
+ }}
+ options={contexts.map(({id, title}) => ({
+ value: id,
+ label: title ? `${title} (${id})` : id,
+ }))}
+ />
+
+ {t('contextDropdownInfo')}{' '}
+ e.preventDefault() || openLink(LINKS.HYBRID_MODE_DOCS)}>
+ {LINKS.HYBRID_MODE_DOCS}
+
+ >
+ }
+ classNames={{root: styles.wideTooltip}}
+ >
+ }
+ styles={{root: {backgroundColor: 'var(--ant-color-primary)', color: '#ffffff'}}}
+ />
+
+ >
+ )}
+
+ );
+
+ const generalControls = (
+
+ {isUsingMjpegMode && !isSourceRefreshOn && (
+
+ }
+ onClick={() => setRefreshingState({source: true})}
+ />
+
+ )}
+ {isUsingMjpegMode && isSourceRefreshOn && (
+
+ }
+ onClick={() => setRefreshingState({source: false})}
+ />
+
+ )}
+
+ }
+ onClick={() => applyClientMethod({methodName: 'getPageSource'})}
+ />
+
+
+ }
+ onClick={showLocatorTestModal}
+ />
+
+ {!isRecording && (
+
+ } onClick={startRecording} />
+
+ )}
+ {isRecording && (
+
+ }
+ type={BUTTON.PRIMARY}
+ danger
+ onClick={pauseRecording}
+ />
+
+ )}
+
+ );
+
+ const quitControls = (
+
+
+ }
+ onClick={() => quitSessionAndReturn({detachOnly: true})}
+ />
+
+
+ } onClick={quitSessionAndReturn} />
+
+
+ );
+
+ const sessionReloadButton = (
+
+ }
+ type={autoSessionRestart ? BUTTON.PRIMARY : undefined}
+ onClick={toggleAutoSessionRestart}
+ />
+
+ );
+
+ return (
+
+
+ {deviceControls}
+ {automationName === DRIVERS.UIAUTOMATOR2 && displayControls}
+ {appModeControls}
+ {generalControls}
+ {sessionReloadButton}
+ {quitControls}
+
+
+
+
+
+ );
+};
+
+export default HeaderButtons;
diff --git a/app/common/renderer/components/SessionInspector/Header/LocatedElements.jsx b/app/common/renderer/components/SessionInspector/Header/LocatedElements.jsx
new file mode 100644
index 0000000000..e9434bbc2a
--- /dev/null
+++ b/app/common/renderer/components/SessionInspector/Header/LocatedElements.jsx
@@ -0,0 +1,172 @@
+import {IconEraser, IconFocus2, IconListSearch, IconSend2} from '@tabler/icons-react';
+import {Alert, Badge, Button, Col, Input, Row, Space, Spin, Table, Tooltip} from 'antd';
+import {useRef} from 'react';
+import {useTranslation} from 'react-i18next';
+
+import {ALERT} from '../../../constants/antd-types.js';
+import inspectorStyles from '../SessionInspector.module.css';
+import styles from './Header.module.css';
+
+const LocatedElements = (props) => {
+ const {
+ locatedElements,
+ locatedElementsExecutionTime,
+ applyClientMethod,
+ setLocatorTestElement,
+ locatorTestElement,
+ isFindingLocatedElementInSource,
+ searchedForElementBounds,
+ selectLocatedElement,
+ sourceJSON,
+ sourceXML,
+ locatorTestStrategy,
+ locatorTestValue,
+ } = props;
+ const {t} = useTranslation();
+
+ const sendKeysRef = useRef(null);
+
+ const showIdAutocompleteInfo = () => {
+ const {automationName, sessionSettings} = props;
+ if (
+ automationName === 'uiautomator2' &&
+ locatorTestStrategy === 'id' &&
+ !locatorTestValue.includes(':id/') &&
+ !sessionSettings.disableIdLocatorAutocompletion
+ ) {
+ return (
+
+
+
+ );
+ }
+ };
+
+ return (
+ <>
+ {locatedElements.length === 0 && (
+
+
+ {t('couldNotFindAnyElements')}
+
+
+ {t('locatorStrategy')}
+
+ {locatorTestStrategy}
+
+
+
+ {t('selector')}
+
+ {locatorTestValue}
+
+
+ {showIdAutocompleteInfo()}
+
+ )}
+ {locatedElements.length > 0 && (
+
+
+
+
+ {t('elementsCount')}
+
+ <>
+ {t('Time')}: {locatedElementsExecutionTime}
+ >
+
+
+ ({
+ key: elementId,
+ id: elementId,
+ }))}
+ columns={[
+ {
+ dataIndex: 'id',
+ },
+ ]}
+ showHeader={false}
+ onRow={(row) => ({
+ onClick: () => locatorTestElement !== row.key && setLocatorTestElement(row.key),
+ })}
+ rowSelection={{
+ selectedRowKeys: [locatorTestElement],
+ hideSelectAll: true,
+ columnWidth: 0,
+ renderCell: () => null,
+ }}
+ />
+
+
+
+
+ }
+ onClick={() =>
+ selectLocatedElement(
+ sourceJSON,
+ sourceXML,
+ searchedForElementBounds,
+ locatorTestElement,
+ )
+ }
+ />
+
+
+ }
+ onClick={() =>
+ applyClientMethod({methodName: 'elementClick', elementId: locatorTestElement})
+ }
+ />
+
+
+ (sendKeysRef.current = e.target.value)}
+ />
+
+ }
+ onClick={() =>
+ applyClientMethod({
+ methodName: 'elementSendKeys',
+ elementId: locatorTestElement,
+ args: [sendKeysRef.current || ''],
+ })
+ }
+ />
+
+
+ }
+ onClick={() =>
+ applyClientMethod({
+ methodName: 'elementClear',
+ elementId: locatorTestElement,
+ })
+ }
+ />
+
+
+
+
+
+
+ )}
+ >
+ );
+};
+
+export default LocatedElements;
diff --git a/app/renderer/components/Inspector/LocatorTestModal.js b/app/common/renderer/components/SessionInspector/Header/LocatorTestModal.jsx
similarity index 79%
rename from app/renderer/components/Inspector/LocatorTestModal.js
rename to app/common/renderer/components/SessionInspector/Header/LocatorTestModal.jsx
index 2a06ae87fc..f5ba1fd0fb 100644
--- a/app/renderer/components/Inspector/LocatorTestModal.js
+++ b/app/common/renderer/components/SessionInspector/Header/LocatorTestModal.jsx
@@ -1,17 +1,13 @@
import {Button, Modal} from 'antd';
-import React from 'react';
+import {useTranslation} from 'react-i18next';
-import ElementLocator from './ElementLocator';
-import LocatedElements from './LocatedElements';
+import ElementLocator from './ElementLocator.jsx';
+import LocatedElements from './LocatedElements.jsx';
const LocatorTestModal = (props) => {
- const {
- isLocatorTestModalVisible,
- isSearchingForElements,
- clearSearchResults,
- locatedElements,
- t,
- } = props;
+ const {isLocatorTestModalVisible, isSearchingForElements, clearSearchResults, locatedElements} =
+ props;
+ const {t} = useTranslation();
const onCancel = () => {
const {hideLocatorTestModal} = props;
diff --git a/app/renderer/components/Inspector/SiriCommandModal.js b/app/common/renderer/components/SessionInspector/Header/SiriCommandModal.jsx
similarity index 91%
rename from app/renderer/components/Inspector/SiriCommandModal.js
rename to app/common/renderer/components/SessionInspector/Header/SiriCommandModal.jsx
index f48803b316..12eed45f25 100644
--- a/app/renderer/components/Inspector/SiriCommandModal.js
+++ b/app/common/renderer/components/SessionInspector/Header/SiriCommandModal.jsx
@@ -1,8 +1,9 @@
import {Button, Input, Modal, Row} from 'antd';
-import React from 'react';
+import {useTranslation} from 'react-i18next';
const SiriCommandModal = (props) => {
- const {siriCommandValue, setSiriCommandValue, isSiriCommandModalVisible, t} = props;
+ const {siriCommandValue, setSiriCommandValue, isSiriCommandModalVisible} = props;
+ const {t} = useTranslation();
const onSubmit = () => {
const {applyClientMethod} = props;
diff --git a/app/common/renderer/components/SessionInspector/RecorderTab/Recorder.jsx b/app/common/renderer/components/SessionInspector/RecorderTab/Recorder.jsx
new file mode 100644
index 0000000000..b30c69aa0b
--- /dev/null
+++ b/app/common/renderer/components/SessionInspector/RecorderTab/Recorder.jsx
@@ -0,0 +1,85 @@
+import {IconEraser, IconEyeCode, IconFiles, IconVideo} from '@tabler/icons-react';
+import {Button, Card, Flex, Select, Space, Tooltip} from 'antd';
+import _ from 'lodash';
+import {useTranslation} from 'react-i18next';
+import {Refractor} from 'react-refractor';
+
+import {BUTTON} from '../../../constants/antd-types.js';
+import {CLIENT_FRAMEWORK_MAP} from '../../../lib/client-frameworks/map.js';
+import {copyToClipboard} from '../../../utils/other.js';
+import inspectorStyles from '../SessionInspector.module.css';
+import styles from './Recorder.module.css';
+
+const Recorder = (props) => {
+ const {showBoilerplate, recordedActions, clientFramework} = props;
+ const {t} = useTranslation();
+
+ const ClientFrameworkClass = CLIENT_FRAMEWORK_MAP[clientFramework];
+
+ const getCode = () => {
+ const {serverDetails, sessionCaps} = props;
+ const {serverUrl, serverUrlParts} = serverDetails;
+
+ const framework = new ClientFrameworkClass(serverUrl, serverUrlParts, sessionCaps);
+ framework.actions = recordedActions;
+ return framework.getCodeString(showBoilerplate);
+ };
+
+ const actionBar = () => {
+ const {setClientFramework, toggleShowBoilerplate, clearRecording} = props;
+
+ return (
+
+ {!!recordedActions.length && (
+
+
+ }
+ type={showBoilerplate ? BUTTON.PRIMARY : BUTTON.DEFAULT}
+ />
+
+
+ } onClick={() => copyToClipboard(getCode())} />
+
+
+ } onClick={clearRecording} />
+
+
+ )}
+ ({
+ value: fwId,
+ label: fwClass.readableName,
+ }))}
+ />
+
+ );
+ };
+
+ return (
+
+
+ {t('Recorder')}
+
+ }
+ className={inspectorStyles.interactionTabCard}
+ extra={actionBar()}
+ >
+ {!recordedActions.length && (
+ {t('enableRecordingAndPerformActions')}
+ )}
+ {!!recordedActions.length && (
+
+ )}
+
+ );
+};
+
+export default Recorder;
diff --git a/app/common/renderer/components/SessionInspector/RecorderTab/Recorder.module.css b/app/common/renderer/components/SessionInspector/RecorderTab/Recorder.module.css
new file mode 100644
index 0000000000..aca26936ef
--- /dev/null
+++ b/app/common/renderer/components/SessionInspector/RecorderTab/Recorder.module.css
@@ -0,0 +1,4 @@
+.noRecordedActions {
+ font-style: italic;
+ margin-bottom: 20px;
+}
diff --git a/app/renderer/components/Inspector/HighlighterCentroid.js b/app/common/renderer/components/SessionInspector/Screenshot/HighlighterCentroid.jsx
similarity index 52%
rename from app/renderer/components/Inspector/HighlighterCentroid.js
rename to app/common/renderer/components/SessionInspector/Screenshot/HighlighterCentroid.jsx
index e465de76f0..6327245799 100644
--- a/app/renderer/components/Inspector/HighlighterCentroid.js
+++ b/app/common/renderer/components/SessionInspector/Screenshot/HighlighterCentroid.jsx
@@ -1,15 +1,7 @@
-import React from 'react';
-
-import InspectorCSS from './Inspector.css';
-import {RENDER_CENTROID_AS} from './shared';
+import {CENTROID_STYLES, RENDER_CENTROID_AS} from '../../../constants/screenshot.js';
+import styles from './Screenshot.module.css';
const {CENTROID, OVERLAP, EXPAND} = RENDER_CENTROID_AS;
-const CENTROID_STYLES = {
- VISIBLE: 'visible',
- HIDDEN: 'hidden',
- CONTAINER: '50%',
- NON_CONTAINER: '0%',
-};
// Generate new coordinates along a circlular trajectory
// for overlapping elements only
@@ -24,35 +16,9 @@ const getCentroidPos = (type, angle, coord) => {
* Shows all element centroids
*/
const HighlighterCentroid = (props) => {
- const {
- selectedElementPath,
- hoveredElement = {},
- element,
- elementProperties,
- centroidType,
- hoveredCentroid,
- selectedCentroid,
- } = props;
+ const {selectedElementPath, element, elementProperties, centroidType, selectedCentroid} = props;
const {centerX, centerY, angleX, angleY, keyCode, path, container} = elementProperties;
- const onMouseEnter = (path) => {
- const {selectHoveredElement, selectHoveredCentroid} = props;
- if (centroidType === EXPAND) {
- selectHoveredCentroid(path);
- } else {
- selectHoveredElement(path);
- }
- };
-
- const onMouseLeave = () => {
- const {unselectHoveredElement, unselectHoveredCentroid} = props;
- if (centroidType === EXPAND) {
- unselectHoveredCentroid();
- } else {
- unselectHoveredElement();
- }
- };
-
const onClickCentroid = (path) => {
const {selectElement, unselectElement, selectCentroid, unselectCentroid} = props;
if (centroidType === EXPAND) {
@@ -70,26 +36,20 @@ const HighlighterCentroid = (props) => {
}
};
- const centroidClasses = [InspectorCSS['centroid-box']];
- centroidClasses.push(InspectorCSS[centroidType]);
+ const centroidClasses = [styles.centroidBox];
+ centroidClasses.push(styles[centroidType]);
// Highlight centroids that represent elements
if (centroidType !== EXPAND) {
- if (hoveredElement.path === path) {
- centroidClasses.push(InspectorCSS['hovered-element-box']);
- }
if (selectedElementPath === path) {
- centroidClasses.push(InspectorCSS['inspected-element-box']);
+ centroidClasses.push(styles.inspectedElementBox);
}
}
// Highlight +/- centroids
if (centroidType !== CENTROID) {
- if (hoveredCentroid === keyCode) {
- centroidClasses.push(InspectorCSS['hovered-element-box']);
- }
if (selectedCentroid === keyCode && !element) {
- centroidClasses.push(InspectorCSS['inspected-element-box']);
+ centroidClasses.push(styles.inspectedElementBox);
}
}
@@ -104,23 +64,16 @@ const HighlighterCentroid = (props) => {
...(centroidType === OVERLAP ? overlapDivStyle : {}),
};
- const placeHolder =
- centroidType === EXPAND ? (
- {keyCode === selectedCentroid ? '-' : '+'}
- ) : (
-
- );
-
return (
onMouseEnter(path)}
- onMouseOut={() => onMouseLeave()}
onClick={() => onClickCentroid(path)}
key={path}
style={centroidDivStyle}
>
- {placeHolder}
+ {centroidType === EXPAND && (
+
{keyCode === selectedCentroid ? '-' : '+'}
+ )}
);
};
diff --git a/app/renderer/components/Inspector/HighlighterRectForBounds.js b/app/common/renderer/components/SessionInspector/Screenshot/HighlighterRectForBounds.jsx
similarity index 50%
rename from app/renderer/components/Inspector/HighlighterRectForBounds.js
rename to app/common/renderer/components/SessionInspector/Screenshot/HighlighterRectForBounds.jsx
index b52c14f49e..e90904415c 100644
--- a/app/renderer/components/Inspector/HighlighterRectForBounds.js
+++ b/app/common/renderer/components/SessionInspector/Screenshot/HighlighterRectForBounds.jsx
@@ -1,25 +1,19 @@
-import React from 'react';
-
-import InspectorCSS from './Inspector.css';
+import styles from './Screenshot.module.css';
/**
* Single absolute positioned div that overlays the app screenshot and highlights the bounding
* box of the element found through element search
*/
-const HighlighterRectForBounds = ({elSize, elLocation, scaleRatio, xOffset}) => (
+const HighlighterRectForBounds = ({elSize, elLocation, scaleRatio}) => (
+ />
);
export default HighlighterRectForBounds;
diff --git a/app/common/renderer/components/SessionInspector/Screenshot/HighlighterRectForElem.jsx b/app/common/renderer/components/SessionInspector/Screenshot/HighlighterRectForElem.jsx
new file mode 100644
index 0000000000..fbc5e7314e
--- /dev/null
+++ b/app/common/renderer/components/SessionInspector/Screenshot/HighlighterRectForElem.jsx
@@ -0,0 +1,27 @@
+import styles from './Screenshot.module.css';
+
+/**
+ * Absolute positioned divs that overlay the app screenshot and highlight the bounding
+ * boxes of the elements in the app
+ */
+const HighlighterRectForElem = (props) => {
+ const {selectedElementPath, selectElement, unselectElement, properties, path} = props;
+
+ const {width = 0, height = 0, left = 0, top = 0} = properties;
+ const highlighterClasses = [styles.highlighterBox];
+
+ // Add class to selected elements
+ if (selectedElementPath === path) {
+ highlighterClasses.push(styles.inspectedElementBox);
+ }
+
+ return (
+ (path === selectedElementPath ? unselectElement() : selectElement(path))}
+ style={{left, top, width, height}}
+ />
+ );
+};
+
+export default HighlighterRectForElem;
diff --git a/app/renderer/components/Inspector/HighlighterRects.js b/app/common/renderer/components/SessionInspector/Screenshot/HighlighterRects.jsx
similarity index 78%
rename from app/renderer/components/Inspector/HighlighterRects.js
rename to app/common/renderer/components/SessionInspector/Screenshot/HighlighterRects.jsx
index 21169cb848..bb2f55bcce 100644
--- a/app/renderer/components/Inspector/HighlighterRects.js
+++ b/app/common/renderer/components/SessionInspector/Screenshot/HighlighterRects.jsx
@@ -1,9 +1,8 @@
-import React from 'react';
-
-import HighlighterCentroid from './HighlighterCentroid';
-import HighlighterRectForBounds from './HighlighterRectForBounds';
-import HighlighterRectForElem from './HighlighterRectForElem';
-import {RENDER_CENTROID_AS, parseCoordinates} from './shared';
+import {RENDER_CENTROID_AS} from '../../../constants/screenshot.js';
+import {parseCoordinates} from '../../../utils/other.js';
+import HighlighterCentroid from './HighlighterCentroid.jsx';
+import HighlighterRectForBounds from './HighlighterRectForBounds.jsx';
+import HighlighterRectForElem from './HighlighterRectForElem.jsx';
const {CENTROID, OVERLAP, EXPAND} = RENDER_CENTROID_AS;
@@ -12,8 +11,7 @@ const {CENTROID, OVERLAP, EXPAND} = RENDER_CENTROID_AS;
*/
const HighlighterRects = (props) => {
const {
- source,
- containerEl,
+ sourceJSON,
searchedForElementBounds,
scaleRatio,
showCentroids,
@@ -23,11 +21,9 @@ const HighlighterRects = (props) => {
const highlighterRects = [];
const highlighterCentroids = [];
- let highlighterXOffset = 0;
- let screenshotEl = null;
- const getElements = (source) => {
- const elementsByOverlap = buildElementsWithProps(source, null, [], {});
+ const getElements = (sourceJSON) => {
+ const elementsByOverlap = buildElementsWithProps(sourceJSON, null, [], {});
let elements = [];
// Adjust overlapping elements
@@ -67,31 +63,30 @@ const HighlighterRects = (props) => {
// This func creates a new object for each element and determines its properties
// 'elements' is an array that stores all prev elements
- // 'overlaps' is an object which organzies elements by their positions
- const buildElementsWithProps = (source, prevElement, elements, overlaps) => {
- if (!source) {
+ // 'overlaps' is an object which organizes elements by their positions
+ const buildElementsWithProps = (sourceJSON, prevElement, elements, overlaps) => {
+ if (!sourceJSON) {
return {};
}
- const {x1, y1, x2, y2} = parseCoordinates(source);
- const xOffset = highlighterXOffset || 0;
+ const {x1, y1, x2, y2} = parseCoordinates(sourceJSON);
const centerPoint = (v1, v2) => Math.round(v1 + (v2 - v1) / 2) / scaleRatio;
const obj = {
type: CENTROID,
- element: source,
+ element: sourceJSON,
parent: prevElement,
properties: {
- left: x1 / scaleRatio + xOffset,
+ left: x1 / scaleRatio,
top: y1 / scaleRatio,
width: (x2 - x1) / scaleRatio,
height: (y2 - y1) / scaleRatio,
- centerX: centerPoint(x1, x2) + xOffset,
+ centerX: centerPoint(x1, x2),
centerY: centerPoint(y1, y2),
angleX: null,
angleY: null,
- path: source.path,
+ path: sourceJSON.path,
keyCode: null,
container: false,
- accessible: source.attributes ? source.attributes.accessible : null,
+ accessible: sourceJSON.attributes ? sourceJSON.attributes.accessible : null,
},
};
const coordinates = `${obj.properties.centerX},${obj.properties.centerY}`;
@@ -99,7 +94,7 @@ const HighlighterRects = (props) => {
elements.push(obj);
- if (source.path) {
+ if (sourceJSON.path) {
if (overlaps[coordinates]) {
overlaps[coordinates].push(obj);
} else {
@@ -107,9 +102,9 @@ const HighlighterRects = (props) => {
}
}
- if (source.children) {
- for (const childEl of source.children) {
- buildElementsWithProps(childEl, source, elements, overlaps);
+ if (sourceJSON.children) {
+ for (const childEl of sourceJSON.children) {
+ buildElementsWithProps(childEl, sourceJSON, elements, overlaps);
}
}
@@ -167,18 +162,20 @@ const HighlighterRects = (props) => {
};
// Displays element rectangles only
- const renderElements = (source) => {
- for (const elem of source) {
+ const renderElements = (elements) => {
+ for (const elem of elements) {
// only render elements with non-zero height and width
if (!elem.properties.width || !elem.properties.height) {
continue;
}
highlighterRects.push(
,
);
}
@@ -189,24 +186,18 @@ const HighlighterRects = (props) => {
for (const elem of centroids) {
highlighterCentroids.push(
,
);
}
};
// Array of all element objects with properties to draw rectangles and/or centroids
- const elements = getElements(source);
-
- if (containerEl) {
- screenshotEl = containerEl.querySelector('img');
- highlighterXOffset =
- screenshotEl.getBoundingClientRect().left - containerEl.getBoundingClientRect().left;
- }
+ const elements = getElements(sourceJSON);
// If the user selected an element that they searched for, highlight that element
if (searchedForElementBounds && isLocatorTestModalVisible) {
@@ -217,7 +208,6 @@ const HighlighterRects = (props) => {
elLocation={location}
scaleRatio={scaleRatio}
key={`el.${location.x}.${location.y}.${size.width}.${size.height}`}
- xOffset={highlighterXOffset}
/>,
);
}
diff --git a/app/renderer/components/Inspector/Screenshot.js b/app/common/renderer/components/SessionInspector/Screenshot/Screenshot.jsx
similarity index 78%
rename from app/renderer/components/Inspector/Screenshot.js
rename to app/common/renderer/components/SessionInspector/Screenshot/Screenshot.jsx
index f25efe2070..4168428e8c 100644
--- a/app/renderer/components/Inspector/Screenshot.js
+++ b/app/common/renderer/components/SessionInspector/Screenshot/Screenshot.jsx
@@ -1,19 +1,20 @@
import {Spin} from 'antd';
-import React, {useRef, useState} from 'react';
+import {Fragment, useState} from 'react';
+import {useTranslation} from 'react-i18next';
-import HighlighterRects from './HighlighterRects';
-import styles from './Inspector.css';
+import {GESTURE_ITEM_STYLES, POINTER_TYPES} from '../../../constants/gestures.js';
import {
DEFAULT_SWIPE,
DEFAULT_TAP,
- INTERACTION_MODE,
- POINTER_TYPES,
SCREENSHOT_INTERACTION_MODE,
-} from './shared';
+} from '../../../constants/screenshot.js';
+import {INSPECTOR_TABS} from '../../../constants/session-inspector.js';
+import inspectorStyles from '../SessionInspector.module.css';
+import HighlighterRects from './HighlighterRects.jsx';
+import styles from './Screenshot.module.css';
const {POINTER_UP, POINTER_DOWN, PAUSE, POINTER_MOVE} = POINTER_TYPES;
const {TAP, SELECT, SWIPE, TAP_SWIPE} = SCREENSHOT_INTERACTION_MODE;
-const TYPES = {FILLED: 'filled', NEW_DASHED: 'newDashed', WHOLE: 'whole', DASHED: 'dashed'};
/**
* Shows screenshot of running application and divs that highlight the elements' bounding boxes
@@ -21,19 +22,20 @@ const TYPES = {FILLED: 'filled', NEW_DASHED: 'newDashed', WHOLE: 'whole', DASHED
const Screenshot = (props) => {
const {
screenshot,
- mjpegScreenshotUrl,
+ serverDetails,
+ isUsingMjpegMode,
methodCallInProgress,
screenshotInteractionMode,
coordStart,
coordEnd,
+ clearCoordAction,
scaleRatio,
selectedTick,
- selectedInteractionMode,
+ selectedInspectorTab,
applyClientMethod,
- t,
} = props;
+ const {t} = useTranslation();
- const containerEl = useRef();
const [x, setX] = useState();
const [y, setY] = useState();
@@ -52,7 +54,7 @@ const Screenshot = (props) => {
};
const handleScreenshotUp = async () => {
- const {setCoordEnd, clearCoordAction} = props;
+ const {setCoordEnd} = props;
if (screenshotInteractionMode === TAP_SWIPE) {
await setCoordEnd(x, y);
if (Math.abs(coordStart.x - x) < 5 && Math.abs(coordStart.y - y) < 5) {
@@ -60,7 +62,7 @@ const Screenshot = (props) => {
} else {
await handleDoSwipe({x, y}); // Pass coordEnd because otherwise it is not retrieved
}
- clearCoordAction();
+ await clearCoordAction();
}
};
@@ -102,7 +104,7 @@ const Screenshot = (props) => {
});
};
- const handleMouseMove = (e) => {
+ const handleScreenshotCoordsUpdate = (e) => {
if (screenshotInteractionMode !== SELECT) {
const offsetX = e.nativeEvent.offsetX;
const offsetY = e.nativeEvent.offsetY;
@@ -113,10 +115,16 @@ const Screenshot = (props) => {
}
};
+ const handleScreenshotLeave = async () => {
+ setX(null);
+ setY(null);
+ await clearCoordAction();
+ };
+
// retrieve and format gesture for svg drawings
const getGestureCoordinates = () => {
const {showGesture} = props;
- const {FILLED, NEW_DASHED, WHOLE, DASHED} = TYPES;
+ const {FILLED, NEW_DASHED, WHOLE, DASHED} = GESTURE_ITEM_STYLES;
const defaultTypes = {pointerDown: WHOLE, pointerUp: DASHED};
if (!showGesture) {
@@ -158,23 +166,25 @@ const Screenshot = (props) => {
screenshotStyle.cursor = 'crosshair';
}
- const screenSrc = mjpegScreenshotUrl || `data:image/gif;base64,${screenshot}`;
- const screenImg =
;
+ const screenSrc = isUsingMjpegMode
+ ? serverDetails.mjpegScreenshotUrl
+ : `data:image/gif;base64,${screenshot}`;
const points = getGestureCoordinates();
// Show the screenshot and highlighter rects.
// Show loading indicator if a method call is in progress, unless using MJPEG mode.
return (
-
+
{screenshotInteractionMode !== SELECT && (
@@ -182,14 +192,12 @@ const Screenshot = (props) => {
{t('yCoordinate', {y})}
)}
- {screenImg}
- {screenshotInteractionMode === SELECT && containerEl.current && (
-
- )}
+
+ {screenshotInteractionMode === SELECT &&
}
{screenshotInteractionMode === TAP_SWIPE && (
{coordStart && (
-
+
)}
{coordStart && !coordEnd && (
{
)}
)}
- {selectedInteractionMode === INTERACTION_MODE.GESTURES && points && (
+ {selectedInspectorTab === INSPECTOR_TABS.GESTURES && points && (
{points.map((pointer) =>
pointer.map((tick, index) => (
-
+
{index > 0 && (
{
/>
)}
-
+
)),
)}
diff --git a/app/common/renderer/components/SessionInspector/Screenshot/Screenshot.module.css b/app/common/renderer/components/SessionInspector/Screenshot/Screenshot.module.css
new file mode 100644
index 0000000000..c411fd0990
--- /dev/null
+++ b/app/common/renderer/components/SessionInspector/Screenshot/Screenshot.module.css
@@ -0,0 +1,166 @@
+.highlighterBox {
+ position: absolute;
+ opacity: 0.5;
+ cursor: pointer;
+}
+
+.highlighterBox.inspectedElementBox {
+ background-color: rgb(90, 90, 178);
+ visibility: visible;
+}
+
+.highlighterBox:hover {
+ background-color: yellow;
+ visibility: visible;
+}
+
+.highlighterBox.inspectedElementBox:hover {
+ background-color: rgb(100, 255, 100);
+}
+
+.centroidBox {
+ width: 2.2vh;
+ height: 2.2vh;
+ border: 2px solid red;
+ position: absolute;
+ opacity: 0.6;
+ overflow: hidden;
+ cursor: pointer;
+ transform: translate(-50%, -50%);
+}
+
+.centroidBox.centroid.inspectedElementBox {
+ background-color: rgb(90, 90, 178);
+ opacity: 0.8;
+}
+
+.centroidBox.centroid:hover {
+ background-color: yellow;
+ opacity: 0.8;
+}
+
+.centroidBox.centroid.inspectedElementBox:hover {
+ background-color: rgb(100, 255, 100);
+}
+
+.centroidBox.expand {
+ background-color: rgba(255, 255, 255, 0.6);
+ opacity: 1;
+}
+
+.centroidBox.expand.inspectedElementBox {
+ background-color: rgb(90, 90, 178);
+ opacity: 0.8;
+}
+
+.centroidBox.expand:hover {
+ background-color: yellow;
+ opacity: 0.8;
+}
+
+.centroidBox.expand.inspectedElementBox:hover {
+ background-color: rgb(100, 255, 100);
+}
+
+.plusMinus {
+ position: relative;
+ top: -0.9vh;
+ text-align: center;
+ font-size: 2vh;
+ font-weight: 800;
+ color: red;
+}
+
+.centroidBox.overlap {
+ border-style: dashed;
+ border-color: green;
+ opacity: 1;
+}
+
+.centroidBox.overlap.inspectedElementBox {
+ background-color: rgb(90, 90, 178);
+ opacity: 0.8;
+}
+
+.centroidBox.overlap:hover {
+ background-color: yellow;
+ opacity: 0.8;
+}
+
+.centroidBox.overlap.inspectedElementBox:hover {
+ background-color: rgb(100, 255, 100);
+}
+
+.innerScreenshotContainer {
+ display: flex;
+ flex-direction: column;
+ height: 100%;
+}
+
+.innerScreenshotContainer .screenshotActionsPanel {
+ margin-bottom: 2px;
+ margin: 0 auto 2px auto;
+}
+
+.coordinatesContainer {
+ position: absolute;
+ background: rgba(255, 250, 205, 0.8);
+ color: black;
+ z-index: 100;
+ padding: 2px;
+}
+
+.swipeSvg {
+ position: absolute;
+ z-index: 100;
+ top: 0;
+ left: 0;
+ height: 100%;
+ width: 100%;
+}
+
+.swipeSvg line {
+ stroke-width: 15;
+ stroke: rgba(255, 153, 153, 0.8);
+ stroke-linecap: round;
+}
+
+.swipeSvg circle {
+ fill: rgba(255, 153, 153, 0.8);
+}
+
+.gestureSvg {
+ position: absolute;
+ z-index: 100;
+ top: 0;
+ left: 0;
+ height: 100%;
+ width: 100%;
+}
+
+.gestureSvg line {
+ opacity: 0.35;
+}
+
+.gestureSvg .filled,
+.dashed {
+ stroke-dasharray: 10;
+ stroke-width: 5;
+}
+
+.gestureSvg .whole,
+.newDashed {
+ stroke-linecap: round;
+ stroke-width: 15;
+}
+
+.gestureSvg circle {
+ fill: none;
+ stroke-width: 0.4%;
+}
+
+.gestureSvg .dashedCircle,
+.newDashedCircle {
+ stroke-dasharray: 0.9%;
+ border-style: dashed;
+}
diff --git a/app/common/renderer/components/SessionInspector/SessionInfoTab/SessionCodeBox.jsx b/app/common/renderer/components/SessionInspector/SessionInfoTab/SessionCodeBox.jsx
new file mode 100644
index 0000000000..429a8c0f64
--- /dev/null
+++ b/app/common/renderer/components/SessionInspector/SessionInfoTab/SessionCodeBox.jsx
@@ -0,0 +1,58 @@
+import {IconCode, IconFiles} from '@tabler/icons-react';
+import {Button, Card, Flex, Select, Space, Tooltip} from 'antd';
+import _ from 'lodash';
+import {useTranslation} from 'react-i18next';
+import {Refractor} from 'react-refractor';
+
+import {CLIENT_FRAMEWORK_MAP} from '../../../lib/client-frameworks/map.js';
+import {copyToClipboard} from '../../../utils/other.js';
+import inspectorStyles from '../SessionInspector.module.css';
+
+const SessionCodeBox = (props) => {
+ const {clientFramework, setClientFramework} = props;
+ const {t} = useTranslation();
+
+ const ClientFrameworkClass = CLIENT_FRAMEWORK_MAP[clientFramework];
+
+ const getCode = () => {
+ const {serverDetails, sessionCaps} = props;
+ const {serverUrl, serverUrlParts} = serverDetails;
+
+ const framework = new ClientFrameworkClass(serverUrl, serverUrlParts, sessionCaps);
+ return framework.getCodeString(true);
+ };
+
+ const actionBar = () => (
+
+
+ } onClick={() => copyToClipboard(getCode())} />
+
+ ({
+ value: fwId,
+ label: fwClass.readableName,
+ }))}
+ />
+
+ );
+
+ return (
+
+
+ {t('Start this Kind of Session with Code')}
+
+ }
+ extra={actionBar()}
+ >
+
+
+ );
+};
+
+export default SessionCodeBox;
diff --git a/app/common/renderer/components/SessionInspector/SessionInfoTab/SessionInfo.jsx b/app/common/renderer/components/SessionInspector/SessionInfoTab/SessionInfo.jsx
new file mode 100644
index 0000000000..04e35e4414
--- /dev/null
+++ b/app/common/renderer/components/SessionInspector/SessionInfoTab/SessionInfo.jsx
@@ -0,0 +1,140 @@
+import {IconInfoCircle} from '@tabler/icons-react';
+import {Card, Flex, Space, Table} from 'antd';
+import _ from 'lodash';
+import {useEffect, useRef, useState} from 'react';
+import {useTranslation} from 'react-i18next';
+
+import inspectorStyles from '../SessionInspector.module.css';
+import SessionCodeBox from './SessionCodeBox.jsx';
+import styles from './SessionInfo.module.css';
+
+const SessionInfo = (props) => {
+ const {driver, getActiveAppId, getServerStatus, getFlatSessionCaps, sessionStartTime} = props;
+ const {t} = useTranslation();
+
+ const intervalRef = useRef(null);
+ const [sessionLength, setSessionLength] = useState(0);
+
+ const formatMono = (node) =>
{node} ;
+
+ const formatSessionLength = () => {
+ const sessionLengthDate = new Date(sessionLength);
+ const hours = sessionLengthDate.getUTCHours();
+ const minutes = sessionLengthDate.getUTCMinutes();
+ const seconds = sessionLengthDate.getUTCSeconds();
+
+ const padTime = (timeUnit) => String(timeUnit).padStart(2, '0');
+
+ return formatMono(`${padTime(hours)}:${padTime(minutes)}:${padTime(seconds)}`);
+ };
+
+ const columns = [
+ {
+ dataIndex: 'property',
+ key: 'property',
+ width: 200,
+ },
+ {
+ dataIndex: 'value',
+ key: 'value',
+ },
+ ];
+
+ const innerDataSource = (dataObject) =>
+ _.toPairs(dataObject).map(([propName, propValue]) => ({
+ key: propName,
+ property: formatMono(propName),
+ value: formatMono(String(propValue)),
+ }));
+
+ const getInnerTable = (dataObject) => (
+
+ );
+
+ const outerDataSource = () => {
+ const {serverDetails, appId, status, flatSessionCaps} = props;
+ const {sessionId} = driver || '';
+
+ // TODO: Fetch URL from Cloud Providers
+ const sessionUrl = sessionId
+ ? formatMono(`${serverDetails.serverUrl}/session/${sessionId}`)
+ : t('Error Fetching Session URL');
+
+ return [
+ {
+ key: 'session_url',
+ property: t('Session URL'),
+ value: sessionUrl,
+ },
+ {
+ key: 'session_length',
+ property: t('Session Length'),
+ value: formatSessionLength(),
+ },
+ {
+ key: 'server_details',
+ property: t('Server Details'),
+ value: getInnerTable(status),
+ },
+ {
+ key: 'session_details',
+ property: t('Session Details'),
+ value: getInnerTable(flatSessionCaps),
+ },
+ {
+ key: 'active_appId',
+ property: t('Currently Active App ID'),
+ value: formatMono(appId),
+ },
+ ];
+ };
+
+ useEffect(() => {
+ if (!driver) {
+ return;
+ }
+ const {isIOS, isAndroid} = driver;
+ getActiveAppId(isIOS, isAndroid);
+ getServerStatus();
+ getFlatSessionCaps();
+
+ intervalRef.current = setInterval(() => {
+ setSessionLength(Date.now() - sessionStartTime);
+ }, 1000);
+ return () => clearInterval(intervalRef.current);
+ }, [driver, getActiveAppId, getServerStatus, getFlatSessionCaps, sessionStartTime]);
+
+ return (
+
+
+ {t('Session Information')}
+
+ }
+ className={inspectorStyles.interactionTabCard}
+ >
+
+
+
+
+
+ );
+};
+
+export default SessionInfo;
diff --git a/app/common/renderer/components/SessionInspector/SessionInfoTab/SessionInfo.module.css b/app/common/renderer/components/SessionInspector/SessionInfoTab/SessionInfo.module.css
new file mode 100644
index 0000000000..60dc735fb4
--- /dev/null
+++ b/app/common/renderer/components/SessionInspector/SessionInfoTab/SessionInfo.module.css
@@ -0,0 +1,8 @@
+.sessionInnerTable :global(.ant-table-body) {
+ scrollbar-width: none; /* -webkit-scrollbar for Firefox */
+ margin-left: -32px;
+}
+
+.sessionInnerTable :global(.ant-table-body)::-webkit-scrollbar {
+ width: 0px;
+}
diff --git a/app/common/renderer/components/SessionInspector/SessionInspector.jsx b/app/common/renderer/components/SessionInspector/SessionInspector.jsx
new file mode 100644
index 0000000000..1308e04dde
--- /dev/null
+++ b/app/common/renderer/components/SessionInspector/SessionInspector.jsx
@@ -0,0 +1,398 @@
+import {
+ IconCrosshair,
+ IconDownload,
+ IconEyePlus,
+ IconMovie,
+ IconObjectScan,
+ IconPhoto,
+} from '@tabler/icons-react';
+import {Button, Modal, Space, Spin, Tabs, Tooltip} from 'antd';
+import _ from 'lodash';
+import {useCallback, useEffect, useRef, useState} from 'react';
+import {useTranslation} from 'react-i18next';
+import {useNavigate} from 'react-router';
+
+import {BUTTON} from '../../constants/antd-types.js';
+import {WINDOW_DIMENSIONS} from '../../constants/common.js';
+import {SCREENSHOT_INTERACTION_MODE} from '../../constants/screenshot.js';
+import {
+ INSPECTOR_TABS,
+ MJPEG_STREAM_CHECK_INTERVAL,
+ SESSION_EXPIRY_PROMPT_TIMEOUT,
+} from '../../constants/session-inspector.js';
+import {downloadFile} from '../../utils/file-handling.js';
+import Commands from './CommandsTab/Commands.jsx';
+import GestureEditor from './GesturesTab/GestureEditor.jsx';
+import SavedGestures from './GesturesTab/SavedGestures.jsx';
+import HeaderButtons from './Header/HeaderButtons.jsx';
+import Recorder from './RecorderTab/Recorder.jsx';
+import Screenshot from './Screenshot/Screenshot.jsx';
+import SessionInfo from './SessionInfoTab/SessionInfo.jsx';
+import styles from './SessionInspector.module.css';
+import SourceTab from './SourceTab/SourceTab.jsx';
+
+const {SELECT, TAP_SWIPE} = SCREENSHOT_INTERACTION_MODE;
+
+// resize width to something sensible for using the inspector on first run
+const resizeWindowOnLaunch = () => {
+ const curHeight = window.innerHeight;
+ const curWidth = window.innerWidth;
+ if (curHeight < WINDOW_DIMENSIONS.MIN_HEIGHT || curWidth < WINDOW_DIMENSIONS.MIN_WIDTH) {
+ const newWidth =
+ curWidth < WINDOW_DIMENSIONS.MIN_WIDTH ? WINDOW_DIMENSIONS.MIN_WIDTH : curWidth;
+ const newHeight =
+ curHeight < WINDOW_DIMENSIONS.MIN_HEIGHT ? WINDOW_DIMENSIONS.MIN_HEIGHT : curHeight;
+ window.resizeTo(newWidth, newHeight);
+ }
+};
+
+const downloadScreenshot = (screenshot) => {
+ const href = `data:image/png;base64,${screenshot}`;
+ const filename = `appium-inspector-${new Date().toJSON()}.png`;
+ downloadFile(href, filename);
+};
+
+const Inspector = (props) => {
+ const {
+ screenshot,
+ screenshotError,
+ quitSession,
+ screenshotInteractionMode,
+ selectedInspectorTab,
+ selectInspectorTab,
+ setUserWaitTimeout,
+ showKeepAlivePrompt,
+ keepSessionAlive,
+ serverDetails,
+ isUsingMjpegMode,
+ setMjpegState,
+ isAwaitingMjpegStream,
+ setRefreshingState,
+ toggleShowCentroids,
+ showCentroids,
+ isGestureEditorVisible,
+ isSourceRefreshOn,
+ windowSize,
+ applyClientMethod,
+ getSavedClientFramework,
+ runKeepAliveLoop,
+ setSessionTime,
+ storeSessionSettings,
+ setAwaitingMjpegStream,
+ } = props;
+
+ const screenshotContainerElRef = useRef(null);
+ const mjpegStreamCheckIntervalRef = useRef(null);
+ // Debounced updater stored in a ref to avoid creating it during render
+ const updateScreenshotScaleDebouncedRef = useRef(undefined);
+
+ // Ref to persist session expiry timeout without resetting on re-renders
+ const sessionExpiryTimeoutRef = useRef(null);
+
+ const [scaleRatio, setScaleRatio] = useState(1);
+
+ const navigate = useNavigate();
+ const {t} = useTranslation();
+
+ const showScreenshot =
+ (screenshot && !screenshotError) ||
+ (isUsingMjpegMode && (!isSourceRefreshOn || !isAwaitingMjpegStream));
+
+ const updateScreenshotScale = useCallback(() => {
+ // If the screenshot has too much space to the right or bottom, adjust the max width
+ // of its container, so the source tree always fills the remaining space.
+ // This keeps everything looking tight.
+ const screenshotContainer = screenshotContainerElRef.current;
+ if (!screenshotContainer) {
+ return;
+ }
+
+ const screenshotImg = screenshotContainer.querySelector('#screenshot');
+ if (!screenshotImg) {
+ return;
+ }
+
+ const imgRect = screenshotImg.getBoundingClientRect();
+ const containerRect = screenshotContainer.getBoundingClientRect();
+ if (imgRect.height < containerRect.height) {
+ // get the expected image width if the image would fill the screenshot box height
+ const attemptedImgWidth = (containerRect.height / imgRect.height) * imgRect.width;
+ // get the maximum image width as a fraction of the current window width
+ const maxImgWidth = window.innerWidth * WINDOW_DIMENSIONS.MAX_IMAGE_WIDTH_FRACTION;
+ // make sure not to exceed both the maximum allowed width and the full screenshot width
+ const curMaxImgWidth = Math.min(maxImgWidth, attemptedImgWidth, windowSize.width);
+ screenshotContainer.style.maxWidth = `${curMaxImgWidth}px`;
+ } else if (imgRect.width < containerRect.width) {
+ screenshotContainer.style.maxWidth = `${imgRect.width}px`;
+ }
+
+ // Calculate the ratio for scaling items overlaid on the screenshot
+ // (highlighter rectangles/circles, gestures, etc.)
+ const newImgWidth = screenshotImg.getBoundingClientRect().width;
+ setScaleRatio(windowSize.width / newImgWidth);
+ }, [windowSize]);
+
+ useEffect(() => {
+ const debounced = _.debounce(() => {
+ updateScreenshotScale();
+ }, 50);
+ updateScreenshotScaleDebouncedRef.current = debounced;
+ return () => {
+ debounced.cancel?.();
+ if (updateScreenshotScaleDebouncedRef.current === debounced) {
+ updateScreenshotScaleDebouncedRef.current = undefined;
+ }
+ };
+ }, [updateScreenshotScale]);
+
+ // Stable handler for events that calls the debounced function ref
+ const updateScreenshotScaleDebounced = useCallback(() => {
+ updateScreenshotScaleDebouncedRef.current?.();
+ }, []);
+
+ const checkMjpegStream = useCallback(async () => {
+ const img = new Image();
+ img.src = serverDetails.mjpegScreenshotUrl;
+ let imgReady = false;
+ try {
+ await img.decode();
+ imgReady = true;
+ } catch {}
+ if (imgReady && isAwaitingMjpegStream) {
+ setAwaitingMjpegStream(false);
+ updateScreenshotScaleDebounced();
+ // stream obtained - can clear the refresh interval
+ clearInterval(mjpegStreamCheckIntervalRef.current);
+ mjpegStreamCheckIntervalRef.current = null;
+ } else if (!imgReady && !isAwaitingMjpegStream) {
+ setAwaitingMjpegStream(true);
+ }
+ }, [
+ isAwaitingMjpegStream,
+ serverDetails.mjpegScreenshotUrl,
+ setAwaitingMjpegStream,
+ updateScreenshotScaleDebounced,
+ ]);
+
+ const screenshotInteractionChange = (mode) => {
+ const {selectScreenshotInteractionMode, clearCoordAction} = props;
+ clearCoordAction(); // When the action changes, reset the swipe action
+ selectScreenshotInteractionMode(mode);
+ };
+
+ const switchScreenCaptureMode = (shouldUseMjpeg) => {
+ setMjpegState(shouldUseMjpeg);
+ if (!shouldUseMjpeg) {
+ setRefreshingState({source: true});
+ }
+ applyClientMethod({methodName: 'getPageSource'});
+ };
+
+ const quitSessionAndReturn = useCallback(
+ async ({reason, manualQuit = true, detachOnly = false} = {}) => {
+ await quitSession({reason, manualQuit, detachOnly});
+ navigate('/session', {replace: true});
+ },
+ [navigate, quitSession],
+ );
+
+ useEffect(() => {
+ resizeWindowOnLaunch();
+ applyClientMethod({methodName: 'getPageSource'});
+ storeSessionSettings();
+ getSavedClientFramework();
+ runKeepAliveLoop();
+ setSessionTime(Date.now());
+ }, [
+ applyClientMethod,
+ getSavedClientFramework,
+ runKeepAliveLoop,
+ setSessionTime,
+ storeSessionSettings,
+ ]);
+
+ /**
+ * Ensures component dimensions are adjusted only once windowSize exists.
+ * Cannot be combined with the other useEffect hook, since inside it,
+ * windowSize is set to 'undefined', and the event listener and MJPEG checker
+ * would not update this value when invoked
+ */
+ useEffect(() => {
+ if (!windowSize || !JSON.stringify(windowSize)) {
+ return;
+ }
+ updateScreenshotScaleDebounced();
+ window.addEventListener('resize', updateScreenshotScaleDebounced);
+ if (isUsingMjpegMode) {
+ mjpegStreamCheckIntervalRef.current = setInterval(
+ checkMjpegStream,
+ MJPEG_STREAM_CHECK_INTERVAL,
+ );
+ }
+ return () => {
+ window.removeEventListener('resize', updateScreenshotScaleDebounced);
+ if (mjpegStreamCheckIntervalRef.current) {
+ clearInterval(mjpegStreamCheckIntervalRef.current);
+ mjpegStreamCheckIntervalRef.current = null;
+ }
+ };
+ }, [checkMjpegStream, isUsingMjpegMode, updateScreenshotScaleDebounced, windowSize]);
+
+ // If session expiry prompt is shown, start timeout until session is automatically quit.
+ // Timeout should remain active until it fires or user acts (keep alive / quit).
+ useEffect(() => {
+ if (showKeepAlivePrompt) {
+ // Create timeout only once while prompt is visible
+ if (!sessionExpiryTimeoutRef.current) {
+ sessionExpiryTimeoutRef.current = setTimeout(() => {
+ quitSessionAndReturn({reason: t('Session closed due to inactivity'), manualQuit: false});
+ }, SESSION_EXPIRY_PROMPT_TIMEOUT);
+ setUserWaitTimeout(sessionExpiryTimeoutRef.current);
+ }
+ } else if (sessionExpiryTimeoutRef.current) {
+ // Prompt dismissed by user action; clear timeout
+ clearTimeout(sessionExpiryTimeoutRef.current);
+ sessionExpiryTimeoutRef.current = null;
+ setUserWaitTimeout(null);
+ }
+ }, [quitSessionAndReturn, setUserWaitTimeout, showKeepAlivePrompt, t]);
+
+ const screenShotControls = (
+
+
+ {serverDetails.mjpegScreenshotUrl !== null && (
+
+
+ }
+ onClick={() => switchScreenCaptureMode(true)}
+ type={isUsingMjpegMode ? BUTTON.PRIMARY : BUTTON.DEFAULT}
+ />
+
+
+ }
+ onClick={() => switchScreenCaptureMode(false)}
+ type={!isUsingMjpegMode ? BUTTON.PRIMARY : BUTTON.DEFAULT}
+ />
+
+
+ )}
+
+ }
+ onClick={() => toggleShowCentroids()}
+ type={showCentroids ? BUTTON.PRIMARY : BUTTON.DEFAULT}
+ disabled={isGestureEditorVisible}
+ />
+
+
+
+ }
+ onClick={() => screenshotInteractionChange(SELECT)}
+ type={screenshotInteractionMode === SELECT ? BUTTON.PRIMARY : BUTTON.DEFAULT}
+ disabled={isGestureEditorVisible}
+ />
+
+
+ }
+ onClick={() => screenshotInteractionChange(TAP_SWIPE)}
+ type={screenshotInteractionMode === TAP_SWIPE ? BUTTON.PRIMARY : BUTTON.DEFAULT}
+ disabled={isGestureEditorVisible}
+ />
+
+
+
+ }
+ onClick={() => downloadScreenshot(screenshot)}
+ disabled={!showScreenshot || isUsingMjpegMode}
+ />
+
+
+
+ );
+
+ const main = (
+
+
+ {screenShotControls}
+ {showScreenshot &&
}
+ {screenshotError && t('couldNotObtainScreenshot', {screenshotError})}
+ {!showScreenshot && (
+
+
+
+ )}
+
+
+ selectInspectorTab(tab)}
+ items={[
+ {
+ label: t('Source'),
+ key: INSPECTOR_TABS.SOURCE,
+ disabled: !showScreenshot,
+ children: ,
+ },
+ {
+ label: t('Commands'),
+ key: INSPECTOR_TABS.COMMANDS,
+ disabled: !showScreenshot,
+ children: ,
+ },
+ {
+ label: t('Gestures'),
+ key: INSPECTOR_TABS.GESTURES,
+ disabled: !showScreenshot,
+ children: isGestureEditorVisible ? (
+
+ ) : (
+
+ ),
+ },
+ {
+ label: t('Recorder'),
+ key: INSPECTOR_TABS.RECORDER,
+ disabled: !showScreenshot,
+ children: ,
+ },
+ {
+ label: t('Session Information'),
+ key: INSPECTOR_TABS.SESSION_INFO,
+ disabled: !showScreenshot,
+ children: ,
+ },
+ ]}
+ />
+
+
+ );
+
+ return (
+
+
+ {main}
+
keepSessionAlive()}
+ onCancel={() => quitSessionAndReturn()}
+ okText={t('Keep Session Running')}
+ cancelText={t('Quit Session')}
+ >
+ {t('Your session is about to expire')}
+
+
+ );
+};
+
+export default Inspector;
diff --git a/app/common/renderer/components/SessionInspector/SessionInspector.module.css b/app/common/renderer/components/SessionInspector/SessionInspector.module.css
new file mode 100644
index 0000000000..d999eb0cef
--- /dev/null
+++ b/app/common/renderer/components/SessionInspector/SessionInspector.module.css
@@ -0,0 +1,116 @@
+.monoFont {
+ font-family: monospace;
+}
+
+.inspectorContainer {
+ display: flex;
+ flex-direction: column;
+ height: 100%;
+}
+
+.inspectorMain {
+ display: flex;
+ flex: 1;
+ flex-direction: row;
+ padding: 1em;
+ max-width: 100%;
+ height: calc(100% - 50px);
+}
+
+.inspectorMain .screenshotContainer {
+ max-width: 500px;
+ max-height: calc(100% - 50px);
+ flex-grow: 1;
+ flex-shrink: 2;
+ flex-basis: 400px;
+}
+
+.screenshotContainer .screenshotControls {
+ display: flex;
+ flex-direction: row;
+ align-items: center;
+ justify-content: center;
+ width: 100%;
+ height: 38px;
+ margin-bottom: 12px;
+}
+
+.inspectorMain .screenshotContainer img {
+ max-width: 100%;
+ max-height: 100%;
+ box-shadow: 0px 0px 1px 2px rgba(0, 0, 0, 0.05);
+}
+
+.inspectorMain .screenshotContainer .screenshotBox {
+ width: 100%;
+ height: 100%;
+ text-align: left;
+ position: absolute;
+ overflow: hidden;
+}
+
+.inspectorMain :global(.ant-card-head-wrapper) {
+ max-height: 48px;
+}
+
+.inspectorMain :global(.ant-card-head) {
+ max-height: 48px;
+ padding: 0px 12px;
+ margin-bottom: 0px;
+}
+
+.inspectorMain :global(.ant-card-body) {
+ height: calc(100% - 54px);
+ padding: 12px;
+ scrollbar-width: none; /* -webkit-scrollbar for Firefox */
+}
+
+.inspectorMain :global(.ant-card-body::-webkit-scrollbar) {
+ background: transparent;
+ width: 14px;
+}
+
+.inspectorTabsContainer {
+ position: relative;
+ flex-grow: 1;
+ flex-basis: 550px;
+ min-width: 380px;
+ padding-left: 1em;
+ display: flex;
+ flex-flow: column;
+ height: 100%;
+}
+
+.inspectorTabsContainer :global(.ant-tabs) {
+ height: 100%;
+}
+
+.inspectorTabsContainer :global(.ant-tabs-content) {
+ height: 100%;
+}
+
+.inspectorTabsContainer :global(.ant-tabs-tabpane) {
+ height: 100%;
+}
+
+.inspectorTabsContainer :global(.ant-card) {
+ height: 100%;
+}
+
+.interactionTabCard :global(.ant-card-body) {
+ overflow: scroll;
+}
+
+.interactionTabCard {
+ flex: 2;
+ height: 100%;
+}
+
+.frameworkDropdown {
+ width: 150px;
+}
+
+.spaceContainer {
+ display: flex;
+ word-break: break-word;
+}
diff --git a/app/common/renderer/components/SessionInspector/SourceTab/AppSource/AppSource.jsx b/app/common/renderer/components/SessionInspector/SourceTab/AppSource/AppSource.jsx
new file mode 100644
index 0000000000..674c19c90c
--- /dev/null
+++ b/app/common/renderer/components/SessionInspector/SourceTab/AppSource/AppSource.jsx
@@ -0,0 +1,17 @@
+import AppSourceCard from './AppSourceCard.jsx';
+import AppSourceTreeWrapper from './AppSourceTreeWrapper.jsx';
+
+/**
+ * Shows the app source as a tree with search and attribute toggles.
+ */
+const AppSource = (props) => {
+ const {sourceXML} = props;
+
+ return (
+
+
+
+ );
+};
+
+export default AppSource;
diff --git a/app/common/renderer/components/SessionInspector/SourceTab/AppSource/AppSource.module.css b/app/common/renderer/components/SessionInspector/SourceTab/AppSource/AppSource.module.css
new file mode 100644
index 0000000000..6802315172
--- /dev/null
+++ b/app/common/renderer/components/SessionInspector/SourceTab/AppSource/AppSource.module.css
@@ -0,0 +1,76 @@
+.sourceSearchHighlight {
+ background-color: #ffeb3b;
+ border-radius: 2px;
+}
+
+:global(.dark) .sourceSearchHighlight {
+ background-color: #ecbf3a;
+}
+
+.sourceNodeTag {
+ color: #137dce;
+}
+
+:global(.dark) .sourceNodeTag {
+ color: #298dda;
+}
+
+.sourceNodeAttrName {
+ color: #7c13ec;
+}
+
+:global(.dark) .sourceNodeAttrName {
+ color: #a450ff;
+}
+
+.sourceNodeAttrValue {
+ color: #e34cde;
+}
+
+:global(.dark) .sourceNodeAttrValue {
+ color: #ea61e5;
+}
+
+.treeContainer {
+ height: 100%;
+}
+
+.treeWrapper {
+ display: flex;
+ flex-direction: column;
+ height: 100%;
+ gap: 8px;
+}
+
+.treeActions {
+ gap: 8px;
+}
+
+.treeSearchInput {
+ max-width: 400px;
+ flex: 1;
+}
+
+.treeSearchInputAddon {
+ min-width: 46px;
+ justify-content: center;
+}
+
+.sourceTree {
+ flex: 1;
+ overflow: auto;
+ --ant-tree-title-height: 18px !important;
+}
+
+.sourceTree :global(.ant-tree-treenode) {
+ margin-bottom: 2px;
+}
+
+.sourceTree :global(.ant-tree-node-content-wrapper) {
+ margin: 0 0 2px 4px;
+ padding: 0;
+}
+
+.sourceTree :global(.ant-tree-switcher-line-icon) {
+ vertical-align: -0.2em;
+}
diff --git a/app/common/renderer/components/SessionInspector/SourceTab/AppSource/AppSourceCard.jsx b/app/common/renderer/components/SessionInspector/SourceTab/AppSource/AppSourceCard.jsx
new file mode 100644
index 0000000000..473342de26
--- /dev/null
+++ b/app/common/renderer/components/SessionInspector/SourceTab/AppSource/AppSourceCard.jsx
@@ -0,0 +1,65 @@
+import {IconDownload, IconFiles, IconFileText} from '@tabler/icons-react';
+import {Button, Card, Flex, Tooltip} from 'antd';
+import {useTranslation} from 'react-i18next';
+
+import {downloadFile} from '../../../../utils/file-handling.js';
+import {copyToClipboard} from '../../../../utils/other.js';
+
+const downloadXML = (sourceXML) => {
+ const href = 'data:application/xml;charset=utf-8,' + encodeURIComponent(sourceXML);
+ const filename = `app-source-${new Date().toJSON()}.xml`;
+ downloadFile(href, filename);
+};
+
+/**
+ * Title of the app source panel card.
+ */
+const AppSourcePanelTitle = () => {
+ const {t} = useTranslation();
+
+ return (
+
+
+ {t('App Source')}
+
+ );
+};
+
+/**
+ * Header action buttons for source XML copy and download.
+ */
+const AppSourceHeaderButtons = ({sourceXML}) => {
+ const {t} = useTranslation();
+
+ return (
+
+
+ }
+ onClick={() => copyToClipboard(sourceXML)}
+ />
+
+
+ }
+ onClick={() => downloadXML(sourceXML)}
+ />
+
+
+ );
+};
+
+/**
+ * Wrapper card for the app source tree.
+ */
+const AppSourceCard = ({sourceXML, children}) => (
+
} extra={
}>
+ {children}
+
+);
+
+export default AppSourceCard;
diff --git a/app/common/renderer/components/SessionInspector/SourceTab/AppSource/AppSourceTree.jsx b/app/common/renderer/components/SessionInspector/SourceTab/AppSource/AppSourceTree.jsx
new file mode 100644
index 0000000000..8d8f1c62f1
--- /dev/null
+++ b/app/common/renderer/components/SessionInspector/SourceTab/AppSource/AppSourceTree.jsx
@@ -0,0 +1,49 @@
+import {CaretDownOutlined} from '@ant-design/icons';
+import {Tree} from 'antd';
+
+import styles from './AppSource.module.css';
+
+/**
+ * Source tree display with controlled expand/select state.
+ */
+const AppSourceTree = ({
+ treeData,
+ expandNode,
+ expandedKeys,
+ autoExpandParent,
+ selectElement,
+ unselectElement,
+ selectedElementPath,
+}) => {
+ const handleSelectElement = (path) => {
+ if (!path) {
+ unselectElement();
+ } else {
+ selectElement(path);
+ }
+ };
+
+ return (
+
(
+
+ )}
+ onExpand={expandNode}
+ expandedKeys={expandedKeys}
+ autoExpandParent={autoExpandParent}
+ onSelect={(selectedPaths) => handleSelectElement(selectedPaths[0])}
+ selectedKeys={[selectedElementPath]}
+ treeData={treeData}
+ className={styles.sourceTree}
+ />
+ );
+};
+
+export default AppSourceTree;
diff --git a/app/common/renderer/components/SessionInspector/SourceTab/AppSource/AppSourceTreeActions.jsx b/app/common/renderer/components/SessionInspector/SourceTab/AppSource/AppSourceTreeActions.jsx
new file mode 100644
index 0000000000..f144170d42
--- /dev/null
+++ b/app/common/renderer/components/SessionInspector/SourceTab/AppSource/AppSourceTreeActions.jsx
@@ -0,0 +1,52 @@
+import {IconEyeCode, IconFold, IconSearch} from '@tabler/icons-react';
+import {Button, Input, Row, Space, Tooltip} from 'antd';
+import {useTranslation} from 'react-i18next';
+
+import {BUTTON, ROW} from '../../../../constants/antd-types.js';
+import styles from './AppSource.module.css';
+
+/**
+ * Toolbar above the source tree with collapse, attribute toggle and search.
+ */
+const AppSourceTreeActions = ({
+ collapseAllNodes,
+ toggleShowAttributes,
+ showSourceAttrs,
+ onSearchChange,
+ searchValue,
+ matchingElementsCount,
+}) => {
+ const {t} = useTranslation();
+
+ return (
+
+
+
+ } onClick={collapseAllNodes} />
+
+
+ }
+ onClick={toggleShowAttributes}
+ type={showSourceAttrs ? BUTTON.PRIMARY : BUTTON.DEFAULT}
+ />
+
+
+
+ }
+ />
+
+ {matchingElementsCount}
+
+
+
+ );
+};
+
+export default AppSourceTreeActions;
diff --git a/app/common/renderer/components/SessionInspector/SourceTab/AppSource/AppSourceTreeWrapper.jsx b/app/common/renderer/components/SessionInspector/SourceTab/AppSource/AppSourceTreeWrapper.jsx
new file mode 100644
index 0000000000..7145a0c2e2
--- /dev/null
+++ b/app/common/renderer/components/SessionInspector/SourceTab/AppSource/AppSourceTreeWrapper.jsx
@@ -0,0 +1,177 @@
+import {Spin, Tree} from 'antd';
+import {useCallback, useMemo, useState} from 'react';
+import {useTranslation} from 'react-i18next';
+
+import {IMPORTANT_SOURCE_ATTRS} from '../../../../constants/source.js';
+import inspectorStyles from '../../SessionInspector.module.css';
+import styles from './AppSource.module.css';
+import AppSourceTree from './AppSourceTree.jsx';
+import AppSourceTreeActions from './AppSourceTreeActions.jsx';
+
+/**
+ * Wrapper around source tree + actions, including loading and empty/error states.
+ */
+const AppSourceTreeWrapper = ({
+ sourceJSON,
+ sourceError,
+ setExpandedPaths,
+ expandedPaths,
+ selectedElement = {},
+ showSourceAttrs,
+ methodCallInProgress,
+ isUsingMjpegMode,
+ isSourceRefreshOn,
+ toggleShowAttributes,
+ selectElement,
+ unselectElement,
+}) => {
+ const {t} = useTranslation();
+
+ const [searchValue, setSearchValue] = useState('');
+ const [autoExpandParent, setAutoExpandParent] = useState(true);
+
+ const flatten = (elemObj) => [elemObj, ...(elemObj.children?.flatMap(flatten) || [])];
+ const flatTreeData = sourceJSON && flatten(sourceJSON);
+
+ const elementMatchesSearch = useCallback(
+ (element, value) => {
+ const checkedAttrTexts = Object.entries(element.attributes)
+ .filter(([name]) => IMPORTANT_SOURCE_ATTRS.includes(name) || showSourceAttrs)
+ .map(([name, attrValue]) => name + attrValue);
+ const allCheckedTexts = element.tagName + checkedAttrTexts;
+ return allCheckedTexts.toLowerCase().includes(value.toLowerCase());
+ },
+ [showSourceAttrs],
+ );
+
+ const matchingElements = useMemo(
+ () =>
+ searchValue && flatTreeData
+ ? flatTreeData.filter((el) => elementMatchesSearch(el, searchValue))
+ : [],
+ [searchValue, flatTreeData, elementMatchesSearch],
+ );
+
+ const getHighlightedText = (text) => {
+ if (!searchValue) {
+ return text;
+ }
+
+ const index = text.toLowerCase().indexOf(searchValue.toLowerCase());
+ if (index < 0) {
+ return text;
+ }
+
+ const prefix = text.substring(0, index);
+ const suffix = text.slice(index + searchValue.length);
+ const matchedWord = text.slice(index, index + searchValue.length);
+
+ return (
+ <>
+ {prefix}
+ {matchedWord}
+ {suffix}
+ >
+ );
+ };
+
+ const getFormattedTag = (element) => {
+ const {tagName, attributes} = element;
+ let attrs = [];
+
+ for (let attr of Object.keys(attributes)) {
+ if ((IMPORTANT_SOURCE_ATTRS.includes(attr) && attributes[attr]) || showSourceAttrs) {
+ attrs.push(
+
+
+ {getHighlightedText(attr)} ="
+
+ {getHighlightedText(attributes[attr])}
+
+ "
+ ,
+ );
+ }
+ }
+
+ return (
+
+ <{getHighlightedText(tagName)}
+ {attrs}>
+
+ );
+ };
+
+ // Recurses through the source and renders a TreeNode for an element
+ const recursive = (elemObj) => {
+ if (!((elemObj || {}).children || []).length) {
+ return null;
+ }
+
+ return elemObj.children.map((el) => ({
+ title: getFormattedTag(el),
+ key: el.path,
+ children: recursive(el),
+ }));
+ };
+
+ const treeData = sourceJSON && recursive(sourceJSON);
+
+ // No need to recalculate if e.g. attribute visibility is toggled
+ const expandedKeys = useMemo(
+ () => [...matchingElements.map((el) => el.path), ...expandedPaths],
+ [matchingElements, expandedPaths],
+ );
+
+ const expandNode = (nextExpandedPaths) => {
+ setExpandedPaths(nextExpandedPaths);
+ setAutoExpandParent(false);
+ };
+
+ const collapseAllNodes = () => {
+ setExpandedPaths([]);
+ setAutoExpandParent(false);
+ };
+
+ const onSearchChange = (event) => {
+ const {value} = event.target;
+ setSearchValue(value);
+ setAutoExpandParent(value !== '');
+ };
+
+ return (
+
+ {!sourceJSON && !sourceError &&
{t('Gathering initial app source…')} }
+ {sourceError && t('couldNotObtainSource', {errorMsg: JSON.stringify(sourceError)})}
+ {/* Show loading indicator in MJPEG mode if a method call is in progress and source refresh is on */}
+
+ {/* Must switch to a new antd Tree component when there's changes to treeData */}
+ {treeData ? (
+
+ ) : (
+
+ )}
+
+
+ );
+};
+
+export default AppSourceTreeWrapper;
diff --git a/app/common/renderer/components/SessionInspector/SourceTab/SelectedElement/InteractionsNotAvailableMessage.jsx b/app/common/renderer/components/SessionInspector/SourceTab/SelectedElement/InteractionsNotAvailableMessage.jsx
new file mode 100644
index 0000000000..3ece0b3bb4
--- /dev/null
+++ b/app/common/renderer/components/SessionInspector/SourceTab/SelectedElement/InteractionsNotAvailableMessage.jsx
@@ -0,0 +1,26 @@
+import {Alert, Col, Row} from 'antd';
+import {useTranslation} from 'react-i18next';
+
+import {ALERT, ROW} from '../../../../constants/antd-types.js';
+import styles from './SelectedElement.module.css';
+
+/**
+ * Info message shown when the selected element does not support interactions,
+ * most likely due to the app source having changed since the element was selected.
+ */
+const InteractionsNotAvailableMessage = ({elementInteractionsNotAvailable}) => {
+ const {t} = useTranslation();
+
+ if (!elementInteractionsNotAvailable) {
+ return null;
+ }
+ return (
+
+
+
+
+
+ );
+};
+
+export default InteractionsNotAvailableMessage;
diff --git a/app/common/renderer/components/SessionInspector/SourceTab/SelectedElement/SelectedElement.jsx b/app/common/renderer/components/SessionInspector/SourceTab/SelectedElement/SelectedElement.jsx
new file mode 100644
index 0000000000..54b3b9a1be
--- /dev/null
+++ b/app/common/renderer/components/SessionInspector/SourceTab/SelectedElement/SelectedElement.jsx
@@ -0,0 +1,93 @@
+import {Space, Spin} from 'antd';
+import _ from 'lodash';
+
+import inspectorStyles from '../../SessionInspector.module.css';
+import InteractionsNotAvailableMessage from './InteractionsNotAvailableMessage.jsx';
+import SelectedElementActions from './SelectedElementActions.jsx';
+import SelectedElementAttributesTable from './SelectedElementAttributesTable.jsx';
+import SelectedElementBoxModel from './SelectedElementBoxModel.jsx';
+import SelectedElementCard from './SelectedElementCard.jsx';
+import SelectedElementLocatorsTable from './SelectedElementLocatorsTable.jsx';
+import SnapshotMaxDepthReachedMessage from './SnapshotMaxDepthReachedMessage.jsx';
+import XpathNotRecommendedMessage from './XpathNotRecommendedMessage.jsx';
+
+/**
+ * Placeholder shown for the element ID while the element search is in progress.
+ */
+const ElementIdLoader = () => ;
+
+/**
+ * The full panel for the selected element.
+ */
+const SelectedElement = (props) => {
+ const {
+ applyClientMethod,
+ currentContext,
+ findElementsExecutionTimes,
+ isFindingElementsTimes,
+ selectedElement,
+ selectedElementId,
+ selectedElementPath,
+ elementInteractionsNotAvailable,
+ selectedElementSearchInProgress,
+ sessionSettings,
+ } = props;
+
+ const elementActionsDisabled = selectedElementSearchInProgress || isFindingElementsTimes;
+
+ // Get the data for the attributes table
+ const elementAttributesData = _.toPairs(selectedElement.attributes).map(([key, value]) => ({
+ key,
+ value,
+ name: key,
+ }));
+ elementAttributesData.unshift({
+ key: 'elementId',
+ value: selectedElementSearchInProgress ? : selectedElementId,
+ name: 'elementId',
+ });
+
+ // Get the data for the strategies table
+ const elementLocatorsData = selectedElement.strategyMap.map(([key, selector]) => ({
+ key,
+ selector,
+ find: key,
+ }));
+
+ return (
+
+
+
+
+
+
+
+
+
+
+
+ );
+};
+
+export default SelectedElement;
diff --git a/app/common/renderer/components/SessionInspector/SourceTab/SelectedElement/SelectedElement.module.css b/app/common/renderer/components/SessionInspector/SourceTab/SelectedElement/SelectedElement.module.css
new file mode 100644
index 0000000000..1fda3e0d99
--- /dev/null
+++ b/app/common/renderer/components/SessionInspector/SourceTab/SelectedElement/SelectedElement.module.css
@@ -0,0 +1,104 @@
+.selectedElementCard {
+ display: flex;
+ flex-direction: column;
+}
+
+.selectedElementCard :global(.ant-card-body) {
+ flex: 1;
+ overflow: auto;
+}
+
+.selectedElemInfoMessage {
+ justify-content: center;
+}
+
+.selectedElemActions {
+ gap: 8px;
+}
+
+.elementKeyInputActions {
+ max-width: 400px;
+ flex: 1;
+}
+
+.elementKeyInput {
+ height: 32px;
+ width: calc(100% - 64px);
+}
+
+.selectedElemTableWrapper {
+ display: flex;
+ width: 100%;
+}
+
+.selectedElemTableWrapper > div {
+ width: 100%;
+}
+
+.selectedElemTableCells {
+ word-wrap: break-all;
+ word-break: break-all;
+}
+
+.copyableCell {
+ cursor: pointer;
+}
+
+.selectedElemBoxModelWrapper {
+ height: 90px;
+ max-width: 300px;
+ margin: auto;
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+}
+
+.selectedElemWidth {
+ text-align: center;
+}
+
+.selectedElemHeightPlusBoxWrapper {
+ display: flex;
+ align-items: center;
+ height: 100%;
+ gap: 8px;
+}
+
+.selectedElemBoxWrapper {
+ position: relative;
+ flex: 1;
+ height: 70px;
+ border: 1px dashed var(--ant-blue-6);
+ background-color: var(--ant-blue-1);
+}
+
+.selectedElemTopLeft {
+ position: absolute;
+ left: 4px;
+ top: 4px;
+}
+
+.selectedElemTopRight {
+ position: absolute;
+ right: 4px;
+ top: 4px;
+}
+
+.selectedElemMidpoint {
+ display: grid;
+ height: 70px;
+ align-items: center;
+ place-items: center;
+}
+
+.selectedElemBottomLeft {
+ position: absolute;
+ left: 4px;
+ bottom: 4px;
+}
+
+.selectedElemBottomRight {
+ position: absolute;
+ right: 4px;
+ bottom: 4px;
+}
diff --git a/app/common/renderer/components/SessionInspector/SourceTab/SelectedElement/SelectedElementActions.jsx b/app/common/renderer/components/SessionInspector/SourceTab/SelectedElement/SelectedElementActions.jsx
new file mode 100644
index 0000000000..0f460bdbde
--- /dev/null
+++ b/app/common/renderer/components/SessionInspector/SourceTab/SelectedElement/SelectedElementActions.jsx
@@ -0,0 +1,86 @@
+import {IconEraser, IconFocus2, IconSend2, IconStopwatch} from '@tabler/icons-react';
+import {Button, Input, Row, Space, Tooltip} from 'antd';
+import {useRef} from 'react';
+import {useTranslation} from 'react-i18next';
+
+import {ROW} from '../../../../constants/antd-types.js';
+import styles from './SelectedElement.module.css';
+
+/**
+ * Action buttons for the selected element, including tap, send keys, clear, and get timing.
+ */
+const SelectedElementActions = (props) => {
+ const {
+ elementActionsDisabled,
+ elementInteractionsNotAvailable,
+ selectedElementSearchInProgress,
+ applyClientMethod,
+ selectedElementId,
+ getFindElementsTimes,
+ elementLocatorsData,
+ } = props;
+ const {t} = useTranslation();
+ const sendKeysRef = useRef(null);
+
+ const tapButtonLoadingState =
+ !(elementInteractionsNotAvailable || selectedElementId) || selectedElementSearchInProgress;
+
+ return (
+
+
+ }
+ loading={tapButtonLoadingState}
+ id="btnTapElement"
+ onClick={() =>
+ applyClientMethod({methodName: 'elementClick', elementId: selectedElementId})
+ }
+ />
+
+
+ (sendKeysRef.current = e.target.value)}
+ />
+
+ }
+ onClick={() =>
+ applyClientMethod({
+ methodName: 'elementSendKeys',
+ elementId: selectedElementId,
+ args: [sendKeysRef.current || ''],
+ })
+ }
+ />
+
+
+ }
+ onClick={() =>
+ applyClientMethod({methodName: 'elementClear', elementId: selectedElementId})
+ }
+ />
+
+
+
+ }
+ onClick={() => getFindElementsTimes(elementLocatorsData)}
+ />
+
+
+ );
+};
+
+export default SelectedElementActions;
diff --git a/app/common/renderer/components/SessionInspector/SourceTab/SelectedElement/SelectedElementAttributesTable.jsx b/app/common/renderer/components/SessionInspector/SourceTab/SelectedElement/SelectedElementAttributesTable.jsx
new file mode 100644
index 0000000000..55c51c5399
--- /dev/null
+++ b/app/common/renderer/components/SessionInspector/SourceTab/SelectedElement/SelectedElementAttributesTable.jsx
@@ -0,0 +1,33 @@
+import {useTranslation} from 'react-i18next';
+
+import SelectedElementTable from './SelectedElementTable.jsx';
+import SelectedElementTableCell from './SelectedElementTableCell.jsx';
+
+/**
+ * Table listing the selected element's attributes.
+ */
+const SelectedElementAttributesTable = ({elementAttributesData}) => {
+ const {t} = useTranslation();
+
+ const elementAttributesCols = [
+ {
+ title: t('Attribute'),
+ dataIndex: 'name',
+ key: 'name',
+ fixed: 'start',
+ render: (text) => ,
+ },
+ {
+ title: t('Value'),
+ dataIndex: 'value',
+ key: 'value',
+ render: (text) => ,
+ },
+ ];
+
+ return (
+
+ );
+};
+
+export default SelectedElementAttributesTable;
diff --git a/app/common/renderer/components/SessionInspector/SourceTab/SelectedElement/SelectedElementBoxModel.jsx b/app/common/renderer/components/SessionInspector/SourceTab/SelectedElement/SelectedElementBoxModel.jsx
new file mode 100644
index 0000000000..8ecefe85f7
--- /dev/null
+++ b/app/common/renderer/components/SessionInspector/SourceTab/SelectedElement/SelectedElementBoxModel.jsx
@@ -0,0 +1,68 @@
+import _ from 'lodash';
+import {useTranslation} from 'react-i18next';
+
+import {parseCoordinates} from '../../../../utils/other.js';
+import inspectorStyles from '../../SessionInspector.module.css';
+import styles from './SelectedElement.module.css';
+import SelectedElementTable from './SelectedElementTable.jsx';
+
+/**
+ * Cell rendering the element's box model.
+ */
+const SelectedElementBoxModelContents = ({dataPoints}) => {
+ const {x1, y1, x2, y2, xMiddle, yMiddle} = dataPoints;
+ const monoText = (text) => {text} ;
+ const monoCoords = (x, y) => monoText(`(${x}, ${y})`);
+
+ return (
+
+
{monoText(x2 - x1)}
+
+
{monoText(y2 - y1)}
+
+
{monoCoords(x1, y1)}
+
{monoCoords(x2, y1)}
+
{monoCoords(xMiddle, yMiddle)}
+
{monoCoords(x1, y2)}
+
{monoCoords(x2, y2)}
+
+
+
+ );
+};
+
+/**
+ * Single-cell table containing the element's box model.
+ * Table is used for consistency with the other selected element items.
+ */
+const SelectedElementBoxModel = ({selectedElement}) => {
+ const {t} = useTranslation();
+
+ const extractedCoords = parseCoordinates(selectedElement);
+ if (_.isEmpty(extractedCoords)) {
+ return null;
+ }
+ const {x1, y1, x2, y2} = extractedCoords;
+ const xMiddle = x1 + (x2 - x1) / 2;
+ const yMiddle = y1 + (y2 - y1) / 2;
+
+ const elementBoxModelData = [
+ {
+ key: 'data',
+ boxmodel: {x1, y1, x2, y2, xMiddle, yMiddle},
+ },
+ ];
+
+ const elementBoxModelCol = [
+ {
+ title: t('Box Model'),
+ dataIndex: 'boxmodel',
+ key: 'boxmodel',
+ render: (dataPoints) => ,
+ },
+ ];
+
+ return ;
+};
+
+export default SelectedElementBoxModel;
diff --git a/app/common/renderer/components/SessionInspector/SourceTab/SelectedElement/SelectedElementCard.jsx b/app/common/renderer/components/SessionInspector/SourceTab/SelectedElement/SelectedElementCard.jsx
new file mode 100644
index 0000000000..1d55f616d5
--- /dev/null
+++ b/app/common/renderer/components/SessionInspector/SourceTab/SelectedElement/SelectedElementCard.jsx
@@ -0,0 +1,94 @@
+import {IconDownload, IconFiles, IconTag} from '@tabler/icons-react';
+import {Button, Card, Flex, Tooltip} from 'antd';
+import {useTranslation} from 'react-i18next';
+
+import {downloadFile} from '../../../../utils/file-handling.js';
+import {copyToClipboard} from '../../../../utils/other.js';
+import styles from './SelectedElement.module.css';
+
+/**
+ * Title of the selected element's wrapper card, with its dedicated icon.
+ */
+const SelectedElementPanelTitle = () => {
+ const {t} = useTranslation();
+ return (
+
+
+ {t('selectedElement')}
+
+ );
+};
+
+/**
+ * Buttons shown in the selected element's wrapper card.
+ */
+const SelectedElementHeaderButtons = ({
+ elementAttributesData,
+ elementActionsDisabled,
+ selectedElementId,
+ applyClientMethod,
+}) => {
+ const {t} = useTranslation();
+
+ const downloadElementScreenshot = async (elementId) => {
+ const elemScreenshot = await applyClientMethod({
+ methodName: 'takeElementScreenshot',
+ elementId,
+ skipRefresh: true,
+ });
+ const href = `data:image/png;base64,${elemScreenshot}`;
+ const filename = `element-${elementId}.png`;
+ downloadFile(href, filename);
+ };
+
+ return (
+
+
+ }
+ onClick={() => copyToClipboard(JSON.stringify(elementAttributesData))}
+ />
+
+
+ }
+ id="btnDownloadElemScreenshot"
+ onClick={() => downloadElementScreenshot(selectedElementId)}
+ />
+
+
+ );
+};
+
+/**
+ * The selected element panel's wrapper card, with title and action buttons.
+ */
+const SelectedElementCard = ({
+ applyClientMethod,
+ selectedElementId,
+ elementActionsDisabled,
+ elementAttributesData,
+ children,
+}) => (
+ }
+ className={styles.selectedElementCard}
+ extra={
+
+ }
+ >
+ {children}
+
+);
+
+export default SelectedElementCard;
diff --git a/app/common/renderer/components/SessionInspector/SourceTab/SelectedElement/SelectedElementLocatorsTable.jsx b/app/common/renderer/components/SessionInspector/SourceTab/SelectedElement/SelectedElementLocatorsTable.jsx
new file mode 100644
index 0000000000..0c953a054d
--- /dev/null
+++ b/app/common/renderer/components/SessionInspector/SourceTab/SelectedElement/SelectedElementLocatorsTable.jsx
@@ -0,0 +1,86 @@
+import {Spin} from 'antd';
+import {useTranslation} from 'react-i18next';
+
+import {LINKS} from '../../../../constants/common.js';
+import {LOCATOR_STRATEGIES} from '../../../../constants/session-inspector.js';
+import {openLink} from '../../../../polyfills.js';
+import SelectedElementTable from './SelectedElementTable.jsx';
+import SelectedElementTableCell from './SelectedElementTableCell.jsx';
+
+const locatorStrategyDocsLink = (name, docsLink) => (
+
+ {name}
+
+ e.preventDefault() || openLink(docsLink)}>
+
+ (docs)
+
+
+
+);
+
+const modifySuggestedLocatorsData = (suggestedLocatorsData) => {
+ const suggestedLocsDataCopy = structuredClone(suggestedLocatorsData);
+ for (const locator of suggestedLocsDataCopy) {
+ switch (locator.key) {
+ case LOCATOR_STRATEGIES.CLASS_CHAIN:
+ locator.find = locatorStrategyDocsLink(locator.key, LINKS.CLASS_CHAIN_DOCS);
+ break;
+ case LOCATOR_STRATEGIES.PREDICATE:
+ locator.find = locatorStrategyDocsLink(locator.key, LINKS.PREDICATE_DOCS);
+ break;
+ case LOCATOR_STRATEGIES.UIAUTOMATOR:
+ locator.find = locatorStrategyDocsLink(locator.key, LINKS.UIAUTOMATOR_DOCS);
+ break;
+ }
+ }
+ return suggestedLocsDataCopy;
+};
+
+/**
+ * Table listing the selected element's suggested locators.
+ */
+const SelectedElementLocatorsTable = (props) => {
+ const {findElementsExecutionTimes, isFindingElementsTimes, elementLocatorsData} = props;
+ const {t} = useTranslation();
+
+ const executionTimesExist = findElementsExecutionTimes.length > 0;
+
+ const elementLocatorsCols = [
+ {
+ title: t('Find By'),
+ dataIndex: 'find',
+ key: 'find',
+ fixed: 'start',
+ render: (text) => ,
+ },
+ {
+ title: t('Selector'),
+ dataIndex: 'selector',
+ key: 'selector',
+ render: (text) => ,
+ },
+ ];
+
+ if (executionTimesExist) {
+ elementLocatorsCols.push({
+ title: t('Time'),
+ dataIndex: 'time',
+ key: 'time',
+ fixed: 'end',
+ render: (text) => ,
+ });
+ }
+
+ const suggestedLocsData = modifySuggestedLocatorsData(
+ executionTimesExist ? findElementsExecutionTimes : elementLocatorsData,
+ );
+
+ return (
+
+
+
+ );
+};
+
+export default SelectedElementLocatorsTable;
diff --git a/app/common/renderer/components/SessionInspector/SourceTab/SelectedElement/SelectedElementTable.jsx b/app/common/renderer/components/SessionInspector/SourceTab/SelectedElement/SelectedElementTable.jsx
new file mode 100644
index 0000000000..73d42dc532
--- /dev/null
+++ b/app/common/renderer/components/SessionInspector/SourceTab/SelectedElement/SelectedElementTable.jsx
@@ -0,0 +1,20 @@
+import {Row, Table} from 'antd';
+
+import styles from './SelectedElement.module.css';
+
+/**
+ * Generic table component for displaying selected element data.
+ */
+const SelectedElementTable = ({columns, dataSource}) => (
+
+
+
+);
+
+export default SelectedElementTable;
diff --git a/app/common/renderer/components/SessionInspector/SourceTab/SelectedElement/SelectedElementTableCell.jsx b/app/common/renderer/components/SessionInspector/SourceTab/SelectedElement/SelectedElementTableCell.jsx
new file mode 100644
index 0000000000..d743c4d069
--- /dev/null
+++ b/app/common/renderer/components/SessionInspector/SourceTab/SelectedElement/SelectedElementTableCell.jsx
@@ -0,0 +1,28 @@
+import {Tooltip} from 'antd';
+import {useTranslation} from 'react-i18next';
+
+import {copyToClipboard} from '../../../../utils/other.js';
+import inspectorStyles from '../../SessionInspector.module.css';
+import styles from './SelectedElement.module.css';
+
+/**
+ * Generic cell component for the selected element's tables. Can optionally be copyable.
+ */
+const SelectedElementTableCell = ({text, isCopyable}) => {
+ const {t} = useTranslation();
+ const monoText = {text} ;
+
+ const cellContent = isCopyable ? (
+
+ copyToClipboard(text)}>
+ {monoText}
+
+
+ ) : (
+ monoText
+ );
+
+ return {cellContent}
;
+};
+
+export default SelectedElementTableCell;
diff --git a/app/common/renderer/components/SessionInspector/SourceTab/SelectedElement/SnapshotMaxDepthReachedMessage.jsx b/app/common/renderer/components/SessionInspector/SourceTab/SelectedElement/SnapshotMaxDepthReachedMessage.jsx
new file mode 100644
index 0000000000..ecdcbc6c27
--- /dev/null
+++ b/app/common/renderer/components/SessionInspector/SourceTab/SelectedElement/SnapshotMaxDepthReachedMessage.jsx
@@ -0,0 +1,30 @@
+import {Alert, Col, Row} from 'antd';
+import {useTranslation} from 'react-i18next';
+
+import {ALERT, ROW} from '../../../../constants/antd-types.js';
+import styles from './SelectedElement.module.css';
+
+/**
+ * Info message shown when the selected element's path has reached the session's snapshotMaxDepth.
+ */
+const SnapshotMaxDepthReachedMessage = ({selectedElementPath, sessionSettings}) => {
+ const {t} = useTranslation();
+ const selectedElementDepth = selectedElementPath.split('.').length;
+
+ if (selectedElementDepth !== sessionSettings.snapshotMaxDepth) {
+ return null;
+ }
+ return (
+
+
+
+
+
+ );
+};
+
+export default SnapshotMaxDepthReachedMessage;
diff --git a/app/common/renderer/components/SessionInspector/SourceTab/SelectedElement/XpathNotRecommendedMessage.jsx b/app/common/renderer/components/SessionInspector/SourceTab/SelectedElement/XpathNotRecommendedMessage.jsx
new file mode 100644
index 0000000000..2363f67150
--- /dev/null
+++ b/app/common/renderer/components/SessionInspector/SourceTab/SelectedElement/XpathNotRecommendedMessage.jsx
@@ -0,0 +1,19 @@
+import {Alert} from 'antd';
+import {useTranslation} from 'react-i18next';
+
+import {ALERT} from '../../../../constants/antd-types.js';
+import {NATIVE_APP} from '../../../../constants/session-inspector.js';
+
+/**
+ * Warning message shown when XPath is the only optimal locator strategy for a native element.
+ */
+const XpathNotRecommendedMessage = ({currentContext, elementLocatorsData}) => {
+ const {t} = useTranslation();
+
+ if (currentContext !== NATIVE_APP || elementLocatorsData.length !== 1) {
+ return null;
+ }
+ return ;
+};
+
+export default XpathNotRecommendedMessage;
diff --git a/app/common/renderer/components/SessionInspector/SourceTab/SourceTab.jsx b/app/common/renderer/components/SessionInspector/SourceTab/SourceTab.jsx
new file mode 100644
index 0000000000..94ff6c79c1
--- /dev/null
+++ b/app/common/renderer/components/SessionInspector/SourceTab/SourceTab.jsx
@@ -0,0 +1,29 @@
+import {Splitter} from 'antd';
+
+import AppSource from './AppSource/AppSource.jsx';
+import SelectedElement from './SelectedElement/SelectedElement.jsx';
+
+const SourceTab = (props) => {
+ const {selectedElement = {}} = props;
+
+ const hasSelectedElement = Object.keys(selectedElement).length > 0;
+
+ return (
+
+
+
+
+ {hasSelectedElement && (
+
+
+
+ )}
+
+ );
+};
+
+export default SourceTab;
diff --git a/app/renderer/components/Spinner/Spinner.js b/app/common/renderer/components/Spinner/Spinner.jsx
similarity index 68%
rename from app/renderer/components/Spinner/Spinner.js
rename to app/common/renderer/components/Spinner/Spinner.jsx
index 731beff575..47d8db10ba 100644
--- a/app/renderer/components/Spinner/Spinner.js
+++ b/app/common/renderer/components/Spinner/Spinner.jsx
@@ -1,6 +1,4 @@
-import React from 'react';
-
-import styles from './Spinner.css';
+import styles from './Spinner.module.css';
const Spinner = () => (
diff --git a/app/renderer/components/Spinner/Spinner.css b/app/common/renderer/components/Spinner/Spinner.module.css
similarity index 100%
rename from app/renderer/components/Spinner/Spinner.css
rename to app/common/renderer/components/Spinner/Spinner.module.css
diff --git a/app/common/renderer/constants/antd-types.js b/app/common/renderer/constants/antd-types.js
new file mode 100644
index 0000000000..bfc61deb43
--- /dev/null
+++ b/app/common/renderer/constants/antd-types.js
@@ -0,0 +1,29 @@
+// Constants used as antd element property values
+
+export const ALERT = {
+ ERROR: 'error',
+ WARNING: 'warning',
+ INFO: 'info',
+};
+
+export const BUTTON = {
+ DEFAULT: 'default',
+ PRIMARY: 'primary',
+ DASHED: 'dashed',
+ TEXT: 'text',
+ LINK: 'link',
+};
+
+export const INPUT = {
+ NUMBER: 'number',
+ TEXT: 'text',
+ TEXTAREA: 'textarea',
+ PASSWORD: 'password',
+ SUBMIT: 'submit',
+};
+
+export const NOTIF = {ERROR: 'error', SUCCESS: 'success'};
+
+export const ROW = {FLEX: 'flex'};
+
+export const TABLE_TAB = {ADD: 'add', REMOVE: 'remove'};
diff --git a/app/common/renderer/constants/commands.js b/app/common/renderer/constants/commands.js
new file mode 100644
index 0000000000..1700435498
--- /dev/null
+++ b/app/common/renderer/constants/commands.js
@@ -0,0 +1,381 @@
+/**
+ * Only used for the dynamic commands map.
+ * Not all Appium commands exist in WDIO, and for those that do, they may have different names.
+ * Since commands are retrieved with their Appium names, but executed using their WDIO names,
+ * they must be filtered and renamed first, thereby requiring this mapping.
+ * Any commands not in this map are considered to be unsupported.
+ *
+ * NOTE: This map should be updated whenever:
+ * * WDIO or Appium adds a new command that already exists in the other tool
+ * * WDIO or Appium changes the name of any command in this list
+ */
+export const APPIUM_TO_WD_COMMANDS = {
+ // WDIO WebDriver standard protocol commands
+ // https://webdriver.io/docs/api/webdriver
+ // createSession: 'newSession', // not applicable for Commands tab
+ // deleteSession: 'deleteSession', // not applicable for Commands tab
+ getStatus: 'status',
+ getTimeouts: 'getTimeouts',
+ timeouts: 'setTimeouts',
+ getUrl: 'getUrl',
+ setUrl: 'navigateTo',
+ back: 'back',
+ forward: 'forward',
+ refresh: 'refresh',
+ title: 'getTitle',
+ getWindowHandle: 'getWindowHandle',
+ closeWindow: 'closeWindow',
+ setWindow: 'switchToWindow',
+ createNewWindow: 'createWindow',
+ getWindowHandles: 'getWindowHandles',
+ printPage: 'printPage',
+ setFrame: 'switchToFrame',
+ switchToParentFrame: 'switchToParentFrame',
+ getWindowRect: 'getWindowRect',
+ setWindowRect: 'setWindowRect',
+ maximizeWindow: 'maximizeWindow',
+ minimizeWindow: 'minimizeWindow',
+ fullScreenWindow: 'fullscreenWindow',
+ findElement: 'findElement',
+ findElementFromShadowRoot: 'findElementFromShadowRoot',
+ findElements: 'findElements',
+ findElementsFromShadowRoot: 'findElementsFromShadowRoot',
+ findElementFromElement: 'findElementFromElement',
+ findElementsFromElement: 'findElementsFromElement',
+ elementShadowRoot: 'getElementShadowRoot',
+ active: 'getActiveElement',
+ elementSelected: 'isElementSelected',
+ elementDisplayed: 'isElementDisplayed',
+ getAttribute: 'getElementAttribute',
+ getProperty: 'getElementProperty',
+ getCssProperty: 'getElementCSSValue',
+ getText: 'getElementText',
+ getName: 'getElementTagName',
+ getElementRect: 'getElementRect',
+ elementEnabled: 'isElementEnabled',
+ click: 'elementClick', // also WDIO touchClick (removed in Appium 3)
+ clear: 'elementClear',
+ setValue: 'elementSendKeys',
+ getPageSource: 'getPageSource',
+ execute: 'executeScript',
+ executeAsync: 'executeAsyncScript',
+ getCookies: 'getAllCookies',
+ setCookie: 'addCookie',
+ deleteCookies: 'deleteAllCookies',
+ getCookie: 'getNamedCookie',
+ deleteCookie: 'deleteCookie',
+ performActions: 'performActions',
+ releaseActions: 'releaseActions',
+ postDismissAlert: 'dismissAlert',
+ postAcceptAlert: 'acceptAlert',
+ getAlertText: 'getAlertText',
+ setAlertText: 'sendAlertText',
+ getScreenshot: 'takeScreenshot',
+ getElementScreenshot: 'takeElementScreenshot',
+ getComputedRole: 'getElementComputedRole',
+ getComputedLabel: 'getElementComputedLabel',
+ // WDIO WebDriver extended protocol commands
+ // https://webdriver.io/docs/api/webdriver
+ setPermissions: 'setPermissions',
+ generateTestReport: 'generateTestReport',
+ createVirtualSensor: 'createMockSensor',
+ getVirtualSensorInfo: 'getMockSensor',
+ updateVirtualSensorReading: 'updateMockSensor',
+ deleteVirtualSensor: 'deleteMockSensor',
+ addVirtualAuthenticator: 'addVirtualAuthenticator',
+ removeVirtualAuthenticator: 'removeVirtualAuthenticator',
+ addAuthCredential: 'addCredential',
+ getAuthCredential: 'getCredentials',
+ removeAllAuthCredentials: 'removeAllCredentials',
+ removeAuthCredential: 'removeCredential',
+ setUserAuthVerified: 'setUserVerified',
+ // WDIO MJSONWP commands
+ // https://webdriver.io/docs/api/mjsonwp
+ getNetworkConnection: 'getNetworkConnection',
+ setNetworkConnection: 'setNetworkConnection',
+ // WDIO Appium protocol commands (includes some JSONWP/MJSONWP)
+ // https://webdriver.io/docs/api/appium
+ getLog: 'getLogs',
+ getLogTypes: 'getLogTypes',
+ getSession: 'getSession',
+ getCurrentContext: 'getAppiumContext',
+ getContexts: 'getAppiumContexts',
+ setContext: 'switchAppiumContext',
+ listCommands: 'getAppiumCommands',
+ listExtensions: 'getAppiumExtensions',
+ getAppiumSessionCapabilities: 'getAppiumSessionCapabilities',
+ setRotation: 'rotateDevice',
+ installApp: 'installApp',
+ activateApp: 'activateApp',
+ removeApp: 'removeApp',
+ terminateApp: 'terminateApp',
+ isAppInstalled: 'isAppInstalled',
+ queryAppState: 'queryAppState',
+ hideKeyboard: 'hideKeyboard',
+ isKeyboardShown: 'isKeyboardShown',
+ pushFile: 'pushFile',
+ pullFile: 'pullFile',
+ pullFolder: 'pullFolder',
+ getDeviceTime: 'getDeviceTime',
+ getSettings: 'getSettings',
+ updateSettings: 'updateSettings',
+ executeDriverScript: 'executeDriverScript', // execute-driver-plugin
+ getLogEvents: 'getEvents',
+ logCustomEvent: 'logEvent',
+ compareImages: 'compareImages', // images-plugin
+ availableIMEEngines: 'availableIMEEngines',
+ getActiveIMEEngine: 'getActiveIMEEngine',
+ isIMEActivated: 'isIMEActivated',
+ deactivateIMEEngine: 'deactivateIMEEngine',
+ activateIMEEngine: 'activateIMEEngine',
+ getOrientation: 'getOrientation',
+ setOrientation: 'setOrientation',
+ setGeoLocation: 'setGeoLocation',
+ getGeoLocation: 'getGeoLocation',
+ // WDIO Appium protocol commands removed in Appium 3
+ mobileShake: 'appiumShake',
+ lock: 'appiumLock',
+ unlock: 'appiumUnlock',
+ isLocked: 'appiumIsLocked',
+ startRecordingScreen: 'startRecordingScreen', // moved to drivers
+ stopRecordingScreen: 'stopRecordingScreen', // moved to drivers
+ getPerformanceDataTypes: 'appiumGetPerformanceDataTypes',
+ getPerformanceData: 'appiumGetPerformanceData',
+ pressKeyCode: 'appiumPressKeyCode',
+ longPressKeyCode: 'appiumLongPressKeyCode',
+ keyevent: 'appiumSendKeyEvent',
+ getCurrentActivity: 'appiumGetCurrentActivity',
+ getCurrentPackage: 'appiumGetCurrentPackage',
+ toggleFlightMode: 'appiumToggleAirplaneMode',
+ toggleData: 'appiumToggleData',
+ toggleWiFi: 'appiumToggleWiFi',
+ toggleLocationServices: 'appiumToggleLocationServices',
+ networkSpeed: 'appiumToggleNetworkSpeed',
+ openNotifications: 'appiumOpenNotifications',
+ startActivity: 'appiumStartActivity',
+ getSystemBars: 'appiumGetSystemBars',
+ getDisplayDensity: 'appiumGetDisplayDensity',
+ touchId: 'appiumTouchId',
+ toggleEnrollTouchId: 'appiumToggleEnrollTouchId',
+ launchApp: 'appiumLaunchApp',
+ closeApp: 'appiumCloseApp',
+ background: 'appiumBackground',
+ endCoverage: 'endCoverage',
+ getStrings: 'appiumGetStrings',
+ setValueImmediate: 'setValueImmediate',
+ replaceValue: 'replaceValue',
+ receiveAsyncResponse: 'receiveAsyncResponse',
+ gsmCall: 'appiumGsmCall',
+ gsmSignal: 'appiumGsmSignal',
+ powerCapacity: 'appiumPowerCapacity',
+ powerAC: 'appiumPowerAC',
+ gsmVoice: 'appiumGsmVoice',
+ sendSMS: 'appiumSendSms',
+ fingerprint: 'appiumFingerPrint',
+ setClipboard: 'appiumSetClipboard',
+ getClipboard: 'appiumGetClipboard',
+ performTouch: 'touchPerform',
+ performMultiAction: 'multiTouchPerform',
+ implicitWait: 'implicitWait',
+ getLocationInView: 'getLocationInView',
+ keys: 'sendKeys',
+ asyncScriptTimeout: 'asyncScriptTimeout',
+ submit: 'submit',
+ getSize: 'getElementSize',
+ getLocation: 'getElementLocation',
+ touchDown: 'touchDown',
+ touchUp: 'touchUp',
+ touchMove: 'touchMove',
+ touchLongClick: 'touchLongClick',
+ flick: 'touchFlick',
+};
+
+/**
+ * Only used for the dynamic commands map.
+ * Certain commands differ in their signature between Appium and WDIO,
+ * so the WDIO formats must be explicitly defined.
+ * Any URL parameters are excluded, as they are handled separately.
+ */
+export const COMMANDS_WITH_MISMATCHED_PARAMS = {
+ execute: [
+ // The WebDriver spec requires 'args' to be an array
+ // (https://w3c.github.io/webdriver/#dfn-extract-the-script-arguments-from-a-request),
+ // but if the script doesn't use any arguments, we allow the user to omit it.
+ // This is handled in Commands.jsx:prepareCommand.
+ {name: 'script', required: true},
+ {name: 'args', required: false},
+ ],
+ timeouts: [
+ // different order, no non-W3C params
+ {name: 'implicit', required: false},
+ {name: 'pageLoad', required: false},
+ {name: 'script', required: false},
+ ],
+ printPage: [
+ // page & margin separated into components
+ {name: 'orientation', required: false},
+ {name: 'scale', required: false},
+ {name: 'background', required: false},
+ {name: 'width', required: false},
+ {name: 'height', required: false},
+ {name: 'top', required: false},
+ {name: 'bottom', required: false},
+ {name: 'left', required: false},
+ {name: 'right', required: false},
+ {name: 'shrinkToFit', required: false},
+ {name: 'pageRanges', required: false},
+ ],
+ getDeviceTime: [], // only GET endpoint is supported
+ stopRecordingScreen: [
+ // options separated into components
+ {name: 'remotePath', required: false},
+ {name: 'username', required: false},
+ {name: 'password', required: false},
+ {name: 'method', required: false},
+ ],
+};
+
+/**
+ * Only used for the static commands map.
+ * Commonly used commands not hidden under a collapse.
+ */
+export const TOP_LEVEL_COMMANDS = {
+ executeScript: {
+ params: [
+ {name: 'script', required: true},
+ {name: 'args', required: false},
+ ],
+ },
+ updateSettings: {
+ params: [{name: 'settings', required: true}],
+ },
+ getSettings: {},
+};
+
+/**
+ * Only used for the static commands map.
+ * Defines the full mapping of categories and commands.
+ *
+ * NOTE: When changing top-level categories, update `en/translation.json`
+ */
+export const COMMAND_DEFINITIONS = {
+ Session: {
+ status: {},
+ getSession: {},
+ getAppiumCommands: {},
+ getAppiumExtensions: {},
+ getAppiumSessionCapabilities: {},
+ getTimeouts: {},
+ setTimeouts: {
+ params: [
+ {name: 'implicit', required: false},
+ {name: 'pageLoad', required: false},
+ {name: 'script', required: false},
+ ],
+ },
+ getLogTypes: {},
+ getLogs: {
+ params: [{name: 'type', required: true}],
+ },
+ },
+ Context: {
+ getAppiumContext: {},
+ getAppiumContexts: {},
+ switchAppiumContext: {
+ params: [{name: 'name', required: true}],
+ refresh: true,
+ },
+ },
+ 'Device Interaction': {
+ getWindowRect: {},
+ takeScreenshot: {},
+ getDeviceTime: {},
+ hideKeyboard: {
+ refresh: true,
+ },
+ isKeyboardShown: {},
+ getOrientation: {},
+ setOrientation: {
+ params: [{name: 'orientation', required: true}],
+ refresh: true,
+ },
+ getGeoLocation: {},
+ setGeoLocation: {
+ params: [{name: 'location', required: true}],
+ },
+ rotateDevice: {
+ params: [
+ {name: 'x', required: true},
+ {name: 'y', required: true},
+ {name: 'z', required: true},
+ ],
+ refresh: true,
+ },
+ },
+ 'App Management': {
+ installApp: {
+ params: [{name: 'appPath', required: true}],
+ },
+ isAppInstalled: {
+ params: [{name: 'appId', required: true}],
+ },
+ activateApp: {
+ params: [{name: 'appId', required: true}],
+ refresh: true,
+ },
+ terminateApp: {
+ params: [{name: 'appId', required: true}],
+ refresh: true,
+ },
+ removeApp: {
+ params: [{name: 'appId', required: true}],
+ },
+ queryAppState: {
+ params: [{name: 'appId', required: true}],
+ },
+ },
+ 'File Transfer': {
+ pushFile: {
+ params: [
+ {name: 'path', required: true},
+ {name: 'data', required: true},
+ ],
+ },
+ pullFile: {
+ params: [{name: 'path', required: true}],
+ },
+ pullFolder: {
+ params: [{name: 'path', required: true}],
+ },
+ },
+ Web: {
+ navigateTo: {
+ params: [{name: 'url', required: true}],
+ refresh: true,
+ },
+ getUrl: {},
+ back: {
+ refresh: true,
+ },
+ forward: {
+ refresh: true,
+ },
+ refresh: {
+ refresh: true,
+ },
+ getTitle: {},
+ getWindowHandle: {},
+ closeWindow: {
+ refresh: true,
+ },
+ switchToWindow: {
+ params: [{name: 'handle', required: true}],
+ refresh: true,
+ },
+ getWindowHandles: {},
+ createWindow: {
+ params: [{name: 'type', required: true}],
+ refresh: true,
+ },
+ },
+};
diff --git a/app/common/renderer/constants/common.js b/app/common/renderer/constants/common.js
new file mode 100644
index 0000000000..d171a843b0
--- /dev/null
+++ b/app/common/renderer/constants/common.js
@@ -0,0 +1,31 @@
+export const WINDOW_DIMENSIONS = {
+ MIN_WIDTH: 870,
+ MIN_HEIGHT: 610,
+ MAX_IMAGE_WIDTH_FRACTION: 0.4,
+};
+
+export const LINKS = {
+ CREATE_ISSUE: 'https://github.com/appium/appium-inspector/issues/new/choose',
+ CAPS_DOCS: 'https://appium.io/docs/en/latest/guides/caps/',
+ ADD_CAPS_DOCS:
+ 'https://appium.github.io/appium-inspector/latest/quickstart/starting-a-session/#adding-session-details',
+ HYBRID_MODE_DOCS: 'https://appium.github.io/appium.io/docs/en/writing-running-appium/web/hybrid/',
+ CLASS_CHAIN_DOCS:
+ 'https://github.com/facebookarchive/WebDriverAgent/wiki/Class-Chain-Queries-Construction-Rules',
+ PREDICATE_DOCS:
+ 'https://github.com/facebookarchive/WebDriverAgent/wiki/Predicate-Queries-Construction-Rules',
+ UIAUTOMATOR_DOCS:
+ 'https://github.com/appium/appium-uiautomator2-driver/blob/master/docs/uiautomator-uiselector.md',
+};
+
+export const DRIVERS = {
+ UIAUTOMATOR2: 'uiautomator2',
+ ESPRESSO: 'espresso',
+ XCUITEST: 'xcuitest',
+ FLUTTER: 'flutter',
+ MAC2: 'mac2',
+ WINDOWS: 'windows',
+ CHROMIUM: 'chromium',
+ SAFARI: 'safari',
+ GECKO: 'gecko',
+};
diff --git a/app/common/renderer/constants/gestures.js b/app/common/renderer/constants/gestures.js
new file mode 100644
index 0000000000..29375d1ca2
--- /dev/null
+++ b/app/common/renderer/constants/gestures.js
@@ -0,0 +1,68 @@
+// Columns in the saved gestures table
+export const SAVED_GESTURE_PROPS = {
+ NAME: 'Name',
+ DESCRIPTION: 'Description',
+ CREATED: 'Created',
+ ACTIONS: 'Actions',
+};
+
+export const POINTER_TYPES = {
+ POINTER_UP: 'pointerUp',
+ POINTER_DOWN: 'pointerDown',
+ PAUSE: 'pause',
+ POINTER_MOVE: 'pointerMove',
+ FILLER: 'filler',
+};
+
+export const POINTER_TYPES_MAP = {
+ [POINTER_TYPES.POINTER_UP]: 'Pointer Up',
+ [POINTER_TYPES.POINTER_DOWN]: 'Pointer Down',
+ [POINTER_TYPES.PAUSE]: 'Pause',
+ [POINTER_TYPES.POINTER_MOVE]: 'Move',
+};
+
+// Colors used to distinguish multiple pointers in the same gesture
+export const POINTER_COLORS = ['#FF3333', '#FF8F00', '#B65FF4', '#6CFF00', '#00FFDC'];
+
+// Default pointer shown upon creating a new gesture
+export const DEFAULT_POINTER = [
+ {
+ name: 'pointer1',
+ ticks: [{id: '1.1'}],
+ color: POINTER_COLORS[0],
+ id: '1',
+ },
+];
+
+// HTML cursor style (used when hovering over pointer title)
+export const CURSOR = {POINTER: 'pointer', TEXT: 'text'};
+
+// Properties for a single tick included in a pointer
+export const TICK_PROPS = {
+ POINTER_TYPE: 'pointerType',
+ DURATION: 'duration',
+ BUTTON: 'button',
+ X: 'x',
+ Y: 'y',
+};
+
+// Default duration for a pointer move action, in milliseconds
+export const POINTER_MOVE_DEFAULT_DURATION = 2500;
+
+export const POINTER_MOVE_COORDS_TYPE = {
+ PERCENTAGES: 'percentages',
+ PIXELS: 'pixels',
+};
+
+export const POINTER_DOWN_BTNS = {
+ LEFT: 0,
+ RIGHT: 1,
+};
+
+// Style for dots and lines drawn over the app screenshot
+export const GESTURE_ITEM_STYLES = {
+ FILLED: 'filled',
+ NEW_DASHED: 'newDashed',
+ WHOLE: 'whole',
+ DASHED: 'dashed',
+};
diff --git a/app/common/renderer/constants/screenshot.js b/app/common/renderer/constants/screenshot.js
new file mode 100644
index 0000000000..36de361a79
--- /dev/null
+++ b/app/common/renderer/constants/screenshot.js
@@ -0,0 +1,44 @@
+// Screenshot interaction modes
+// TAP_SWIPE refers to both TAP and SWIPE
+// GESTURE refers to playback via gesture editor
+export const SCREENSHOT_INTERACTION_MODE = {
+ SELECT: 'select',
+ SWIPE: 'swipe',
+ TAP: 'tap',
+ TAP_SWIPE: 'tap_swipe',
+ GESTURE: 'gesture',
+};
+
+// Default parameters when executing coordinate-based swipe over app screenshot
+export const DEFAULT_SWIPE = {
+ POINTER_NAME: 'finger1',
+ DURATION_1: 0,
+ DURATION_2: 750,
+ BUTTON: 0,
+ ORIGIN: 'viewport',
+};
+
+// Default parameters when executing coordinate-based tap over app screenshot
+export const DEFAULT_TAP = {
+ POINTER_NAME: 'finger1',
+ DURATION_1: 0,
+ DURATION_2: 100,
+ BUTTON: 0,
+};
+
+// 3 Types of Centroids:
+// CENTROID is the circle/square displayed on the screen
+// EXPAND is the +/- circle displayed on the screen
+// OVERLAP is the same as CENTROID but is only visible when clicked on +/- circle
+export const RENDER_CENTROID_AS = {
+ CENTROID: 'centroid',
+ EXPAND: 'expand',
+ OVERLAP: 'overlap',
+};
+
+export const CENTROID_STYLES = {
+ VISIBLE: 'visible',
+ HIDDEN: 'hidden',
+ CONTAINER: '50%',
+ NON_CONTAINER: '0%',
+};
diff --git a/app/common/renderer/constants/session-builder.js b/app/common/renderer/constants/session-builder.js
new file mode 100644
index 0000000000..bc8d03a3cd
--- /dev/null
+++ b/app/common/renderer/constants/session-builder.js
@@ -0,0 +1,91 @@
+export const SESSION_BUILDER_TABS = {
+ CAPS_BUILDER: 'new',
+ SAVED_CAPS: 'saved',
+ ATTACH_TO_SESSION: 'attach',
+};
+
+export const SESSION_FILE_EXTENSION = '.appiumsession';
+
+export const SESSION_FILE_VERSIONS = {
+ V1: '1.0',
+ V2: 2,
+ LATEST: 2,
+};
+
+export const DEFAULT_SESSION_NAME = '(unnamed)';
+
+export const SERVER_TYPES = {
+ LOCAL: 'local',
+ REMOTE: 'remote',
+ ADVANCED: 'advanced',
+ SAUCE: 'sauce',
+ HEADSPIN: 'headspin',
+ BROWSERSTACK: 'browserstack',
+ TESTMUAI: 'lambdatest',
+ TESTINGBOT: 'testingbot',
+ EXPERITEST: 'experitest',
+ ROBOTQA: 'roboticmobi',
+ REMOTETESTKIT: 'remotetestkit',
+ BITBAR: 'bitbar',
+ KOBITON: 'kobiton',
+ PERFECTO: 'perfecto',
+ PCLOUDY: 'pcloudy',
+ MOBITRU: 'mobitru',
+ TVLABS: 'tvlabs',
+ TESTCRIBE: 'testcribe',
+ WEBMATE: 'webmate',
+ FIREFLINKDEVICEFARM: 'fireflinkdevicefarm',
+ RABBITQA: 'rabbitqa',
+ ROBOTACTIONS: 'robotactions',
+};
+
+export const SAVED_SESSIONS_TABLE_VALUES = {
+ DATE_COLUMN_WIDTH: '25%',
+ ACTIONS_COLUMN_WIDTH: '124px',
+};
+
+// Placeholder values for specific cloud provider input fields
+export const PROVIDER_VALUES = {
+ EXPERITEST_ACCESS_KEY: 'accessKey',
+ EXPERITEST_URL: 'https://example.experitest.com',
+ HEADSPIN_URL: 'https://xxxx.headspin.io:4723/v0/your-api-token/wd/hub',
+ PCLOUDY_USERNAME: 'username@pcloudy.com',
+ PCLOUDY_HOST: 'cloud.pcloudy.com',
+ PCLOUDY_ACCESS_KEY: 'kjdgtdwn65fdasd78uy6y',
+ PERFECTO_URL: 'cloud.Perfectomobile.com',
+ TESTCRIBE_API_KEY: 'your-api-key',
+ RABBITQA_API_KEY: 'your-api-key',
+};
+
+export const ADD_CLOUD_PROVIDER_TAB_KEY = 'addCloudProvider';
+
+export const SERVER_ADVANCED_PARAMS = {
+ ALLOW_UNAUTHORIZED: 'allowUnauthorized',
+ PROXY: 'proxy',
+ USE_PROXY: 'useProxy',
+};
+
+export const CAPABILITY_TYPES = {
+ TEXT: 'text',
+ BOOL: 'boolean',
+ NUM: 'number',
+ OBJECT: 'object',
+ // historical
+ FILE: 'file',
+ JSON_OBJECT: 'json_object',
+};
+
+export const STANDARD_W3C_CAPS = [
+ 'platformName',
+ 'browserName',
+ 'browserVersion',
+ 'acceptInsecureCerts',
+ 'pageLoadStrategy',
+ 'proxy',
+ 'setWindowRect',
+ 'timeouts',
+ 'strictFileInteractability',
+ 'unhandledPromptBehavior',
+ 'userAgent',
+ 'webSocketUrl', // WebDriver BiDi
+];
diff --git a/app/common/renderer/constants/session-inspector.js b/app/common/renderer/constants/session-inspector.js
new file mode 100644
index 0000000000..395b669e66
--- /dev/null
+++ b/app/common/renderer/constants/session-inspector.js
@@ -0,0 +1,75 @@
+export const MJPEG_STREAM_CHECK_INTERVAL = 1000;
+export const SESSION_EXPIRY_PROMPT_TIMEOUT = 60 * 60 * 1000; // Give user 1 hour to reply
+export const REFRESH_DELAY_MILLIS = 500;
+
+export const APP_MODE = {
+ NATIVE: 'native',
+ WEB_HYBRID: 'web_hybrid',
+};
+
+export const NATIVE_APP = 'NATIVE_APP';
+
+export const UNKNOWN_ERROR = 'unknown error';
+export const SESSION_EXPIRED = 'Session Expired';
+
+export const LOCATOR_STRATEGIES = {
+ ID: 'id',
+ XPATH: 'xpath',
+ NAME: 'name',
+ CLASS_NAME: 'class name',
+ ACCESSIBILITY_ID: 'accessibility id',
+ // Web context-specific
+ CSS: 'css selector',
+ LINK_TEXT: 'link text',
+ PARTIAL_LINK_TEXT: 'partial link text',
+ TAG_NAME: 'tag name',
+ // Driver-specific
+ PREDICATE: '-ios predicate string',
+ CLASS_CHAIN: '-ios class chain',
+ UIAUTOMATOR: '-android uiautomator',
+ DATAMATCHER: '-android datamatcher',
+ VIEWTAG: '-android viewtag',
+};
+
+export const NATIVE_COMMON_LOCATOR_STRATEGY_MAP = {
+ ID: [LOCATOR_STRATEGIES.ID, 'Id'],
+ XPATH: [LOCATOR_STRATEGIES.XPATH, 'XPath'],
+ NAME: [LOCATOR_STRATEGIES.NAME, 'Name'],
+ CLASS_NAME: [LOCATOR_STRATEGIES.CLASS_NAME, 'Class Name'],
+ ACCESSIBILITY_ID: [LOCATOR_STRATEGIES.ACCESSIBILITY_ID, 'Accessibility ID'],
+};
+
+export const WEB_LOCATOR_STRATEGY_MAP = {
+ CSS: [LOCATOR_STRATEGIES.CSS, 'CSS'],
+ XPATH: [LOCATOR_STRATEGIES.XPATH, 'XPath'],
+ LINK_TEXT: [LOCATOR_STRATEGIES.LINK_TEXT, 'Link Text'],
+ PARTIAL_LINK_TEXT: [LOCATOR_STRATEGIES.PARTIAL_LINK_TEXT, 'Partial Link Text'],
+ TAG_NAME: [LOCATOR_STRATEGIES.TAG_NAME, 'Tag Name'],
+};
+
+export const NATIVE_DRIVER_LOCATOR_STRATEGY_MAP = {
+ PREDICATE: [LOCATOR_STRATEGIES.PREDICATE, 'Predicate String'],
+ CLASS_CHAIN: [LOCATOR_STRATEGIES.CLASS_CHAIN, 'Class Chain'],
+ UIAUTOMATOR: [LOCATOR_STRATEGIES.UIAUTOMATOR, 'UIAutomator'],
+ DATAMATCHER: [LOCATOR_STRATEGIES.DATAMATCHER, 'DataMatcher'],
+ VIEWTAG: [LOCATOR_STRATEGIES.VIEWTAG, 'View Tag'],
+};
+
+export const INSPECTOR_TABS = {
+ SOURCE: 'source',
+ COMMANDS: 'commands',
+ GESTURES: 'gestures',
+ RECORDER: 'recorder',
+ SESSION_INFO: 'sessionInfo',
+};
+
+export const CLIENT_FRAMEWORKS = {
+ DOTNET_NUNIT: 'dotNetNUnit',
+ JS_WDIO: 'jsWdIo',
+ JS_OXYGEN: 'jsOxygen',
+ JAVA_JUNIT4: 'java', // historical
+ JAVA_JUNIT5: 'javaJUnit5',
+ PYTHON: 'python',
+ ROBOT: 'robot',
+ RUBY: 'ruby',
+};
diff --git a/app/common/renderer/constants/source.js b/app/common/renderer/constants/source.js
new file mode 100644
index 0000000000..c8db2bb67c
--- /dev/null
+++ b/app/common/renderer/constants/source.js
@@ -0,0 +1,12 @@
+// Attributes which are listed in the source by default
+export const IMPORTANT_SOURCE_ATTRS = [
+ 'name',
+ 'content-desc',
+ 'resource-id',
+ 'AXDescription',
+ 'AXIdentifier',
+ 'text',
+ 'label',
+ 'value',
+ 'id',
+];
diff --git a/app/common/renderer/constants/webdriver.js b/app/common/renderer/constants/webdriver.js
new file mode 100644
index 0000000000..c7918e0de0
--- /dev/null
+++ b/app/common/renderer/constants/webdriver.js
@@ -0,0 +1,61 @@
+export const DEFAULT_SERVER_PROPS = {
+ protocol: 'http',
+ hostname: '127.0.0.1',
+ port: 4723,
+ path: '/',
+ logLevel: process.env.NODE_ENV === 'development' ? 'info' : 'warn',
+};
+
+// All properties defined on the WDIO browser object
+// https://webdriver.io/docs/api/browser
+export const BROWSER_PROPERTIES = [
+ 'capabilities',
+ 'requestedCapabilities',
+ 'sessionId',
+ 'options',
+ 'commandList',
+ 'isW3C',
+ 'isChrome',
+ 'isFirefox',
+ 'isBidi',
+ 'isSauce',
+ 'isMacApp',
+ 'isWindowsApp',
+ 'isMobile',
+ 'isIOS',
+ 'isAndroid',
+ 'isNativeContext',
+ 'mobileContext',
+];
+
+// Various protocol commands that should not be added to WDSessionDriver
+export const AVOID_CMDS = [
+ 'newSession',
+ 'findElement',
+ 'findElements',
+ 'executeScript',
+ 'executeAsyncScript',
+];
+
+// All commands defined in the webdriver protocol that are specific to a single element
+// https://webdriver.io/docs/api/webdriver
+export const ELEMENT_CMDS = [
+ // 'findElementFromElement', // defined as 'findElement' in WDSessionElement
+ // 'findElementsFromElement', // defined as 'findElements' in WDSessionElement
+ 'getElementShadowRoot',
+ 'isElementSelected',
+ 'isElementDisplayed',
+ 'getElementAttribute',
+ 'getElementProperty',
+ 'getElementCSSValue',
+ 'getElementText',
+ 'getElementTagName',
+ 'getElementRect',
+ 'isElementEnabled',
+ 'elementClick',
+ 'elementClear',
+ 'elementSendKeys',
+ 'takeElementScreenshot',
+ 'getElementComputedRole',
+ 'getElementComputedLabel',
+];
diff --git a/app/common/renderer/containers/SessionBuilderPage.js b/app/common/renderer/containers/SessionBuilderPage.js
new file mode 100644
index 0000000000..e28dd637f1
--- /dev/null
+++ b/app/common/renderer/containers/SessionBuilderPage.js
@@ -0,0 +1,10 @@
+import {connect} from 'react-redux';
+
+import * as SessionBuilderActions from '../actions/SessionBuilder.js';
+import SessionBuilder from '../components/SessionBuilder/SessionBuilder.jsx';
+
+function mapStateToProps(state) {
+ return state.builder;
+}
+
+export default connect(mapStateToProps, SessionBuilderActions)(SessionBuilder);
diff --git a/app/common/renderer/containers/SessionInspectorPage.js b/app/common/renderer/containers/SessionInspectorPage.js
new file mode 100644
index 0000000000..721b6b1440
--- /dev/null
+++ b/app/common/renderer/containers/SessionInspectorPage.js
@@ -0,0 +1,10 @@
+import {connect} from 'react-redux';
+
+import * as SessionInspectorActions from '../actions/SessionInspector.js';
+import SessionInspectorPage from '../components/SessionInspector/SessionInspector.jsx';
+
+function mapStateToProps(state) {
+ return state.inspector;
+}
+
+export default connect(mapStateToProps, SessionInspectorActions)(SessionInspectorPage);
diff --git a/app/common/renderer/hooks/use-theme.jsx b/app/common/renderer/hooks/use-theme.jsx
new file mode 100644
index 0000000000..1bdccf6c40
--- /dev/null
+++ b/app/common/renderer/hooks/use-theme.jsx
@@ -0,0 +1,5 @@
+import {use} from 'react';
+
+import {ThemeContext} from '../providers/ThemeProvider.jsx';
+
+export const useTheme = () => use(ThemeContext);
diff --git a/app/common/renderer/i18next.js b/app/common/renderer/i18next.js
new file mode 100644
index 0000000000..8d192b4bd0
--- /dev/null
+++ b/app/common/renderer/i18next.js
@@ -0,0 +1,21 @@
+import i18n from 'i18next';
+import HttpApi from 'i18next-http-backend';
+import {initReactI18next} from 'react-i18next';
+
+import {commonI18NextOptions} from '../shared/i18next.config.js';
+import {PREFERRED_LANGUAGE} from '../shared/setting-defs.js';
+import {getSetting, localesPath} from './polyfills.js';
+
+const i18nextOptions = {
+ ...commonI18NextOptions,
+ lng: await getSetting(PREFERRED_LANGUAGE),
+ backend: {
+ loadPath: `${localesPath}/{{lng}}/{{ns}}.json`,
+ },
+};
+
+if (!i18n.isInitialized) {
+ i18n.use(HttpApi).use(initReactI18next).init(i18nextOptions);
+}
+
+export default i18n;
diff --git a/app/common/renderer/index.jsx b/app/common/renderer/index.jsx
new file mode 100644
index 0000000000..6b57500e02
--- /dev/null
+++ b/app/common/renderer/index.jsx
@@ -0,0 +1,33 @@
+import './i18next.js';
+
+import {Suspense} from 'react';
+import {createRoot} from 'react-dom/client';
+import {Provider} from 'react-redux';
+import {MemoryRouter, Route, Routes} from 'react-router';
+
+import ErrorBoundary from './components/ErrorBoundary/ErrorBoundary.jsx';
+import Spinner from './components/Spinner/Spinner.jsx';
+import SessionBuilderPage from './containers/SessionBuilderPage.js';
+import SessionInspectorPage from './containers/SessionInspectorPage.js';
+import {ThemeProvider} from './providers/ThemeProvider.jsx';
+import store from './store.js';
+
+const container = document.getElementById('root');
+
+createRoot(container).render(
+
+
+
+
+ }>
+
+ } />
+ } />
+ } />
+
+
+
+
+
+ ,
+);
diff --git a/app/renderer/lib/appium-client.js b/app/common/renderer/lib/appium/inspector-driver.js
similarity index 63%
rename from app/renderer/lib/appium-client.js
rename to app/common/renderer/lib/appium/inspector-driver.js
index f3b0601de5..3af8b5944b 100644
--- a/app/renderer/lib/appium-client.js
+++ b/app/common/renderer/lib/appium/inspector-driver.js
@@ -1,8 +1,15 @@
-import Bluebird from 'bluebird';
import _ from 'lodash';
-import {APP_MODE, SCREENSHOT_INTERACTION_MODE} from '../components/Inspector/shared';
-import {parseSource, setHtmlElementAttributes} from './webview-helpers';
+import {SCREENSHOT_INTERACTION_MODE} from '../../constants/screenshot.js';
+import {
+ APP_MODE,
+ NATIVE_APP,
+ REFRESH_DELAY_MILLIS,
+ SESSION_EXPIRED,
+ UNKNOWN_ERROR,
+} from '../../constants/session-inspector.js';
+import {log} from '../../utils/logger.js';
+import {parseHtmlSource, setHtmlElementAttributes} from '../../utils/webview.js';
const {TAP, SWIPE, GESTURE} = SCREENSHOT_INTERACTION_MODE;
@@ -13,15 +20,38 @@ const IOS_TOP_CONTROLS_SELECTOR =
'**/XCUIElementTypeOther[`name CONTAINS "SafariWindow"`]' +
'/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther/XCUIElementTypeOther[1]';
-export const NATIVE_APP = 'NATIVE_APP';
let _instance = null;
-export default class AppiumClient {
+/**
+ * Represents an unexpected or unknown WebDriver/Appium error.
+ */
+class WebdriverUnknownError extends Error {
+ constructor(message) {
+ super(message);
+ this.name = UNKNOWN_ERROR;
+ }
+}
+
+/**
+ * Wrapper class providing access to the currently active Appium driver methods,
+ * with additional Inspector-specific handling
+ */
+export default class InspectorDriver {
constructor(driver) {
this.driver = driver;
this.elementCache = {};
this.elVarCount = 0;
this.elArrayVarCount = 0;
+ this.windowSizeCache = {raw: {}, adjusted: {}};
+ }
+
+ static instance(driver) {
+ _instance ??= new this(driver);
+ return _instance;
+ }
+
+ static clearInstance() {
+ _instance = null;
}
async run(params) {
@@ -37,15 +67,12 @@ export default class AppiumClient {
appMode = APP_MODE.NATIVE, // Optional. Whether we're in a native or hybrid mode
} = params;
- if (methodName === 'quit') {
+ if (methodName === 'deleteSession') {
try {
- await this.driver.quit();
- } catch (ign) {}
+ await this.driver.deleteSession();
+ } catch {}
- _instance = null;
-
- // when we've quit the session, there's no source/screenshot to send
- // back
+ // when we've quit the session, there's no source/screenshot to send back
return {
source: null,
screenshot: null,
@@ -57,8 +84,7 @@ export default class AppiumClient {
let res = {};
if (methodName) {
if (elementId) {
- // eslint-disable-next-line no-console
- console.log(
+ log.info(
`Handling client method request with method '${methodName}', ` +
`args ${JSON.stringify(args)} and elementId ${elementId}`,
);
@@ -71,21 +97,24 @@ export default class AppiumClient {
appMode,
});
} else {
- // eslint-disable-next-line no-console
- console.log(
+ log.info(
`Handling client method request with method '${methodName}' ` +
`and args ${JSON.stringify(args)}`,
);
- res = await this.executeMethod({methodName, args, skipRefresh, skipScreenshot, appMode});
+ res = await this.executeMethod({
+ methodName,
+ args,
+ skipRefresh,
+ skipScreenshot,
+ appMode,
+ });
}
} else if (strategy && selector) {
if (fetchArray) {
- // eslint-disable-next-line no-console
- console.log(`Fetching elements with selector '${selector}' and strategy ${strategy}`);
+ log.info(`Fetching elements with selector '${selector}' and strategy ${strategy}`);
res = await this.fetchElements({strategy, selector});
} else {
- // eslint-disable-next-line no-console
- console.log(`Fetching an element with selector '${selector}' and strategy ${strategy}`);
+ log.info(`Fetching an element with selector '${selector}' and strategy ${strategy}`);
res = await this.fetchElement({strategy, selector});
}
}
@@ -111,6 +140,9 @@ export default class AppiumClient {
cachedEl.variableName = `el${this.elVarCount}`;
}
+ if (typeof cachedEl.el[methodName] !== 'function') {
+ throw new WebdriverUnknownError(SESSION_EXPIRED);
+ }
// and then execute whatever method we requested on the actual element
res = await cachedEl.el[methodName].apply(cachedEl.el, args);
} else {
@@ -123,35 +155,43 @@ export default class AppiumClient {
actions: args[0][key],
}));
res = await this.driver.performActions(actions);
- } else if (methodName !== 'getPageSource' && methodName !== 'takeScreenshot') {
+ } else if (methodName !== 'getPageSource') {
+ if (typeof this.driver[methodName] !== 'function') {
+ throw new WebdriverUnknownError(SESSION_EXPIRED);
+ }
res = await this.driver[methodName].apply(this.driver, args);
}
}
- let contextUpdate = {},
- sourceUpdate = {},
- screenshotUpdate = {},
- windowSizeUpdate = {};
- if (!skipRefresh) {
- // Give the source/screenshot time to change before taking the screenshot
- await Bluebird.delay(500);
- if (!skipScreenshot) {
- screenshotUpdate = await this.getScreenshotUpdate();
- }
- windowSizeUpdate = await this.getWindowUpdate();
- // only do context updates if user has selected web/hybrid mode (takes forever)
- if (appMode === APP_MODE.WEB_HYBRID) {
- contextUpdate = await this.getContextUpdate(windowSizeUpdate);
- }
- sourceUpdate = await this.getSourceUpdate();
- }
+ const refreshUpdate = skipRefresh ? {} : await this.handleRefresh(skipScreenshot, appMode);
+
return {
...cachedEl,
+ ...refreshUpdate,
+ commandRes: res,
+ };
+ }
+
+ async handleRefresh(skipScreenshot, appMode) {
+ // Give the source/screenshot time to change
+ await new Promise((resolve) => setTimeout(resolve, REFRESH_DELAY_MILLIS));
+
+ const screenshotPromise = skipScreenshot ? {} : this.getScreenshotUpdate();
+ const windowSizePromise = this.getWindowUpdate();
+ const sourcePromise = this.getSourceUpdate();
+ const [screenshotUpdate, windowSizeUpdate, sourceUpdate] = await Promise.all([
+ screenshotPromise,
+ windowSizePromise,
+ sourcePromise,
+ ]);
+ // only do context updates if user has selected web/hybrid mode (takes forever)
+ const contextUpdate =
+ appMode === APP_MODE.WEB_HYBRID ? await this.getContextUpdate(windowSizeUpdate) : {};
+ return {
...contextUpdate,
...sourceUpdate,
...screenshotUpdate,
...windowSizeUpdate,
- commandRes: res,
};
}
@@ -194,10 +234,13 @@ export default class AppiumClient {
async fetchElement({strategy, selector}) {
const start = Date.now();
- let element = null;
+ let element;
try {
element = await this.driver.findElement(strategy, selector);
} catch (err) {
+ if (err.name === UNKNOWN_ERROR) {
+ throw err;
+ }
return {};
}
@@ -223,34 +266,45 @@ export default class AppiumClient {
}
async getWindowUpdate() {
- let windowSize, windowSizeError;
const {
client: {
- capabilities: {deviceScreenSize, platformName, automationName},
+ capabilities: {platformName, automationName},
},
} = this.driver;
try {
- windowSize = await this.driver.getWindowRect();
- if (_.toLower(platformName) === 'android' && _.toLower(automationName) === 'uiautomator2') {
- // returned Android height and width can both be affected by UiAutomator2 calculations
- // we stick with device dimensions, but swap them depending on detected orientation
- // deviceScreenSize value fits portrait mode for phones, but landscape mode for tablets
- const [width, height] = deviceScreenSize.split('x').map((param) => parseInt(param, 10));
- // check if the orientation for windowSize matches orientation for deviceScreenSize
- if (windowSize.height >= windowSize.width === height >= width) {
- windowSize.height = height;
- windowSize.width = width;
- } else {
- // orientations do not match - swap dimensions
- windowSize.height = width;
- windowSize.width = height;
- }
+ const driverWindowSize = await this.driver.getWindowRect();
+ if (_.toLower(platformName) !== 'android' || _.toLower(automationName) !== 'uiautomator2') {
+ return {windowSize: driverWindowSize};
}
- } catch (e) {
- windowSizeError = e;
+ // UiAutomator2 requires adjustments depending on the result of `mobile: deviceInfo`.
+ // Use a cache to avoid re-triggering this method every time.
+ if (_.isEqual(driverWindowSize, this.windowSizeCache.raw)) {
+ return {windowSize: this.windowSizeCache.adjusted};
+ }
+ // Window size has changed since the cached value - trigger the method
+ const adjustedWindowSize = {...driverWindowSize};
+ const {realDisplaySize} = await this.driver.executeScript('mobile:deviceInfo', []);
+ // realDisplaySize value fits portrait mode for phones, but landscape mode for tablets
+ const [width, height] = realDisplaySize.split('x').map((param) => parseInt(param, 10));
+ // check if the orientation for driverWindowSize matches orientation for realDisplaySize
+ if (driverWindowSize.height >= driverWindowSize.width === height >= width) {
+ adjustedWindowSize.height = height;
+ adjustedWindowSize.width = width;
+ } else {
+ // orientations do not match - swap dimensions
+ adjustedWindowSize.height = width;
+ adjustedWindowSize.width = height;
+ }
+ // Finally, update the cache
+ this.windowSizeCache.raw = driverWindowSize;
+ this.windowSizeCache.adjusted = adjustedWindowSize;
+ return {windowSize: adjustedWindowSize};
+ } catch (err) {
+ if (err.name === UNKNOWN_ERROR) {
+ throw err;
+ }
+ return {windowSizeError: err};
}
-
- return {windowSize, windowSizeError};
}
// Retrieve all detected contexts, as well as the current context
@@ -267,17 +321,17 @@ export default class AppiumClient {
// First get the current context (or the error, if one appears)
try {
- currentContext = await this.driver.getContext();
+ currentContext = await this.driver.getAppiumContext();
} catch (e) {
currentContextError = e;
}
// The retrieval of all contexts and webview position adjustments require some native context use
if (currentContext !== NATIVE_APP) {
- await this.driver.switchContext(NATIVE_APP);
+ await this.driver.switchAppiumContext(NATIVE_APP);
}
- const isAndroid = this.driver.client.isAndroid;
+ const isAndroid = this.driver.isAndroid;
// Get all available contexts (or the error, if one appears)
try {
@@ -297,7 +351,7 @@ export default class AppiumClient {
selector: ANDROID_WEBVIEW_SELECTOR,
});
if (webview.el) {
- const {x, y} = await webview.el.getRect();
+ const {x, y} = await webview.el.getElementRect();
webviewTopOffset = y;
webviewLeftOffset = x;
} else {
@@ -305,36 +359,54 @@ export default class AppiumClient {
try {
const systemBars = await this.driver.executeScript('mobile:getSystemBars', []);
webviewTopOffset = systemBars.statusBar.height;
- } catch (e) {
+ } catch {
try {
// to minimize the endpoint call which gets error in newer chromedriver.
const sessionDetails = await this.driver.getSession();
// in case driver does not support mobile:getSystemBars
webviewTopOffset = sessionDetails.viewportRect.top;
- } catch (ign) {}
+ } catch {}
}
}
- } else if (this.driver.client.isIOS) {
- // on iOS, find the top status bar and address bar and use its Y endpoint
- const topBar = await this.fetchElement({
- strategy: '-ios class chain',
- selector: IOS_TOP_CONTROLS_SELECTOR,
- });
- if (topBar.el) {
- const {y, height} = await topBar.el.getRect();
- webviewTopOffset = y + height;
- }
- // in landscape mode, there is empty space on both sides (at default zoom level), so add offset for that too
- if (windowSize.height < windowSize.width) {
- try {
- const deviceScreenInfo = await this.driver.executeScript('mobile:deviceScreenInfo', []);
- webviewLeftOffset = deviceScreenInfo.statusBarSize.height;
- } catch (e) {
+ } else if (this.driver.isIOS) {
+ const isSafari = this.driver.capabilities?.browserName?.toLowerCase() === 'safari';
+ if (isSafari) {
+ // on iOS, if we're in Safari simply find the top status bar and address bar and use its Y endpoint
+ const topBar = await this.fetchElement({
+ strategy: '-ios class chain',
+ selector: IOS_TOP_CONTROLS_SELECTOR,
+ });
+ if (topBar.el) {
+ const {y, height} = await topBar.el.getElementRect();
+ webviewTopOffset = y + height;
+ }
+ // in landscape mode, there is empty space on both sides (at default zoom level), so add offset for that too
+ if (windowSize.height < windowSize.width) {
try {
- const sessionDetails = await this.driver.getSession();
- // in case driver does not support mobile:deviceScreenInfo
- webviewLeftOffset = sessionDetails.statBarHeight;
- } catch (ign) {}
+ const deviceScreenInfo = await this.driver.executeScript(
+ 'mobile:deviceScreenInfo',
+ [],
+ );
+ webviewLeftOffset = deviceScreenInfo.statusBarSize.height;
+ } catch {
+ try {
+ const sessionDetails = await this.driver.getSession();
+ // in case driver does not support mobile:deviceScreenInfo
+ webviewLeftOffset = sessionDetails.statBarHeight;
+ } catch {}
+ }
+ }
+ } else {
+ // if we have a hybrid view, just find the first WebView element and use its position as
+ // the offset. Unfortunately this strategy doesn't work for Safari
+ const wv = await this.fetchElement({
+ strategy: 'class name',
+ selector: 'XCUIElementTypeWebView',
+ });
+ if (wv.el) {
+ const {x, y} = await wv.el.getElementRect();
+ webviewTopOffset = y;
+ webviewLeftOffset = x;
}
}
}
@@ -346,7 +418,7 @@ export default class AppiumClient {
}
// Native context calculation part is done - switch back to webview context
- await this.driver.switchContext(currentContext);
+ await this.driver.switchAppiumContext(currentContext);
// Adjust all elements by the calculated offsets
await this.driver.executeScript(
@@ -360,9 +432,12 @@ export default class AppiumClient {
async getSourceUpdate() {
try {
- const source = parseSource(await this.driver.getPageSource());
+ const source = parseHtmlSource(await this.driver.getPageSource());
return {source};
} catch (err) {
+ if (err.name === UNKNOWN_ERROR) {
+ throw err;
+ }
return {sourceError: err};
}
}
@@ -372,6 +447,9 @@ export default class AppiumClient {
const screenshot = await this.driver.takeScreenshot();
return {screenshot};
} catch (err) {
+ if (err.name === UNKNOWN_ERROR) {
+ throw err;
+ }
return {screenshotError: err};
}
}
@@ -384,9 +462,9 @@ export default class AppiumClient {
*/
async hasContextsCommand() {
try {
- await this.driver.getContexts();
+ await this.driver.getAppiumContexts();
return true;
- } catch (ign) {}
+ } catch {}
// If the app under test returns non JSON format response
return false;
@@ -434,7 +512,7 @@ export default class AppiumClient {
let descriptionJSON = {attached: false};
try {
descriptionJSON = JSON.parse(page.description);
- } catch (ign) {}
+ } catch {}
// You can have multiple `type` of pages, like service workers
// We need to have pages with or 1. an attached view or 2. with an empty description
@@ -457,16 +535,9 @@ export default class AppiumClient {
return [
// The Android contexts dont have the `NATIVE_APP` context so add it here
- {id: 'NATIVE_APP'},
+ {id: NATIVE_APP},
// Add the parsedWebviews, but make sure to filter out all undefined webviews
...parsedWebviews.filter(Boolean),
];
}
}
-
-AppiumClient.instance = (driver) => {
- if (_instance === null) {
- _instance = new AppiumClient(driver);
- }
- return _instance;
-};
diff --git a/app/common/renderer/lib/appium/session-driver.js b/app/common/renderer/lib/appium/session-driver.js
new file mode 100644
index 0000000000..6952c5e11e
--- /dev/null
+++ b/app/common/renderer/lib/appium/session-driver.js
@@ -0,0 +1,102 @@
+/**
+ * Copyright 2024 HeadSpin, Inc.
+ * Modifications copyright OpenJS Foundation and other contributors,
+ * https://openjsf.org/
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import {AppiumProtocol, MJsonWProtocol, WebDriverProtocol} from '@wdio/protocols';
+import _ from 'lodash';
+
+import {AVOID_CMDS, BROWSER_PROPERTIES} from '../../constants/webdriver.js';
+import {getElementFromResponse} from './session-element.js';
+
+/**
+ * Class used as a wrapper for the webdriver session client,
+ * with separated handling for element-related methods,
+ * as they are called on WDSessionElement
+ */
+export default class WDSessionDriver {
+ constructor(wdSessionClient) {
+ this.client = wdSessionClient;
+ }
+
+ static addProperties(keys) {
+ for (const key of keys) {
+ Object.defineProperty(this.prototype, key, {
+ get() {
+ return this.client[key];
+ },
+ });
+ }
+ }
+
+ async cmd(commandName, ...args) {
+ if (!(commandName in this.client)) {
+ throw new Error(`Command '${commandName}' is not available on this client`);
+ }
+ const res = await this.client[commandName](...args);
+ if (res && res.error) {
+ throw new Error(res.message ? res.message : res.error);
+ }
+ return res;
+ }
+
+ async findElement(using, value) {
+ const res = await this.cmd('findElement', using, value);
+ return getElementFromResponse(res, this);
+ }
+
+ async findElements(using, value) {
+ const ress = await this.cmd('findElements', using, value);
+ return ress.map((res) => getElementFromResponse(res, this));
+ }
+
+ // Execute method arguments may have WDSessionElement objects,
+ // so first convert them to standard webdriver Element objects
+ async executeBase(cmd, script, args) {
+ args = args.map((a) => ('elementKey' in a ? a.executeObj : a));
+ return await this.cmd(cmd, script, args);
+ }
+
+ async executeScript(script, args) {
+ return await this.executeBase('executeScript', script, args);
+ }
+
+ async executeAsyncScript(script, args) {
+ return await this.executeBase('executeAsyncScript', script, args);
+ }
+}
+
+// Walk through the webdriver protocol methods and add them to WDSessionDriver
+// (except for element methods and edge cases)
+for (const proto of [WebDriverProtocol, MJsonWProtocol, AppiumProtocol]) {
+ for (const [, methods] of _.toPairs(proto)) {
+ for (const [, cmdData] of _.toPairs(methods)) {
+ const cmdName = cmdData.command;
+
+ // if we've explicitly asked not to include the command, skip it
+ if (AVOID_CMDS.includes(cmdName)) {
+ continue;
+ }
+
+ WDSessionDriver.prototype[cmdName] = async function (...args) {
+ return await this.cmd(cmdName, ...args);
+ };
+ }
+ }
+}
+
+// Walk through the webdriver browser object properties and add them to WDSessionDriver
+WDSessionDriver.addProperties(BROWSER_PROPERTIES);
diff --git a/app/common/renderer/lib/appium/session-element.js b/app/common/renderer/lib/appium/session-element.js
new file mode 100644
index 0000000000..58cc65f00b
--- /dev/null
+++ b/app/common/renderer/lib/appium/session-element.js
@@ -0,0 +1,71 @@
+/**
+ * Copyright 2024 HeadSpin, Inc.
+ * Modifications copyright OpenJS Foundation and other contributors,
+ * https://openjsf.org/
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import {ELEMENT_CMDS} from '../../constants/webdriver.js';
+
+const W3C_ELEMENT_KEY = 'element-6066-11e4-a52e-4f735466cecf';
+const JWP_ELEMENT_KEY = 'ELEMENT';
+
+/**
+ * Class used as a wrapper for a webdriver element
+ * in order to allow calling element-related methods on it directly,
+ * instead of needing to use WDSessionDriver
+ */
+class WDSessionElement {
+ constructor(elementKey, findRes, parent) {
+ this.elementKey = elementKey;
+ this.elementId = this[elementKey] = findRes[elementKey];
+ this.parent = parent;
+ this.session = parent.session || parent;
+ }
+
+ get executeObj() {
+ return {[this.elementKey]: this.elementId};
+ }
+
+ async findElement(using, value) {
+ const res = await this.session.cmd('findElementFromElement', this.elementId, using, value);
+ return getElementFromResponse(res, this);
+ }
+
+ async findElements(using, value) {
+ const ress = await this.session.cmd('findElementsFromElement', this.elementId, using, value);
+ return ress.map((res) => getElementFromResponse(res, this));
+ }
+}
+
+export function getElementFromResponse(res, parent) {
+ const elementKey = res[W3C_ELEMENT_KEY] ? W3C_ELEMENT_KEY : JWP_ELEMENT_KEY;
+
+ if (!res[elementKey]) {
+ throw new Error(
+ `Bad findElement response; did not have element key. ` +
+ `Response was: ${JSON.stringify(res)}`,
+ );
+ }
+
+ return new WDSessionElement(elementKey, res, parent);
+}
+
+// Walk through all webdriver protocol element methods and add them to WDSessionElement
+// (except for edge cases)
+for (const cmdName of ELEMENT_CMDS) {
+ WDSessionElement.prototype[cmdName] = async function (...args) {
+ return await this.session.cmd(cmdName, this.elementId, ...args);
+ };
+}
diff --git a/app/common/renderer/lib/appium/session-starter.js b/app/common/renderer/lib/appium/session-starter.js
new file mode 100644
index 0000000000..bc040801a8
--- /dev/null
+++ b/app/common/renderer/lib/appium/session-starter.js
@@ -0,0 +1,45 @@
+/**
+ * Copyright 2024 HeadSpin, Inc.
+ * Modifications copyright OpenJS Foundation and other contributors,
+ * https://openjsf.org/
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import webdriver from 'webdriver';
+
+import {DEFAULT_SERVER_PROPS} from '../../constants/webdriver.js';
+import WDSessionDriver from './session-driver.js';
+
+/**
+ * Class used to retrieve a webdriver session,
+ * either by creating a new one, or finding an existing one,
+ * with additional safeguards for session parameters
+ */
+export default class WDSessionStarter {
+ static async newSession(serverOpts, capabilities = {}) {
+ const safeServerOpts = {...DEFAULT_SERVER_PROPS, ...serverOpts, capabilities};
+ const sessionClient = await webdriver.newSession(safeServerOpts);
+ return new WDSessionDriver(sessionClient);
+ }
+
+ static attachToSession(sessionId, serverOpts, capabilities = {}) {
+ if (!sessionId) {
+ throw new Error("Can't attach to a session without a session id");
+ }
+ const isW3C = true;
+ const safeServerOpts = {sessionId, isW3C, ...DEFAULT_SERVER_PROPS, ...serverOpts, capabilities};
+ const sessionClient = webdriver.attachToSession(safeServerOpts);
+ return new WDSessionDriver(sessionClient);
+ }
+}
diff --git a/app/renderer/lib/client-frameworks/framework.js b/app/common/renderer/lib/client-frameworks/common.js
similarity index 53%
rename from app/renderer/lib/client-frameworks/framework.js
rename to app/common/renderer/lib/client-frameworks/common.js
index a556c30ea2..5a7c5385ea 100644
--- a/app/renderer/lib/client-frameworks/framework.js
+++ b/app/common/renderer/lib/client-frameworks/common.js
@@ -1,15 +1,12 @@
import _ from 'lodash';
-import {DEFAULT_SWIPE, DEFAULT_TAP} from '../../components/Inspector/shared';
+import {DEFAULT_SWIPE, DEFAULT_TAP} from '../../constants/screenshot.js';
-export default class Framework {
- constructor(host, port, path, https, caps) {
- this.host = host || 'localhost';
- this.port = port || 4723;
- this.path = path || '/wd/hub';
+export default class CommonClientFramework {
+ constructor(serverUrl, serverUrlParts, caps) {
+ this.serverUrl = serverUrl;
+ this.serverUrlParts = serverUrlParts;
this.caps = caps || {};
- this.https = !!https;
- this.scheme = https ? 'https' : 'http';
this.actions = [];
this.localVarCount = 0;
this.localVarCache = {};
@@ -33,10 +30,6 @@ export default class Framework {
};
}
- get serverUrl() {
- return `${this.scheme}://${this.host}:${this.port}${this.path === '/' ? '' : this.path}`;
- }
-
indent(str, spaces) {
let lines = str.split('\n');
let spaceStr = '';
@@ -111,7 +104,7 @@ export default class Framework {
return this.codeFor_findAndAssign(strategy, locator, localVar);
}
- // Execute Script
+ // Top-Level Commands
codeFor_executeScript(varNameIgnore, varIndexIgnore, scriptCmd, jsonArg) {
// jsonArg is expected to be an array with 0-1 objects
@@ -121,90 +114,13 @@ export default class Framework {
return this.codeFor_executeScriptWithArgs(scriptCmd, jsonArg);
}
- // App Management
-
- codeFor_startActivity(varNameIgnore, varIndexIgnore, ...args) {
- const argNames = [
- 'appPackage',
- 'appActivity',
- 'appWaitPackage',
- 'intentAction',
- 'intentCategory',
- 'intentFlags',
- 'optionalIntentArguments',
- 'dontStopAppOnReset',
- ];
- // zip argument names and values into a JSON object, so that we can reuse executeScript
- return this.codeFor_executeScriptWithArgs('mobile: startActivity', [
- _.zipObject(argNames, args),
- ]);
- }
-
- codeFor_background(varNameIgnore, varIndexIgnore, seconds) {
- return this.codeFor_executeScriptWithArgs('mobile: backgroundApp', [{seconds}]);
- }
-
// Device Interaction
- codeFor_shake() {
- return this.codeFor_executeScriptNoArgs('mobile: shake');
- }
-
- codeFor_lock(varNameIgnore, varIndexIgnore, seconds) {
- return this.codeFor_executeScriptWithArgs('mobile: lock', [{seconds}]);
- }
-
- codeFor_unlock() {
- // TODO: UiAutomator2 requires arguments, XCUITest does not
- return this.codeFor_executeScriptNoArgs('mobile: unlock');
- }
-
- codeFor_fingerprint(varNameIgnore, varIndexIgnore, fingerprintId) {
- return this.codeFor_executeScriptWithArgs('mobile: fingerprint', [{fingerprintId}]);
- }
-
- // Keyboard
-
- codeFor_pressKeyCode(varNameIgnore, varIndexIgnore, keycode, metastate, flags) {
- return this.codeFor_executeScriptWithArgs('mobile: pressKey', [{keycode, metastate, flags}]);
- }
-
- codeFor_longPressKeyCode(varNameIgnore, varIndexIgnore, keycode, metastate, flags) {
- return this.codeFor_executeScriptWithArgs('mobile: pressKey', [
- {keycode, metastate, flags, isLongPress: true},
- ]);
+ codeFor_getDeviceTime() {
+ return this.codeFor_executeScriptNoArgs('mobile: getDeviceTime');
}
codeFor_hideKeyboard() {
return this.codeFor_executeScriptNoArgs('mobile: hideKeyboard');
}
-
- // Connectivity
- // TODO: use mobile: setConnectivity after adding it in GUI
-
- codeFor_toggleLocationServices() {
- return this.codeFor_executeScriptNoArgs('mobile: toggleGps');
- }
-
- // Performance Data
-
- codeFor_getPerformanceData(varNameIgnore, varIndexIgnore, packageName, dataType) {
- return this.codeFor_executeScriptWithArgs('mobile: getPerformanceData', [
- {packageName, dataType},
- ]);
- }
-
- codeFor_getPerformanceDataTypes() {
- return this.codeFor_executeScriptNoArgs('mobile: getPerformanceDataTypes');
- }
-
- // System
-
- codeFor_openNotifications() {
- return this.codeFor_executeScriptNoArgs('mobile: openNotifications');
- }
-
- codeFor_getDeviceTime() {
- return this.codeFor_executeScriptNoArgs('mobile: getDeviceTime');
- }
}
diff --git a/app/renderer/lib/client-frameworks/dotnet-nunit.js b/app/common/renderer/lib/client-frameworks/dotnet-nunit.js
similarity index 74%
rename from app/renderer/lib/client-frameworks/dotnet-nunit.js
rename to app/common/renderer/lib/client-frameworks/dotnet-nunit.js
index 3553dbf523..cdbb6b9714 100644
--- a/app/renderer/lib/client-frameworks/dotnet-nunit.js
+++ b/app/common/renderer/lib/client-frameworks/dotnet-nunit.js
@@ -1,11 +1,12 @@
import _ from 'lodash';
+import refractorCsharp from 'refractor/csharp';
-import Framework from './framework';
+import CommonClientFramework from './common.js';
-class DotNetNUnitFramework extends Framework {
- get language() {
- return 'csharp';
- }
+export default class DotNetNUnitFramework extends CommonClientFramework {
+ static readableName = '.NET - NUnit';
+ static refractorLang = 'csharp';
+ static refractorLib = refractorCsharp;
getCSharpVal(jsonVal) {
if (Array.isArray(jsonVal)) {
@@ -44,7 +45,7 @@ class DotNetNUnitFramework extends Framework {
_.map(
this.caps,
(v, k) =>
- `options.AddAdditionalAppiumOption(${JSON.stringify(k)}, ${this.getCSharpVal(v)})`,
+ `options.AddAdditionalAppiumOption(${JSON.stringify(k)}, ${this.getCSharpVal(v)});`,
).join('\n'),
8,
);
@@ -122,15 +123,15 @@ ${this.indent(code, 8)}
}
}
- codeFor_click(varName, varIndex) {
+ codeFor_elementClick(varName, varIndex) {
return `${this.getVarName(varName, varIndex)}.Click();`;
}
- codeFor_clear(varName, varIndex) {
+ codeFor_elementClear(varName, varIndex) {
return `${this.getVarName(varName, varIndex)}.Clear();`;
}
- codeFor_sendKeys(varName, varIndex, text) {
+ codeFor_elementSendKeys(varName, varIndex, text) {
return `${this.getVarName(varName, varIndex)}.SendKeys(${JSON.stringify(text)});`;
}
@@ -144,7 +145,7 @@ tap.AddAction(finger.CreatePointerMove(CoordinateOrigin.Viewport, tapPoint.X, ta
tap.AddAction(finger.CreatePointerDown(MouseButton.Left));
tap.AddAction(new PauseInteraction(finger, TimeSpan.FromMilliseconds(50)));
tap.AddAction(finger.CreatePointerUp(MouseButton.Left));
-driver.PerformActions(new List
{ tap });
+_driver.PerformActions(new List { tap });
`;
}
@@ -159,11 +160,11 @@ swipe.AddAction(finger.CreatePointerMove(CoordinateOrigin.Viewport, start.X, sta
swipe.AddAction(finger.CreatePointerDown(MouseButton.Left));
swipe.AddAction(finger.CreatePointerMove(CoordinateOrigin.Viewport, end.X, end.Y, TimeSpan.FromMilliseconds(1000)));
swipe.AddAction(finger.CreatePointerUp(MouseButton.Left));
-driver.PerformActions(new List { swipe });
+_driver.PerformActions(new List { swipe });
`;
}
- // Execute Script
+ // Top-Level Commands
codeFor_executeScriptNoArgs(scriptCmd) {
return `_driver.ExecuteScript(${JSON.stringify(scriptCmd)});`;
@@ -174,168 +175,153 @@ driver.PerformActions(new List { swipe });
return `_driver.ExecuteScript(${JSON.stringify(scriptCmd)}, ${this.getCSharpVal(jsonArg[0])});`;
}
- // App Management
-
- codeFor_getCurrentActivity() {
- return `var activityName = ${this.codeFor_executeScriptNoArgs('mobile: getCurrentActivity')}`;
+ codeFor_updateSettings(varNameIgnore, varIndexIgnore, settingsJson) {
+ try {
+ const settings = _.toPairs(settingsJson).map(
+ ([settingName, settingValue]) =>
+ `_driver.SetSetting("${settingName}", ${this.getCSharpVal(settingValue)});`,
+ );
+ return settings.join('\n');
+ } catch {
+ return `// Could not parse: ${JSON.stringify(settingsJson)}`;
+ }
}
- codeFor_getCurrentPackage() {
- return `var packageName = ${this.codeFor_executeScriptNoArgs('mobile: getCurrentPackage')}`;
+ codeFor_getSettings() {
+ return `let settings = _driver.Settings();`;
}
- codeFor_installApp(varNameIgnore, varIndexIgnore, app) {
- return `_driver.InstallApp("${app}");`;
+ // Session
+
+ codeFor_status() {
+ return `let status = _driver.Status;`;
}
- codeFor_isAppInstalled(varNameIgnore, varIndexIgnore, app) {
- return `var isAppInstalled = _driver.IsAppInstalled("${app}");`;
+ codeFor_getSession() {
+ return `let sessionDetails = _driver.SessionDetails;`;
}
- codeFor_activateApp(varNameIgnore, varIndexIgnore, app) {
- return `_driver.ActivateApp("${app}");`;
+ codeFor_getAppiumCommands() {
+ return `// Not supported: getAppiumCommands`;
}
- codeFor_terminateApp(varNameIgnore, varIndexIgnore, app) {
- return `_driver.TerminateApp("${app}");`;
+ codeFor_getAppiumExtensions() {
+ return `// Not supported: getAppiumExtensions`;
}
- codeFor_removeApp(varNameIgnore, varIndexIgnore, app) {
- return `_driver.RemoveApp("${app}")`;
+ codeFor_getAppiumSessionCapabilities() {
+ return `// Not supported: getAppiumSessionCapabilities`;
}
- codeFor_getStrings(varNameIgnore, varIndexIgnore, language, stringFile) {
- return `var appStrings = _driver.GetAppStringDictionary(${language ? `"${language}", ` : ''}${
- stringFile ? `"${stringFile}"` : ''
- });`;
+ codeFor_getTimeouts() {
+ return `
+let timeouts = new Dictionary()
+{
+ { "script", _driver.Manage().Timeouts().AsynchronousJavaScript },
+ { "pageLoad", _driver.Manage().Timeouts().PageLoad },
+ { "implicit", _driver.Manage().Timeouts().ImplicitWait }
+};
+`;
}
- // Clipboard
+ codeFor_setTimeouts(/*varNameIgnore, varIndexIgnore, timeoutsJson*/) {
+ return '/* TODO implement setTimeouts */';
+ }
- codeFor_getClipboard() {
- return `var clipboardText = _driver.GetClipboardText();`;
+ codeFor_getLogTypes() {
+ return `let logTypes = _driver.Manage().Logs.AvailableLogTypes;`;
}
- codeFor_setClipboard(varNameIgnore, varIndexIgnore, clipboardText) {
- return `_driver.SetClipboardText("${clipboardText}");`;
+ codeFor_getLogs(varNameIgnore, varIndexIgnore, logType) {
+ return `let logs = _driver.Manage().Logs.GetLog("${logType}");`;
}
- // File Transfer
+ // Context
- codeFor_pushFile(varNameIgnore, varIndexIgnore, pathToInstallTo, fileContentString) {
- return `_driver.PushFile("${pathToInstallTo}", "${fileContentString}");`;
+ codeFor_getAppiumContext() {
+ return `var context = _driver.Context;`;
}
- codeFor_pullFile(varNameIgnore, varIndexIgnore, pathToPullFrom) {
- return `var fileBase64 = _driver.PullFile("${pathToPullFrom}");`;
+ codeFor_getAppiumContexts() {
+ return `var contexts = _driver.Contexts;`;
}
- codeFor_pullFolder(varNameIgnore, varIndexIgnore, folderToPullFrom) {
- return `var folderBase64 = _driver.PullFolder("${folderToPullFrom}");`;
+ codeFor_switchAppiumContext(varNameIgnore, varIndexIgnore, name) {
+ return `_driver.Context = "${name}";`;
}
// Device Interaction
- codeFor_isLocked() {
- return `let isLocked = ${this.codeFor_executeScriptNoArgs('mobile: isLocked')}`;
+ codeFor_getWindowRect() {
+ return `let windowRect = _driver.GetWindowRect;`;
}
- codeFor_rotateDevice() {
- return `// Not supported: rotateDevice`;
- }
-
- codeFor_touchId(varNameIgnore, varIndexIgnore, match) {
- return `_driver.PerformTouchID(${match});`;
+ codeFor_takeScreenshot() {
+ return `let screenshotBase64 = _driver.GetScreenshot().AsBase64EncodedString;`;
}
- codeFor_toggleEnrollTouchId() {
- return `// Not supported: toggleEnrollTouchId`;
- }
-
- // Keyboard
-
codeFor_isKeyboardShown() {
return `let isKeyboardShown = _driver.IsKeyboardShown();`;
}
- // Connectivity
-
- codeFor_toggleAirplaneMode() {
- return `_driver.ToggleAirplaneMode();`;
- }
-
- codeFor_toggleData() {
- return `_driver.ToggleData();`;
- }
-
- codeFor_toggleWiFi() {
- return `_driver.ToggleWiFi();`;
+ codeFor_getOrientation() {
+ return `let orientation = _driver.Orientation;`;
}
- codeFor_sendSMS(varNameIgnore, varIndexIgnore, phoneNumber, text) {
- return `_driver.SendSms("${phoneNumber}", "${text}");`;
+ codeFor_setOrientation(varNameIgnore, varIndexIgnore, orientation) {
+ return `_driver.Orientation = "${orientation}";`;
}
- codeFor_gsmCall(varNameIgnore, varIndexIgnore, phoneNumber, action) {
- return `_driver.MakeGsmCall("${phoneNumber}", "${action}");`;
+ codeFor_getGeoLocation() {
+ return `let location = _driver.Location;`;
}
- codeFor_gsmSignal(varNameIgnore, varIndexIgnore, signalStrength) {
- return `_driver.SetGsmSignalStrength("${signalStrength}");`;
+ codeFor_setGeoLocation(varNameIgnore, varIndexIgnore, latitude, longitude, altitude) {
+ return `_driver.Location = new Location { Latitude = ${latitude}, Longitude = ${longitude}, Altitude = ${altitude} };`;
}
- codeFor_gsmVoice(varNameIgnore, varIndexIgnore, state) {
- return `_driver.SetGsmVoice("${state}");`;
+ codeFor_rotateDevice() {
+ return `// Not supported: rotateDevice`;
}
- // Session
+ // App Management
- codeFor_getSession() {
- return `let sessionDetails = _driver.SessionDetails;`;
+ codeFor_installApp(varNameIgnore, varIndexIgnore, app) {
+ return `_driver.InstallApp("${app}");`;
}
- codeFor_setTimeouts(/*varNameIgnore, varIndexIgnore, timeoutsJson*/) {
- return '/* TODO implement setTimeouts */';
+ codeFor_isAppInstalled(varNameIgnore, varIndexIgnore, app) {
+ return `var isAppInstalled = _driver.IsAppInstalled("${app}");`;
}
- codeFor_getOrientation() {
- return `let orientation = _driver.Orientation;`;
+ codeFor_activateApp(varNameIgnore, varIndexIgnore, app) {
+ return `_driver.ActivateApp("${app}");`;
}
- codeFor_setOrientation(varNameIgnore, varIndexIgnore, orientation) {
- return `_driver.Orientation = "${orientation}";`;
+ codeFor_terminateApp(varNameIgnore, varIndexIgnore, app) {
+ return `_driver.TerminateApp("${app}");`;
}
- codeFor_getGeoLocation() {
- return `let location = _driver.Location;`;
+ codeFor_removeApp(varNameIgnore, varIndexIgnore, app) {
+ return `_driver.RemoveApp("${app}")`;
}
- codeFor_setGeoLocation(varNameIgnore, varIndexIgnore, latitude, longitude, altitude) {
- return `_driver.Location = new Location { Latitude = ${latitude}, Longitude = ${longitude}, Altitude = ${altitude} };`;
+ codeFor_queryAppState(varNameIgnore, varIndexIgnore, app) {
+ return `var appState = _driver.GetAppState("${app}");`;
}
- codeFor_getLogTypes() {
- return `let logTypes = _driver.Manage().Logs.AvailableLogTypes;`;
- }
+ // File Transfer
- codeFor_getLogs(varNameIgnore, varIndexIgnore, logType) {
- return `let logs = _driver.Manage().Logs.GetLog("${logType}");`;
+ codeFor_pushFile(varNameIgnore, varIndexIgnore, pathToInstallTo, fileContentString) {
+ return `_driver.PushFile("${pathToInstallTo}", "${fileContentString}");`;
}
- codeFor_updateSettings(varNameIgnore, varIndexIgnore, settingsJson) {
- try {
- let settings = [];
- for (let [settingName, settingValue] of _.toPairs(settingsJson)) {
- settings.push(`_driver.SetSetting("${settingName}", ${this.getCSharpVal(settingValue)});`);
- }
- return settings.join('\n');
- } catch (e) {
- return `// Could not parse: ${settingsJson}`;
- }
+ codeFor_pullFile(varNameIgnore, varIndexIgnore, pathToPullFrom) {
+ return `var fileBase64 = _driver.PullFile("${pathToPullFrom}");`;
}
- codeFor_getSettings() {
- return `let settings = _driver.Settings();`;
+ codeFor_pullFolder(varNameIgnore, varIndexIgnore, folderToPullFrom) {
+ return `var folderBase64 = _driver.PullFolder("${folderToPullFrom}");`;
}
// Web
@@ -360,21 +346,27 @@ driver.PerformActions(new List { swipe });
return `_driver.Navigate().Refresh();`;
}
- // Context
+ codeFor_getTitle() {
+ return `var title = _driver.Title;`;
+ }
- codeFor_getContext() {
- return `var context = _driver.Context;`;
+ codeFor_getWindowHandle() {
+ return `var windowHandle = _driver.CurrentWindowHandle;`;
}
- codeFor_getContexts() {
- return `var contexts = _driver.Contexts;`;
+ codeFor_closeWindow() {
+ return `_driver.Close();`;
}
- codeFor_switchContext(varNameIgnore, varIndexIgnore, name) {
- return `_driver.Context = "${name}";`;
+ codeFor_switchToWindow(varNameIgnore, varIndexIgnore, handle) {
+ return `_driver.SwitchTo().Window("${handle}");`;
}
-}
-DotNetNUnitFramework.readableName = '.NET - NUnit';
+ codeFor_getWindowHandles() {
+ return `var windowHandles = _driver.WindowHandles;`;
+ }
-export default DotNetNUnitFramework;
+ codeFor_createWindow() {
+ return `// Not supported: createWindow`;
+ }
+}
diff --git a/app/renderer/lib/client-frameworks/java-common.js b/app/common/renderer/lib/client-frameworks/java-common.js
similarity index 74%
rename from app/renderer/lib/client-frameworks/java-common.js
rename to app/common/renderer/lib/client-frameworks/java-common.js
index b6815dc557..67af6cbcf4 100644
--- a/app/renderer/lib/client-frameworks/java-common.js
+++ b/app/common/renderer/lib/client-frameworks/java-common.js
@@ -1,11 +1,11 @@
import _ from 'lodash';
+import refractorJava from 'refractor/java';
-import Framework from './framework';
+import CommonClientFramework from './common.js';
-class JavaFramework extends Framework {
- get language() {
- return 'java';
- }
+export default class JavaFramework extends CommonClientFramework {
+ static refractorLang = 'java';
+ static refractorLib = refractorJava;
getJavaVal(jsonVal) {
if (Array.isArray(jsonVal)) {
@@ -73,11 +73,11 @@ class JavaFramework extends Framework {
return this.handleUnsupportedLocatorStrategy(strategy, locator);
}
if (isArray) {
- return `var ${localVar} = driver.findElements(AppiumBy.${
+ return `WebElements ${localVar} = driver.findElements(AppiumBy.${
suffixMap[strategy]
}(${JSON.stringify(locator)}));`;
} else {
- return `var ${localVar} = driver.findElement(AppiumBy.${suffixMap[strategy]}(${JSON.stringify(
+ return `WebElement ${localVar} = driver.findElement(AppiumBy.${suffixMap[strategy]}(${JSON.stringify(
locator,
)}));`;
}
@@ -90,15 +90,15 @@ class JavaFramework extends Framework {
return varName;
}
- codeFor_click(varName, varIndex) {
+ codeFor_elementClick(varName, varIndex) {
return `${this.getVarName(varName, varIndex)}.click();`;
}
- codeFor_clear(varName, varIndex) {
+ codeFor_elementClear(varName, varIndex) {
return `${this.getVarName(varName, varIndex)}.clear();`;
}
- codeFor_sendKeys(varName, varIndex, text) {
+ codeFor_elementSendKeys(varName, varIndex, text) {
return `${this.getVarName(varName, varIndex)}.sendKeys(${JSON.stringify(text)});`;
}
@@ -134,7 +134,7 @@ driver.perform(Arrays.asList(swipe));
`;
}
- // Execute Script
+ // Top-Level Commands
codeFor_executeScriptNoArgs(scriptCmd) {
return `driver.executeScript("${scriptCmd}");`;
@@ -142,180 +142,167 @@ driver.perform(Arrays.asList(swipe));
codeFor_executeScriptWithArgs(scriptCmd, jsonArg) {
// Java dictionary needs to use the Map.ofEntries(Map.entry() ...) syntax
- return `driver.executeScript("${scriptCmd}", ${this.getJavaVal(jsonArg[0])};`;
+ return `driver.executeScript("${scriptCmd}", ${this.getJavaVal(jsonArg[0])});`;
}
- // App Management
-
- codeFor_getCurrentActivity() {
- return `var activityName = ${this.codeFor_executeScriptNoArgs('mobile: getCurrentActivity')}`;
+ codeFor_updateSettings(varNameIgnore, varIndexIgnore, settingsJson) {
+ try {
+ const settings = _.toPairs(settingsJson).map(
+ ([settingName, settingValue]) =>
+ `driver.setSetting("${settingName}", ${this.getJavaVal(settingValue)});`,
+ );
+ return settings.join('\n');
+ } catch {
+ return `// Could not parse: ${JSON.stringify(settingsJson)}`;
+ }
}
- codeFor_getCurrentPackage() {
- return `var packageName = ${this.codeFor_executeScriptNoArgs('mobile: getCurrentPackage')}`;
+ codeFor_getSettings() {
+ return `var settings = driver.getSettings();`;
}
- codeFor_installApp(varNameIgnore, varIndexIgnore, app) {
- return `driver.installApp("${app}");`;
+ // Session
+
+ codeFor_status() {
+ return `var status = driver.getStatus();`;
}
- codeFor_isAppInstalled(varNameIgnore, varIndexIgnore, app) {
- return `var isAppInstalled = driver.isAppInstalled("${app}");`;
+ codeFor_getSession() {
+ return `var caps = driver.getSessionDetails();`;
}
- codeFor_activateApp(varNameIgnore, varIndexIgnore, app) {
- return `driver.activateApp("${app}");`;
+ codeFor_getAppiumCommands() {
+ return `// Not supported: getAppiumCommands`;
}
- codeFor_terminateApp(varNameIgnore, varIndexIgnore, app) {
- return `driver.terminateApp("${app}");`;
+ codeFor_getAppiumExtensions() {
+ return `// Not supported: getAppiumExtensions`;
}
- codeFor_removeApp(varNameIgnore, varIndexIgnore, app) {
- return `driver.removeApp("${app}");`;
+ codeFor_getAppiumSessionCapabilities() {
+ return `// Not supported: getAppiumSessionCapabilities`;
}
- codeFor_getStrings(varNameIgnore, varIndexIgnore, language, stringFile) {
- return `var appStrings = driver.getAppStringMap(${language ? `${language}, ` : ''}${
- stringFile ? `"${stringFile}` : ''
- });`;
+ codeFor_getTimeouts() {
+ return `
+var implicitTimeout = driver.manage().timeouts().getImplicitWaitTimeout();
+var pageLoadTimeout = driver.manage().timeouts().getPageLoadTimeout();
+var scriptTimeout = driver.manage().timeouts().getScriptTimeout();
+var timeouts = Map.ofEntries(
+ Map.entry("implicit", implicitTimeout),
+ Map.entry("pageLoad", pageLoadTimeout),
+ Map.entry("script", scriptTimeout)
+);
+`;
}
- // Clipboard
+ codeFor_setTimeouts(/*varNameIgnore, varIndexIgnore, timeoutsJson*/) {
+ return '/* TODO implement setTimeouts */';
+ }
- codeFor_getClipboard() {
- return `var clipboardText = driver.getClipboardText();`;
+ codeFor_getLogTypes() {
+ return `var getLogTypes = driver.manage().logs().getAvailableLogTypes();`;
}
- codeFor_setClipboard(varNameIgnore, varIndexIgnore, clipboardText) {
- return `driver.setClipboardText("${clipboardText}");`;
+ codeFor_getLogs(varNameIgnore, varIndexIgnore, logType) {
+ return `var logEntries = driver.manage().logs().get("${logType}");`;
}
- // File Transfer
+ // Context
- codeFor_pushFile(varNameIgnore, varIndexIgnore, pathToInstallTo, fileContentString) {
- return `driver.pushFile("${pathToInstallTo}", ${fileContentString});`;
+ codeFor_getAppiumContext() {
+ return `var context = driver.getContext();`;
}
- codeFor_pullFile(varNameIgnore, varIndexIgnore, pathToPullFrom) {
- return `var fileBase64 = driver.pullFile("${pathToPullFrom}");`;
+ codeFor_getAppiumContexts() {
+ return `var contexts = driver.getContextHandles();`;
}
- codeFor_pullFolder(varNameIgnore, varIndexIgnore, folderToPullFrom) {
- return `var folderBase64 = driver.pullFolder("${folderToPullFrom}");`;
+ codeFor_switchAppiumContext(varNameIgnore, varIndexIgnore, name) {
+ return `driver.context("${name}");`;
}
// Device Interaction
- codeFor_isLocked() {
- return `var isLocked = ${this.codeFor_executeScriptNoArgs('mobile: isLocked')}`;
- }
-
- codeFor_rotateDevice(
- varNameIgnore,
- varIndexIgnore,
- x,
- y,
- radius,
- rotation,
- touchCount,
- duration,
- ) {
- return `driver.rotate(new DeviceRotation(${x}, ${y}, ${radius}, ${rotation}, ${touchCount}, ${duration}));`;
- }
-
- codeFor_touchId(varNameIgnore, varIndexIgnore, match) {
- return `driver.performTouchID(${match});`;
+ codeFor_getWindowRect() {
+ return `// Not supported: getWindowRect`;
}
- codeFor_toggleEnrollTouchId(varNameIgnore, varIndexIgnore, enroll) {
- return `driver.toggleTouchIDEnrollment(${enroll});`;
+ codeFor_takeScreenshot() {
+ return `byte[] screenshot = Base64.getEncoder().encode(driver.getScreenshotAs(OutputType.BYTES));`;
}
- // Keyboard
-
codeFor_isKeyboardShown() {
return `var isKeyboardShown = driver.isKeyboardShown();`;
}
- // Connectivity
-
- codeFor_toggleAirplaneMode() {
- return `driver.toggleAirplaneMode();`;
- }
-
- codeFor_toggleData() {
- return `driver.toggleData();`;
- }
-
- codeFor_toggleWiFi() {
- return `driver.toggleWifi();`;
+ codeFor_getOrientation() {
+ return `var orientation = driver.getOrientation();`;
}
- codeFor_sendSMS(varNameIgnore, varIndexIgnore, phoneNumber, text) {
- return `driver.sendSMS("${phoneNumber}", "${text}");`;
+ codeFor_setOrientation(varNameIgnore, varIndexIgnore, orientation) {
+ return `driver.rotate("${orientation}");`;
}
- codeFor_gsmCall(varNameIgnore, varIndexIgnore, phoneNumber, action) {
- return `driver.makeGsmCall("${phoneNumber}", "${action}");`;
+ codeFor_getGeoLocation() {
+ return `var location = driver.location();`;
}
- codeFor_gsmSignal(varNameIgnore, varIndexIgnore, signalStrength) {
- return `driver.setGsmSignalStrength("${signalStrength}");`;
+ codeFor_setGeoLocation(varNameIgnore, varIndexIgnore, latitude, longitude, altitude) {
+ return `driver.setLocation(new Location(${latitude}, ${longitude}, ${altitude}));`;
}
- codeFor_gsmVoice(varNameIgnore, varIndexIgnore, state) {
- return `driver.setGsmVoice("${state}");`;
+ codeFor_rotateDevice(
+ varNameIgnore,
+ varIndexIgnore,
+ x,
+ y,
+ radius,
+ rotation,
+ touchCount,
+ duration,
+ ) {
+ return `driver.rotate(new DeviceRotation(${x}, ${y}, ${radius}, ${rotation}, ${touchCount}, ${duration}));`;
}
- // Session
+ // App Management
- codeFor_getSession() {
- return `var caps = driver.getSessionDetails();`;
+ codeFor_installApp(varNameIgnore, varIndexIgnore, app) {
+ return `driver.installApp("${app}");`;
}
- codeFor_setTimeouts(/*varNameIgnore, varIndexIgnore, timeoutsJson*/) {
- return '/* TODO implement setTimeouts */';
+ codeFor_isAppInstalled(varNameIgnore, varIndexIgnore, app) {
+ return `var isAppInstalled = driver.isAppInstalled("${app}");`;
}
- codeFor_getOrientation() {
- return `var orientation = driver.getOrientation();`;
+ codeFor_activateApp(varNameIgnore, varIndexIgnore, app) {
+ return `driver.activateApp("${app}");`;
}
- codeFor_setOrientation(varNameIgnore, varIndexIgnore, orientation) {
- return `driver.rotate("${orientation}");`;
+ codeFor_terminateApp(varNameIgnore, varIndexIgnore, app) {
+ return `driver.terminateApp("${app}");`;
}
- codeFor_getGeoLocation() {
- return `var location = driver.location();`;
+ codeFor_removeApp(varNameIgnore, varIndexIgnore, app) {
+ return `driver.removeApp("${app}");`;
}
- codeFor_setGeoLocation(varNameIgnore, varIndexIgnore, latitude, longitude, altitude) {
- return `driver.setLocation(new Location(${latitude}, ${longitude}, ${altitude}));`;
+ codeFor_queryAppState(varNameIgnore, varIndexIgnore, app) {
+ return `var appState = driver.queryAppState("${app}");`;
}
- codeFor_getLogTypes() {
- return `var getLogTypes = driver.manage().logs().getAvailableLogTypes();`;
- }
+ // File Transfer
- codeFor_getLogs(varNameIgnore, varIndexIgnore, logType) {
- return `var logEntries = driver.manage().logs().get("${logType}");`;
+ codeFor_pushFile(varNameIgnore, varIndexIgnore, pathToInstallTo, fileContentString) {
+ return `driver.pushFile("${pathToInstallTo}", ${fileContentString});`;
}
- codeFor_updateSettings(varNameIgnore, varIndexIgnore, settingsJson) {
- try {
- let settings = [];
- for (let [settingName, settingValue] of _.toPairs(settingsJson)) {
- settings.push(`driver.setSetting("${settingName}", ${this.getJavaVal(settingValue)});`);
- }
- return settings.join('\n');
- } catch (e) {
- return `// Could not parse: ${settingsJson}`;
- }
+ codeFor_pullFile(varNameIgnore, varIndexIgnore, pathToPullFrom) {
+ return `var fileBase64 = driver.pullFile("${pathToPullFrom}");`;
}
- codeFor_getSettings() {
- return `var settings = driver.getSettings();`;
+ codeFor_pullFolder(varNameIgnore, varIndexIgnore, folderToPullFrom) {
+ return `var folderBase64 = driver.pullFolder("${folderToPullFrom}");`;
}
// Web
@@ -340,19 +327,27 @@ driver.perform(Arrays.asList(swipe));
return `driver.navigate().refresh();`;
}
- // Context
+ codeFor_getTitle() {
+ return `var title = driver.getTitle();`;
+ }
- codeFor_getContext() {
- return `var context = driver.getContext();`;
+ codeFor_getWindowHandle() {
+ return `var windowHandle = driver.getWindowHandle();`;
}
- codeFor_getContexts() {
- return `var contexts = driver.getContextHandles();`;
+ codeFor_closeWindow() {
+ return `driver.close();`;
}
- codeFor_switchContext(varNameIgnore, varIndexIgnore, name) {
- return `driver.context("${name}");`;
+ codeFor_switchToWindow(varNameIgnore, varIndexIgnore, handle) {
+ return `driver.switchTo().window("${handle}");`;
}
-}
-export default JavaFramework;
+ codeFor_getWindowHandles() {
+ return `var windowHandles = driver.getWindowHandles();`;
+ }
+
+ codeFor_createWindow() {
+ return `// Not supported: createWindow`;
+ }
+}
diff --git a/app/renderer/lib/client-frameworks/java-junit4.js b/app/common/renderer/lib/client-frameworks/java-junit4.js
similarity index 74%
rename from app/renderer/lib/client-frameworks/java-junit4.js
rename to app/common/renderer/lib/client-frameworks/java-junit4.js
index ad74e90d63..a2fa37851e 100644
--- a/app/renderer/lib/client-frameworks/java-junit4.js
+++ b/app/common/renderer/lib/client-frameworks/java-junit4.js
@@ -1,16 +1,21 @@
-import JavaFramework from './java-common';
+import JavaFramework from './java-common.js';
+
+export default class JavaJUnit4Framework extends JavaFramework {
+ static readableName = 'Java - JUnit4';
-class JavaJUnit4Framework extends JavaFramework {
wrapWithBoilerplate(code) {
const [pkg, cls, capStr] = this.getBoilerplateParams();
// Import everything from Selenium in order to use WebElement, Point and other classes.
return `// This sample code supports Appium Java client >=9
// https://github.com/appium/java-client
import io.appium.java_client.remote.options.BaseOptions;
+import io.appium.java_client.AppiumBy;
import io.appium.java_client.${pkg}.${cls};
import java.net.URL;
+import java.net.MalformedURLException;
import java.time.Duration;
import java.util.Arrays;
+import java.util.Base64;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
@@ -22,16 +27,8 @@ public class SampleTest {
@Before
public void setUp() {
- var options = new BaseOptions()
-${capStr};
-
- private URL getUrl() {
- try {
- return new URL("${this.serverUrl}");
- } catch (MalformedURLException e) {
- e.printStackTrace();
- }
- }
+ Capabilities options = new BaseOptions()
+${capStr};
driver = new ${cls}(this.getUrl(), options);
}
@@ -45,11 +42,15 @@ ${this.indent(code, 4)}
public void tearDown() {
driver.quit();
}
+
+ private URL getUrl() {
+ try {
+ return new URL("${this.serverUrl}");
+ } catch (MalformedURLException e) {
+ e.printStackTrace();
+ }
+ }
}
`;
}
}
-
-JavaJUnit4Framework.readableName = 'Java - JUnit4';
-
-export default JavaJUnit4Framework;
diff --git a/app/renderer/lib/client-frameworks/java-junit5.js b/app/common/renderer/lib/client-frameworks/java-junit5.js
similarity index 75%
rename from app/renderer/lib/client-frameworks/java-junit5.js
rename to app/common/renderer/lib/client-frameworks/java-junit5.js
index 2f5cdd6e99..74f7ab1f56 100644
--- a/app/renderer/lib/client-frameworks/java-junit5.js
+++ b/app/common/renderer/lib/client-frameworks/java-junit5.js
@@ -1,16 +1,21 @@
-import JavaFramework from './java-common';
+import JavaFramework from './java-common.js';
+
+export default class JavaJUnit5Framework extends JavaFramework {
+ static readableName = 'Java - JUnit5';
-class JavaJUnit5Framework extends JavaFramework {
wrapWithBoilerplate(code) {
const [pkg, cls, capStr] = this.getBoilerplateParams();
// Import everything from Selenium in order to use WebElement, Point and other classes.
return `// This sample code supports Appium Java client >=9
// https://github.com/appium/java-client
import io.appium.java_client.remote.options.BaseOptions;
+import io.appium.java_client.AppiumBy;
import io.appium.java_client.${pkg}.${cls};
import java.net.URL;
+import java.net.MalformedURLException;
import java.time.Duration;
import java.util.Arrays;
+import java.util.Base64;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
@@ -22,16 +27,8 @@ public class SampleTest {
@BeforeEach
public void setUp() {
- var options = new BaseOptions()
-${capStr};
-
- private URL getUrl() {
- try {
- return new URL("${this.serverUrl}");
- } catch (MalformedURLException e) {
- e.printStackTrace();
- }
- }
+ Capabilities options = new BaseOptions()
+${capStr};
driver = new ${cls}(this.getUrl(), options);
}
@@ -45,11 +42,15 @@ ${this.indent(code, 4)}
public void tearDown() {
driver.quit();
}
+
+ private URL getUrl() {
+ try {
+ return new URL("${this.serverUrl}");
+ } catch (MalformedURLException e) {
+ e.printStackTrace();
+ }
+ }
}
`;
}
}
-
-JavaJUnit5Framework.readableName = 'Java - JUnit5';
-
-export default JavaJUnit5Framework;
diff --git a/app/renderer/lib/client-frameworks/js-oxygen.js b/app/common/renderer/lib/client-frameworks/js-oxygen.js
similarity index 69%
rename from app/renderer/lib/client-frameworks/js-oxygen.js
rename to app/common/renderer/lib/client-frameworks/js-oxygen.js
index d93c0872d9..93e338a7af 100644
--- a/app/renderer/lib/client-frameworks/js-oxygen.js
+++ b/app/common/renderer/lib/client-frameworks/js-oxygen.js
@@ -1,12 +1,14 @@
-import Framework from './framework';
+import refractorJs from 'refractor/javascript';
-class JsOxygenFramework extends Framework {
- get language() {
- return 'js';
- }
+import CommonClientFramework from './common.js';
+
+export default class JsOxygenFramework extends CommonClientFramework {
+ static readableName = 'JS - Oxygen HQ';
+ static refractorLang = 'js';
+ static refractorLib = refractorJs;
get type() {
- if (this.caps && this.caps.platformName && this.caps.platformName.toLowerCase() === 'windows') {
+ if (this.caps?.platformName && this.caps.platformName.toLowerCase() === 'windows') {
return 'win';
}
return 'mob';
@@ -57,15 +59,15 @@ ${code}`;
}
}
- codeFor_click(varName, varIndex) {
+ codeFor_elementClick(varName, varIndex) {
return `${this.type}.click(${this.getVarName(varName, varIndex)});`;
}
- codeFor_clear(varName, varIndex) {
+ codeFor_elementClear(varName, varIndex) {
return `${this.type}.clear(${this.getVarName(varName, varIndex)});`;
}
- codeFor_sendKeys(varName, varIndex, text) {
+ codeFor_elementSendKeys(varName, varIndex, text) {
return `${this.type}.type(${this.getVarName(varName, varIndex)}, ${JSON.stringify(text)});`;
}
@@ -79,7 +81,7 @@ ${code}`;
return `${this.type}.swipeScreen(${x1}, ${y1}, ${x2}, ${y2});`;
}
- // Execute Script
+ // Top-Level Commands
codeFor_executeScriptNoArgs(scriptCmd) {
return `${this.type}.getDriver().executeScript(${JSON.stringify(scriptCmd)});`;
@@ -91,169 +93,147 @@ ${code}`;
)});`;
}
- // App Management
-
- codeFor_getCurrentActivity() {
- return `let activityName = ${this.codeFor_executeScriptNoArgs('mobile: getCurrentActivity')}`;
+ codeFor_updateSettings(varNameIgnore, varIndexIgnore, settingsJson) {
+ return `${this.type}.getDriver().updateSettings(${JSON.stringify(settingsJson)});`;
}
- codeFor_getCurrentPackage() {
- return `let packageName = ${this.codeFor_executeScriptNoArgs('mobile: getCurrentPackage')}`;
+ codeFor_getSettings() {
+ return `let settings = ${this.type}.getDriver().getSettings();`;
}
- codeFor_installApp(varNameIgnore, varIndexIgnore, app) {
- return `${this.type}.installApp("${app}");`;
+ // Session
+
+ codeFor_status() {
+ return `let status = ${this.type}.getDriver().status();`;
}
- codeFor_isAppInstalled(varNameIgnore, varIndexIgnore, app) {
- return `let isAppInstalled = ${this.type}.isAppInstalled("${app}");`;
+ codeFor_getSession() {
+ return `let caps = ${this.type}.getDriver().getSession();`;
}
- codeFor_activateApp(varNameIgnore, varIndexIgnore, app) {
- return `${this.type}.getDriver().activateApp("${app}");`;
+ codeFor_getAppiumCommands() {
+ return `let appiumCommands = ${this.type}.getDriver().getAppiumCommands();`;
}
- codeFor_terminateApp(varNameIgnore, varIndexIgnore, app) {
- return `${this.type}.getDriver().terminateApp("${app}");`;
+ codeFor_getAppiumExtensions() {
+ return `let appiumExtensions = ${this.type}.getDriver().getAppiumExtensions();`;
}
- codeFor_removeApp(varNameIgnore, varIndexIgnore, app) {
- return `${this.type}.removeApp("${app}")`;
+ codeFor_getAppiumSessionCapabilities() {
+ return `let sessionCaps = ${this.type}.getDriver().getAppiumSessionCapabilities();`;
}
- codeFor_getStrings(varNameIgnore, varIndexIgnore, language, stringFile) {
- return `let appStrings = ${this.type}.getDriver().getStrings(${
- language ? `"${language}", ` : ''
- }${stringFile ? `"${stringFile}"` : ''});`;
+ codeFor_getTimeouts() {
+ return `let timeouts = ${this.type}.getDriver().getTimeouts();`;
}
- // Clipboard
+ codeFor_setTimeouts(/*varNameIgnore, varIndexIgnore, timeoutsJson*/) {
+ return '/* TODO implement setTimeouts */';
+ }
- codeFor_getClipboard() {
- return `let clipboardText = ${this.type}.getDriver().getClipboard();`;
+ codeFor_getLogTypes() {
+ return `let getLogTypes = ${this.type}.getDriver().getLogTypes();`;
}
- codeFor_setClipboard(varNameIgnore, varIndexIgnore, clipboardText) {
- return `${this.type}.getDriver().setClipboard("${clipboardText}")`;
+ codeFor_getLogs(varNameIgnore, varIndexIgnore, logType) {
+ return `let logs = ${this.type}.getDriver().getLogs("${logType}");`;
}
- // File Transfer
+ // Context
- codeFor_pushFile(varNameIgnore, varIndexIgnore, pathToInstallTo, fileContentString) {
- return `${this.type}.getDriver().pushFile("${pathToInstallTo}", "${fileContentString}");`;
+ codeFor_getAppiumContext() {
+ return `let context = ${this.type}.getDriver().getContext();`;
}
- codeFor_pullFile(varNameIgnore, varIndexIgnore, pathToPullFrom) {
- return `let fileBase64 = ${this.type}.getDriver().pullFile("${pathToPullFrom}");`;
+ codeFor_getAppiumContexts() {
+ return `let contexts = ${this.type}.getDriver().getContexts();`;
}
- codeFor_pullFolder(varNameIgnore, varIndexIgnore, folderToPullFrom) {
- return `let fileBase64 = ${this.type}.getDriver().pullFolder("${folderToPullFrom}");`;
+ codeFor_switchAppiumContext(varNameIgnore, varIndexIgnore, name) {
+ return `${this.type}.setContext("${name}");`;
}
// Device Interaction
- codeFor_isLocked() {
- return `let isLocked = ${this.codeFor_executeScriptNoArgs('mobile: isLocked')}`;
- }
-
- codeFor_rotateDevice(
- varNameIgnore,
- varIndexIgnore,
- x,
- y,
- radius,
- rotation,
- touchCount,
- duration,
- ) {
- return `${this.type}.getDriver().rotateDevice({x: ${x}, y: ${y}, duration: ${duration}, radius: ${radius}, rotation: ${rotation}, touchCount: ${touchCount}});`;
- }
-
- codeFor_touchId(varNameIgnore, varIndexIgnore, match) {
- return `${this.type}.getDriver().touchId(${match});`;
+ codeFor_getWindowRect() {
+ return `let windowRect = ${this.type}.getDriver().getWindowRect();`;
}
- codeFor_toggleEnrollTouchId(varNameIgnore, varIndexIgnore, enroll) {
- return `${this.type}.getDriver().toggleEnrollTouchId(${enroll});`;
+ codeFor_takeScreenshot() {
+ return `let screenshot = ${this.type}.takeScreenshot();`;
}
- // Keyboard
-
codeFor_isKeyboardShown() {
return `let isKeyboardShown = ${this.type}.getDriver().isKeyboardShown();`;
}
- // Connectivity
-
- codeFor_toggleAirplaneMode() {
- return `${this.type}.getDriver().toggleAirplaneMode();`;
- }
-
- codeFor_toggleData() {
- return `${this.type}.getDriver().toggleData();`;
- }
-
- codeFor_toggleWiFi() {
- return `${this.type}.getDriver().toggleWiFi();`;
+ codeFor_getOrientation() {
+ return `let orientation = ${this.type}.getDriver().getOrientation();`;
}
- codeFor_sendSMS(varNameIgnore, varIndexIgnore, phoneNumber, text) {
- return `${this.type}.getDriver().sendSms("${phoneNumber}", "${text}");`;
+ codeFor_setOrientation(varNameIgnore, varIndexIgnore, orientation) {
+ return `${this.type}.getDriver().setOrientation("${orientation}");`;
}
- codeFor_gsmCall(varNameIgnore, varIndexIgnore, phoneNumber, action) {
- return `${this.type}.getDriver().gsmCall("${phoneNumber}", "${action}");`;
+ codeFor_getGeoLocation() {
+ return `let location = ${this.type}.getDriver().getGeoLocation();`;
}
- codeFor_gsmSignal(varNameIgnore, varIndexIgnore, signalStrength) {
- return `${this.type}.getDriver().gsmSignal("${signalStrength}");`;
+ codeFor_setGeoLocation(varNameIgnore, varIndexIgnore, latitude, longitude, altitude) {
+ return `${this.type}.getDriver().setGeoLocation({latitude: ${latitude}, longitude: ${longitude}, altitude: ${altitude}});`;
}
- codeFor_gsmVoice(varNameIgnore, varIndexIgnore, state) {
- return `${this.type}.getDriver().gsmVoice("${state}");`;
+ codeFor_rotateDevice(
+ varNameIgnore,
+ varIndexIgnore,
+ x,
+ y,
+ radius,
+ rotation,
+ touchCount,
+ duration,
+ ) {
+ return `${this.type}.getDriver().rotateDevice({x: ${x}, y: ${y}, duration: ${duration}, radius: ${radius}, rotation: ${rotation}, touchCount: ${touchCount}});`;
}
- // Session
+ // App Management
- codeFor_getSession() {
- return `let caps = ${this.type}.getDriver().getSession();`;
+ codeFor_installApp(varNameIgnore, varIndexIgnore, app) {
+ return `${this.type}.installApp("${app}");`;
}
- codeFor_setTimeouts(/*varNameIgnore, varIndexIgnore, timeoutsJson*/) {
- return '/* TODO implement setTimeouts */';
+ codeFor_isAppInstalled(varNameIgnore, varIndexIgnore, app) {
+ return `let isAppInstalled = ${this.type}.isAppInstalled("${app}");`;
}
- codeFor_getOrientation() {
- return `let orientation = ${this.type}.getDriver().getOrientation();`;
+ codeFor_activateApp(varNameIgnore, varIndexIgnore, app) {
+ return `${this.type}.getDriver().activateApp("${app}");`;
}
- codeFor_setOrientation(varNameIgnore, varIndexIgnore, orientation) {
- return `${this.type}.getDriver().setOrientation("${orientation}");`;
+ codeFor_terminateApp(varNameIgnore, varIndexIgnore, app) {
+ return `${this.type}.getDriver().terminateApp("${app}");`;
}
- codeFor_getGeoLocation() {
- return `let location = ${this.type}.getDriver().getGeoLocation();`;
+ codeFor_removeApp(varNameIgnore, varIndexIgnore, app) {
+ return `${this.type}.removeApp("${app}")`;
}
- codeFor_setGeoLocation(varNameIgnore, varIndexIgnore, latitude, longitude, altitude) {
- return `${this.type}.getDriver().setGeoLocation({latitude: ${latitude}, longitude: ${longitude}, altitude: ${altitude}});`;
+ codeFor_queryAppState(varNameIgnore, varIndexIgnore, app) {
+ return `let appState = ${this.type}.getDriver().queryAppState("${app}");`;
}
- codeFor_getLogTypes() {
- return `let getLogTypes = ${this.type}.getDriver().getLogTypes();`;
- }
+ // File Transfer
- codeFor_getLogs(varNameIgnore, varIndexIgnore, logType) {
- return `let logs = ${this.type}.getDriver().getLogs("${logType}");`;
+ codeFor_pushFile(varNameIgnore, varIndexIgnore, pathToInstallTo, fileContentString) {
+ return `${this.type}.getDriver().pushFile("${pathToInstallTo}", "${fileContentString}");`;
}
- codeFor_updateSettings(varNameIgnore, varIndexIgnore, settingsJson) {
- return `${this.type}.getDriver().updateSettings(${JSON.stringify(settingsJson)});`;
+ codeFor_pullFile(varNameIgnore, varIndexIgnore, pathToPullFrom) {
+ return `let fileBase64 = ${this.type}.getDriver().pullFile("${pathToPullFrom}");`;
}
- codeFor_getSettings() {
- return `let settings = ${this.type}.getDriver().getSettings();`;
+ codeFor_pullFolder(varNameIgnore, varIndexIgnore, folderToPullFrom) {
+ return `let fileBase64 = ${this.type}.getDriver().pullFolder("${folderToPullFrom}");`;
}
// Web
@@ -263,7 +243,7 @@ ${code}`;
}
codeFor_getUrl() {
- return `${this.type}.getUrl();`;
+ return `let currentUrl = ${this.type}.getUrl();`;
}
codeFor_back() {
@@ -278,21 +258,27 @@ ${code}`;
return `${this.type}.getDriver().refresh();`;
}
- // Context
+ codeFor_getTitle() {
+ return `let title = ${this.type}.getTitle();`;
+ }
- codeFor_getContext() {
- return `let context = ${this.type}.getDriver().getContext();`;
+ codeFor_getWindowHandle() {
+ return `let windowHandle = ${this.type}.getDriver().getWindowHandle();`;
}
- codeFor_getContexts() {
- return `let contexts = ${this.type}.getDriver().getContexts();`;
+ codeFor_closeWindow() {
+ return `${this.type}.closeWindow();`;
}
- codeFor_switchContext(varNameIgnore, varIndexIgnore, name) {
- return `${this.type}.setContext("${name}");`;
+ codeFor_switchToWindow(varNameIgnore, varIndexIgnore, handle) {
+ return `${this.type}.selectWindow("${handle}");`;
}
-}
-JsOxygenFramework.readableName = 'JS - Oxygen HQ';
+ codeFor_getWindowHandles() {
+ return `let windowHandles = ${this.type}.getWindowHandles();`;
+ }
-export default JsOxygenFramework;
+ codeFor_createWindow(varNameIgnore, varIndexIgnore, type) {
+ return `let newWindow = await ${this.type}.getDriver().createWindow("${type}");`;
+ }
+}
diff --git a/app/renderer/lib/client-frameworks/js-wdio.js b/app/common/renderer/lib/client-frameworks/js-wdio.js
similarity index 64%
rename from app/renderer/lib/client-frameworks/js-wdio.js
rename to app/common/renderer/lib/client-frameworks/js-wdio.js
index b4e116b1bb..8d6857d013 100644
--- a/app/renderer/lib/client-frameworks/js-wdio.js
+++ b/app/common/renderer/lib/client-frameworks/js-wdio.js
@@ -1,12 +1,14 @@
-import Framework from './framework';
+import refractorJs from 'refractor/javascript';
-class JsWdIoFramework extends Framework {
- get language() {
- return 'js';
- }
+import CommonClientFramework from './common.js';
+
+export default class JsWdIoFramework extends CommonClientFramework {
+ static readableName = 'JS - WebdriverIO';
+ static refractorLang = 'js';
+ static refractorLib = refractorJs;
wrapWithBoilerplate(code) {
- return `// This sample code supports WebdriverIO client >=7
+ return `// This sample code supports WebdriverIO client >=9.7.0
// (npm i --save webdriverio)
// Then paste this into a .js file and run with Node:
// node .js
@@ -15,10 +17,10 @@ import {remote} from 'webdriverio';
async function main () {
const caps = ${JSON.stringify(this.caps, null, 2)}
const driver = await remote({
- protocol: "${this.scheme}",
- hostname: "${this.host}",
- port: ${this.port},
- path: "${this.path}",
+ protocol: "${this.serverUrlParts.protocol}",
+ hostname: "${this.serverUrlParts.host}",
+ port: ${this.serverUrlParts.port},
+ path: "${this.serverUrlParts.path}",
capabilities: caps
});
${this.indent(code, 2)}
@@ -56,35 +58,41 @@ main().catch(console.log);`;
}
}
- codeFor_click(varName, varIndex) {
+ codeFor_elementClick(varName, varIndex) {
return `await ${this.getVarName(varName, varIndex)}.click();`;
}
- codeFor_clear(varName, varIndex) {
+ codeFor_elementClear(varName, varIndex) {
return `await ${this.getVarName(varName, varIndex)}.clearValue();`;
}
- codeFor_sendKeys(varName, varIndex, text) {
+ codeFor_elementSendKeys(varName, varIndex, text) {
return `await ${this.getVarName(varName, varIndex)}.addValue(${JSON.stringify(text)});`;
}
codeFor_tap(varNameIgnore, varIndexIgnore, pointerActions) {
const {x, y} = this.getTapCoordinatesFromPointerActions(pointerActions);
- return `await driver.touchAction({
- action: 'tap', x: ${x}, y: ${y}
-});`;
+ return `await driver.action('pointer')
+ .move({ duration: 0, x: ${x}, y: ${y} })
+ .down({ button: 0 })
+ .pause(50)
+ .up({ button: 0 })
+ .perform();
+`;
}
codeFor_swipe(varNameIgnore, varIndexIgnore, pointerActions) {
const {x1, y1, x2, y2} = this.getSwipeCoordinatesFromPointerActions(pointerActions);
- return `await driver.touchAction([
- { action: 'press', x: ${x1}, y: ${y1} },
- { action: 'moveTo', x: ${x2}, y: ${y2} },
- 'release'
-]);`;
+ return `await driver.action('pointer')
+ .move({ duration: 0, x: ${x1}, y: ${y1} })
+ .down({ button: 0 })
+ .move({ duration: 1000, x: ${x2}, y: ${y2} })
+ .up({ button: 0 })
+ .perform();
+`;
}
- // Execute Script
+ // Top-Level Commands
codeFor_executeScriptNoArgs(scriptCmd) {
return `await driver.executeScript(${JSON.stringify(scriptCmd)});`;
@@ -94,169 +102,147 @@ main().catch(console.log);`;
return `await driver.executeScript(${JSON.stringify(scriptCmd)}, ${JSON.stringify(jsonArg)});`;
}
- // App Management
-
- codeFor_getCurrentActivity() {
- return `let activityName = ${this.codeFor_executeScriptNoArgs('mobile: getCurrentActivity')}`;
+ codeFor_updateSettings(varNameIgnore, varIndexIgnore, settingsJson) {
+ return `await driver.updateSettings(${JSON.stringify(settingsJson)});`;
}
- codeFor_getCurrentPackage() {
- return `let packageName = ${this.codeFor_executeScriptNoArgs('mobile: getCurrentPackage')}`;
+ codeFor_getSettings() {
+ return `let settings = await driver.getSettings();`;
}
- codeFor_installApp(varNameIgnore, varIndexIgnore, app) {
- return `await driver.installApp("${app}");`;
+ // Session
+
+ codeFor_status() {
+ return `let status = await driver.status();`;
}
- codeFor_isAppInstalled(varNameIgnore, varIndexIgnore, app) {
- return `let isAppInstalled = await driver.isAppInstalled("${app}");`;
+ codeFor_getSession() {
+ return `let sessionDetails = await driver.getSession();`;
}
- codeFor_activateApp(varNameIgnore, varIndexIgnore, app) {
- return `await driver.activateApp("${app}");`;
+ codeFor_getAppiumCommands() {
+ return `let appiumCommands = await driver.getAppiumCommands();`;
}
- codeFor_terminateApp(varNameIgnore, varIndexIgnore, app) {
- return `await driver.terminateApp("${app}");`;
+ codeFor_getAppiumExtensions() {
+ return `let appiumExtensions = await driver.getAppiumExtensions();`;
}
- codeFor_removeApp(varNameIgnore, varIndexIgnore, app) {
- return `await driver.removeApp("${app}")`;
+ codeFor_getAppiumSessionCapabilities() {
+ return `let sessionCaps = await driver.getAppiumSessionCapabilities();`;
}
- codeFor_getStrings(varNameIgnore, varIndexIgnore, language, stringFile) {
- return `let appStrings = await driver.getStrings(${language ? `"${language}", ` : ''}${
- stringFile ? `"${stringFile}"` : ''
- });`;
+ codeFor_getTimeouts() {
+ return `let timeouts = await driver.getTimeouts();`;
}
- // Clipboard
+ codeFor_setTimeouts(/*varNameIgnore, varIndexIgnore, timeoutsJson*/) {
+ return '/* TODO implement setTimeouts */';
+ }
- codeFor_getClipboard() {
- return `let clipboardText = await driver.getClipboard();`;
+ codeFor_getLogTypes() {
+ return `let logTypes = await driver.getLogTypes();`;
}
- codeFor_setClipboard(varNameIgnore, varIndexIgnore, clipboardText) {
- return `await driver.setClipboard("${clipboardText}")`;
+ codeFor_getLogs(varNameIgnore, varIndexIgnore, logType) {
+ return `let logs = await driver.getLogs("${logType}");`;
}
- // File Transfer
+ // Context
- codeFor_pushFile(varNameIgnore, varIndexIgnore, pathToInstallTo, fileContentString) {
- return `await driver.pushFile("${pathToInstallTo}", "${fileContentString}");`;
+ codeFor_getAppiumContext() {
+ return `let context = await driver.getAppiumContext();`;
}
- codeFor_pullFile(varNameIgnore, varIndexIgnore, pathToPullFrom) {
- return `let fileBase64 = await driver.pullFile("${pathToPullFrom}");`;
+ codeFor_getAppiumContexts() {
+ return `let contexts = await driver.getAppiumContexts();`;
}
- codeFor_pullFolder(varNameIgnore, varIndexIgnore, folderToPullFrom) {
- return `let folderBase64 = await driver.pullFolder("${folderToPullFrom}");`;
+ codeFor_switchAppiumContext(varNameIgnore, varIndexIgnore, name) {
+ return `await driver.switchAppiumContext("${name}");`;
}
// Device Interaction
- codeFor_isLocked() {
- return `let isLocked = ${this.codeFor_executeScriptNoArgs('mobile: isLocked')}`;
+ codeFor_getWindowRect() {
+ return `let windowRect = await driver.getWindowRect();`;
}
- codeFor_rotateDevice(
- varNameIgnore,
- varIndexIgnore,
- x,
- y,
- radius,
- rotation,
- touchCount,
- duration,
- ) {
- return `await driver.rotateDevice(${x}, ${y}, ${radius}, ${rotation}, ${touchCount}, ${duration});`;
- }
-
- codeFor_touchId(varNameIgnore, varIndexIgnore, match) {
- return `await driver.touchId(${match});`;
- }
-
- codeFor_toggleEnrollTouchId(varNameIgnore, varIndexIgnore, enroll) {
- return `await driver.toggleEnrollTouchId(${enroll});`;
+ codeFor_takeScreenshot() {
+ return `let screenshot = await driver.takeScreenshot();`;
}
- // Keyboard
-
codeFor_isKeyboardShown() {
return `let isKeyboardShown = await driver.isKeyboardShown();`;
}
- // Connectivity
-
- codeFor_toggleAirplaneMode() {
- return `await driver.toggleAirplaneMode();`;
- }
-
- codeFor_toggleData() {
- return `await driver.toggleData();`;
- }
-
- codeFor_toggleWiFi() {
- return `await driver.toggleWiFi();`;
+ codeFor_getOrientation() {
+ return `let orientation = await driver.getOrientation();`;
}
- codeFor_sendSMS(varNameIgnore, varIndexIgnore, phoneNumber, text) {
- return `await driver.sendSms("${phoneNumber}", "${text}");`;
+ codeFor_setOrientation(varNameIgnore, varIndexIgnore, orientation) {
+ return `await driver.setOrientation("${orientation}");`;
}
- codeFor_gsmCall(varNameIgnore, varIndexIgnore, phoneNumber, action) {
- return `await driver.gsmCall("${phoneNumber}", "${action}");`;
+ codeFor_getGeoLocation() {
+ return `let location = await driver.getGeoLocation();`;
}
- codeFor_gsmSignal(varNameIgnore, varIndexIgnore, signalStrength) {
- return `await driver.gsmSignal("${signalStrength}");`;
+ codeFor_setGeoLocation(varNameIgnore, varIndexIgnore, latitude, longitude, altitude) {
+ return `await driver.setGeoLocation({latitude: ${latitude}, longitude: ${longitude}, altitude: ${altitude}});`;
}
- codeFor_gsmVoice(varNameIgnore, varIndexIgnore, state) {
- return `await driver.gsmVoice("${state}");`;
+ codeFor_rotateDevice(
+ varNameIgnore,
+ varIndexIgnore,
+ x,
+ y,
+ radius,
+ rotation,
+ touchCount,
+ duration,
+ ) {
+ return `await driver.rotateDevice(${x}, ${y}, ${radius}, ${rotation}, ${touchCount}, ${duration});`;
}
- // Session
+ // App Management
- codeFor_getSession() {
- return `let sessionDetails = await driver.getSession();`;
+ codeFor_installApp(varNameIgnore, varIndexIgnore, app) {
+ return `await driver.installApp("${app}");`;
}
- codeFor_setTimeouts(/*varNameIgnore, varIndexIgnore, timeoutsJson*/) {
- return '/* TODO implement setTimeouts */';
+ codeFor_isAppInstalled(varNameIgnore, varIndexIgnore, app) {
+ return `let isAppInstalled = await driver.isAppInstalled("${app}");`;
}
- codeFor_getOrientation() {
- return `let orientation = await driver.getOrientation();`;
+ codeFor_activateApp(varNameIgnore, varIndexIgnore, app) {
+ return `await driver.activateApp("${app}");`;
}
- codeFor_setOrientation(varNameIgnore, varIndexIgnore, orientation) {
- return `await driver.setOrientation("${orientation}");`;
+ codeFor_terminateApp(varNameIgnore, varIndexIgnore, app) {
+ return `await driver.terminateApp("${app}");`;
}
- codeFor_getGeoLocation() {
- return `let location = await driver.getGeoLocation();`;
+ codeFor_removeApp(varNameIgnore, varIndexIgnore, app) {
+ return `await driver.removeApp("${app}")`;
}
- codeFor_setGeoLocation(varNameIgnore, varIndexIgnore, latitude, longitude, altitude) {
- return `await driver.setGeoLocation({latitude: ${latitude}, longitude: ${longitude}, altitude: ${altitude}});`;
+ codeFor_queryAppState(varNameIgnore, varIndexIgnore, app) {
+ return `let appState = await driver.queryAppState("${app}");`;
}
- codeFor_getLogTypes() {
- return `let logTypes = await driver.getLogTypes();`;
- }
+ // File Transfer
- codeFor_getLogs(varNameIgnore, varIndexIgnore, logType) {
- return `let logs = await driver.getLogs("${logType}");`;
+ codeFor_pushFile(varNameIgnore, varIndexIgnore, pathToInstallTo, fileContentString) {
+ return `await driver.pushFile("${pathToInstallTo}", "${fileContentString}");`;
}
- codeFor_updateSettings(varNameIgnore, varIndexIgnore, settingsJson) {
- return `await driver.updateSettings(${JSON.stringify(settingsJson)});`;
+ codeFor_pullFile(varNameIgnore, varIndexIgnore, pathToPullFrom) {
+ return `let fileBase64 = await driver.pullFile("${pathToPullFrom}");`;
}
- codeFor_getSettings() {
- return `let settings = await driver.getSettings();`;
+ codeFor_pullFolder(varNameIgnore, varIndexIgnore, folderToPullFrom) {
+ return `let folderBase64 = await driver.pullFolder("${folderToPullFrom}");`;
}
// Web
@@ -266,7 +252,7 @@ main().catch(console.log);`;
}
codeFor_getUrl() {
- return `let current_url = await driver.getUrl();`;
+ return `let currentUrl = await driver.getUrl();`;
}
codeFor_back() {
@@ -281,21 +267,27 @@ main().catch(console.log);`;
return `await driver.refresh();`;
}
- // Context
+ codeFor_getTitle() {
+ return `let title = await driver.getTitle();`;
+ }
- codeFor_getContext() {
- return `let context = await driver.getContext();`;
+ codeFor_getWindowHandle() {
+ return `let windowHandle = await driver.getWindowHandle();`;
}
- codeFor_getContexts() {
- return `let contexts = await driver.getContexts();`;
+ codeFor_closeWindow() {
+ return `await driver.closeWindow();`;
}
- codeFor_switchContext(varNameIgnore, varIndexIgnore, name) {
- return `await driver.switchContext("${name}");`;
+ codeFor_switchToWindow(varNameIgnore, varIndexIgnore, handle) {
+ return `await driver.switchToWindow("${handle}");`;
}
-}
-JsWdIoFramework.readableName = 'JS - Webdriver.io';
+ codeFor_getWindowHandles() {
+ return `let windowHandles = await driver.getWindowHandles();`;
+ }
-export default JsWdIoFramework;
+ codeFor_createWindow(varNameIgnore, varIndexIgnore, type) {
+ return `let newWindow = await driver.createWindow("${type}");`;
+ }
+}
diff --git a/app/common/renderer/lib/client-frameworks/map.js b/app/common/renderer/lib/client-frameworks/map.js
new file mode 100644
index 0000000000..7d94f73f57
--- /dev/null
+++ b/app/common/renderer/lib/client-frameworks/map.js
@@ -0,0 +1,26 @@
+import {registerLanguage} from 'react-refractor';
+
+import {CLIENT_FRAMEWORKS} from '../../constants/session-inspector.js';
+import DotNetNUnitFramework from './dotnet-nunit.js';
+import JavaJUnit4Framework from './java-junit4.js';
+import JavaJUnit5Framework from './java-junit5.js';
+import JsOxygenFramework from './js-oxygen.js';
+import JsWdIoFramework from './js-wdio.js';
+import PythonFramework from './python.js';
+import RobotFramework from './robot.js';
+import RubyFramework from './ruby.js';
+
+export const CLIENT_FRAMEWORK_MAP = {
+ [CLIENT_FRAMEWORKS.DOTNET_NUNIT]: DotNetNUnitFramework,
+ [CLIENT_FRAMEWORKS.JS_WDIO]: JsWdIoFramework,
+ [CLIENT_FRAMEWORKS.JS_OXYGEN]: JsOxygenFramework,
+ [CLIENT_FRAMEWORKS.JAVA_JUNIT4]: JavaJUnit4Framework,
+ [CLIENT_FRAMEWORKS.JAVA_JUNIT5]: JavaJUnit5Framework,
+ [CLIENT_FRAMEWORKS.PYTHON]: PythonFramework,
+ [CLIENT_FRAMEWORKS.ROBOT]: RobotFramework,
+ [CLIENT_FRAMEWORKS.RUBY]: RubyFramework,
+};
+
+for (const framework of Object.values(CLIENT_FRAMEWORK_MAP)) {
+ registerLanguage(framework.refractorLib);
+}
diff --git a/app/renderer/lib/client-frameworks/python.js b/app/common/renderer/lib/client-frameworks/python.js
similarity index 76%
rename from app/renderer/lib/client-frameworks/python.js
rename to app/common/renderer/lib/client-frameworks/python.js
index ca76778140..6d1225d1bf 100644
--- a/app/renderer/lib/client-frameworks/python.js
+++ b/app/common/renderer/lib/client-frameworks/python.js
@@ -1,11 +1,12 @@
import _ from 'lodash';
+import refractorPython from 'refractor/python';
-import Framework from './framework';
+import CommonClientFramework from './common.js';
-class PythonFramework extends Framework {
- get language() {
- return 'python';
- }
+export default class PythonFramework extends CommonClientFramework {
+ static readableName = 'Python';
+ static refractorLang = 'python';
+ static refractorLib = refractorPython;
getPythonVal(jsonVal) {
if (typeof jsonVal === 'boolean') {
@@ -84,15 +85,15 @@ driver.quit()`;
}
}
- codeFor_click(varName, varIndex) {
+ codeFor_elementClick(varName, varIndex) {
return `${this.getVarName(varName, varIndex)}.click()`;
}
- codeFor_clear(varName, varIndex) {
+ codeFor_elementClear(varName, varIndex) {
return `${this.getVarName(varName, varIndex)}.clear()`;
}
- codeFor_sendKeys(varName, varIndex, text) {
+ codeFor_elementSendKeys(varName, varIndex, text) {
return `${this.getVarName(varName, varIndex)}.send_keys(${JSON.stringify(text)})`;
}
@@ -120,7 +121,7 @@ actions.perform()
`;
}
- // Execute Script
+ // Top-Level Commands
codeFor_executeScriptNoArgs(scriptCmd) {
return `driver.execute_script('${scriptCmd}')`;
@@ -130,160 +131,138 @@ actions.perform()
return `driver.execute_script('${scriptCmd}', ${this.getPythonVal(jsonArg[0])})`;
}
- // App Management
-
- codeFor_getCurrentActivity() {
- return `activity_name = ${this.codeFor_executeScriptNoArgs('mobile: getCurrentActivity')}`;
+ codeFor_updateSettings(varNameIgnore, varIndexIgnore, settingsJson) {
+ return `driver.update_settings(${this.getPythonVal(settingsJson)})`;
}
- codeFor_getCurrentPackage() {
- return `package_name = ${this.codeFor_executeScriptNoArgs('mobile: getCurrentPackage')}`;
+ codeFor_getSettings() {
+ return `settings = driver.get_settings()`;
}
- codeFor_installApp(varNameIgnore, varIndexIgnore, app) {
- return `driver.install_app('${app}')`;
+ // Session
+
+ codeFor_status() {
+ return `status = driver.get_status()`;
}
- codeFor_isAppInstalled(varNameIgnore, varIndexIgnore, app) {
- return `is_app_installed = driver.is_app_installed('${app}')`;
+ codeFor_getSession() {
+ return `desired_caps = driver.desired_capabilities()`;
}
- codeFor_activateApp(varNameIgnore, varIndexIgnore, app) {
- return `driver.activate_app('${app}')`;
+ codeFor_getAppiumCommands() {
+ return `# Not supported: getAppiumCommands`;
}
- codeFor_terminateApp(varNameIgnore, varIndexIgnore, app) {
- return `driver.terminate_app('${app}')`;
+ codeFor_getAppiumExtensions() {
+ return `# Not supported: getAppiumExtensions`;
}
- codeFor_removeApp(varNameIgnore, varIndexIgnore, app) {
- return `driver.remove_app('${app}')`;
+ codeFor_getAppiumSessionCapabilities() {
+ return `# Not supported: getAppiumSessionCapabilities`;
}
- codeFor_getStrings(varNameIgnore, varIndexIgnore, language, stringFile) {
- return `app_strings = driver.app_strings(${language ? `'${language}'` : 'None'}, ${
- stringFile ? `'${stringFile}'` : 'None'
- })`;
+ codeFor_getTimeouts() {
+ return 'timeouts = driver.timeouts()';
}
- // Clipboard
+ codeFor_setTimeouts(/*varNameIgnore, varIndexIgnore, timeoutsJson*/) {
+ return '# TODO implement setTimeouts';
+ }
- codeFor_getClipboard() {
- return `clipboard_text = driver.get_clipboard_text()`;
+ codeFor_getLogTypes() {
+ return `log_types = driver.log_types()`;
}
- codeFor_setClipboard(varNameIgnore, varIndexIgnore, clipboardText) {
- return `driver.set_clipboard_text('${clipboardText}')`;
+ codeFor_getLogs(varNameIgnore, varIndexIgnore, logType) {
+ return `logs = driver.get_log('${logType}')`;
}
- // File Transfer
+ // Context
- codeFor_pushFile(varNameIgnore, varIndexIgnore, pathToInstallTo, fileContentString) {
- return `driver.push_file('${pathToInstallTo}', '${fileContentString}')`;
+ codeFor_getAppiumContext() {
+ return `context = driver.current_context`;
}
- codeFor_pullFile(varNameIgnore, varIndexIgnore, pathToPullFrom) {
- return `file_base64 = driver.pull_file('${pathToPullFrom}')`;
+ codeFor_getAppiumContexts() {
+ return `contexts = driver.contexts`;
}
- codeFor_pullFolder(varNameIgnore, varIndexIgnore, folderToPullFrom) {
- return `folder_base64 = driver.pull_folder('${folderToPullFrom}')`;
+ codeFor_switchAppiumContext(varNameIgnore, varIndexIgnore, name) {
+ return `driver.switch_to.context('${name}')`;
}
// Device Interaction
- codeFor_isLocked() {
- return `is_locked = ${this.codeFor_executeScriptNoArgs('mobile: isLocked')}`;
+ codeFor_getWindowRect() {
+ return `window_rect = driver.get_window_rect()`;
}
- codeFor_rotateDevice() {
- return `# Not supported: rotate device`;
+ codeFor_takeScreenshot() {
+ return `screenshot = driver.get_screenshot_as_base64()`;
}
- codeFor_touchId(varNameIgnore, varIndexIgnore, match) {
- return `driver.touch_id(${match})`;
- }
-
- codeFor_toggleEnrollTouchId() {
- return `driver.toggle_touch_id_enrollment()`;
- }
-
- // Keyboard
-
codeFor_isKeyboardShown() {
return `is_keyboard_shown = driver.is_keyboard_shown()`;
}
- // Connectivity
-
- codeFor_toggleAirplaneMode() {
- return `# Not supported: toggleAirplaneMode`;
- }
-
- codeFor_toggleData() {
- return `# Not supported: toggleData`;
- }
-
- codeFor_toggleWiFi() {
- return `driver.toggle_wifi()`;
+ codeFor_getOrientation() {
+ return `orientation = driver.orientation`;
}
- codeFor_sendSMS(varNameIgnore, varIndexIgnore, phoneNumber, text) {
- return `driver.send_sms('${phoneNumber}', '${text}')`;
+ codeFor_setOrientation(varNameIgnore, varIndexIgnore, orientation) {
+ return `driver.orientation = '${orientation}'`;
}
- codeFor_gsmCall(varNameIgnore, varIndexIgnore, phoneNumber, action) {
- return `driver.make_gsm_call('${phoneNumber}', '${action}')`;
+ codeFor_getGeoLocation() {
+ return `location = driver.location()`;
}
- codeFor_gsmSignal(varNameIgnore, varIndexIgnore, signalStrength) {
- return `driver.set_gsm_signal(${signalStrength})`;
+ codeFor_setGeoLocation(varNameIgnore, varIndexIgnore, latitude, longitude, altitude) {
+ return `driver.set_location(${latitude}, ${longitude}, ${altitude})`;
}
- codeFor_gsmVoice(varNameIgnore, varIndexIgnore, state) {
- return `driver.set_gsm_voice('${state}')`;
+ codeFor_rotateDevice() {
+ return `# Not supported: rotate device`;
}
- // Session
+ // App Management
- codeFor_getSession() {
- return `desired_caps = driver.desired_capabilities()`;
+ codeFor_installApp(varNameIgnore, varIndexIgnore, app) {
+ return `driver.install_app('${app}')`;
}
- codeFor_setTimeouts(/*varNameIgnore, varIndexIgnore, timeoutsJson*/) {
- return '# TODO implement setTimeouts';
+ codeFor_isAppInstalled(varNameIgnore, varIndexIgnore, app) {
+ return `is_app_installed = driver.is_app_installed('${app}')`;
}
- codeFor_getOrientation() {
- return `orientation = driver.orientation`;
+ codeFor_activateApp(varNameIgnore, varIndexIgnore, app) {
+ return `driver.activate_app('${app}')`;
}
- codeFor_setOrientation(varNameIgnore, varIndexIgnore, orientation) {
- return `driver.orientation = '${orientation}'`;
+ codeFor_terminateApp(varNameIgnore, varIndexIgnore, app) {
+ return `driver.terminate_app('${app}')`;
}
- codeFor_getGeoLocation() {
- return `location = driver.location()`;
+ codeFor_removeApp(varNameIgnore, varIndexIgnore, app) {
+ return `driver.remove_app('${app}')`;
}
- codeFor_setGeoLocation(varNameIgnore, varIndexIgnore, latitude, longitude, altitude) {
- return `driver.set_location(${latitude}, ${longitude}, ${altitude})`;
+ codeFor_queryAppState(varNameIgnore, varIndexIgnore, app) {
+ return `app_state = driver.query_app_state('${app}')`;
}
- codeFor_getLogTypes() {
- return `log_types = driver.log_types()`;
- }
+ // File Transfer
- codeFor_getLogs(varNameIgnore, varIndexIgnore, logType) {
- return `logs = driver.get_log('${logType}')`;
+ codeFor_pushFile(varNameIgnore, varIndexIgnore, pathToInstallTo, fileContentString) {
+ return `driver.push_file('${pathToInstallTo}', '${fileContentString}')`;
}
- codeFor_updateSettings(varNameIgnore, varIndexIgnore, settingsJson) {
- return `driver.update_settings(${this.getPythonVal(settingsJson)}))`;
+ codeFor_pullFile(varNameIgnore, varIndexIgnore, pathToPullFrom) {
+ return `file_base64 = driver.pull_file('${pathToPullFrom}')`;
}
- codeFor_getSettings() {
- return `settings = driver.get_settings()`;
+ codeFor_pullFolder(varNameIgnore, varIndexIgnore, folderToPullFrom) {
+ return `folder_base64 = driver.pull_folder('${folderToPullFrom}')`;
}
// Web
@@ -308,21 +287,27 @@ actions.perform()
return `driver.refresh()`;
}
- // Context
+ codeFor_getTitle() {
+ return `title = driver.title`;
+ }
- codeFor_getContext() {
- return `context = driver.current_context`;
+ codeFor_getWindowHandle() {
+ return `window_handle = driver.current_window_handle`;
}
- codeFor_getContexts() {
- return `contexts = driver.contexts`;
+ codeFor_closeWindow() {
+ return `driver.close()`;
}
- codeFor_switchContext(varNameIgnore, varIndexIgnore, name) {
- return `driver.switch_to.context('${name}')`;
+ codeFor_switchToWindow(varNameIgnore, varIndexIgnore, handle) {
+ return `driver.switch_to.window('${handle}')`;
}
-}
-PythonFramework.readableName = 'Python';
+ codeFor_getWindowHandles() {
+ return `window_handles = driver.window_handles`;
+ }
-export default PythonFramework;
+ codeFor_createWindow() {
+ return '# Not supported: createWindow';
+ }
+}
diff --git a/app/renderer/lib/client-frameworks/robot.js b/app/common/renderer/lib/client-frameworks/robot.js
similarity index 72%
rename from app/renderer/lib/client-frameworks/robot.js
rename to app/common/renderer/lib/client-frameworks/robot.js
index 18cc3c9d42..bee10ed713 100644
--- a/app/renderer/lib/client-frameworks/robot.js
+++ b/app/common/renderer/lib/client-frameworks/robot.js
@@ -1,12 +1,12 @@
import _ from 'lodash';
+import refractorRobot from 'refractor/robotframework';
-import Framework from './framework';
+import CommonClientFramework from './common.js';
-class RobotFramework extends Framework {
- get language() {
- // Robot highlighting requires highlightjs-robot package
- return 'python';
- }
+export default class RobotFramework extends CommonClientFramework {
+ static readableName = 'Robot Framework';
+ static refractorLang = 'robot';
+ static refractorLib = refractorRobot;
getRobotVal(jsonVal) {
if (typeof jsonVal === 'boolean') {
@@ -63,15 +63,15 @@ ${this.indent(code, 4)}
return `$\{${localVar}} = Set Variable ${suffixMap[strategy]}=${locator}`;
}
- codeFor_click(varName, varIndex) {
+ codeFor_elementClick(varName, varIndex) {
return `Click Element $\{${this.getVarName(varName, varIndex)}}`;
}
- codeFor_clear(varName, varIndex) {
+ codeFor_elementClear(varName, varIndex) {
return `Clear Text $\{${this.getVarName(varName, varIndex)}}`;
}
- codeFor_sendKeys(varName, varIndex, text) {
+ codeFor_elementSendKeys(varName, varIndex, text) {
return `Input Text $\{${this.getVarName(varName, varIndex)}} ${text}`;
}
@@ -87,7 +87,7 @@ Tap With Positions $\{100} $\{positions}`;
return `Swipe $\{${x1}} $\{${y1}} $\{${x2}} $\{${y2}}`;
}
- // Execute Script
+ // Top-Level Commands
codeFor_executeScriptNoArgs(scriptCmd) {
return `Execute Script ${scriptCmd}`;
@@ -97,179 +97,149 @@ Tap With Positions $\{100} $\{positions}`;
// change the JSON object into a format accepted by Create Dictionary: a sequence of key=value
const cleanedJson = _.omitBy(jsonArg[0], _.isUndefined);
const argsValuesStrings = _.map(cleanedJson, (v, k) => `${k}=${this.getRobotVal(v)}`);
- return `&{scriptArgument} Create Dictionary ${argsValuesStrings.join(' ')}
+ return `&{scriptArgument} = Create Dictionary ${argsValuesStrings.join(' ')}
${varAssignment}Execute Script ${scriptCmd} $\{scriptArgument}`;
}
- // App Management
-
- codeFor_getCurrentActivity() {
- return `$\{activity_name} = ${this.codeFor_executeScriptNoArgs(
- 'mobile: getCurrentActivity',
- )}`;
+ codeFor_updateSettings() {
+ return '# Not supported: updateSettings';
}
- codeFor_getCurrentPackage() {
- return `$\{package_name} = ${this.codeFor_executeScriptNoArgs('mobile: getCurrentPackage')}`;
+ codeFor_getSettings() {
+ return '# Not supported: getSettings';
}
- codeFor_installApp(varNameIgnore, varIndexIgnore, app) {
- return `Install App ${app}`;
+ // Session
+
+ codeFor_status() {
+ return '# Not supported: status';
}
- codeFor_isAppInstalled() {
- return '# Not supported: isAppInstalled';
+ codeFor_getSession() {
+ return '# Not supported: getSession';
}
- codeFor_activateApp(varNameIgnore, varIndexIgnore, app) {
- return `Activate Application ${app}`;
+ codeFor_getAppiumCommands() {
+ return `# Not supported: getAppiumCommands`;
}
- codeFor_terminateApp(varNameIgnore, varIndexIgnore, app) {
- return `Terminate Application ${app}`;
+ codeFor_getAppiumExtensions() {
+ return `# Not supported: getAppiumExtensions`;
}
- codeFor_removeApp(varNameIgnore, varIndexIgnore, app) {
- return `Remove Application ${app}`;
+ codeFor_getAppiumSessionCapabilities() {
+ return `# Not supported: getAppiumSessionCapabilities`;
}
- codeFor_getStrings(varNameIgnore, varIndexIgnore, language) {
- if (language === undefined) {
- return `$\{app_strings} = ${this.codeFor_executeScriptNoArgs('mobile: getAppStrings')}`;
- } else {
- return this.codeFor_executeScriptWithArgs(
- 'mobile: getAppStrings',
- [{language}],
- `$\{app_strings} = `,
- );
- }
+ codeFor_getTimeouts() {
+ return '# Not supported: getTimeouts';
}
- // Clipboard
+ codeFor_setTimeouts() {
+ // There is 'Set Appium Timeout' which may be different
+ return '# Not supported: setTimeouts';
+ }
- codeFor_getClipboard() {
- return '# Not supported: getClipboard';
+ codeFor_getLogTypes() {
+ return '# Not supported: getLogTypes';
}
- codeFor_setClipboard() {
- return '# Not supported: setClipboard';
+ codeFor_getLogs() {
+ return '# Not supported: getLogs';
}
- // File Transfer
+ // Context
- codeFor_pushFile(varNameIgnore, varIndexIgnore, pathToInstallTo, fileContentString) {
- return `Push File ${pathToInstallTo} ${fileContentString}`;
+ codeFor_getAppiumContext() {
+ return '${context} = Get Current Context';
}
- codeFor_pullFile(varNameIgnore, varIndexIgnore, pathToPullFrom) {
- return `$\{file_base64} = Pull File ${pathToPullFrom}`;
+ codeFor_getAppiumContexts() {
+ return '${contexts} = Get Contexts';
}
- codeFor_pullFolder(varNameIgnore, varIndexIgnore, folderToPullFrom) {
- return `$\{folder_base64} = Pull Folder ${folderToPullFrom}`;
+ codeFor_switchAppiumContext(varNameIgnore, varIndexIgnore, name) {
+ return `Switch To Context ${name}`;
}
// Device Interaction
- codeFor_isLocked() {
- return `$\{is_locked} = ${this.codeFor_executeScriptNoArgs('mobile: isLocked')}`;
- }
-
- codeFor_rotateDevice() {
- return '# Not supported: rotateDevice';
- }
-
- codeFor_touchId(varNameIgnore, varIndexIgnore, match) {
- return `Touch Id $\{${match}}`;
+ codeFor_getWindowRect() {
+ return `# Not supported: getWindowRect`;
}
- codeFor_toggleEnrollTouchId() {
- return 'Toggle Touch Id Enrollment';
+ codeFor_takeScreenshot() {
+ return `Capture Page Screenshot`;
}
- // Keyboard
-
codeFor_isKeyboardShown() {
return `$\{is_keyboard_shown} = ${this.codeFor_executeScriptNoArgs(
'mobile: isKeyboardShown',
)}`;
}
- // Connectivity
-
- codeFor_toggleAirplaneMode() {
- return '# Not supported: toggleAirplaneMode';
- }
-
- codeFor_toggleData() {
- return '# Not supported: toggleData';
- }
-
- codeFor_toggleWiFi() {
- return '# Not supported: toggleWifi';
+ codeFor_getOrientation() {
+ return '# Not supported: getOrientation';
}
- codeFor_sendSMS() {
- return '# Not supported: sendSMS';
+ codeFor_setOrientation(varNameIgnore, varIndexIgnore, orientation) {
+ if (orientation === 'LANDSCAPE') {
+ return 'Landscape';
+ } else if (orientation === 'PORTRAIT') {
+ return 'Portrait';
+ }
}
- codeFor_gsmCall() {
- return '# Not supported: gsmCall';
+ codeFor_getGeoLocation() {
+ return '# Not supported: getGeoLocation';
}
- codeFor_gsmSignal() {
- return '# Not supported: gsmSignal';
+ codeFor_setGeoLocation(varNameIgnore, varIndexIgnore, latitude, longitude, altitude) {
+ return `Set Location $\{${latitude}} $\{${longitude}} $\{${altitude}}`;
}
- codeFor_gsmVoice() {
- return '# Not supported: gsmVoice';
+ codeFor_rotateDevice() {
+ return '# Not supported: rotateDevice';
}
- // Session
+ // App Management
- codeFor_getSession() {
- return '# Not supported: getSession';
+ codeFor_installApp(varNameIgnore, varIndexIgnore, app) {
+ return `Install App ${app}`;
}
- codeFor_setTimeouts() {
- // There is 'Set Appium Timeout' which may be different
- return '# Not supported: setTimeouts';
+ codeFor_isAppInstalled() {
+ return '# Not supported: isAppInstalled';
}
- codeFor_getOrientation() {
- return '# Not supported: getOrientation';
+ codeFor_activateApp(varNameIgnore, varIndexIgnore, app) {
+ return `Activate Application ${app}`;
}
- codeFor_setOrientation(varNameIgnore, varIndexIgnore, orientation) {
- if (orientation === 'LANDSCAPE') {
- return 'Landscape';
- } else if (orientation === 'PORTRAIT') {
- return 'Portrait';
- }
+ codeFor_terminateApp(varNameIgnore, varIndexIgnore, app) {
+ return `Terminate Application ${app}`;
}
- codeFor_getGeoLocation() {
- return '# Not supported: getGeoLocation';
+ codeFor_removeApp(varNameIgnore, varIndexIgnore, app) {
+ return `Remove Application ${app}`;
}
- codeFor_setGeoLocation(varNameIgnore, varIndexIgnore, latitude, longitude, altitude) {
- return `Set Location $\{${latitude}} $\{${longitude}} $\{${altitude}}`;
+ codeFor_queryAppState() {
+ return `# Not supported: queryAppState`;
}
- codeFor_getLogTypes() {
- return '# Not supported: getLogTypes';
- }
+ // File Transfer
- codeFor_getLogs() {
- return '# Not supported: getLogs';
+ codeFor_pushFile(varNameIgnore, varIndexIgnore, pathToInstallTo, fileContentString) {
+ return `Push File ${pathToInstallTo} ${fileContentString}`;
}
- codeFor_updateSettings() {
- return '# Not supported: updateSettings';
+ codeFor_pullFile(varNameIgnore, varIndexIgnore, pathToPullFrom) {
+ return `$\{file_base64} = Pull File ${pathToPullFrom}`;
}
- codeFor_getSettings() {
- return '# Not supported: getSettings';
+ codeFor_pullFolder(varNameIgnore, varIndexIgnore, folderToPullFrom) {
+ return `$\{folder_base64} = Pull Folder ${folderToPullFrom}`;
}
// Web
@@ -294,21 +264,27 @@ ${varAssignment}Execute Script ${scriptCmd} $\{scriptArgument}`;
return '# Not supported: refresh';
}
- // Context
+ codeFor_getTitle() {
+ return '${title} = Get Window Title';
+ }
- codeFor_getContext() {
- return '${context} = Get Current Context';
+ codeFor_getWindowHandle() {
+ return '# Not supported: getWindowHandle';
}
- codeFor_getContexts() {
- return '${contexts} = Get Contexts';
+ codeFor_closeWindow() {
+ return `# Not supported: closeWindow`;
}
- codeFor_switchContext(varNameIgnore, varIndexIgnore, name) {
- return `Switch To Context ${name}`;
+ codeFor_switchToWindow(varNameIgnore, varIndexIgnore, handle) {
+ return `Switch To Window ${handle}`;
}
-}
-RobotFramework.readableName = 'Robot Framework';
+ codeFor_getWindowHandles() {
+ return '${window_handles} = Get Windows';
+ }
-export default RobotFramework;
+ codeFor_createWindow() {
+ return '# Not supported: createWindow';
+ }
+}
diff --git a/app/renderer/lib/client-frameworks/ruby.js b/app/common/renderer/lib/client-frameworks/ruby.js
similarity index 69%
rename from app/renderer/lib/client-frameworks/ruby.js
rename to app/common/renderer/lib/client-frameworks/ruby.js
index d9857912f9..ee73c5a848 100644
--- a/app/renderer/lib/client-frameworks/ruby.js
+++ b/app/common/renderer/lib/client-frameworks/ruby.js
@@ -1,11 +1,12 @@
import _ from 'lodash';
+import refractorRuby from 'refractor/ruby';
-import Framework from './framework';
+import CommonClientFramework from './common.js';
-class RubyFramework extends Framework {
- get language() {
- return 'ruby';
- }
+export default class RubyFramework extends CommonClientFramework {
+ static readableName = 'Ruby';
+ static refractorLang = 'ruby';
+ static refractorLib = refractorRuby;
// Use this instead of JSON.stringify, as it puts quotes around dictionary keys
getRubyVal(jsonVal) {
@@ -70,15 +71,15 @@ driver.quit`;
}
}
- codeFor_click(varName, varIndex) {
+ codeFor_elementClick(varName, varIndex) {
return `${this.getVarName(varName, varIndex)}.click`;
}
- codeFor_clear(varName, varIndex) {
+ codeFor_elementClear(varName, varIndex) {
return `${this.getVarName(varName, varIndex)}.clear`;
}
- codeFor_sendKeys(varName, varIndex, text) {
+ codeFor_elementSendKeys(varName, varIndex, text) {
return `${this.getVarName(varName, varIndex)}.send_keys ${JSON.stringify(text)}`;
}
@@ -105,7 +106,7 @@ driver.quit`;
`;
}
- // Execute Script
+ // Top-Level Commands
codeFor_executeScriptNoArgs(scriptCmd) {
return `driver.execute_script '${scriptCmd}'`;
@@ -115,164 +116,138 @@ driver.quit`;
return `driver.execute_script '${scriptCmd}', ${this.getRubyVal(jsonArg[0])}`;
}
- // App Management
-
- codeFor_getCurrentActivity() {
- return `activity_name = ${this.codeFor_executeScriptNoArgs('mobile: getCurrentActivity')}`;
- }
-
- codeFor_getCurrentPackage() {
- return `package_name = ${this.codeFor_executeScriptNoArgs('mobile: getCurrentPackage')}`;
+ codeFor_updateSettings(varNameIgnore, varIndexIgnore, settingsJson) {
+ return `driver.update_settings ${this.getRubyVal(settingsJson)}`;
}
- codeFor_installApp(varNameIgnore, varIndexIgnore, app) {
- return `driver.install_app '${app}'`;
+ codeFor_getSettings() {
+ return `settings = driver.settings.get`;
}
- codeFor_isAppInstalled(varNameIgnore, varIndexIgnore, app) {
- return `is_app_installed = driver.app_installed? '${app}'`;
- }
+ // Session
- codeFor_activateApp(varNameIgnore, varIndexIgnore, app) {
- return `driver.activate_app '${app}'`;
+ codeFor_status() {
+ return `status = driver.status`;
}
- codeFor_terminateApp(varNameIgnore, varIndexIgnore, app) {
- return `driver.terminate_app '${app}'`;
+ codeFor_getSession() {
+ return `session_capabilities = driver.session_capabilities`;
}
- codeFor_removeApp(varNameIgnore, varIndexIgnore, app) {
- return `driver.remove_app '${app}'`;
+ codeFor_getAppiumCommands() {
+ return `# Not supported: getAppiumCommands`;
}
- codeFor_getStrings(varNameIgnore, varIndexIgnore, language) {
- if (language === undefined) {
- return `app_strings = ${this.codeFor_executeScriptNoArgs('mobile: getAppStrings')}`;
- } else {
- return `app_strings = ${this.codeFor_executeScriptWithArgs('mobile: getAppStrings', [
- {language},
- ])}`;
- }
+ codeFor_getAppiumExtensions() {
+ return `# Not supported: getAppiumExtensions`;
}
- // Clipboard
-
- codeFor_getClipboard() {
- return `clipboard_text = driver.get_clipboard`;
+ codeFor_getAppiumSessionCapabilities() {
+ return `# Not supported: getAppiumSessionCapabilities`;
}
- codeFor_setClipboard(varNameIgnore, varIndexIgnore, clipboardText) {
- return `driver.set_clipboard content: '${clipboardText}'`;
+ codeFor_getTimeouts() {
+ return `timeouts = driver.get_timeouts`;
}
- // File Transfer
-
- codeFor_pushFile(varNameIgnore, varIndexIgnore, pathToInstallTo, fileContentString) {
- return `driver.push_file '${pathToInstallTo}', '${fileContentString}'`;
+ codeFor_setTimeouts(/*varNameIgnore, varIndexIgnore, timeoutsJson*/) {
+ return '# TODO implement setTimeouts';
}
- codeFor_pullFile(varNameIgnore, varIndexIgnore, pathToPullFrom) {
- return `driver.pull_file '${pathToPullFrom}'`;
+ codeFor_getLogTypes() {
+ return `log_types = driver.logs.available_types`;
}
- codeFor_pullFolder(varNameIgnore, varIndexIgnore, folderToPullFrom) {
- return `driver.pull_folder '${folderToPullFrom}'`;
+ codeFor_getLogs(varNameIgnore, varIndexIgnore, logType) {
+ return `logs = driver.logs.get :${_.lowerCase(logType)}`;
}
- // Device Interaction
-
- codeFor_isLocked() {
- return `is_locked = ${this.codeFor_executeScriptNoArgs('mobile: isLocked')}`;
- }
+ // Context
- codeFor_rotateDevice() {
- return `# Not supported: rotateDevice`;
+ codeFor_getAppiumContext() {
+ return `context = driver.current_context`;
}
- codeFor_touchId(varNameIgnore, varIndexIgnore, match) {
- return `driver.touch_id ${match}`;
+ codeFor_getAppiumContexts() {
+ return `contexts = driver.available_contexts`;
}
- codeFor_toggleEnrollTouchId(varNameIgnore, varIndexIgnore, enroll) {
- return `driver.toggle_touch_id_enrollment ${enroll}`;
+ codeFor_switchAppiumContext(varNameIgnore, varIndexIgnore, name) {
+ return `driver.context = '${name}'`;
}
- // Keyboard
+ // Device Interaction
- codeFor_isKeyboardShown() {
- return `is_keyboard_shown = ${this.codeFor_executeScriptNoArgs('mobile: isKeyboardShown')}`;
+ codeFor_getWindowRect() {
+ return `window_rect = driver.window_rect`;
}
- // Connectivity
-
- codeFor_toggleAirplaneMode() {
- return `driver.toggle_airplane_mode`;
+ codeFor_takeScreenshot() {
+ return `screenshot = driver.screenshot_as :base64`;
}
- codeFor_toggleData() {
- return `driver.toggle_data`;
+ codeFor_isKeyboardShown() {
+ return `is_keyboard_shown = driver.keyboard_shown?`;
}
- codeFor_toggleWiFi() {
- return `driver.toggle_wifi`;
+ codeFor_getOrientation() {
+ return `orientation = driver.orientation`;
}
- codeFor_sendSMS(varNameIgnore, varIndexIgnore, phoneNumber, text) {
- return `driver.send_sms phone_number: '${phoneNumber}', message: '${text}'`;
+ codeFor_setOrientation(varNameIgnore, varIndexIgnore, orientation) {
+ return `driver.rotation = :${_.lowerCase(orientation)}`;
}
- codeFor_gsmCall(varNameIgnore, varIndexIgnore, phoneNumber, action) {
- return `driver.gsm_call phone_number: '${phoneNumber}', action: :${action}`;
+ codeFor_getGeoLocation() {
+ return `location = driver.location`;
}
- codeFor_gsmSignal(varNameIgnore, varIndexIgnore, signalStrength) {
- return `driver.gsm_signal :${signalStrength}`;
+ codeFor_setGeoLocation(varNameIgnore, varIndexIgnore, latitude, longitude, altitude) {
+ return `driver.set_location ${latitude}, ${longitude}, ${altitude}`;
}
- codeFor_gsmVoice(varNameIgnore, varIndexIgnore, state) {
- return `driver.gsm_voice :${state}`;
+ codeFor_rotateDevice() {
+ return `# Not supported: rotateDevice`;
}
- // Session
+ // App Management
- codeFor_getSession() {
- return `session_capabilities = driver.session_capabilities`;
+ codeFor_installApp(varNameIgnore, varIndexIgnore, app) {
+ return `driver.install_app '${app}'`;
}
- codeFor_setTimeouts(/*varNameIgnore, varIndexIgnore, timeoutsJson*/) {
- return '# TODO implement setTimeouts';
+ codeFor_isAppInstalled(varNameIgnore, varIndexIgnore, app) {
+ return `is_app_installed = driver.app_installed? '${app}'`;
}
- codeFor_getOrientation() {
- return `orientation = driver.orientation`;
+ codeFor_activateApp(varNameIgnore, varIndexIgnore, app) {
+ return `driver.activate_app '${app}'`;
}
- codeFor_setOrientation(varNameIgnore, varIndexIgnore, orientation) {
- return `driver.rotation = :${_.lowerCase(orientation)}`;
+ codeFor_terminateApp(varNameIgnore, varIndexIgnore, app) {
+ return `driver.terminate_app '${app}'`;
}
- codeFor_getGeoLocation() {
- return `location = driver.location`;
+ codeFor_removeApp(varNameIgnore, varIndexIgnore, app) {
+ return `driver.remove_app '${app}'`;
}
- codeFor_setGeoLocation(varNameIgnore, varIndexIgnore, latitude, longitude, altitude) {
- return `driver.set_location ${latitude}, ${longitude}, ${altitude}`;
+ codeFor_queryAppState(varNameIgnore, varIndexIgnore, app) {
+ return `app_state = driver.query_app_state '${app}'`;
}
- codeFor_getLogTypes() {
- return `log_types = driver.logs.available_types`;
- }
+ // File Transfer
- codeFor_getLogs(varNameIgnore, varIndexIgnore, logType) {
- return `logs = driver.logs.get :${_.lowerCase(logType)}`;
+ codeFor_pushFile(varNameIgnore, varIndexIgnore, pathToInstallTo, fileContentString) {
+ return `driver.push_file '${pathToInstallTo}', '${fileContentString}'`;
}
- codeFor_updateSettings(varNameIgnore, varIndexIgnore, settingsJson) {
- return `driver.update_settings ${this.getRubyVal(settingsJson)}`;
+ codeFor_pullFile(varNameIgnore, varIndexIgnore, pathToPullFrom) {
+ return `driver.pull_file '${pathToPullFrom}'`;
}
- codeFor_getSettings() {
- return `settings = driver.settings.get`;
+ codeFor_pullFolder(varNameIgnore, varIndexIgnore, folderToPullFrom) {
+ return `driver.pull_folder '${folderToPullFrom}'`;
}
// Web
@@ -282,7 +257,7 @@ driver.quit`;
}
codeFor_getUrl() {
- return `current_url = driver.get_current_url`;
+ return `current_url = driver.current_url`;
}
codeFor_back() {
@@ -297,21 +272,27 @@ driver.quit`;
return `driver.navigate.refresh`;
}
- // Context
+ codeFor_getTitle() {
+ return `title = driver.title`;
+ }
- codeFor_getContext() {
- return `context = driver.current_context`;
+ codeFor_getWindowHandle() {
+ return `window_handle = driver.window_handle`;
}
- codeFor_getContexts() {
- return `contexts = driver.available_contexts`;
+ codeFor_closeWindow() {
+ return `driver.close`;
}
- codeFor_switchContext(varNameIgnore, varIndexIgnore, name) {
- return `driver.context = '${name}'`;
+ codeFor_switchToWindow(varNameIgnore, varIndexIgnore, handle) {
+ return `driver.switch_to.window '${handle}'`;
}
-}
-RubyFramework.readableName = 'Ruby';
+ codeFor_getWindowHandles() {
+ return `window_handles = driver.window_handles`;
+ }
-export default RubyFramework;
+ codeFor_createWindow() {
+ return `# Not supported: createWindow`;
+ }
+}
diff --git a/app/common/renderer/lib/vendor/base.ts b/app/common/renderer/lib/vendor/base.ts
new file mode 100644
index 0000000000..df152066b6
--- /dev/null
+++ b/app/common/renderer/lib/vendor/base.ts
@@ -0,0 +1,112 @@
+import _ from 'lodash';
+
+import i18n from '../../i18next.js';
+
+export interface VendorProperties {
+ host?: string;
+ port?: number | string;
+ username?: string;
+ accessKey?: string;
+ https?: boolean;
+ path?: string;
+ headers?: Record;
+}
+
+export interface InputProperty {
+ name: string;
+ val: string | undefined;
+}
+
+/** Redux `server` object: keys are server type ids, values are flat field bags */
+export type SessionBuilderServer = Record>;
+
+type MutableVendorSlice = Record & {
+ host?: string;
+ path?: string;
+ port?: number | string;
+ ssl?: boolean;
+};
+
+export abstract class BaseVendor {
+ host?: string;
+ port?: number | string;
+ path?: string;
+ https?: boolean;
+ username?: string;
+ accessKey?: string;
+ headers?: Record;
+
+ protected readonly _server: SessionBuilderServer;
+ protected readonly _sessionCaps: Record;
+
+ constructor(server: SessionBuilderServer, sessionCaps: Record) {
+ this._server = server;
+ this._sessionCaps = sessionCaps;
+ }
+
+ async apply(): Promise {
+ await this.configureProperties();
+ return {
+ host: this.host,
+ path: this.path,
+ port: this.port,
+ https: this.https,
+ username: this.username,
+ accessKey: this.accessKey,
+ headers: this.headers,
+ };
+ }
+
+ protected _checkInputPropertyPresence(vendorName: string, propertyList: InputProperty[]): void {
+ const missingProps: string[] = [];
+ for (const {name, val} of propertyList) {
+ if (!val) {
+ missingProps.push(i18n.t(name));
+ }
+ }
+ if (missingProps.length > 0) {
+ throw new Error(
+ i18n.t('missingVendorProperties', {
+ vendorName,
+ vendorProps: missingProps.join(', '),
+ }),
+ );
+ }
+ }
+
+ protected _validateUrl(url: string): URL {
+ try {
+ return new URL(url);
+ } catch {
+ throw new Error(`${i18n.t('Invalid URL:')} ${url}`);
+ }
+ }
+
+ protected _saveProperties(vendor: MutableVendorSlice, props: VendorProperties): void {
+ const {host, path, port, https, username, accessKey, headers} = props;
+ this.host = vendor.host = host;
+ this.path = vendor.path = path;
+ this.port = vendor.port = port;
+ this.https = vendor.ssl = https;
+ this.username = username;
+ this.accessKey = accessKey;
+ this.headers = headers;
+ }
+
+ protected _updateSessionCap(name: string, value: unknown, merge = true): void {
+ const previousValue = this._sessionCaps[name];
+ if (merge && _.isPlainObject(previousValue) && _.isPlainObject(value)) {
+ this._sessionCaps[name] = {
+ ...(previousValue as Record),
+ ...(value as Record),
+ };
+ } else {
+ this._sessionCaps[name] = value;
+ }
+ }
+
+ /**
+ * ! It is OK for this method to mutate sessionCaps
+ */
+ abstract configureProperties(): Promise;
+}
diff --git a/app/common/renderer/lib/vendor/bitbar.ts b/app/common/renderer/lib/vendor/bitbar.ts
new file mode 100644
index 0000000000..8cdf069ea3
--- /dev/null
+++ b/app/common/renderer/lib/vendor/bitbar.ts
@@ -0,0 +1,27 @@
+import {BaseVendor} from './base.js';
+
+export class BitbarVendor extends BaseVendor {
+ override async configureProperties(): Promise {
+ const bitbar = this._server.bitbar;
+ const vendorName = 'BitBar';
+
+ const apiKey =
+ (bitbar.apiKey as string | undefined) || (process.env.BITBAR_API_KEY as string | undefined);
+ this._checkInputPropertyPresence(vendorName, [{name: 'API Key', val: apiKey}]);
+
+ const host = process.env.BITBAR_HOST || 'appium.bitbar.com';
+ const port = 443;
+ const path = '/wd/hub';
+ const https = true;
+ this._saveProperties(bitbar, {host, path, port, https, accessKey: apiKey});
+
+ this._updateSessionCap(
+ 'bitbar:options',
+ {
+ source: 'appiumdesktop',
+ apiKey,
+ },
+ false,
+ );
+ }
+}
diff --git a/app/common/renderer/lib/vendor/browserstack.ts b/app/common/renderer/lib/vendor/browserstack.ts
new file mode 100644
index 0000000000..52cf7c052b
--- /dev/null
+++ b/app/common/renderer/lib/vendor/browserstack.ts
@@ -0,0 +1,29 @@
+import {BaseVendor} from './base.js';
+
+export class BrowserstackVendor extends BaseVendor {
+ override async configureProperties(): Promise {
+ const browserstack = this._server.browserstack;
+ const vendorName = 'BrowserStack';
+
+ const username =
+ (browserstack.username as string | undefined) ||
+ (process.env.BROWSERSTACK_USERNAME as string | undefined);
+ const accessKey =
+ (browserstack.accessKey as string | undefined) ||
+ (process.env.BROWSERSTACK_ACCESS_KEY as string | undefined);
+ this._checkInputPropertyPresence(vendorName, [
+ {name: 'Username', val: username},
+ {name: 'Access Key', val: accessKey},
+ ]);
+
+ const host = process.env.BROWSERSTACK_HOST || 'hub-cloud.browserstack.com';
+ const port = process.env.BROWSERSTACK_PORT || 443;
+ const path = '/wd/hub';
+ const https = parseInt(String(port), 10) === 443;
+ this._saveProperties(browserstack, {host, path, port, https, username, accessKey});
+
+ this._updateSessionCap('bstack:options', {
+ source: 'appiumdesktop',
+ });
+ }
+}
diff --git a/app/common/renderer/lib/vendor/experitest.ts b/app/common/renderer/lib/vendor/experitest.ts
new file mode 100644
index 0000000000..b1bdc9b1fc
--- /dev/null
+++ b/app/common/renderer/lib/vendor/experitest.ts
@@ -0,0 +1,24 @@
+import {BaseVendor} from './base.js';
+
+export class ExperitestVendor extends BaseVendor {
+ override async configureProperties(): Promise {
+ const experitest = this._server.experitest;
+ const vendorName = 'Experitest';
+
+ const url = experitest.url as string | undefined;
+ const accessKey = experitest.accessKey as string | undefined;
+ this._checkInputPropertyPresence(vendorName, [
+ {name: 'URL', val: url},
+ {name: 'Access Key', val: accessKey},
+ ]);
+ const experitestUrl = this._validateUrl(url as string);
+
+ const host = experitestUrl.hostname;
+ const path = '/wd/hub';
+ const https = experitestUrl.protocol === 'https:';
+ const port = experitestUrl.port === '' ? (https ? 443 : 80) : experitestUrl.port;
+ this._saveProperties(experitest, {host, path, port, https});
+
+ this._updateSessionCap('experitest:accessKey', accessKey as string);
+ }
+}
diff --git a/app/common/renderer/lib/vendor/fireflinkdevicefarm.ts b/app/common/renderer/lib/vendor/fireflinkdevicefarm.ts
new file mode 100644
index 0000000000..b665503346
--- /dev/null
+++ b/app/common/renderer/lib/vendor/fireflinkdevicefarm.ts
@@ -0,0 +1,43 @@
+import {BaseVendor} from './base.js';
+
+export class FireflinkDeviceFarmVendor extends BaseVendor {
+ override async configureProperties(): Promise {
+ const fireflinkdevicefarm = this._server.fireflinkdevicefarm;
+ const vendorName = 'FireflinkDeviceFarm';
+
+ const host =
+ (fireflinkdevicefarm.host as string | undefined) ||
+ (process.env.FIREFLINKDEVICEFARM_DOMAIN as string | undefined);
+ const accessKey =
+ (fireflinkdevicefarm.accessKey as string | undefined) ||
+ (process.env.FIREFLINKDEVICEFARM_ACCESS_KEY as string | undefined);
+ const licenseId =
+ (fireflinkdevicefarm.licenseId as string | undefined) ||
+ (process.env.FIREFLINKDEVICEFARM_LICENSE_ID as string | undefined);
+ const projectName =
+ (fireflinkdevicefarm.projectName as string | undefined) ||
+ (process.env.FIREFLINKDEVICEFARM_PROJECT_ID as string | undefined);
+
+ this._checkInputPropertyPresence(vendorName, [
+ {name: 'Host', val: host},
+ {name: 'Access Key', val: accessKey},
+ {name: 'License ID', val: licenseId},
+ {name: 'Project Name', val: projectName},
+ ]);
+
+ const port = 443;
+ const https = true;
+ const accessKeyDefined = accessKey as string;
+ const licenseIdDefined = licenseId as string;
+ const projectNameDefined = projectName as string;
+ const path = `/backend/fireflinkcloud/wd/hub?accessKey=${accessKeyDefined}&licenseId=${licenseIdDefined}&projectName=${projectNameDefined}`;
+
+ this._saveProperties(fireflinkdevicefarm, {
+ host: host as string,
+ path,
+ port,
+ https,
+ accessKey: accessKeyDefined,
+ });
+ }
+}
diff --git a/app/common/renderer/lib/vendor/headspin.ts b/app/common/renderer/lib/vendor/headspin.ts
new file mode 100644
index 0000000000..a2d6abc940
--- /dev/null
+++ b/app/common/renderer/lib/vendor/headspin.ts
@@ -0,0 +1,18 @@
+import {BaseVendor} from './base.js';
+
+export class HeadspinVendor extends BaseVendor {
+ override async configureProperties(): Promise {
+ const headspin = this._server.headspin;
+ const vendorName = 'HeadSpin';
+
+ const url = headspin.webDriverUrl as string | undefined;
+ this._checkInputPropertyPresence(vendorName, [{name: 'WebDriver URL', val: url}]);
+ const headspinUrl = this._validateUrl(url as string);
+
+ const host = headspinUrl.hostname;
+ const path = headspinUrl.pathname;
+ const https = headspinUrl.protocol === 'https:';
+ const port = headspinUrl.port === '' ? (https ? 443 : 80) : headspinUrl.port;
+ this._saveProperties(headspin, {host, path, port, https});
+ }
+}
diff --git a/app/common/renderer/lib/vendor/kobiton.ts b/app/common/renderer/lib/vendor/kobiton.ts
new file mode 100644
index 0000000000..4f639c2e5c
--- /dev/null
+++ b/app/common/renderer/lib/vendor/kobiton.ts
@@ -0,0 +1,29 @@
+import {BaseVendor} from './base.js';
+
+export class KobitonVendor extends BaseVendor {
+ override async configureProperties(): Promise {
+ const kobiton = this._server.kobiton;
+ const vendorName = 'Kobiton';
+
+ const username =
+ (kobiton.username as string | undefined) ||
+ (process.env.KOBITON_USERNAME as string | undefined);
+ const accessKey =
+ (kobiton.accessKey as string | undefined) ||
+ (process.env.KOBITON_ACCESS_KEY as string | undefined);
+ this._checkInputPropertyPresence(vendorName, [
+ {name: 'Username', val: username},
+ {name: 'API Key', val: accessKey},
+ ]);
+
+ const host = process.env.KOBITON_HOST || 'api.kobiton.com';
+ const port = 443;
+ const path = '/wd/hub';
+ const https = true;
+ this._saveProperties(kobiton, {host, path, port, https, username, accessKey});
+
+ this._updateSessionCap('kobiton:options', {
+ source: 'appiumdesktop',
+ });
+ }
+}
diff --git a/app/common/renderer/lib/vendor/local.ts b/app/common/renderer/lib/vendor/local.ts
new file mode 100644
index 0000000000..451aa7d3f5
--- /dev/null
+++ b/app/common/renderer/lib/vendor/local.ts
@@ -0,0 +1,11 @@
+import {BaseVendor} from './base.js';
+
+export class LocalVendor extends BaseVendor {
+ override async configureProperties(): Promise {
+ const local = this._server.local;
+
+ const host = local.host === '0.0.0.0' ? 'localhost' : local.hostname;
+ const port = local.port as number | string;
+ this._saveProperties(local, {host: host as string, port});
+ }
+}
diff --git a/app/common/renderer/lib/vendor/map.ts b/app/common/renderer/lib/vendor/map.ts
new file mode 100644
index 0000000000..2de77d3b4a
--- /dev/null
+++ b/app/common/renderer/lib/vendor/map.ts
@@ -0,0 +1,52 @@
+import {SERVER_TYPES} from '../../constants/session-builder.js';
+import type {BaseVendor, SessionBuilderServer} from './base.js';
+import {BitbarVendor} from './bitbar.js';
+import {BrowserstackVendor} from './browserstack.js';
+import {ExperitestVendor} from './experitest.js';
+import {FireflinkDeviceFarmVendor} from './fireflinkdevicefarm.js';
+import {HeadspinVendor} from './headspin.js';
+import {KobitonVendor} from './kobiton.js';
+import {LocalVendor} from './local.js';
+import {MobitruVendor} from './mobitru.js';
+import {PcloudyVendor} from './pcloudy.js';
+import {PerfectoVendor} from './perfecto.js';
+import {RabbitQAVendor} from './rabbitqa.js';
+import {RemoteVendor} from './remote.js';
+import {RemotetestkitVendor} from './remotetestkit.js';
+import {RobotActionsVendor} from './robotactions.js';
+import {RobotqaVendor} from './robotqa.js';
+import {SaucelabsVendor} from './saucelabs.js';
+import {TestcribeVendor} from './testcribe.js';
+import {TestingbotVendor} from './testingbot.js';
+import {TestMuAIVendor} from './testmuai.js';
+import {TvlabsVendor} from './tvlabs.js';
+import {WebmateVendor} from './webmate.js';
+
+type VendorConstructor = new (
+ server: SessionBuilderServer,
+ sessionCaps: Record,
+) => BaseVendor;
+
+export const VENDOR_MAP: Partial> = {
+ [SERVER_TYPES.LOCAL]: LocalVendor,
+ [SERVER_TYPES.REMOTE]: RemoteVendor,
+ [SERVER_TYPES.SAUCE]: SaucelabsVendor,
+ [SERVER_TYPES.HEADSPIN]: HeadspinVendor,
+ [SERVER_TYPES.PERFECTO]: PerfectoVendor,
+ [SERVER_TYPES.BROWSERSTACK]: BrowserstackVendor,
+ [SERVER_TYPES.TESTMUAI]: TestMuAIVendor,
+ [SERVER_TYPES.BITBAR]: BitbarVendor,
+ [SERVER_TYPES.KOBITON]: KobitonVendor,
+ [SERVER_TYPES.PCLOUDY]: PcloudyVendor,
+ [SERVER_TYPES.TESTINGBOT]: TestingbotVendor,
+ [SERVER_TYPES.EXPERITEST]: ExperitestVendor,
+ [SERVER_TYPES.ROBOTQA]: RobotqaVendor,
+ [SERVER_TYPES.REMOTETESTKIT]: RemotetestkitVendor,
+ [SERVER_TYPES.MOBITRU]: MobitruVendor,
+ [SERVER_TYPES.TVLABS]: TvlabsVendor,
+ [SERVER_TYPES.TESTCRIBE]: TestcribeVendor,
+ [SERVER_TYPES.WEBMATE]: WebmateVendor,
+ [SERVER_TYPES.FIREFLINKDEVICEFARM]: FireflinkDeviceFarmVendor,
+ [SERVER_TYPES.RABBITQA]: RabbitQAVendor,
+ [SERVER_TYPES.ROBOTACTIONS]: RobotActionsVendor,
+};
diff --git a/app/common/renderer/lib/vendor/mobitru.ts b/app/common/renderer/lib/vendor/mobitru.ts
new file mode 100644
index 0000000000..1f32bfe67f
--- /dev/null
+++ b/app/common/renderer/lib/vendor/mobitru.ts
@@ -0,0 +1,32 @@
+import {BaseVendor} from './base.js';
+
+export class MobitruVendor extends BaseVendor {
+ override async configureProperties(): Promise {
+ const mobitru = this._server.mobitru;
+ const vendorName = 'Mobitru';
+
+ const username =
+ (mobitru.username as string | undefined) ||
+ (process.env.MOBITRU_BILLING_UNIT as string | undefined) ||
+ 'personal';
+ const accessKey =
+ (mobitru.accessKey as string | undefined) ||
+ (process.env.MOBITRU_ACCESS_KEY as string | undefined);
+ const url =
+ (mobitru.webDriverUrl as string | undefined) ||
+ (process.env.MOBITRU_WEBDRIVER_URL as string | undefined) ||
+ 'https://app.mobitru.com/wd/hub';
+ this._checkInputPropertyPresence(vendorName, [{name: 'Access Key', val: accessKey}]);
+ const mobitruUrl = this._validateUrl(url);
+
+ const host = mobitruUrl.hostname;
+ const path = mobitruUrl.pathname;
+ const https = mobitruUrl.protocol === 'https:';
+ const port = mobitruUrl.port === '' ? (https ? 443 : 80) : mobitruUrl.port;
+ this._saveProperties(mobitru, {host, path, port, https, username, accessKey});
+
+ this._updateSessionCap('mobitru:options', {
+ source: 'appium-inspector',
+ });
+ }
+}
diff --git a/app/common/renderer/lib/vendor/pcloudy.ts b/app/common/renderer/lib/vendor/pcloudy.ts
new file mode 100644
index 0000000000..19ab3efdc6
--- /dev/null
+++ b/app/common/renderer/lib/vendor/pcloudy.ts
@@ -0,0 +1,43 @@
+import {BaseVendor} from './base.js';
+
+export class PcloudyVendor extends BaseVendor {
+ override async configureProperties(): Promise {
+ const pcloudy = this._server.pcloudy;
+ const vendorName = 'pCloudy';
+
+ const host = pcloudy.hostname as string | undefined;
+ const username =
+ (pcloudy.username as string | undefined) ||
+ (process.env.PCLOUDY_USERNAME as string | undefined);
+ const accessKey =
+ (pcloudy.accessKey as string | undefined) ||
+ (process.env.PCLOUDY_ACCESS_KEY as string | undefined);
+ this._checkInputPropertyPresence(vendorName, [
+ {name: 'Host', val: host},
+ {name: 'Username', val: username},
+ {name: 'API Key', val: accessKey},
+ ]);
+
+ const port = 443;
+ const path = '/objectspy/wd/hub';
+ const https = true;
+ this._saveProperties(pcloudy, {
+ host: host as string,
+ path,
+ port,
+ https,
+ username,
+ accessKey,
+ });
+
+ this._updateSessionCap(
+ 'pcloudy:options',
+ {
+ source: 'appiumdesktop',
+ pCloudy_Username: username,
+ pCloudy_ApiKey: accessKey,
+ },
+ false,
+ );
+ }
+}
diff --git a/app/common/renderer/lib/vendor/perfecto.ts b/app/common/renderer/lib/vendor/perfecto.ts
new file mode 100644
index 0000000000..73b5a19d2a
--- /dev/null
+++ b/app/common/renderer/lib/vendor/perfecto.ts
@@ -0,0 +1,30 @@
+import {BaseVendor} from './base.js';
+
+export class PerfectoVendor extends BaseVendor {
+ override async configureProperties(): Promise {
+ const perfecto = this._server.perfecto;
+ const vendorName = 'Perfecto';
+
+ const host = perfecto.hostname as string | undefined;
+ const securityToken =
+ (perfecto.token as string | undefined) || (process.env.PERFECTO_TOKEN as string | undefined);
+ this._checkInputPropertyPresence(vendorName, [
+ {name: 'Host', val: host},
+ {name: 'SecurityToken', val: securityToken},
+ ]);
+
+ const ssl = perfecto.ssl;
+ const port = (perfecto.port as number | string | undefined) || (ssl ? 443 : 80);
+ const https = ssl as boolean | undefined;
+ const path = '/nexperience/perfectomobile/wd/hub';
+ this._saveProperties(perfecto, {
+ host: host as string,
+ path,
+ port,
+ https,
+ accessKey: securityToken as string,
+ });
+
+ this._updateSessionCap('perfecto:options', {securityToken}, false);
+ }
+}
diff --git a/app/common/renderer/lib/vendor/rabbitqa.ts b/app/common/renderer/lib/vendor/rabbitqa.ts
new file mode 100644
index 0000000000..99b9c26828
--- /dev/null
+++ b/app/common/renderer/lib/vendor/rabbitqa.ts
@@ -0,0 +1,30 @@
+import {BaseVendor} from './base.js';
+
+export class RabbitQAVendor extends BaseVendor {
+ override async configureProperties(): Promise {
+ const rabbitQA = this._server.rabbitqa;
+ const vendorName = 'RabbitQA';
+
+ const apiKey =
+ (rabbitQA.apiKey as string | undefined) ||
+ (process.env.RABBITQA_API_KEY as string | undefined);
+
+ this._checkInputPropertyPresence(vendorName, [{name: 'API Key', val: apiKey}]);
+ const apiKeyDefined = apiKey as string;
+
+ const host = 'api.rabbitqa.com';
+ const port = 443;
+ const path = '/df/wd/hub';
+ const https = true;
+
+ this._saveProperties(rabbitQA, {
+ host,
+ path,
+ port,
+ https,
+ accessKey: apiKeyDefined,
+ });
+
+ this._updateSessionCap('df:apiKey', apiKeyDefined, false);
+ }
+}
diff --git a/app/common/renderer/lib/vendor/remote.ts b/app/common/renderer/lib/vendor/remote.ts
new file mode 100644
index 0000000000..9ad04aff67
--- /dev/null
+++ b/app/common/renderer/lib/vendor/remote.ts
@@ -0,0 +1,13 @@
+import {BaseVendor} from './base.js';
+
+export class RemoteVendor extends BaseVendor {
+ override async configureProperties(): Promise {
+ const remote = this._server.remote;
+
+ const host = remote.hostname as string;
+ const port = remote.port as number | string;
+ const path = remote.path as string | undefined;
+ const https = remote.ssl as boolean | undefined;
+ this._saveProperties(remote, {host, path, port, https});
+ }
+}
diff --git a/app/common/renderer/lib/vendor/remotetestkit.ts b/app/common/renderer/lib/vendor/remotetestkit.ts
new file mode 100644
index 0000000000..c9a28dd845
--- /dev/null
+++ b/app/common/renderer/lib/vendor/remotetestkit.ts
@@ -0,0 +1,25 @@
+import {BaseVendor} from './base.js';
+
+export class RemotetestkitVendor extends BaseVendor {
+ override async configureProperties(): Promise {
+ const remotetestkit = this._server.remotetestkit;
+ const vendorName = 'RemoteTestKit';
+
+ const accessToken = remotetestkit.token as string | undefined;
+ this._checkInputPropertyPresence(vendorName, [{name: 'AccessToken', val: accessToken}]);
+
+ const host = 'gwjp.appkitbox.com';
+ const path = '/wd/hub';
+ const port = 443;
+ const https = true;
+ this._saveProperties(remotetestkit, {
+ host,
+ path,
+ port,
+ https,
+ accessKey: accessToken as string,
+ });
+
+ this._updateSessionCap('remotetestkit:options', {accessToken});
+ }
+}
diff --git a/app/common/renderer/lib/vendor/robotactions.ts b/app/common/renderer/lib/vendor/robotactions.ts
new file mode 100644
index 0000000000..52c716202d
--- /dev/null
+++ b/app/common/renderer/lib/vendor/robotactions.ts
@@ -0,0 +1,46 @@
+import {BaseVendor} from './base.js';
+
+export class RobotActionsVendor extends BaseVendor {
+ override async configureProperties(): Promise {
+ const robotactions = this._server.robotactions;
+ const vendorName = 'RobotActions';
+
+ const token =
+ (robotactions.token as string | undefined) ||
+ (process.env.ROBOTACTIONS_TOKEN as string | undefined);
+ const rawHost =
+ process.env.ROBOTACTIONS_WEBDRIVER_URL || (robotactions.host as string | undefined);
+ // Parse via URL() so users who paste a full URL (https://acme.example.com),
+ // include a port (host:443), or accidentally append a path / trailing slash
+ // all end up with just the hostname.
+ const trimmed = rawHost?.trim();
+ let host: string | undefined;
+ if (trimmed) {
+ try {
+ const withScheme = /^[a-z]+:\/\//i.test(trimmed) ? trimmed : `https://${trimmed}`;
+ host = new URL(withScheme).hostname;
+ } catch {
+ host = trimmed;
+ }
+ }
+ this._checkInputPropertyPresence(vendorName, [
+ {name: 'Host', val: host},
+ {name: 'Token', val: token},
+ ]);
+ const tokenDefined = token as string;
+ const hostDefined = host as string;
+ const headers = {Authorization: `Bearer ${tokenDefined}`};
+
+ const path = '/';
+ const port = 443;
+ const https = true;
+ this._saveProperties(robotactions, {
+ host: hostDefined,
+ path,
+ port,
+ https,
+ accessKey: tokenDefined,
+ headers,
+ });
+ }
+}
diff --git a/app/common/renderer/lib/vendor/robotqa.ts b/app/common/renderer/lib/vendor/robotqa.ts
new file mode 100644
index 0000000000..cee2956ab9
--- /dev/null
+++ b/app/common/renderer/lib/vendor/robotqa.ts
@@ -0,0 +1,28 @@
+import {BaseVendor} from './base.js';
+
+export class RobotqaVendor extends BaseVendor {
+ override async configureProperties(): Promise {
+ const robotqa = this._server.roboticmobi;
+ const vendorName = 'RobotQA';
+
+ const token =
+ (robotqa.token as string | undefined) || (process.env.ROBOTQA_TOKEN as string | undefined);
+ this._checkInputPropertyPresence(vendorName, [{name: 'Token', val: token}]);
+
+ const host = 'remote.robotqa.com';
+ const path = '/';
+ const port = 443;
+ const https = true;
+ this._saveProperties(robotqa, {
+ host,
+ path,
+ port,
+ https,
+ accessKey: token as string,
+ });
+
+ this._updateSessionCap('robotqa:options', {
+ robotqa_token: token,
+ });
+ }
+}
diff --git a/app/common/renderer/lib/vendor/saucelabs.ts b/app/common/renderer/lib/vendor/saucelabs.ts
new file mode 100644
index 0000000000..d13b25f124
--- /dev/null
+++ b/app/common/renderer/lib/vendor/saucelabs.ts
@@ -0,0 +1,43 @@
+import dayjs, {extend as dayjsExtend} from 'dayjs';
+import localizedFormat from 'dayjs/plugin/localizedFormat.js';
+
+import {BaseVendor} from './base.js';
+
+dayjsExtend(localizedFormat);
+
+const SAUCE_OPTIONS_CAP = 'sauce:options';
+
+export class SaucelabsVendor extends BaseVendor {
+ override async configureProperties(): Promise {
+ const sauce = this._server.sauce;
+ const vendorName = 'Sauce Labs';
+
+ const username =
+ (sauce.username as string | undefined) || (process.env.SAUCE_USERNAME as string | undefined);
+ const accessKey =
+ (sauce.accessKey as string | undefined) ||
+ (process.env.SAUCE_ACCESS_KEY as string | undefined);
+ this._checkInputPropertyPresence(vendorName, [
+ {name: 'Username', val: username},
+ {name: 'Access Key', val: accessKey},
+ ]);
+
+ const dataCenter = String(sauce.dataCenter ?? '');
+ let host = `ondemand.${dataCenter}.saucelabs.com`;
+ let port: number | string = 80;
+ if (sauce.useSCProxy) {
+ host = (sauce.scHost as string | undefined) || 'localhost';
+ port = parseInt(String(sauce.scPort), 10) || 4445;
+ }
+ const path = '/wd/hub';
+ const https = false;
+ this._saveProperties(sauce, {host, path, port, https, username, accessKey});
+
+ if (!(this._sessionCaps[SAUCE_OPTIONS_CAP] as {name?: unknown} | undefined)?.name) {
+ const dateTime = dayjs().format('lll');
+ this._updateSessionCap(SAUCE_OPTIONS_CAP, {
+ name: `Appium Desktop Session -- ${dateTime}`,
+ });
+ }
+ }
+}
diff --git a/app/common/renderer/lib/vendor/testcribe.ts b/app/common/renderer/lib/vendor/testcribe.ts
new file mode 100644
index 0000000000..18c32ff0be
--- /dev/null
+++ b/app/common/renderer/lib/vendor/testcribe.ts
@@ -0,0 +1,28 @@
+import {BaseVendor} from './base.js';
+
+export class TestcribeVendor extends BaseVendor {
+ override async configureProperties(): Promise {
+ const testcribe = this._server.testcribe;
+ const vendorName = 'Testcribe';
+
+ const apiKey =
+ (testcribe.apiKey as string | undefined) ||
+ (process.env.TESTCRIBE_API_KEY as string | undefined);
+ this._checkInputPropertyPresence(vendorName, [{name: 'API Key', val: apiKey}]);
+ const apiKeyDefined = apiKey as string;
+
+ const host = process.env.TESTCRIBE_WEBDRIVER_URL || 'app.testcribe.com';
+ const port = 443;
+ const https = true;
+ const path = '/gw';
+ this._saveProperties(testcribe, {
+ host,
+ path,
+ port,
+ https,
+ accessKey: apiKeyDefined,
+ });
+ this._updateSessionCap('testcribe:options', {apikey: apiKeyDefined});
+ this._updateSessionCap('appium:apiKey', apiKeyDefined);
+ }
+}
diff --git a/app/common/renderer/lib/vendor/testingbot.ts b/app/common/renderer/lib/vendor/testingbot.ts
new file mode 100644
index 0000000000..38ef23d6f7
--- /dev/null
+++ b/app/common/renderer/lib/vendor/testingbot.ts
@@ -0,0 +1,29 @@
+import {BaseVendor} from './base.js';
+
+export class TestingbotVendor extends BaseVendor {
+ override async configureProperties(): Promise {
+ const testingbot = this._server.testingbot;
+ const vendorName = 'TestingBot';
+
+ const key =
+ (testingbot.username as string | undefined) || (process.env.TB_KEY as string | undefined);
+ const secret =
+ (testingbot.accessKey as string | undefined) || (process.env.TB_SECRET as string | undefined);
+ this._checkInputPropertyPresence(vendorName, [
+ {name: 'Key', val: key},
+ {name: 'Secret', val: secret},
+ ]);
+
+ const host = process.env.TB_HOST || 'hub.testingbot.com';
+ const port = 443;
+ const path = '/wd/hub';
+ const https = true;
+ this._saveProperties(testingbot, {host, path, port, https, username: key, accessKey: secret});
+
+ this._updateSessionCap('tb:options', {
+ key,
+ secret,
+ source: 'appiumdesktop',
+ });
+ }
+}
diff --git a/app/common/renderer/lib/vendor/testmuai.ts b/app/common/renderer/lib/vendor/testmuai.ts
new file mode 100644
index 0000000000..49a5acd4b8
--- /dev/null
+++ b/app/common/renderer/lib/vendor/testmuai.ts
@@ -0,0 +1,48 @@
+import _ from 'lodash';
+
+import {BaseVendor} from './base.js';
+
+export class TestMuAIVendor extends BaseVendor {
+ override async configureProperties(): Promise {
+ const testmuai = this._server.lambdatest;
+ const advanced = this._server.advanced;
+ const vendorName = 'TestMu AI';
+
+ const username =
+ (testmuai.username as string | undefined) ||
+ (process.env.LAMBDATEST_USERNAME as string | undefined);
+ const accessKey =
+ (testmuai.accessKey as string | undefined) ||
+ (process.env.LAMBDATEST_ACCESS_KEY as string | undefined);
+ this._checkInputPropertyPresence(vendorName, [
+ {name: 'Username', val: username},
+ {name: 'Access Key', val: accessKey},
+ ]);
+
+ const host = process.env.LAMBDATEST_HOST || 'mobile-hub.lambdatest.com';
+ const port = process.env.LAMBDATEST_PORT || 443;
+ const path = '/wd/hub';
+ const https = parseInt(String(port), 10) === 443;
+ this._saveProperties(testmuai, {host, path, port, https, username, accessKey});
+
+ if (_.has(this._sessionCaps, 'lt:options')) {
+ const options: Record = {
+ source: 'appiumdesktop',
+ isRealMobile: true,
+ };
+ if (advanced?.useProxy) {
+ options.proxyUrl = _.isUndefined(advanced?.proxy) ? '' : advanced.proxy;
+ }
+ this._updateSessionCap('lt:options', options);
+ } else {
+ this._updateSessionCap('lambdatest:source', 'appiumdesktop');
+ this._updateSessionCap('lambdatest:isRealMobile', true);
+ if (advanced?.useProxy) {
+ this._updateSessionCap(
+ 'lambdatest:proxyUrl',
+ _.isUndefined(advanced?.proxy) ? '' : advanced.proxy,
+ );
+ }
+ }
+ }
+}
diff --git a/app/common/renderer/lib/vendor/tvlabs.ts b/app/common/renderer/lib/vendor/tvlabs.ts
new file mode 100644
index 0000000000..408ff1be55
--- /dev/null
+++ b/app/common/renderer/lib/vendor/tvlabs.ts
@@ -0,0 +1,21 @@
+import {BaseVendor} from './base.js';
+
+export class TvlabsVendor extends BaseVendor {
+ override async configureProperties(): Promise {
+ const tvlabs = this._server.tvlabs;
+ const vendorName = 'TV Labs';
+
+ const apiKey =
+ (tvlabs.apiKey as string | undefined) || (process.env.TVLABS_API_KEY as string | undefined);
+ this._checkInputPropertyPresence(vendorName, [{name: 'API Key', val: apiKey}]);
+ const apiKeyDefined = apiKey as string;
+ const headers = {Authorization: `Bearer ${apiKeyDefined}`};
+
+ const host =
+ process.env.TVLABS_WEBDRIVER_URL || (tvlabs.host as string | undefined) || 'appium.tvlabs.ai';
+ const path = (tvlabs.path as string | undefined) || '/';
+ const port = (tvlabs.port as number | string | undefined) || 4723;
+ const https = Boolean(tvlabs.ssl) || host === 'appium.tvlabs.ai';
+ this._saveProperties(tvlabs, {host, path, port, https, accessKey: apiKeyDefined, headers});
+ }
+}
diff --git a/app/common/renderer/lib/vendor/webmate.ts b/app/common/renderer/lib/vendor/webmate.ts
new file mode 100644
index 0000000000..c9bdf8091d
--- /dev/null
+++ b/app/common/renderer/lib/vendor/webmate.ts
@@ -0,0 +1,39 @@
+import {BaseVendor} from './base.js';
+
+export class WebmateVendor extends BaseVendor {
+ override async configureProperties(): Promise {
+ const webmate = this._server.webmate;
+ const vendorName = 'webmate';
+
+ const apiKey =
+ (webmate.apiKey as string | undefined) || (process.env.WEBMATE_APIKEY as string | undefined);
+ const projectId =
+ (webmate.projectId as string | undefined) ||
+ (process.env.WEBMATE_PROJECT as string | undefined);
+ this._checkInputPropertyPresence(vendorName, [{name: 'API Key', val: apiKey}]);
+ const apiKeyDefined = apiKey as string;
+
+ let host = process.env.WEBMATE_HOST || 'selenium.webmate.io';
+ if (webmate.useCustomHost) {
+ this._checkInputPropertyPresence(vendorName, [
+ {name: 'Host', val: webmate.seleniumHost as string | undefined},
+ ]);
+ host = this._validateUrl(webmate.seleniumHost as string).hostname;
+ }
+ const path = '/wd/hub';
+ const port = 443;
+ const https = true;
+ this._saveProperties(webmate, {
+ host,
+ path,
+ port,
+ https,
+ accessKey: apiKeyDefined,
+ });
+
+ this._updateSessionCap('wm:apikey', apiKeyDefined);
+ if (projectId) {
+ this._updateSessionCap('wm:project', projectId);
+ }
+ }
+}
diff --git a/app/common/renderer/polyfills.js b/app/common/renderer/polyfills.js
new file mode 100644
index 0000000000..7c746b5f95
--- /dev/null
+++ b/app/common/renderer/polyfills.js
@@ -0,0 +1,28 @@
+/**
+ * The '#local-polyfills' alias is defined in both Vite config files.
+ * Since both files define different resolution paths,
+ * they cannot be added to tsconfig and eslint configurations
+ */
+
+import {settings} from '#local-polyfills'; // eslint-disable-line import-x/no-unresolved
+
+import {DEFAULT_SETTINGS} from '../shared/setting-defs.js';
+
+export async function getSetting(setting) {
+ if (await settings.has(setting)) {
+ return await settings.get(setting);
+ }
+ return DEFAULT_SETTINGS[setting];
+}
+
+export async function setSetting(setting, value) {
+ await settings.set(setting, value);
+}
+
+export {
+ loadSessionFileIfOpened,
+ localesPath,
+ openLink,
+ setTheme,
+ updateLanguage,
+} from '#local-polyfills'; // eslint-disable-line import-x/no-unresolved
diff --git a/app/common/renderer/providers/ThemeProvider.jsx b/app/common/renderer/providers/ThemeProvider.jsx
new file mode 100644
index 0000000000..5f5c447f58
--- /dev/null
+++ b/app/common/renderer/providers/ThemeProvider.jsx
@@ -0,0 +1,98 @@
+import {App, ConfigProvider, Layout, theme} from 'antd';
+import {createContext, useState} from 'react';
+
+import {PREFERRED_THEME} from '../../shared/setting-defs.js';
+import darkTheme from '../assets/stylesheets/prism-dark.css?url';
+import lightTheme from '../assets/stylesheets/prism-light.css?url';
+import Notification from '../components/Notification.jsx';
+import {getSetting, setSetting, setTheme} from '../polyfills.js';
+
+const systemPrefersDarkTheme = window.matchMedia('(prefers-color-scheme: dark)').matches;
+const savedTheme = await getSetting(PREFERRED_THEME);
+setTheme(savedTheme);
+
+const loadHighlightTheme = (isDarkTheme) => {
+ const linkId = 'highlight-theme';
+ let link = document.getElementById(linkId);
+
+ if (!link) {
+ link = document.createElement('link');
+ link.id = linkId;
+ link.rel = 'stylesheet';
+ link.type = 'text/css';
+ document.head.appendChild(link);
+ }
+
+ if (isDarkTheme) {
+ link.href = darkTheme;
+ } else {
+ link.href = lightTheme;
+ }
+};
+
+export const ThemeContext = createContext(null);
+
+export const ThemeProvider = ({children}) => {
+ const [preferredTheme, setPreferredTheme] = useState(savedTheme);
+
+ const isDarkTheme =
+ preferredTheme === 'dark' || (preferredTheme === 'system' && systemPrefersDarkTheme);
+
+ loadHighlightTheme(isDarkTheme);
+
+ const handleDarkClass = () => {
+ if (isDarkTheme) {
+ document.body.classList.add('dark');
+ } else {
+ document.body.classList.remove('dark');
+ }
+ };
+
+ handleDarkClass();
+
+ const updateTheme = async (theme) => {
+ setTheme(theme);
+ setPreferredTheme(theme);
+ await setSetting(PREFERRED_THEME, theme);
+ };
+
+ const themeConfig = {
+ algorithm: isDarkTheme ? theme.darkAlgorithm : theme.defaultAlgorithm,
+ token: {
+ colorBgLayout: isDarkTheme ? '#191919' : '#f5f5f5',
+ fontSize: 12,
+ },
+ components: {
+ Badge: {
+ colorError: '#1677ff',
+ indicatorHeight: 20,
+ textFontSize: 12,
+ },
+ Switch: {
+ handleSize: 18,
+ trackHeight: 22,
+ trackMinWidth: 44,
+ },
+ Table: {
+ rowSelectedBg: isDarkTheme ? '#15325b' : '#cce9ff',
+ },
+ Tabs: {
+ titleFontSize: 14,
+ },
+ Tree: {
+ nodeSelectedBg: isDarkTheme ? '#15325b' : '#cce9ff',
+ },
+ },
+ };
+
+ return (
+
+
+
+ {children}
+
+
+
+
+ );
+};
diff --git a/app/renderer/reducers/Session.js b/app/common/renderer/reducers/SessionBuilder.js
similarity index 70%
rename from app/renderer/reducers/Session.js
rename to app/common/renderer/reducers/SessionBuilder.js
index 2bd40dd42d..6b1112b852 100644
--- a/app/renderer/reducers/Session.js
+++ b/app/common/renderer/reducers/SessionBuilder.js
@@ -1,5 +1,4 @@
-import {notification} from 'antd';
-import _, {omit} from 'lodash';
+import _ from 'lodash';
import {
ABORT_DESIRED_CAPS_EDITOR,
@@ -25,8 +24,10 @@ import {
SAVE_RAW_DESIRED_CAPS,
SAVE_SESSION_DONE,
SAVE_SESSION_REQUESTED,
+ SESSION_UPLOAD_DONE,
+ SESSION_UPLOAD_REQUESTED,
SET_ADD_VENDOR_PREFIXES,
- SET_ATTACH_SESS_ID,
+ SET_CAPABILITY_NAME_ERROR,
SET_CAPABILITY_PARAM,
SET_CAPS_AND_SERVER,
SET_DESIRED_CAPS_NAME,
@@ -35,60 +36,41 @@ import {
SET_SAVE_AS_TEXT,
SET_SERVER,
SET_SERVER_PARAM,
- SET_STATE_FROM_SAVED,
+ SET_STATE_FROM_FILE,
SET_STATE_FROM_URL,
SHOW_DESIRED_CAPS_JSON_ERROR,
SWITCHED_TABS,
- ServerTypes,
-} from '../actions/Session';
-
-const visibleProviders = []; // Pull this from "electron-settings"
-const server = {
- local: {},
- remote: {},
- advanced: {},
-};
+} from '../actions/SessionBuilder.js';
+import {SERVER_TYPES, SESSION_BUILDER_TABS} from '../constants/session-builder.js';
+import {getRandomId} from '../utils/other.js';
+
+const visibleProviders = []; // Pull this from the VISIBLE_PROVIDERS setting
-for (const serverName of _.keys(ServerTypes)) {
- server[serverName] = {};
+const server = {};
+for (const serverType of _.values(SERVER_TYPES)) {
+ server[serverType] = serverType === SERVER_TYPES.SAUCE ? {dataCenter: 'us-west-1'} : {};
}
// Make sure there's always at least one cap
const INITIAL_STATE = {
savedSessions: [],
- tabKey: 'new',
- serverType: ServerTypes.remote,
+ tabKey: SESSION_BUILDER_TABS.CAPS_BUILDER,
+ serverType: SERVER_TYPES.REMOTE,
visibleProviders,
- server: {
- local: {},
- remote: {},
- sauce: {
- dataCenter: 'us-west-1',
- },
- headspin: {},
- browserstack: {},
- lambdatest: {},
- advanced: {},
- bitbar: {},
- kobiton: {},
- perfecto: {},
- pcloudy: {},
- testingbot: {},
- experitest: {},
- roboticmobi: {},
- remotetestkit: {},
- mobitru: {},
- },
+ server,
attachSessId: null,
// Make sure there's always at least one cap
caps: [
{
+ id: getRandomId(),
type: 'text',
+ enabled: true,
},
],
isCapsDirty: true,
+ isDuplicateCapsName: false,
gettingSessions: false,
runningAppiumSessions: [],
isEditingDesiredCapsName: false,
@@ -97,24 +79,12 @@ const INITIAL_STATE = {
isValidatingCapsJson: false,
isAddingCloudProvider: false,
addVendorPrefixes: true,
+ isUploadingSessionFiles: false,
};
let nextState;
-// returns false if the attachSessId is not present in the runningSessions list
-const isAttachSessIdValid = (runningSessions, attachSessId) => {
- if (!attachSessId || !runningSessions) {
- return false;
- }
- for (const session of runningSessions) {
- if (session.id === attachSessId) {
- return true;
- }
- }
- return false;
-};
-
-export default function session(state = INITIAL_STATE, action) {
+export default function builder(state = INITIAL_STATE, action) {
switch (action.type) {
case NEW_SESSION_REQUESTED:
return {
@@ -127,21 +97,21 @@ export default function session(state = INITIAL_STATE, action) {
...state,
newSessionLoading: true,
};
- return omit(nextState, 'newSessionRequested');
+ return _.omit(nextState, 'newSessionRequested');
case NEW_SESSION_DONE:
- return omit(state, 'newSessionLoading');
+ return _.omit(state, 'newSessionLoading');
case ADD_CAPABILITY:
return {
...state,
- caps: [...state.caps, {type: 'text'}],
+ caps: [...state.caps, {id: getRandomId(), type: 'text', enabled: true}],
};
case REMOVE_CAPABILITY:
return {
...state,
- caps: state.caps.filter((cap, index) => index !== action.index),
+ caps: state.caps.filter((cap) => cap.id !== action.id),
isCapsDirty: true,
};
@@ -149,8 +119,8 @@ export default function session(state = INITIAL_STATE, action) {
return {
...state,
isCapsDirty: true,
- caps: state.caps.map((cap, index) =>
- index !== action.index
+ caps: state.caps.map((cap) =>
+ cap.id !== action.id
? cap
: {
...cap,
@@ -162,23 +132,36 @@ export default function session(state = INITIAL_STATE, action) {
case SET_CAPS_AND_SERVER:
nextState = {
...state,
- server: action.server,
+ server: {...state.server, ...action.server},
serverType: action.serverType,
- caps: action.caps,
+ caps: action.caps.map((cap) => ({
+ id: getRandomId(),
+ enabled: true,
+ ...cap,
+ })),
capsUUID: action.uuid,
capsName: action.name,
+ visibleProviders:
+ action.serverType !== SERVER_TYPES.REMOTE
+ ? _.union(state.visibleProviders, [action.serverType])
+ : state.visibleProviders,
};
- return omit(nextState, 'isCapsDirty');
+ return _.omit(nextState, 'isCapsDirty');
case SAVE_SESSION_REQUESTED:
nextState = {
...state,
saveSessionRequested: true,
};
- return omit(nextState, 'showSaveAsModal');
+ return _.omit(nextState, 'showSaveAsModal');
case SAVE_SESSION_DONE:
- return omit(state, ['saveSessionRequested', 'saveAsText']);
+ nextState = {
+ ...state,
+ isEditingDesiredCapsName: false,
+ isDuplicateCapsName: false,
+ };
+ return _.omit(nextState, ['saveSessionRequested', 'saveAsText']);
case GET_SAVED_SESSIONS_REQUESTED:
return {
@@ -191,7 +174,7 @@ export default function session(state = INITIAL_STATE, action) {
...state,
savedSessions: action.savedSessions || [],
};
- return omit(nextState, 'getSavedSessionsRequested');
+ return _.omit(nextState, 'getSavedSessionsRequested');
case DELETE_SAVED_SESSION_REQUESTED:
return {
@@ -220,7 +203,11 @@ export default function session(state = INITIAL_STATE, action) {
};
case HIDE_SAVE_AS_MODAL_REQUESTED:
- return omit(state, ['saveAsText', 'showSaveAsModal']);
+ nextState = {
+ ...state,
+ isDuplicateCapsName: false,
+ };
+ return _.omit(nextState, ['saveAsText', 'showSaveAsModal']);
case SET_SAVE_AS_TEXT:
return {
@@ -244,6 +231,7 @@ export default function session(state = INITIAL_STATE, action) {
[action.name]: action.value,
},
},
+ isCapsDirty: true,
};
case SET_SERVER:
@@ -267,13 +255,7 @@ export default function session(state = INITIAL_STATE, action) {
return nextServerState;
})(state.server, action.server),
},
- serverType: action.serverType || ServerTypes.local,
- };
-
- case SET_ATTACH_SESS_ID:
- return {
- ...state,
- attachSessId: action.attachSessId,
+ serverType: action.serverType || SERVER_TYPES.LOCAL,
};
case GET_SESSIONS_REQUESTED:
@@ -283,16 +265,10 @@ export default function session(state = INITIAL_STATE, action) {
};
case GET_SESSIONS_DONE: {
- const attachSessId = isAttachSessIdValid(action.sessions, state.attachSessId)
- ? state.attachSessId
- : null;
return {
...state,
gettingSessions: false,
- attachSessId:
- action.sessions && action.sessions.length > 0 && !attachSessId
- ? action.sessions[0].id
- : attachSessId,
+ attachSessId: action.sessions ? state.attachSessId : null,
runningAppiumSessions: action.sessions || [],
};
}
@@ -308,13 +284,13 @@ export default function session(state = INITIAL_STATE, action) {
return {
...state,
isEditingDesiredCapsName: false,
+ isDuplicateCapsName: false,
desiredCapsName: null,
};
case SAVE_DESIRED_CAPS_NAME:
return {
...state,
- isEditingDesiredCapsName: false,
capsName: action.name,
};
@@ -397,31 +373,48 @@ export default function session(state = INITIAL_STATE, action) {
case SET_STATE_FROM_URL:
return {
...state,
+ server: _.merge({}, state.server, action.state.server || {}),
+ ..._.omit(action.state, ['server']),
+ };
+
+ case SET_CAPABILITY_NAME_ERROR:
+ return {
+ ...state,
+ isDuplicateCapsName: true,
+ };
+
+ case SET_STATE_FROM_FILE:
+ return {
+ ...state,
+ // caps will always be defined as per parseSessionFileContents
+ caps: action.sessionJSON.caps.map((cap) => ({
+ id: getRandomId(),
+ enabled: true,
+ ...cap,
+ })),
+ // reset capsName since we now have an unnamed session
+ capsName: null,
server: {
...state.server,
- ...(action.state.server || {}),
+ ...action.sessionJSON.server,
},
- ...omit(action.state, ['server']),
- };
-
- case SET_STATE_FROM_SAVED:
- if (!Object.keys(ServerTypes).includes(action.state.serverType)) {
- notification.error({
- message: `Failed to load session: ${action.state.serverType} is not a valid server type`,
- });
- return state;
- }
- if (
- ![...state.visibleProviders, ServerTypes.local, ServerTypes.remote].includes(
- action.state.serverType,
- )
- ) {
- state.visibleProviders.push(action.state.serverType);
- }
- return {
- ...state,
- ...action.state,
- filePath: action.filePath,
+ serverType: action.sessionJSON.serverType,
+ visibleProviders: _.union(
+ state.visibleProviders,
+ action.sessionJSON.visibleProviders || [],
+ ),
+ };
+
+ case SESSION_UPLOAD_REQUESTED:
+ return {
+ ...state,
+ isUploadingSessionFiles: true,
+ };
+
+ case SESSION_UPLOAD_DONE:
+ return {
+ ...state,
+ isUploadingSessionFiles: false,
};
default:
diff --git a/app/renderer/reducers/Inspector.js b/app/common/renderer/reducers/SessionInspector.js
similarity index 79%
rename from app/renderer/reducers/Inspector.js
rename to app/common/renderer/reducers/SessionInspector.js
index 6be1301c67..e9051f9b15 100644
--- a/app/renderer/reducers/Inspector.js
+++ b/app/common/renderer/reducers/SessionInspector.js
@@ -1,19 +1,19 @@
-import {omit} from 'lodash';
+import _ from 'lodash';
import {
ADD_ASSIGNED_VAR_CACHE,
- CANCEL_PENDING_COMMAND,
CLEAR_ASSIGNED_VAR_CACHE,
CLEAR_COORD_ACTION,
CLEAR_RECORDING,
- CLEAR_SEARCHED_FOR_ELEMENT_BOUNDS,
CLEAR_SEARCH_RESULTS,
+ CLEAR_SEARCHED_FOR_ELEMENT_BOUNDS,
CLEAR_TAP_COORDINATES,
DELETE_SAVED_GESTURES_DONE,
DELETE_SAVED_GESTURES_REQUESTED,
- ENTERING_COMMAND_ARGS,
FINDING_ELEMENT_IN_SOURCE,
FINDING_ELEMENT_IN_SOURCE_COMPLETED,
+ GESTURE_UPLOAD_DONE,
+ GESTURE_UPLOAD_REQUESTED,
GET_FIND_ELEMENTS_TIMES,
GET_FIND_ELEMENTS_TIMES_COMPLETED,
GET_SAVED_GESTURES_DONE,
@@ -35,20 +35,21 @@ import {
SEARCHING_FOR_ELEMENTS_COMPLETED,
SELECT_CENTROID,
SELECT_ELEMENT,
- SELECT_HOVERED_CENTROID,
- SELECT_HOVERED_ELEMENT,
- SELECT_INTERACTION_MODE,
+ SELECT_INSPECTOR_TAB,
SELECT_TICK_ELEMENT,
SESSION_DONE,
- SET_ACTION_FRAMEWORK,
SET_APP_ID,
SET_APP_MODE,
+ SET_AUTO_SESSION_RESTART,
SET_AWAITING_MJPEG_STREAM,
- SET_COMMAND_ARG,
+ SET_CLIENT_FRAMEWORK,
SET_CONTEXT,
SET_COORD_END,
SET_COORD_START,
+ SET_CURRENT_DISPLAY_ID,
SET_EXPANDED_PATHS,
+ SET_FLAT_SESSION_CAPS,
+ SET_FOUND_DISPLAYS,
SET_GESTURE_TAP_COORDS_MODE,
SET_INTERACTIONS_NOT_AVAILABLE,
SET_KEEP_ALIVE_INTERVAL,
@@ -57,6 +58,9 @@ import {
SET_LOCATOR_TEST_ELEMENT,
SET_LOCATOR_TEST_STRATEGY,
SET_LOCATOR_TEST_VALUE,
+ SET_MJPEG_STATE,
+ SET_OPTIMAL_LOCATORS,
+ SET_REFRESHING_STATE,
SET_SCREENSHOT_INTERACTION_MODE,
SET_SEARCHED_FOR_ELEMENT_BOUNDS,
SET_SELECTED_ELEMENT_ID,
@@ -68,28 +72,24 @@ import {
SET_SIRI_COMMAND_VALUE,
SET_SOURCE_AND_SCREENSHOT,
SET_USER_WAIT_TIMEOUT,
- SET_VISIBLE_COMMAND_RESULT,
SHOW_GESTURE_ACTION,
SHOW_GESTURE_EDITOR,
SHOW_LOCATOR_TEST_MODAL,
SHOW_SIRI_COMMAND_MODAL,
START_RECORDING,
- TOGGLE_REFRESHING_STATE,
+ STORE_SESSION_SETTINGS,
TOGGLE_SHOW_ATTRIBUTES,
UNSELECT_CENTROID,
UNSELECT_ELEMENT,
- UNSELECT_HOVERED_CENTROID,
- UNSELECT_HOVERED_ELEMENT,
UNSELECT_TICK_ELEMENT,
-} from '../actions/Inspector';
+} from '../actions/SessionInspector.js';
+import {SCREENSHOT_INTERACTION_MODE} from '../constants/screenshot.js';
import {
APP_MODE,
- INTERACTION_MODE,
- SCREENSHOT_INTERACTION_MODE,
-} from '../components/Inspector/shared';
-
-const DEFAULT_FRAMEWORK = 'java';
-const NATIVE_APP = 'NATIVE_APP';
+ CLIENT_FRAMEWORKS,
+ INSPECTOR_TABS,
+ NATIVE_APP,
+} from '../constants/session-inspector.js';
const INITIAL_STATE = {
savedGestures: [],
@@ -104,8 +104,10 @@ const INITIAL_STATE = {
isSourceRefreshOn: true,
showBoilerplate: false,
recordedActions: [],
- actionFramework: DEFAULT_FRAMEWORK,
- sessionDetails: {},
+ clientFramework: CLIENT_FRAMEWORKS.JAVA_JUNIT4,
+ serverDetails: {},
+ sessionCaps: {},
+ sessionSettings: {},
isGestureEditorVisible: false,
isLocatorTestModalVisible: false,
isSiriCommandModalVisible: false,
@@ -117,32 +119,19 @@ const INITIAL_STATE = {
assignedVarCache: {},
screenshotInteractionMode: SCREENSHOT_INTERACTION_MODE.SELECT,
searchedForElementBounds: null,
- selectedInteractionMode: INTERACTION_MODE.SOURCE,
+ selectedInspectorTab: INSPECTOR_TABS.SOURCE,
appMode: APP_MODE.NATIVE,
- mjpegScreenshotUrl: null,
- pendingCommand: null,
findElementsExecutionTimes: [],
isFindingElementsTimes: false,
isFindingLocatedElementInSource: false,
- visibleCommandResult: null,
- visibleCommandMethod: null,
isAwaitingMjpegStream: true,
showSourceAttrs: false,
+ isUploadingGestureFiles: false,
+ autoSessionRestart: false,
};
let nextState;
-/**
- * Look up an element in the source with the provided path
- */
-function findElementByPath(path, source) {
- let selectedElement = source;
- for (let index of path.split('.')) {
- selectedElement = selectedElement.children[index];
- }
- return {...selectedElement};
-}
-
export default function inspector(state = INITIAL_STATE, action) {
switch (action.type) {
case SET_SOURCE_AND_SCREENSHOT:
@@ -152,7 +141,7 @@ export default function inspector(state = INITIAL_STATE, action) {
contextsError: action.contextsError,
currentContext: action.currentContext || NATIVE_APP,
currentContextError: action.currentContextError,
- source: action.source,
+ sourceJSON: action.sourceJSON,
sourceXML: action.sourceXML,
sourceError: action.sourceError,
screenshot: action.screenshot,
@@ -184,21 +173,29 @@ export default function inspector(state = INITIAL_STATE, action) {
case SELECT_ELEMENT:
return {
...state,
- selectedElement: findElementByPath(action.path, state.source),
- selectedElementPath: action.path,
+ selectedElement: action.selectedElement,
+ selectedElementPath: action.selectedElement.path,
+ selectedElementId: null,
selectedElementSearchInProgress: true,
elementInteractionsNotAvailable: false,
findElementsExecutionTimes: [],
};
+ case SET_OPTIMAL_LOCATORS:
+ return {
+ ...state,
+ selectedElement: {
+ ...state.selectedElement,
+ strategyMap: action.strategyMap,
+ },
+ };
+
case UNSELECT_ELEMENT:
return {
...state,
selectedElement: undefined,
selectedElementPath: null,
selectedElementId: null,
- selectedElementVariableName: null,
- selectedElementVariableType: null,
selectedElementSearchInProgress: false,
};
@@ -209,14 +206,12 @@ export default function inspector(state = INITIAL_STATE, action) {
};
case UNSELECT_CENTROID:
- return omit(state, 'selectedCentroid');
+ return _.omit(state, 'selectedCentroid');
case SET_SELECTED_ELEMENT_ID:
return {
...state,
selectedElementId: action.elementId,
- selectedElementVariableName: action.variableName,
- selectedElementVariableType: action.variableType,
selectedElementSearchInProgress: false,
findElementsExecutionTimes: [],
};
@@ -228,24 +223,6 @@ export default function inspector(state = INITIAL_STATE, action) {
selectedElementSearchInProgress: false,
};
- case SELECT_HOVERED_ELEMENT:
- return {
- ...state,
- hoveredElement: findElementByPath(action.path, state.source),
- };
-
- case UNSELECT_HOVERED_ELEMENT:
- return omit(state, 'hoveredElement');
-
- case SELECT_HOVERED_CENTROID:
- return {
- ...state,
- hoveredCentroid: action.path,
- };
-
- case UNSELECT_HOVERED_CENTROID:
- return omit(state, 'hoveredCentroid');
-
case METHOD_CALL_REQUESTED:
return {
...state,
@@ -283,10 +260,10 @@ export default function inspector(state = INITIAL_STATE, action) {
recordedActions: [],
};
- case SET_ACTION_FRAMEWORK:
+ case SET_CLIENT_FRAMEWORK:
return {
...state,
- actionFramework: action.framework || DEFAULT_FRAMEWORK,
+ clientFramework: action.framework,
};
case RECORD_ACTION:
@@ -313,14 +290,23 @@ export default function inspector(state = INITIAL_STATE, action) {
case SET_SHOW_BOILERPLATE:
return {...state, showBoilerplate: action.show};
- case SET_SESSION_DETAILS:
+ case SET_SESSION_DETAILS: {
+ const automationName = action.driver.capabilities.automationName;
return {
...state,
- sessionDetails: action.sessionDetails,
+ serverDetails: action.serverDetails,
driver: action.driver,
- automationName: action.driver.client.capabilities.automationName,
- appMode: action.mode,
- mjpegScreenshotUrl: action.mjpegScreenshotUrl,
+ sessionCaps: action.sessionCaps,
+ automationName: automationName && automationName.toLowerCase(),
+ appMode: action.appMode,
+ isUsingMjpegMode: action.isUsingMjpegMode,
+ };
+ }
+
+ case STORE_SESSION_SETTINGS:
+ return {
+ ...state,
+ sessionSettings: {...state.sessionSettings, ...action.sessionSettings},
};
case SHOW_LOCATOR_TEST_MODAL:
@@ -353,6 +339,18 @@ export default function inspector(state = INITIAL_STATE, action) {
siriCommandValue: action.siriCommandValue,
};
+ case SET_FOUND_DISPLAYS:
+ return {
+ ...state,
+ displays: action.displays,
+ };
+
+ case SET_CURRENT_DISPLAY_ID:
+ return {
+ ...state,
+ currentDisplayId: action.displayId,
+ };
+
case SET_LOCATOR_TEST_STRATEGY:
return {
...state,
@@ -420,6 +418,12 @@ export default function inspector(state = INITIAL_STATE, action) {
isFindingLocatedElementInSource: false,
};
+ case SET_MJPEG_STATE:
+ return {
+ ...state,
+ isUsingMjpegMode: action.targetMjpegState,
+ };
+
case SET_SCREENSHOT_INTERACTION_MODE:
return {
...state,
@@ -478,10 +482,10 @@ export default function inspector(state = INITIAL_STATE, action) {
showKeepAlivePrompt: false,
};
- case SELECT_INTERACTION_MODE:
+ case SELECT_INSPECTOR_TAB:
return {
...state,
- selectedInteractionMode: action.interaction,
+ selectedInspectorTab: action.interaction,
};
case SET_APP_MODE:
@@ -496,31 +500,6 @@ export default function inspector(state = INITIAL_STATE, action) {
showCentroids: action.show,
};
- case ENTERING_COMMAND_ARGS:
- return {
- ...state,
- pendingCommand: {
- commandName: action.commandName,
- command: action.command,
- args: [],
- },
- };
-
- case SET_COMMAND_ARG:
- return {
- ...state,
- pendingCommand: {
- ...state.pendingCommand,
- args: Object.assign([], state.pendingCommand.args, {[action.index]: action.value}), // Replace 'value' at 'index'
- },
- };
-
- case CANCEL_PENDING_COMMAND:
- return {
- ...state,
- pendingCommand: null,
- };
-
case SET_CONTEXT:
return {
...state,
@@ -545,13 +524,6 @@ export default function inspector(state = INITIAL_STATE, action) {
lastActiveMoment: action.lastActiveMoment,
};
- case SET_VISIBLE_COMMAND_RESULT:
- return {
- ...state,
- visibleCommandResult: action.result,
- visibleCommandMethod: action.methodName,
- };
-
case SET_SESSION_TIME:
return {
...state,
@@ -570,9 +542,27 @@ export default function inspector(state = INITIAL_STATE, action) {
status: action.status,
};
+ case SET_FLAT_SESSION_CAPS:
+ return {
+ ...state,
+ flatSessionCaps: action.flatSessionCaps,
+ };
+
case SET_AWAITING_MJPEG_STREAM:
return {...state, isAwaitingMjpegStream: action.isAwaiting};
+ case GESTURE_UPLOAD_REQUESTED:
+ return {
+ ...state,
+ isUploadingGestureFiles: true,
+ };
+
+ case GESTURE_UPLOAD_DONE:
+ return {
+ ...state,
+ isUploadingGestureFiles: false,
+ };
+
case SHOW_GESTURE_EDITOR:
return {
...state,
@@ -596,7 +586,7 @@ export default function inspector(state = INITIAL_STATE, action) {
...state,
savedGestures: action.savedGestures || [],
};
- return omit(nextState, 'getSavedGesturesRequested');
+ return _.omit(nextState, 'getSavedGesturesRequested');
case DELETE_SAVED_GESTURES_REQUESTED:
return {
@@ -605,7 +595,7 @@ export default function inspector(state = INITIAL_STATE, action) {
};
case DELETE_SAVED_GESTURES_DONE:
- return omit(state, 'deleteGesture');
+ return _.omit(state, 'deleteGesture');
case SET_LOADED_GESTURE:
return {
@@ -614,7 +604,7 @@ export default function inspector(state = INITIAL_STATE, action) {
};
case REMOVE_LOADED_GESTURE:
- return omit(state, 'loadedGesture');
+ return _.omit(state, 'loadedGesture');
case SHOW_GESTURE_ACTION:
return {
@@ -623,7 +613,7 @@ export default function inspector(state = INITIAL_STATE, action) {
};
case HIDE_GESTURE_ACTION:
- return omit(state, 'showGesture');
+ return _.omit(state, 'showGesture');
case SELECT_TICK_ELEMENT:
return {
@@ -632,7 +622,7 @@ export default function inspector(state = INITIAL_STATE, action) {
};
case UNSELECT_TICK_ELEMENT:
- return omit(state, 'selectedTick');
+ return _.omit(state, 'selectedTick');
case SET_GESTURE_TAP_COORDS_MODE:
return {
@@ -644,13 +634,19 @@ export default function inspector(state = INITIAL_STATE, action) {
};
case CLEAR_TAP_COORDINATES:
- return omit(state, 'tickCoordinates');
+ return _.omit(state, 'tickCoordinates');
case TOGGLE_SHOW_ATTRIBUTES:
return {...state, showSourceAttrs: !state.showSourceAttrs};
- case TOGGLE_REFRESHING_STATE:
- return {...state, isSourceRefreshOn: !state.isSourceRefreshOn};
+ case SET_REFRESHING_STATE:
+ return {...state, isSourceRefreshOn: action.refreshStates.source};
+
+ case SET_AUTO_SESSION_RESTART:
+ return {
+ ...state,
+ autoSessionRestart: action.autoSessionRestart,
+ };
default:
return {...state};
diff --git a/app/renderer/reducers/index.js b/app/common/renderer/reducers/index.js
similarity index 57%
rename from app/renderer/reducers/index.js
rename to app/common/renderer/reducers/index.js
index 5abbcf5416..75ecb7af1b 100644
--- a/app/renderer/reducers/index.js
+++ b/app/common/renderer/reducers/index.js
@@ -1,14 +1,12 @@
import {combineReducers} from '@reduxjs/toolkit';
-import inspector from './Inspector';
-import session from './Session';
-import updater from './Updater';
+import builder from './SessionBuilder.js';
+import inspector from './SessionInspector.js';
// create our root reducer
export default function createRootReducer() {
return combineReducers({
- session,
+ builder,
inspector,
- updater,
});
}
diff --git a/app/common/renderer/store.js b/app/common/renderer/store.js
new file mode 100644
index 0000000000..cc370f2bdc
--- /dev/null
+++ b/app/common/renderer/store.js
@@ -0,0 +1,20 @@
+import {configureStore} from '@reduxjs/toolkit';
+
+import actions from './actions/index.js';
+import createRootReducer from './reducers/index.js';
+
+const store = configureStore({
+ reducer: createRootReducer(),
+ middleware: (getDefaultMiddleware) =>
+ getDefaultMiddleware({
+ serializableCheck: false,
+ }),
+ devTools:
+ process.env.NODE_ENV !== 'development'
+ ? false
+ : {
+ actionCreators: {...actions},
+ },
+});
+
+export default store;
diff --git a/app/common/renderer/utils/attaching-to-session.js b/app/common/renderer/utils/attaching-to-session.js
new file mode 100644
index 0000000000..b8cc9e5f24
--- /dev/null
+++ b/app/common/renderer/utils/attaching-to-session.js
@@ -0,0 +1,116 @@
+import ky from 'ky';
+import _ from 'lodash';
+
+import {SERVER_TYPES} from '../constants/session-builder.js';
+
+class DefaultKeySessionCaps {
+ constructor(caps) {
+ this._caps = caps;
+ }
+
+ // sessionName is only populated for cloud providers
+ _fetchSessionName() {
+ return this._caps.sessionName;
+ }
+
+ _fetchDeviceIdentifier() {
+ return this._caps.deviceName || this._caps.avd || this._caps.udid;
+ }
+
+ _fetchPlatformInfo() {
+ if (this._caps.platformName) {
+ const platformInfo = this._caps.platformVersion
+ ? `${this._caps.platformName} ${this._caps.platformVersion}`
+ : this._caps.platformName;
+ // Capabilities may not have automationName for e.g. Selenium Grid
+ return this._caps.automationName
+ ? `${platformInfo} (${this._caps.automationName})`
+ : platformInfo;
+ }
+ return this._caps.automationName;
+ }
+
+ _fetchAppIdentifier() {
+ return this._caps.app || this._caps.bundleId || this._caps.appPackage;
+ }
+
+ assemble() {
+ return {
+ sessionName: this._fetchSessionName(),
+ deviceId: this._fetchDeviceIdentifier(),
+ platformInfo: this._fetchPlatformInfo(),
+ appId: this._fetchAppIdentifier(),
+ };
+ }
+}
+
+class TestMuAIKeySessionCaps extends DefaultKeySessionCaps {
+ constructor(caps) {
+ super('capabilities' in caps ? caps.capabilities : caps);
+ }
+
+ _fetchDeviceIdentifier() {
+ return 'desired' in this._caps ? this._caps.desired.deviceName : this._caps.deviceName;
+ }
+}
+
+const getKeySessionCaps = (caps, serverType) => {
+ switch (serverType) {
+ case SERVER_TYPES.TESTMUAI:
+ return new TestMuAIKeySessionCaps(caps);
+ default:
+ return new DefaultKeySessionCaps(caps);
+ }
+};
+
+export const getSessionInfo = (session, serverType) => {
+ let timestamp;
+ if ('created' in session && !_.isUndefined(session.created)) {
+ // Add the timestamp for Appium 3+ sessions
+ timestamp = new Date(session.created).toJSON();
+ }
+
+ const keyCaps = getKeySessionCaps(session.capabilities, serverType).assemble();
+
+ return {
+ id: session.id,
+ timestamp,
+ ...keyCaps,
+ };
+};
+
+// Make a session-related HTTP GET request to the provided Appium server URL
+export async function fetchSessionInformation({url, headers, ...params}) {
+ return await ky(url, {
+ headers: {
+ 'content-type': 'application/json; charset=utf-8',
+ ...headers,
+ },
+ ...params,
+ }).json();
+}
+
+export function formatSeleniumGridSessions(res) {
+ // Selenium Grid returns a more complex structure than Appium:
+ // it can have multiple nodes, each with multiple slots, which can then have a session.
+ // We extract any session details from this structure and package it into
+ // the same format returned by Appium
+ const formattedGridSessions = [];
+ const content = res.value ?? {};
+ const nodes = content.nodes ?? [];
+ for (const node of nodes) {
+ const slots = node.slots ?? [];
+ for (const slot of slots) {
+ const sessionDetails = slot.session;
+ if (_.isUndefined(sessionDetails?.capabilities?.['appium:automationName'])) {
+ // not a valid Appium 2+ session
+ continue;
+ }
+ formattedGridSessions.push({
+ id: sessionDetails.sessionId,
+ capabilities: sessionDetails.capabilities.desired,
+ });
+ }
+ }
+ return formattedGridSessions;
+}
diff --git a/app/common/renderer/utils/commands-tab.js b/app/common/renderer/utils/commands-tab.js
new file mode 100644
index 0000000000..eea8a688bc
--- /dev/null
+++ b/app/common/renderer/utils/commands-tab.js
@@ -0,0 +1,230 @@
+import _ from 'lodash';
+
+import {APPIUM_TO_WD_COMMANDS, COMMANDS_WITH_MISMATCHED_PARAMS} from '../constants/commands.js';
+
+/**
+ * Try to detect if the input value should be a boolean/number/array/object,
+ * and if so, convert it to that
+ *
+ * @param {string} value the value of a command parameter
+ * @returns the value converted to the type it matches best
+ */
+export function adjustParamValueType(value) {
+ if (value === '') {
+ return null;
+ } else if (Number(value).toString() === value) {
+ return Number(value);
+ } else if (['true', 'false'].includes(value)) {
+ return value === 'true';
+ } else {
+ try {
+ return JSON.parse(value);
+ } catch {
+ return value;
+ }
+ }
+}
+
+/**
+ * Filter the array of method key-value pairs to only include methods matching the search query.
+ *
+ * @param {[string, Object][]} methodPairs array of [methodName, methodDetails] pairs
+ * @param {string} searchQuery user-provided search query
+ * @returns filtered array of [methodName, methodDetails] pairs
+ */
+export function filterMethodPairs(methodPairs, searchQuery) {
+ if (!searchQuery) {
+ return methodPairs;
+ }
+ return _.filter(methodPairs, ([methodName]) =>
+ methodName.toLowerCase().includes(searchQuery.toLowerCase()),
+ );
+}
+
+/**
+ * Check if a value is an empty object or array ({} or [])
+ *
+ * @param {*} value any value (object, array, primitive)
+ * @returns whether the item is an empty object/array or not
+ */
+const isEmptyObject = (value) => _.isObjectLike(value) && _.isEmpty(value);
+
+/**
+ * Recursively remove key/value pairs (or array entries) whose values are empty objects or arrays.
+ * If this causes the parent object/array to become empty,
+ * this parent will be removed from its own parent as well.
+ *
+ * @param {*} value any value (object, array, primitive)
+ * @returns the value with empty entries removed
+ */
+export function deepFilterEmpty(value) {
+ if (_.isArray(value)) {
+ // Recurse into each array element, then remove empty entries
+ const recurse = (arr) => arr.map(deepFilterEmpty);
+ const clean = (arr) => arr.filter(_.negate(isEmptyObject));
+ const recurseAndClean = _.flow([recurse, clean]);
+ return recurseAndClean(value);
+ }
+
+ if (_.isPlainObject(value)) {
+ // Recurse into object properties, then pick only non-empty values
+ const recurse = (obj) => _.mapValues(obj, deepFilterEmpty);
+ const clean = (obj) => _.pickBy(obj, _.negate(isEmptyObject));
+ const recurseAndClean = _.flow([recurse, clean]);
+ return recurseAndClean(value);
+ }
+
+ // Return primitives as-is
+ return value;
+}
+
+/**
+ * Extract any parameter names (except sessionId) from a command path.
+ *
+ * @param {string} path command endpoint URL
+ * @returns array of parameter names
+ */
+export function extractParamsFromCommandPath(path) {
+ return path
+ .split('/')
+ .flatMap((segment) =>
+ segment.startsWith(':') && segment !== ':sessionId' ? [segment.slice(1)] : [],
+ );
+}
+
+/**
+ * Filter and transform the map of commands supported by the current driver using certain criteria:
+ * * Remove entries with empty values (similarly to {@link deepFilterEmpty})
+ * * Remove commands not supported by WDIO
+ *
+ * In addition to filtering, the map is modified to remove the base/driver/plugin scopes,
+ * the path and the HTTP method.
+ *
+ * @param {Object} cmdsResponse {@link https://github.com/appium/appium/blob/master/packages/types/lib/command-maps.ts `ListCommandsResponse`}
+ * @returns array of key-value pairs with command names and their details
+ */
+export function transformCommandsMap(cmdsResponse) {
+ let adjBaseCmdsMap = {},
+ adjDriverCmdsMap = {},
+ adjPluginCmdsMap = {};
+ // cmdsResponse: REST/BiDi to base/driver/plugins source map
+ // only use the REST commands for now
+ if (_.isEmpty(cmdsResponse) || !('rest' in cmdsResponse) || _.isEmpty(cmdsResponse.rest)) {
+ return [];
+ }
+ const restCmdsMap = cmdsResponse.rest;
+ // restCmdsMap: base/driver/plugins source to command paths/plugin names map
+ for (const source in restCmdsMap) {
+ if (source === 'plugins') {
+ const pluginNamesMap = restCmdsMap[source];
+ // pluginNamesMap: plugin names to plugin command paths map
+ for (const pluginName in pluginNamesMap) {
+ const pluginCmdsMap = pluginNamesMap[pluginName];
+ // pluginCmdsMap: plugin command paths to HTTP methods map
+ // Use spread operator to handle multiple plugins
+ adjPluginCmdsMap = {...adjPluginCmdsMap, ...transformInnerCommandsMap(pluginCmdsMap)};
+ }
+ } else {
+ const sourceCmdsMap = restCmdsMap[source];
+ // sourceCmdsMap: base/driver command paths to HTTP methods map
+ if (source === 'base') {
+ adjBaseCmdsMap = transformInnerCommandsMap(sourceCmdsMap);
+ } else if (source === 'driver') {
+ adjDriverCmdsMap = transformInnerCommandsMap(sourceCmdsMap);
+ }
+ }
+ }
+ // Merge all maps in a logical priority order
+ return _.toPairs({...adjBaseCmdsMap, ...adjDriverCmdsMap, ...adjPluginCmdsMap});
+}
+
+/**
+ * Filter and transform the map of execute methods supported by the current driver,
+ * by removing entries with empty values (similarly to {@link deepFilterEmpty})
+ *
+ * In addition to filtering, the map is modified to remove the driver/plugin scopes.
+ *
+ * @param {Object} execMethodsResponse {@link https://github.com/appium/appium/blob/master/packages/types/lib/command-maps.ts `ListExtensionsResponse`}
+ * @returns array of key-value pairs with execute method names and their details
+ */
+export function transformExecMethodsMap(execMethodsResponse) {
+ let adjExecMethodsMap = {};
+ // execMethodsResponse: REST to driver/plugins source map
+ if (
+ _.isEmpty(execMethodsResponse) ||
+ !('rest' in execMethodsResponse) ||
+ _.isEmpty(execMethodsResponse.rest)
+ ) {
+ return [];
+ }
+ const restExecMethodsMap = execMethodsResponse.rest;
+ // restExecMethodsMap: driver/plugins source to method names/execute methods map
+ for (const source in restExecMethodsMap) {
+ if (source === 'plugins') {
+ const pluginNamesMap = restExecMethodsMap[source];
+ // pluginNamesMap: plugin names to execute methods map
+ for (const pluginName in pluginNamesMap) {
+ const pluginExecMethodsMap = pluginNamesMap[pluginName];
+ // pluginExecMethodsMap: plugin execute method names to method details map
+ // Any plugin execute methods should override driver ones if there are name conflicts
+ adjExecMethodsMap = {...adjExecMethodsMap, ...deepFilterEmpty(pluginExecMethodsMap)};
+ }
+ } else if (source === 'driver') {
+ const driverExecMethodsMap = restExecMethodsMap[source];
+ // driverExecMethodsMap: driver execute method names to method details map
+ // Any plugin execute methods should override driver ones if there are name conflicts
+ adjExecMethodsMap = {...deepFilterEmpty(driverExecMethodsMap), ...adjExecMethodsMap};
+ }
+ }
+ return _.toPairs(adjExecMethodsMap);
+}
+
+/**
+ * Filter and transform a given map of command paths/methods/details.
+ *
+ * @param {Object} pathsToCmdsMap map of command paths to their HTTP methods and details
+ * @returns flat map of command names to their details
+ */
+function transformInnerCommandsMap(pathsToCmdsMap) {
+ const transformedMap = {};
+ for (const path in pathsToCmdsMap) {
+ const pathsCmdsMap = pathsToCmdsMap[path];
+ // pathsCmdsMap: HTTP methods to commands map
+ for (const method in pathsCmdsMap) {
+ // Skip commands that don't have the command name
+ if (_.isEmpty(pathsCmdsMap[method]) || !('command' in pathsCmdsMap[method])) {
+ continue;
+ }
+ const cmdName = pathsCmdsMap[method].command;
+ // Skip commands not supported by WDIO
+ if (!(cmdName in APPIUM_TO_WD_COMMANDS)) {
+ continue;
+ }
+ // Filter out any entries with empty values
+ const commandDetails = deepFilterEmpty(pathsCmdsMap[method]);
+ // If we have multiple entries for the same method name in the same source (e.g. /execute
+ // and /execute/sync in Appium 2 are both named 'execute'), skip any deprecated entries
+ if (APPIUM_TO_WD_COMMANDS[cmdName] in transformedMap && 'deprecated' in commandDetails) {
+ continue;
+ }
+ // Some commands require parameter adjustments due to WDIO method signature differences
+ if (cmdName in COMMANDS_WITH_MISMATCHED_PARAMS) {
+ commandDetails.params = COMMANDS_WITH_MISMATCHED_PARAMS[cmdName];
+ }
+ // For commands that include additional parameters in the path (e.g. /session/:sessionId/element/:elementId),
+ // WDIO includes them in the method itself, so we need to extract their names from the path
+ // and add them to the start of the parameters array
+ const commandPathParamNames = extractParamsFromCommandPath(path);
+ if (commandPathParamNames.length > 0) {
+ const commandPathParamEntries = commandPathParamNames.map((paramName) => ({
+ name: paramName,
+ required: true,
+ }));
+ commandDetails.params = [...commandPathParamEntries, ...(commandDetails.params || [])];
+ }
+ // Add the adjusted command details to the result map, using the WDIO command name.
+ transformedMap[APPIUM_TO_WD_COMMANDS[cmdName]] = commandDetails;
+ }
+ }
+ return transformedMap;
+}
diff --git a/app/common/renderer/utils/file-handling.js b/app/common/renderer/utils/file-handling.js
new file mode 100644
index 0000000000..a7b1cfec78
--- /dev/null
+++ b/app/common/renderer/utils/file-handling.js
@@ -0,0 +1,32 @@
+export function downloadFile(href, filename) {
+ let element = document.createElement('a');
+ element.setAttribute('href', href);
+ element.setAttribute('download', filename);
+ element.style.display = 'none';
+
+ document.body.appendChild(element);
+ element.click();
+
+ document.body.removeChild(element);
+}
+
+export async function readTextFromUploadedFiles(fileList) {
+ const fileReaderPromise = fileList.map((file) => {
+ const reader = new FileReader();
+ return new Promise((resolve) => {
+ reader.onload = (event) =>
+ resolve({
+ fileName: file.name,
+ content: event.target.result,
+ });
+ reader.onerror = (error) => {
+ resolve({
+ fileName: file.name,
+ error: error.message,
+ });
+ };
+ reader.readAsText(file);
+ });
+ });
+ return await Promise.all(fileReaderPromise);
+}
diff --git a/app/common/renderer/utils/gesturefile-parsing.js b/app/common/renderer/utils/gesturefile-parsing.js
new file mode 100644
index 0000000000..50078be23b
--- /dev/null
+++ b/app/common/renderer/utils/gesturefile-parsing.js
@@ -0,0 +1,150 @@
+import _ from 'lodash';
+
+import {POINTER_TYPES} from '../constants/gestures.js';
+import {log} from './logger.js';
+
+/**
+ * Parses the gesture file contents in JSON and runs validation checks for the JSON contents.
+ *
+ * @param {string} gestureFileString Gesture file contents as a string
+ * @returns {object|null} Gesture file in JSON format, or null if any validations failed
+ */
+export function parseGestureFileContents(gestureFileString) {
+ let gestureJSON;
+ try {
+ gestureJSON = JSON.parse(gestureFileString);
+ } catch {
+ log.error(`Error parsing gesture file: file is not valid JSON`);
+ return null;
+ }
+ return validateGestureJSON(gestureJSON);
+}
+
+/**
+ * Validates the properties of a gesture file JSON object.
+ *
+ * @param {object} gestureJSON Gesture file contents in JSON
+ * @returns {object|null} Validated JSON, or null if any validations failed
+ */
+export function validateGestureJSON(gestureJSON) {
+ if (
+ !gestureJSON ||
+ !objectHasStringProperty(gestureJSON, 'name') ||
+ !objectHasStringProperty(gestureJSON, 'description') ||
+ !areGestureActionsValid(gestureJSON)
+ ) {
+ return null;
+ }
+ return gestureJSON;
+}
+
+/**
+ * Checks if the actions field in the gesture file is valid.
+ *
+ * @param {object} gestureJSON Gesture file contents in JSON
+ * @returns {boolean} True if the actions field is valid, otherwise false
+ */
+function areGestureActionsValid(gestureJSON) {
+ if (!('actions' in gestureJSON && _.isArray(gestureJSON.actions))) {
+ return logValidationError("'actions' property is missing or not an array");
+ }
+ for (const action of gestureJSON.actions) {
+ if (!_.isPlainObject(action)) {
+ return logValidationError(`action '${JSON.stringify(action)}' is not an object`);
+ }
+ for (const actionProp of ['name', 'color', 'id']) {
+ if (!objectHasStringProperty(action, actionProp, `action '${JSON.stringify(action)}' `)) {
+ return false;
+ }
+ }
+ if (!/^#[0-9A-F]{6}$/i.test(action.color)) {
+ return logValidationError(
+ `action '${JSON.stringify(action)}' color '${action.color}' is not a valid hex color`,
+ );
+ }
+ if (!('ticks' in action && _.isArray(action.ticks))) {
+ return logValidationError(
+ `action '${JSON.stringify(action)}' 'ticks' property is missing or not an array`,
+ );
+ }
+ for (const tick of action.ticks) {
+ if (!isActionTickValid(tick)) {
+ return false;
+ }
+ }
+ }
+ return true;
+}
+
+/**
+ * Checks if a tick object in an action is valid.
+ *
+ * @param {object} tickJSON Tick object in the gesture file
+ * @returns {boolean} True if the tick is valid, otherwise false
+ */
+function isActionTickValid(tickJSON) {
+ if (!_.isPlainObject(tickJSON)) {
+ return logValidationError(`tick '${JSON.stringify(tickJSON)}' is not an object`);
+ }
+ if (!objectHasStringProperty(tickJSON, 'id', `tick '${JSON.stringify(tickJSON)}' `)) {
+ return false;
+ }
+ // allow empty ticks
+ if (!tickJSON.type) {
+ return true;
+ }
+ switch (tickJSON.type) {
+ case POINTER_TYPES.POINTER_MOVE:
+ return arePointerPropertiesValid(tickJSON, ['x', 'y', 'duration']);
+ case POINTER_TYPES.POINTER_UP:
+ case POINTER_TYPES.POINTER_DOWN:
+ return arePointerPropertiesValid(tickJSON, ['button']);
+ case POINTER_TYPES.PAUSE:
+ return arePointerPropertiesValid(tickJSON, ['duration']);
+ default:
+ return logValidationError(
+ `tick '${JSON.stringify(tickJSON)}' has unsupported type '${tickJSON.type}'`,
+ );
+ }
+}
+
+/**
+ * Checks if the required pointer properties exist and are numbers in a tick object.
+ *
+ * @param {object} tickJSON Tick object in the gesture file
+ * @param {string[]} propsArray Array of required property names
+ * @returns {boolean} True if all properties are valid, otherwise false
+ */
+function arePointerPropertiesValid(tickJSON, propsArray) {
+ for (const tickProp of propsArray) {
+ if (!(tickProp in tickJSON && typeof tickJSON[tickProp] === 'number')) {
+ return logValidationError(
+ `tick '${JSON.stringify(tickJSON)}' property '${tickProp}' is missing or not a number`,
+ );
+ }
+ }
+ return true;
+}
+
+/**
+ * Checks if an object has a property that is a non-empty string.
+ *
+ * @param {object} object The object to check
+ * @param {string} propName The property name to check
+ * @param {string} [prefix] Optional prefix for error messages
+ * @returns {boolean} True if the property exists and is a non-empty string, otherwise false
+ */
+function objectHasStringProperty(object, propName, prefix = '') {
+ if (!(propName in object && typeof object[propName] === 'string')) {
+ return logValidationError(`${prefix}'${propName}' property is missing or not a string`);
+ }
+ if (object[propName].trim().length === 0) {
+ return logValidationError(`${prefix}'${propName}' property is empty or only whitespace`);
+ }
+ return true;
+}
+
+function logValidationError(text) {
+ log.error(`Error validating gesture file: ${text}`);
+ return false;
+}
diff --git a/app/common/renderer/utils/locator-generation/base.js b/app/common/renderer/utils/locator-generation/base.js
new file mode 100644
index 0000000000..810f539b52
--- /dev/null
+++ b/app/common/renderer/utils/locator-generation/base.js
@@ -0,0 +1,56 @@
+import {log} from '../logger.js';
+
+/**
+ * Base class for locator generators providing shared utilities for uniqueness checking and error logging
+ */
+export class LocatorGeneratorBase {
+ /**
+ * @param {Document} doc - the document containing the DOM
+ * @param {Node} domNode - the DOM node to generate locators for
+ * @param {Node | null} [contextNode] - optional context node to scope locator evaluation
+ */
+ constructor(doc, domNode, contextNode = null) {
+ this._doc = doc;
+ this._domNode = domNode;
+ this._contextNode = contextNode;
+ // We only use contextNode as the direct parent of domNode, so all axes will be '/'
+ this._nodeAxis = this._contextNode ? '/' : '//';
+ }
+
+ /**
+ * Get sibling nodes with the same tag name
+ *
+ * @param {Node} targetNode - the node to find siblings for, defaults to the main DOM node if not provided
+ * @returns {Node[]} array of sibling nodes with the same tag name
+ */
+ _getSiblingsWithSameTag(targetNode = this._domNode) {
+ if (!targetNode.parentNode) {
+ return [];
+ }
+ return Array.prototype.slice
+ .call(targetNode.parentNode.childNodes, 0)
+ .filter((childNode) => childNode.nodeType === 1 && childNode.tagName === targetNode.tagName);
+ }
+
+ /**
+ * Check if a node is a valid element node
+ *
+ * @param {Node} targetNode - the node to check, defaults to the main DOM node if not provided
+ * @returns {boolean} true if the node is a valid element
+ */
+ _isValidElementNode(targetNode = this._domNode) {
+ return targetNode?.tagName && targetNode?.nodeType === 1;
+ }
+
+ /**
+ * Log an error when a locator strategy fails
+ *
+ * @param {string} strategy - the locator strategy name
+ * @param {Error} error - the error that occurred
+ */
+ _logLocatorError(strategy, error) {
+ log.error(
+ `The most optimal ${strategy} could not be determined because an error was thrown: '${error}'`,
+ );
+ }
+}
diff --git a/app/common/renderer/utils/locator-generation/class-chain.js b/app/common/renderer/utils/locator-generation/class-chain.js
new file mode 100644
index 0000000000..6d5bb86269
--- /dev/null
+++ b/app/common/renderer/utils/locator-generation/class-chain.js
@@ -0,0 +1,151 @@
+import _ from 'lodash';
+import {select as xpathSelect} from 'xpath';
+
+import {LocatorGeneratorBase} from './base.js';
+
+/**
+ * Generator for iOS Class Chain locators
+ * @private
+ */
+class ClassChainGenerator extends LocatorGeneratorBase {
+ // Attributes to check when generating class chain locators
+ static CHECKED_ATTRIBUTES = ['name', 'label', 'value'];
+
+ /**
+ * Get an optimal class chain for a Node
+ *
+ * @returns {string|null}
+ */
+ generate() {
+ try {
+ // If this isn't an element or is XCUIElementTypeApplication, return empty string
+ if (this._cannotProcessNode()) {
+ return '';
+ }
+
+ // Try to find a class chain based on attributes
+ const attributeBasedChain = this._tryAttributeBasedClassChain();
+ if (attributeBasedChain) {
+ return attributeBasedChain;
+ }
+
+ // Fall back to hierarchical class chain based on DOM position
+ return this._buildHierarchicalClassChain();
+ } catch (error) {
+ this._logLocatorError('class chain', error);
+ return null;
+ }
+ }
+
+ /**
+ * Check if the node can be processed for class chain generation
+ *
+ * @returns {boolean} true if the node cannot be processed
+ */
+ _cannotProcessNode() {
+ return !this._isValidElementNode() || this._domNode.tagName === 'XCUIElementTypeApplication';
+ }
+
+ /**
+ * Build a class chain expression from a single attribute
+ *
+ * @param {string} attrName - the attribute name
+ * @param {string} attrValue - the attribute value
+ * @returns {string} the class chain expression
+ */
+ _buildClassChainFromAttribute(attrName, attrValue) {
+ const tagName = this._domNode.tagName || '*';
+ return `/${tagName}[\`${attrName} == "${attrValue}"\`]`;
+ }
+
+ /**
+ * Build an XPath expression to check uniqueness of an attribute
+ *
+ * @param {string} attrName - the attribute name
+ * @param {string} attrValue - the attribute value
+ * @returns {string} the XPath expression
+ */
+ _buildUniquenessXPath(attrName, attrValue) {
+ const tagName = this._domNode.tagName || '*';
+ return `//${tagName}[@${attrName}="${attrValue}"]`;
+ }
+
+ /**
+ * Build a class chain with index qualifier for non-unique matches
+ *
+ * @param {string} classChain - the base class chain
+ * @param {number} index - the index of the node in the matching set
+ * @returns {string} the class chain with index qualifier
+ */
+ _buildClassChainWithIndex(classChain, index) {
+ return `${classChain}[${index + 1}]`;
+ }
+
+ /**
+ * Try to find a unique class chain based on attributes
+ *
+ * @returns {string|undefined} the class chain if found, undefined otherwise
+ */
+ _tryAttributeBasedClassChain() {
+ for (const attrName of ClassChainGenerator.CHECKED_ATTRIBUTES) {
+ const attrValue = this._domNode.getAttribute(attrName);
+ if (_.isEmpty(attrValue)) {
+ continue;
+ }
+
+ const xpath = this._buildUniquenessXPath(attrName, attrValue);
+ let othersWithAttr;
+
+ // If the XPath does not parse, move to the next attribute
+ try {
+ othersWithAttr = xpathSelect(xpath, this._doc);
+ } catch {
+ continue;
+ }
+
+ // Build the class chain from this attribute
+ let classChain = this._buildClassChainFromAttribute(attrName, attrValue);
+
+ // If the attribute isn't unique, add index qualifier
+ if (othersWithAttr.length > 1) {
+ const index = othersWithAttr.indexOf(this._domNode);
+ classChain = this._buildClassChainWithIndex(classChain, index);
+ }
+
+ return classChain;
+ }
+
+ return undefined;
+ }
+
+ /**
+ * Build a hierarchical class chain based on the node's position in the DOM tree
+ *
+ * @returns {string} hierarchical class chain for this node
+ */
+ _buildHierarchicalClassChain() {
+ let classChain = `/${this._domNode.tagName}`;
+ const siblings = this._getSiblingsWithSameTag();
+
+ // Add index if there are multiple siblings with the same tag
+ if (siblings.length > 1) {
+ const index = siblings.indexOf(this._domNode);
+ classChain += `[${index + 1}]`;
+ }
+
+ // Recursively build parent path and prepend it
+ const parentGenerator = new ClassChainGenerator(this._doc, this._domNode.parentNode);
+ return parentGenerator.generate() + classChain;
+ }
+}
+
+/**
+ * Get an optimal class chain for a Node
+ *
+ * @param {Document} doc
+ * @param {Node} domNode
+ * @returns {string|null}
+ */
+export function getOptimalClassChain(doc, domNode) {
+ return new ClassChainGenerator(doc, domNode).generate();
+}
diff --git a/app/common/renderer/utils/locator-generation/common.js b/app/common/renderer/utils/locator-generation/common.js
new file mode 100644
index 0000000000..ec5ff3a303
--- /dev/null
+++ b/app/common/renderer/utils/locator-generation/common.js
@@ -0,0 +1,71 @@
+import _ from 'lodash';
+
+import {DRIVERS} from '../../constants/common.js';
+import {findDOMNodeByPath, xmlToDOM} from '../source-parsing.js';
+import {getOptimalClassChain} from './class-chain.js';
+import {getOptimalPredicateString} from './predicate.js';
+import {getSimpleSuggestedLocators} from './simple.js';
+import {getOptimalUiAutomatorSelector} from './uiautomator.js';
+import {getOptimalXPath} from './xpath.js';
+
+/**
+ * Get suggested selectors for all locator strategies
+ *
+ * @param {object} selectedElement element node in JSON format
+ * @param {string} sourceXML
+ * @param {boolean} isNative whether native context is active
+ * @param {string} automationName
+ * @returns {Array<[string, string]>} array of tuples, consisting of the locator strategy and selector
+ */
+export function getSuggestedLocators(selectedElement, sourceXML, isNative, automationName) {
+ const simpleLocElementProps = {
+ tag: selectedElement.tagName,
+ attributes: selectedElement.attributes,
+ };
+ const sourceDoc = xmlToDOM(sourceXML);
+ const simpleLocators = getSimpleSuggestedLocators(simpleLocElementProps, sourceDoc, isNative);
+ const complexLocators = getComplexSuggestedLocators(
+ selectedElement.path,
+ sourceDoc,
+ isNative,
+ automationName,
+ );
+ return _.toPairs({...simpleLocators, ...complexLocators});
+}
+
+/**
+ * Get suggested selectors for complex locator strategies (multiple attributes, axes, etc.)
+ *
+ * @param {string} path a dot-separated string of indices
+ * @param {Document} sourceDoc
+ * @param {boolean} isNative whether native context is active
+ * @param {string} automationName
+ * @returns {Record} mapping of strategies to selectors
+ */
+export function getComplexSuggestedLocators(path, sourceDoc, isNative, automationName) {
+ let complexLocators = {};
+ const domNode = findDOMNodeByPath(path, sourceDoc);
+ if (isNative) {
+ switch (automationName) {
+ case DRIVERS.XCUITEST:
+ case DRIVERS.MAC2: {
+ const optimalClassChain = getOptimalClassChain(sourceDoc, domNode);
+ complexLocators['-ios class chain'] = optimalClassChain ? '**' + optimalClassChain : null;
+ complexLocators['-ios predicate string'] = getOptimalPredicateString(sourceDoc, domNode);
+ break;
+ }
+ case DRIVERS.UIAUTOMATOR2: {
+ complexLocators['-android uiautomator'] = getOptimalUiAutomatorSelector(
+ sourceDoc,
+ domNode,
+ path,
+ );
+ break;
+ }
+ }
+ }
+ complexLocators.xpath = getOptimalXPath(sourceDoc, domNode);
+
+ // Remove entries for locators where the optimal selector could not be found
+ return _.omitBy(complexLocators, _.isNil);
+}
diff --git a/app/common/renderer/utils/locator-generation/predicate.js b/app/common/renderer/utils/locator-generation/predicate.js
new file mode 100644
index 0000000000..64ea156176
--- /dev/null
+++ b/app/common/renderer/utils/locator-generation/predicate.js
@@ -0,0 +1,72 @@
+import _ from 'lodash';
+import {select as xpathSelect} from 'xpath';
+
+import {LocatorGeneratorBase} from './base.js';
+
+/**
+ * Generator for iOS Predicate String locators
+ * @private
+ */
+class PredicateStringGenerator extends LocatorGeneratorBase {
+ // Attributes to check when generating predicate string locators
+ static CHECKED_ATTRIBUTES = ['name', 'label', 'value', 'type'];
+
+ /**
+ * Get an optimal predicate string for a Node
+ * Only works for a single element - no parent/child scope
+ *
+ * @returns {string|null}
+ */
+ generate() {
+ try {
+ // BASE CASE #1: If this isn't an element, or we're above the root, return empty string
+ if (!this._isValidElementNode()) {
+ return '';
+ }
+
+ // BASE CASE #2: Check all attributes and try to find the best way
+ let xpathAttributes = [];
+ let predicateString = [];
+ let othersWithAttr;
+
+ for (const attrName of PredicateStringGenerator.CHECKED_ATTRIBUTES) {
+ const attrValue = this._domNode.getAttribute(attrName);
+ if (_.isEmpty(attrValue)) {
+ continue;
+ }
+
+ xpathAttributes.push(`@${attrName}="${attrValue}"`);
+ const xpath = `//*[${xpathAttributes.join(' and ')}]`;
+ predicateString.push(`${attrName} == "${attrValue}"`);
+
+ // If the XPath does not parse, move to the next attribute
+ try {
+ othersWithAttr = xpathSelect(xpath, this._doc);
+ } catch {
+ continue;
+ }
+
+ // Return as soon as the accumulated attribute combination is unique
+ if (othersWithAttr.length === 1) {
+ return predicateString.join(' AND ');
+ }
+ }
+ } catch (error) {
+ // If there's an unexpected exception, abort
+ this._logLocatorError('predicate string', error);
+ return null;
+ }
+ }
+}
+
+/**
+ * Get an optimal predicate string for a Node
+ * Only works for a single element - no parent/child scope
+ *
+ * @param {Document} doc
+ * @param {Node} domNode
+ * @returns {string|null}
+ */
+export function getOptimalPredicateString(doc, domNode) {
+ return new PredicateStringGenerator(doc, domNode).generate();
+}
diff --git a/app/common/renderer/utils/locator-generation/simple.js b/app/common/renderer/utils/locator-generation/simple.js
new file mode 100644
index 0000000000..2f16393e01
--- /dev/null
+++ b/app/common/renderer/utils/locator-generation/simple.js
@@ -0,0 +1,159 @@
+import cssEscape from 'css.escape';
+import _ from 'lodash';
+import XPath from 'xpath';
+
+import {LOCATOR_STRATEGIES as STRATS} from '../../constants/session-inspector.js';
+
+/**
+ * Generator for simple locator strategies in both native and webview contexts
+ * @private
+ */
+class SimpleLocatorGenerator {
+ // Map of native element attributes to their matching simple (optimal) locator strategies
+ static NATIVE_STRATEGY_MAP = [
+ ['name', STRATS.ACCESSIBILITY_ID],
+ ['content-desc', STRATS.ACCESSIBILITY_ID],
+ ['id', STRATS.ID],
+ ['rntestid', STRATS.ID],
+ ['resource-id', STRATS.ID],
+ ['class', STRATS.CLASS_NAME],
+ ['type', STRATS.CLASS_NAME],
+ ];
+
+ /**
+ * @param {Record} elementProps relevant element properties
+ * @param {Document} sourceDoc - the source document
+ */
+ constructor(elementProps, sourceDoc) {
+ this._doc = sourceDoc;
+ this._tag = elementProps.tag;
+ this._attributes = elementProps.attributes;
+ }
+
+ /**
+ * Get suggested selectors for simple locator strategies in native context:
+ * id, class name, and accessibility id
+ *
+ * @returns {Record} mapping of native strategies to selectors
+ */
+ generateNativeSelectors() {
+ return SimpleLocatorGenerator.NATIVE_STRATEGY_MAP.reduce((res, [strategyAlias, strategy]) => {
+ const value = this._attributes?.[strategyAlias];
+ if (value && areAttrAndValueUnique(strategyAlias, value, this._doc)) {
+ res[strategy] = value;
+ }
+ return res;
+ }, {});
+ }
+
+ /**
+ * Get suggested selectors for simple locator strategies in webview context:
+ * id (css) and tag name
+ *
+ * @returns {Record} mapping of web strategies to selectors
+ */
+ generateWebSelectors() {
+ const webStrategyMap = {};
+ // id (css)
+ const idValue = this._attributes?.id;
+ if (idValue && areAttrAndValueUnique('id', idValue, this._doc)) {
+ webStrategyMap[STRATS.CSS] = `#${cssEscape(idValue)}`;
+ }
+ // tag name
+ if (isTagUnique(this._tag, this._doc)) {
+ webStrategyMap[STRATS.TAG_NAME] = this._tag;
+ }
+ return webStrategyMap;
+ }
+}
+
+/**
+ * Get suggested selectors for simple locator strategies (which match a specific attribute)
+ *
+ * @param {Record} elementProps relevant element properties
+ * @param {Document} sourceDoc
+ * @param {boolean} [isNative=true] whether native context is active
+ * @returns {Record} mapping of strategies to selectors
+ */
+export function getSimpleSuggestedLocators(elementProps, sourceDoc, isNative = true) {
+ const simpleLocGen = new SimpleLocatorGenerator(elementProps, sourceDoc);
+ return isNative ? simpleLocGen.generateNativeSelectors() : simpleLocGen.generateWebSelectors();
+}
+
+/**
+ * Check whether the provided tag is unique in the source.
+ * Applies whitespace normalization to the input tag name,
+ * since they cannot have spaces
+ *
+ * @param {string} tagName
+ * @param {Document} node
+ * @returns {boolean}
+ */
+export function isTagUnique(tagName, node) {
+ if (!doesDocumentExist(node)) {
+ return true;
+ }
+ const trimmedTagName = toTrimmedString(tagName);
+ if (!trimmedTagName) {
+ return false;
+ }
+ return isXpathUnique('//*[name()=$tagName]', {variables: {tagName: trimmedTagName}, node});
+}
+
+/**
+ * Check whether the provided attribute & value are unique in the source
+ * Applies whitespace normalization to the attribute name,
+ * since they cannot have spaces
+ *
+ * @param {string} attrName
+ * @param {string} attrValue
+ * @param {Document} node
+ * @returns {boolean}
+ */
+export function areAttrAndValueUnique(attrName, attrValue, node) {
+ if (!doesDocumentExist(node)) {
+ return true;
+ }
+ const trimmedAttrName = toTrimmedString(attrName);
+ if (!trimmedAttrName || !toTrimmedString(attrValue)) {
+ return false;
+ }
+ // if node exists, that means xmlToDOM was called, which already validates attribute names,
+ // so the attribute name is safe to use directly
+ return isXpathUnique(`//*[@${trimmedAttrName}=$attrValue]`, {variables: {attrValue}, node});
+}
+
+/**
+ * Trim whitespace from a string value,
+ * otherwise return an empty string
+ *
+ * @param {*} value input value
+ * @returns {string} trimmed string
+ */
+function toTrimmedString(value) {
+ return typeof value === 'string' ? value.trim() : '';
+}
+
+/**
+ * Convenience check for whether the document node exists
+ *
+ * @param {Document | undefined} node document node
+ * @returns {boolean}
+ */
+function doesDocumentExist(node) {
+ // If no node provided, assume the xpath is unique
+ return Boolean(node) && !_.isEmpty(node);
+}
+
+/**
+ * Parse and evaluate an xpath using the built-in safe variable replacement,
+ * then check whether it finds exactly one element
+ *
+ * @param {string} xpath
+ * @param {Record} options options for XPathEvaluator
+ * @see https://github.com/goto100/xpath/blob/master/docs/XPathEvaluator.md
+ * @returns {boolean}
+ */
+function isXpathUnique(xpath, options) {
+ return XPath.parse(xpath).select(options).length === 1;
+}
diff --git a/app/common/renderer/utils/locator-generation/uiautomator.js b/app/common/renderer/utils/locator-generation/uiautomator.js
new file mode 100644
index 0000000000..8f7b9d1b68
--- /dev/null
+++ b/app/common/renderer/utils/locator-generation/uiautomator.js
@@ -0,0 +1,206 @@
+import _ from 'lodash';
+import {select as xpathSelect} from 'xpath';
+
+import {childNodesOf, domToXML, findDOMNodeByPath, xmlToDOM} from '../source-parsing.js';
+import {LocatorGeneratorBase} from './base.js';
+
+/**
+ * Generator for Android UiAutomator locators
+ * @private
+ */
+class UiAutomatorGenerator extends LocatorGeneratorBase {
+ // Map of element attributes to their UiAutomator syntax, ordered by (likely) decreasing uniqueness
+ static CHECKED_ATTRIBUTES = [
+ ['resource-id', 'resourceId'],
+ ['text', 'text'],
+ ['content-desc', 'description'],
+ ['class', 'className'],
+ ];
+
+ /**
+ * @param {Document} doc - the document containing the DOM
+ * @param {Node} domNode - the DOM node to generate locators for
+ * @param {string} path - a dot-separated string of indices
+ */
+ constructor(doc, domNode, path) {
+ super(doc, domNode);
+ this._path = path;
+ }
+
+ /**
+ * Get an optimal UiAutomator selector for a Node
+ * Only works for elements inside the last direct child of the hierarchy (xpath: /hierarchy/*[last()] )
+ *
+ * @returns {string|null}
+ */
+ generate() {
+ try {
+ // If this isn't an element, return empty string
+ if (!this._isValidElementNode()) {
+ return '';
+ }
+
+ // Check if element is in the last hierarchy child
+ if (!this._isInLastHierarchyChild()) {
+ return null;
+ }
+
+ // Create a new document scope with only the last hierarchy child
+ const {newDoc, newDomNode} = this._createLastHierarchyChildScope();
+
+ // Try to find a unique UiAutomator selector
+ return this._tryFindUniqueSelector(newDoc, newDomNode);
+ } catch (error) {
+ this._logLocatorError('uiautomator selector', error);
+ return null;
+ }
+ }
+
+ /**
+ * Get the hierarchy children from the document
+ *
+ * @returns {Node[]} array of hierarchy children
+ */
+ _getHierarchyChildren() {
+ const docChildren = childNodesOf(this._doc);
+ if (_.isEmpty(docChildren)) {
+ return [];
+ }
+ const hierarchyChildren = childNodesOf(docChildren[0]);
+ return hierarchyChildren || [];
+ }
+
+ /**
+ * Check if the element is in the last hierarchy child
+ *
+ * @returns {boolean} true if element is in the last hierarchy child
+ */
+ _isInLastHierarchyChild() {
+ const hierarchyChildren = this._getHierarchyChildren();
+ if (_.isEmpty(hierarchyChildren)) {
+ return false;
+ }
+
+ const lastHierarchyChildIndex = (hierarchyChildren.length - 1).toString();
+ const pathArray = this._path.split('.');
+ const requestedHierarchyChildIndex = pathArray[0];
+
+ return requestedHierarchyChildIndex === lastHierarchyChildIndex;
+ }
+
+ /**
+ * Create a new document scope containing only the last hierarchy child
+ *
+ * @returns {{newDoc: Document, newDomNode: Node}} new document and node in the new scope
+ */
+ _createLastHierarchyChildScope() {
+ const hierarchyChildren = this._getHierarchyChildren();
+ const lastHierarchyChildIndex = (hierarchyChildren.length - 1).toString();
+ const lastHierarchyChild = hierarchyChildren[lastHierarchyChildIndex];
+
+ // Convert the last hierarchy child to XML and wrap it in a dummy tag to create a Document
+ const newXml = domToXML(lastHierarchyChild);
+ const newDoc = xmlToDOM(`${newXml} `);
+
+ // Modify the path to start from index 0 in the new scope
+ const pathArray = this._path.split('.');
+ pathArray[0] = '0';
+ const newPath = pathArray.join('.');
+
+ // Find the node in the new document scope
+ const newDomNode = findDOMNodeByPath(newPath, newDoc);
+
+ return {newDoc, newDomNode};
+ }
+
+ /**
+ * Build a UiAutomator selector from an attribute
+ *
+ * @param {string} attrTranslation - the UiAutomator method name
+ * @param {string} attrValue - the attribute value
+ * @returns {string} the UiAutomator selector
+ */
+ _buildUiSelector(attrTranslation, attrValue) {
+ return `new UiSelector().${attrTranslation}("${attrValue}")`;
+ }
+
+ /**
+ * Build a UiAutomator selector with instance index
+ *
+ * @param {string} uiSelector - the base UiAutomator selector
+ * @param {number} index - the instance index
+ * @returns {string} the UiAutomator selector with instance
+ */
+ _buildUiSelectorWithInstance(uiSelector, index) {
+ return `${uiSelector}.instance(${index})`;
+ }
+
+ /**
+ * Build an XPath to check uniqueness of an attribute in the new document scope
+ *
+ * @param {Node} domNode - the DOM node in the new scope
+ * @param {string} attrName - the attribute name
+ * @param {string} attrValue - the attribute value
+ * @returns {string} the XPath expression
+ */
+ _buildUniquenessXPath(domNode, attrName, attrValue) {
+ return `//${domNode.tagName}[@${attrName}="${attrValue}"]`;
+ }
+
+ /**
+ * Try to find a unique UiAutomator selector based on attributes
+ *
+ * @param {Document} doc - the document scope to search in
+ * @param {Node} domNode - the DOM node in the new scope
+ * @returns {string|undefined} the most unique selector found, or undefined
+ */
+ _tryFindUniqueSelector(doc, domNode) {
+ let mostUniqueSelector;
+ let othersWithAttrMinCount;
+
+ for (const [attrName, attrTranslation] of UiAutomatorGenerator.CHECKED_ATTRIBUTES) {
+ const attrValue = domNode.getAttribute(attrName);
+ if (_.isEmpty(attrValue)) {
+ continue;
+ }
+
+ const xpath = this._buildUniquenessXPath(domNode, attrName, attrValue);
+ const uiSelector = this._buildUiSelector(attrTranslation, attrValue);
+
+ // If the XPath does not parse, move to the next attribute
+ let othersWithAttr;
+ try {
+ othersWithAttr = xpathSelect(xpath, doc);
+ } catch {
+ continue;
+ }
+
+ // If the attribute is unique, return it immediately
+ if (othersWithAttr.length === 1) {
+ return uiSelector;
+ }
+
+ // Keep track of the selector with the least matches
+ if (!othersWithAttrMinCount || othersWithAttr.length < othersWithAttrMinCount) {
+ othersWithAttrMinCount = othersWithAttr.length;
+ const index = othersWithAttr.indexOf(domNode);
+ mostUniqueSelector = this._buildUiSelectorWithInstance(uiSelector, index);
+ }
+ }
+
+ return mostUniqueSelector;
+ }
+}
+
+/**
+ * Get an optimal UiAutomator selector for a Node
+ * Only works for elements inside the last direct child of the hierarchy (xpath: /hierarchy/*[last()] )
+ *
+ * @param {Document} doc
+ * @param {Node} domNode
+ * @param {string} path a dot-separated string of indices
+ * @returns {string|null}
+ */
+export function getOptimalUiAutomatorSelector(doc, domNode, path) {
+ return new UiAutomatorGenerator(doc, domNode, path).generate();
+}
diff --git a/app/common/renderer/utils/locator-generation/xpath.js b/app/common/renderer/utils/locator-generation/xpath.js
new file mode 100644
index 0000000000..a61f6446aa
--- /dev/null
+++ b/app/common/renderer/utils/locator-generation/xpath.js
@@ -0,0 +1,437 @@
+import _ from 'lodash';
+import {select as xpathSelect} from 'xpath';
+
+import {LocatorGeneratorBase} from './base.js';
+
+/**
+ * Generator for XPath locators
+ * @private
+ */
+class XPathGenerator extends LocatorGeneratorBase {
+ // Attributes on nodes that are likely to be unique to the node so we should consider first when
+ // suggesting xpath locators. These are considered IN ORDER.
+ static UNIQUE_ATTRIBUTES = ['name', 'content-desc', 'id', 'resource-id', 'accessibility-id'];
+
+ // Attributes that we should recommend as a fallback but ideally only in conjunction with other
+ // attributes
+ static MAYBE_UNIQUE_ATTRIBUTES = ['label', 'text', 'value'];
+
+ // Limit for how many ancestors to traverse when looking for a unique parent scope in Phase 2,
+ // if we already have a semi-unique xpath from Phase 1.
+ static ANCESTOR_TRAVERSAL_LIMIT = 2;
+
+ // Regex to identify the last tag in an xpath, used for optimizing parent-scoped xpaths
+ // by replacing it with a more specific semi-unique xpath from Phase 1
+ static LAST_TAG_REGEX = /\/[^/]+$/;
+
+ // Regex to identify if an xpath ends with an index, used for optimizing parent-scoped xpaths
+ static LAST_INDEX_REGEX = /\[\d+\]$/;
+
+ /**
+ * Get an optimal XPath for a Node
+ *
+ * @returns {string|null}
+ */
+ generate() {
+ try {
+ // Phase 0: if this isn't an element, we're above the root, return empty string
+ if (!this._isValidElementNode()) {
+ return '';
+ }
+
+ // Phase 1: try to find a unique XPath based on the node itself (attributes or tagname)
+ const {nodeXpath, nodeIndex} = this._findBestNodeScopeXPath();
+ if (nodeXpath && nodeIndex === 0) {
+ return nodeXpath;
+ }
+
+ // Phase 2: Try to find a scoped XPath using a unique ancestor
+ const scopedXpath = this._findBestParentScopeXPath(nodeXpath);
+ if (scopedXpath) {
+ return scopedXpath;
+ } else if (nodeXpath && nodeIndex > 0) {
+ // If the scoped xpath failed but we did previously find a semi-unique xpath, fallback to that
+ return this._buildSemiUniqueXPath(nodeXpath, nodeIndex);
+ }
+
+ // Phase 3: Fall back to hierarchical XPath based on DOM position
+ return this._buildHierarchicalXPath();
+ } catch (error) {
+ this._logLocatorError('XPath', error);
+ return null;
+ }
+ }
+
+ /**
+ * Determine the uniqueness of an xpath query: return 0 if the xpath is unique,
+ * a positive integer index if the xpath is not unique,
+ * or undefined if the xpath does not match the target node
+ *
+ * @param {string} xpath
+ * @returns {number | undefined} the xpath index in the set of other similar nodes,
+ * or undefined if the xpath is invalid or does not match the target node
+ */
+ _determineXpathUniqueness(xpath) {
+ let othersWithAttr;
+ // Searches under a context node must start with '.', but we won't need it when assembling the full xpath
+ const contextedXpath = this._contextNode ? '.' + xpath : xpath;
+
+ // If the XPath does not parse, move to the next unique attribute
+ try {
+ othersWithAttr = xpathSelect(contextedXpath, this._contextNode || this._doc);
+ } catch {
+ return undefined;
+ }
+
+ if (othersWithAttr.length === 0 || !othersWithAttr.includes(this._domNode)) {
+ // Should never happen
+ return undefined;
+ }
+
+ // Not a unique node - return the xpath (1-based) index of the node in the returned set
+ if (othersWithAttr.length > 1) {
+ return othersWithAttr.indexOf(this._domNode) + 1;
+ }
+ // Unique node
+ return 0;
+ }
+
+ // #region Phase 1 - Node
+
+ /**
+ * Try to find a unique XPath based on the node's tag name alone
+ *
+ * @returns {{nodeXpath: string, nodeIndex: number}|{}} the XPath and index if unique, or empty object if not unique
+ */
+ _tryNodeTagNameForUniqueXPath() {
+ let nodeXpath = `${this._nodeAxis}${this._domNode.tagName}`;
+ const nodeIndex = this._determineXpathUniqueness(nodeXpath);
+ if (nodeIndex !== 0) {
+ return {};
+ }
+
+ // Even if this node name is unique, if it's the root node, use '/' instead of '//'
+ if (!this._isValidElementNode(this._domNode.parentNode)) {
+ nodeXpath = `/${this._domNode.tagName}`;
+ }
+ return {nodeXpath, nodeIndex};
+ }
+
+ /**
+ * Build an XPath expression from a single attribute
+ *
+ * @param {string} attrName - the attribute name
+ * @param {string} tagForXpath - the tag name to use in the XPath
+ * @returns {string|undefined} the XPath expression or undefined if attribute is missing
+ */
+ _buildXPathFromSingleAttribute(attrName, tagForXpath) {
+ const attrValue = this._domNode.getAttribute(attrName);
+ if (!attrValue) {
+ return undefined;
+ }
+ return `${this._nodeAxis}${tagForXpath}[@${attrName}="${attrValue}"]`;
+ }
+
+ /**
+ * Build an XPath expression from a pair of attributes
+ *
+ * @param {[string, string]} attrPair - pair of attribute names
+ * @param {string} tagForXpath - the tag name to use in the XPath
+ * @returns {string|undefined} the XPath expression or undefined if any attribute is missing
+ */
+ _buildXPathFromAttributePair(attrPair, tagForXpath) {
+ const [attr1Name, attr2Name] = attrPair;
+ const attr1Value = this._domNode.getAttribute(attr1Name);
+ const attr2Value = this._domNode.getAttribute(attr2Name);
+ if (!attr1Value || !attr2Value) {
+ return undefined;
+ }
+ return `${this._nodeAxis}${tagForXpath}[@${attr1Name}="${attr1Value}" and @${attr2Name}="${attr2Value}"]`;
+ }
+
+ /**
+ * Build a semi-unique XPath with an index qualifier
+ *
+ * @param {string} xpath - the base XPath expression
+ * @param {number} index - the index of the resulting element in the matching set (1-based)
+ * @returns {string} the XPath with index qualifier
+ */
+ _buildSemiUniqueXPath(xpath, index) {
+ return `(${xpath})[${index}]`;
+ }
+
+ /**
+ * Try to find a unique XPath by testing attributes
+ *
+ * @param {string[]|[string, string][]} attrs - attributes to test (single attributes or pairs)
+ * @returns {{nodeXpath: string, nodeIndex: number}|{}} the XPath and node index if found, or empty object if not found
+ */
+ _tryNodeAttributesForUniqueXPath(attrs) {
+ const tagForXpath = this._domNode.tagName || '*';
+ const isPairs = attrs.length > 0 && _.isArray(attrs[0]);
+ let semiUniqueXpath;
+ let semiUniqueXpathIndex;
+
+ for (const attrName of attrs) {
+ const nodeXpath = isPairs
+ ? this._buildXPathFromAttributePair(attrName, tagForXpath)
+ : this._buildXPathFromSingleAttribute(attrName, tagForXpath);
+
+ if (!nodeXpath) {
+ continue;
+ }
+
+ const nodeIndex = this._determineXpathUniqueness(nodeXpath);
+ if (nodeIndex === 0) {
+ return {nodeXpath, nodeIndex};
+ }
+
+ // Store the current semi-unique xpath and its index only if its index
+ // is better (lower) than any previously found semi-unique xpath.
+ // This is not guaranteed to be the best option if parent nodes will also be required,
+ // but it is still better than just saving the first one.
+ if (nodeIndex > 0 && (!semiUniqueXpathIndex || nodeIndex < semiUniqueXpathIndex)) {
+ semiUniqueXpath = nodeXpath;
+ semiUniqueXpathIndex = nodeIndex;
+ }
+ }
+
+ return {nodeXpath: semiUniqueXpath, nodeIndex: semiUniqueXpathIndex};
+ }
+
+ /**
+ * Given an xml doc and a current dom node, try to find a robust xpath selector qualified by
+ * key attributes, which is unique in the document (or unique plus index).
+ *
+ * @param {string[]|[string, string][]} attrs - a list of attributes to consider, or
+ * a list of pairs of attributes to consider in conjunction
+ *
+ * @returns {{nodeXpath: string, nodeIndex: number}|{}} the XPath and node index if found, or empty object if not found
+ */
+ _getUniqueNodeScopeXPath(attrs) {
+ // If we're looking for a unique //, return it only if it's actually unique
+ if (attrs.length === 0) {
+ return this._tryNodeTagNameForUniqueXPath();
+ }
+
+ return this._tryNodeAttributesForUniqueXPath(attrs);
+ }
+
+ /**
+ * Build the list of cases to try when generating an XPath
+ *
+ * @returns {Array} array of attribute configurations to test
+ */
+ _buildUniqueXPathFinderCases() {
+ const allAttributes = [
+ ...XPathGenerator.UNIQUE_ATTRIBUTES,
+ ...XPathGenerator.MAYBE_UNIQUE_ATTRIBUTES,
+ ];
+ const attrPairsPermutations = allAttributes.flatMap((v1, i) =>
+ allAttributes.slice(i + 1).map((v2) => [v1, v2]),
+ );
+
+ return [
+ // Try unique attributes first
+ XPathGenerator.UNIQUE_ATTRIBUTES,
+ // Try pairs of attributes (unique + maybe)
+ attrPairsPermutations,
+ // Try maybe-unique attributes alone
+ XPathGenerator.MAYBE_UNIQUE_ATTRIBUTES,
+ // Try node name alone as last resort
+ [],
+ ];
+ }
+
+ /**
+ * Try all XPath cases and return the first unique or best semi-unique result
+ *
+ * @returns {{nodeXpath: string, nodeIndex: number}|{}} the XPath and node index if found, or empty object if not found
+ */
+ _findBestNodeScopeXPath() {
+ const cases = this._buildUniqueXPathFinderCases();
+ let semiUniqueXpath;
+ let semiUniqueXpathIndex;
+
+ for (const attrs of cases) {
+ const {nodeXpath, nodeIndex} = this._getUniqueNodeScopeXPath(attrs);
+ if (nodeIndex === 0) {
+ return {nodeXpath, nodeIndex};
+ }
+ // Store the current semi-unique xpath and its index only if its index
+ // is better (lower) than any previously found semi-unique xpath.
+ // This is not guaranteed to be the best option if parent nodes will also be required,
+ // but it is still better than just saving the first one.
+ if (nodeIndex > 0 && (!semiUniqueXpathIndex || nodeIndex < semiUniqueXpathIndex)) {
+ semiUniqueXpath = nodeXpath;
+ semiUniqueXpathIndex = nodeIndex;
+ }
+ }
+
+ return {nodeXpath: semiUniqueXpath, nodeIndex: semiUniqueXpathIndex};
+ }
+
+ // #endregion
+ // #region Phase 2 - Parent
+
+ /**
+ * Find the closest ancestor node that has a unique identifying attribute or tag name.
+ * If Phase 1 found a semi-unique XPath, only check ancestors up to a certain limit
+ * to avoid traversing too far up the tree and therefore generating overly long and brittle XPaths
+ * (compared to the Phase 1 XPath, which uses only the node).
+ * If we didn't get anything from Phase 1, we can ignore this limit, since if we were to return early due to this,
+ * the code would proceed with Phase 3, which also traverses up the path, but without any limits.
+ *
+ * @param {string|null} nodeScopeXpath - the semi-unique XPath from Phase 1, without index
+ * @returns {{node: ParentNode, xpath: string}|{}} Object with {node, xpath} or empty object if no unique ancestor found
+ */
+ _findUniqueAncestor(nodeScopeXpath) {
+ let ancestor = this._domNode.parentNode;
+ let curAncestorCount = 1;
+
+ while (this._isValidElementNode(ancestor)) {
+ if (nodeScopeXpath && curAncestorCount > XPathGenerator.ANCESTOR_TRAVERSAL_LIMIT) {
+ break;
+ }
+ const ancestorGenerator = new XPathGenerator(this._doc, ancestor);
+ const {nodeXpath, nodeIndex} = ancestorGenerator._findBestNodeScopeXPath();
+ // Only use the xpath if it is fully unique
+ if (nodeXpath && nodeIndex === 0) {
+ return {node: ancestor, xpath: nodeXpath};
+ }
+ ancestor = ancestor.parentNode;
+ curAncestorCount++;
+ }
+
+ return {};
+ }
+
+ /**
+ * Build an XPath scoped to a unique ancestor
+ *
+ * @param {Node} ancestorNode - The unique ancestor node
+ * @param {string} ancestorXpath - The XPath that uniquely identifies the ancestor
+ * @returns {string} Parent-scoped XPath
+ */
+ _buildParentScopedXPath(ancestorNode, ancestorXpath) {
+ let currentNode = this._domNode;
+ let cumulativeDescendantXpath = '';
+
+ // Assemble the path upwards from the target node to the ancestor,
+ // trying to use unique identifiers for each node along the path when possible
+ while (this._isValidElementNode(currentNode) && currentNode !== ancestorNode) {
+ // Try to uniquely identify the current node within the context of its parent node
+ const nodeParentScopeGenerator = new XPathGenerator(
+ this._doc,
+ currentNode,
+ currentNode.parentNode,
+ );
+ const {nodeXpath, nodeIndex} = nodeParentScopeGenerator._findBestNodeScopeXPath();
+
+ if (nodeXpath && nodeIndex === 0) {
+ // If the path is fully unique, use that
+ cumulativeDescendantXpath = nodeXpath + cumulativeDescendantXpath;
+ } else {
+ // If not unique, keep only the tag name and add a sibling index
+ // This can probably be optimized further if the sibling index is greater than nodeIndex
+ const siblings = this._getSiblingsWithSameTag(currentNode);
+ const nodeTagNameXpath = `/${currentNode.tagName}[${siblings.indexOf(currentNode) + 1}]`;
+ cumulativeDescendantXpath = nodeTagNameXpath + cumulativeDescendantXpath;
+ }
+ currentNode = currentNode.parentNode;
+ }
+
+ return ancestorXpath + cumulativeDescendantXpath;
+ }
+
+ /**
+ * Optimize a parent-scoped XPath by attempting to reduce its final index, if any
+ *
+ * @param {string} parentScopedXpath - the parent-scoped XPath to optimize
+ * @param {string|null} nodeScopeXpath - the semi-unique XPath from Phase 1, without index
+ * @returns {string|null} Optimized parent-scoped XPath, or null if it is not good enough
+ */
+ _optimizeParentScopedXpath(parentScopedXpath, nodeScopeXpath) {
+ // If Phase 1 did not return any semi-unique xpath, or parentScopedXpath doesn't have an improvable index,
+ // just use parentScopedXpath as is
+ if (!nodeScopeXpath || !XPathGenerator.LAST_INDEX_REGEX.test(parentScopedXpath)) {
+ return this._determineXpathUniqueness(parentScopedXpath) === 0 ? parentScopedXpath : null;
+ }
+ // Replace the last tag name + index with the Phase 1 xpath (without its index).
+ // It is guaranteed to NOT be unique (otherwise it would have been picked up by _buildParentScopedXPath),
+ // but it could still give us a better index than the one in parentScopedXpath.
+ const combinedScopeXpath = parentScopedXpath.replace(
+ XPathGenerator.LAST_TAG_REGEX,
+ nodeScopeXpath.replace(/^\/\//, '/'),
+ );
+ const combinedScopeXpathIndex = this._determineXpathUniqueness(combinedScopeXpath);
+ if (_.isUndefined(combinedScopeXpathIndex)) {
+ // Should never happen
+ return null;
+ }
+ if (combinedScopeXpathIndex === 0) {
+ // Should never happen
+ return combinedScopeXpath;
+ }
+ // Compare the three indices we have:
+ // * The index from Phase 1 for the node scope xpath (nodeScopeIndex)
+ // * The index of just the node in parentScopedXpath (parentScopedXpathNodeIndex)
+ // * The index of combinedScopeXpath (combinedScopeXpathIndex)
+ //
+ // We can unconditionally use combinedScopeXpathIndex, because:
+ // * combinedScopeXpathIndex <= nodeScopeIndex: same node xpath, more specific parent tag
+ // * combinedScopeXpathIndex <= parentScopedXpathNodeIndex: same parent xpath, more specific node tag
+ return this._buildSemiUniqueXPath(combinedScopeXpath, combinedScopeXpathIndex);
+ }
+
+ /**
+ * Try to find a scoped XPath using a unique ancestor
+ *
+ * @param {string|null} nodeScopeXpath - the semi-unique XPath from Phase 1, without index
+ * @returns {string|null} Parent-scoped XPath or null if not found
+ */
+ _findBestParentScopeXPath(nodeScopeXpath) {
+ const ancestor = this._findUniqueAncestor(nodeScopeXpath);
+ if (_.isEmpty(ancestor)) {
+ return null;
+ }
+ const parentScopedXpath = this._buildParentScopedXPath(ancestor.node, ancestor.xpath);
+ return this._optimizeParentScopedXpath(parentScopedXpath, nodeScopeXpath);
+ }
+
+ // #endregion
+ // #region Phase 3 - Raw
+
+ /**
+ * Build a hierarchical XPath based on the node's position in the DOM tree
+ *
+ * @returns {string} hierarchical XPath for this node
+ */
+ _buildHierarchicalXPath() {
+ let xpath = `/${this._domNode.tagName}`;
+ const siblings = this._getSiblingsWithSameTag();
+
+ // Add index if there are multiple siblings with the same tag
+ if (siblings.length > 1) {
+ const index = siblings.indexOf(this._domNode);
+ xpath += `[${index + 1}]`;
+ }
+
+ // Recursively build parent path and prepend it
+ const parentGenerator = new XPathGenerator(this._doc, this._domNode.parentNode);
+ return parentGenerator.generate() + xpath;
+ }
+
+ // #endregion
+}
+
+/**
+ * Get an optimal XPath for a Node
+ *
+ * @param {Document} doc
+ * @param {Node} domNode
+ * @returns {string|null}
+ */
+export function getOptimalXPath(doc, domNode) {
+ return new XPathGenerator(doc, domNode).generate();
+}
diff --git a/app/common/renderer/utils/logger.js b/app/common/renderer/utils/logger.js
new file mode 100644
index 0000000000..9a2d040927
--- /dev/null
+++ b/app/common/renderer/utils/logger.js
@@ -0,0 +1,15 @@
+class Logger {
+ info(...args) {
+ console.info(...args); // eslint-disable-line no-console
+ }
+
+ warn(...args) {
+ console.warn(...args); // eslint-disable-line no-console
+ }
+
+ error(...args) {
+ console.error(...args); // eslint-disable-line no-console
+ }
+}
+
+export const log = new Logger();
diff --git a/app/common/renderer/utils/notification.js b/app/common/renderer/utils/notification.js
new file mode 100644
index 0000000000..edb4c34f83
--- /dev/null
+++ b/app/common/renderer/utils/notification.js
@@ -0,0 +1,30 @@
+export const NOTIFICATION_EVENT = 'notificationEvent';
+
+function dispatchNotificationEvent(type, args) {
+ document.dispatchEvent(
+ new CustomEvent(NOTIFICATION_EVENT, {
+ detail: {
+ type,
+ args,
+ },
+ }),
+ );
+}
+
+export const notification = {
+ success: (args) => {
+ dispatchNotificationEvent('success', args);
+ },
+ error: (args) => {
+ dispatchNotificationEvent('error', args);
+ },
+ info: (args) => {
+ dispatchNotificationEvent('info', args);
+ },
+ warning: (args) => {
+ dispatchNotificationEvent('warning', args);
+ },
+ open: (args) => {
+ dispatchNotificationEvent('open', args);
+ },
+};
diff --git a/app/common/renderer/utils/other.js b/app/common/renderer/utils/other.js
new file mode 100644
index 0000000000..b672253a39
--- /dev/null
+++ b/app/common/renderer/utils/other.js
@@ -0,0 +1,58 @@
+import _ from 'lodash';
+
+import {STANDARD_W3C_CAPS} from '../constants/session-builder.js';
+
+export const copyToClipboard = (text) => navigator.clipboard.writeText(text);
+
+/**
+ * Generates a random ID string for persistent data like session details or gestures.
+ * Uses `crypto.getRandomValues` instead of `crypto.randomUUID` to support insecure contexts,
+ * such as the plugin version when accessed over HTTP.
+ * @returns random ID string (5-32 symbols)
+ */
+export const getRandomId = () => crypto.getRandomValues(new Uint32Array(3)).join('-');
+
+export function addVendorPrefixes(caps) {
+ return caps.map((cap) => {
+ // if we don't have a valid unprefixed cap or a cap with an existing prefix, update it
+ if (
+ !_.isUndefined(cap.name) &&
+ !STANDARD_W3C_CAPS.includes(cap.name) &&
+ !_.includes(cap.name, ':')
+ ) {
+ cap.name = `appium:${cap.name}`;
+ }
+ return cap;
+ });
+}
+
+export function pixelsToPercentage(px, maxPixels) {
+ if (!isNaN(px)) {
+ return parseFloat(((px / maxPixels) * 100).toFixed(1), 10);
+ }
+}
+
+export function percentageToPixels(pct, maxPixels) {
+ if (!isNaN(pct)) {
+ return Math.round(maxPixels * (pct / 100));
+ }
+}
+
+// Extracts element coordinates from its properties.
+// Depending on the platform, this is contained either in the 'bounds' property,
+// or the 'x'/'y'/'width'/'height' properties
+export function parseCoordinates(element) {
+ const {bounds, x, y, width, height} = element.attributes || {};
+
+ if (bounds) {
+ const boundsArray = bounds.split(/\[|\]|,/).filter((str) => str !== '');
+ const [x1, y1, x2, y2] = boundsArray.map((val) => parseInt(val, 10));
+ return {x1, y1, x2, y2};
+ } else if (x) {
+ const originsArray = [x, y, width, height];
+ const [xInt, yInt, widthInt, heightInt] = originsArray.map((val) => parseInt(val, 10));
+ return {x1: xInt, y1: yInt, x2: xInt + widthInt, y2: yInt + heightInt};
+ } else {
+ return {};
+ }
+}
diff --git a/app/common/renderer/utils/sessionfile-parsing.js b/app/common/renderer/utils/sessionfile-parsing.js
new file mode 100644
index 0000000000..e518f2684c
--- /dev/null
+++ b/app/common/renderer/utils/sessionfile-parsing.js
@@ -0,0 +1,206 @@
+import _ from 'lodash';
+
+import {
+ CAPABILITY_TYPES,
+ DEFAULT_SESSION_NAME,
+ SERVER_ADVANCED_PARAMS,
+ SERVER_TYPES,
+ SESSION_FILE_VERSIONS,
+} from '../constants/session-builder.js';
+import {log} from './logger.js';
+
+/**
+ * Parses the session file contents in JSON, migrates them to the latest session file format,
+ * and runs various validation checks for the JSON contents.
+ *
+ * @param {string} sessionFileString session file contents
+ * @returns session file in JSON format, or null if any validations failed
+ */
+export function parseSessionFileContents(sessionFileString) {
+ let sessionJSON;
+ try {
+ sessionJSON = JSON.parse(sessionFileString);
+ } catch {
+ return logParsingError('file is not valid JSON');
+ }
+ const updatedSessionJSON = migrateSessionJSON(sessionJSON);
+ return validateSessionJSON(updatedSessionJSON);
+}
+
+/**
+ * Validates the properties of a session file.
+ *
+ * @param {object} sessionJSON session file contents in JSON
+ * @returns validated JSON, or null if any validations failed
+ */
+export function validateSessionJSON(sessionJSON) {
+ if (
+ !sessionJSON ||
+ !isSessionNameValid(sessionJSON) ||
+ !isSessionServerValid(sessionJSON) ||
+ !areSessionCapsValid(sessionJSON)
+ ) {
+ return null;
+ }
+ return sessionJSON;
+}
+
+/**
+ * Migrates a session file to the latest version, if required.
+ * The file may or may not be a fully valid session file.
+ *
+ * @param {object} sessionJSON session file contents in JSON
+ * @returns migrated JSON, or null if any validations failed
+ */
+export function migrateSessionJSON(sessionJSON) {
+ // First validate if the version field exists
+ if (!('version' in sessionJSON)) {
+ return logParsingError("'version' property is missing");
+ }
+ // If the file is already on the latest version, no need to migrate
+ if (sessionJSON.version === SESSION_FILE_VERSIONS.LATEST) {
+ return sessionJSON;
+ }
+ let updatedSessionJSON = structuredClone(sessionJSON);
+ if (sessionJSON.version === SESSION_FILE_VERSIONS.V1) {
+ updatedSessionJSON = migrateSessionJsonToV2(updatedSessionJSON);
+ } else {
+ return logParsingError(`unsupported 'version' value '${sessionJSON.version}'`);
+ }
+ return updatedSessionJSON;
+}
+
+/**
+ * Upgrades a session file from 1.0 to v2.
+ * The file may or may not be a fully valid session file.
+ *
+ * @param {object} sessionJSON session file JSON with version 1.0
+ * @returns migrated JSON, or null if any validations failed
+ */
+function migrateSessionJsonToV2(sessionJSON) {
+ // Add name (placeholder)
+ sessionJSON.name = DEFAULT_SESSION_NAME;
+ // Bump version
+ sessionJSON.version = SESSION_FILE_VERSIONS.V2;
+ // Filter server to only the value that matches serverType (plus advanced),
+ // creating it if it does not exist
+ if (!('serverType' in sessionJSON)) {
+ return logParsingError("'serverType' property is missing");
+ }
+ const serverTypeValue = sessionJSON.server?.[sessionJSON.serverType] ?? {};
+ const advancedValue = sessionJSON.server?.[SERVER_TYPES.ADVANCED] ?? {};
+ sessionJSON.server = {
+ [sessionJSON.serverType]: serverTypeValue,
+ [SERVER_TYPES.ADVANCED]: advancedValue,
+ };
+ // Remove serverType and visibleProviders if they exist
+ delete sessionJSON.serverType;
+ delete sessionJSON.visibleProviders;
+ return sessionJSON;
+}
+
+/**
+ * Checks if the caps field in the session file is valid.
+ *
+ * @param {object} sessionJSON session file contents in JSON
+ * @returns true if the caps field is valid, otherwise false
+ */
+function areSessionCapsValid(sessionJSON) {
+ if (!('caps' in sessionJSON && _.isArray(sessionJSON.caps))) {
+ return logValidationError("'caps' property is missing or not an array");
+ }
+ for (const cap of sessionJSON.caps) {
+ if (!_.isPlainObject(cap)) {
+ return logValidationError(`capability '${JSON.stringify(cap)}' is not an object`);
+ }
+ for (const capProp of ['type', 'name', 'value']) {
+ if (!(capProp in cap)) {
+ return logValidationError(
+ `capability '${JSON.stringify(cap)}' must have the '${capProp}' property`,
+ );
+ }
+ }
+ if (!_.values(CAPABILITY_TYPES).includes(cap.type)) {
+ return logValidationError(`'${cap.type}' is not a valid capability type`);
+ }
+ }
+ return true;
+}
+
+/**
+ * Checks if the name field in the session file is valid.
+ *
+ * @param {object} sessionJSON session file contents in JSON
+ * @returns true if the name field is valid, otherwise false
+ */
+function isSessionNameValid(sessionJSON) {
+ if (!('name' in sessionJSON && typeof sessionJSON.name === 'string')) {
+ return logValidationError("'name' property is missing or not a string");
+ }
+ if (sessionJSON.name.trim().length === 0) {
+ return logValidationError("'name' property is empty or only whitespace");
+ }
+ return true;
+}
+
+/**
+ * Checks if the server field in the session file is valid.
+ *
+ * @param {object} sessionJSON session file contents in JSON
+ * @returns true if the server field is valid, otherwise false
+ */
+function isSessionServerValid(sessionJSON) {
+ if (!('server' in sessionJSON && _.isPlainObject(sessionJSON.server))) {
+ return logValidationError("'server' property is missing or not an object");
+ }
+ const serverKeys = Object.keys(sessionJSON.server);
+ if (
+ serverKeys.length !== 2 ||
+ !serverKeys.includes(SERVER_TYPES.ADVANCED) ||
+ !_.isPlainObject(sessionJSON.server.advanced)
+ ) {
+ return logValidationError(
+ "'server' property must have exactly two properties, " +
+ "and one of them must be 'advanced', whose value must be an object",
+ );
+ }
+
+ for (const key of serverKeys) {
+ if (!Object.values(SERVER_TYPES).includes(key)) {
+ return logValidationError(`unsupported server type '${key}'`);
+ }
+ if (key !== SERVER_TYPES.ADVANCED) {
+ if (!_.isPlainObject(sessionJSON.server[key])) {
+ return logValidationError(`'${key}' server property must be an object`);
+ }
+ continue;
+ }
+ for (const [advKey, advValue] of Object.entries(sessionJSON.server.advanced)) {
+ if (!Object.values(SERVER_ADVANCED_PARAMS).includes(advKey)) {
+ return logValidationError(`unsupported advanced server property '${advKey}'`);
+ }
+ if (
+ [SERVER_ADVANCED_PARAMS.ALLOW_UNAUTHORIZED, SERVER_ADVANCED_PARAMS.USE_PROXY].includes(
+ advKey,
+ ) &&
+ typeof advValue !== 'boolean'
+ ) {
+ return logValidationError(`'${advKey}' property is not a boolean`);
+ }
+ if (advKey === SERVER_ADVANCED_PARAMS.PROXY && typeof advValue !== 'string') {
+ return logValidationError(`'${SERVER_ADVANCED_PARAMS.PROXY}' property is not a string`);
+ }
+ }
+ }
+ return true;
+}
+
+function logParsingError(text) {
+ log.error(`Error parsing session file: ${text}`);
+ return null;
+}
+
+function logValidationError(text) {
+ log.error(`Error validating session file: ${text}`);
+ return false;
+}
diff --git a/app/common/renderer/utils/source-parsing.js b/app/common/renderer/utils/source-parsing.js
new file mode 100644
index 0000000000..19ff7357ba
--- /dev/null
+++ b/app/common/renderer/utils/source-parsing.js
@@ -0,0 +1,87 @@
+import {DOMParser, MIME_TYPE, XMLSerializer} from '@xmldom/xmldom';
+import _ from 'lodash';
+
+const domParser = new DOMParser();
+const xmlSerializer = new XMLSerializer();
+
+export const xmlToDOM = (string) => domParser.parseFromString(string, MIME_TYPE.XML_TEXT);
+export const domToXML = (dom) => xmlSerializer.serializeToString(dom);
+
+/**
+ * Get the child nodes of a Node object
+ *
+ * @param {Node} domNode
+ * @returns {Array} list of Nodes
+ */
+export function childNodesOf(domNode) {
+ if (!domNode?.hasChildNodes()) {
+ return [];
+ }
+ return _.filter(domNode.childNodes, ['nodeType', domNode.ELEMENT_NODE]);
+}
+
+/**
+ * Look up an element in the Document source using the provided path
+ *
+ * @param {string} path a dot-separated string of indices
+ * @param {Document} sourceDoc app source in Document format
+ * @returns {Node} element node
+ */
+export function findDOMNodeByPath(path, sourceDoc) {
+ let selectedElement = childNodesOf(sourceDoc)[0] || childNodesOf(sourceDoc.documentElement)[0];
+ for (const index of path.split('.')) {
+ selectedElement = childNodesOf(selectedElement)[index];
+ }
+ return selectedElement;
+}
+
+/**
+ * Look up an element in the JSON source using the provided path
+ *
+ * @param {string} path a dot-separated string of indices
+ * @param {Object} sourceJSON app source in JSON format
+ * @returns {Object} element details in JSON format
+ */
+export function findJSONElementByPath(path, sourceJSON) {
+ let selectedElement = sourceJSON;
+ for (const index of path.split('.')) {
+ selectedElement = selectedElement.children[index];
+ }
+ return {...selectedElement};
+}
+
+/**
+ * Translates sourceXML to JSON
+ *
+ * @param {string} sourceXML
+ * @returns {Object} source in JSON format
+ */
+export function xmlToJSON(sourceXML) {
+ const translateRecursively = (domNode, parentPath = '', index = null) => {
+ const attributes = {};
+ for (let attrIdx = 0; attrIdx < domNode.attributes.length; ++attrIdx) {
+ const attr = domNode.attributes.item(attrIdx);
+ // it should be show new line character(\n) in GUI
+ attributes[attr.name] = attr.value.replace(/(\n)/gm, '\\n');
+ }
+
+ // Dot Separated path of indices
+ const path = _.isNil(index) ? '' : `${!parentPath ? '' : parentPath + '.'}${index}`;
+
+ return {
+ children: childNodesOf(domNode).map((childNode, childIndex) =>
+ translateRecursively(childNode, path, childIndex),
+ ),
+ tagName: domNode.tagName,
+ attributes,
+ path,
+ };
+ };
+ const sourceDoc = xmlToDOM(sourceXML);
+ // get the first child element node in the doc. some drivers write their xml differently so we
+ // first try to find an element as a direct descended of the doc, then look for one in
+ // documentElement
+ const firstChild = childNodesOf(sourceDoc)[0] || childNodesOf(sourceDoc.documentElement)[0];
+
+ return firstChild ? translateRecursively(firstChild) : {};
+}
diff --git a/app/renderer/lib/webview-helpers.js b/app/common/renderer/utils/webview.js
old mode 100755
new mode 100644
similarity index 85%
rename from app/renderer/lib/webview-helpers.js
rename to app/common/renderer/utils/webview.js
index dd20fbf889..91eccb961c
--- a/app/renderer/lib/webview-helpers.js
+++ b/app/common/renderer/utils/webview.js
@@ -1,5 +1,4 @@
import {load} from 'cheerio';
-import {parseDocument} from 'htmlparser2';
/**
* JS code that is executed in the webview to set the needed attributes on the DOM so the source can be used for the
@@ -15,8 +14,8 @@ import {parseDocument} from 'htmlparser2';
export function setHtmlElementAttributes(obj) {
const {isAndroid, webviewTopOffset, webviewLeftOffset} = obj;
const htmlElements = document.body.getElementsByTagName('*');
- // iOS uses CSS sizes for elements and screenshots, Android sizes times DRP
- // for other platforms, use default DRP of 1
+ // iOS uses CSS sizes for elements and screenshots, Android sizes times DPR
+ // for other platforms, use default DPR of 1
const dpr = isAndroid ? window.devicePixelRatio : 1;
Array.from(htmlElements).forEach((el) => {
@@ -24,8 +23,14 @@ export function setHtmlElementAttributes(obj) {
el.setAttribute('data-appium-inspector-width', Math.round(rect.width * dpr));
el.setAttribute('data-appium-inspector-height', Math.round(rect.height * dpr));
- el.setAttribute('data-appium-inspector-x', Math.round(webviewLeftOffset + rect.left * dpr));
- el.setAttribute('data-appium-inspector-y', Math.round(webviewTopOffset + rect.top * dpr));
+ el.setAttribute(
+ 'data-appium-inspector-x',
+ Math.round(webviewLeftOffset + (rect.left - window.scrollX) * dpr),
+ );
+ el.setAttribute(
+ 'data-appium-inspector-y',
+ Math.round(webviewTopOffset + (rect.top - window.scrollY) * dpr),
+ );
});
}
@@ -34,7 +39,7 @@ export function setHtmlElementAttributes(obj) {
* - head and scripts need to be removed to clean the HTML tree
* - all custom attributes need to be transformed to normal width/height/x/y
*/
-export function parseSource(source) {
+export function parseHtmlSource(source) {
// TODO this check is a bit brittle, figure out a better way to check whether we have a web
// source vs something else. Just checking for language.code),
- fallbackLng: 'en',
- namespace: 'translation',
-};
-
-function getI18NextOptions(backend) {
- return {
- backend,
- // debug: true,
- // saveMissing: true,
- interpolation: {
- escapeValue: false,
- },
- lng: (settings && settings.getSync('PREFERRED_LANGUAGE')) || 'en',
- fallbackLng: config.fallbackLng,
- whitelist: config.languages,
- };
-}
+export const fallbackLng = 'en';
-export default config;
-export {languageList, getI18NextOptions};
+export const commonI18NextOptions = {
+ // debug: true,
+ // saveMissing: true,
+ interpolation: {
+ escapeValue: false,
+ },
+ load: 'currentOnly',
+ fallbackLng,
+ supportedLngs: languageList.map((language) => language.code),
+};
diff --git a/app/common/shared/setting-defs.js b/app/common/shared/setting-defs.js
new file mode 100644
index 0000000000..01953a66d2
--- /dev/null
+++ b/app/common/shared/setting-defs.js
@@ -0,0 +1,25 @@
+// Definitions for all the persistent settings used in the app
+
+import {fallbackLng} from './i18next.config.js';
+
+export const PREFERRED_LANGUAGE = 'PREFERRED_LANGUAGE';
+export const PREFERRED_THEME = 'PREFERRED_THEME';
+export const SAVED_SESSIONS = 'SAVED_SESSIONS';
+export const SET_SAVED_GESTURES = 'SET_SAVED_GESTURES';
+export const SERVER_ARGS = 'SERVER_ARGS';
+export const SESSION_SERVER_PARAMS = 'SESSION_SERVER_PARAMS';
+export const SESSION_SERVER_TYPE = 'SESSION_SERVER_TYPE';
+export const SAVED_CLIENT_FRAMEWORK = 'SAVED_FRAMEWORK';
+export const VISIBLE_PROVIDERS = 'VISIBLE_PROVIDERS';
+
+export const DEFAULT_SETTINGS = {
+ [PREFERRED_LANGUAGE]: fallbackLng,
+ [PREFERRED_THEME]: 'system',
+ [SAVED_SESSIONS]: [],
+ [SET_SAVED_GESTURES]: [],
+ [SERVER_ARGS]: null,
+ [SESSION_SERVER_PARAMS]: null,
+ [SESSION_SERVER_TYPE]: null,
+ [SAVED_CLIENT_FRAMEWORK]: 'java',
+ [VISIBLE_PROVIDERS]: null,
+};
diff --git a/app/common/splash.html b/app/common/splash.html
new file mode 100644
index 0000000000..b7d2005f38
--- /dev/null
+++ b/app/common/splash.html
@@ -0,0 +1,14 @@
+
+
+
+
+ Appium Inspector
+
+
+
+
+
+
+
+
+
diff --git a/app/configs/i18next.config.js b/app/configs/i18next.config.js
deleted file mode 100644
index f1b039c46a..0000000000
--- a/app/configs/i18next.config.js
+++ /dev/null
@@ -1,12 +0,0 @@
-import i18n from 'i18next';
-
-import {i18NextBackend, i18NextBackendOptions} from '../renderer/polyfills';
-import {getI18NextOptions} from './app.config';
-
-const i18nextOptions = getI18NextOptions(i18NextBackendOptions);
-
-if (!i18n.isInitialized) {
- i18n.use(i18NextBackend).init(i18nextOptions);
-}
-
-export default i18n;
diff --git a/app/configs/i18next.config.renderer.js b/app/configs/i18next.config.renderer.js
deleted file mode 100644
index 525ccc54fa..0000000000
--- a/app/configs/i18next.config.renderer.js
+++ /dev/null
@@ -1,13 +0,0 @@
-import i18n from 'i18next';
-import {initReactI18next} from 'react-i18next';
-
-import {i18NextBackend, i18NextBackendOptions} from '../renderer/polyfills';
-import {getI18NextOptions} from './app.config';
-
-const i18nextOptions = getI18NextOptions(i18NextBackendOptions);
-
-if (!i18n.isInitialized) {
- i18n.use(initReactI18next).use(i18NextBackend).init(i18nextOptions);
-}
-
-export default i18n;
diff --git a/app/electron/main/debug.js b/app/electron/main/debug.js
new file mode 100644
index 0000000000..b602caa057
--- /dev/null
+++ b/app/electron/main/debug.js
@@ -0,0 +1,46 @@
+import {join} from 'node:path';
+
+import {
+ installExtension,
+ REACT_DEVELOPER_TOOLS,
+ REDUX_DEVTOOLS,
+} from '@tomjs/electron-devtools-installer';
+
+const EXTENSIONS_TO_INSTALL = [REACT_DEVELOPER_TOOLS, REDUX_DEVTOOLS];
+
+// These console.log wrappers are used for better visual separation from other logs
+
+export async function installExtensions() {
+ const opts = {
+ forceDownload: !!process.env.UPGRADE_EXTENSIONS,
+ };
+ logEmptyLine();
+ logWithExtPrefix('Installing development extensions...');
+ logWithExtPrefix(
+ opts.forceDownload
+ ? 'Explicitly re-downloading all extensions'
+ : 'Set UPGRADE_EXTENSIONS=1 to force re-download',
+ );
+ try {
+ const installedExts = await installExtension(EXTENSIONS_TO_INSTALL, opts);
+ if (installedExts.length === 0) {
+ logWithExtPrefix('No extensions were installed');
+ } else {
+ logWithExtPrefix(`Installed extensions at ${join(installedExts[0].path, '..')}:`);
+ for (const ext of installedExts) {
+ logWithExtPrefix(`* ${ext.name} v${ext.version} (ID: ${ext.id})`);
+ }
+ }
+ } catch (e) {
+ logWithExtPrefix(`Error installing extensions: ${e.message}`);
+ }
+ logEmptyLine();
+}
+
+function logEmptyLine() {
+ console.log(''); // eslint-disable-line no-console
+}
+
+function logWithExtPrefix(textString) {
+ console.log(`[🧩 Extensions 🧩] ${textString}`); // eslint-disable-line no-console
+}
diff --git a/app/electron/main/helpers.js b/app/electron/main/helpers.js
new file mode 100644
index 0000000000..c52f2b5d66
--- /dev/null
+++ b/app/electron/main/helpers.js
@@ -0,0 +1,25 @@
+import {readFile} from 'node:fs/promises';
+
+import {ipcMain, nativeTheme, shell} from 'electron';
+import settings from 'electron-settings';
+
+import i18n from './i18next.js';
+
+export const isDev = process.env.NODE_ENV === 'development';
+
+export function setupIPCListeners(getOpenFilePath) {
+ ipcMain.handle('settings:has', async (_evt, key) => await settings.has(key));
+ ipcMain.handle('settings:set', async (_evt, key, value) => await settings.set(key, value));
+ ipcMain.handle('settings:get', async (_evt, key) => await settings.get(key));
+ ipcMain.on('electron:openLink', (_evt, link) => shell.openExternal(link));
+ ipcMain.on('electron:setTheme', (_evt, theme) => (nativeTheme.themeSource = theme));
+ ipcMain.handle('sessionfile:loadIfOpened', async () => {
+ const openFilePath = getOpenFilePath();
+ if (!openFilePath) {
+ return null;
+ }
+ return await readFile(openFilePath, 'utf8');
+ });
+}
+
+export const t = (string, params = null) => i18n.t(string, params);
diff --git a/app/electron/main/i18next.js b/app/electron/main/i18next.js
new file mode 100644
index 0000000000..0267dfa5a5
--- /dev/null
+++ b/app/electron/main/i18next.js
@@ -0,0 +1,30 @@
+import {join} from 'node:path';
+
+import settings from 'electron-settings';
+import i18n from 'i18next';
+import i18NextBackend from 'i18next-fs-backend';
+
+import {commonI18NextOptions, fallbackLng} from '../../common/shared/i18next.config.js';
+import {PREFERRED_LANGUAGE} from '../../common/shared/setting-defs.js';
+
+const localesPath =
+ process.env.NODE_ENV === 'development'
+ ? join('app', 'common', 'public', 'locales') // from project root
+ : join(__dirname, '..', 'renderer', 'locales'); // from 'main' in package.json
+const translationFilePath = join(localesPath, '{{lng}}', '{{ns}}.json');
+
+const i18nextOptions = {
+ ...commonI18NextOptions,
+ lng: settings.getSync(PREFERRED_LANGUAGE) || fallbackLng,
+ backend: {
+ loadPath: translationFilePath,
+ addPath: translationFilePath,
+ jsonIndent: 2,
+ },
+};
+
+if (!i18n.isInitialized) {
+ i18n.use(i18NextBackend).init(i18nextOptions);
+}
+
+export default i18n;
diff --git a/app/electron/main/main.js b/app/electron/main/main.js
new file mode 100644
index 0000000000..f19b822df9
--- /dev/null
+++ b/app/electron/main/main.js
@@ -0,0 +1,31 @@
+import {app} from 'electron';
+import debug from 'electron-debug';
+
+import {installExtensions} from './debug.js';
+import {isDev, setupIPCListeners} from './helpers.js';
+import {setupMainWindow} from './windows.js';
+
+// Used when opening Inspector through an .appiumsession file (Windows/Linux).
+// This value is not set in dev mode, since accessing argv[1] there throws an error,
+// and this flow only makes sense for the installed Inspector app anyway
+let openFilePath = process.platform === 'darwin' || isDev ? null : process.argv[1];
+
+// Used when opening Inspector through an .appiumsession file (macOS)
+app.on('open-file', (event, filePath) => {
+ event.preventDefault();
+ openFilePath = filePath;
+});
+
+app.on('window-all-closed', () => {
+ app.quit();
+});
+
+app.on('ready', async () => {
+ if (isDev) {
+ debug();
+ await installExtensions();
+ }
+
+ setupIPCListeners(() => openFilePath);
+ await setupMainWindow();
+});
diff --git a/app/main/menus.js b/app/electron/main/menus.js
similarity index 65%
rename from app/main/menus.js
rename to app/electron/main/menus.js
index e4a58e009b..fcdf27b6e8 100644
--- a/app/main/menus.js
+++ b/app/electron/main/menus.js
@@ -1,10 +1,8 @@
-import {Menu, app, dialog, shell} from 'electron';
+import {app, dialog, Menu, shell} from 'electron';
-import {languageList} from '../configs/app.config';
-import i18n from '../configs/i18next.config';
-import {checkNewUpdates} from './auto-updater';
-import {APPIUM_SESSION_EXTENSION} from './helpers';
-import {launchNewSessionWindow} from './windows';
+import {isDev, t} from './helpers.js';
+import {checkForUpdates} from './updater.js';
+import {launchNewSessionWindow} from './windows.js';
const INSPECTOR_DOCS_URL = 'https://appium.github.io/appium-inspector';
const APPIUM_DOCS_URL = 'https://appium.io';
@@ -12,10 +10,20 @@ const APPIUM_FORUM_URL = 'https://discuss.appium.io';
const GITHUB_ISSUES_URL = 'https://github.com/appium/appium-inspector/issues';
const CROWDIN_URL = 'https://crowdin.com/project/appium-desktop';
-const t = (string, params = null) => i18n.t(string, params);
-
const separator = {type: 'separator'};
+export function rebuildMenus(mainWindow) {
+ const isMac = process.platform === 'darwin';
+
+ const menu = Menu.buildFromTemplate(menuTemplate(isMac));
+
+ if (isMac) {
+ Menu.setApplicationMenu(menu);
+ } else {
+ mainWindow.setMenu(menu);
+ }
+}
+
function showAppInfoPopup() {
dialog.showMessageBox({
title: t('appiumInspector'),
@@ -27,36 +35,6 @@ function showAppInfoPopup() {
});
}
-async function openFile(mainWindow) {
- const {canceled, filePaths} = await dialog.showOpenDialog({
- properties: ['openFile'],
- filters: [{name: 'Appium Session Files', extensions: [APPIUM_SESSION_EXTENSION]}],
- });
- if (!canceled) {
- const filePath = filePaths[0];
- mainWindow.webContents.send('open-file', filePath);
- }
-}
-
-async function saveAs(mainWindow) {
- const {canceled, filePath} = await dialog.showSaveDialog({
- title: i18n.t('saveAs'),
- filters: [{name: 'Appium', extensions: [APPIUM_SESSION_EXTENSION]}],
- });
- if (!canceled) {
- mainWindow.webContents.send('save-file', filePath);
- }
-}
-
-function getLanguagesMenu() {
- return languageList.map((language) => ({
- label: `${language.name} (${language.original})`,
- type: 'radio',
- checked: i18n.language === language.code,
- click: () => i18n.changeLanguage(language.code),
- }));
-}
-
function optionAbout() {
return {
label: t('About Appium Inspector'),
@@ -67,7 +45,7 @@ function optionAbout() {
function optionCheckForUpdates() {
return {
label: t('Check for Updates…'),
- click: () => checkNewUpdates(true),
+ click: () => checkForUpdates(),
};
}
@@ -87,13 +65,10 @@ function dropdownApp() {
};
}
-function dropdownFile(mainWindow, isMac) {
+function dropdownFile(isMac) {
const submenu = [
{label: t('New Window'), accelerator: 'CmdOrCtrl+N', click: launchNewSessionWindow},
{label: t('Close Window'), role: 'close'},
- separator,
- {label: t('Open Session File…'), accelerator: 'CmdOrCtrl+O', click: () => openFile(mainWindow)},
- {label: t('saveAs'), accelerator: 'CmdOrCtrl+S', click: () => saveAs(mainWindow)},
];
if (!isMac) {
@@ -122,14 +97,12 @@ function dropdownEdit() {
};
}
-function dropdownView(isDev) {
+function dropdownView() {
const submenu = [
{label: t('Toggle Full Screen'), role: 'togglefullscreen'},
{label: t('Reset Zoom Level'), role: 'resetZoom'},
{label: t('Zoom In'), role: 'zoomIn'},
{label: t('Zoom Out'), role: 'zoomOut'},
- separator,
- {label: t('Languages'), submenu: getLanguagesMenu()},
];
if (isDev) {
@@ -174,25 +147,13 @@ function dropdownHelp() {
};
}
-function menuTemplate(mainWindow, isMac, isDev) {
+function menuTemplate(isMac) {
return [
...(isMac ? [dropdownApp()] : []),
- dropdownFile(mainWindow, isMac),
+ dropdownFile(isMac),
dropdownEdit(),
- dropdownView(isDev),
+ dropdownView(),
...(isMac ? [dropdownWindow()] : []),
dropdownHelp(),
];
}
-
-export function rebuildMenus(mainWindow, isDev) {
- const isMac = process.platform === 'darwin';
-
- const menu = Menu.buildFromTemplate(menuTemplate(mainWindow, isMac, isDev));
-
- if (isMac) {
- Menu.setApplicationMenu(menu);
- } else {
- mainWindow.setMenu(menu);
- }
-}
diff --git a/app/electron/main/updater.js b/app/electron/main/updater.js
new file mode 100644
index 0000000000..b0bea6b820
--- /dev/null
+++ b/app/electron/main/updater.js
@@ -0,0 +1,58 @@
+import {dialog} from 'electron';
+import pkg from 'electron-updater';
+const {autoUpdater} = pkg;
+
+import {t} from './helpers.js';
+
+const RELEASES_LINK = 'https://github.com/appium/appium-inspector/releases';
+
+autoUpdater.autoDownload = false;
+autoUpdater.autoInstallOnAppQuit = false;
+
+autoUpdater.on('error', (error) => {
+ dialog.showErrorBox(t('Could not download update'), t('updateDownloadFailed', {message: error}));
+});
+
+autoUpdater.on('update-not-available', () => {
+ dialog.showMessageBox({
+ type: 'info',
+ buttons: [t('OK')],
+ message: t('No update available'),
+ detail: t('Appium Inspector is up-to-date'),
+ });
+});
+
+autoUpdater.on('update-available', async ({version, releaseDate}) => {
+ const pubDate = new Date(releaseDate).toDateString();
+ const {response} = await dialog.showMessageBox({
+ type: 'info',
+ message: t('appiumIsAvailable', {name: version}),
+ buttons: [t('Install Now'), t('Install Later')],
+ detail: t('updateDetails', {pubDate, notes: RELEASES_LINK}),
+ });
+ if (response === 0) {
+ // download is started without waiting for the dialog box to be dismissed
+ dialog.showMessageBox({
+ type: 'info',
+ buttons: [t('OK')],
+ message: t('updateIsBeingDownloaded'),
+ });
+ autoUpdater.downloadUpdate();
+ }
+});
+
+autoUpdater.on('update-downloaded', async ({releaseName}) => {
+ const {response} = await dialog.showMessageBox({
+ type: 'info',
+ buttons: [t('Restart Now'), t('Later')],
+ message: t('Update Downloaded'),
+ detail: t('updateIsDownloaded', {releaseName}),
+ });
+ if (response === 0) {
+ autoUpdater.quitAndInstall();
+ }
+});
+
+export function checkForUpdates() {
+ autoUpdater.checkForUpdates();
+}
diff --git a/app/electron/main/windows.js b/app/electron/main/windows.js
new file mode 100644
index 0000000000..5ac0319be2
--- /dev/null
+++ b/app/electron/main/windows.js
@@ -0,0 +1,109 @@
+import {join} from 'node:path';
+
+import {BrowserWindow, ipcMain, Menu, nativeTheme} from 'electron';
+import settings from 'electron-settings';
+
+import {PREFERRED_THEME} from '../../common/shared/setting-defs.js';
+import {isDev} from './helpers.js';
+import i18n from './i18next.js';
+import {rebuildMenus} from './menus.js';
+
+const mainPath = isDev
+ ? process.env.ELECTRON_RENDERER_URL
+ : join(__dirname, '..', 'renderer', 'index.html'); // from 'main' in package.json
+const splashPath = isDev
+ ? `${process.env.ELECTRON_RENDERER_URL}/splash.html`
+ : join(__dirname, '..', 'renderer', 'splash.html'); // from 'main' in package.json
+const pathLoadMethod = isDev ? 'loadURL' : 'loadFile';
+
+let mainWindow = null;
+
+export async function setupMainWindow() {
+ const preferredTheme = await settings.get(PREFERRED_THEME);
+ const isDarkTheme =
+ preferredTheme === 'dark' || (preferredTheme === 'system' && nativeTheme.shouldUseDarkColors);
+ const backgroundColor = isDarkTheme ? '#191919' : '#f5f5f5';
+
+ const splashWindow = buildSplashWindow(backgroundColor);
+ splashWindow[pathLoadMethod](splashPath);
+ splashWindow.show();
+
+ mainWindow = buildSessionWindow(backgroundColor);
+ mainWindow[pathLoadMethod](mainPath);
+
+ mainWindow.webContents.on('did-finish-load', () => {
+ rebuildMenus(mainWindow);
+ splashWindow.destroy();
+ mainWindow.show();
+ mainWindow.focus();
+ });
+
+ mainWindow.on('closed', () => {
+ mainWindow = null;
+ });
+
+ mainWindow.webContents.on('context-menu', (e, props) => {
+ const {x, y} = props;
+
+ Menu.buildFromTemplate([
+ {
+ label: i18n.t('Inspect element'),
+ click() {
+ mainWindow.inspectElement(x, y);
+ },
+ },
+ ]).popup(mainWindow);
+ });
+
+ // Override the 'content-type' header to allow connecting to Selenium Grid devices
+ // eslint-disable-next-line promise/prefer-await-to-callbacks
+ mainWindow.webContents.session.webRequest.onBeforeSendHeaders((details, callback) => {
+ details.requestHeaders['content-type'] = 'application/json; charset=utf-8';
+ // eslint-disable-next-line promise/prefer-await-to-callbacks
+ callback({requestHeaders: details.requestHeaders});
+ });
+
+ // Not included in `setupIPCListeners` to avoid circular dependency
+ ipcMain.on('electron:updateLanguage', async (_evt, lngCode) => {
+ await i18n.changeLanguage(lngCode);
+ rebuildMenus(mainWindow);
+ });
+}
+
+export function launchNewSessionWindow() {
+ const win = buildSessionWindow();
+ win[pathLoadMethod](mainPath);
+ win.show();
+}
+
+function buildSplashWindow(backgroundColor) {
+ return new BrowserWindow({
+ width: 300,
+ height: 300,
+ minWidth: 300,
+ minHeight: 300,
+ frame: false,
+ backgroundColor,
+ webPreferences: {
+ devTools: false,
+ },
+ });
+}
+
+function buildSessionWindow(backgroundColor) {
+ return new BrowserWindow({
+ show: false,
+ width: 1100,
+ height: 710,
+ minWidth: 890,
+ minHeight: 710,
+ titleBarStyle: 'hiddenInset',
+ backgroundColor,
+ webPreferences: {
+ preload: join(__dirname, '..', 'preload', 'preload.mjs'), // from 'main' in package.json
+ sandbox: false,
+ nodeIntegration: true,
+ contextIsolation: false,
+ },
+ });
+}
diff --git a/app/electron/preload/preload.mjs b/app/electron/preload/preload.mjs
new file mode 100644
index 0000000000..ffaa054414
--- /dev/null
+++ b/app/electron/preload/preload.mjs
@@ -0,0 +1,11 @@
+import {ipcRenderer} from 'electron';
+
+window.electronIPC = {
+ hasSetting: async (key) => await ipcRenderer.invoke('settings:has', key),
+ setSetting: async (key, val) => await ipcRenderer.invoke('settings:set', key, val),
+ getSetting: async (key) => await ipcRenderer.invoke('settings:get', key),
+ openLink: (link) => ipcRenderer.send('electron:openLink', link),
+ setTheme: (theme) => ipcRenderer.send('electron:setTheme', theme),
+ updateLanguage: (lngCode) => ipcRenderer.send('electron:updateLanguage', lngCode),
+ loadSessionFileIfOpened: async () => await ipcRenderer.invoke('sessionfile:loadIfOpened'),
+};
diff --git a/app/electron/renderer/polyfills.js b/app/electron/renderer/polyfills.js
new file mode 100644
index 0000000000..f8c2d34155
--- /dev/null
+++ b/app/electron/renderer/polyfills.js
@@ -0,0 +1,24 @@
+const localesPath = './locales'; // relative path works for both dev and production
+
+const openLink = (link) => window.electronIPC.openLink(link);
+const setTheme = (theme) => window.electronIPC.setTheme(theme);
+const updateLanguage = (lngCode) => window.electronIPC.updateLanguage(lngCode);
+const loadSessionFileIfOpened = () => window.electronIPC.loadSessionFileIfOpened();
+
+class ElectronSettings {
+ async has(key) {
+ return await window.electronIPC.hasSetting(key);
+ }
+
+ async set(key, val) {
+ return await window.electronIPC.setSetting(key, val);
+ }
+
+ async get(key) {
+ return await window.electronIPC.getSetting(key);
+ }
+}
+
+const settings = new ElectronSettings();
+
+export {loadSessionFileIfOpened, localesPath, openLink, setTheme, settings, updateLanguage};
diff --git a/app/env.js b/app/env.js
deleted file mode 100644
index 66fb5db5a4..0000000000
--- a/app/env.js
+++ /dev/null
@@ -1,9 +0,0 @@
-let env = {};
-
-if (typeof _ENV_ === 'undefined') {
- env = require('../env/.env-dev');
-} else {
- env = _ENV_; // eslint-disable-line no-undef
-}
-
-export default env;
diff --git a/app/main.js b/app/main.js
deleted file mode 100644
index b7c1c0fa3d..0000000000
--- a/app/main.js
+++ /dev/null
@@ -1,30 +0,0 @@
-import {app} from 'electron';
-
-import {installExtensions} from './main/debug';
-import {getAppiumSessionFilePath} from './main/helpers';
-import {setupMainWindow} from './main/windows';
-
-const isDev = process.env.NODE_ENV === 'development';
-
-export let openFilePath = getAppiumSessionFilePath(process.argv, app.isPackaged, isDev);
-
-app.on('open-file', (event, filePath) => {
- openFilePath = filePath;
-});
-
-app.on('window-all-closed', () => {
- app.quit();
-});
-
-app.on('ready', async () => {
- if (isDev) {
- require('electron-debug')();
- await installExtensions();
- }
-
- setupMainWindow({
- mainUrl: `file://${__dirname}/index.html`,
- splashUrl: `file://${__dirname}/splash.html`,
- isDev,
- });
-});
diff --git a/app/main/auto-updater/config.js b/app/main/auto-updater/config.js
deleted file mode 100644
index 6d40acadfa..0000000000
--- a/app/main/auto-updater/config.js
+++ /dev/null
@@ -1,9 +0,0 @@
-const baseFeedUrl = `https://appium-inspector-hazel.vercel.app`;
-
-export function getFeedUrl(version) {
- let platform = process.platform;
- if (platform.toLowerCase() === 'linux') {
- platform = 'AppImage';
- }
- return `${baseFeedUrl}/update/${platform}/${version}`;
-}
diff --git a/app/main/auto-updater/index.js b/app/main/auto-updater/index.js
deleted file mode 100644
index ef74e537c7..0000000000
--- a/app/main/auto-updater/index.js
+++ /dev/null
@@ -1,36 +0,0 @@
-/**
- * Auto Updater
- *
- * Similar to https://electronjs.org/docs/api/auto-updater#events
- * See https://electronjs.org/docs/tutorial/updates for documentation
- */
-import B from 'bluebird';
-import {app, autoUpdater, dialog} from 'electron';
-import _ from 'lodash';
-import moment from 'moment';
-
-import i18n from '../../configs/i18next.config';
-import env from '../../env';
-import {setUpAutoUpdater} from './update-checker';
-
-const isDev = process.env.NODE_ENV === 'development';
-const runningLocally = isDev || process.env.RUNNING_LOCALLY;
-
-let checkNewUpdates = _.noop;
-
-if (!runningLocally && !process.env.RUNNING_IN_SPECTRON) {
- // put autoupdater in try block so that it doesn't break if autoupdater doesn't work
- try {
- checkNewUpdates = setUpAutoUpdater({
- autoUpdater,
- app,
- moment,
- i18n,
- env,
- dialog,
- B,
- });
- } catch (e) {}
-}
-
-export {checkNewUpdates};
diff --git a/app/main/auto-updater/update-checker.js b/app/main/auto-updater/update-checker.js
deleted file mode 100644
index dceb3c7a2f..0000000000
--- a/app/main/auto-updater/update-checker.js
+++ /dev/null
@@ -1,126 +0,0 @@
-import axios from 'axios';
-import semver from 'semver';
-
-import {getFeedUrl} from './config';
-
-export async function checkUpdate(currentVersion) {
- try {
- // The response is like (macOS):
- // { "name":"v1.15.0-1",
- // "notes":"* Bump up Appium to v1.15.0",
- // "pub_date":"2019-10-04T04:40:37Z",
- // "url":"https://github.com/appium/appium-desktop/releases/download/v1.15.0-1/Appium-1.15.0-1-mac.zip"}
- const res = await axios.get(getFeedUrl(currentVersion));
- if (res && semver.lt(currentVersion, res.name)) {
- return res;
- }
- } catch (ign) {}
-
- return false;
-}
-
-export function setUpAutoUpdater({autoUpdater, app, moment, i18n, env, dialog, B}) {
- autoUpdater.setFeedURL(getFeedUrl(app.getVersion()));
-
- /**
- * Check for new updates
- */
- const checkNewUpdates = async function (fromMenu) {
- // autoupdate.checkForUpdates always downloads updates immediately
- // This method (getUpdate) let's us take a peek to see if there is an update
- // available before calling .checkForUpdates
- if (process.env.RUNNING_IN_SPECTRON) {
- return;
- }
- const update = await checkUpdate(app.getVersion());
- if (update) {
- let {name, notes, pub_date: pubDate} = update;
- pubDate = moment(pubDate).format(i18n.t('datetimeFormat'));
-
- let detail = i18n.t('updateDetails', {pubDate, notes: notes.replace('*', '\n*')});
- if (env.NO_AUTO_UPDATE) {
- detail += `\n\nhttps://www.github.com/appium/appium-inspector/releases/latest`;
- }
-
- // Ask user if they wish to install now or later
- if (!process.env.RUNNING_IN_SPECTRON) {
- dialog.showMessageBox(
- {
- type: 'info',
- buttons: env.NO_AUTO_UPDATE
- ? [i18n.t('OK')]
- : [i18n.t('Install Now'), i18n.t('Install Later')],
- message: i18n.t('appiumIsAvailable', {name}),
- detail,
- },
- (response) => {
- if (response === 0) {
- // If they say yes, get the updates now
- if (!env.NO_AUTO_UPDATE) {
- autoUpdater.checkForUpdates();
- }
- }
- },
- );
- }
- } else {
- if (fromMenu) {
- autoUpdater.emit('update-not-available');
- } else {
- // If no updates found check for updates every hour
- await B.delay(60 * 60 * 1000);
- checkNewUpdates();
- }
- }
- };
-
- // Inform user when the download is starting and that they'll be notified again when it is complete
- autoUpdater.on('update-available', () => {
- dialog.showMessageBox({
- type: 'info',
- buttons: [i18n.t('OK')],
- message: i18n.t('Update Download Started'),
- detail: i18n.t('updateIsBeingDownloaded'),
- });
- });
-
- // Handle the unusual case where we checked the updates endpoint, found an update
- // but then after calling 'checkForUpdates', nothing was there
- autoUpdater.on('update-not-available', () => {
- dialog.showMessageBox({
- type: 'info',
- buttons: [i18n.t('OK')],
- message: i18n.t('No update available'),
- detail: i18n.t('Appium Inspector is up-to-date'),
- });
- });
-
- // When it's done, ask if user want to restart now or later
- autoUpdater.on('update-downloaded', (event, releaseNotes, releaseName) => {
- dialog.showMessageBox(
- {
- type: 'info',
- buttons: [i18n.t('Restart Now'), i18n.t('Later')],
- message: i18n.t('Update Downloaded'),
- detail: i18n.t('updateIsDownloaded', {releaseName}),
- },
- (response) => {
- // If they say yes, restart now
- if (response === 0) {
- autoUpdater.quitAndInstall();
- }
- },
- );
- });
-
- // Handle error case
- autoUpdater.on('error', (message) => {
- dialog.showMessageBox({
- type: 'error',
- message: i18n.t('Could not download update'),
- detail: i18n.t('updateDownloadFailed', {message}),
- });
- });
-
- return checkNewUpdates;
-}
diff --git a/app/main/debug.js b/app/main/debug.js
deleted file mode 100644
index fae73eb615..0000000000
--- a/app/main/debug.js
+++ /dev/null
@@ -1,18 +0,0 @@
-export async function installExtensions() {
- const {
- installExtension,
- REACT_DEVELOPER_TOOLS,
- REDUX_DEVTOOLS,
- } = require('electron-extension-installer');
- const opts = {
- forceDownload: !!process.env.UPGRADE_EXTENSIONS,
- loadExtensionOptions: {
- allowFileAccess: true,
- },
- };
- try {
- await installExtension([REACT_DEVELOPER_TOOLS, REDUX_DEVTOOLS], opts);
- } catch (e) {
- console.warn(`Error installing extension: ${e}`); // eslint-disable-line no-console
- }
-}
diff --git a/app/main/helpers.js b/app/main/helpers.js
deleted file mode 100644
index 6d37417a56..0000000000
--- a/app/main/helpers.js
+++ /dev/null
@@ -1,29 +0,0 @@
-const APPIUM_SESSION_FILE_VERSION = '1.0';
-
-export function getAppiumSessionFilePath(argv, isPackaged, isDev) {
- if (isDev) {
- // do not use file launcher in dev mode because argv is different
- // then it is in production
- return false;
- }
- if (process.platform === 'darwin' && !isDev) {
- // packaged macOS apps do not receive args from process.argv, they
- // receive the filepath argument from the `electron.app.on('open-file', cb)` event
- return false;
- }
- const argvIndex = isPackaged ? 1 : 2;
- return argv[argvIndex];
-}
-
-// get the slice of the redux state that's needed for the .appiumsession files
-export function getSaveableState(reduxState) {
- return {
- version: APPIUM_SESSION_FILE_VERSION,
- caps: reduxState.caps,
- server: reduxState.server,
- serverType: reduxState.serverType,
- visibleProviders: reduxState.visibleProviders,
- };
-}
-
-export const APPIUM_SESSION_EXTENSION = 'appiumsession';
diff --git a/app/main/windows.js b/app/main/windows.js
deleted file mode 100644
index 0eec5545a3..0000000000
--- a/app/main/windows.js
+++ /dev/null
@@ -1,104 +0,0 @@
-import {BrowserWindow, Menu, dialog, ipcMain, webContents} from 'electron';
-
-import i18n from '../configs/i18next.config';
-import {openFilePath} from '../main';
-import settings from '../shared/settings';
-import {APPIUM_SESSION_EXTENSION} from './helpers';
-import {rebuildMenus} from './menus';
-
-let mainWindow = null;
-
-function buildSplashWindow() {
- return new BrowserWindow({
- width: 300,
- height: 300,
- minWidth: 300,
- minHeight: 300,
- frame: false,
- });
-}
-
-function buildSessionWindow() {
- const window = new BrowserWindow({
- show: false,
- width: 1100,
- height: 710,
- minWidth: 890,
- minHeight: 710,
- titleBarStyle: 'hiddenInset',
- webPreferences: {
- nodeIntegration: true,
- contextIsolation: false,
- enableRemoteModule: true,
- additionalArguments: openFilePath ? [`filename=${openFilePath}`] : [],
- },
- });
-
- ipcMain.on('save-file-as', async () => {
- const {canceled, filePath} = await dialog.showSaveDialog(mainWindow, {
- title: 'Save Appium File',
- filters: [{name: 'Appium Session Files', extensions: [APPIUM_SESSION_EXTENSION]}],
- });
- if (!canceled) {
- mainWindow.webContents.send('save-file', filePath);
- }
- });
-
- return window;
-}
-
-export function setupMainWindow({splashUrl, mainUrl, isDev}) {
- const splashWindow = buildSplashWindow();
- mainWindow = buildSessionWindow();
-
- splashWindow.loadURL(splashUrl);
- splashWindow.show();
-
- mainWindow.loadURL(mainUrl);
-
- mainWindow.webContents.on('did-finish-load', () => {
- splashWindow.destroy();
- mainWindow.show();
- mainWindow.focus();
-
- if (isDev) {
- mainWindow.openDevTools();
- }
- });
-
- mainWindow.on('closed', () => {
- mainWindow = null;
- });
-
- mainWindow.webContents.on('context-menu', (e, props) => {
- const {x, y} = props;
-
- Menu.buildFromTemplate([
- {
- label: i18n.t('Inspect element'),
- click() {
- mainWindow.inspectElement(x, y);
- },
- },
- ]).popup(mainWindow);
- });
-
- i18n.on('languageChanged', async (languageCode) => {
- rebuildMenus(mainWindow, isDev);
- await settings.set('PREFERRED_LANGUAGE', languageCode);
- webContents.getAllWebContents().forEach((wc) => {
- wc.send('appium-language-changed', {
- language: languageCode,
- });
- });
- });
-
- rebuildMenus(mainWindow, isDev);
-}
-
-export function launchNewSessionWindow() {
- const url = `file://${__dirname}/index.html`;
- const win = buildSessionWindow();
- win.loadURL(url);
- win.show();
-}
diff --git a/app/renderer/.eslintrc.json b/app/renderer/.eslintrc.json
deleted file mode 100644
index 874dc5b94c..0000000000
--- a/app/renderer/.eslintrc.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{
- "rules": {
- "no-unused-vars": [
- "error",
- {
- "varsIgnorePattern": "React"
- }
- ],
- "react/jsx-uses-vars": 1
- },
- "globals": {
- "document": "readonly"
- }
-}
diff --git a/app/renderer/actions/Session.js b/app/renderer/actions/Session.js
deleted file mode 100644
index b001a2e48c..0000000000
--- a/app/renderer/actions/Session.js
+++ /dev/null
@@ -1,1163 +0,0 @@
-import {notification} from 'antd';
-import axios from 'axios';
-import {
- debounce,
- includes,
- isPlainObject,
- isUndefined,
- keys,
- toPairs,
- union,
- without,
-} from 'lodash';
-import moment from 'moment';
-import {v4 as UUID} from 'uuid';
-import {Web2Driver} from 'web2driver';
-
-import i18n from '../../configs/i18next.config.renderer';
-import {getSaveableState} from '../../main/helpers';
-import {
- SAVED_SESSIONS,
- SERVER_ARGS,
- SESSION_SERVER_PARAMS,
- SESSION_SERVER_TYPE,
- getSetting,
- setSetting,
-} from '../../shared/settings';
-import {APP_MODE} from '../components/Inspector/shared';
-import CloudProviders from '../components/Session/CloudProviders';
-import {fs, ipcRenderer, util} from '../polyfills';
-import {addVendorPrefixes} from '../util';
-import {quitSession, setSessionDetails} from './Inspector';
-
-export const NEW_SESSION_REQUESTED = 'NEW_SESSION_REQUESTED';
-export const NEW_SESSION_LOADING = 'NEW_SESSION_LOADING';
-export const NEW_SESSION_DONE = 'NEW_SESSION_DONE';
-export const CHANGE_CAPABILITY = 'CHANGE_CAPABILITY';
-export const SAVE_SESSION_REQUESTED = 'SAVE_SESSION_REQUESTED';
-export const SAVE_SESSION_DONE = 'SAVE_SESSION_DONE';
-export const GET_SAVED_SESSIONS_REQUESTED = 'GET_SAVED_SESSIONS_REQUESTED';
-export const GET_SAVED_SESSIONS_DONE = 'GET_SAVED_SESSIONS_DONE';
-export const SET_CAPABILITY_PARAM = 'SET_CAPABILITY_PARAM';
-export const ADD_CAPABILITY = 'ADD_CAPABILITY';
-export const REMOVE_CAPABILITY = 'REMOVE_CAPABILITY';
-export const SWITCHED_TABS = 'SWITCHED_TABS';
-export const SET_CAPS_AND_SERVER = 'SET_CAPS_AND_SERVER';
-export const SAVE_AS_MODAL_REQUESTED = 'SAVE_AS_MODAL_REQUESTED';
-export const HIDE_SAVE_AS_MODAL_REQUESTED = 'HIDE_SAVE_AS_MODAL_REQUESTED';
-export const SET_SAVE_AS_TEXT = 'SET_SAVE_AS_TEXT';
-export const DELETE_SAVED_SESSION_REQUESTED = 'DELETE_SAVED_SESSION_REQUESTED';
-export const DELETE_SAVED_SESSION_DONE = 'DELETE_SAVED_SESSION_DONE';
-export const CHANGE_SERVER_TYPE = 'CHANGE_SERVER_TYPE';
-export const SET_SERVER_PARAM = 'SET_SERVER_PARAM';
-export const SET_SERVER = 'SET_SERVER';
-
-export const VISIBLE_PROVIDERS = 'VISIBLE_PROVIDERS';
-
-export const SET_ATTACH_SESS_ID = 'SET_ATTACH_SESS_ID';
-
-export const GET_SESSIONS_REQUESTED = 'GET_SESSIONS_REQUESTED';
-export const GET_SESSIONS_DONE = 'GET_SESSIONS_DONE';
-
-export const ENABLE_DESIRED_CAPS_NAME_EDITOR = 'ENABLE_DESIRED_CAPS_NAME_EDITOR';
-export const ABORT_DESIRED_CAPS_NAME_EDITOR = 'ABORT_DESIRED_CAPS_NAME_EDITOR';
-export const SAVE_DESIRED_CAPS_NAME = 'SAVE_DESIRED_CAPS_NAME';
-export const SET_DESIRED_CAPS_NAME = 'SET_DESIRED_CAPS_NAME';
-
-export const ENABLE_DESIRED_CAPS_EDITOR = 'ENABLE_DESIRED_CAPS_EDITOR';
-export const ABORT_DESIRED_CAPS_EDITOR = 'ABORT_DESIRED_CAPS_EDITOR';
-export const SAVE_RAW_DESIRED_CAPS = 'SAVE_RAW_DESIRED_CAPS';
-export const SET_RAW_DESIRED_CAPS = 'SET_RAW_DESIRED_CAPS';
-export const SHOW_DESIRED_CAPS_JSON_ERROR = 'SHOW_DESIRED_CAPS_JSON_ERROR';
-
-export const IS_ADDING_CLOUD_PROVIDER = 'IS_ADDING_CLOUD_PROVIDER';
-
-export const SET_PROVIDERS = 'SET_PROVIDERS';
-
-export const SET_ADD_VENDOR_PREFIXES = 'SET_ADD_VENDOR_PREFIXES';
-
-export const SET_STATE_FROM_URL = 'SET_STATE_FROM_URL';
-export const SET_STATE_FROM_SAVED = 'SET_STATE_FROM_SAVED';
-
-const CAPS_NEW_COMMAND = 'appium:newCommandTimeout';
-const CAPS_CONNECT_HARDWARE_KEYBOARD = 'appium:connectHardwareKeyboard';
-const CAPS_NATIVE_WEB_SCREENSHOT = 'appium:nativeWebScreenshot';
-const CAPS_ENSURE_WEBVIEW_HAVE_PAGES = 'appium:ensureWebviewsHavePages';
-const CAPS_INCLUDE_SAFARI_IN_WEBVIEWS = 'appium:includeSafariInWebviews';
-
-const FILE_PATH_STORAGE_KEY = 'last_opened_file';
-
-const AUTO_START_URL_PARAM = '1'; // what should be passed in to ?autoStart= to turn it on
-
-const MJPEG_CAP = 'mjpegScreenshotUrl';
-const MJPEG_PORT_CAP = 'mjpegServerPort';
-
-// Multiple requests sometimes send a new session request
-// after establishing a session.
-// This situation could happen easier on cloud vendors,
-// so let's set zero so far.
-// TODO: increase this retry when we get issues
-export const CONN_RETRIES = 0;
-const CONN_TIMEOUT = 5 * 60 * 1000;
-const HEADERS_CONTENT = 'application/json; charset=utf-8';
-
-// 1 hour default newCommandTimeout
-const NEW_COMMAND_TIMEOUT_SEC = 3600;
-
-let isFirstRun = true; // we only want to auto start a session on a first run
-
-const serverTypes = {};
-for (const key of keys(CloudProviders)) {
- serverTypes[key] = key;
-}
-serverTypes.local = 'local';
-serverTypes.remote = 'remote';
-
-export const ServerTypes = serverTypes;
-
-export const DEFAULT_SERVER_PATH = '/';
-export const DEFAULT_SERVER_HOST = '127.0.0.1';
-export const DEFAULT_SERVER_PORT = 4723;
-
-const SAUCE_OPTIONS_CAP = 'sauce:options';
-
-const JSON_TYPES = ['object', 'number', 'boolean'];
-
-export function getCapsObject(caps) {
- return Object.assign(
- {},
- ...caps.map((cap) => {
- if (JSON_TYPES.indexOf(cap.type) !== -1) {
- try {
- let obj = JSON.parse(cap.value);
- return {[cap.name]: obj};
- } catch (ign) {}
- }
- return {[cap.name]: cap.value};
- }),
- );
-}
-
-export function showError(e, params = {methodName: null, secs: 5, url: null}) {
- const {secs, url} = params;
- let {methodName} = params;
- let errMessage;
- if (e['jsonwire-error'] && e['jsonwire-error'].status === 7) {
- // FIXME: we probably should set 'findElement' as the method name
- // if it is also number.
- if (methodName === 10) {
- methodName = 'findElements';
- }
- errMessage = i18n.t('findElementFailure', {methodName});
- if (e.message) {
- errMessage += ` Original error: '${e.message}'`;
- }
- } else if (e.data) {
- try {
- e.data = JSON.parse(e.data);
- } catch (ign) {}
- if (e.data.value && e.data.value.message) {
- errMessage = e.data.value.message;
- } else {
- errMessage = e.data;
- }
- } else if (e.message) {
- errMessage = e.message;
- } else if (e.code) {
- errMessage = e.code;
- } else {
- errMessage = i18n.t('Could not start session');
- }
- if (
- errMessage === 'ECONNREFUSED' ||
- includes(errMessage, 'Failed to fetch') ||
- includes(errMessage, 'The requested resource could not be found')
- ) {
- errMessage = i18n.t('couldNotConnect', {url});
- }
-
- console.error(errMessage); // eslint-disable-line no-console
- notification.error({
- message: methodName ? i18n.t('callToMethodFailed', {methodName}) : i18n.t('Error'),
- description: errMessage,
- duration: secs,
- });
-}
-
-/**
- * Change the caps object, along with the server details and then go back to the new session tab
- */
-export function setCapsAndServer(server, serverType, caps, uuid, name) {
- return (dispatch) => {
- dispatch({type: SET_CAPS_AND_SERVER, server, serverType, caps, uuid, name});
- };
-}
-
-/**
- * Change a single desired capability
- */
-export function changeCapability(key, value) {
- return (dispatch) => {
- dispatch({type: CHANGE_CAPABILITY, key, value});
- };
-}
-
-/**
- * Push a capability to the list
- */
-export function addCapability() {
- return (dispatch) => {
- dispatch({type: ADD_CAPABILITY});
- };
-}
-
-/**
- * Update value of a capability parameter
- */
-export function setCapabilityParam(index, name, value) {
- return (dispatch) => {
- dispatch({type: SET_CAPABILITY_PARAM, index, name, value});
- };
-}
-
-/**
- * Delete a capability from the list
- */
-export function removeCapability(index) {
- return (dispatch) => {
- dispatch({type: REMOVE_CAPABILITY, index});
- };
-}
-
-function _addVendorPrefixes(caps, dispatch, getState) {
- const {server, serverType, capsUUID, capsName} = getState().session;
- const prefixedCaps = addVendorPrefixes(caps);
- setCapsAndServer(server, serverType, prefixedCaps, capsUUID, capsName)(dispatch);
- return prefixedCaps;
-}
-
-/**
- * Start a new appium session with the given caps
- */
-export function newSession(caps, attachSessId = null) {
- return async (dispatch, getState) => {
- let session = getState().session;
-
- // first add vendor prefixes to caps if requested
- if (!attachSessId && session.addVendorPrefixes) {
- caps = _addVendorPrefixes(caps, dispatch, getState);
- }
-
- dispatch({type: NEW_SESSION_REQUESTED, caps});
-
- let desiredCapabilities = caps ? getCapsObject(caps) : {};
- let host, port, username, accessKey, https, path, token;
- desiredCapabilities = addCustomCaps(desiredCapabilities);
-
- switch (session.serverType) {
- case ServerTypes.local:
- host = session.server.local.hostname;
- if (host === '0.0.0.0') {
- // if we're on windows, we won't be able to connect directly to '0.0.0.0'
- // so just connect to localhost; if we're listening on all interfaces,
- // that will of course include 127.0.0.1 on all platforms
- host = 'localhost';
- }
- port = session.server.local.port;
- break;
- case ServerTypes.remote:
- host = session.server.remote.hostname;
- port = session.server.remote.port;
- path = session.server.remote.path;
- https = session.server.remote.ssl;
- break;
- case ServerTypes.sauce:
- path = '/wd/hub';
- host = `ondemand.${session.server.sauce.dataCenter}.saucelabs.com`;
- port = 80;
- if (session.server.sauce.useSCProxy) {
- host = session.server.sauce.scHost || 'localhost';
- port = parseInt(session.server.sauce.scPort, 10) || 4445;
- }
- username = session.server.sauce.username || process.env.SAUCE_USERNAME;
- accessKey = session.server.sauce.accessKey || process.env.SAUCE_ACCESS_KEY;
- if (!username || !accessKey) {
- showError(new Error(i18n.t('sauceCredentialsRequired')));
- return false;
- }
- https = false;
- if (!isPlainObject(desiredCapabilities[SAUCE_OPTIONS_CAP])) {
- desiredCapabilities[SAUCE_OPTIONS_CAP] = {};
- }
- if (!desiredCapabilities[SAUCE_OPTIONS_CAP].name) {
- const dateTime = moment().format('lll');
- desiredCapabilities[SAUCE_OPTIONS_CAP].name = `Appium Desktop Session -- ${dateTime}`;
- }
- break;
- case ServerTypes.headspin: {
- let headspinUrl;
- try {
- headspinUrl = new URL(session.server.headspin.webDriverUrl);
- } catch (ign) {
- showError(new Error(`${i18n.t('Invalid URL:')} ${session.server.headspin.webDriverUrl}`));
- return false;
- }
- host = session.server.headspin.hostname = headspinUrl.hostname;
- path = session.server.headspin.path = headspinUrl.pathname;
- https = session.server.headspin.ssl = headspinUrl.protocol === 'https:';
- // new URL() does not have the port of 443 when `https` and 80 when `http`
- port = session.server.headspin.port =
- headspinUrl.port === '' ? (https ? 443 : 80) : headspinUrl.port;
- break;
- }
- case ServerTypes.perfecto:
- host = session.server.perfecto.hostname;
- port = session.server.perfecto.port || (session.server.perfecto.ssl ? 443 : 80);
- token = session.server.perfecto.token || process.env.PERFECTO_TOKEN;
- path = session.server.perfecto.path = '/nexperience/perfectomobile/wd/hub';
- if (!token) {
- showError(new Error(i18n.t('Perfecto SecurityToken is required')));
- return false;
- }
- desiredCapabilities['perfecto:options'] = {securityToken: token};
- https = session.server.perfecto.ssl;
- break;
- case ServerTypes.browserstack:
- host = session.server.browserstack.hostname =
- process.env.BROWSERSTACK_HOST || 'hub-cloud.browserstack.com';
- port = session.server.browserstack.port = process.env.BROWSERSTACK_PORT || 443;
- path = session.server.browserstack.path = '/wd/hub';
- username = session.server.browserstack.username || process.env.BROWSERSTACK_USERNAME;
- if (!desiredCapabilities['bstack:options']) {
- desiredCapabilities['bstack:options'] = {};
- }
- desiredCapabilities['bstack:options'].source = 'appiumdesktop';
- accessKey = session.server.browserstack.accessKey || process.env.BROWSERSTACK_ACCESS_KEY;
- if (!username || !accessKey) {
- showError(new Error(i18n.t('browserstackCredentialsRequired')));
- return false;
- }
- https = session.server.browserstack.ssl = parseInt(port, 10) === 443;
- break;
- case ServerTypes.lambdatest:
- host = session.server.lambdatest.hostname =
- process.env.LAMBDATEST_HOST || 'mobile-hub.lambdatest.com';
- port = session.server.lambdatest.port = process.env.LAMBDATEST_PORT || 443;
- path = session.server.lambdatest.path = '/wd/hub';
- username = session.server.lambdatest.username || process.env.LAMBDATEST_USERNAME;
- if (desiredCapabilities.hasOwnProperty.call(desiredCapabilities, 'lt:options')) {
- desiredCapabilities['lt:options'].source = 'appiumdesktop';
- desiredCapabilities['lt:options'].isRealMobile = true;
- if (session.server.advanced.useProxy) {
- desiredCapabilities['lt:options'].proxyUrl = isUndefined(session.server.advanced.proxy)
- ? ''
- : session.server.advanced.proxy;
- }
- } else {
- desiredCapabilities['lambdatest:source'] = 'appiumdesktop';
- desiredCapabilities['lambdatest:isRealMobile'] = true;
- if (session.server.advanced.useProxy) {
- desiredCapabilities['lambdatest:proxyUrl'] = isUndefined(session.server.advanced.proxy)
- ? ''
- : session.server.advanced.proxy;
- }
- }
- accessKey = session.server.lambdatest.accessKey || process.env.LAMBDATEST_ACCESS_KEY;
- if (!username || !accessKey) {
- showError(new Error(i18n.t('lambdatestCredentialsRequired')));
- return false;
- }
- https = session.server.lambdatest.ssl = parseInt(port, 10) === 443;
- break;
- case ServerTypes.bitbar:
- host = process.env.BITBAR_HOST || 'appium.bitbar.com';
- port = session.server.bitbar.port = 443;
- path = session.server.bitbar.path = '/wd/hub';
- accessKey = session.server.bitbar.apiKey || process.env.BITBAR_API_KEY;
- if (!accessKey) {
- showError(new Error(i18n.t('bitbarCredentialsRequired')));
- return false;
- }
- desiredCapabilities['bitbar:options'] = {
- source: 'appiumdesktop',
- apiKey: accessKey,
- };
- https = session.server.bitbar.ssl = true;
- break;
- case ServerTypes.kobiton:
- host = process.env.KOBITON_HOST || 'api.kobiton.com';
- port = session.server.kobiton.port = 443;
- path = session.server.kobiton.path = '/wd/hub';
- username = session.server.kobiton.username || process.env.KOBITON_USERNAME;
- accessKey = session.server.kobiton.accessKey || process.env.KOBITON_ACCESS_KEY;
- desiredCapabilities['kobiton:options'] = {};
- desiredCapabilities['kobiton:options'].source = 'appiumdesktop';
- if (!username || !accessKey) {
- showError(new Error(i18n.t('kobitonCredentialsRequired')));
- return false;
- }
- https = session.server.kobiton.ssl = true;
- break;
- case ServerTypes.pcloudy:
- host = session.server.pcloudy.hostname;
- port = session.server.pcloudy.port = 443;
- path = session.server.pcloudy.path = '/objectspy/wd/hub';
- desiredCapabilities.pCloudy_Username =
- session.server.pcloudy.username || process.env.PCLOUDY_USERNAME;
- desiredCapabilities.pCloudy_ApiKey =
- session.server.pcloudy.accessKey || process.env.PCLOUDY_ACCESS_KEY;
- if (
- !(session.server.pcloudy.username || process.env.PCLOUDY_USERNAME) ||
- !(session.server.pcloudy.accessKey || process.env.PCLOUDY_ACCESS_KEY)
- ) {
- showError(new Error('PCLOUDY username and api key are required!'));
- return false;
- }
- https = session.server.pcloudy.ssl = true;
- break;
- case ServerTypes.testingbot:
- host = session.server.testingbot.hostname = process.env.TB_HOST || 'hub.testingbot.com';
- port = session.server.testingbot.port = 443;
- path = session.server.testingbot.path = '/wd/hub';
- if (!desiredCapabilities['tb:options']) {
- desiredCapabilities['tb:options'] = {};
- }
- desiredCapabilities['tb:options'].key = session.server.testingbot.key || process.env.TB_KEY;
- desiredCapabilities['tb:options'].secret =
- session.server.testingbot.secret || process.env.TB_SECRET;
- if (
- !(session.server.testingbot.key || process.env.TB_KEY) ||
- !(session.server.testingbot.secret || process.env.TB_SECRET)
- ) {
- showError(new Error(i18n.t('testingbotCredentialsRequired')));
- return false;
- }
- https = session.server.testingbot.ssl = true;
- break;
- case ServerTypes.experitest: {
- if (!session.server.experitest.url || !session.server.experitest.accessKey) {
- showError(new Error(i18n.t('experitestAccessKeyURLRequired')));
- return false;
- }
- desiredCapabilities['experitest:accessKey'] = session.server.experitest.accessKey;
-
- let experitestUrl;
- try {
- experitestUrl = new URL(session.server.experitest.url);
- } catch (ign) {
- showError(new Error(`${i18n.t('Invalid URL:')} ${session.server.experitest.url}`));
- return false;
- }
-
- host = session.server.experitest.hostname = experitestUrl.hostname;
- path = session.server.experitest.path = '/wd/hub';
- https = session.server.experitest.ssl = experitestUrl.protocol === 'https:';
- port = session.server.experitest.port =
- experitestUrl.port === '' ? (https ? 443 : 80) : experitestUrl.port;
- break;
- }
- case ServerTypes.roboticmobi: {
- host = 'remote.robotqa.com';
- path = '/';
- port = 443;
- https = session.server.roboticmobi.ssl = true;
- if (caps) {
- desiredCapabilities['robotqa:options'] = {};
- desiredCapabilities['robotqa:options'].robotqa_token =
- session.server.roboticmobi.token || process.env.ROBOTQA_TOKEN;
- }
- break;
- }
- case ServerTypes.remotetestkit: {
- host = 'gwjp.appkitbox.com';
- path = '/wd/hub';
- port = 443;
- https = true;
- desiredCapabilities['remotetestkit:options'] = {};
- desiredCapabilities['remotetestkit:options'].accessToken =
- session.server.remotetestkit.token;
- break;
- }
- case ServerTypes.mobitru: {
- const webDriverUrl =
- session.server.mobitru.webDriverUrl ||
- process.env.MOBITRU_WEBDRIVER_URL ||
- 'https://app.mobitru.com/wd/hub';
- let mobitruUrl;
- try {
- mobitruUrl = new URL(webDriverUrl);
- } catch (ign) {
- showError(new Error(`${i18n.t('Invalid URL:')} ${webDriverUrl}`));
- return false;
- }
- host = session.server.mobitru.hostname = mobitruUrl.hostname;
- path = session.server.mobitru.path = mobitruUrl.pathname;
- https = session.server.mobitru.ssl = mobitruUrl.protocol === 'https:';
- port = session.server.mobitru.port =
- mobitruUrl.port === '' ? (https ? 443 : 80) : mobitruUrl.port;
-
- username =
- session.server.mobitru.username || process.env.MOBITRU_BILLING_UNIT || 'personal';
- accessKey = session.server.mobitru.accessKey || process.env.MOBITRU_ACCESS_KEY;
- if (!accessKey) {
- showError(new Error(i18n.t('mobitruCredentialsRequired')));
- return false;
- }
-
- if (!desiredCapabilities['mobitru:options']) {
- desiredCapabilities['mobitru:options'] = {};
- }
- desiredCapabilities['mobitru:options'].source = 'appium-inspector';
- break;
- }
-
- default:
- break;
- }
-
- // if the server path is '' (or any other kind of falsy) set it to default
- path = path || DEFAULT_SERVER_PATH;
- host = host || DEFAULT_SERVER_HOST;
- port = port || DEFAULT_SERVER_PORT;
-
- // TODO W2D handle proxy and rejectUnauthorized cases
- //let rejectUnauthorized = !session.server.advanced.allowUnauthorized;
- //let proxy;
- //if (session.server.advanced.useProxy && session.server.advanced.proxy) {
- // proxy = session.server.advanced.proxy;
- //}
-
- dispatch({type: NEW_SESSION_LOADING});
-
- const serverOpts = {
- hostname: host,
- port: parseInt(port, 10),
- protocol: https ? 'https' : 'http',
- path,
- connectionRetryCount: CONN_RETRIES,
- connectionRetryTimeout: CONN_TIMEOUT,
- };
-
- if (username && accessKey) {
- serverOpts.user = username;
- serverOpts.key = accessKey;
- }
-
- // If a newCommandTimeout wasn't provided, set it to 60 * 60 so that sessions don't close on users in short term.
- // I saw sometimes infinit session timeout was not so good for cloud providers.
- // So, let me define this value as NEW_COMMAND_TIMEOUT_SEC by default.
- if (isUndefined(desiredCapabilities[CAPS_NEW_COMMAND])) {
- desiredCapabilities[CAPS_NEW_COMMAND] = NEW_COMMAND_TIMEOUT_SEC;
- }
-
- // If someone didn't specify connectHardwareKeyboard, set it to true by
- // default
- if (isUndefined(desiredCapabilities[CAPS_CONNECT_HARDWARE_KEYBOARD])) {
- desiredCapabilities[CAPS_CONNECT_HARDWARE_KEYBOARD] = true;
- }
-
- serverOpts.logLevel = process.env.NODE_ENV === 'development' ? 'info' : 'warn';
-
- let driver = null;
- try {
- if (attachSessId) {
- // When attaching to a session id, webdriver does not fully populate client information, so
- // we should supplement by attaching session capabilities that we are attaching to, if they
- // exist in our cache of running appium sessions. Otherwise (in the case where we are
- // autostarting and attaching to a new session, retrieve session details via a server call)
- serverOpts.isMobile = true;
- const attachedSession = session.runningAppiumSessions.find(
- (session) => session.id === attachSessId,
- );
- let attachedSessionCaps = {};
- if (attachedSession) {
- attachedSessionCaps = attachedSession.capabilities;
- } else {
- const {protocol, hostname, port, path} = serverOpts;
- try {
- const cleanedPath = path.replace(/\/$/, '');
- const detailsUrl = `${protocol}://${hostname}:${port}${cleanedPath}/session/${attachSessId}`;
- const res = await axios({
- url: detailsUrl,
- headers: {'content-type': HEADERS_CONTENT},
- timeout: CONN_TIMEOUT,
- });
- attachedSessionCaps = res.data.value;
- } catch (err) {
- // rethrow the error as session not running, but first log the original error to
- // console
- console.error(err); // eslint-disable-line no-console
- throw new Error(i18n.t('attachSessionNotRunning', {attachSessId}));
- }
- }
- // Chrome MJSONWP mode returns "platform" instead of "platformName"
- const platformName = attachedSessionCaps.platformName || attachedSessionCaps.platform;
- serverOpts.isIOS = Boolean(platformName.match(/iOS/i));
- serverOpts.isAndroid = Boolean(platformName.match(/Android/i));
- driver = await Web2Driver.attachToSession(attachSessId, serverOpts, attachedSessionCaps);
- driver._isAttachedSession = true;
- } else {
- driver = await Web2Driver.remote(serverOpts, desiredCapabilities);
- }
- } catch (err) {
- const {protocol, hostname, port, path} = serverOpts;
- const url = `${protocol}://${hostname}:${port}${path}`;
- showError(err, {secs: 0, url});
- return false;
- } finally {
- dispatch({type: NEW_SESSION_DONE});
- // Save the current server settings
- await setSetting(SESSION_SERVER_PARAMS, session.server);
- }
-
- // The homepage arg in ChromeDriver is not working with Appium. iOS can have a default url, but
- // we want to keep the process equal to prevent complexity so we launch a default url here to make
- // sure we don't start with an empty page which will not show proper HTML in the inspector
- const {browserName = ''} = desiredCapabilities;
- let mode = APP_MODE.NATIVE;
-
- if (browserName.trim() !== '') {
- try {
- mode = APP_MODE.WEB_HYBRID;
- await driver.navigateTo('https://appium.io');
- } catch (ign) {}
- }
-
- let mjpegScreenshotUrl =
- driver.capabilities[`appium:${MJPEG_CAP}`] || driver.capabilities[MJPEG_CAP] || null;
-
- const mjpegScreenshotPort =
- driver.capabilities[`appium:${MJPEG_PORT_CAP}`] ||
- driver.capabilities[MJPEG_PORT_CAP] ||
- null;
-
- // Build mjpegScreenshotUrl if mjpegServerPort in session capabilities
- if (!mjpegScreenshotUrl && mjpegScreenshotPort) {
- mjpegScreenshotUrl = `${https ? 'https' : 'http'}://${host}:${mjpegScreenshotPort}`;
- }
-
- // pass some state to the inspector that it needs to build recorder
- // code boilerplate
- const action = setSessionDetails({
- driver,
- sessionDetails: {
- desiredCapabilities,
- host,
- port,
- path,
- username,
- accessKey,
- https,
- },
- mode,
- mjpegScreenshotUrl,
- });
- action(dispatch);
- return true;
- };
-}
-
-/**
- * Saves the caps and server details
- */
-export function saveSession(server, serverType, caps, params) {
- return async (dispatch) => {
- let {name, uuid} = params;
- dispatch({type: SAVE_SESSION_REQUESTED});
- let savedSessions = (await getSetting(SAVED_SESSIONS)) || [];
- if (!uuid) {
- // If it's a new session, add it to the list
- uuid = UUID();
- let newSavedSession = {
- date: Date.now(),
- name,
- uuid,
- caps,
- server,
- serverType,
- };
- savedSessions.push(newSavedSession);
- } else {
- // If it's an existing session, overwrite it
- for (let session of savedSessions) {
- if (session.uuid === uuid) {
- session.name = name;
- session.caps = caps;
- session.server = server;
- session.serverType = serverType;
- }
- }
- }
- await setSetting(SAVED_SESSIONS, savedSessions);
- const action = getSavedSessions();
- await action(dispatch);
- dispatch({type: SET_CAPS_AND_SERVER, server, serverType, caps, uuid, name});
- dispatch({type: SAVE_SESSION_DONE});
- };
-}
-
-/**
- * Get the sessions saved by the user
- */
-export function getSavedSessions() {
- return async (dispatch) => {
- dispatch({type: GET_SAVED_SESSIONS_REQUESTED});
- let savedSessions = await getSetting(SAVED_SESSIONS);
- dispatch({type: GET_SAVED_SESSIONS_DONE, savedSessions});
- };
-}
-
-/**
- * Switch to a different tab
- */
-export function switchTabs(key) {
- return (dispatch) => {
- dispatch({type: SWITCHED_TABS, key});
- };
-}
-
-/**
- * Open a 'Save As' modal
- */
-export function requestSaveAsModal() {
- return (dispatch) => {
- dispatch({type: SAVE_AS_MODAL_REQUESTED});
- };
-}
-
-/**
- * Hide the 'Save As' modal
- */
-export function hideSaveAsModal() {
- return (dispatch) => {
- dispatch({type: HIDE_SAVE_AS_MODAL_REQUESTED});
- };
-}
-
-/**
- * Set the text to save capabilities as
- */
-export function setSaveAsText(saveAsText) {
- return (dispatch) => {
- dispatch({type: SET_SAVE_AS_TEXT, saveAsText});
- };
-}
-
-/**
- * Delete a saved session
- */
-export function deleteSavedSession(uuid) {
- return async (dispatch) => {
- dispatch({type: DELETE_SAVED_SESSION_REQUESTED, uuid});
- let savedSessions = await getSetting(SAVED_SESSIONS);
- let newSessions = savedSessions.filter((session) => session.uuid !== uuid);
- await setSetting(SAVED_SESSIONS, newSessions);
- dispatch({type: DELETE_SAVED_SESSION_DONE});
- dispatch({type: GET_SAVED_SESSIONS_DONE, savedSessions: newSessions});
- };
-}
-
-/**
- * Set the session id to attach to
- */
-export function setAttachSessId(attachSessId) {
- return (dispatch) => {
- dispatch({type: SET_ATTACH_SESS_ID, attachSessId});
- };
-}
-
-/**
- * Change the server type
- */
-export function changeServerType(serverType) {
- return async (dispatch, getState) => {
- await setSetting(SESSION_SERVER_TYPE, serverType);
- dispatch({type: CHANGE_SERVER_TYPE, serverType});
- const action = getRunningSessions();
- action(dispatch, getState);
- };
-}
-
-/**
- * Set a server parameter (host, port, etc...)
- */
-export function setServerParam(name, value, serverType) {
- const debounceGetRunningSessions = debounce(getRunningSessions(), 5000);
- return async (dispatch, getState) => {
- serverType = serverType || getState().session.serverType;
- await setSetting(SESSION_SERVER_TYPE, serverType);
- dispatch({type: SET_SERVER_PARAM, serverType, name, value});
- debounceGetRunningSessions(dispatch, getState);
- };
-}
-
-/**
- * Set the local server hostname and port to whatever was saved in 'actions/StartServer.js' so that it
- * defaults to what the currently running appium server is
- */
-export function setLocalServerParams() {
- return async (dispatch, getState) => {
- let serverArgs = await getSetting(SERVER_ARGS);
- // Get saved server args from settings and set local server settings to it. If there are no saved args, set local
- // host and port to undefined
- if (serverArgs) {
- dispatch({
- type: SET_SERVER_PARAM,
- serverType: ServerTypes.local,
- name: 'port',
- value: serverArgs.port,
- });
- dispatch({
- type: SET_SERVER_PARAM,
- serverType: ServerTypes.local,
- name: 'hostname',
- value: 'localhost',
- });
- } else {
- dispatch({
- type: SET_SERVER_PARAM,
- serverType: ServerTypes.local,
- name: 'port',
- value: undefined,
- });
- dispatch({
- type: SET_SERVER_PARAM,
- serverType: ServerTypes.local,
- name: 'hostname',
- value: undefined,
- });
- if (getState().session.serverType === 'local') {
- const action = changeServerType('remote');
- await action(dispatch, getState);
- }
- }
- };
-}
-
-/**
- * Set the server parameters to whatever they were last saved as.
- * Params are saved whenever there's a new session
- */
-export function setSavedServerParams() {
- return async (dispatch, getState) => {
- let server = await getSetting(SESSION_SERVER_PARAMS);
- let serverType = await getSetting(SESSION_SERVER_TYPE);
- let currentProviders = getState().session.visibleProviders;
-
- if (server) {
- // if we have a cloud provider as a saved server, but for some reason the
- // cloud provider is no longer in the list, revert server type to remote
- if (keys(CloudProviders).includes(serverType) && !currentProviders.includes(serverType)) {
- serverType = ServerTypes.remote;
- }
- dispatch({type: SET_SERVER, server, serverType});
- }
- };
-}
-
-export function setStateFromAppiumFile(newFilepath = null) {
- return async (dispatch) => {
- // no "fs" means we're not in an Electron renderer so do nothing
- if (!fs) {
- return;
- }
- try {
- let filePath = newFilepath;
- if (!newFilepath) {
- const lastArg = process.argv[process.argv.length - 1];
- if (!lastArg.startsWith('filename=')) {
- return;
- }
- filePath = lastArg.split('=')[1];
- }
- if (sessionStorage.getItem(FILE_PATH_STORAGE_KEY) === filePath) {
- // file was opened already, do nothing
- return;
- }
- const appiumJson = JSON.parse(await util.promisify(fs.readFile)(filePath, 'utf8'));
- sessionStorage.setItem(FILE_PATH_STORAGE_KEY, filePath);
- dispatch({type: SET_STATE_FROM_SAVED, state: appiumJson, filePath});
- } catch (e) {
- notification.error({
- message: `Cannot open file '${newFilepath}'.\n ${e.message}\n ${e.stack}`,
- });
- }
- };
-}
-
-export function saveFile(filepath) {
- return async (dispatch, getState) => {
- const state = getState().session;
- const filePath = filepath || state.filePath;
- if (filePath) {
- const appiumFileInfo = getSaveableState(state);
- await util.promisify(fs.writeFile)(filePath, JSON.stringify(appiumFileInfo, null, 2), 'utf8');
- sessionStorage.setItem(FILE_PATH_STORAGE_KEY, filePath);
- } else {
- // no filepath provided, tell the main renderer to open the save file dialog and
- // ask the user to save file to a provided path
- ipcRenderer.send('save-file-as');
- }
- };
-}
-
-export function getRunningSessions() {
- return async (dispatch, getState) => {
- const avoidServerTypes = ['sauce'];
- // Get currently running sessions for this server
- const state = getState().session;
- const {server, serverType} = state;
- const serverInfo = server[serverType];
-
- let {hostname, port, path, ssl, username, accessKey} = serverInfo;
-
- // if we have a standard remote server, fill out connection info based on placeholder defaults
- // in case the user hasn't adjusted those fields
- if (serverType === ServerTypes.remote) {
- hostname = hostname || DEFAULT_SERVER_HOST;
- port = port || DEFAULT_SERVER_PORT;
- path = path || DEFAULT_SERVER_PATH;
- }
-
- if (!hostname || !port || !path) {
- // no need to get sessions if we don't have complete server info
- return;
- }
-
- dispatch({type: GET_SESSIONS_REQUESTED});
- if (avoidServerTypes.includes(serverType)) {
- dispatch({type: GET_SESSIONS_DONE});
- return;
- }
-
- try {
- const adjPath = path.endsWith('/') ? path : `${path}/`;
- const url = `http${ssl ? 's' : ''}://${hostname}:${port}${adjPath}sessions`;
- const res = await axios({
- url,
- headers: {
- 'content-type': HEADERS_CONTENT,
- ...(username && accessKey
- ? {Authorization: `Basic ${btoa(`${username}:${accessKey}`)}`}
- : {}),
- },
- });
- dispatch({type: GET_SESSIONS_DONE, sessions: res.data.value});
- } catch (err) {
- console.warn(`Ignoring error in getting list of active sessions: ${err}`); // eslint-disable-line no-console
- dispatch({type: GET_SESSIONS_DONE});
- }
- };
-}
-
-export function startDesiredCapsNameEditor() {
- return (dispatch) => {
- dispatch({type: ENABLE_DESIRED_CAPS_NAME_EDITOR});
- };
-}
-
-export function abortDesiredCapsNameEditor() {
- return (dispatch) => {
- dispatch({type: ABORT_DESIRED_CAPS_NAME_EDITOR});
- };
-}
-
-export function saveDesiredCapsName() {
- return (dispatch, getState) => {
- const {server, serverType, caps, capsUUID, desiredCapsName} = getState().session;
- dispatch({type: SAVE_DESIRED_CAPS_NAME, name: desiredCapsName});
- saveSession(server, serverType, caps, {name: desiredCapsName, uuid: capsUUID})(dispatch);
- };
-}
-
-export function setDesiredCapsName(desiredCapsName) {
- return (dispatch) => {
- dispatch({type: SET_DESIRED_CAPS_NAME, desiredCapsName});
- };
-}
-
-export function startDesiredCapsEditor() {
- return (dispatch) => {
- dispatch({type: ENABLE_DESIRED_CAPS_EDITOR});
- };
-}
-
-export function abortDesiredCapsEditor() {
- return (dispatch) => {
- dispatch({type: ABORT_DESIRED_CAPS_EDITOR});
- };
-}
-
-export function saveRawDesiredCaps() {
- return (dispatch, getState) => {
- const state = getState().session;
- const {rawDesiredCaps, caps: capsArray} = state;
- try {
- const newCaps = JSON.parse(rawDesiredCaps);
-
- // Transform the current caps array to an object
- let caps = {};
- for (let {type, name, value} of capsArray) {
- caps[name] = {type, value};
- }
-
- // Translate the caps JSON to array format
- let newCapsArray = toPairs(newCaps).map(([name, value]) => ({
- type: (() => {
- let type = typeof value;
-
- // If we already have this cap and it's file type, keep the type the same
- if (caps[name] && caps[name].type === 'file' && type === 'string') {
- return 'file';
- } else if (type === 'string') {
- return 'text';
- } else {
- return type;
- }
- })(),
- name,
- value,
- }));
- dispatch({type: SAVE_RAW_DESIRED_CAPS, caps: newCapsArray});
- } catch (e) {
- dispatch({type: SHOW_DESIRED_CAPS_JSON_ERROR, message: e.message});
- }
- };
-}
-
-export function setRawDesiredCaps(rawDesiredCaps) {
- return (dispatch, getState) => {
- const state = getState().session;
- let isValidCapsJson = true;
- let invalidCapsJsonReason;
- if (state.isValidatingCapsJson) {
- try {
- JSON.parse(rawDesiredCaps);
- } catch (e) {
- isValidCapsJson = false;
- invalidCapsJsonReason = e.message;
- }
- }
- dispatch({type: SET_RAW_DESIRED_CAPS, rawDesiredCaps, isValidCapsJson, invalidCapsJsonReason});
- };
-}
-
-export function addCloudProvider() {
- return (dispatch) => {
- dispatch({type: IS_ADDING_CLOUD_PROVIDER, isAddingProvider: true});
- };
-}
-
-export function stopAddCloudProvider() {
- return (dispatch) => {
- dispatch({type: IS_ADDING_CLOUD_PROVIDER, isAddingProvider: false});
- };
-}
-
-export function addVisibleProvider(provider) {
- return async (dispatch, getState) => {
- let currentProviders = getState().session.visibleProviders;
- const providers = union(currentProviders, [provider]);
- await setSetting(VISIBLE_PROVIDERS, providers);
- dispatch({type: SET_PROVIDERS, providers});
- };
-}
-
-export function removeVisibleProvider(provider) {
- return async (dispatch, getState) => {
- let currentProviders = getState().session.visibleProviders;
- const providers = without(currentProviders, provider);
- await setSetting(VISIBLE_PROVIDERS, providers);
- dispatch({type: SET_PROVIDERS, providers});
- };
-}
-
-export function setVisibleProviders() {
- return async (dispatch) => {
- const providers = await getSetting(VISIBLE_PROVIDERS);
- dispatch({type: SET_PROVIDERS, providers});
- };
-}
-
-/**
- * Add custom capabilities
- *
- * @param {object} caps
- */
-function addCustomCaps(caps) {
- const {platformName = ''} = caps;
- const androidCustomCaps = {};
- // @TODO: remove when this is defaulted in the newest Appium 1.8.x release
- androidCustomCaps[CAPS_ENSURE_WEBVIEW_HAVE_PAGES] = true;
- // Make sure the screenshot is taken of the whole screen when the ChromeDriver is used
- androidCustomCaps[CAPS_NATIVE_WEB_SCREENSHOT] = true;
-
- const iosCustomCaps = {};
- // Always add the includeSafariInWebviews for future HTML detection
- // This will ensure that if you use AD to switch between App and browser
- // that it can detect Safari as a webview
- iosCustomCaps[CAPS_INCLUDE_SAFARI_IN_WEBVIEWS] = true;
-
- return {
- ...caps,
- ...(platformName.toLowerCase() === 'android' ? androidCustomCaps : {}),
- ...(platformName.toLowerCase() === 'ios' ? iosCustomCaps : {}),
- };
-}
-
-export function bindWindowClose() {
- return (dispatch, getState) => {
- window.addEventListener('beforeunload', async (evt) => {
- let {driver} = getState().inspector;
- if (driver) {
- try {
- const action = quitSession('Window closed');
- await action(dispatch, getState);
- } finally {
- driver = null;
- }
- }
-
- // to allow the window close to continue, the thing we must do is make sure the event no
- // longer has any 'returnValue' property
- delete evt.returnValue;
- });
- };
-}
-
-export function setAddVendorPrefixes(addVendorPrefixes) {
- return (dispatch) => {
- dispatch({type: SET_ADD_VENDOR_PREFIXES, addVendorPrefixes});
- };
-}
-
-export function initFromQueryString(loadNewSession) {
- return (dispatch, getState) => {
- if (!isFirstRun) {
- return;
- }
-
- isFirstRun = false;
-
- const url = new URL(window.location.href);
- const initialState = url.searchParams.get('state');
- const autoStartSession = url.searchParams.get('autoStart');
-
- if (initialState) {
- try {
- const state = JSON.parse(initialState);
- dispatch({type: SET_STATE_FROM_URL, state});
- } catch (e) {
- showError(new Error('Could not parse initial state from URL'), {secs: 0});
- }
- }
-
- if (autoStartSession === AUTO_START_URL_PARAM) {
- const {attachSessId, caps} = getState().session;
- if (attachSessId) {
- return loadNewSession(null, attachSessId);
- }
- loadNewSession(caps);
- }
- };
-}
diff --git a/app/renderer/actions/Updater.js b/app/renderer/actions/Updater.js
deleted file mode 100644
index f0a3f784c8..0000000000
--- a/app/renderer/actions/Updater.js
+++ /dev/null
@@ -1,7 +0,0 @@
-export const SET_UPDATE_STATE = 'SET_UPDATE_STATE';
-
-export function setUpdateState(updateState) {
- return (dispatch) => {
- dispatch({type: SET_UPDATE_STATE, updateState});
- };
-}
diff --git a/app/renderer/actions/index.js b/app/renderer/actions/index.js
deleted file mode 100644
index 0fc52134b7..0000000000
--- a/app/renderer/actions/index.js
+++ /dev/null
@@ -1,9 +0,0 @@
-import * as inspectorActions from './Inspector';
-import * as sessionActions from './Session';
-import * as updaterActions from './Updater';
-
-export default {
- ...inspectorActions,
- ...sessionActions,
- ...updaterActions,
-};
diff --git a/app/renderer/components/AntdTypes.js b/app/renderer/components/AntdTypes.js
deleted file mode 100644
index f27e3a24f6..0000000000
--- a/app/renderer/components/AntdTypes.js
+++ /dev/null
@@ -1,26 +0,0 @@
-const BUTTON = {
- DEFAULT: 'default',
- PRIMARY: 'primary',
- DISABLED: 'disabled',
- DANGER: 'danger',
-};
-
-const ALERT = {
- ERROR: 'error',
- WARNING: 'warning',
- INFO: 'info',
-};
-
-const INPUT = {
- NUMBER: 'number',
- TEXT: 'text',
- TEXTAREA: 'textarea',
- PASSWORD: 'password',
- SUBMIT: 'submit',
-};
-
-const ROW = {
- FLEX: 'flex',
-};
-
-export {BUTTON, ALERT, INPUT, ROW};
diff --git a/app/renderer/components/ErrorBoundary/ErrorMessage.js b/app/renderer/components/ErrorBoundary/ErrorMessage.js
deleted file mode 100644
index 0ac562c4be..0000000000
--- a/app/renderer/components/ErrorBoundary/ErrorMessage.js
+++ /dev/null
@@ -1,45 +0,0 @@
-import {CopyOutlined} from '@ant-design/icons';
-import {Alert, Button, Tooltip} from 'antd';
-import React from 'react';
-
-import {shell} from '../../polyfills';
-import {withTranslation} from '../../util';
-import {ALERT} from '../AntdTypes';
-import styles from './ErrorMessage.css';
-
-const CREATE_ISSUE_URL = 'https://github.com/appium/appium-inspector/issues/new/choose';
-
-const ErrorMessage = ({error, copyTrace, t}) => (
-
-);
-
-export default withTranslation(ErrorMessage);
diff --git a/app/renderer/components/Inspector/Commands.js b/app/renderer/components/Inspector/Commands.js
deleted file mode 100644
index 331855efed..0000000000
--- a/app/renderer/components/Inspector/Commands.js
+++ /dev/null
@@ -1,213 +0,0 @@
-import {
- Alert,
- Button,
- Col,
- Collapse,
- Input,
- Modal,
- Row,
- Space,
- Switch,
- Tooltip,
- notification,
-} from 'antd';
-import _ from 'lodash';
-import React from 'react';
-
-import {ALERT, INPUT} from '../AntdTypes';
-import InspectorStyles from './Inspector.css';
-import {COMMAND_ARG_TYPES, COMMAND_DEFINITIONS} from './shared';
-
-const Commands = (props) => {
- const {
- pendingCommand,
- cancelPendingCommand,
- setCommandArg,
- applyClientMethod,
- automationName,
- t,
- } = props;
-
- const startPerformingCommand = (commandName, command) => {
- const {startEnteringCommandArgs} = props;
- if (_.isEmpty(command.args)) {
- applyClientMethod({
- methodName: commandName,
- args: [],
- skipRefresh: !command.refresh,
- ignoreResult: false,
- });
- } else {
- startEnteringCommandArgs(commandName, command);
- }
- };
-
- const parseJsonString = (jsonString) => {
- try {
- return JSON.parse(jsonString);
- } catch (err) {
- notification.error({
- message: t('invalidJson'),
- description: err.message,
- duration: 5,
- });
- return null;
- }
- };
-
- const executeCommand = () => {
- const {args, commandName, command} = pendingCommand;
- const {refresh} = command;
-
- // Make a copy of the arguments to avoid state mutation
- let copiedArgs = _.cloneDeep(args);
-
- let isJsonValid = true;
-
- // Special case for 'rotateDevice'
- if (commandName === 'rotateDevice') {
- copiedArgs = {
- x: args[0],
- y: args[1],
- duration: args[2],
- radius: args[3],
- rotation: args[4],
- touchCount: args[5],
- };
- }
-
- // Special case for 'setGeoLocation'
- if (commandName === 'setGeoLocation') {
- copiedArgs = {latitude: args[0], longitude: args[1], altitude: args[2]};
- }
-
- // Special case for 'executeScript'
- // Unlike other clients, webdriver/WDIO requires the argument object to be wrapped in an array,
- // but we should still allow omitting the array to avoid confusion for non-WDIO users.
- // So we can have 4 cases for the argument: undefined, "[]", "{...}", "[{...}]"
- if (commandName === 'executeScript') {
- if (_.isEmpty(args[1])) {
- copiedArgs[1] = [];
- } else {
- copiedArgs[1] = parseJsonString(args[1]);
- if (copiedArgs[1] === null) {
- isJsonValid = false;
- } else if (!_.isArray(copiedArgs[1])) {
- copiedArgs[1] = [copiedArgs[1]];
- }
- }
- }
-
- // Special case for 'updateSettings'
- if (commandName === 'updateSettings') {
- if (_.isString(args[0])) {
- copiedArgs[0] = parseJsonString(args[0]);
- if (copiedArgs[0] === null) {
- isJsonValid = false;
- }
- }
- }
-
- if (isJsonValid) {
- applyClientMethod({
- methodName: commandName,
- args: copiedArgs,
- skipRefresh: !refresh,
- ignoreResult: false,
- });
- }
-
- cancelPendingCommand();
- };
-
- const generateCommandNotes = (notes) =>
- notes.map((note) => (_.isArray(note) ? `${t(note[0])}: ${note[1]}` : t(note))).join('; ');
-
- return (
-
-
- {t('commandsDescription')}
-
- {_.toPairs(COMMAND_DEFINITIONS).map(([commandGroup, commands]) => (
-
-
- {_.toPairs(commands).map(
- ([commandName, command], index) =>
- (!automationName ||
- !command.drivers ||
- command.drivers.includes(_.toLower(automationName))) && (
-
-
-
- startPerformingCommand(commandName, command)}>
- {commandName}
-
-
-
-
- ),
- )}
-
-
- ))}
-
-
- {!!pendingCommand && (
-
executeCommand()}
- onCancel={() => cancelPendingCommand()}
- >
- {pendingCommand.command.notes && (
-
- )}
- {!_.isEmpty(pendingCommand.command.args) &&
- _.map(pendingCommand.command.args, ([argName, argType], index) => (
-
-
- {argType === COMMAND_ARG_TYPES.NUMBER && (
- setCommandArg(index, _.toNumber(e.target.value))}
- />
- )}
- {argType === COMMAND_ARG_TYPES.BOOLEAN && (
-
- {t(argName)}{' '}
- setCommandArg(index, v)}
- />
-
- )}
- {argType === COMMAND_ARG_TYPES.STRING && (
- setCommandArg(index, e.target.value)}
- />
- )}
-
-
- ))}
-
- )}
-
- );
-};
-
-export default Commands;
diff --git a/app/renderer/components/Inspector/ElementLocator.js b/app/renderer/components/Inspector/ElementLocator.js
deleted file mode 100644
index cc74fa2f52..0000000000
--- a/app/renderer/components/Inspector/ElementLocator.js
+++ /dev/null
@@ -1,85 +0,0 @@
-import {Alert, Input, Radio, Row, Space} from 'antd';
-import React from 'react';
-
-import {ALERT} from '../AntdTypes';
-import InspectorStyles from './Inspector.css';
-
-const STRAT_ID = ['id', 'Id'];
-const STRAT_XPATH = ['xpath', 'XPath'];
-const STRAT_NAME = ['name', 'Name'];
-const STRAT_CLASS_NAME = ['class name', 'Class Name'];
-const STRAT_ACCESSIBILITY_ID = ['accessibility id', 'Accessibility ID'];
-const STRAT_PREDICATE = ['-ios predicate string', 'Predicate String'];
-const STRAT_CLASS_CHAIN = ['-ios class chain', 'Class Chain'];
-const STRAT_UIAUTOMATOR = ['-android uiautomator', 'UIAutomator'];
-const STRAT_DATAMATCHER = ['-android datamatcher', 'DataMatcher'];
-const STRAT_VIEWTAG = ['-android viewtag', 'View Tag'];
-
-const locatorStrategies = (automationName) => {
- let strategies = [STRAT_ID, STRAT_XPATH, STRAT_NAME, STRAT_CLASS_NAME, STRAT_ACCESSIBILITY_ID];
- if (!automationName) {
- return strategies;
- }
- switch (automationName.toLowerCase()) {
- case 'xcuitest':
- case 'mac2':
- strategies.push(STRAT_PREDICATE, STRAT_CLASS_CHAIN);
- break;
- case 'espresso':
- strategies.push(STRAT_DATAMATCHER, STRAT_VIEWTAG);
- break;
- case 'uiautomator2':
- strategies.push(STRAT_UIAUTOMATOR);
- break;
- }
- return strategies;
-};
-
-const ElementLocator = (props) => {
- const {
- setLocatorTestValue,
- locatorTestValue,
- setLocatorTestStrategy,
- locatorTestStrategy,
- automationName,
- t,
- } = props;
-
- return (
-
- {t('locatorStrategy')}
-
- setLocatorTestStrategy(e.target.value)}
- defaultValue={locatorTestStrategy}
- >
-
- {locatorStrategies(automationName).map(([strategyValue, strategyName]) => (
-
- {strategyName}
-
- ))}
-
-
-
- {!automationName && (
-
- )}
- {t('selector')}
- setLocatorTestValue(e.target.value)}
- value={locatorTestValue}
- allowClear={true}
- rows={3}
- />
-
- );
-};
-
-export default ElementLocator;
diff --git a/app/renderer/components/Inspector/GestureEditor.js b/app/renderer/components/Inspector/GestureEditor.js
deleted file mode 100644
index 864adf71d0..0000000000
--- a/app/renderer/components/Inspector/GestureEditor.js
+++ /dev/null
@@ -1,744 +0,0 @@
-import {
- AimOutlined,
- CloseOutlined,
- DownCircleOutlined,
- PauseCircleOutlined,
- PlayCircleOutlined,
- PlusCircleOutlined,
- QuestionCircleOutlined,
- RightCircleOutlined,
- UpCircleOutlined,
-} from '@ant-design/icons';
-import {
- Button,
- Card,
- Col,
- Divider,
- Input,
- PageHeader,
- Popover,
- Row,
- Select,
- Space,
- Steps,
- Tabs,
- Tooltip,
- notification,
-} from 'antd';
-import _ from 'lodash';
-import React, {useEffect, useState} from 'react';
-
-import InspectorCSS from './Inspector.css';
-import {
- POINTER_TYPES,
- SCREENSHOT_INTERACTION_MODE,
- percentageToPixels,
- pixelsToPercentage,
-} from './shared';
-
-const {POINTER_UP, POINTER_DOWN, PAUSE, POINTER_MOVE} = POINTER_TYPES;
-
-const DEFAULT_DURATION_TIME = 2500;
-const COLORS = ['#FF3333', '#FF8F00', '#B65FF4', '#6CFF00', '#00FFDC'];
-const BUTTONS = {LEFT: 0, RIGHT: 1};
-const ACTION_TYPES = {ADD: 'add', REMOVE: 'remove'};
-const MSG_TYPES = {ERROR: 'error', SUCCESS: 'success'};
-const COORD_TYPE = {PERCENTAGES: 'percentages', PIXELS: 'pixels'};
-const TICK_PROPS = {
- POINTER_TYPE: 'pointerType',
- DURATION: 'duration',
- BUTTON: 'button',
- X: 'x',
- Y: 'y',
-};
-const CURSOR = {POINTER: 'pointer', TEXT: 'text'};
-const STATUS = {WAIT: 'wait', FINISH: 'finish', COLOR: '#FFFFFF', FILLER: 'filler'};
-const DISPLAY = {
- [POINTER_UP]: 'Pointer Up',
- [POINTER_DOWN]: 'Pointer Down',
- [PAUSE]: 'Pause',
- [POINTER_MOVE]: 'Move',
-};
-
-const DEFAULT_POINTERS = () => [
- {
- name: 'pointer1',
- ticks: [{id: '1.1'}],
- color: COLORS[0],
- id: '1',
- },
-];
-
-/**
- * Shows the gesture editor interface
- */
-const GestureEditor = (props) => {
- const {
- loadedGesture,
- saveGesture,
- tickCoordinates,
- selectedTick,
- selectTick,
- unselectTick,
- windowSize,
- t,
- } = props;
-
- const [pointers, setPointers] = useState(
- loadedGesture ? loadedGesture.actions : DEFAULT_POINTERS(),
- );
- const [name, setName] = useState(loadedGesture ? loadedGesture.name : t('Untitled Gesture'));
- const [description, setDescription] = useState(
- loadedGesture ? loadedGesture.description : t('Add Description'),
- );
- const [coordType, setCoordType] = useState(COORD_TYPE.PERCENTAGES);
- const [activePointerId, setActivePointerId] = useState('1');
-
- // Draw gesture whenever pointers change
- useEffect(() => {
- const {displayGesture} = props;
- const convertedPointers = getConvertedPointers(COORD_TYPE.PIXELS);
- displayGesture(convertedPointers);
- }, [pointers]);
-
- // Retrieve coordinates when user taps screenshot
- useEffect(() => {
- if (tickCoordinates) {
- updateCoordinates(selectedTick, tickCoordinates.x, tickCoordinates.y);
- }
- }, [selectedTick, tickCoordinates]);
-
- const onSave = () => {
- const {id, date} = loadedGesture;
- if (duplicatePointerNames(pointers)) {
- return null;
- }
- const gesture = {
- name,
- description,
- id,
- date,
- actions: getConvertedPointers(COORD_TYPE.PERCENTAGES),
- };
- saveGesture(gesture);
- displayNotificationMsg(MSG_TYPES.SUCCESS, t('Gesture saved'));
- };
-
- const onSaveAs = () => {
- if (duplicatePointerNames(pointers)) {
- return null;
- }
- const gesture = {name, description, actions: getConvertedPointers(COORD_TYPE.PERCENTAGES)};
- saveGesture(gesture);
- displayNotificationMsg(MSG_TYPES.SUCCESS, t('Gesture saved as', {gestureName: name}));
- onBack();
- };
-
- const onPlay = () => {
- const {applyClientMethod} = props;
- if (duplicatePointerNames(pointers)) {
- return null;
- }
- const formattedPointers = getW3CPointers();
- applyClientMethod({methodName: SCREENSHOT_INTERACTION_MODE.GESTURE, args: [formattedPointers]});
- };
-
- const onBack = () => {
- const {hideGestureEditor, removeLoadedGesture, removeGestureDisplay} = props;
- unselectTick();
- removeGestureDisplay();
- removeLoadedGesture();
- hideGestureEditor();
- };
-
- // Check if pointer names are duplicates before saving/playing
- const duplicatePointerNames = (localPointers) => {
- const duplicates = {};
- for (const pointer of localPointers) {
- if (duplicates[pointer.name]) {
- displayNotificationMsg(MSG_TYPES.ERROR, t('Duplicate pointer names are not allowed'));
- return true;
- } else {
- duplicates[pointer.name] = pointer;
- }
- }
- return false;
- };
-
- const displayNotificationMsg = (type, msg) => {
- notification[type]({
- message: msg,
- duration: 5,
- });
- };
-
- // Change gesture datastructure to fit Webdriver spec
- const getW3CPointers = () => {
- const newPointers = {};
- const currentPointers = getConvertedPointers(COORD_TYPE.PIXELS);
- for (const pointer of currentPointers) {
- newPointers[pointer.name] = pointer.ticks.map((tick) => _.omit(tick, 'id'));
- }
- return newPointers;
- };
-
- // This converts all the coordinates in the gesture to px/%
- const getConvertedPointers = (type) => {
- const {width, height} = windowSize;
- if (type === coordType) {
- return pointers;
- }
- const newPointers = _.cloneDeep(pointers);
- for (const pointer of newPointers) {
- for (const tick of pointer.ticks) {
- if (tick.type === POINTER_TYPES.POINTER_MOVE) {
- if (type === COORD_TYPE.PIXELS) {
- tick.x = percentageToPixels(tick.x, width);
- tick.y = percentageToPixels(tick.y, height);
- } else {
- tick.x = pixelsToPercentage(tick.x, width);
- tick.y = pixelsToPercentage(tick.y, height);
- }
- }
- }
- }
- return newPointers;
- };
-
- const getDefaultMoveDuration = (ticks, tickId, x2, y2, coordFromTap) => {
- const {width, height} = windowSize;
- const ticksExceptCurrent = ticks.filter((tick) => tick.id !== tickId);
- const prevPointerMoves = [];
- for (const tick of ticksExceptCurrent) {
- if (tick.type === POINTER_MOVE && tick.x !== undefined && tick.y !== undefined) {
- prevPointerMoves.push({x: tick.x, y: tick.y});
- }
- }
- const len = prevPointerMoves.length;
- if (len === 0) {
- return 0;
- }
- const obj = {x1: prevPointerMoves[len - 1].x, y1: prevPointerMoves[len - 1].y, x2, y2};
- if (coordType === COORD_TYPE.PERCENTAGES) {
- obj.x1 = percentageToPixels(obj.x1, width);
- obj.y1 = percentageToPixels(obj.y1, height);
- // No need to convert coordinates from tap since they are in px
- if (!coordFromTap) {
- obj.x2 = percentageToPixels(obj.x2, width);
- obj.y2 = percentageToPixels(obj.y2, height);
- }
- }
- const calcLength = (v1, v2) => Math.sqrt(v1 ** 2 + v2 ** 2);
- const calcDiff = (v1, v2) => Math.abs(v2) - Math.abs(v1);
- const xDiff = calcDiff(obj.x1, obj.x2);
- const yDiff = calcDiff(obj.y1, obj.y2);
- const maxScreenLength = calcLength(width, height);
- const lineLength = calcLength(xDiff, yDiff);
- const lineLengthPct = lineLength / maxScreenLength;
- return Math.round(lineLengthPct * DEFAULT_DURATION_TIME);
- };
-
- // Update tapped coordinates within local state
- const updateCoordinates = (tickKey, updateX, updateY) => {
- if (!updateX || !updateY) {
- return null;
- }
- const {width, height} = windowSize;
- const copiedPointers = _.cloneDeep(pointers);
- const currentPointer = copiedPointers.find((pointer) => pointer.id === tickKey[0]);
- const currentTick = currentPointer.ticks.find((tick) => tick.id === tickKey);
- const x = parseFloat(updateX, 10);
- const y = parseFloat(updateY, 10);
- if (coordType === COORD_TYPE.PERCENTAGES) {
- currentTick.x = pixelsToPercentage(x, width);
- currentTick.y = pixelsToPercentage(y, height);
- } else {
- currentTick.x = x;
- currentTick.y = y;
- }
-
- if (currentTick.duration === undefined) {
- currentTick.duration = getDefaultMoveDuration(
- currentPointer.ticks,
- currentTick.id,
- x,
- y,
- true,
- );
- }
- setPointers(copiedPointers);
- };
-
- const addPointer = () => {
- const key = pointers.length + 1;
- const pointerId = String(key);
- const copiedPointers = _.cloneDeep(pointers);
- copiedPointers.push({
- name: `pointer${key}`,
- ticks: [{id: `${key}.1`}],
- id: pointerId,
- color: COLORS[key - 1],
- });
- setPointers(copiedPointers);
- setActivePointerId(pointerId);
- };
-
- const deletePointer = (targetKey) => {
- // 'newActivePointerId' variable keeps track of the previous pointer before deleting the current one
- // its default is the first pointer
- let newActivePointerId = '1';
- const pointersExceptCurrent = pointers.filter((pointer) => pointer.id !== targetKey);
- const newPointers = pointersExceptCurrent.map((pointer, index) => {
- const id = String(index + 1);
- if (id !== pointer.id) {
- pointer.id = id;
- pointer.color = COLORS[index];
- pointer.ticks = pointer.ticks.map((tick) => {
- tick.id = `${id}.${tick.id[2]}`;
- return tick;
- });
- } else {
- newActivePointerId = pointer.id;
- }
- return pointer;
- });
- unselectTick();
- setPointers(newPointers);
- setActivePointerId(newActivePointerId);
- };
-
- const addTick = (pointerKey) => {
- const copiedPointers = _.cloneDeep(pointers);
- const currentPointer = copiedPointers.find((pointer) => pointer.id === pointerKey);
- const id = `${pointerKey}.${currentPointer.ticks.length + 1}`;
- currentPointer.ticks.push({id});
- setPointers(copiedPointers);
- };
-
- const deleteTick = (pointerKey, tickKey) => {
- const copiedPointers = _.cloneDeep(pointers);
- const currentPointer = copiedPointers.find((pointer) => pointer.id === pointerKey);
- const ticksToKeep = currentPointer.ticks.filter((tick) => tick.id !== tickKey);
- const newTicks = ticksToKeep.map((tick, index) => {
- const id = String(index + 1);
- if (tick.id !== id) {
- tick.id = `${tick.id[0]}.${id}`;
- }
- return tick;
- });
- currentPointer.ticks = newTicks;
- unselectTick();
- setPointers(copiedPointers);
- };
-
- // Updates the current tick within local state
- const updateTick = (tick, msg, value) => {
- const copiedPointers = _.cloneDeep(pointers);
- const currentPointer = copiedPointers.find((p) => p.id === tick.id[0]);
- const targetTickIdx = currentPointer.ticks.findIndex((t) => t.id === tick.id);
- // currentTick can be assigned a new tick object if made changes to pointer types
- let currentTick = currentPointer.ticks[targetTickIdx];
-
- // We create an entire new tick for changes in pointer types to ensure previous properties are removed
- if (msg === TICK_PROPS.POINTER_TYPE) {
- if (value === POINTER_MOVE) {
- selectTick(tick.id);
- }
- currentTick = {
- id: tick.id,
- type: value,
- ...([POINTER_DOWN, POINTER_UP].includes(value) && {button: BUTTONS.LEFT}),
- ...(value === PAUSE && {duration: 0}),
- };
- } else {
- // We just modify the existing tick values
- currentTick[msg] = parseFloat(value, 10);
-
- // set default duration for if not set already
- if (
- currentTick.x !== undefined &&
- currentTick.y !== undefined &&
- currentTick.duration === undefined
- ) {
- currentTick.duration = getDefaultMoveDuration(
- currentPointer.ticks,
- tick.id,
- currentTick.x,
- currentTick.y,
- false,
- );
- }
- }
-
- currentPointer.ticks[targetTickIdx] = currentTick;
- setPointers(copiedPointers);
- };
-
- // Reformats the gesture only for the timeline by populating the 'filler' ticks for each pointer
- // to match same length to keep timeline lengths consistent and accurate
- const updateGestureForTimeline = () => {
- const copiedPointers = _.cloneDeep(pointers);
- const allTickLengths = copiedPointers.map((pointer) => pointer.ticks.length);
- const maxTickLength = Math.max(...allTickLengths);
- return copiedPointers.map((pointer) => {
- const currentLength = pointer.ticks.length;
- if (currentLength > 0) {
- pointer.ticks[currentLength - 1].customStep = STATUS.WAIT;
- if (currentLength < maxTickLength) {
- const fillers = Array.from({length: maxTickLength - currentLength}, () => ({
- type: STATUS.FILLER,
- color: STATUS.COLOR,
- }));
- pointer.ticks.push(...fillers);
- }
- }
- return pointer;
- });
- };
-
- const updatePointerName = (pointerName, pointerIndex) => {
- const copiedPointers = _.cloneDeep(pointers);
- copiedPointers[pointerIndex].name = pointerName;
- setPointers(copiedPointers);
- };
-
- const headerTitle = (
-
- setName(e.target.value)}
- size="small"
- />
-
- );
-
- const headerButtons = (
- <>
-
- {
- setPointers(getConvertedPointers(COORD_TYPE.PERCENTAGES));
- setCoordType(COORD_TYPE.PERCENTAGES);
- }}
- size="small"
- >
- %
-
- {
- setPointers(getConvertedPointers(COORD_TYPE.PIXELS));
- setCoordType(COORD_TYPE.PIXELS);
- }}
- size="small"
- >
- px
-
-
-
- } onClick={() => onPlay()} />
-
- onSaveAs()}>{t('saveAs')}
- onSave()} disabled={!loadedGesture}>
- {t('Save')}
-
- >
- );
-
- const headerDescription = (
-
- setDescription(e.target.value)}
- size="small"
- />
-
- );
-
- const regularTimelineIcon = (pointer, tick) => {
- const {type, duration, button, x, y} = tick;
- const iconStyle = {color: pointer.color};
- return (
- {t(DISPLAY[type])}}
- content={
-
- {duration !== undefined && (
-
- {t('Duration')}: {duration}ms
-
- )}
- {button !== undefined && (
-
- {t('Button')}: {button === BUTTONS.LEFT ? t('Left') : t('Right')}
-
- )}
- {x !== undefined && (
-
- X: {x}
- {coordType === COORD_TYPE.PIXELS ? 'px' : '%'}
-
- )}
- {y !== undefined && (
-
- Y: {y}
- {coordType === COORD_TYPE.PIXELS ? 'px' : '%'}
-
- )}
- {type === undefined &&
{t('Action Type Not Defined')}
}
-
- }
- >
- {type === POINTER_MOVE && (
-
- )}
- {type === POINTER_DOWN && (
-
- )}
- {type === POINTER_UP && (
-
- )}
- {type === PAUSE && (
-
- )}
- {type === undefined && (
-
- )}
-
- );
- };
-
- const timeline = updateGestureForTimeline().map((pointer) => (
-
- {
- if (tick.type !== STATUS.FILLER) {
- return {
- key: 'timeline-steps',
- status: tick.customStep || STATUS.FINISH,
- icon: regularTimelineIcon(pointer, tick),
- };
- } else {
- return {
- key: 'transparent-steps',
- status: STATUS.WAIT,
- icon: (
-
- ),
- };
- }
- })}
- />
-
- ));
-
- const tickButton = (tick) => (
-
-
- updateTick(tick, TICK_PROPS.BUTTON, BUTTONS.LEFT)}
- >
- {t('Left')}
-
- updateTick(tick, TICK_PROPS.BUTTON, BUTTONS.RIGHT)}
- >
- {t('Right')}
-
-
-
- );
-
- const tickDuration = (tick) => (
-
- updateTick(tick, TICK_PROPS.DURATION, e.target.value)}
- addonAfter="ms"
- />
-
- );
-
- const tickCoords = (tick) => (
-
-
- updateTick(tick, TICK_PROPS.X, e.target.value)}
- />
- updateTick(tick, TICK_PROPS.Y, e.target.value)}
- />
-
-
- );
-
- const tickType = (tick) => (
-
- updateTick(tick, TICK_PROPS.POINTER_TYPE, e)}
- >
-
- {t(DISPLAY.pointerMove)}
-
-
- {t(DISPLAY.pointerDown)}
-
-
- {t(DISPLAY.pointerUp)}
-
-
- {t(DISPLAY.pause)}
-
-
-
- );
-
- const tapCoordinatesBtn = (tickId) => (
-
- }
- onClick={() => (selectedTick === tickId ? unselectTick() : selectTick(tickId))}
- />
-
- );
-
- const tickCard = (tick) => (
-
- {tick.type === POINTER_MOVE && tapCoordinatesBtn(tick.id)}
- }
- onClick={() => deleteTick(tick.id[0], tick.id)}
- />
- >
- }
- >
-
- {tickType(tick)}
- {(tick.type === POINTER_MOVE || tick.type === PAUSE) && tickDuration(tick)}
- {(tick.type === POINTER_DOWN || tick.type === POINTER_UP) && tickButton(tick)}
- {tick.type === POINTER_MOVE && tickCoords(tick)}
-
-
- );
-
- const pointerTicksGrid = (pointer) => (
-
- {pointer.ticks.map((tick) => (
-
- {tickCard(tick)}
-
- ))}
-
-
-
- }
- onClick={() => addTick(pointer.id)}
- />
-
-
-
-
- );
-
- const pointerTabs = pointers.map((pointer, index) => ({
- label: (
-
- updatePointerName(e.target.value, index)}
- />
-
- ),
- key: pointer.id,
- children: pointerTicksGrid(pointer),
- }));
-
- return (
- <>
- onBack()}
- title={headerTitle}
- extra={headerButtons}
- footer={
- <>
- {headerDescription}
-
- {timeline}
- >
- }
- />
- setActivePointerId(pointerId)}
- activeKey={activePointerId}
- onEdit={(targetKey, action) =>
- action === ACTION_TYPES.ADD ? addPointer() : deletePointer(targetKey)
- }
- hideAdd={pointers.length === 5}
- centered={true}
- tabBarGutter={10}
- items={pointerTabs}
- />
- >
- );
-};
-
-export default GestureEditor;
diff --git a/app/renderer/components/Inspector/HeaderButtons.js b/app/renderer/components/Inspector/HeaderButtons.js
deleted file mode 100644
index ab899211d3..0000000000
--- a/app/renderer/components/Inspector/HeaderButtons.js
+++ /dev/null
@@ -1,234 +0,0 @@
-import {
- AppstoreOutlined,
- CloseOutlined,
- ExclamationCircleOutlined,
- GlobalOutlined,
- InfoCircleOutlined,
- PauseCircleOutlined,
- PlayCircleOutlined,
- ReloadOutlined,
- SearchOutlined,
- VideoCameraOutlined,
-} from '@ant-design/icons';
-import {Button, Select, Space, Tooltip} from 'antd';
-import React from 'react';
-import {BiCircle, BiSquare} from 'react-icons/bi';
-import {HiOutlineHome, HiOutlineMicrophone} from 'react-icons/hi';
-import {IoChevronBackOutline} from 'react-icons/io5';
-
-import {shell} from '../../polyfills';
-import {BUTTON} from '../AntdTypes';
-import InspectorStyles from './Inspector.css';
-import {APP_MODE} from './shared';
-
-const HYBRID_MODE_DOCS_URL =
- 'https://appium.github.io/appium.io/docs/en/writing-running-appium/web/hybrid/';
-
-const HeaderButtons = (props) => {
- const {
- selectAppMode,
- appMode,
- mjpegScreenshotUrl,
- isSourceRefreshOn,
- toggleRefreshingState,
- isRecording,
- startRecording,
- pauseRecording,
- showLocatorTestModal,
- showSiriCommandModal,
- applyClientMethod,
- quitCurrentSession,
- driver,
- contexts,
- currentContext,
- setContext,
- t,
- } = props;
-
- const deviceControls = (
-
- {driver && driver.client.isIOS && (
- <>
-
- }
- onClick={() =>
- applyClientMethod({
- methodName: 'executeScript',
- args: ['mobile:pressButton', [{name: 'home'}]],
- })
- }
- />
-
-
- }
- onClick={showSiriCommandModal}
- />
-
- >
- )}
- {driver && driver.client.isAndroid && (
- <>
-
- }
- onClick={() => applyClientMethod({methodName: 'pressKeyCode', args: [4]})}
- />
-
-
- }
- onClick={() => applyClientMethod({methodName: 'pressKeyCode', args: [3]})}
- />
-
-
- }
- onClick={() => applyClientMethod({methodName: 'pressKeyCode', args: [187]})}
- />
-
- >
- )}
-
- );
-
- const appModeControls = (
-
-
- }
- onClick={() => selectAppMode(APP_MODE.NATIVE)}
- type={appMode === APP_MODE.NATIVE ? BUTTON.PRIMARY : BUTTON.DEFAULT}
- />
-
-
- }
- onClick={() => selectAppMode(APP_MODE.WEB_HYBRID)}
- type={appMode === APP_MODE.WEB_HYBRID ? BUTTON.PRIMARY : BUTTON.DEFAULT}
- />
-
- {contexts && contexts.length === 1 && (
-
-
-
-
-
- )}
- {contexts && contexts.length > 1 && (
- <>
- {
- setContext(value);
- applyClientMethod({methodName: 'switchContext', args: [value]});
- }}
- >
- {contexts.map(({id, title}) => (
-
- {title ? `${title} (${id})` : id}
-
- ))}
-
-
- {t('contextDropdownInfo')}{' '}
- e.preventDefault() || shell.openExternal(HYBRID_MODE_DOCS_URL)}>
- {HYBRID_MODE_DOCS_URL}
-
- >
- }
- overlayClassName={InspectorStyles['wide-tooltip']}
- >
-
-
-
-
- >
- )}
-
- );
-
- const generalControls = (
-
- {mjpegScreenshotUrl && !isSourceRefreshOn && (
-
- }
- onClick={toggleRefreshingState}
- />
-
- )}
- {mjpegScreenshotUrl && isSourceRefreshOn && (
-
- }
- onClick={toggleRefreshingState}
- />
-
- )}
-
- }
- onClick={() => applyClientMethod({methodName: 'getPageSource'})}
- />
-
-
- } onClick={showLocatorTestModal} />
-
- {!isRecording && (
-
- } onClick={startRecording} />
-
- )}
- {isRecording && (
-
- }
- type={BUTTON.DANGER}
- onClick={pauseRecording}
- />
-
- )}
-
- );
-
- const quitSessionButton = (
-
- } onClick={quitCurrentSession} />
-
- );
-
- return (
-
-
- {deviceControls}
- {appModeControls}
- {generalControls}
- {quitSessionButton}
-
-
- );
-};
-
-export default HeaderButtons;
diff --git a/app/renderer/components/Inspector/HighlighterRectForElem.js b/app/renderer/components/Inspector/HighlighterRectForElem.js
deleted file mode 100644
index e7a3687922..0000000000
--- a/app/renderer/components/Inspector/HighlighterRectForElem.js
+++ /dev/null
@@ -1,47 +0,0 @@
-import React from 'react';
-
-import InspectorCSS from './Inspector.css';
-
-/**
- * Absolute positioned divs that overlay the app screenshot and highlight the bounding
- * boxes of the elements in the app
- */
-const HighlighterRectForElem = (props) => {
- const {
- hoveredElement = {},
- selectHoveredElement,
- unselectHoveredElement,
- selectedElement = {},
- selectElement,
- unselectElement,
- dimensions,
- element,
- } = props;
-
- const {width, height, left, top} = dimensions;
- const key = element.path;
- let highlighterClasses = [InspectorCSS['highlighter-box']];
-
- // Add class + special classes to hovered and selected elements
- if (hoveredElement.path === element.path) {
- highlighterClasses.push(InspectorCSS['hovered-element-box']);
- }
- if (selectedElement.path === element.path) {
- highlighterClasses.push(InspectorCSS['inspected-element-box']);
- }
-
- return (
- selectHoveredElement(key)}
- onMouseOut={unselectHoveredElement}
- onClick={() => (key === selectedElement.path ? unselectElement() : selectElement(key))}
- key={key}
- style={{left: left || 0, top: top || 0, width: width || 0, height: height || 0}}
- >
-
-
- );
-};
-
-export default HighlighterRectForElem;
diff --git a/app/renderer/components/Inspector/Inspector.css b/app/renderer/components/Inspector/Inspector.css
deleted file mode 100644
index 632fa25f65..0000000000
--- a/app/renderer/components/Inspector/Inspector.css
+++ /dev/null
@@ -1,737 +0,0 @@
-.inspector-container {
- display: flex;
- flex-direction: column;
- height: 100%;
-}
-
-.inspector-toolbar {
- display: flex;
- flex-direction: row;
- align-items: center;
- justify-content: center;
- width: 100%;
- height: 50px;
- background: linear-gradient(180deg, #e2e2e2, #e0e0e0, 10%, #d6d6d6, 50%, #cacaca);
- border-top: 1px solid #f5f4f5;
- border-bottom: 1px solid #a5a4a5;
- -webkit-app-region: drag;
-}
-
-.inspector-toolbar .ant-btn {
- height: auto !important;
- width: auto !important;
-}
-
-.inspector-toolbar button {
- border-color: #cacaca;
- -webkit-app-region: no-drag;
-}
-
-.inspector-main {
- display: flex;
- flex: 1;
- flex-direction: row;
- padding: 1em;
- max-width: 100%;
- height: calc(100% - 50px);
-}
-
-.inspector-main .screenshot-container {
- max-width: 500px;
- max-height: calc(100% - 50px);
- flex-grow: 1;
- flex-shrink: 2;
- flex-basis: 400px;
-}
-
-.screenshot-container .screenshot-controls {
- display: flex;
- flex-direction: row;
- align-items: center;
- justify-content: center;
- width: 100%;
- height: 38px;
- margin-bottom: 12px;
- -webkit-app-region: drag;
-}
-
-.inspector-main .screenshot-container img {
- max-width: 100%;
- max-height: 100%;
- box-shadow: 0px 0px 1px 2px rgba(0, 0, 0, 0.05);
-}
-
-.inspector-main .screenshot-container .screenshotBox {
- width: 100%;
- height: 100%;
- text-align: left;
- position: absolute;
- overflow: hidden;
-}
-
-.inspector-main .interaction-tab-container :global(.ant-tabs-tabpane) {
- height: 100%;
-}
-
-.inspector-main .interaction-tab-container {
- position: relative;
- flex-grow: 1;
- flex-basis: 550px;
- min-width: 380px;
- padding-left: 1em;
- display: flex;
- flex-flow: column;
- height: 100%;
-}
-
-.inspector-main :global(.ant-card-head) {
- max-height: 48px;
- padding: 0px 12px;
-}
-
-.inspector-main :global(.ant-card-head-wrapper) {
- max-height: 48px;
-}
-
-.inspector-main :global(.ant-card-body) {
- height: calc(100% - 48px);
- padding: 12px;
- scrollbar-width: none; /* -webkit-scrollbar for Firefox */
-}
-
-.inspector-main .interaction-tab-container :global(.ant-tabs) {
- height: 100%;
-}
-
-.inspector-main .interaction-tab-container :global(.ant-tabs-content) {
- height: 100%;
-}
-
-.inspector-main .interaction-tab-container :global(.action-row) {
- display: flex;
- height: 100%;
-}
-
-.inspector-main .interaction-tab-container :global(.action-col) {
- min-width: 50%;
- max-width: 50%;
-}
-
-.inspector-main .interaction-tab-container :global(.ant-card) {
- height: 100%;
-}
-
-.inspector-main .tree-container {
- height: 100%;
- overflow: auto;
-}
-
-.session-info-table {
- margin-right: -1em;
-}
-
-.session-code-box {
- margin-top: 1em;
-}
-
-.session-inner-table,
-.session-inner-table :global(.ant-table) {
- width: 102%;
- margin-left: -32px;
-}
-
-.session-inner-table :global(.ant-table-body)::-webkit-scrollbar {
- -webkit-appearance: none;
- width: 7px;
-}
-
-.session-inner-table :global(.ant-table-body)::-webkit-scrollbar-thumb {
- border-radius: 4px;
- background-color: rgba(0, 0, 0, 0.5);
- box-shadow: 0 0 1px rgba(255, 255, 255, 0.5);
-}
-
-.inspector-main .interaction-tab-container .scroll-buttons {
- position: absolute;
- bottom: 0;
- left: 0;
- right: 0;
- padding-left: 1em;
- padding-bottom: 1em;
-}
-
-.inspector-main .interaction-tab-container .scroll-buttons :global(button) {
- margin: 1em;
-}
-
-.inspector-main .interaction-tab-container .scroll-buttons .scroll-right {
- float: right;
-}
-
-._inspector-main_0387c .ant-card-body {
- height: 100%;
- padding: 12px;
-}
-
-.inspector-main .interaction-tab-card :global(.ant-card-body) {
- overflow: scroll;
-}
-
-.inspector-main .interaction-tab-card {
- flex: 2;
-}
-
-.inspector-main :global(.ant-card-body::-webkit-scrollbar) {
- background: transparent;
- width: 14px;
-}
-
-.inspector-main .interaction-tab-container .interaction-tab-card {
- height: 100%;
-}
-
-.highlighter-box {
- position: absolute;
- opacity: 0.5;
- cursor: pointer;
-}
-
-.highlighter-box.inspected-element-box div {
- background-color: rgb(90, 90, 178);
- visibility: hidden;
- transition: background-color 0.2s ease-in-out;
-}
-
-.highlighter-box.hovered-element-box div {
- background-color: yellow;
- visibility: hidden;
- transition: background-color 0.2s ease-in-out;
-}
-
-.highlighter-box.inspected-element-box.hovered-element-box div {
- background-color: rgb(100, 255, 100);
- transition: background-color 0.2s ease-in-out;
-}
-
-.highlighter-box.hovered-element-box div,
-.highlighter-box.inspected-element-box div {
- position: relative;
- height: 100%;
- width: 100%;
- visibility: visible;
-}
-
-.centroid-box {
- width: 2.2vh;
- height: 2.2vh;
- border-style: solid;
- border-color: #ff4141;
- border-width: 2px;
- position: absolute;
- overflow: hidden;
- cursor: pointer;
- visibility: visible;
- transform: translate(-50%, -50%);
-}
-
-.centroid-box.centroid {
- opacity: 1;
- transition: opacity 0.2s ease-in-out;
-}
-
-.centroid-box.centroid.inspected-element-box div {
- background-color: blue;
- opacity: 0.5;
- visibility: hidden;
- transition:
- opacity 0.2s ease-in-out,
- background-color 0.2s ease-in-out;
-}
-
-.centroid-box.centroid.hovered-element-box div {
- background-color: #ff0000;
- opacity: 0.5;
- visibility: hidden;
- transition:
- opacity 0.2s ease-in-out,
- background-color 0.2s ease-in-out;
-}
-
-.centroid-box.centroid.inspected-element-box.hovered-element-box div {
- background-color: green;
- opacity: 0.5;
- transition:
- opacity 0.2s ease-in-out,
- background-color 0.2s ease-in-out;
-}
-
-.centroid-box.centroid.hovered-element-box div,
-.centroid-box.centroid.inspected-element-box div {
- position: relative;
- height: 100%;
- width: 100%;
- visibility: visible;
-}
-
-.centroid-box.overlap {
- border-style: dashed;
- border-color: #178b00;
- z-index: 4;
- opacity: 1;
- transition: opacity 0.2s ease-in-out;
-}
-
-.centroid-box.overlap.inspected-element-box div {
- background-color: blue;
- opacity: 0.5;
- visibility: hidden;
- transition:
- opacity 0.2s ease-in-out,
- background-color 0.2s ease-in-out;
-}
-
-.centroid-box.overlap.hovered-element-box div {
- background-color: #178b00;
- opacity: 0.5;
- visibility: hidden;
- transition:
- opacity 0.2s ease-in-out,
- background-color 0.2s ease-in-out;
-}
-
-.centroid-box.overlap.inspected-element-box.hovered-element-box div {
- background-color: rgb(113, 253, 113);
- opacity: 0.5;
- transition:
- opacity 0.2s ease-in-out,
- background-color 0.2s ease-in-out;
-}
-
-.centroid-box.overlap.hovered-element-box div,
-.centroid-box.overlap.inspected-element-box div {
- position: relative;
- height: 100%;
- width: 100%;
- visibility: visible;
-}
-
-.centroid-box.expand {
- z-index: 3;
- background-color: #ffffff;
- opacity: 1;
- transition: opacity 0.2s ease-in-out;
-}
-
-.plus-minus {
- position: relative;
- top: -0.8vh;
- text-align: center;
- font-size: 2vh;
- font-weight: 800;
- color: #ff4141;
- opacity: 1;
- transition:
- opacity 0.2s ease-in-out,
- background-color 0.2s ease-in-out;
-}
-
-.centroid-box.expand.inspected-element-box div {
- background-color: rgb(62, 57, 57);
- transition: background-color 0.2s ease-in-out;
- visibility: hidden;
-}
-
-.centroid-box.expand.hovered-element-box div {
- background-color: #2f2f2f;
- transition: background-color 0.2s ease-in-out;
- visibility: hidden;
-}
-
-.centroid-box.expand.inspected-element-box.hovered-element-box div {
- background-color: rgb(255, 133, 133);
- transition: background-color 0.2s ease-in-out;
-}
-
-.centroid-box.expand.hovered-element-box div,
-.centroid-box.expand.inspected-element-box div {
- position: relative;
- height: 150%;
- width: 100%;
- visibility: visible;
-}
-
-.custom-button-icon {
- font-size: 16px;
- vertical-align: middle;
-}
-
-.wide-tooltip {
- max-width: 400px;
-}
-
-.contexts-custom-btn {
- height: 30px;
- width: 30px;
- color: #ffffff;
- margin-top: 1px;
- padding: 3px 0 0 7px;
-}
-
-.no-contexts-info-icon {
- background-color: #faad14;
-}
-
-.contexts-info-icon {
- background-color: #1890ff;
-}
-
-.header-context-selector {
- width: 350px;
-}
-
-.elementActions {
- margin-bottom: 20px;
- gap: 8px;
-}
-
-.elementKeyInputActions {
- max-width: 300px;
- flex: 1;
-}
-
-.inspector-main #selectedElementContainer {
- padding-bottom: 0px;
-}
-
-.selected-element-table-cells {
- word-wrap: break-all;
- word-break: break-all;
-}
-
-.element-cell-copy {
- cursor: pointer;
-}
-
-.selected-element-card {
- display: flex;
- flex-direction: column;
-}
-
-.selected-element-card :global(.ant-card-body) {
- flex: 1;
- overflow: auto;
- margin-right: -12px;
-}
-
-.selectedElemNotInteractableAlertRow {
- justify-content: center;
-}
-
-.sourceTag {
- color: #7d2020;
- font-weight: normal;
-}
-
-.sourceAttrName {
- color: #864da1;
- font-style: italic;
-}
-
-.no-recorded-actions {
- font-style: italic;
- margin-bottom: 20px;
-}
-
-.recorded-code {
- height: 100%;
- margin: 0;
- white-space: pre-wrap;
- word-break: break-word;
-}
-
-.framework-dropdown {
- width: 150px;
-}
-
-.searchResultsList {
- width: 100%;
- flex: 1;
- min-height: 24px;
- max-height: 150px;
- overflow: auto;
- border-style: solid;
- border-width: 1px;
-}
-
-.searchResultsList :global(.ant-list-item) {
- padding: 4px 6px !important;
- height: 25px;
- text-align: left;
-}
-
-.searchResultsSelectedItem {
- background-color: #bae7ff;
-}
-
-.searchResultsActions {
- width: 350px;
-}
-
-.searchResultsKeyInput,
-.elementKeyInput {
- height: 32px;
- width: calc(100% - 64px);
-}
-
-.element-count-container {
- margin-top: 0.5em;
- margin-left: 0.5em;
-}
-
-.locatorStrategyBtn {
- margin-top: -1px;
- min-width: 25%;
- text-align: center;
-}
-
-.locatorSelectorTextArea {
- width: 100%;
-}
-
-.coordinatesContainer {
- position: absolute;
- background: rgba(255, 250, 205, 0.8);
- z-index: 10000000;
- padding: 2px;
-}
-
-.swipeSvg {
- position: absolute;
- z-index: 100000000;
- top: 0;
- left: 0;
- height: 100%;
- width: 100%;
-}
-
-.swipeSvg line {
- stroke-width: 15;
- stroke: rgba(255, 153, 153, 0.8);
- stroke-linecap: round;
-}
-
-.swipeSvg circle {
- r: 10;
- fill: rgba(255, 153, 153, 0.8);
-}
-
-.tapDiv {
- position: absolute;
- z-index: 100000000;
- top: 0;
- left: 0;
- height: 100%;
- width: 100%;
-}
-
-.gestureSvg {
- position: absolute;
- z-index: 100000000;
- top: 0;
- left: 0;
- height: 100%;
- width: 100%;
-}
-
-.gestureSvg line {
- opacity: 0.35;
-}
-
-.gestureSvg .filled,
-.dashed {
- stroke-dasharray: 10;
- stroke-width: 5;
-}
-
-.gestureSvg .whole,
-.newDashed {
- stroke-linecap: round;
- stroke-width: 15;
-}
-
-.gestureSvg circle {
- r: 8;
- fill: none;
- stroke-width: 0.4%;
-}
-
-.gestureSvg .circle-dashed,
-.circle-newDashed {
- stroke-dasharray: 0.9%;
- border-style: dashed;
-}
-
-.innerScreenshotContainer {
- display: flex;
- flex-direction: column;
- height: 100%;
-}
-
-.innerScreenshotContainer .screenshotActionsPanel {
- margin-bottom: 2px;
- margin: 0 auto 2px auto;
-}
-
-.commands-container .btn-container {
- padding: 8px;
-}
-
-.arg-container {
- padding: 4px 4px 0 0;
-}
-
-.commands-container :global(.ant-select) {
- width: 100%;
-}
-
-.commands-container :global(.ant-btn) {
- width: 100%;
-}
-
-.gesture-header {
- padding: 0 0 0 0;
- margin-right: -12px;
-}
-
-.gesture-header :global(.ant-page-header-footer) {
- margin-top: 0px;
- padding-bottom: 5px;
-}
-
-.gesture-header :global(.ant-typography) {
- margin-bottom: 0px;
-}
-
-.gesture-header :global(.ant-input) {
- box-shadow: none;
- border-width: 0px;
-}
-
-.gesture-header-title {
- font-size: 20px;
- font-weight: 500;
-}
-
-.gesture-header-description {
- font-size: 15px;
- font-weight: 400;
- color: #636363;
- margin-left: 30px;
- margin-top: 5px;
-}
-
-.gesture-header-coord-btn {
- width: 30px;
- height: 32px;
-}
-
-.gesture-header-timeline {
- width: 90%;
- margin-top: -15px;
- min-height: 36px;
-}
-
-.timeline-tick-title {
- text-align: center;
-}
-
-.gesture-header-timeline
- :global(
- .ant-steps-item-wait
- > .ant-steps-item-container
- > .ant-steps-item-content
- > .ant-steps-item-title::after
- ) {
- background-color: #fffefe;
-}
-
-.gesture-header-timeline
- :global(
- .ant-steps-item-finish
- .ant-steps-item-container
- .ant-steps-item-content
- .ant-steps-item-title::after
- ) {
- background-color: var(--timelineColor);
-}
-
-.gesture-header-icon {
- font-size: 20px;
-}
-
-.pointer-title {
- max-width: 65px;
- padding: 0 0 0 0;
- text-align: center;
- text-decoration: underline;
- text-decoration-thickness: 20%;
-}
-
-.tick-card {
- overflow: hidden;
-}
-
-.tick-card :global(.ant-card-head) {
- margin-top: -16px;
- padding-right: 0px;
- border-bottom: none;
-}
-
-.tick-card :global(.ant-card-body) {
- margin-top: -12px;
- min-height: 167px;
- margin-right: -12px;
-}
-
-.tick-plus-card {
- min-height: 220px;
-}
-
-.tick-plus-btn {
- position: absolute;
- top: 40%;
-}
-
-.spaceContainer {
- display: flex;
-}
-
-.tick-pointer-input {
- width: 145px;
-}
-
-.tick-button-group {
- display: block;
-}
-
-.tick-button-input {
- width: 73px;
-}
-
-.tick-input-box {
- width: 145px;
-}
-
-.tick-coord-box {
- width: 72px;
- text-align: center;
-}
-
-.tick-input-box :global(.ant-input-group-addon) {
- position: sticky;
- width: 50px;
-}
-
-.option-inpt {
- text-align: center;
-}
diff --git a/app/renderer/components/Inspector/Inspector.js b/app/renderer/components/Inspector/Inspector.js
deleted file mode 100644
index ca4757eadd..0000000000
--- a/app/renderer/components/Inspector/Inspector.js
+++ /dev/null
@@ -1,463 +0,0 @@
-import {
- CheckCircleOutlined,
- CloseCircleOutlined,
- CodeOutlined,
- CopyOutlined,
- DownloadOutlined,
- FileTextOutlined,
- HighlightOutlined,
- InfoCircleOutlined,
- PlusSquareOutlined,
- SelectOutlined,
- TagOutlined,
- ThunderboltOutlined,
-} from '@ant-design/icons';
-import {Button, Card, Modal, Space, Spin, Switch, Tabs, Tooltip} from 'antd';
-import {debounce} from 'lodash';
-import React, {useEffect, useRef, useState} from 'react';
-import {useNavigate} from 'react-router-dom';
-
-import {clipboard} from '../../polyfills';
-import {BUTTON} from '../AntdTypes';
-import Commands from './Commands';
-import GestureEditor from './GestureEditor';
-import HeaderButtons from './HeaderButtons';
-import InspectorStyles from './Inspector.css';
-import Recorder from './Recorder';
-import SavedGestures from './SavedGestures';
-import Screenshot from './Screenshot';
-import SelectedElement from './SelectedElement';
-import SessionInfo from './SessionInfo';
-import Source from './Source';
-import {INTERACTION_MODE, SCREENSHOT_INTERACTION_MODE} from './shared';
-
-const {SELECT, TAP_SWIPE} = SCREENSHOT_INTERACTION_MODE;
-
-const MIN_WIDTH = 870;
-const MIN_HEIGHT = 610;
-const MAX_IMAGE_WIDTH_WINDOW_FRACTION = 0.4;
-
-const MJPEG_STREAM_CHECK_INTERVAL = 1000;
-const SESSION_EXPIRY_PROMPT_TIMEOUT = 60 * 60 * 1000; // Give user 1 hour to reply
-
-const downloadFile = (href, filename) => {
- let element = document.createElement('a');
- element.setAttribute('href', href);
- element.setAttribute('download', filename);
- element.style.display = 'none';
-
- document.body.appendChild(element);
- element.click();
-
- document.body.removeChild(element);
-};
-
-const downloadXML = (sourceXML) => {
- const href = 'data:application/xml;charset=utf-8,' + encodeURIComponent(sourceXML);
- const filename = `app-source-${new Date().toJSON()}.xml`;
- downloadFile(href, filename);
-};
-
-const downloadScreenshot = (screenshot) => {
- const href = `data:image/png;base64,${screenshot}`;
- const filename = `appium-inspector-${new Date().toJSON()}.png`;
- downloadFile(href, filename);
-};
-
-const Inspector = (props) => {
- const {
- screenshot,
- screenshotError,
- selectedElement = {},
- quitSession,
- screenshotInteractionMode,
- visibleCommandMethod,
- selectedInteractionMode,
- selectInteractionMode,
- setVisibleCommandResult,
- setUserWaitTimeout,
- showKeepAlivePrompt,
- keepSessionAlive,
- sourceXML,
- visibleCommandResult,
- mjpegScreenshotUrl,
- isAwaitingMjpegStream,
- toggleShowCentroids,
- showCentroids,
- isGestureEditorVisible,
- toggleShowAttributes,
- isSourceRefreshOn,
- windowSize,
- t,
- } = props;
-
- const didInitialResize = useRef(false);
- const screenAndSourceEl = useRef(null);
- const screenshotEl = useRef(null);
- const mjpegStreamCheckInterval = useRef(null);
-
- const [scaleRatio, setScaleRatio] = useState(1);
-
- const navigate = useNavigate();
-
- const showScreenshot =
- (screenshot && !screenshotError) ||
- (mjpegScreenshotUrl && (!isSourceRefreshOn || !isAwaitingMjpegStream));
-
- // Calculate the ratio for scaling items overlaid on the screenshot
- // (highlighter rectangles/circles, gestures, etc.)
- const updateScaleRatio = (imgWidth) => setScaleRatio(windowSize.width / imgWidth);
-
- const updateScaleRatioDebounced = debounce(updateScaleRatio, 500);
-
- const updateSourceTreeWidth = () => {
- // the idea here is to keep track of the screenshot image width. if it has
- // too much space to the right or bottom, adjust the max-width of the
- // screenshot container so the source tree flex adjusts to always fill the
- // remaining space. This keeps everything looking tight.
- if (!screenAndSourceEl.current) {
- return;
- }
-
- const screenshotBox = screenAndSourceEl.current.querySelector('#screenshotContainer');
- const img = screenAndSourceEl.current.querySelector('#screenshotContainer img#screenshot');
-
- if (!img) {
- return;
- }
-
- const imgRect = img.getBoundingClientRect();
- const screenshotRect = screenshotBox.getBoundingClientRect();
- if (imgRect.height < screenshotRect.height) {
- // get the expected image width if the image would fill the screenshot box height
- const attemptedImgWidth = (screenshotRect.height / imgRect.height) * imgRect.width;
- // get the maximum image width as a fraction of the current window width
- const maxImgWidth = window.innerWidth * MAX_IMAGE_WIDTH_WINDOW_FRACTION;
- const curMaxImgWidth = Math.min(maxImgWidth, attemptedImgWidth);
- screenshotBox.style.maxWidth = `${curMaxImgWidth}px`;
- } else if (imgRect.width < screenshotRect.width) {
- screenshotBox.style.maxWidth = `${imgRect.width}px`;
- }
-
- updateScaleRatioDebounced(imgRect.width);
- };
-
- const updateSourceTreeWidthDebounced = debounce(updateSourceTreeWidth, 50);
-
- const checkMjpegStream = async () => {
- const {setAwaitingMjpegStream} = props;
- const img = new Image();
- img.src = mjpegScreenshotUrl;
- let imgReady = false;
- try {
- await img.decode();
- imgReady = true;
- } catch (ign) {}
- if (imgReady && isAwaitingMjpegStream) {
- setAwaitingMjpegStream(false);
- updateSourceTreeWidthDebounced();
- // stream obtained - can clear the refresh interval
- clearInterval(mjpegStreamCheckInterval.current);
- mjpegStreamCheckInterval.current = null;
- } else if (!imgReady && !isAwaitingMjpegStream) {
- setAwaitingMjpegStream(true);
- }
- };
-
- const screenshotInteractionChange = (mode) => {
- const {selectScreenshotInteractionMode, clearCoordAction} = props;
- clearCoordAction(); // When the action changes, reset the swipe action
- selectScreenshotInteractionMode(mode);
- };
-
- const quitCurrentSession = async (reason, killedByUser = true) => {
- await quitSession(reason, killedByUser);
- navigate('/session', {replace: true});
- };
-
- useEffect(() => {
- const {applyClientMethod, getSavedActionFramework, runKeepAliveLoop, setSessionTime} = props;
- const curHeight = window.innerHeight;
- const curWidth = window.innerWidth;
- const needsResize = curHeight < MIN_HEIGHT || curWidth < MIN_WIDTH;
- if (!didInitialResize.current && needsResize) {
- const newWidth = curWidth < MIN_WIDTH ? MIN_WIDTH : curWidth;
- const newHeight = curHeight < MIN_HEIGHT ? MIN_HEIGHT : curHeight;
- // resize width to something sensible for using the inspector on first run
- window.resizeTo(newWidth, newHeight);
- }
- didInitialResize.current = true;
- applyClientMethod({methodName: 'getPageSource', ignoreResult: true});
- getSavedActionFramework();
- runKeepAliveLoop();
- setSessionTime(Date.now());
- }, []);
-
- /**
- * Ensures component dimensions are adjusted only once windowSize exists.
- * Cannot be combined with the other useEffect hook, since inside it,
- * windowSize is set to 'undefined', and the event listener and MJPEG checker
- * would not update this value when invoked
- */
- useEffect(() => {
- if (windowSize) {
- updateSourceTreeWidthDebounced();
- window.addEventListener('resize', updateSourceTreeWidthDebounced);
- if (mjpegScreenshotUrl) {
- mjpegStreamCheckInterval.current = setInterval(
- checkMjpegStream,
- MJPEG_STREAM_CHECK_INTERVAL,
- );
- }
- }
- return () => {
- if (windowSize) {
- window.removeEventListener('resize', updateSourceTreeWidthDebounced);
- if (mjpegStreamCheckInterval.current) {
- clearInterval(mjpegStreamCheckInterval.current);
- mjpegStreamCheckInterval.current = null;
- }
- }
- };
- }, [JSON.stringify(windowSize)]);
-
- // If session expiry prompt is shown, start timeout until session is automatically quit
- // Timeout is canceled if user selects either action in prompt (keep session alive or quit)
- useEffect(() => {
- if (showKeepAlivePrompt) {
- const userWaitTimeout = setTimeout(() => {
- quitCurrentSession(t('Session closed due to inactivity'), false);
- }, SESSION_EXPIRY_PROMPT_TIMEOUT);
- setUserWaitTimeout(userWaitTimeout);
- }
- }, [showKeepAlivePrompt]);
-
- const screenShotControls = (
-
-
-
- }
- unCheckedChildren={ }
- defaultChecked={false}
- onChange={() => toggleShowCentroids()}
- disabled={isGestureEditorVisible}
- />
-
-
-
- }
- onClick={() => screenshotInteractionChange(SELECT)}
- type={screenshotInteractionMode === SELECT ? BUTTON.PRIMARY : BUTTON.DEFAULT}
- disabled={isGestureEditorVisible}
- />
-
-
- }
- onClick={() => screenshotInteractionChange(TAP_SWIPE)}
- type={screenshotInteractionMode === TAP_SWIPE ? BUTTON.PRIMARY : BUTTON.DEFAULT}
- disabled={isGestureEditorVisible}
- />
-
-
- {showScreenshot && !mjpegScreenshotUrl && (
-
- } onClick={() => downloadScreenshot(screenshot)} />
-
- )}
-
-
- );
-
- const main = (
- (screenAndSourceEl.current = el)}
- >
-
(screenshotEl.current = el)}
- >
- {screenShotControls}
- {showScreenshot &&
}
- {screenshotError && t('couldNotObtainScreenshot', {screenshotError})}
- {!showScreenshot && (
-
-
-
- )}
-
-
-
selectInteractionMode(tab)}
- items={[
- {
- label: t('Source'),
- key: INTERACTION_MODE.SOURCE,
- children: (
-
-
-
- {t('App Source')}{' '}
-
- }
- extra={
-
-
- }
- onClick={toggleShowAttributes}
- />
-
-
- }
- onClick={() => clipboard.writeText(sourceXML)}
- />
-
-
- }
- onClick={() => downloadXML(sourceXML)}
- />
-
-
- }
- >
-
-
-
-
-
- {t('selectedElement')}
-
- }
- className={InspectorStyles['selected-element-card']}
- >
- {selectedElement.path && }
- {!selectedElement.path && {t('selectElementInSource')} }
-
-
-
- ),
- },
- {
- label: t('Commands'),
- key: INTERACTION_MODE.COMMANDS,
- children: (
-
- {t('Execute Commands')}
-
- }
- className={InspectorStyles['interaction-tab-card']}
- >
-
-
- ),
- },
- {
- label: t('Gestures'),
- key: INTERACTION_MODE.GESTURES,
- children: isGestureEditorVisible ? (
-
- {t('Gesture Builder')}
-
- }
- className={InspectorStyles['interaction-tab-card']}
- >
-
-
- ) : (
-
- {t('Saved Gestures')}
-
- }
- className={InspectorStyles['interaction-tab-card']}
- >
-
-
- ),
- },
- {
- label: t('Recorder'),
- key: INTERACTION_MODE.RECORDER,
- children: ,
- },
- {
- label: t('Session Information'),
- key: INTERACTION_MODE.SESSION_INFO,
- children: (
-
- {t('Session Information')}
-
- }
- className={InspectorStyles['interaction-tab-card']}
- >
-
-
- ),
- },
- ]}
- />
-
-
- );
-
- return (
-
-
- {main}
-
keepSessionAlive()}
- onCancel={() => quitCurrentSession()}
- okText={t('Keep Session Running')}
- cancelText={t('Quit Session')}
- >
- {t('Your session is about to expire')}
-
-
setVisibleCommandResult(null)}
- onCancel={() => setVisibleCommandResult(null)}
- >
-
- {visibleCommandResult}
-
-
-
- );
-};
-
-export default Inspector;
diff --git a/app/renderer/components/Inspector/LocatedElements.js b/app/renderer/components/Inspector/LocatedElements.js
deleted file mode 100644
index 1641130e33..0000000000
--- a/app/renderer/components/Inspector/LocatedElements.js
+++ /dev/null
@@ -1,150 +0,0 @@
-import {AimOutlined, ClearOutlined, MenuUnfoldOutlined, SendOutlined} from '@ant-design/icons';
-import {Alert, Badge, Button, Input, List, Row, Space, Spin, Tooltip} from 'antd';
-import React, {useRef} from 'react';
-
-import {ALERT} from '../AntdTypes';
-import InspectorStyles from './Inspector.css';
-
-const LocatedElements = (props) => {
- const {
- locatedElements,
- locatedElementsExecutionTime,
- applyClientMethod,
- setLocatorTestElement,
- locatorTestElement,
- isFindingLocatedElementInSource,
- searchedForElementBounds,
- selectLocatedElement,
- source,
- driver,
- t,
- } = props;
-
- const sendKeys = useRef(null);
-
- const showIdAutocompleteInfo = () => {
- const {locatorTestStrategy, locatorTestValue, automationName} = props;
- const idLocatorAutocompletionDisabled =
- driver.client.capabilities.disableIdLocatorAutocompletion;
- if (
- automationName &&
- automationName.toLowerCase() === 'uiautomator2' &&
- locatorTestStrategy === 'id' &&
- !locatorTestValue.includes(':id/') &&
- !idLocatorAutocompletionDisabled
- ) {
- return (
-
-
-
- );
- }
- };
-
- return (
- <>
- {locatedElements.length === 0 && (
-
-
- {t('couldNotFindAnyElements')}
-
- {showIdAutocompleteInfo()}
-
- )}
- {locatedElements.length > 0 && (
-
-
-
-
- {t('elementsCount')}
-
- <>
- {t('Time')}: {locatedElementsExecutionTime}
- >
-
-
- (
- {
- setLocatorTestElement(elementId);
- },
- }
- : {})}
- >
- {elementId}
-
- )}
- />
-
-
-
-
- }
- onClick={() =>
- selectLocatedElement(source, searchedForElementBounds, locatorTestElement)
- }
- />
-
-
- }
- onClick={() =>
- applyClientMethod({methodName: 'click', elementId: locatorTestElement})
- }
- />
-
-
- (sendKeys.current = e.target.value)}
- />
-
- }
- onClick={() =>
- applyClientMethod({
- methodName: 'sendKeys',
- elementId: locatorTestElement,
- args: [sendKeys.current || ''],
- })
- }
- />
-
-
- }
- onClick={() =>
- applyClientMethod({methodName: 'clear', elementId: locatorTestElement})
- }
- />
-
-
-
-
-
-
- )}
- >
- );
-};
-
-export default LocatedElements;
diff --git a/app/renderer/components/Inspector/Recorder.js b/app/renderer/components/Inspector/Recorder.js
deleted file mode 100644
index e00c24a955..0000000000
--- a/app/renderer/components/Inspector/Recorder.js
+++ /dev/null
@@ -1,87 +0,0 @@
-import {ClearOutlined, CodeOutlined, CopyOutlined, PicRightOutlined} from '@ant-design/icons';
-import {Button, Card, Select, Space, Tooltip} from 'antd';
-import hljs from 'highlight.js';
-import React from 'react';
-
-import frameworks from '../../lib/client-frameworks';
-import {clipboard} from '../../polyfills';
-import {BUTTON} from '../AntdTypes';
-import InspectorStyles from './Inspector.css';
-
-const Recorder = (props) => {
- const {showBoilerplate, recordedActions, actionFramework, t} = props;
-
- const code = (raw = true) => {
- const {host, port, path, https, desiredCapabilities} = props.sessionDetails;
-
- let framework = new frameworks[actionFramework](host, port, path, https, desiredCapabilities);
- framework.actions = recordedActions;
- const rawCode = framework.getCodeString(showBoilerplate);
- if (raw) {
- return rawCode;
- }
- return hljs.highlight(rawCode, {language: framework.language}).value;
- };
-
- const actionBar = () => {
- const {setActionFramework, toggleShowBoilerplate, clearRecording} = props;
-
- return (
-
- {!!recordedActions.length && (
-
-
- }
- type={showBoilerplate ? BUTTON.PRIMARY : BUTTON.DEFAULT}
- />
-
-
- } onClick={() => clipboard.writeText(code())} />
-
-
- } onClick={clearRecording} />
-
-
- )}
-
- {Object.keys(frameworks).map((f) => (
-
- {frameworks[f].readableName}
-
- ))}
-
-
- );
- };
-
- return (
-
- {t('Recorder')}
-
- }
- className={InspectorStyles['interaction-tab-card']}
- extra={actionBar()}
- >
- {!recordedActions.length && (
-
- {t('enableRecordingAndPerformActions')}
-
- )}
- {!!recordedActions.length && (
-
-
-
- )}
-
- );
-};
-
-export default Recorder;
diff --git a/app/renderer/components/Inspector/SavedGestures.js b/app/renderer/components/Inspector/SavedGestures.js
deleted file mode 100644
index 178f1fd2ad..0000000000
--- a/app/renderer/components/Inspector/SavedGestures.js
+++ /dev/null
@@ -1,155 +0,0 @@
-import {DeleteOutlined, EditOutlined, PlayCircleOutlined, PlusOutlined} from '@ant-design/icons';
-import {Button, Space, Table, Tooltip} from 'antd';
-import _ from 'lodash';
-import moment from 'moment';
-import React, {useEffect, useRef} from 'react';
-
-import InspectorStyles from './Inspector.css';
-import {POINTER_TYPES, SCREENSHOT_INTERACTION_MODE, percentageToPixels} from './shared';
-
-const SAVED_ACTIONS_OBJ = {
- NAME: 'Name',
- DESCRIPTION: 'Description',
- CREATED: 'Created',
- ACTIONS: 'Actions',
-};
-
-const dataSource = (savedGestures, t) => {
- if (!savedGestures) {
- return [];
- }
- return savedGestures.map((gesture) => ({
- key: gesture.id,
- Name: gesture.name || t('unnamed'),
- Created: moment(gesture.date).format('YYYY-MM-DD'),
- Description: gesture.description || t('No Description'),
- }));
-};
-
-const getGestureByID = (savedGestures, id, t) => {
- for (const gesture of savedGestures) {
- if (gesture.id === id) {
- return gesture;
- }
- }
- throw new Error(t('couldNotFindEntryWithId', {id}));
-};
-
-const SavedGestures = (props) => {
- const {savedGestures, showGestureEditor, removeGestureDisplay, t} = props;
-
- const drawnGestureRef = useRef(null);
-
- const onRowClick = (rowKey) => {
- const gesture = getGestureByID(savedGestures, rowKey, t);
- if (gesture.id === drawnGestureRef.current) {
- removeGestureDisplay();
- drawnGestureRef.current = null;
- } else {
- onDraw(gesture);
- drawnGestureRef.current = gesture.id;
- }
- };
-
- const loadSavedGesture = (gesture) => {
- const {setLoadedGesture} = props;
- removeGestureDisplay();
- setLoadedGesture(gesture);
- showGestureEditor();
- };
-
- const handleDelete = (id) => {
- const {deleteSavedGesture} = props;
- if (window.confirm(t('confirmDeletion'))) {
- deleteSavedGesture(id);
- }
- };
-
- const onDraw = (gesture) => {
- const {displayGesture} = props;
- const pointers = convertCoordinates(gesture.actions);
- displayGesture(pointers);
- };
-
- const onPlay = (gesture) => {
- const {applyClientMethod} = props;
- const pointers = convertCoordinates(gesture.actions);
- const actions = formatGesture(pointers);
- applyClientMethod({methodName: SCREENSHOT_INTERACTION_MODE.GESTURE, args: [actions]});
- };
-
- const formatGesture = (pointers) => {
- const actions = {};
- for (const pointer of pointers) {
- actions[pointer.name] = pointer.ticks.map((tick) => _.omit(tick, 'id'));
- }
- return actions;
- };
-
- const convertCoordinates = (pointers) => {
- const {windowSize} = props;
- const newPointers = JSON.parse(JSON.stringify(pointers));
- for (const pointer of newPointers) {
- for (const tick of pointer.ticks) {
- if (tick.type === POINTER_TYPES.POINTER_MOVE) {
- tick.x = percentageToPixels(tick.x, windowSize.width);
- tick.y = percentageToPixels(tick.y, windowSize.height);
- }
- }
- }
- return newPointers;
- };
-
- const columns = Object.keys(SAVED_ACTIONS_OBJ).map((key) => {
- if (SAVED_ACTIONS_OBJ[key] === SAVED_ACTIONS_OBJ.ACTIONS) {
- return {
- title: t(SAVED_ACTIONS_OBJ[key]),
- key: SAVED_ACTIONS_OBJ[key],
- render: (_, record) => {
- const gesture = getGestureByID(savedGestures, record.key, t);
- return (
-
-
- }
- onClick={() => onPlay(gesture)}
- />
-
- } onClick={() => loadSavedGesture(gesture)} />
- } onClick={() => handleDelete(gesture.id)} />
-
- );
- },
- };
- } else {
- return {
- title: t(SAVED_ACTIONS_OBJ[key]),
- dataIndex: SAVED_ACTIONS_OBJ[key],
- key: SAVED_ACTIONS_OBJ[key],
- };
- }
- });
-
- useEffect(() => {
- const {getSavedGestures} = props;
- getSavedGestures();
- return () => (drawnGestureRef.current = null);
- }, []);
-
- return (
-
- {t('gesturesDescription')}
- ({onClick: () => onRowClick(row.key)})}
- pagination={false}
- dataSource={dataSource(savedGestures, t)}
- columns={columns}
- footer={() => } />}
- />
-
- );
-};
-
-export default SavedGestures;
diff --git a/app/renderer/components/Inspector/SelectedElement.js b/app/renderer/components/Inspector/SelectedElement.js
deleted file mode 100644
index 299e915a3e..0000000000
--- a/app/renderer/components/Inspector/SelectedElement.js
+++ /dev/null
@@ -1,292 +0,0 @@
-import {
- AimOutlined,
- ClearOutlined,
- CopyOutlined,
- HourglassOutlined,
- LoadingOutlined,
- SendOutlined,
-} from '@ant-design/icons';
-import {Alert, Button, Col, Input, Row, Spin, Table, Tooltip} from 'antd';
-import _ from 'lodash';
-import React, {useRef} from 'react';
-
-import {clipboard, shell} from '../../polyfills';
-import {ALERT, ROW} from '../AntdTypes';
-import styles from './Inspector.css';
-import {getLocators} from './shared';
-
-const NATIVE_APP = 'NATIVE_APP';
-const CLASS_CHAIN_DOCS_URL =
- 'https://github.com/facebookarchive/WebDriverAgent/wiki/Class-Chain-Queries-Construction-Rules';
-const PREDICATE_DOCS_URL =
- 'https://github.com/facebookarchive/WebDriverAgent/wiki/Predicate-Queries-Construction-Rules';
-
-/**
- * Shows details of the currently selected element and shows methods that can
- * be called on the elements (tap, sendKeys)
- */
-const SelectedElement = (props) => {
- const {
- applyClientMethod,
- currentContext,
- getFindElementsTimes,
- findElementsExecutionTimes,
- isFindingElementsTimes,
- selectedElement,
- selectedElementId,
- sourceXML,
- elementInteractionsNotAvailable,
- selectedElementSearchInProgress,
- t,
- } = props;
-
- const sendKeys = useRef();
-
- const {attributes, classChain, predicateString, xpath} = selectedElement;
- const isDisabled = selectedElementSearchInProgress || isFindingElementsTimes;
-
- const selectedElementTableCell = (text, copyToClipBoard) => {
- if (copyToClipBoard) {
- return (
-
-
- clipboard.writeText(text)}>
- {text}
-
-
-
- );
- } else {
- return {text}
;
- }
- };
-
- // Get the columns for the attributes table
- let attributeColumns = [
- {
- title: t('Attribute'),
- dataIndex: 'name',
- key: 'name',
- width: 100,
- render: (text) => selectedElementTableCell(text, false),
- },
- {
- title: t('Value'),
- dataIndex: 'value',
- key: 'value',
- render: (text) => selectedElementTableCell(text, true),
- },
- ];
-
- // Get the data for the attributes table
- let attrArray = _.toPairs(attributes).filter(([key]) => key !== 'path');
- let dataSource = attrArray.map(([key, value]) => ({
- key,
- value,
- name: key,
- }));
- dataSource.unshift({key: 'elementId', value: selectedElementId, name: 'elementId'});
-
- // Get the columns for the strategies table
- let findColumns = [
- {
- title: t('Find By'),
- dataIndex: 'find',
- key: 'find',
- width: 100,
- render: (text) => selectedElementTableCell(text, false),
- },
- {
- title: t('Selector'),
- dataIndex: 'selector',
- key: 'selector',
- render: (text) => selectedElementTableCell(text, true),
- },
- ];
-
- if (findElementsExecutionTimes.length > 0) {
- findColumns.push({
- title: t('Time'),
- dataIndex: 'time',
- key: 'time',
- align: 'right',
- width: 100,
- render: (text) => selectedElementTableCell(text, false),
- });
- }
-
- // Get the data for the strategies table
- let findDataSource = _.toPairs(getLocators(attributes, sourceXML)).map(([key, selector]) => ({
- key,
- selector,
- find: key,
- }));
-
- // If XPath is the only provided data source, warn the user about it's brittleness
- let showXpathWarning = false;
- if (findDataSource.length === 0) {
- showXpathWarning = true;
- }
-
- // Add class chain to the data source as well
- if (classChain && currentContext === NATIVE_APP) {
- const classChainText = (
-
- -ios class chain
-
- e.preventDefault() || shell.openExternal(CLASS_CHAIN_DOCS_URL)}>
- (docs)
-
-
-
- );
-
- findDataSource.push({
- key: '-ios class chain',
- find: classChainText,
- selector: classChain,
- });
- }
-
- // Add predicate string to the data source as well
- if (predicateString && currentContext === NATIVE_APP) {
- const predicateStringText = (
-
- -ios predicate string
-
- e.preventDefault() || shell.openExternal(PREDICATE_DOCS_URL)}>
- (docs)
-
-
-
- );
-
- findDataSource.push({
- key: '-ios predicate string',
- find: predicateStringText,
- selector: predicateString,
- });
- }
-
- // Add XPath to the data source as well
- if (xpath) {
- findDataSource.push({
- key: 'xpath',
- find: 'xpath',
- selector: xpath,
- });
- }
-
- // Replace table data with table data that has the times
- if (findElementsExecutionTimes.length > 0) {
- findDataSource = findElementsExecutionTimes;
- }
-
- let tapIcon = ;
- if (!(elementInteractionsNotAvailable || selectedElementId) || selectedElementSearchInProgress) {
- tapIcon = ;
- }
-
- return (
-
- {elementInteractionsNotAvailable && (
-
-
-
-
-
- )}
-
-
- applyClientMethod({methodName: 'click', elementId: selectedElementId})}
- />
-
-
- (sendKeys.current = e.target.value)}
- />
-
- }
- onClick={() =>
- applyClientMethod({
- methodName: 'sendKeys',
- elementId: selectedElementId,
- args: [sendKeys.current || ''],
- })
- }
- />
-
-
- }
- onClick={() => applyClientMethod({methodName: 'clear', elementId: selectedElementId})}
- />
-
-
-
-
- }
- onClick={() => clipboard.writeText(JSON.stringify(dataSource))}
- />
-
-
- }
- onClick={() => getFindElementsTimes(findDataSource)}
- />
-
-
-
- {findDataSource.length > 0 && (
-
-
-
-
-
- )}
-
- {currentContext === NATIVE_APP && showXpathWarning && (
-
- )}
- {dataSource.length > 0 && (
-
-
-
- )}
-
- );
-};
-
-export default SelectedElement;
diff --git a/app/renderer/components/Inspector/SessionCodeBox.js b/app/renderer/components/Inspector/SessionCodeBox.js
deleted file mode 100644
index 389eee320a..0000000000
--- a/app/renderer/components/Inspector/SessionCodeBox.js
+++ /dev/null
@@ -1,57 +0,0 @@
-import {CodeOutlined, CopyOutlined} from '@ant-design/icons';
-import {Button, Card, Select, Space, Tooltip} from 'antd';
-import hljs from 'highlight.js';
-import React from 'react';
-
-import frameworks from '../../lib/client-frameworks';
-import {clipboard} from '../../polyfills';
-import InspectorStyles from './Inspector.css';
-
-const SessionCodeBox = ({actionFramework, setActionFramework, sessionDetails, t}) => {
- const code = (raw = true) => {
- const {host, port, path, https, desiredCapabilities} = sessionDetails;
- const framework = new frameworks[actionFramework](host, port, path, https, desiredCapabilities);
- const rawCode = framework.getCodeString(true);
- if (raw) {
- return rawCode;
- }
-
- return hljs.highlight(rawCode, {language: framework.language}).value;
- };
-
- const actionBar = () => (
-
-
- } onClick={() => clipboard.writeText(code())} />
-
-
- {Object.keys(frameworks).map((f) => (
-
- {frameworks[f].readableName}
-
- ))}
-
-
- );
-
- return (
-
- {t('Start this Kind of Session with Code')}
-
- }
- extra={actionBar()}
- >
-
-
-
-
- );
-};
-
-export default SessionCodeBox;
diff --git a/app/renderer/components/Inspector/SessionInfo.js b/app/renderer/components/Inspector/SessionInfo.js
deleted file mode 100644
index e6380af353..0000000000
--- a/app/renderer/components/Inspector/SessionInfo.js
+++ /dev/null
@@ -1,160 +0,0 @@
-import {Col, Row, Table} from 'antd';
-import React, {useEffect, useRef, useState} from 'react';
-
-import InspectorStyles from './Inspector.css';
-import SessionCodeBox from './SessionCodeBox';
-
-const SESSION_OBJ = {
- session_id: 'Session ID',
- session_url: 'Session URL',
- server_details: 'Server Details',
- session_length: 'Session Length',
- session_details: 'Session Details',
- active_appId: 'Currently Active App ID',
-};
-
-const OUTER_TABLE_KEY = 'sessionInfo';
-const SESSION_TABLE_KEY = 'sessionDetails';
-const SERVER_TABLE_KEY = 'serverDetails';
-
-const SCROLL_DISTANCE_Y = 104;
-const COLUMN_WIDTH = 200;
-let SESSION_DETAILS;
-
-const SessionInfo = (props) => {
- const {driver, t} = props;
-
- const sessionArray = Object.keys(SESSION_OBJ).map((key) => [key, String(SESSION_OBJ[key])]);
-
- const generateSessionTime = () => {
- const {sessionStartTime} = props;
- const currentTime = Date.now();
- const timeDiff = currentTime - sessionStartTime;
-
- const hours = timeDiff / 3600000;
- const minutes = (hours - Math.floor(hours)) * 60;
- const seconds = (minutes - Math.floor(minutes)) * 60;
-
- const showTime = (time) => String(Math.floor(time)).padStart(2, '0');
-
- return `${showTime(hours)}:${showTime(minutes)}:${showTime(seconds)}`;
- };
-
- const interval = useRef();
- const [time, setTime] = useState(generateSessionTime());
-
- const getTable = (tableValues, keyName, outerTable) => {
- const keyValue = `${keyName}_value`;
- const dataSource = tableValues.map(([name, value]) => ({
- key: name,
- [keyName]: outerTable ? t(value) : name,
- [keyValue]: value,
- }));
-
- const columns = [
- {
- dataIndex: keyName,
- key: keyName,
- ...(outerTable && {width: COLUMN_WIDTH}),
- },
- {
- dataIndex: keyValue,
- key: keyValue,
- render: outerTable
- ? (text) => generateSessionInfo(text)
- : (text) =>
- typeof text === 'object' ? {JSON.stringify(text, null, 2)} : String(text),
- },
- ];
-
- return outerTable ? (
-
- ) : (
-
- );
- };
-
- const generateSessionInfo = (name) => {
- const {sessionDetails, appId, status} = props;
- const {host, path, port} = sessionDetails;
- const {sessionId, connectedUrl} = driver || '';
-
- const serverDetailsArray = [
- ['host', host],
- ['path', path],
- ['port', port],
- ];
- const sessionArray =
- SESSION_DETAILS != null
- ? Object.keys(SESSION_DETAILS).map((key) => [key, SESSION_DETAILS[key]])
- : [];
- const serverStatusArray =
- status != null ? Object.keys(status).map((key) => [key, String(status[key])]) : [];
-
- // TODO: Fetch URL from Cloud Providers
- const sessionUrl =
- sessionId && connectedUrl
- ? `${connectedUrl}session/${sessionId}`
- : t('Error Fetching Session URL');
-
- switch (name) {
- case 'Session ID':
- return sessionId;
- case 'Session URL':
- return sessionUrl;
- case 'Server Details':
- return getTable([...serverDetailsArray, ...serverStatusArray], SERVER_TABLE_KEY, false);
- case 'Session Length':
- return time;
- case 'Session Details':
- return getTable(sessionArray, SESSION_TABLE_KEY, false);
- case 'Currently Active App ID':
- return appId;
- default:
- return name;
- }
- };
-
- useEffect(() => {
- const {getActiveAppId, getServerStatus, applyClientMethod} = props;
- const {isIOS, isAndroid} = driver.client;
-
- getActiveAppId(isIOS, isAndroid);
- getServerStatus();
-
- (async () => (SESSION_DETAILS = await applyClientMethod({methodName: 'getSession'})))();
- interval.current = setInterval(() => {
- setTime(generateSessionTime());
- }, 1000);
-
- return () => clearInterval(interval.current);
- }, []);
-
- return getTable(sessionArray, OUTER_TABLE_KEY, true);
-};
-
-export default SessionInfo;
diff --git a/app/renderer/components/Inspector/Source.js b/app/renderer/components/Inspector/Source.js
deleted file mode 100644
index 2934a6755c..0000000000
--- a/app/renderer/components/Inspector/Source.js
+++ /dev/null
@@ -1,118 +0,0 @@
-import {Spin, Tree} from 'antd';
-import React from 'react';
-
-import InspectorStyles from './Inspector.css';
-import LocatorTestModal from './LocatorTestModal';
-import SiriCommandModal from './SiriCommandModal';
-
-const IMPORTANT_ATTRS = [
- 'name',
- 'content-desc',
- 'resource-id',
- 'AXDescription',
- 'AXIdentifier',
- 'text',
- 'label',
- 'value',
- 'id',
-];
-
-/**
- * Shows the 'source' of the app as a Tree
- */
-const Source = (props) => {
- const {
- source,
- sourceError,
- setExpandedPaths,
- expandedPaths,
- selectedElement = {},
- showSourceAttrs,
- methodCallInProgress,
- mjpegScreenshotUrl,
- isSourceRefreshOn,
- t,
- } = props;
-
- const getFormattedTag = (el, showAllAttrs) => {
- const {tagName, attributes} = el;
- let attrs = [];
-
- for (let attr of Object.keys(attributes)) {
- if ((IMPORTANT_ATTRS.includes(attr) && attributes[attr]) || showAllAttrs) {
- attrs.push(
-
-
- {attr} =
- "{attributes[attr]}"
- ,
- );
- }
- }
- return (
-
- <{tagName}
- {attrs}>
-
- );
- };
-
- /**
- * Binds to antd Tree onSelect. If an item is being unselected, path is undefined
- * otherwise 'path' refers to the element's path.
- */
- const handleSelectElement = (path) => {
- const {selectElement, unselectElement} = props;
-
- if (!path) {
- unselectElement();
- } else {
- selectElement(path);
- }
- };
-
- // Recursives through the source and renders a TreeNode for an element
- const recursive = (elemObj) => {
- if (!((elemObj || {}).children || []).length) {
- return null;
- }
-
- return elemObj.children.map((el) => ({
- title: getFormattedTag(el, showSourceAttrs),
- key: el.path,
- children: recursive(el),
- }));
- };
-
- const treeData = source && recursive(source);
-
- return (
-
- {!source && !sourceError && {t('Gathering initial app source…')} }
- {sourceError && t('couldNotObtainSource', {errorMsg: JSON.stringify(sourceError)})}
- {/* Show loading indicator in MJPEG mode if a method call is in progress and source refresh is on */}
-
- {/* Must switch to a new antd Tree component when there's changes to treeData */}
- {treeData ? (
- handleSelectElement(selectedPaths[0])}
- selectedKeys={[selectedElement.path]}
- treeData={treeData}
- />
- ) : (
-
- )}
-
-
-
-
- );
-};
-
-export default Source;
diff --git a/app/renderer/components/Inspector/shared.js b/app/renderer/components/Inspector/shared.js
deleted file mode 100644
index 13e0425fe4..0000000000
--- a/app/renderer/components/Inspector/shared.js
+++ /dev/null
@@ -1,398 +0,0 @@
-import {DOMParser} from '@xmldom/xmldom';
-import xpath from 'xpath';
-
-export function pixelsToPercentage(px, maxPixels) {
- if (!isNaN(px)) {
- return parseFloat(((px / maxPixels) * 100).toFixed(1), 10);
- }
-}
-
-export function percentageToPixels(pct, maxPixels) {
- if (!isNaN(pct)) {
- return Math.round(maxPixels * (pct / 100));
- }
-}
-
-export function parseCoordinates(element) {
- let {bounds, x, y, width, height} = element.attributes || {};
-
- if (bounds) {
- let boundsArray = bounds.split(/\[|\]|,/).filter((str) => str !== '');
- const x1 = parseInt(boundsArray[0], 10);
- const x2 = parseInt(boundsArray[2], 10);
- const y1 = parseInt(boundsArray[1], 10);
- const y2 = parseInt(boundsArray[3], 10);
- return {x1, y1, x2, y2};
- } else if (x) {
- x = parseInt(x, 10);
- y = parseInt(y, 10);
- width = parseInt(width, 10);
- height = parseInt(height, 10);
- return {x1: x, y1: y, x2: x + width, y2: y + height};
- } else {
- return {};
- }
-}
-
-export function isUnique(attrName, attrValue, sourceXML) {
- // If no sourceXML provided, assume it's unique
- if (!sourceXML) {
- return true;
- }
- const doc = new DOMParser().parseFromString(sourceXML);
- return xpath.select(`//*[@${attrName}="${attrValue.replace(/"/g, '')}"]`, doc).length < 2;
-}
-
-// Map of the optimal strategies.
-const STRATEGY_MAPPINGS = [
- ['name', 'accessibility id'],
- ['content-desc', 'accessibility id'],
- ['id', 'id'],
- ['rntestid', 'id'],
- ['resource-id', 'id'],
- ['class', 'class name'],
- ['type', 'class name'],
-];
-
-export function getLocators(attributes, sourceXML) {
- const res = {};
- for (let [strategyAlias, strategy] of STRATEGY_MAPPINGS) {
- const value = attributes[strategyAlias];
- if (value && isUnique(strategyAlias, value, sourceXML)) {
- res[strategy] = attributes[strategyAlias];
- }
- }
- return res;
-}
-
-export const POINTER_TYPES = {
- POINTER_UP: 'pointerUp',
- POINTER_DOWN: 'pointerDown',
- PAUSE: 'pause',
- POINTER_MOVE: 'pointerMove',
-};
-
-export const DEFAULT_SWIPE = {
- POINTER_NAME: 'finger1',
- DURATION_1: 0,
- DURATION_2: 750,
- BUTTON: 0,
- ORIGIN: 'viewport',
-};
-
-export const DEFAULT_TAP = {
- POINTER_NAME: 'finger1',
- DURATION_1: 0,
- DURATION_2: 100,
- BUTTON: 0,
-};
-
-// 3 Types of Centroids:
-// CENTROID is the circle/square displayed on the screen
-// EXPAND is the +/- circle displayed on the screen
-// OVERLAP is the same as CENTROID but is only visible when clicked on +/- circle
-export const RENDER_CENTROID_AS = {
- CENTROID: 'centroid',
- EXPAND: 'expand',
- OVERLAP: 'overlap',
-};
-
-export const SCREENSHOT_INTERACTION_MODE = {
- SELECT: 'select',
- SWIPE: 'swipe',
- TAP: 'tap',
- TAP_SWIPE: 'tap_swipe',
- GESTURE: 'gesture',
-};
-
-export const APP_MODE = {
- NATIVE: 'native',
- WEB_HYBRID: 'web_hybrid',
-};
-
-export const COMMAND_ARG_TYPES = {
- STRING: 'string',
- NUMBER: 'number',
- BOOLEAN: 'boolean',
-};
-
-const {STRING, NUMBER, BOOLEAN} = COMMAND_ARG_TYPES;
-
-export const DRIVERS = {
- UIAUTOMATOR2: 'uiautomator2',
- ESPRESSO: 'espresso',
- XCUITEST: 'xcuitest',
- FLUTTER: 'flutter',
- MAC2: 'mac2',
- WINDOWS: 'windows',
- CHROMIUM: 'chromium',
- SAFARI: 'safari',
- GECKO: 'gecko',
-};
-
-const {UIAUTOMATOR2, ESPRESSO, XCUITEST} = DRIVERS;
-
-// Note: When changing COMMAND_DEFINITIONS categories, or 'notes' for any command, update `en/translation.json`
-export const COMMAND_DEFINITIONS = {
- 'Execute Script': {
- executeScript: {
- args: [
- ['executeScriptCommand', STRING],
- ['jsonArgument', STRING],
- ],
- },
- },
- 'App Management': {
- startActivity: {
- args: [
- ['appPackage', STRING],
- ['appActivity', STRING],
- ['appWaitPackage', STRING],
- ['intentAction', STRING],
- ['intentCategory', STRING],
- ['intentFlags', STRING],
- ['optionalIntentArguments', STRING],
- ['dontStopAppOnReset', STRING],
- ],
- drivers: [UIAUTOMATOR2, ESPRESSO],
- refresh: true,
- },
- getCurrentActivity: {
- drivers: [UIAUTOMATOR2, ESPRESSO],
- },
- getCurrentPackage: {
- drivers: [UIAUTOMATOR2, ESPRESSO],
- },
- installApp: {
- args: [['appPathOrUrl', STRING]],
- },
- isAppInstalled: {
- args: [['appId', STRING]],
- },
- background: {
- args: [['timeout', NUMBER]],
- refresh: true,
- },
- activateApp: {
- args: [['appId', STRING]],
- refresh: true,
- },
- terminateApp: {
- args: [['appId', STRING]],
- refresh: true,
- },
- removeApp: {
- args: [['appId', STRING]],
- },
- getStrings: {
- args: [
- ['language', STRING],
- ['stringFile', STRING],
- ],
- refresh: true,
- },
- },
- Clipboard: {
- getClipboard: {},
- setClipboard: {
- args: [
- ['clipboardText', STRING],
- ['contentType', STRING],
- ['contentLabel', STRING],
- ],
- },
- },
- 'File Transfer': {
- pushFile: {
- args: [
- ['pathToInstallTo', STRING],
- ['fileContentString', STRING],
- ],
- },
- pullFile: {
- args: [['pathToPullFrom', STRING]],
- },
- pullFolder: {
- args: [['folderToPullFrom', STRING]],
- },
- },
- 'Device Interaction': {
- shake: {},
- lock: {
- args: [['seconds', NUMBER]],
- refresh: true,
- },
- unlock: {
- refresh: true,
- },
- isLocked: {},
- rotateDevice: {
- args: [
- ['x', NUMBER],
- ['y', NUMBER],
- ['duration', NUMBER],
- ['radius', NUMBER],
- ['rotation', NUMBER],
- ['touchCount', NUMBER],
- ],
- refresh: true,
- },
- fingerPrint: {
- args: [['fingerPrintId', NUMBER]],
- drivers: [UIAUTOMATOR2, ESPRESSO],
- notes: ['simulatorOnly', ['minAndroidSDK', 23]],
- refresh: true,
- },
- touchId: {
- args: [['shouldMatch', BOOLEAN]],
- drivers: [XCUITEST],
- notes: ['simulatorOnly'],
- refresh: true,
- },
- toggleEnrollTouchId: {
- args: [['shouldEnroll', BOOLEAN]],
- drivers: [XCUITEST],
- notes: ['simulatorOnly'],
- },
- },
- Keyboard: {
- pressKeyCode: {
- args: [
- ['keyCode', NUMBER],
- ['metaState', NUMBER],
- ['flags', NUMBER],
- ],
- refresh: true,
- },
- longPressKeyCode: {
- args: [
- ['keyCode', NUMBER],
- ['metaState', NUMBER],
- ['flags', NUMBER],
- ],
- refresh: true,
- },
- hideKeyboard: {
- refresh: true,
- },
- isKeyboardShown: {},
- },
- Connectivity: {
- toggleAirplaneMode: {},
- toggleData: {},
- toggleWiFi: {},
- toggleLocationServices: {},
- sendSMS: {
- args: [
- ['phoneNumber', STRING],
- ['text', STRING],
- ],
- },
- gsmCall: {
- args: [
- ['phoneNumber', STRING],
- ['action', STRING],
- ],
- },
- gsmSignal: {
- args: [['signalStrengh', NUMBER]],
- },
- gsmVoice: {
- args: [['state', STRING]],
- },
- },
- 'Performance Data': {
- getPerformanceData: {
- args: [
- ['packageName', STRING],
- ['dataType', STRING],
- ['dataReadTimeout', NUMBER],
- ],
- },
- getPerformanceDataTypes: {},
- },
- System: {
- openNotifications: {
- refresh: true,
- },
- getDeviceTime: {},
- },
- Session: {
- getSession: {},
- setTimeouts: {
- args: [
- ['implicitTimeout', NUMBER],
- ['pageLoadTimeout', NUMBER],
- ['scriptTimeout', NUMBER],
- ],
- },
- getOrientation: {},
- setOrientation: {
- args: [['orientation', STRING]],
- refresh: true,
- },
- getGeoLocation: {},
- setGeoLocation: {
- args: [
- ['latitude', NUMBER],
- ['longitude', NUMBER],
- ['altitude', NUMBER],
- ],
- },
- getLogTypes: {},
- getLogs: {
- args: [['logType', STRING]],
- },
- updateSettings: {
- args: [['settingsJson', STRING]],
- },
- getSettings: {},
- },
- Web: {
- navigateTo: {
- args: [['url', STRING]],
- refresh: true,
- },
- getUrl: {},
- back: {
- refresh: true,
- },
- forward: {
- refresh: true,
- },
- refresh: {
- refresh: true,
- },
- },
- Context: {
- getContext: {},
- getContexts: {},
- switchContext: {
- args: [['name', STRING]],
- refresh: true,
- },
- },
- 'Window (W3C)': {
- getWindowHandle: {},
- closeWindow: {
- refresh: true,
- },
- switchToWindow: {
- args: [['handle', STRING]],
- refresh: true,
- },
- getWindowHandles: {},
- createWindow: {
- args: [['type', STRING]],
- refresh: true,
- },
- },
-};
-
-export const INTERACTION_MODE = {
- SOURCE: 'source',
- COMMANDS: 'commands',
- GESTURES: 'gestures',
- RECORDER: 'recorder',
- SESSION_INFO: 'sessionInfo',
-};
diff --git a/app/renderer/components/Session/AdvancedServerParams.js b/app/renderer/components/Session/AdvancedServerParams.js
deleted file mode 100644
index 6549c0fdb9..0000000000
--- a/app/renderer/components/Session/AdvancedServerParams.js
+++ /dev/null
@@ -1,55 +0,0 @@
-import {Checkbox, Col, Collapse, Form, Input, Row} from 'antd';
-import React from 'react';
-
-import styles from './Session.css';
-
-const AdvancedServerParams = ({server, setServerParam, serverType, t}) => (
-
-
-
-
-
-
- {serverType !== 'lambdatest' && (
-
-
-
- setServerParam('allowUnauthorized', e.target.checked, 'advanced')
- }
- >
- {t('allowUnauthorizedCerts')}
-
-
-
- )}
-
-
- setServerParam('useProxy', e.target.checked, 'advanced')}
- >
- {t('Use Proxy')}
-
-
-
-
-
- setServerParam('proxy', e.target.value, 'advanced')}
- placeholder={t('Proxy URL')}
- value={server.advanced.proxy}
- />
-
-
-
-
-
-
-
-
-);
-
-export default AdvancedServerParams;
diff --git a/app/renderer/components/Session/AttachToSession.js b/app/renderer/components/Session/AttachToSession.js
deleted file mode 100644
index 998e03eb20..0000000000
--- a/app/renderer/components/Session/AttachToSession.js
+++ /dev/null
@@ -1,89 +0,0 @@
-import {ReloadOutlined} from '@ant-design/icons';
-import {Button, Card, Col, Form, Row, Select} from 'antd';
-import React from 'react';
-
-import {ServerTypes} from '../../actions/Session';
-import SessionStyles from './Session.css';
-
-const formatCaps = (caps) => {
- let importantCaps = [caps.app, caps.platformName, caps.deviceName];
- if (caps.automationName) {
- importantCaps.push(caps.automationName);
- }
- return importantCaps.join(', ').trim();
-};
-
-const formatCapsBrowserstack = (caps) => {
- let importantCaps = formatCaps(caps).split(', ');
- if (caps.sessionName) {
- importantCaps.push(caps.sessionName);
- }
- return importantCaps.join(', ').trim();
-};
-
-const formatCapsLambdaTest = (caps) => {
- if (caps.hasOwnProperty.call(caps, 'capabilities')) {
- caps = caps.capabilities;
- }
- const deviceName = caps.desired ? caps.desired.deviceName : caps.deviceName;
- const importantCaps = [deviceName, caps.platformName, caps.platformVersion];
- return importantCaps.join(', ').trim();
-};
-
-const getSessionInfo = (session, serverType) => {
- switch (serverType) {
- case ServerTypes.browserstack:
- return `${session.id} — ${formatCapsBrowserstack(session.capabilities)}`;
- case ServerTypes.lambdatest:
- return `${session.id} - ${formatCapsLambdaTest(session.capabilities)}`;
- default:
- return `${session.id} — ${formatCaps(session.capabilities)}`;
- }
-};
-
-const AttachToSession = ({
- serverType,
- attachSessId,
- setAttachSessId,
- runningAppiumSessions,
- getRunningSessions,
- t,
-}) => (
-
-
-
- {t('connectToExistingSessionInstructions')}
-
- {t('selectSessionIDInDropdown')}
-
-
-
-
-
-
- setAttachSessId(value)}
- >
- {runningAppiumSessions.map((session) => (
-
- {getSessionInfo(session, serverType)}
-
- ))}
-
-
-
-
- } />
-
-
-
-
-
-);
-
-export default AttachToSession;
diff --git a/app/renderer/components/Session/CapabilityControl.js b/app/renderer/components/Session/CapabilityControl.js
deleted file mode 100644
index 6b14492118..0000000000
--- a/app/renderer/components/Session/CapabilityControl.js
+++ /dev/null
@@ -1,109 +0,0 @@
-import {FileOutlined} from '@ant-design/icons';
-import {Input, Switch} from 'antd';
-import _ from 'lodash';
-import React from 'react';
-
-import {log, remote} from '../../polyfills';
-import {INPUT} from '../AntdTypes';
-import SessionStyles from './Session.css';
-
-const getLocalFilePath = async () => {
- try {
- const {canceled, filePaths} = await remote.dialog.showOpenDialog({properties: ['openFile']});
- if (!canceled && !_.isEmpty(filePaths)) {
- return filePaths[0];
- }
- } catch (e) {
- log.error(e);
- }
-};
-
-const CapabilityControl = ({
- cap,
- onSetCapabilityParam,
- onPressEnter,
- isEditingDesiredCaps,
- id,
- t,
-}) => {
- switch (cap.type) {
- case 'text':
- return (
- onSetCapabilityParam(e.target.value)}
- onPressEnter={onPressEnter}
- className={SessionStyles.capsBoxFont}
- />
- );
- case 'boolean':
- return (
- onSetCapabilityParam(value)}
- />
- );
- case 'number':
- return (
-
- !isNaN(parseInt(e.target.value, 10))
- ? onSetCapabilityParam(parseInt(e.target.value, 10))
- : onSetCapabilityParam(undefined)
- }
- onPressEnter={onPressEnter}
- className={SessionStyles.capsBoxFont}
- />
- );
- case 'object':
- case 'json_object':
- return (
- onSetCapabilityParam(e.target.value)}
- className={SessionStyles.capsBoxFont}
- />
- );
- case 'file':
- return (
-
- onSetCapabilityParam(e.target.value)}
- onPressEnter={onPressEnter}
- className={SessionStyles.capsBoxFont}
- addonAfter={
- onSetCapabilityParam((await getLocalFilePath()) || cap.value)}
- />
- }
- />
-
- );
- default:
- throw new Error(t('invalidCapType', {type: cap.type}));
- }
-};
-
-export default CapabilityControl;
diff --git a/app/renderer/components/Session/CapabilityEditor.js b/app/renderer/components/Session/CapabilityEditor.js
deleted file mode 100644
index 85a14f2ce6..0000000000
--- a/app/renderer/components/Session/CapabilityEditor.js
+++ /dev/null
@@ -1,199 +0,0 @@
-import {DeleteOutlined, PlusOutlined} from '@ant-design/icons';
-import {Button, Checkbox, Col, Form, Input, Modal, Row, Select, Tooltip} from 'antd';
-import React, {useEffect, useRef} from 'react';
-
-import {ROW} from '../AntdTypes';
-import CapabilityControl from './CapabilityControl';
-import FormattedCaps from './FormattedCaps';
-import SessionStyles from './Session.css';
-
-const whitespaces = /^\s|\s$/;
-
-const whitespaceMsg = (value, t) => {
- const leadingSpace = /^\s/.test(value);
- const trailingSpace = /\s$/.test(value);
-
- if (leadingSpace || trailingSpace) {
- return t('whitespaceDetected');
- }
-};
-
-// Callback when the type of a capability is changed
-const handleSetType = (setCapabilityParam, caps, index, type) => {
- setCapabilityParam(index, 'type', type);
-
- // Translate the current value to the new type
- let translatedValue = caps[index].value;
- switch (type) {
- case 'boolean':
- if (translatedValue === 'true') {
- translatedValue = true;
- } else if (translatedValue === 'false') {
- translatedValue = false;
- } else {
- translatedValue = !!translatedValue;
- }
- break;
- case 'number':
- translatedValue = parseInt(translatedValue, 10) || 0;
- break;
- case 'text':
- case 'json_object':
- case 'object':
- translatedValue = translatedValue + '';
- break;
- case 'file':
- translatedValue = '';
- break;
- default:
- break;
- }
- setCapabilityParam(index, 'value', translatedValue);
-};
-
-const CapabilityEditor = (props) => {
- const {
- setCapabilityParam,
- caps,
- addCapability,
- removeCapability,
- saveSession,
- hideSaveAsModal,
- saveAsText,
- showSaveAsModal,
- setSaveAsText,
- isEditingDesiredCaps,
- t,
- setAddVendorPrefixes,
- addVendorPrefixes,
- server,
- serverType,
- } = props;
-
- const onSaveAsOk = () => saveSession(server, serverType, caps, {name: saveAsText});
- const latestCapField = useRef();
-
- // if we have more than one cap and the most recent cap name is empty, it means we've just
- // added a new cap field, so focus that input element. But only do this once, so we don't annoy
- // the user if they decide to unfocus and do something else.
- useEffect(() => {
- if (
- caps.length > 1 &&
- !latestCapField.current.input.value &&
- !latestCapField.current.__didFocus
- ) {
- latestCapField.current.focus();
- latestCapField.current.__didFocus = true;
- }
- }, [caps.length, latestCapField]);
-
- return (
-
-
-
-
-
-
-
- setSaveAsText(e.target.value)}
- addonBefore={t('Name')}
- value={saveAsText}
- onPressEnter={onSaveAsOk}
- />
-
-
-
- );
-};
-
-export default CapabilityEditor;
diff --git a/app/renderer/components/Session/CloudProviders.js b/app/renderer/components/Session/CloudProviders.js
deleted file mode 100644
index 3c7147a68b..0000000000
--- a/app/renderer/components/Session/CloudProviders.js
+++ /dev/null
@@ -1,153 +0,0 @@
-import React from 'react';
-
-import ServerTabBitbar from './ServerTabBitbar';
-import ServerTabBrowserstack from './ServerTabBrowserstack';
-import ServerTabExperitest from './ServerTabExperitest';
-import ServerTabHeadspin from './ServerTabHeadspin';
-import ServerTabKobiton from './ServerTabKobiton';
-import ServerTabLambdatest from './ServerTabLambdatest';
-import ServerTabMobitru from './ServerTabMobitru';
-import ServerTabPcloudy from './ServerTabPcloudy';
-import ServerTabPerfecto from './ServerTabPerfecto';
-import ServerTabRemoteTestKit from './ServerTabRemoteTestKit';
-import ServerTabRobotQA from './ServerTabRobotQA';
-import ServerTabSauce from './ServerTabSauce';
-import ServerTabTestingbot from './ServerTabTestingbot';
-import SessionStyles from './Session.css';
-
-// ParcelJS handles image loading by exporting a path to the image
-import BitBarLogo from '../../images/bitbar_logo.svg';
-import BrowserStackLogo from '../../images/browserstack_logo.svg';
-import ExperitestLogo from '../../images/experitest_logo.svg';
-import HeadSpinLogo from '../../images/headspin_logo.svg';
-import KobitonLogo from '../../images/kobiton_logo.svg';
-import LambdaTestLogo from '../../images/lambdatest_logo.svg';
-import MobitruLogo from '../../images/mobitru_logo.svg';
-import PcloudyLogo from '../../images/pcloudy_logo.svg';
-import PerfectoLogo from '../../images/perfecto_logo.svg';
-import RemoteTestKitLogo from '../../images/remotetestkit_logo.svg';
-import RobotQALogo from '../../images/robotqa_logo.svg';
-import SauceLogo from '../../images/sauce_logo.svg';
-import TestingBotLogo from '../../images/testingbot_logo.svg';
-
-const CloudProviders = {
- sauce: {
- tabhead: () => (
-
-
-
- ),
- tab: (props) => ,
- logo: SauceLogo,
- },
- headspin: {
- tabhead: () => (
-
-
-
- ),
- tab: (props) => ,
- logo: HeadSpinLogo,
- },
- browserstack: {
- tabhead: () => (
-
-
-
- ),
- tab: (props) => ,
- logo: BrowserStackLogo,
- },
- lambdatest: {
- tabhead: () => (
-
-
-
- ),
- tab: (props) => ,
- logo: LambdaTestLogo,
- },
- bitbar: {
- tabhead: () => (
-
-
-
- ),
- tab: (props) => ,
- logo: BitBarLogo,
- },
- kobiton: {
- tabhead: () => (
-
-
-
- ),
- tab: (props) => ,
- logo: KobitonLogo,
- },
- perfecto: {
- tabhead: () => (
-
-
-
- ),
- tab: (props) => ,
- logo: PerfectoLogo,
- },
- pcloudy: {
- tabhead: () => (
-
-
-
- ),
- tab: (props) => ,
- logo: PcloudyLogo,
- },
- testingbot: {
- tabhead: () => (
-
-
-
- ),
- tab: (props) => ,
- logo: TestingBotLogo,
- },
- experitest: {
- tabhead: () => (
-
-
-
- ),
- tab: (props) => ,
- logo: ExperitestLogo,
- },
- roboticmobi: {
- tabhead: () => (
-
-
-
- ),
- tab: (props) => ,
- logo: RobotQALogo,
- },
- remotetestkit: {
- tabhead: () => (
-
-
-
- ),
- tab: (props) => ,
- logo: RemoteTestKitLogo,
- },
- mobitru: {
- tabhead: () => (
-
-
-
- ),
- tab: (props) => ,
- logo: MobitruLogo,
- },
-};
-
-export default CloudProviders;
diff --git a/app/renderer/components/Session/FormattedCaps.js b/app/renderer/components/Session/FormattedCaps.js
deleted file mode 100644
index e8877e3156..0000000000
--- a/app/renderer/components/Session/FormattedCaps.js
+++ /dev/null
@@ -1,146 +0,0 @@
-import {CloseOutlined, EditOutlined, SaveOutlined} from '@ant-design/icons';
-import {Alert, Button, Card, Tooltip} from 'antd';
-import hljs from 'highlight.js';
-import React from 'react';
-
-import {getCapsObject} from '../../actions/Session.js';
-import {ALERT} from '../AntdTypes';
-import SessionStyles from './Session.css';
-
-const FormattedCaps = (props) => {
- const {
- caps,
- title,
- desiredCapsName,
- isEditingDesiredCapsName,
- isEditingDesiredCaps,
- startDesiredCapsEditor,
- abortDesiredCapsEditor,
- saveRawDesiredCaps,
- setRawDesiredCaps,
- rawDesiredCaps,
- isValidCapsJson,
- invalidCapsJsonReason,
- t,
- } = props;
-
- const getHighlightedCaps = (caps) => {
- const formattedJson = JSON.stringify(getCapsObject(caps), null, 2);
- return hljs.highlight(formattedJson, {language: 'json'}).value;
- };
-
- const setCapsTitle = () => {
- const {setDesiredCapsName} = props;
- if (!title) {
- return t('JSON Representation');
- } else if (!isEditingDesiredCapsName) {
- return title;
- } else {
- return (
- setDesiredCapsName(e.target.value)}
- value={desiredCapsName}
- className={SessionStyles.capsEditorTitle}
- />
- );
- }
- };
-
- const setCapsTitleButtons = () => {
- const {startDesiredCapsNameEditor, abortDesiredCapsNameEditor, saveDesiredCapsName} = props;
- if (!title) {
- return null;
- } else if (!isEditingDesiredCapsName) {
- return (
-
- }
- className={SessionStyles.capsNameEditorButton}
- />
-
- );
- } else {
- return (
-
-
- }
- className={SessionStyles.capsNameEditorButton}
- />
-
-
- }
- className={SessionStyles.capsNameEditorButton}
- />
-
-
- );
- }
- };
-
- return (
- caps && (
-
-
- {isEditingDesiredCaps && (
-
- }
- className={SessionStyles.capsEditorButton}
- />
-
- )}
- {isEditingDesiredCaps && (
-
- }
- className={SessionStyles.capsEditorButton}
- />
-
- )}
- {!isEditingDesiredCaps && (
-
- } />
-
- )}
-
- {isEditingDesiredCaps && (
-
- )}
- {!isEditingDesiredCaps && (
-
- )}
-
- )
- );
-};
-
-export default FormattedCaps;
diff --git a/app/renderer/components/Session/SavedSessions.js b/app/renderer/components/Session/SavedSessions.js
deleted file mode 100644
index c5abf92c4b..0000000000
--- a/app/renderer/components/Session/SavedSessions.js
+++ /dev/null
@@ -1,127 +0,0 @@
-import {DeleteOutlined, EditOutlined} from '@ant-design/icons';
-import {Button, Col, Row, Table} from 'antd';
-import moment from 'moment';
-import React from 'react';
-
-import FormattedCaps from './FormattedCaps';
-import SessionStyles from './Session.css';
-
-const DATE_COLUMN_WIDTH = '25%';
-const ACTIONS_COLUMN_WIDTH = '106px';
-
-const dataSource = (savedSessions, t) => {
- if (!savedSessions) {
- return [];
- }
- return savedSessions.map((session) => ({
- key: session.uuid,
- name: session.name || t('unnamed'),
- date: moment(session.date).format('YYYY-MM-DD'),
- }));
-};
-
-const getSessionById = (savedSessions, id, t) => {
- for (let session of savedSessions) {
- if (session.uuid === id) {
- return session;
- }
- }
- throw new Error(t('couldNotFindEntryWithId', {id}));
-};
-
-const SavedSessions = (props) => {
- const {savedSessions, capsUUID, switchTabs, t} = props;
-
- const handleCapsAndServer = (uuid) => {
- const {
- setCapsAndServer,
- server,
- serverType,
- isEditingDesiredCapsName,
- abortDesiredCapsNameEditor,
- isEditingDesiredCaps,
- abortDesiredCapsEditor,
- } = props;
- const session = getSessionById(savedSessions, uuid, t);
-
- // Disable any editors before changing the selected caps
- if (isEditingDesiredCapsName) {
- abortDesiredCapsNameEditor();
- }
- if (isEditingDesiredCaps) {
- abortDesiredCapsEditor();
- }
-
- // In case user has CAPS saved from older version of Inspector which
- // doesn't contain server and serverType within the session object
- setCapsAndServer(
- session.server || server,
- session.serverType || serverType,
- session.caps,
- session.uuid,
- session.name,
- );
- };
-
- const handleDelete = (uuid) => {
- const {deleteSavedSession} = props;
- if (window.confirm(t('confirmDeletion'))) {
- deleteSavedSession(uuid);
- }
- };
-
- const columns = [
- {
- title: t('Name'),
- dataIndex: 'name',
- key: 'name',
- },
- {
- title: t('Created'),
- dataIndex: 'date',
- key: 'date',
- width: DATE_COLUMN_WIDTH,
- },
- {
- title: t('Actions'),
- key: 'action',
- width: ACTIONS_COLUMN_WIDTH,
- render: (_, record) => (
-
- }
- onClick={() => {
- handleCapsAndServer(record.key);
- switchTabs('new');
- }}
- className={SessionStyles.editSession}
- />
- } onClick={() => handleDelete(record.key)} />
-
- ),
- },
- ];
-
- return (
-
-
- ({onClick: () => handleCapsAndServer(row.key)})}
- rowClassName={(row) => (capsUUID === row.key ? SessionStyles.selected : '')}
- />
-
-
-
-
-
- );
-};
-
-export default SavedSessions;
diff --git a/app/renderer/components/Session/ServerTabCustom.js b/app/renderer/components/Session/ServerTabCustom.js
deleted file mode 100644
index dc258cfa98..0000000000
--- a/app/renderer/components/Session/ServerTabCustom.js
+++ /dev/null
@@ -1,58 +0,0 @@
-import {Checkbox, Col, Form, Input, Row} from 'antd';
-import React from 'react';
-
-import {DEFAULT_SERVER_HOST, DEFAULT_SERVER_PATH, DEFAULT_SERVER_PORT} from '../../actions/Session';
-
-const ServerTabCustom = ({server, setServerParam, t}) => (
-
-);
-
-export default ServerTabCustom;
diff --git a/app/renderer/components/Session/ServerTabExperitest.js b/app/renderer/components/Session/ServerTabExperitest.js
deleted file mode 100644
index 93325c0ba7..0000000000
--- a/app/renderer/components/Session/ServerTabExperitest.js
+++ /dev/null
@@ -1,40 +0,0 @@
-import {Col, Form, Input, Row} from 'antd';
-import React from 'react';
-
-import SessionStyles from './Session.css';
-
-const accessKeyPlaceholder = 'accessKey';
-const placeholderUrl = 'https://example.experitest.com';
-
-const ServerTabExperitest = ({server, setServerParam, t}) => (
-
-);
-
-export default ServerTabExperitest;
diff --git a/app/renderer/components/Session/ServerTabHeadspin.js b/app/renderer/components/Session/ServerTabHeadspin.js
deleted file mode 100644
index 8e66d63d1d..0000000000
--- a/app/renderer/components/Session/ServerTabHeadspin.js
+++ /dev/null
@@ -1,28 +0,0 @@
-import {Col, Form, Input, Row} from 'antd';
-import React from 'react';
-
-import SessionStyles from './Session.css';
-
-const headspinUrl = 'https://xxxx.headspin.io:4723/v0/your-api-token/wd/hub';
-
-const ServerTabHeadspin = ({server, setServerParam, t}) => (
-
-);
-
-export default ServerTabHeadspin;
diff --git a/app/renderer/components/Session/ServerTabLambdatest.js b/app/renderer/components/Session/ServerTabLambdatest.js
deleted file mode 100644
index df82e37a3b..0000000000
--- a/app/renderer/components/Session/ServerTabLambdatest.js
+++ /dev/null
@@ -1,50 +0,0 @@
-import {Col, Form, Input, Row} from 'antd';
-import React from 'react';
-
-import {INPUT} from '../AntdTypes';
-
-const lambdatestUsernamePlaceholder = (t) => {
- if (process.env.LAMBDATEST_USERNAME) {
- return t('usingDataFoundIn', {environmentVariable: 'LAMBDATEST_USERNAME'});
- }
- return t('yourUsername');
-};
-
-const lambdatestAccessKeyPlaceholder = (t) => {
- if (process.env.LAMBDATEST_ACCESS_KEY) {
- return t('usingDataFoundIn', {environmentVariable: 'LAMBDATEST_ACCESS_KEY'});
- }
- return t('yourAccessKey');
-};
-
-const ServerTabLambdatest = ({server, setServerParam, t}) => (
-
-);
-
-export default ServerTabLambdatest;
diff --git a/app/renderer/components/Session/ServerTabMobitru.js b/app/renderer/components/Session/ServerTabMobitru.js
deleted file mode 100644
index ddc9ddc350..0000000000
--- a/app/renderer/components/Session/ServerTabMobitru.js
+++ /dev/null
@@ -1,70 +0,0 @@
-import {Col, Form, Input, Row} from 'antd';
-import React from 'react';
-
-import {INPUT} from '../AntdTypes';
-
-const mobitrWebDriverUrlPlaceholder = (t) => {
- if (process.env.MOBITRU_WEBDRIVER_URL) {
- return t('usingDataFoundIn', {environmentVariable: 'MOBITRU_WEBDRIVER_URL'});
- }
- return 'https://app.mobitru.com/wd/hub';
-};
-
-const mobitruBillingUnitPlaceholder = (t) => {
- if (process.env.MOBITRU_BILLING_UNIT) {
- return t('usingDataFoundIn', {environmentVariable: 'MOBITRU_BILLING_UNIT'});
- }
- return 'personal';
-};
-
-const mobitruAccessKeyPlaceholder = (t) => {
- if (process.env.MOBITRU_ACCESS_KEY) {
- return t('usingDataFoundIn', {environmentVariable: 'MOBITRU_ACCESS_KEY'});
- }
- return t('yourAccessKey');
-};
-
-const ServerTabMobitru = ({server, setServerParam, t}) => (
-
-);
-
-export default ServerTabMobitru;
diff --git a/app/renderer/components/Session/ServerTabPcloudy.js b/app/renderer/components/Session/ServerTabPcloudy.js
deleted file mode 100644
index 1127c716c8..0000000000
--- a/app/renderer/components/Session/ServerTabPcloudy.js
+++ /dev/null
@@ -1,54 +0,0 @@
-import {Col, Form, Input, Row} from 'antd';
-import React from 'react';
-
-import {INPUT} from '../AntdTypes';
-import SessionStyles from './Session.css';
-
-const pcloudyUsernamePlaceholder = 'username@pcloudy.com';
-const pcloudyHostPlaceholder = 'cloud.pcloudy.com';
-const pcloudyAccessKeyExample = 'kjdgtdwn65fdasd78uy6y';
-
-const ServerTabPcloudy = ({server, setServerParam, t}) => (
-
-);
-
-export default ServerTabPcloudy;
diff --git a/app/renderer/components/Session/ServerTabRemoteTestKit.js b/app/renderer/components/Session/ServerTabRemoteTestKit.js
deleted file mode 100644
index 378c5ec00d..0000000000
--- a/app/renderer/components/Session/ServerTabRemoteTestKit.js
+++ /dev/null
@@ -1,24 +0,0 @@
-import {Col, Form, Input, Row} from 'antd';
-import React from 'react';
-
-import {INPUT} from '../AntdTypes';
-
-const ServerTabRemoteTestkit = ({server, setServerParam, t}) => (
-
-);
-
-export default ServerTabRemoteTestkit;
diff --git a/app/renderer/components/Session/ServerTabSauce.js b/app/renderer/components/Session/ServerTabSauce.js
deleted file mode 100644
index e829052b35..0000000000
--- a/app/renderer/components/Session/ServerTabSauce.js
+++ /dev/null
@@ -1,107 +0,0 @@
-import {Checkbox, Col, Form, Input, Radio, Row} from 'antd';
-import React from 'react';
-
-import {INPUT} from '../AntdTypes';
-import SessionStyles from './Session.css';
-
-const sauceUsernamePlaceholder = (t) => {
- if (process.env.SAUCE_USERNAME) {
- return t('usingDataFoundIn', {environmentVariable: 'SAUCE_USERNAME'});
- }
- return t('yourUsername');
-};
-
-const sauceAccessKeyPlaceholder = (t) => {
- if (process.env.SAUCE_ACCESS_KEY) {
- return t('usingDataFoundIn', {environmentVariable: 'SAUCE_ACCESS_KEY'});
- }
- return t('yourAccessKey');
-};
-
-const ServerTabSauce = ({server, setServerParam, t}) => (
-
-);
-
-export default ServerTabSauce;
diff --git a/app/renderer/components/Session/ServerTabTestingbot.js b/app/renderer/components/Session/ServerTabTestingbot.js
deleted file mode 100644
index 935894f994..0000000000
--- a/app/renderer/components/Session/ServerTabTestingbot.js
+++ /dev/null
@@ -1,50 +0,0 @@
-import {Col, Form, Input, Row} from 'antd';
-import React from 'react';
-
-import {INPUT} from '../AntdTypes';
-
-const testingbotKeyPlaceholder = (t) => {
- if (process.env.TB_KEY) {
- return t('usingDataFoundIn', {environmentVariable: 'TB_KEY'});
- }
- return t('yourUsername');
-};
-
-const testingbotSecretPlaceholder = (t) => {
- if (process.env.TB_SECRET) {
- return t('usingDataFoundIn', {environmentVariable: 'TB_SECRET'});
- }
- return t('yourAccessKey');
-};
-
-const ServerTabTestingbot = ({server, setServerParam, t}) => (
-
-);
-
-export default ServerTabTestingbot;
diff --git a/app/renderer/components/Session/Session.css b/app/renderer/components/Session/Session.css
deleted file mode 100644
index 27e3ef1a84..0000000000
--- a/app/renderer/components/Session/Session.css
+++ /dev/null
@@ -1,311 +0,0 @@
-.active-session {
- background-color: #662d91;
- color: white;
-}
-
-.sessionContainer {
- width: 100%;
- height: 100%;
- padding: 1em;
- background: linear-gradient(180deg, #f9f9f9, #f2f2f2, 5%, #f2f2f2, 95%, #d9d9d9);
- display: flex;
- flex-flow: column;
-}
-
-.sessionContainer :global(.ant-tabs-tab .anticon.anticon-close-square) {
- color: red;
- margin-left: 10px;
-}
-
-.sessionContainer :global(.addCloudProviderTab) {
- font-style: italic;
-}
-
-.cloudProviderModal {
- min-width: 600px;
- max-width: 100%;
-}
-
-.cloudProviderModal :global(.ant-row) {
- margin-bottom: 16px;
-}
-
-.cloudProviderModal :global(.ant-modal-body button) {
- width: 100%;
- padding: 4px;
-}
-
-.cloudProviderModal :global(.ant-modal-body button img) {
- height: 100%;
-}
-.sessionFooter {
- text-align: right;
- height: 30px;
-}
-
-.sessionFooter .desiredCapsLink {
- float: left;
-}
-
-.tabText img {
- height: 20px;
- filter: grayscale(100%);
-}
-
-:global(.ant-tabs-tab-active) .tabText img {
- filter: none;
-}
-
-.serverTabs {
- padding-bottom: 8px;
-}
-
-.serverTabs :global(.ant-tabs-bar) {
- padding-top: 2em;
- margin-top: -1em;
-}
-
-.serverTabs :global(.ant-tabs-nav-wrap) {
- -webkit-app-region: drag;
-}
-
-.serverTabs :global(.ant-form > .ant-row > div) {
- padding-bottom: 12px;
-}
-
-.serverTabs :global(.ant-form-item) {
- margin: 0;
-}
-
-.scrollingTabCont {
- border-bottom: 1px solid #d9d9d9;
- margin-bottom: 15px;
- margin-top: 15px;
- flex-grow: 1;
- display: flex;
- flex-direction: column;
- overflow: auto;
-}
-
-.scrollingTabCont :global(.ant-tabs-bar) {
- margin-bottom: 0px;
-}
-
-.scrollingTabCont :global(.ant-tabs-content) {
- height: 100%;
-}
-
-.scrollingTab {
- scrollbar-width: none; /* -webkit-scrollbar for Firefox */
- overflow-y: scroll;
- height: 100%;
-}
-
-.scrollingTab::-webkit-scrollbar {
- width: 0px;
-}
-
-:global(.ant-badge-count) {
- background-color: #1890ff;
-}
-
-.savedSessions,
-.savedSessions :global(.ant-table),
-.savedSessions :global(.ant-table-wrapper) {
- height: 100%;
-}
-
-.savedSessions :global(.ant-col) {
- height: calc(100% - 15px);
-}
-
-.savedSessions :global(.ant-table) {
- overflow-y: auto;
-}
-
-.savedSessions :global(.ant-table-body .ant-table-cell) {
- padding: 8px 16px;
-}
-
-.savedSessions :global(.ant-table::-webkit-scrollbar) {
- width: 0px;
-}
-
-.newSessionForm {
- overflow-y: auto;
- overflow-x: hidden;
- height: 100%;
-}
-
-.newSessionForm::-webkit-scrollbar {
- width: 0px;
-}
-
-.capsFormattedCol {
- padding-left: 12px;
-}
-
-.formattedCaps,
-.formattedCapsBody {
- height: 100%;
-}
-
-.formattedCaps :global(.ant-card-head-title) {
- height: 54px;
- padding-right: 10px;
-}
-
-.formattedCaps :global(.ant-card-body) {
- height: calc(100% - 54px);
- padding: 0 14px 0 24px;
- flex: 1;
- overflow-y: auto;
-}
-
-.formattedCaps :global(.ant-card-extra) {
- padding: 15px 0;
-}
-
-.formattedCapsBody pre {
- height: 100%;
- margin: 0;
- padding: 24px 0;
- white-space: pre-wrap;
- word-wrap: break-word;
-}
-
-.start-session-button {
- margin-left: 1em;
-}
-
-.filepath-button {
- cursor: pointer;
-}
-
-.capsFormCol {
- min-width: 420px;
- height: 100%;
-}
-
-.capsFormRow {
- font-size: 14px;
- height: 100%;
-}
-
-.capsFormRow :global(.ant-col) {
- height: calc(100% - 15px);
-}
-
-.capsBoxFont {
- font-family: monospace;
-}
-
-.capsFormRow :global(.ant-form-item) {
- margin-bottom: 0.5em;
-}
-
-.capsValueControl {
- width: 142px;
-}
-
-.fileControlWrapper :global(.ant-input-group),
-.capsValueControl textarea {
- max-width: 142px;
-}
-
-.localDesc {
- font-style: italic;
- color: #666;
- margin: 0;
- padding: 6px 8px 0 8px;
-}
-
-.selected {
- background-color: #d6e8ff;
-}
-
-.capsNameEditorButton {
- margin: 0 8px 0 0;
- padding: 0;
-}
-
-.capsEditorControls {
- position: absolute;
- right: 0;
- padding: 28px;
-}
-
-.capsEditorButton {
- margin: 0 0 0 4px;
-}
-
-.capsEditor {
- width: 100%;
- height: 100%;
- padding: 24px 0;
-}
-
-.capsEditorTitle {
- width: 100%;
- height: 22px;
- padding: 0;
- margin: 0;
- resize: none;
-}
-
-.capsEditorBody {
- width: 100%;
- padding: 0;
- margin: -1px;
- resize: none;
- border-color: lightgray;
- font-family: SFMono-Regular, Consolas, 'Liberation Mono', Menlo, Courier, monospace;
-}
-
-.capsEditorBodyFull {
- height: 100%;
-}
-
-.capsEditorBodyResized {
- height: calc(100% - 40px);
-}
-
-.advancedSettingsContainerCol {
- width: 100%;
-}
-
-.advancedSettingsContainer :global(.ant-form-item) {
- margin: 0;
-}
-
-.add-desired-capability-button {
- float: right;
-}
-
-.editSession {
- margin-right: 10px;
-}
-
-.btnReload {
- float: right;
- margin-left: 8px;
-}
-
-.btnDeleteCap {
- float: right;
-}
-
-.inputDataCenter {
- margin-left: 8px;
-}
-
-.addonDataCenter {
- height: 32px;
- border-right: 1px solid #d9d9d9 !important;
-}
-
-.addonDataCenterRadioContainer {
- display: table-cell;
- padding-top: 4px;
- padding-left: 11px;
-}
diff --git a/app/renderer/components/Session/Session.js b/app/renderer/components/Session/Session.js
deleted file mode 100644
index 16f4025c78..0000000000
--- a/app/renderer/components/Session/Session.js
+++ /dev/null
@@ -1,203 +0,0 @@
-import {LinkOutlined} from '@ant-design/icons';
-import {Badge, Button, Spin, Tabs} from 'antd';
-import _ from 'lodash';
-import React, {useEffect} from 'react';
-import {useNavigate} from 'react-router-dom';
-
-import {ipcRenderer, shell} from '../../polyfills';
-import {BUTTON} from '../AntdTypes';
-import AdvancedServerParams from './AdvancedServerParams';
-import AttachToSession from './AttachToSession';
-import CapabilityEditor from './CapabilityEditor';
-import CloudProviderSelector from './CloudProviderSelector';
-import CloudProviders from './CloudProviders';
-import SavedSessions from './SavedSessions';
-import ServerTabCustom from './ServerTabCustom';
-import SessionStyles from './Session.css';
-
-const ADD_CLOUD_PROVIDER = 'addCloudProvider';
-const CAPS_DOCS_LINK = 'https://appium.io/docs/en/latest/guides/caps/';
-
-const Session = (props) => {
- const {
- tabKey,
- switchTabs,
- serverType,
- server,
- visibleProviders = [],
- caps,
- capsUUID,
- capsName,
- isCapsDirty,
- isEditingDesiredCaps,
- requestSaveAsModal,
- saveSession,
- newSession,
- savedSessions,
- newSessionLoading,
- attachSessId,
- t,
- } = props;
-
- const navigate = useNavigate();
-
- const isAttaching = tabKey === 'attach';
-
- const handleSelectServerTab = async (tab) => {
- const {changeServerType, addCloudProvider} = props;
- if (tab === ADD_CLOUD_PROVIDER) {
- addCloudProvider();
- return;
- }
- await changeServerType(tab);
- };
-
- const loadNewSession = async (caps, attachSessId = null) => {
- if (await newSession(_.cloneDeep(caps), attachSessId)) {
- navigate('/inspector', {replace: true});
- }
- };
-
- useEffect(() => {
- const {
- setLocalServerParams,
- getSavedSessions,
- setSavedServerParams,
- setStateFromAppiumFile,
- setVisibleProviders,
- getRunningSessions,
- bindWindowClose,
- initFromQueryString,
- saveFile,
- } = props;
- (async () => {
- try {
- bindWindowClose();
- switchTabs('new');
- await getSavedSessions();
- await setSavedServerParams();
- await setLocalServerParams();
- await setVisibleProviders();
- getRunningSessions();
- initFromQueryString(loadNewSession);
- await setStateFromAppiumFile();
- ipcRenderer.on('open-file', (_, filePath) => setStateFromAppiumFile(filePath));
- ipcRenderer.on('save-file', (_, filePath) => saveFile(filePath));
- } catch (e) {
- console.error(e); // eslint-disable-line no-console
- }
- })();
- }, []);
-
- return [
-
-
-
-
handleSelectServerTab(tab)}
- className={SessionStyles.serverTabs}
- items={[
- {label: t('Appium Server'), key: 'remote', children: },
- ..._(visibleProviders).map((providerName) => {
- const provider = CloudProviders[providerName];
- if (!provider) {
- return true;
- }
- return {
- label: {provider.tabhead()}
,
- key: providerName,
- children: provider.tab(props),
- };
- }),
- {
- label: {t('Select Cloud Providers')} ,
- key: ADD_CLOUD_PROVIDER,
- },
- ]}
- />
-
-
-
-
,
- },
- {
- label: (
-
- {t('Saved Capability Sets')}{' '}
-
-
- ),
- key: 'saved',
- className: SessionStyles.scrollingTab,
- disabled: savedSessions.length === 0,
- children:
,
- },
- {
- label: t('Attach to Session'),
- key: 'attach',
- className: SessionStyles.scrollingTab,
- children:
,
- },
- ]}
- />
-
-
-
- {!isAttaching && capsUUID && (
-
- saveSession(server, serverType, caps, {name: capsName, uuid: capsUUID})
- }
- disabled={!isCapsDirty || isEditingDesiredCaps}
- >
- {t('Save')}
-
- )}
- {!isAttaching && (
-
- {t('saveAs')}
-
- )}
- {!isAttaching && (
-
loadNewSession(caps)}
- className={SessionStyles['start-session-button']}
- >
- {t('startSession')}
-
- )}
- {isAttaching && (
-
loadNewSession(null, attachSessId)}
- >
- {t('attachToSession')}
-
- )}
-
-
- ,
- ,
- ];
-};
-
-export default Session;
diff --git a/app/renderer/containers/InspectorPage.js b/app/renderer/containers/InspectorPage.js
deleted file mode 100644
index c84294c807..0000000000
--- a/app/renderer/containers/InspectorPage.js
+++ /dev/null
@@ -1,11 +0,0 @@
-import {connect} from 'react-redux';
-
-import * as InspectorActions from '../actions/Inspector';
-import InspectorPage from '../components/Inspector/Inspector';
-import {withTranslation} from '../util';
-
-function mapStateToProps(state) {
- return state.inspector;
-}
-
-export default withTranslation(InspectorPage, connect(mapStateToProps, InspectorActions));
diff --git a/app/renderer/containers/Root.js b/app/renderer/containers/Root.js
deleted file mode 100644
index f3c54ece6d..0000000000
--- a/app/renderer/containers/Root.js
+++ /dev/null
@@ -1,15 +0,0 @@
-import React from 'react';
-import {Provider} from 'react-redux';
-import {MemoryRouter} from 'react-router-dom';
-
-import AllRoutes from '../routes';
-
-const Root = ({store}) => (
-
-
-
-
-
-);
-
-export default Root;
diff --git a/app/renderer/containers/SessionPage.js b/app/renderer/containers/SessionPage.js
deleted file mode 100644
index 312e2588ac..0000000000
--- a/app/renderer/containers/SessionPage.js
+++ /dev/null
@@ -1,11 +0,0 @@
-import {connect} from 'react-redux';
-
-import * as SessionActions from '../actions/Session';
-import Session from '../components/Session/Session';
-import {withTranslation} from '../util';
-
-function mapStateToProps(state) {
- return state.session;
-}
-
-export default withTranslation(Session, connect(mapStateToProps, SessionActions));
diff --git a/app/renderer/images/browserstack_logo.svg b/app/renderer/images/browserstack_logo.svg
deleted file mode 100644
index f58178bbeb..0000000000
--- a/app/renderer/images/browserstack_logo.svg
+++ /dev/null
@@ -1,202 +0,0 @@
-
-
-
- bs-black-logo-400x100
- Created with Sketch.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/app/renderer/images/headspin_logo.svg b/app/renderer/images/headspin_logo.svg
deleted file mode 100644
index b0dad95b68..0000000000
--- a/app/renderer/images/headspin_logo.svg
+++ /dev/null
@@ -1,67 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/renderer/images/icon.png b/app/renderer/images/icon.png
deleted file mode 100644
index 6be8d5bc70..0000000000
Binary files a/app/renderer/images/icon.png and /dev/null differ
diff --git a/app/renderer/images/kobiton_logo.svg b/app/renderer/images/kobiton_logo.svg
deleted file mode 100644
index 5a3a58ad30..0000000000
--- a/app/renderer/images/kobiton_logo.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/app/renderer/images/lambdatest_logo.svg b/app/renderer/images/lambdatest_logo.svg
deleted file mode 100644
index 7706e8caea..0000000000
--- a/app/renderer/images/lambdatest_logo.svg
+++ /dev/null
@@ -1,3 +0,0 @@
-
-
-
diff --git a/app/renderer/images/pcloudy_logo.svg b/app/renderer/images/pcloudy_logo.svg
deleted file mode 100644
index cb28008d33..0000000000
--- a/app/renderer/images/pcloudy_logo.svg
+++ /dev/null
@@ -1,132 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/renderer/images/remotetestkit_logo.svg b/app/renderer/images/remotetestkit_logo.svg
deleted file mode 100644
index 235ceaaf09..0000000000
--- a/app/renderer/images/remotetestkit_logo.svg
+++ /dev/null
@@ -1,166 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/renderer/images/robotqa_logo.svg b/app/renderer/images/robotqa_logo.svg
deleted file mode 100644
index 3b80f07d97..0000000000
--- a/app/renderer/images/robotqa_logo.svg
+++ /dev/null
@@ -1,222 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/renderer/images/sauce_icon.svg b/app/renderer/images/sauce_icon.svg
deleted file mode 100644
index fdde1404d9..0000000000
--- a/app/renderer/images/sauce_icon.svg
+++ /dev/null
@@ -1,18 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/renderer/images/sauce_logo.svg b/app/renderer/images/sauce_logo.svg
deleted file mode 100644
index 66e5fcc412..0000000000
--- a/app/renderer/images/sauce_logo.svg
+++ /dev/null
@@ -1,20 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/renderer/index.html b/app/renderer/index.html
deleted file mode 100644
index e3a1aac9a0..0000000000
--- a/app/renderer/index.html
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
-
-
- Appium
-
-
-
-
-
-
-
diff --git a/app/renderer/index.js b/app/renderer/index.js
deleted file mode 100644
index 6f21996f54..0000000000
--- a/app/renderer/index.js
+++ /dev/null
@@ -1,26 +0,0 @@
-import React from 'react';
-import {createRoot} from 'react-dom/client';
-
-import ErrorBoundary from './components/ErrorBoundary/ErrorBoundary';
-import Root from './containers/Root';
-import store from './store';
-
-const container = document.getElementById('root');
-const root = createRoot(container);
-
-root.render(
-
-
- ,
-);
-
-if (module.hot) {
- module.hot.accept('./containers/Root', () => {
- const NextRoot = require('./containers/Root').default;
- root.render(
-
-
- ,
- );
- });
-}
diff --git a/app/renderer/lib/client-frameworks/index.js b/app/renderer/lib/client-frameworks/index.js
deleted file mode 100644
index 11f8add4bc..0000000000
--- a/app/renderer/lib/client-frameworks/index.js
+++ /dev/null
@@ -1,21 +0,0 @@
-import DotNetNUnitFramework from './dotnet-nunit';
-import JavaJUnit4Framework from './java-junit4';
-import JavaJUnit5Framework from './java-junit5';
-import JsOxygenFramework from './js-oxygen';
-import JsWdIoFramework from './js-wdio';
-import PythonFramework from './python';
-import RobotFramework from './robot';
-import RubyFramework from './ruby';
-
-const frameworks = {
- dotNetNUnit: DotNetNUnitFramework,
- jsWdIo: JsWdIoFramework,
- jsOxygen: JsOxygenFramework,
- java: JavaJUnit4Framework,
- javaJUnit5: JavaJUnit5Framework,
- python: PythonFramework,
- ruby: RubyFramework,
- robot: RobotFramework,
-};
-
-export default frameworks;
diff --git a/app/renderer/polyfills/browser.js b/app/renderer/polyfills/browser.js
deleted file mode 100644
index f74674a582..0000000000
--- a/app/renderer/polyfills/browser.js
+++ /dev/null
@@ -1,66 +0,0 @@
-const browser = {
- clipboard: {
- writeText: (text) => navigator.clipboard.writeText(text),
- },
- shell: {
- openExternal: (url) => window.open(url, ''),
- },
- remote: {
- getCurrentWindow: () => ({
- getSize: () => [window.innerWidth, window.innerHeight],
- }),
- },
- ipcRenderer: {
- on: (evt) => {
- console.warn(`Cannot listen for IPC event ${evt} in browser context`); // eslint-disable-line no-console
- },
- },
- fs: null,
- util: null,
-};
-
-class BrowserSettings {
- has(key) {
- return this.get(key) !== null;
- }
-
- set(key, val) {
- return localStorage.setItem(key, JSON.stringify(val));
- }
-
- get(key) {
- return JSON.parse(localStorage.getItem(key));
- }
-
- getSync(key) {
- return this.get(key);
- }
-}
-
-const log = console;
-const settings = new BrowserSettings();
-const {clipboard, shell, remote, ipcRenderer} = browser;
-const i18NextBackend = require('i18next-chained-backend').default;
-const i18NextBackendOptions = {
- backends: [
- require('i18next-localstorage-backend').default,
- require('i18next-http-backend').default,
- ],
- backendOptions: [
- {},
- {
- loadPath: './locales/{{lng}}/{{ns}}.json',
- },
- ],
-};
-
-export {
- log,
- settings,
- clipboard,
- shell,
- remote,
- ipcRenderer,
- i18NextBackend,
- i18NextBackendOptions,
-};
diff --git a/app/renderer/polyfills/electron.js b/app/renderer/polyfills/electron.js
deleted file mode 100644
index 00cd8ca191..0000000000
--- a/app/renderer/polyfills/electron.js
+++ /dev/null
@@ -1,26 +0,0 @@
-import {clipboard, ipcRenderer, remote, shell} from 'electron';
-import log from 'electron-log';
-import settings from 'electron-settings';
-import fs from 'fs';
-import i18NextBackend from 'i18next-fs-backend';
-import path from 'path';
-import util from 'util';
-
-const i18NextBackendOptions = {
- loadPath: path.join(__dirname, 'locales/{{lng}}/{{ns}}.json'),
- addPath: path.join(__dirname, 'locales/{{lng}}/{{ns}}.json'),
- jsonIndent: 2,
-};
-
-export {
- log,
- clipboard,
- shell,
- remote,
- ipcRenderer,
- settings,
- i18NextBackend,
- i18NextBackendOptions,
- fs,
- util,
-};
diff --git a/app/renderer/polyfills/index.js b/app/renderer/polyfills/index.js
deleted file mode 100644
index fc24c066ce..0000000000
--- a/app/renderer/polyfills/index.js
+++ /dev/null
@@ -1,63 +0,0 @@
-let log,
- settings,
- clipboard,
- shell,
- remote,
- ipcRenderer,
- i18NextBackend,
- i18NextBackendOptions,
- fs,
- util;
-
-function buildForBrowser() {
- if (process.env.BUILD_BROWSER) {
- return true;
- }
-
- if (typeof navigator !== 'undefined' && !/electron/i.test(navigator.userAgent)) {
- return true;
- }
-
- return false;
-}
-
-if (buildForBrowser()) {
- ({
- log,
- settings,
- clipboard,
- shell,
- remote,
- ipcRenderer,
- i18NextBackend,
- i18NextBackendOptions,
- fs,
- util,
- } = require('./browser'));
-} else {
- ({
- log,
- settings,
- clipboard,
- shell,
- remote,
- ipcRenderer,
- i18NextBackend,
- i18NextBackendOptions,
- fs,
- util,
- } = require('./electron'));
-}
-
-export {
- log,
- clipboard,
- shell,
- remote,
- ipcRenderer,
- settings,
- i18NextBackend,
- i18NextBackendOptions,
- fs,
- util,
-};
diff --git a/app/renderer/reducers/Updater.js b/app/renderer/reducers/Updater.js
deleted file mode 100644
index 1d106de530..0000000000
--- a/app/renderer/reducers/Updater.js
+++ /dev/null
@@ -1,12 +0,0 @@
-import {SET_UPDATE_STATE} from '../actions/Updater';
-
-const INITIAL_STATE = {};
-
-export default function session(state = INITIAL_STATE, action) {
- switch (action.type) {
- case SET_UPDATE_STATE:
- return {...action.updateState};
- default:
- return {...state};
- }
-}
diff --git a/app/renderer/routes.js b/app/renderer/routes.js
deleted file mode 100644
index eb40b47aab..0000000000
--- a/app/renderer/routes.js
+++ /dev/null
@@ -1,26 +0,0 @@
-import React, {Suspense} from 'react';
-import {Route, Routes} from 'react-router-dom';
-
-import i18n from '../configs/i18next.config.renderer';
-import Spinner from './components/Spinner/Spinner';
-import InspectorPage from './containers/InspectorPage';
-import SessionPage from './containers/SessionPage';
-import {ipcRenderer} from './polyfills';
-
-ipcRenderer.on('appium-language-changed', (event, message) => {
- if (i18n.language !== message.language) {
- i18n.changeLanguage(message.language);
- }
-});
-
-const AllRoutes = () => (
- }>
-
- } />
- } />
- } />
-
-
-);
-
-export default AllRoutes;
diff --git a/app/renderer/splash.html b/app/renderer/splash.html
deleted file mode 100644
index e2846da338..0000000000
--- a/app/renderer/splash.html
+++ /dev/null
@@ -1,14 +0,0 @@
-
-
-
-
- Appium
-
-
-
-
-
-
-
-
-
diff --git a/app/renderer/store.js b/app/renderer/store.js
deleted file mode 100644
index cb8e019472..0000000000
--- a/app/renderer/store.js
+++ /dev/null
@@ -1,34 +0,0 @@
-import {configureStore} from '@reduxjs/toolkit';
-
-import actions from './actions';
-import createRootReducer from './reducers';
-
-const store = configureStore({
- reducer: createRootReducer(),
- middleware: (getDefaultMiddleware) => {
- const middleware = getDefaultMiddleware({
- serializableCheck: false,
- });
-
- // Additional development tools
- if (process.env.NODE_ENV === 'development') {
- // Logging Middleware
- const {createLogger} = require('redux-logger');
- const logger = createLogger({
- level: 'info',
- collapsed: true,
- });
- middleware.push(logger);
- }
-
- return middleware;
- },
- devTools:
- process.env.NODE_ENV !== 'development'
- ? false
- : {
- actionCreators: {...actions},
- },
-});
-
-export default store;
diff --git a/app/renderer/stylesheets/.postcssrc b/app/renderer/stylesheets/.postcssrc
deleted file mode 100644
index 53eb28dff0..0000000000
--- a/app/renderer/stylesheets/.postcssrc
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "modules": false
-}
\ No newline at end of file
diff --git a/app/renderer/stylesheets/app.global.less b/app/renderer/stylesheets/app.global.less
deleted file mode 100644
index bec1b68de8..0000000000
--- a/app/renderer/stylesheets/app.global.less
+++ /dev/null
@@ -1,6 +0,0 @@
-@import './common.global.less';
-
-body {
- min-height: 610px;
- min-width: 870px;
-}
diff --git a/app/renderer/stylesheets/common.global.less b/app/renderer/stylesheets/common.global.less
deleted file mode 100644
index 5281a4c2a8..0000000000
--- a/app/renderer/stylesheets/common.global.less
+++ /dev/null
@@ -1,101 +0,0 @@
-@import '../../../node_modules/antd/dist/antd.less';
-@import (inline) '../../../node_modules/highlight.js/styles/intellij-light.css';
-
-// ANTD variables
-@font-size-base: 12px;
-@font-family:
- 'Helvetica Neue For Number',
- -apple-system,
- BlinkMacSystemFont,
- 'Segoe UI',
- 'PingFang SC',
- 'Hiragino Sans GB',
- 'Microsoft YaHei',
- 'Helvetica Neue',
- Helvetica,
- Arial,
- sans-serif,
- 'Apple Color Emoji',
- 'Segoe UI Emoji',
- 'Segoe UI Symbol';
-@input-addon-bg: #eee;
-
-// Global styles
-body {
- color: #222 !important;
- box-sizing: border-box;
-}
-
-body::-webkit-scrollbar {
- width: 0px;
- background: transparent;
-}
-
-body::-webkit-scrollbar-corner {
- background: transparent;
-}
-
-#root {
- height: 100%;
- background: linear-gradient(180deg, #f9f9f9, #f2f2f2, 5%, #f2f2f2, 95%, #d9d9d9);
- .ant-spin-nested-loading > div > .ant-spin {
- max-height: initial;
- }
-}
-
-.window {
- background-color: #cde4f5 !important;
- width: 100%;
- height: 100%;
-}
-
-.list-group-item.active {
- background-color: #662d91 !important;
-}
-
-.ant-spin-nested-loading,
-.ant-spin-container {
- height: 100%;
-}
-
-.ant-notification {
- width: 80%;
- margin-right: 10%;
- > div {
- display: flex;
- justify-content: center;
- align-items: center;
- }
-}
-
-.ant-notification-notice {
- margin-left: revert;
-}
-
-.ant-input-group {
- .ant-select {
- height: 100%;
- }
-
- .ant-select-selection {
- border-top-left-radius: 0;
- border-bottom-left-radius: 0;
- height: 100%;
- padding-top: 0;
- .ant-select-selection-selected-value {
- padding-top: 2px;
- }
- }
-
- .ant-input-group-addon {
- padding-left: @padding-xs;
- }
-
- .select-container {
- height: 32px;
- }
-}
-
-.ant-tabs-tab {
- font-size: 14px;
-}
diff --git a/app/renderer/util.js b/app/renderer/util.js
deleted file mode 100644
index 13131b6635..0000000000
--- a/app/renderer/util.js
+++ /dev/null
@@ -1,432 +0,0 @@
-import {DOMParser} from '@xmldom/xmldom';
-import _ from 'lodash';
-import {withTranslation as wt} from 'react-i18next';
-import XPath from 'xpath';
-
-import config from '../configs/app.config';
-import {log} from './polyfills';
-
-const VALID_W3C_CAPS = [
- 'platformName',
- 'browserName',
- 'browserVersion',
- 'acceptInsecureCerts',
- 'pageLoadStrategy',
- 'proxy',
- 'setWindowRect',
- 'timeouts',
- 'unhandledPromptBehavior',
-];
-
-// Attributes on nodes that are likely to be unique to the node so we should consider first when
-// suggesting xpath locators. These are considered IN ORDER.
-const UNIQUE_XPATH_ATTRIBUTES = ['name', 'content-desc', 'id', 'resource-id', 'accessibility-id'];
-
-// Attributes that we should recommend as a fallback but ideally only in conjunction with other
-// attributes
-const MAYBE_UNIQUE_XPATH_ATTRIBUTES = ['label', 'text', 'value'];
-
-const UNIQUE_CLASS_CHAIN_ATTRIBUTES = ['name', 'label', 'value'];
-
-const UNIQUE_PREDICATE_ATTRIBUTES = ['name', 'label', 'value', 'type'];
-
-/**
- * Translates sourceXML to JSON
- *
- * @param {string} source
- * @returns {Object}
- */
-export function xmlToJSON(source) {
- const childNodesOf = (xmlNode) => {
- if (!xmlNode || !xmlNode.hasChildNodes()) {
- return [];
- }
-
- const result = [];
- for (let childIdx = 0; childIdx < xmlNode.childNodes.length; ++childIdx) {
- const childNode = xmlNode.childNodes.item(childIdx);
- if (childNode.nodeType === 1) {
- result.push(childNode);
- }
- }
- return result;
- };
- const translateRecursively = (xmlNode, parentPath = '', index = null) => {
- const attributes = {};
- for (let attrIdx = 0; attrIdx < xmlNode.attributes.length; ++attrIdx) {
- const attr = xmlNode.attributes.item(attrIdx);
- attributes[attr.name] = attr.value;
- }
-
- // Dot Separated path of indices
- const path = _.isNil(index) ? '' : `${!parentPath ? '' : parentPath + '.'}${index}`;
- const classChainSelector = isIOS
- ? getOptimalClassChain(xmlDoc, xmlNode, UNIQUE_CLASS_CHAIN_ATTRIBUTES)
- : '';
- const predicateStringSelector = isIOS
- ? getOptimalPredicateString(xmlDoc, xmlNode, UNIQUE_PREDICATE_ATTRIBUTES)
- : '';
-
- return {
- children: childNodesOf(xmlNode).map((childNode, childIndex) =>
- translateRecursively(childNode, path, childIndex),
- ),
- tagName: xmlNode.tagName,
- attributes,
- xpath: getOptimalXPath(xmlDoc, xmlNode, UNIQUE_XPATH_ATTRIBUTES),
- ...(isIOS ? {classChain: classChainSelector ? `**${classChainSelector}` : ''} : {}),
- ...(isIOS ? {predicateString: predicateStringSelector ? predicateStringSelector : ''} : {}),
- path,
- };
- };
- const isIOS = source.includes('XCUIElement');
- const xmlDoc = new DOMParser().parseFromString(source);
- // get the first child element node in the doc. some drivers write their xml differently so we
- // first try to find an element as a direct descendend of the doc, then look for one in
- // documentElement
- const firstChild = childNodesOf(xmlDoc)[0] || childNodesOf(xmlDoc.documentElement)[0];
-
- return firstChild ? translateRecursively(firstChild) : {};
-}
-
-/**
- * Return information about whether an xpath query results in a unique element, and the non-unique
- * index of the element in the document if not unique
- *
- * @param {string} xpath
- * @param {DOMDocument} doc
- * @param {DOMNode} domNode - the current node
- * @returns {[boolean, number?]} tuple consisting of (1) whether the xpath is unique and (2) its index in
- * the set of other similar nodes if not unique
- */
-function determineXpathUniqueness(xpath, doc, domNode) {
- let othersWithAttr = [];
-
- // If the XPath does not parse, move to the next unique attribute
- try {
- othersWithAttr = XPath.select(xpath, doc);
- } catch (ign) {
- return [false];
- }
-
- if (othersWithAttr.length > 1) {
- return [false, othersWithAttr.indexOf(domNode)];
- }
-
- return [true];
-}
-
-/**
- * Given an xml doc and a current dom node, try to find a robust xpath selector qualified by
- * key attributes, which is unique in the document (or unique plus index).
- *
- * @param {string} xpath
- * @param {DOMDocument} doc
- * @param {Array|Array<[string, string]>} attrs - a list of attributes to consider, or
- * a list of pairs of attributes to consider in conjunction
- *
- * @returns {[string|undefined, boolean|undefined]} tuple consisting of (1) the xpath selector discovered, and (2)
- * whether this selector is absolutely unique in the document (true) or qualified by index (false)
- */
-function getUniqueXPath(doc, domNode, attrs) {
- let uniqueXpath, semiUniqueXpath;
- const tagForXpath = domNode.tagName || '*';
- const isPairs = attrs.length > 0 && _.isArray(attrs[0]);
- const isNodeName = attrs.length === 0;
-
- // If we're looking for a unique //, return it only if it's actually unique. No
- // semi-uniqueness here!
- if (isNodeName) {
- let xpath = `//${domNode.tagName}`;
- const [isUnique] = determineXpathUniqueness(xpath, doc, domNode);
- if (isUnique) {
- // even if this node name is unique, if it's the root node, we don't want to refer to it using
- // '//' but rather '/'
- if (!(domNode.parentNode && domNode.parentNode.tagName)) {
- xpath = `/${domNode.tagName}`;
- }
- return [xpath, true];
- }
- return [];
- }
-
- // Otherwise go through our various attributes to look for uniqueness
- for (const attrName of attrs) {
- let xpath;
- if (isPairs) {
- const [attr1Name, attr2Name] = attrName;
- const [attr1Value, attr2Value] = attrName.map(domNode.getAttribute.bind(domNode));
- if (!attr1Value || !attr2Value) {
- continue;
- }
- xpath = `//${tagForXpath}[@${attr1Name}="${attr1Value}" and @${attr2Name}="${attr2Value}"]`;
- } else {
- const attrValue = domNode.getAttribute(attrName);
- if (!attrValue) {
- continue;
- }
- xpath = `//${tagForXpath}[@${attrName}="${attrValue}"]`;
- }
- const [isUnique, indexIfNotUnique] = determineXpathUniqueness(xpath, doc, domNode);
- if (isUnique) {
- uniqueXpath = xpath;
- break;
- }
-
- // if the xpath wasn't totally unique it might still be our best bet. Store a less unique
- // version qualified by an index for later in semiUniqueXpath. If we can't find a better
- // unique option down the road, we'll fall back to this
- if (!semiUniqueXpath && !_.isUndefined(indexIfNotUnique)) {
- semiUniqueXpath = `(${xpath})[${indexIfNotUnique + 1}]`;
- }
- }
- if (uniqueXpath) {
- return [uniqueXpath, true];
- }
- if (semiUniqueXpath) {
- return [semiUniqueXpath, false];
- }
- return [];
-}
-
-/**
- * Get an optimal XPath for a DOMNode
- *
- * @param {DOMDocument} doc
- * @param {DOMNode} domNode
- * @returns {string|null}
- */
-export function getOptimalXPath(doc, domNode) {
- try {
- // BASE CASE #1: If this isn't an element, we're above the root, return empty string
- if (!domNode.tagName || domNode.nodeType !== 1) {
- return '';
- }
-
- const attrsForPairs = [...UNIQUE_XPATH_ATTRIBUTES, ...MAYBE_UNIQUE_XPATH_ATTRIBUTES];
- const attrPairsPermutations = attrsForPairs.flatMap((v1, i) =>
- attrsForPairs.slice(i + 1).map((v2) => [v1, v2]),
- );
-
- const cases = [
- // BASE CASE #2: If this node has a unique attribute or content attribute, return an absolute
- // XPath with that attribute
- UNIQUE_XPATH_ATTRIBUTES,
-
- // BASE CASE #3: If this node has a unique pair of attributes including 'maybe' attributes,
- // return an xpath based on that pair
- attrPairsPermutations,
-
- // BASE CASE #4: Look for a 'maybe' unique attribute on its own. It's better if we find one
- // of these that's unique in conjunction with another attribute, but if not, that's OK.
- // Better than a hierarchical query.
- MAYBE_UNIQUE_XPATH_ATTRIBUTES,
-
- // BASE CASE #5: Look to see if the node type is unique in the document
- [],
- ];
-
- // It's possible that in all of these cases we don't find a truly unique selector. But
- // a selector qualified by attribute with an index attached like //*[@id="foo"][1] is still
- // better than a fully path-based selector. We call this a 'semi unique xpath'
- let semiUniqueXpath;
-
- // Go through each of our cases and look for selectors for each case in order
- for (const attrs of cases) {
- const [xpath, isFullyUnique] = getUniqueXPath(doc, domNode, attrs);
- if (isFullyUnique) {
- // if we ever encounter an actually unique selector, return it straightaway
- return xpath;
- } else if (!semiUniqueXpath && xpath) {
- // if we have a semin unique selector, and haven't already captured a semi unique selector,
- // hold onto it for later. If we end up without any unique selectors from any of the cases,
- // then we'll return this. But we want to make sure to return our FIRST instance of a semi
- // unique selector, since it might theoretically be the best.
- semiUniqueXpath = xpath;
- }
- }
-
- // Once we've gone through all our cases, if we do have a semi uniqe xpath, send that back
- if (semiUniqueXpath) {
- return semiUniqueXpath;
- }
-
- // Otherwise fall back to a purely hierarchical expression of this dom node's position in the
- // document as a last resort.
- // First get the relative xpath of this node using tagName
- let xpath = `/${domNode.tagName}`;
-
- // If this node has siblings of the same tagName, get the index of this node
- if (domNode.parentNode) {
- // Get the siblings
- const childNodes = Array.prototype.slice
- .call(domNode.parentNode.childNodes, 0)
- .filter((childNode) => childNode.nodeType === 1 && childNode.tagName === domNode.tagName);
-
- // If there's more than one sibling, append the index
- if (childNodes.length > 1) {
- let index = childNodes.indexOf(domNode);
- xpath += `[${index + 1}]`;
- }
- }
-
- // Make a recursive call to this nodes parents and prepend it to this xpath
- return getOptimalXPath(doc, domNode.parentNode) + xpath;
- } catch (error) {
- // If there's an unexpected exception, abort and don't get an XPath
- log.error(
- `The most optimal XPATH could not be determined ` +
- `because an error was thrown: '${JSON.stringify(error, null, 2)}'`,
- );
-
- return null;
- }
-}
-
-/**
- * Get an optimal Class Chain for a DOMNode based on the getOptimalXPath method
- *
- * @param {DOMDocument} doc
- * @param {DOMNode} domNode
- * @param {Array} uniqueAttributes Attributes we know are unique
- * @returns {string|null}
- */
-function getOptimalClassChain(doc, domNode, uniqueAttributes) {
- try {
- // BASE CASE #1: If this isn't an element, we're above the root, or this is `XCUIElementTypeApplication`,
- // which is not an official XCUITest element, return empty string
- if (
- !domNode.tagName ||
- domNode.nodeType !== 1 ||
- domNode.tagName === 'XCUIElementTypeApplication'
- ) {
- return '';
- }
-
- // BASE CASE #2: If this node has a unique class chain based on attributes then return it
- for (let attrName of uniqueAttributes) {
- const attrValue = domNode.getAttribute(attrName);
- if (attrValue) {
- let xpath = `//${domNode.tagName || '*'}[@${attrName}="${attrValue}"]`;
- let classChain = `/${domNode.tagName || '*'}[\`${attrName} == "${attrValue}"\`]`;
- let othersWithAttr;
-
- // If the XPath does not parse, move to the next unique attribute
- try {
- othersWithAttr = XPath.select(xpath, doc);
- } catch (ign) {
- continue;
- }
-
- // If the attribute isn't actually unique, get it's index too
- if (othersWithAttr.length > 1) {
- let index = othersWithAttr.indexOf(domNode);
- classChain = `${classChain}[${index + 1}]`;
- }
- return classChain;
- }
- }
-
- // Get the relative xpath of this node using tagName
- let classChain = `/${domNode.tagName}`;
-
- // If this node has siblings of the same tagName, get the index of this node
- if (domNode.parentNode) {
- // Get the siblings
- const childNodes = Array.prototype.slice
- .call(domNode.parentNode.childNodes, 0)
- .filter((childNode) => childNode.nodeType === 1 && childNode.tagName === domNode.tagName);
-
- // If there's more than one sibling, append the index
- if (childNodes.length > 1) {
- let index = childNodes.indexOf(domNode);
- classChain += `[${index + 1}]`;
- }
- }
-
- // Make a recursive call to this nodes parents and prepend it to this xpath
- return getOptimalClassChain(doc, domNode.parentNode, uniqueAttributes) + classChain;
- } catch (error) {
- // If there's an unexpected exception, abort and don't get an XPath
- log.error(
- `The most optimal '-ios class chain' could not be determined ` +
- `because an error was thrown: '${JSON.stringify(error, null, 2)}'`,
- );
-
- return null;
- }
-}
-
-/**
- * Get an optimal Predicate String for a DOMNode based on the getOptimalXPath method
- * The `ios predicate string` can only search a single element, no parent child scope
- *
- * @param {DOMDocument} doc
- * @param {DOMNode} domNode
- * @param {Array} uniqueAttributes Attributes we know are unique
- * @returns {string|null}
- */
-function getOptimalPredicateString(doc, domNode, uniqueAttributes) {
- try {
- // BASE CASE #1: If this isn't an element, we're above the root, or this is `XCUIElementTypeApplication`,
- // which is not an official XCUITest element, return empty string
- if (
- !domNode.tagName ||
- domNode.nodeType !== 1 ||
- domNode.tagName === 'XCUIElementTypeApplication'
- ) {
- return '';
- }
-
- // BASE CASE #2: Check all attributes and try to find the best way
- let xpathAttributes = [];
- let predicateString = [];
-
- for (let attrName of uniqueAttributes) {
- const attrValue = domNode.getAttribute(attrName);
-
- if (_.isNil(attrValue) || (_.isString(attrValue) && attrValue.length === 0)) {
- continue;
- }
-
- xpathAttributes.push(`@${attrName}="${attrValue}"`);
- const xpath = `//*[${xpathAttributes.join(' and ')}]`;
- predicateString.push(`${attrName} == "${attrValue}"`);
- let othersWithAttr;
-
- // If the XPath does not parse, move to the next unique attribute
- try {
- othersWithAttr = XPath.select(xpath, doc);
- } catch (ign) {
- continue;
- }
-
- // If the attribute isn't actually unique, get it's index too
- if (othersWithAttr.length === 1) {
- return predicateString.join(' AND ');
- }
- }
- } catch (error) {
- // If there's an unexpected exception, abort and don't get an XPath
- log.error(
- `The most optimal '-ios predicate string' could not be determined ` +
- `because an error was thrown: '${JSON.stringify(error, null, 2)}'`,
- );
-
- return null;
- }
-}
-
-export function withTranslation(componentCls, ...hocs) {
- return _.flow(...hocs, wt(config.namespace))(componentCls);
-}
-
-export function addVendorPrefixes(caps) {
- return caps.map((cap) => {
- // if we don't have a valid unprefixed cap or a cap with an existing prefix, update it
- if (!VALID_W3C_CAPS.includes(cap.name) && !_.includes(cap.name, ':')) {
- cap.name = `appium:${cap.name}`;
- }
- return cap;
- });
-}
diff --git a/app/shared/settings.js b/app/shared/settings.js
deleted file mode 100644
index 435b3514aa..0000000000
--- a/app/shared/settings.js
+++ /dev/null
@@ -1,30 +0,0 @@
-import {settings} from '../renderer/polyfills';
-
-export const SAVED_SESSIONS = 'SAVED_SESSIONS';
-export const SET_SAVED_GESTURES = 'SET_SAVED_GESTURES';
-export const SERVER_ARGS = 'SERVER_ARGS';
-export const SESSION_SERVER_PARAMS = 'SESSION_SERVER_PARAMS';
-export const SESSION_SERVER_TYPE = 'SESSION_SERVER_TYPE';
-export const SAVED_FRAMEWORK = 'SAVED_FRAMEWORK';
-
-const DEFAULT_SETTINGS = {
- [SAVED_SESSIONS]: [],
- [SET_SAVED_GESTURES]: [],
- [SERVER_ARGS]: null,
- [SESSION_SERVER_PARAMS]: null,
- [SESSION_SERVER_TYPE]: null,
- [SAVED_FRAMEWORK]: 'java',
-};
-
-export async function getSetting(setting) {
- if (await settings.has(setting)) {
- return await settings.get(setting);
- }
- return DEFAULT_SETTINGS[setting];
-}
-
-export async function setSetting(setting, value) {
- await settings.set(setting, value);
-}
-
-export default settings;
diff --git a/app/web/polyfills.js b/app/web/polyfills.js
new file mode 100644
index 0000000000..24f85607c4
--- /dev/null
+++ b/app/web/polyfills.js
@@ -0,0 +1,33 @@
+import _ from 'lodash';
+
+// Adjust locales path depending on Vite base (web vs plugin)
+const viteBase = import.meta.env.BASE_URL;
+const vitePath = `${_.trimEnd(viteBase, '/')}/`;
+
+const localesPath =
+ process.env.NODE_ENV === 'development'
+ ? '/locales' // 'public' folder contents are served at '/'
+ : `..${vitePath}locales`; // from 'dist-browser/assets/'
+
+const openLink = (url) => window.open(url, '');
+const setTheme = () => {}; // only relevant in Electron build
+const updateLanguage = () => {}; // only relevant in Electron build
+const loadSessionFileIfOpened = () => null; // only relevant in Electron build
+
+class BrowserSettings {
+ has(key) {
+ return this.get(key) !== null;
+ }
+
+ set(key, val) {
+ return localStorage.setItem(key, JSON.stringify(val));
+ }
+
+ get(key) {
+ return JSON.parse(localStorage.getItem(key));
+ }
+}
+
+const settings = new BrowserSettings();
+
+export {loadSessionFileIfOpened, localesPath, openLink, setTheme, settings, updateLanguage};
diff --git a/assets/locales/ko/translation.json b/assets/locales/ko/translation.json
deleted file mode 100644
index be143fbe8a..0000000000
--- a/assets/locales/ko/translation.json
+++ /dev/null
@@ -1,285 +0,0 @@
-{
- "appiumInspector": "Appium Inspector",
- "Edit": "변경",
- "Redo": "재실행",
- "Cut": "자르기",
- "Copy": "복사",
- "Paste": "붙여넣기",
- "Delete": "Delete",
- "Select All": "전체 선택",
- "Window": "윈도우",
- "Minimize": "축소하기",
- "Zoom": "Zoom",
- "Zoom In": "Zoom In",
- "Zoom Out": "Zoom Out",
- "Reset Zoom Level": "Reset Zoom Level",
- "Close Window": "Close Window",
- "Open Session File…": "Open Session File…",
- "Bring All to Front": "모두 전면으로 가져오기",
- "Help": "도움",
- "Appium Documentation": "Appium Documentation",
- "Inspector Documentation": "Inspector Documentation",
- "Appium Discussion Forum": "Appium Discussion Forum",
- "Report Issues": "Report Issues",
- "About Appium Inspector": "About Appium Inspector",
- "showAppInfo": "App Version: {{appVersion}}\nElectron: {{electronVersion}}\nNode.js: {{nodejsVersion}}\n",
- "Improve Translations": "Improve Translations",
- "Check for Updates…": "Check for Updates…",
- "File": "파일",
- "New Window": "New Window",
- "Hide Appium Inspector": "Hide Appium Inspector",
- "Hide Others": "다른 프로그램 숨기기",
- "Show All": "모두 보이기",
- "Quit Appium Inspector": "Quit Appium Inspector",
- "Toggle Full Screen": "풀 스크린",
- "Languages": "언어",
- "View": "보기",
- "Reload": "새로 고침",
- "Toggle Developer Tools": "Developer Tools 열기",
- "Undo": "실행 취소",
- "Restart Now": "지금 재시작하기",
- "Save Server Arguments Preset": "서버 인수 프리셋 저장",
- "Save": "저장",
- "Cancel": "취소",
- "datetimeFormat": "MMM Do YYYY, h:mma",
- "updateDetails": "출시일: {{pubDate}}\n\n릴리즈 정보: {{notes}}",
- "appiumIsAvailable": "Appium Inspector {{name}} 사용이 가능합니다",
- "updateIsBeingDownloaded": "업데이트를 다운로드 중 입니다. 다운로드가 완료되면 다시 알려드립니다.",
- "updateIsDownloaded": "Appium Inspector {{releaseName}} 다운로드가 완료되었습니다. 업데이트를 적용하려면 다시 시작해야합니다. (참고 : Appium Inspector을 설치하고 다시 시작하는 데 몇 분 정도 걸릴 수 있습니다.)",
- "updateDownloadFailed": "업데이트 다운로드에 실패했습니다. 이유: {{message}}",
- "OK": "OK",
- "Install Now": "지금 설치하기",
- "Install Later": "나중에 설치하기",
- "Update Download Started": "업데이트 다운로드 시작",
- "No update available": "다운로드가 가능한 업데이트가 없습니다",
- "Appium Inspector is up-to-date": "최신 버전의 Appium Inspector를 사용중입니다",
- "Later": "나중에",
- "Update Downloaded": "업데이트 다운로드",
- "Could not download update": "업데이트를 다운로드 할 수 없습니다",
- "Unexpected Error:": "Unexpected Error:",
- "Please report this issue at:": "Please report this issue at:",
- "Full error trace:": "Full error trace:",
- "Copy Error Trace": "Copy Error Trace",
- "Inspect element": "Element 점검",
- "Session closed due to inactivity": "비활성으로 인해 세션이 닫혔습니다",
- "Session has been terminated": "세션이 종료되었습니다",
- "frameworkNotSupported": "'{{framework}}' 프레임워크는 지원되지 않습니다",
- "findElementFailure": "'{{methodName}}'에 대한 element를 찾지 못했습니다. 페이지를 새로고침하고 다시 시도해보세요.",
- "Could not start session": "세션을 시작할 수 없습니다",
- "couldNotConnect": "Could not connect to Appium server URL '{{url}}'. Please check if the server is running and the URL is correct (valid URLs can be found at the start of the Appium server log). If you are using the Inspector's browser version, ensure the server has been started with '--allow-cors'.",
- "Invalid URL:": "Invalid URL:",
- "sauceCredentialsRequired": "Sauce 사용자 이름과 엑세스 키가 필요합니다!",
- "testingbotCredentialsRequired": "TestingBot 키와 시크릿이 필요합니다!",
- "Perfecto SecurityToken is required": "Perfecto 보안 토큰이 필요합니다!",
- "browserstackCredentialsRequired": "Browserstack 사용자 이름과 엑세스 키가 필요합니다!",
- "lambdatestCredentialsRequired": "Lambdatest username and access key are required!",
- "bitbarCredentialsRequired": "Bitbar API 키가 필요합니다!",
- "kobitonCredentialsRequired": "KOBITON 사용자 이름과 api 키가 필요합니다!",
- "experitestAccessKeyURLRequired": "Experitest AccessKey 및 URL이 필요합니다.",
- "experitestAccessKey": "Experitest AccessKey",
- "experitestUrl": "Experitest Url",
- "locatorStrategy": "Locator Strategy:",
- "selector": "Selector:",
- "couldNotObtainScreenshot": "스크린샷을 가져올 수 없습니다: {{screenshotError}}",
- "selectElementInSource": "소스에서 element를 선택하여 시작하세요.",
- "Press Home Button": "Press Home Button",
- "Execute Siri Command": "Execute Siri Command",
- "Press Back Button": "Press Back Button",
- "Press App Switch Button": "Press App Switch Button",
- "Command": "Command",
- "Show Element Handles": "Show Element Handles",
- "Hide Element Handles": "Hide Element Handles",
- "Select Elements": "Element 선택하기",
- "Tap/Swipe By Coordinates": "Tap/Swipe By Coordinates",
- "Download Screenshot": "Download Screenshot",
- "Back": "뒤로가기",
- "Start Refreshing Source": "Start Refreshing Source",
- "Pause Refreshing Source": "Pause Refreshing Source",
- "refreshSource": "소스 & 스크린샷 새로고침",
- "Start Recording": "녹화 시작하기",
- "Pause Recording": "녹화 일시정지",
- "Search for element": "Element 검색하기",
- "App Source": "App Source",
- "Toggle Attributes": "Toggle Attributes",
- "Copy XML Source to Clipboard": "XML Source 클립보드에 복사",
- "Download Source as .XML File": "Download Source as .XML File",
- "Copy Attributes to Clipboard": "Attributes 클립보드애 복사하기",
- "quitSessionAndClose": "세션 정지 및 Inspector 종료",
- "Session Inactive": "세션 비활성",
- "Keep Session Running": "실행중인 세션 유지",
- "Quit Session": "세션 종료",
- "Your session is about to expire": "세션이 곧 만료됩니다",
- "Enter Keys to Send": "Enter Keys to Send",
- "Find and Select in Source": "Find and Select in Source",
- "Clear": "Clear",
- "Send Keys": "Send Keys",
- "Done": "완료",
- "Search": "검색",
- "Show/Hide Boilerplate Code": "Boilerplate Code 보이기/숨기기",
- "Copy code to clipboard": "Code 클립보드에 복사",
- "Start this Kind of Session with Code": "Start this Kind of Session with Code",
- "Clear Actions": "Clear Actions",
- "Close Recorder": "Recorder 닫기",
- "enableRecordingAndPerformActions": "Enable recording in the application header, then perform some actions to see code show up here",
- "Recorder": "Recorder",
- "Attribute": "Attribute",
- "Value": "Value",
- "Find By": "Find By",
- "Selector": "Selector",
- "Time": "시간 (ms)",
- "Get Timing": "타이밍 확인하기",
- "interactionsNotAvailable": "Interactions for this element may not be available",
- "usingXPathNotRecommended": "XPath 로케이터를 사용하는 것은 권장하지 않으며, 불안정한 테스트로 이어질 수 있습니다. Accessibility 로케이터를 제공하도록 개발 팀에 요청하세요!",
- "noAdditionalContextsFound": "No additional contexts have been detected",
- "contextDropdownInfo": "Multiple contexts detected; certain elements might only be accessible after switching to a different context. Note that webview inspection in Appium Inspector is less accurate than the DevTools of Chrome or Safari. For more information, see:",
- "idAutocompletionCanBeDisabled": "The requested id selector does not have a package name prefix. This Appium session has package name autocompletion enabled, which may be the reason why no elements were found. To disable this behavior, relaunch this session with the capability 'appium:disableIdLocatorAutocompletion' set to 'true'.",
- "missingAutomationNameForStrategies": "Additional locator strategies may be available. To view them, add the capability 'appium:automationName' when launching the session. Note that this capability is mandatory in Appium 2.",
- "Tap": "탭",
- "Gathering initial app source…": "초기 어플리케이션 소스 수집중…",
- "couldNotObtainSource": "소스를 얻을 수 없습니다: {{errorMsg}}",
- "iOS": "iOS",
- "Android": "Android",
- "desiredCapabilitiesDocumentation": "Capabilities Documentation",
- "startSession": "세션 시작하기",
- "saveAs": "새로 저장하기",
- "attachToSession": "세션에 연결하기",
- "selectedElement": "선택된 Element",
- "unnamed": "(Unnamed)",
- "No Description": "No Description",
- "couldNotFindEntryWithId": "Could not find an entry with ID {{id}}",
- "couldNotFindAnyElements": "어떠한 element도 찾을 수 없습니다",
- "elementsCount": "Elements found:",
- "xCoordinate": "X: {{x}}",
- "yCoordinate": "Y: {{y}}",
- "SauceLabs Data Center": "SauceLabs 데이터 센터",
- "US-West": "US West 1",
- "US-East": "US East 4",
- "EU-Central": "EU Central 1",
- "proxyThroughSC": "Sauce Connect의 Selenium Relay를 통한 프록시",
- "SSL": "SSL",
- "text": "text",
- "boolean": "boolean",
- "number": "number",
- "JSON object": "JSON object",
- "filepath": "filepath",
- "connectToExistingSessionInstructions": "위의 서버 유형에 대해 이미 실행중인 세션이있는 경우, Inspector에 직접 연결 할 수 있습니다.",
- "selectSessionIDInDropdown": "아래 drop down에서 세션 ID를 선택하세요.",
- "allowUnauthorizedCerts": "승인되지 않은 인증서 허용",
- "Use Proxy": "Proxy 사용",
- "JSON Representation": "JSON Representation",
- "Capability Builder": "Capability Builder",
- "Saved Capability Sets": "Saved Capability Sets",
- "Attach to Session": "세션에 연결하기…",
- "localhost": "localhost",
- "Host": "호스트",
- "Port": "포트",
- "usingDataFoundIn": "{{environmentVariable}}에서 발견된 데이터 사용",
- "yourUsername": "사용자 이름",
- "Sauce Username": "Sauce 사용자 이름",
- "Sauce Access Key": "Sauce 엑세스 키",
- "yourAccessKey": "Your 엑세스 키",
- "yourApiKey": "Your API 키",
- "Perfecto Host": "Perfecto 호스트",
- "Perfecto Port": "Perfecto 포트",
- "Pcloudy User Name": "Pcloudy 사용자 이름",
- "Pcloudy Host": "Pcloudy 호스트",
- "Pcloudy API Key": "Pcloudy API 키",
- "Add your token": "토큰을 추가하세요",
- "Perfecto Token": "Perfecto 토큰",
- "Your Kobiton Username": "Kobiton 사용자 이름",
- "Kobiton Access Key": "Kobiton 엑세스 키",
- "serverTabHeasdpinWebDriverURL": "HeadSpin Web Driver URL",
- "sessionHeadspinWebDriverURLDescription": "자동화 구성 경로를 사용하여 HeadSpin UI 또는 HeadSpin API에서 URL 가져오기",
- "Remote Host": "원격 호스트",
- "Remote Port": "원격 포트",
- "Remote Path": "원격 경로",
- "BrowserStack Username": "BrowserStack 사용자 이름",
- "BrowserStack Access Key": "BrowserStack 엑세스 키",
- "LambdaTest Username": "LambdaTest Username",
- "LambdaTest Access Key": "LambdaTest Access Key",
- "Bitbar API Key": "Bitbar API 키",
- "RemoteTestKit AccessToken": "RemoteTestKit AccessToken",
- "RobotQA Token": "RobotQA Token",
- "Name": "이름",
- "Description": "Description",
- "Created": "Created",
- "Actions": "Actions",
- "enterYourSessionId": "세션 ID를 입력하세요",
- "Proxy URL": "프록시 URL",
- "Source": "소스",
- "Commands": "Commands",
- "Execute Commands": "Execute Commands",
- "Gestures": "Gestures",
- "Gesture Builder": "Gesture Builder",
- "Saved Gestures": "Saved Gestures",
- "gesturesDescription": "Create, save, and execute custom gestures here. Gestures are identical to action chains in the W3C WebDriver Actions API.",
- "Session Information": "Session Information",
- "Execute Command": "Execute Command",
- "commandsDescription": "Run various commands using the current Appium driver. Note that not all drivers support all commands.",
- "Click to Set Coordinates": "Click to Set Coordinates",
- "Set Coordinates Via Field": "Set Coordinates Via Field",
- "Action Type": "Action Type",
- "Pointer Up": "Pointer Up",
- "Pointer Down": "Pointer Down",
- "Pause": "Pause",
- "Move": "Move",
- "Action Type Not Defined": "Action Type Not Defined",
- "Duration": "Duration",
- "Button": "Button",
- "Untitled Gesture": "Untitled Gesture",
- "Add Description": "Add Description",
- "Gesture saved": "Gesture saved",
- "Gesture saved as": "Gesture saved as '{{gestureName}}'",
- "Duplicate pointer names are not allowed": "Duplicate pointer names are not allowed",
- "Left": "Left",
- "Right": "Right",
- "Play": "Play",
- "Save Capability Set As": "Capability 셋 새로 저장하기",
- "Edit Raw JSON": "Raw JSON 변경",
- "Enter Parameters for:": "Enter Parameters for:",
- "invalidJson": "Invalid JSON",
- "Execute Script": "Execute Script",
- "App Management": "App Management",
- "Clipboard": "클립보드",
- "File Transfer": "File Transfer",
- "Device Interaction": "Device Interaction",
- "Keyboard": "Keyboard",
- "Connectivity": "Connectivity",
- "Performance Data": "Performance 데이터",
- "System": "시스템",
- "Session": "세션",
- "Web": "Web",
- "Context": "Context",
- "Window (W3C)": "Window (W3C)",
- "simulatorOnly": "Emulator/simulator only",
- "minAndroidSDK": "Minimum Android SDK level",
- "Error": "에러",
- "findingElementInSourceFailed": "Could not find the specified element. The current application source or element ID may have changed, or there may be too many elements with the same coordinates.",
- "callToMethodFailed": "'{{methodName}}' 호출에 실패했습니다",
- "methodCallResult": "'{{methodName}}' 결과",
- "TestingBot Key": "TestingBot 키",
- "TestingBot Secret": "TestingBot 시크릿",
- "Appium Server": "Appium Server",
- "Select Cloud Providers": "클라우스 서비스 선택",
- "Advanced Settings": "고급 설정",
- "Native App Mode": "Native App Mode",
- "Web/Hybrid App Mode": "Web/Hybrid App Mode",
- "autoAddPrefixes": "Automatically add necessary Appium vendor prefixes on start",
- "attachSessionNotRunning": "Could not confirm that session {{attachSessId}} is running on the provided server. Please check details before trying to attach to the session again.",
- "Mobitru WebDriver URL": "Mobitru WebDriver URL",
- "Mobitru Billing Unit": "Mobitru Billing Unit",
- "Mobitru Access Key": "Mobitru Access Key",
- "mobitruCredentialsRequired": "Mobitru Access Key is required",
- "Session URL": "Session URL",
- "Server Details": "Server Details",
- "Session Length": "Session Length",
- "Session Details": "Session Details",
- "Currently Active App ID": "Currently Active App ID",
- "Session ID": "Session ID",
- "confirmDeletion": "Are you sure you want to delete this?",
- "Copied!": "Copied!",
- "Error Fetching Session URL": "Error Fetching Session URL",
- "noResultsFound": "No results found",
- "invalidCapType": "Invalid capability type: {{type}}",
- "whitespaceDetected": "Text Starts and/or Ends With Whitespace"
-}
diff --git a/assets/locales/no/translation.json b/assets/locales/no/translation.json
deleted file mode 100644
index a0dd36cde1..0000000000
--- a/assets/locales/no/translation.json
+++ /dev/null
@@ -1,285 +0,0 @@
-{
- "appiumInspector": "Appium Inspector",
- "Edit": "Edit",
- "Redo": "Redo",
- "Cut": "Cut",
- "Copy": "Copy",
- "Paste": "Paste",
- "Delete": "Delete",
- "Select All": "Select All",
- "Window": "Window",
- "Minimize": "Minimize",
- "Zoom": "Zoom",
- "Zoom In": "Zoom In",
- "Zoom Out": "Zoom Out",
- "Reset Zoom Level": "Reset Zoom Level",
- "Close Window": "Close Window",
- "Open Session File…": "Open Session File…",
- "Bring All to Front": "Bring All to Front",
- "Help": "Help",
- "Appium Documentation": "Appium Documentation",
- "Inspector Documentation": "Inspector Documentation",
- "Appium Discussion Forum": "Appium Discussion Forum",
- "Report Issues": "Report Issues",
- "About Appium Inspector": "About Appium Inspector",
- "showAppInfo": "App Version: {{appVersion}}\nElectron: {{electronVersion}}\nNode.js: {{nodejsVersion}}\n",
- "Improve Translations": "Improve Translations",
- "Check for Updates…": "Check for Updates…",
- "File": "File",
- "New Window": "New Window",
- "Hide Appium Inspector": "Hide Appium Inspector",
- "Hide Others": "Hide Others",
- "Show All": "Show All",
- "Quit Appium Inspector": "Quit Appium Inspector",
- "Toggle Full Screen": "Toggle Full Screen",
- "Languages": "Languages",
- "View": "View",
- "Reload": "Reload",
- "Toggle Developer Tools": "Toggle Developer Tools",
- "Undo": "Undo",
- "Restart Now": "Restart Now",
- "Save Server Arguments Preset": "Save Server Arguments Preset",
- "Save": "Save",
- "Cancel": "Cancel",
- "datetimeFormat": "MMM Do YYYY, h:mma",
- "updateDetails": "Release Date: {{pubDate}}\n\nRelease Notes: {{notes}}",
- "appiumIsAvailable": "Appium Inspector {{name}} is available",
- "updateIsBeingDownloaded": "Update is being downloaded now. You will be notified again when it is complete",
- "updateIsDownloaded": "Appium Inspector {{releaseName}} has been downloaded. Must restart to apply the updates (note: it may take several minutes for Appium Inspector to install and restart)",
- "updateDownloadFailed": "Failed to download update. Reason: {{message}}",
- "OK": "OK",
- "Install Now": "Install Now",
- "Install Later": "Install Later",
- "Update Download Started": "Update Download Started",
- "No update available": "No update available",
- "Appium Inspector is up-to-date": "Appium Inspector is up-to-date",
- "Later": "Later",
- "Update Downloaded": "Update Downloaded",
- "Could not download update": "Could not download update",
- "Unexpected Error:": "Unexpected Error:",
- "Please report this issue at:": "Please report this issue at:",
- "Full error trace:": "Full error trace:",
- "Copy Error Trace": "Copy Error Trace",
- "Inspect element": "Inspect element",
- "Session closed due to inactivity": "Session closed due to inactivity",
- "Session has been terminated": "Session has been terminated",
- "frameworkNotSupported": "Framework '{{framework}}' not supported",
- "findElementFailure": "Failed to find element for '{{methodName}}'. Please refresh page and try again.",
- "Could not start session": "Could not start session",
- "couldNotConnect": "Could not connect to Appium server URL '{{url}}'. Please check if the server is running and the URL is correct (valid URLs can be found at the start of the Appium server log). If you are using the Inspector's browser version, ensure the server has been started with '--allow-cors'.",
- "Invalid URL:": "Invalid URL:",
- "sauceCredentialsRequired": "Sauce username and access key are required!",
- "testingbotCredentialsRequired": "TestingBot key and secret are required!",
- "Perfecto SecurityToken is required": "Perfecto SecurityToken is required",
- "browserstackCredentialsRequired": "Browserstack username and access key are required!",
- "lambdatestCredentialsRequired": "Lambdatest username and access key are required!",
- "bitbarCredentialsRequired": "Bitbar API key required!",
- "kobitonCredentialsRequired": "KOBITON username and api key are required!",
- "experitestAccessKeyURLRequired": "Experitest AccessKey and URL are required",
- "experitestAccessKey": "Experitest AccessKey",
- "experitestUrl": "Experitest Url",
- "locatorStrategy": "Locator Strategy:",
- "selector": "Selector:",
- "couldNotObtainScreenshot": "Could not obtain screenshot: {{screenshotError}}",
- "selectElementInSource": "Select an element in the source to begin.",
- "Press Home Button": "Press Home Button",
- "Execute Siri Command": "Execute Siri Command",
- "Press Back Button": "Press Back Button",
- "Press App Switch Button": "Press App Switch Button",
- "Command": "Command",
- "Show Element Handles": "Show Element Handles",
- "Hide Element Handles": "Hide Element Handles",
- "Select Elements": "Select Elements",
- "Tap/Swipe By Coordinates": "Tap/Swipe By Coordinates",
- "Download Screenshot": "Download Screenshot",
- "Back": "Back",
- "Start Refreshing Source": "Start Refreshing Source",
- "Pause Refreshing Source": "Pause Refreshing Source",
- "refreshSource": "Refresh Source & Screenshot",
- "Start Recording": "Start Recording",
- "Pause Recording": "Pause Recording",
- "Search for element": "Search for element",
- "App Source": "App Source",
- "Toggle Attributes": "Toggle Attributes",
- "Copy XML Source to Clipboard": "Copy XML Source to Clipboard",
- "Download Source as .XML File": "Download Source as .XML File",
- "Copy Attributes to Clipboard": "Copy Attributes to Clipboard",
- "quitSessionAndClose": "Quit Session & Close Inspector",
- "Session Inactive": "Session Inactive",
- "Keep Session Running": "Keep Session Running",
- "Quit Session": "Quit Session",
- "Your session is about to expire": "Your session is about to expire",
- "Enter Keys to Send": "Enter Keys to Send",
- "Find and Select in Source": "Find and Select in Source",
- "Clear": "Clear",
- "Send Keys": "Send Keys",
- "Done": "Done",
- "Search": "Search",
- "Show/Hide Boilerplate Code": "Show/Hide Boilerplate Code",
- "Copy code to clipboard": "Copy code to clipboard",
- "Start this Kind of Session with Code": "Start this Kind of Session with Code",
- "Clear Actions": "Clear Actions",
- "Close Recorder": "Close Recorder",
- "enableRecordingAndPerformActions": "Enable recording in the application header, then perform some actions to see code show up here",
- "Recorder": "Recorder",
- "Attribute": "Attribute",
- "Value": "Value",
- "Find By": "Find By",
- "Selector": "Selector",
- "Time": "Time (ms)",
- "Get Timing": "Get Timing",
- "interactionsNotAvailable": "Interactions for this element may not be available",
- "usingXPathNotRecommended": "Using XPath locators is not recommended and can lead to fragile tests. Ask your development team to provide unique accessibility locators instead!",
- "noAdditionalContextsFound": "No additional contexts have been detected",
- "contextDropdownInfo": "Multiple contexts detected; certain elements might only be accessible after switching to a different context. Note that webview inspection in Appium Inspector is less accurate than the DevTools of Chrome or Safari. For more information, see:",
- "idAutocompletionCanBeDisabled": "The requested id selector does not have a package name prefix. This Appium session has package name autocompletion enabled, which may be the reason why no elements were found. To disable this behavior, relaunch this session with the capability 'appium:disableIdLocatorAutocompletion' set to 'true'.",
- "missingAutomationNameForStrategies": "Additional locator strategies may be available. To view them, add the capability 'appium:automationName' when launching the session. Note that this capability is mandatory in Appium 2.",
- "Tap": "Tap",
- "Gathering initial app source…": "Gathering initial app source…",
- "couldNotObtainSource": "Could not obtain source: {{errorMsg}}",
- "iOS": "iOS",
- "Android": "Android",
- "desiredCapabilitiesDocumentation": "Capabilities Documentation",
- "startSession": "Start Session",
- "saveAs": "Save As…",
- "attachToSession": "Attach to Session",
- "selectedElement": "Selected Element",
- "unnamed": "(Unnamed)",
- "No Description": "No Description",
- "couldNotFindEntryWithId": "Could not find an entry with ID {{id}}",
- "couldNotFindAnyElements": "Could not find any elements",
- "elementsCount": "Elements found:",
- "xCoordinate": "X: {{x}}",
- "yCoordinate": "Y: {{y}}",
- "SauceLabs Data Center": "SauceLabs Data Center",
- "US-West": "US West 1",
- "US-East": "US East 4",
- "EU-Central": "EU Central 1",
- "proxyThroughSC": "Proxy through Sauce Connect's Selenium Relay",
- "SSL": "SSL",
- "text": "text",
- "boolean": "boolean",
- "number": "number",
- "JSON object": "JSON object",
- "filepath": "filepath",
- "connectToExistingSessionInstructions": "If you have an already-running session of the above server type, you can attach an inspector to it directly.",
- "selectSessionIDInDropdown": "Select the Session ID in the dropdown below.",
- "allowUnauthorizedCerts": "Allow Unauthorized Certificates",
- "Use Proxy": "Use Proxy",
- "JSON Representation": "JSON Representation",
- "Capability Builder": "Capability Builder",
- "Saved Capability Sets": "Saved Capability Sets",
- "Attach to Session": "Attach to Session…",
- "localhost": "localhost",
- "Host": "Host",
- "Port": "Port",
- "usingDataFoundIn": "Using data found in {{environmentVariable}}",
- "yourUsername": "Your Username",
- "Sauce Username": "Sauce Username",
- "Sauce Access Key": "Sauce Access Key",
- "yourAccessKey": "Your Access Key",
- "yourApiKey": "Your API Key",
- "Perfecto Host": "Perfecto Host",
- "Perfecto Port": "Perfecto Port",
- "Pcloudy User Name": "Pcloudy User Name",
- "Pcloudy Host": "Pcloudy Host",
- "Pcloudy API Key": "Pcloudy API Key",
- "Add your token": "Add your token",
- "Perfecto Token": "Perfecto Token",
- "Your Kobiton Username": "Your Kobiton Username",
- "Kobiton Access Key": "Kobiton Access Key",
- "serverTabHeasdpinWebDriverURL": "HeadSpin Web Driver URL",
- "sessionHeadspinWebDriverURLDescription": "Get the URL from the HeadSpin UI or the HeadSpin API using the automation configuration route",
- "Remote Host": "Remote Host",
- "Remote Port": "Remote Port",
- "Remote Path": "Remote Path",
- "BrowserStack Username": "BrowserStack Username",
- "BrowserStack Access Key": "BrowserStack Access Key",
- "LambdaTest Username": "LambdaTest Username",
- "LambdaTest Access Key": "LambdaTest Access Key",
- "Bitbar API Key": "Bitbar API Key",
- "RemoteTestKit AccessToken": "RemoteTestKit AccessToken",
- "RobotQA Token": "RobotQA Token",
- "Name": "Name",
- "Description": "Description",
- "Created": "Created",
- "Actions": "Actions",
- "enterYourSessionId": "Enter your session ID here",
- "Proxy URL": "Proxy URL",
- "Source": "Source",
- "Commands": "Commands",
- "Execute Commands": "Execute Commands",
- "Gestures": "Gestures",
- "Gesture Builder": "Gesture Builder",
- "Saved Gestures": "Saved Gestures",
- "gesturesDescription": "Create, save, and execute custom gestures here. Gestures are identical to action chains in the W3C WebDriver Actions API.",
- "Session Information": "Session Information",
- "Execute Command": "Execute Command",
- "commandsDescription": "Run various commands using the current Appium driver. Note that not all drivers support all commands.",
- "Click to Set Coordinates": "Click to Set Coordinates",
- "Set Coordinates Via Field": "Set Coordinates Via Field",
- "Action Type": "Action Type",
- "Pointer Up": "Pointer Up",
- "Pointer Down": "Pointer Down",
- "Pause": "Pause",
- "Move": "Move",
- "Action Type Not Defined": "Action Type Not Defined",
- "Duration": "Duration",
- "Button": "Button",
- "Untitled Gesture": "Untitled Gesture",
- "Add Description": "Add Description",
- "Gesture saved": "Gesture saved",
- "Gesture saved as": "Gesture saved as '{{gestureName}}'",
- "Duplicate pointer names are not allowed": "Duplicate pointer names are not allowed",
- "Left": "Left",
- "Right": "Right",
- "Play": "Play",
- "Save Capability Set As": "Save Capability Set As…",
- "Edit Raw JSON": "Edit Raw JSON",
- "Enter Parameters for:": "Enter Parameters for:",
- "invalidJson": "Invalid JSON",
- "Execute Script": "Execute Script",
- "App Management": "App Management",
- "Clipboard": "Clipboard",
- "File Transfer": "File Transfer",
- "Device Interaction": "Device Interaction",
- "Keyboard": "Keyboard",
- "Connectivity": "Connectivity",
- "Performance Data": "Performance Data",
- "System": "System",
- "Session": "Session",
- "Web": "Web",
- "Context": "Context",
- "Window (W3C)": "Window (W3C)",
- "simulatorOnly": "Emulator/simulator only",
- "minAndroidSDK": "Minimum Android SDK level",
- "Error": "Error",
- "findingElementInSourceFailed": "Could not find the specified element. The current application source or element ID may have changed, or there may be too many elements with the same coordinates.",
- "callToMethodFailed": "Call to '{{methodName}}' failed",
- "methodCallResult": "'{{methodName}}' result",
- "TestingBot Key": "TestingBot Key",
- "TestingBot Secret": "TestingBot Secret",
- "Appium Server": "Appium Server",
- "Select Cloud Providers": "Select Cloud Providers",
- "Advanced Settings": "Advanced Settings",
- "Native App Mode": "Native App Mode",
- "Web/Hybrid App Mode": "Web/Hybrid App Mode",
- "autoAddPrefixes": "Automatically add necessary Appium vendor prefixes on start",
- "attachSessionNotRunning": "Could not confirm that session {{attachSessId}} is running on the provided server. Please check details before trying to attach to the session again.",
- "Mobitru WebDriver URL": "Mobitru WebDriver URL",
- "Mobitru Billing Unit": "Mobitru Billing Unit",
- "Mobitru Access Key": "Mobitru Access Key",
- "mobitruCredentialsRequired": "Mobitru Access Key is required",
- "Session URL": "Session URL",
- "Server Details": "Server Details",
- "Session Length": "Session Length",
- "Session Details": "Session Details",
- "Currently Active App ID": "Currently Active App ID",
- "Session ID": "Session ID",
- "confirmDeletion": "Are you sure you want to delete this?",
- "Copied!": "Copied!",
- "Error Fetching Session URL": "Error Fetching Session URL",
- "noResultsFound": "No results found",
- "invalidCapType": "Invalid capability type: {{type}}",
- "whitespaceDetected": "Text Starts and/or Ends With Whitespace"
-}
diff --git a/assets/locales/pa-IN/translation.json b/assets/locales/pa-IN/translation.json
deleted file mode 100644
index a0dd36cde1..0000000000
--- a/assets/locales/pa-IN/translation.json
+++ /dev/null
@@ -1,285 +0,0 @@
-{
- "appiumInspector": "Appium Inspector",
- "Edit": "Edit",
- "Redo": "Redo",
- "Cut": "Cut",
- "Copy": "Copy",
- "Paste": "Paste",
- "Delete": "Delete",
- "Select All": "Select All",
- "Window": "Window",
- "Minimize": "Minimize",
- "Zoom": "Zoom",
- "Zoom In": "Zoom In",
- "Zoom Out": "Zoom Out",
- "Reset Zoom Level": "Reset Zoom Level",
- "Close Window": "Close Window",
- "Open Session File…": "Open Session File…",
- "Bring All to Front": "Bring All to Front",
- "Help": "Help",
- "Appium Documentation": "Appium Documentation",
- "Inspector Documentation": "Inspector Documentation",
- "Appium Discussion Forum": "Appium Discussion Forum",
- "Report Issues": "Report Issues",
- "About Appium Inspector": "About Appium Inspector",
- "showAppInfo": "App Version: {{appVersion}}\nElectron: {{electronVersion}}\nNode.js: {{nodejsVersion}}\n",
- "Improve Translations": "Improve Translations",
- "Check for Updates…": "Check for Updates…",
- "File": "File",
- "New Window": "New Window",
- "Hide Appium Inspector": "Hide Appium Inspector",
- "Hide Others": "Hide Others",
- "Show All": "Show All",
- "Quit Appium Inspector": "Quit Appium Inspector",
- "Toggle Full Screen": "Toggle Full Screen",
- "Languages": "Languages",
- "View": "View",
- "Reload": "Reload",
- "Toggle Developer Tools": "Toggle Developer Tools",
- "Undo": "Undo",
- "Restart Now": "Restart Now",
- "Save Server Arguments Preset": "Save Server Arguments Preset",
- "Save": "Save",
- "Cancel": "Cancel",
- "datetimeFormat": "MMM Do YYYY, h:mma",
- "updateDetails": "Release Date: {{pubDate}}\n\nRelease Notes: {{notes}}",
- "appiumIsAvailable": "Appium Inspector {{name}} is available",
- "updateIsBeingDownloaded": "Update is being downloaded now. You will be notified again when it is complete",
- "updateIsDownloaded": "Appium Inspector {{releaseName}} has been downloaded. Must restart to apply the updates (note: it may take several minutes for Appium Inspector to install and restart)",
- "updateDownloadFailed": "Failed to download update. Reason: {{message}}",
- "OK": "OK",
- "Install Now": "Install Now",
- "Install Later": "Install Later",
- "Update Download Started": "Update Download Started",
- "No update available": "No update available",
- "Appium Inspector is up-to-date": "Appium Inspector is up-to-date",
- "Later": "Later",
- "Update Downloaded": "Update Downloaded",
- "Could not download update": "Could not download update",
- "Unexpected Error:": "Unexpected Error:",
- "Please report this issue at:": "Please report this issue at:",
- "Full error trace:": "Full error trace:",
- "Copy Error Trace": "Copy Error Trace",
- "Inspect element": "Inspect element",
- "Session closed due to inactivity": "Session closed due to inactivity",
- "Session has been terminated": "Session has been terminated",
- "frameworkNotSupported": "Framework '{{framework}}' not supported",
- "findElementFailure": "Failed to find element for '{{methodName}}'. Please refresh page and try again.",
- "Could not start session": "Could not start session",
- "couldNotConnect": "Could not connect to Appium server URL '{{url}}'. Please check if the server is running and the URL is correct (valid URLs can be found at the start of the Appium server log). If you are using the Inspector's browser version, ensure the server has been started with '--allow-cors'.",
- "Invalid URL:": "Invalid URL:",
- "sauceCredentialsRequired": "Sauce username and access key are required!",
- "testingbotCredentialsRequired": "TestingBot key and secret are required!",
- "Perfecto SecurityToken is required": "Perfecto SecurityToken is required",
- "browserstackCredentialsRequired": "Browserstack username and access key are required!",
- "lambdatestCredentialsRequired": "Lambdatest username and access key are required!",
- "bitbarCredentialsRequired": "Bitbar API key required!",
- "kobitonCredentialsRequired": "KOBITON username and api key are required!",
- "experitestAccessKeyURLRequired": "Experitest AccessKey and URL are required",
- "experitestAccessKey": "Experitest AccessKey",
- "experitestUrl": "Experitest Url",
- "locatorStrategy": "Locator Strategy:",
- "selector": "Selector:",
- "couldNotObtainScreenshot": "Could not obtain screenshot: {{screenshotError}}",
- "selectElementInSource": "Select an element in the source to begin.",
- "Press Home Button": "Press Home Button",
- "Execute Siri Command": "Execute Siri Command",
- "Press Back Button": "Press Back Button",
- "Press App Switch Button": "Press App Switch Button",
- "Command": "Command",
- "Show Element Handles": "Show Element Handles",
- "Hide Element Handles": "Hide Element Handles",
- "Select Elements": "Select Elements",
- "Tap/Swipe By Coordinates": "Tap/Swipe By Coordinates",
- "Download Screenshot": "Download Screenshot",
- "Back": "Back",
- "Start Refreshing Source": "Start Refreshing Source",
- "Pause Refreshing Source": "Pause Refreshing Source",
- "refreshSource": "Refresh Source & Screenshot",
- "Start Recording": "Start Recording",
- "Pause Recording": "Pause Recording",
- "Search for element": "Search for element",
- "App Source": "App Source",
- "Toggle Attributes": "Toggle Attributes",
- "Copy XML Source to Clipboard": "Copy XML Source to Clipboard",
- "Download Source as .XML File": "Download Source as .XML File",
- "Copy Attributes to Clipboard": "Copy Attributes to Clipboard",
- "quitSessionAndClose": "Quit Session & Close Inspector",
- "Session Inactive": "Session Inactive",
- "Keep Session Running": "Keep Session Running",
- "Quit Session": "Quit Session",
- "Your session is about to expire": "Your session is about to expire",
- "Enter Keys to Send": "Enter Keys to Send",
- "Find and Select in Source": "Find and Select in Source",
- "Clear": "Clear",
- "Send Keys": "Send Keys",
- "Done": "Done",
- "Search": "Search",
- "Show/Hide Boilerplate Code": "Show/Hide Boilerplate Code",
- "Copy code to clipboard": "Copy code to clipboard",
- "Start this Kind of Session with Code": "Start this Kind of Session with Code",
- "Clear Actions": "Clear Actions",
- "Close Recorder": "Close Recorder",
- "enableRecordingAndPerformActions": "Enable recording in the application header, then perform some actions to see code show up here",
- "Recorder": "Recorder",
- "Attribute": "Attribute",
- "Value": "Value",
- "Find By": "Find By",
- "Selector": "Selector",
- "Time": "Time (ms)",
- "Get Timing": "Get Timing",
- "interactionsNotAvailable": "Interactions for this element may not be available",
- "usingXPathNotRecommended": "Using XPath locators is not recommended and can lead to fragile tests. Ask your development team to provide unique accessibility locators instead!",
- "noAdditionalContextsFound": "No additional contexts have been detected",
- "contextDropdownInfo": "Multiple contexts detected; certain elements might only be accessible after switching to a different context. Note that webview inspection in Appium Inspector is less accurate than the DevTools of Chrome or Safari. For more information, see:",
- "idAutocompletionCanBeDisabled": "The requested id selector does not have a package name prefix. This Appium session has package name autocompletion enabled, which may be the reason why no elements were found. To disable this behavior, relaunch this session with the capability 'appium:disableIdLocatorAutocompletion' set to 'true'.",
- "missingAutomationNameForStrategies": "Additional locator strategies may be available. To view them, add the capability 'appium:automationName' when launching the session. Note that this capability is mandatory in Appium 2.",
- "Tap": "Tap",
- "Gathering initial app source…": "Gathering initial app source…",
- "couldNotObtainSource": "Could not obtain source: {{errorMsg}}",
- "iOS": "iOS",
- "Android": "Android",
- "desiredCapabilitiesDocumentation": "Capabilities Documentation",
- "startSession": "Start Session",
- "saveAs": "Save As…",
- "attachToSession": "Attach to Session",
- "selectedElement": "Selected Element",
- "unnamed": "(Unnamed)",
- "No Description": "No Description",
- "couldNotFindEntryWithId": "Could not find an entry with ID {{id}}",
- "couldNotFindAnyElements": "Could not find any elements",
- "elementsCount": "Elements found:",
- "xCoordinate": "X: {{x}}",
- "yCoordinate": "Y: {{y}}",
- "SauceLabs Data Center": "SauceLabs Data Center",
- "US-West": "US West 1",
- "US-East": "US East 4",
- "EU-Central": "EU Central 1",
- "proxyThroughSC": "Proxy through Sauce Connect's Selenium Relay",
- "SSL": "SSL",
- "text": "text",
- "boolean": "boolean",
- "number": "number",
- "JSON object": "JSON object",
- "filepath": "filepath",
- "connectToExistingSessionInstructions": "If you have an already-running session of the above server type, you can attach an inspector to it directly.",
- "selectSessionIDInDropdown": "Select the Session ID in the dropdown below.",
- "allowUnauthorizedCerts": "Allow Unauthorized Certificates",
- "Use Proxy": "Use Proxy",
- "JSON Representation": "JSON Representation",
- "Capability Builder": "Capability Builder",
- "Saved Capability Sets": "Saved Capability Sets",
- "Attach to Session": "Attach to Session…",
- "localhost": "localhost",
- "Host": "Host",
- "Port": "Port",
- "usingDataFoundIn": "Using data found in {{environmentVariable}}",
- "yourUsername": "Your Username",
- "Sauce Username": "Sauce Username",
- "Sauce Access Key": "Sauce Access Key",
- "yourAccessKey": "Your Access Key",
- "yourApiKey": "Your API Key",
- "Perfecto Host": "Perfecto Host",
- "Perfecto Port": "Perfecto Port",
- "Pcloudy User Name": "Pcloudy User Name",
- "Pcloudy Host": "Pcloudy Host",
- "Pcloudy API Key": "Pcloudy API Key",
- "Add your token": "Add your token",
- "Perfecto Token": "Perfecto Token",
- "Your Kobiton Username": "Your Kobiton Username",
- "Kobiton Access Key": "Kobiton Access Key",
- "serverTabHeasdpinWebDriverURL": "HeadSpin Web Driver URL",
- "sessionHeadspinWebDriverURLDescription": "Get the URL from the HeadSpin UI or the HeadSpin API using the automation configuration route",
- "Remote Host": "Remote Host",
- "Remote Port": "Remote Port",
- "Remote Path": "Remote Path",
- "BrowserStack Username": "BrowserStack Username",
- "BrowserStack Access Key": "BrowserStack Access Key",
- "LambdaTest Username": "LambdaTest Username",
- "LambdaTest Access Key": "LambdaTest Access Key",
- "Bitbar API Key": "Bitbar API Key",
- "RemoteTestKit AccessToken": "RemoteTestKit AccessToken",
- "RobotQA Token": "RobotQA Token",
- "Name": "Name",
- "Description": "Description",
- "Created": "Created",
- "Actions": "Actions",
- "enterYourSessionId": "Enter your session ID here",
- "Proxy URL": "Proxy URL",
- "Source": "Source",
- "Commands": "Commands",
- "Execute Commands": "Execute Commands",
- "Gestures": "Gestures",
- "Gesture Builder": "Gesture Builder",
- "Saved Gestures": "Saved Gestures",
- "gesturesDescription": "Create, save, and execute custom gestures here. Gestures are identical to action chains in the W3C WebDriver Actions API.",
- "Session Information": "Session Information",
- "Execute Command": "Execute Command",
- "commandsDescription": "Run various commands using the current Appium driver. Note that not all drivers support all commands.",
- "Click to Set Coordinates": "Click to Set Coordinates",
- "Set Coordinates Via Field": "Set Coordinates Via Field",
- "Action Type": "Action Type",
- "Pointer Up": "Pointer Up",
- "Pointer Down": "Pointer Down",
- "Pause": "Pause",
- "Move": "Move",
- "Action Type Not Defined": "Action Type Not Defined",
- "Duration": "Duration",
- "Button": "Button",
- "Untitled Gesture": "Untitled Gesture",
- "Add Description": "Add Description",
- "Gesture saved": "Gesture saved",
- "Gesture saved as": "Gesture saved as '{{gestureName}}'",
- "Duplicate pointer names are not allowed": "Duplicate pointer names are not allowed",
- "Left": "Left",
- "Right": "Right",
- "Play": "Play",
- "Save Capability Set As": "Save Capability Set As…",
- "Edit Raw JSON": "Edit Raw JSON",
- "Enter Parameters for:": "Enter Parameters for:",
- "invalidJson": "Invalid JSON",
- "Execute Script": "Execute Script",
- "App Management": "App Management",
- "Clipboard": "Clipboard",
- "File Transfer": "File Transfer",
- "Device Interaction": "Device Interaction",
- "Keyboard": "Keyboard",
- "Connectivity": "Connectivity",
- "Performance Data": "Performance Data",
- "System": "System",
- "Session": "Session",
- "Web": "Web",
- "Context": "Context",
- "Window (W3C)": "Window (W3C)",
- "simulatorOnly": "Emulator/simulator only",
- "minAndroidSDK": "Minimum Android SDK level",
- "Error": "Error",
- "findingElementInSourceFailed": "Could not find the specified element. The current application source or element ID may have changed, or there may be too many elements with the same coordinates.",
- "callToMethodFailed": "Call to '{{methodName}}' failed",
- "methodCallResult": "'{{methodName}}' result",
- "TestingBot Key": "TestingBot Key",
- "TestingBot Secret": "TestingBot Secret",
- "Appium Server": "Appium Server",
- "Select Cloud Providers": "Select Cloud Providers",
- "Advanced Settings": "Advanced Settings",
- "Native App Mode": "Native App Mode",
- "Web/Hybrid App Mode": "Web/Hybrid App Mode",
- "autoAddPrefixes": "Automatically add necessary Appium vendor prefixes on start",
- "attachSessionNotRunning": "Could not confirm that session {{attachSessId}} is running on the provided server. Please check details before trying to attach to the session again.",
- "Mobitru WebDriver URL": "Mobitru WebDriver URL",
- "Mobitru Billing Unit": "Mobitru Billing Unit",
- "Mobitru Access Key": "Mobitru Access Key",
- "mobitruCredentialsRequired": "Mobitru Access Key is required",
- "Session URL": "Session URL",
- "Server Details": "Server Details",
- "Session Length": "Session Length",
- "Session Details": "Session Details",
- "Currently Active App ID": "Currently Active App ID",
- "Session ID": "Session ID",
- "confirmDeletion": "Are you sure you want to delete this?",
- "Copied!": "Copied!",
- "Error Fetching Session URL": "Error Fetching Session URL",
- "noResultsFound": "No results found",
- "invalidCapType": "Invalid capability type: {{type}}",
- "whitespaceDetected": "Text Starts and/or Ends With Whitespace"
-}
diff --git a/assets/locales/sv-SE/translation.json b/assets/locales/sv-SE/translation.json
deleted file mode 100644
index a0dd36cde1..0000000000
--- a/assets/locales/sv-SE/translation.json
+++ /dev/null
@@ -1,285 +0,0 @@
-{
- "appiumInspector": "Appium Inspector",
- "Edit": "Edit",
- "Redo": "Redo",
- "Cut": "Cut",
- "Copy": "Copy",
- "Paste": "Paste",
- "Delete": "Delete",
- "Select All": "Select All",
- "Window": "Window",
- "Minimize": "Minimize",
- "Zoom": "Zoom",
- "Zoom In": "Zoom In",
- "Zoom Out": "Zoom Out",
- "Reset Zoom Level": "Reset Zoom Level",
- "Close Window": "Close Window",
- "Open Session File…": "Open Session File…",
- "Bring All to Front": "Bring All to Front",
- "Help": "Help",
- "Appium Documentation": "Appium Documentation",
- "Inspector Documentation": "Inspector Documentation",
- "Appium Discussion Forum": "Appium Discussion Forum",
- "Report Issues": "Report Issues",
- "About Appium Inspector": "About Appium Inspector",
- "showAppInfo": "App Version: {{appVersion}}\nElectron: {{electronVersion}}\nNode.js: {{nodejsVersion}}\n",
- "Improve Translations": "Improve Translations",
- "Check for Updates…": "Check for Updates…",
- "File": "File",
- "New Window": "New Window",
- "Hide Appium Inspector": "Hide Appium Inspector",
- "Hide Others": "Hide Others",
- "Show All": "Show All",
- "Quit Appium Inspector": "Quit Appium Inspector",
- "Toggle Full Screen": "Toggle Full Screen",
- "Languages": "Languages",
- "View": "View",
- "Reload": "Reload",
- "Toggle Developer Tools": "Toggle Developer Tools",
- "Undo": "Undo",
- "Restart Now": "Restart Now",
- "Save Server Arguments Preset": "Save Server Arguments Preset",
- "Save": "Save",
- "Cancel": "Cancel",
- "datetimeFormat": "MMM Do YYYY, h:mma",
- "updateDetails": "Release Date: {{pubDate}}\n\nRelease Notes: {{notes}}",
- "appiumIsAvailable": "Appium Inspector {{name}} is available",
- "updateIsBeingDownloaded": "Update is being downloaded now. You will be notified again when it is complete",
- "updateIsDownloaded": "Appium Inspector {{releaseName}} has been downloaded. Must restart to apply the updates (note: it may take several minutes for Appium Inspector to install and restart)",
- "updateDownloadFailed": "Failed to download update. Reason: {{message}}",
- "OK": "OK",
- "Install Now": "Install Now",
- "Install Later": "Install Later",
- "Update Download Started": "Update Download Started",
- "No update available": "No update available",
- "Appium Inspector is up-to-date": "Appium Inspector is up-to-date",
- "Later": "Later",
- "Update Downloaded": "Update Downloaded",
- "Could not download update": "Could not download update",
- "Unexpected Error:": "Unexpected Error:",
- "Please report this issue at:": "Please report this issue at:",
- "Full error trace:": "Full error trace:",
- "Copy Error Trace": "Copy Error Trace",
- "Inspect element": "Inspect element",
- "Session closed due to inactivity": "Session closed due to inactivity",
- "Session has been terminated": "Session has been terminated",
- "frameworkNotSupported": "Framework '{{framework}}' not supported",
- "findElementFailure": "Failed to find element for '{{methodName}}'. Please refresh page and try again.",
- "Could not start session": "Could not start session",
- "couldNotConnect": "Could not connect to Appium server URL '{{url}}'. Please check if the server is running and the URL is correct (valid URLs can be found at the start of the Appium server log). If you are using the Inspector's browser version, ensure the server has been started with '--allow-cors'.",
- "Invalid URL:": "Invalid URL:",
- "sauceCredentialsRequired": "Sauce username and access key are required!",
- "testingbotCredentialsRequired": "TestingBot key and secret are required!",
- "Perfecto SecurityToken is required": "Perfecto SecurityToken is required",
- "browserstackCredentialsRequired": "Browserstack username and access key are required!",
- "lambdatestCredentialsRequired": "Lambdatest username and access key are required!",
- "bitbarCredentialsRequired": "Bitbar API key required!",
- "kobitonCredentialsRequired": "KOBITON username and api key are required!",
- "experitestAccessKeyURLRequired": "Experitest AccessKey and URL are required",
- "experitestAccessKey": "Experitest AccessKey",
- "experitestUrl": "Experitest Url",
- "locatorStrategy": "Locator Strategy:",
- "selector": "Selector:",
- "couldNotObtainScreenshot": "Could not obtain screenshot: {{screenshotError}}",
- "selectElementInSource": "Select an element in the source to begin.",
- "Press Home Button": "Press Home Button",
- "Execute Siri Command": "Execute Siri Command",
- "Press Back Button": "Press Back Button",
- "Press App Switch Button": "Press App Switch Button",
- "Command": "Command",
- "Show Element Handles": "Show Element Handles",
- "Hide Element Handles": "Hide Element Handles",
- "Select Elements": "Select Elements",
- "Tap/Swipe By Coordinates": "Tap/Swipe By Coordinates",
- "Download Screenshot": "Download Screenshot",
- "Back": "Back",
- "Start Refreshing Source": "Start Refreshing Source",
- "Pause Refreshing Source": "Pause Refreshing Source",
- "refreshSource": "Refresh Source & Screenshot",
- "Start Recording": "Start Recording",
- "Pause Recording": "Pause Recording",
- "Search for element": "Search for element",
- "App Source": "App Source",
- "Toggle Attributes": "Toggle Attributes",
- "Copy XML Source to Clipboard": "Copy XML Source to Clipboard",
- "Download Source as .XML File": "Download Source as .XML File",
- "Copy Attributes to Clipboard": "Copy Attributes to Clipboard",
- "quitSessionAndClose": "Quit Session & Close Inspector",
- "Session Inactive": "Session Inactive",
- "Keep Session Running": "Keep Session Running",
- "Quit Session": "Quit Session",
- "Your session is about to expire": "Your session is about to expire",
- "Enter Keys to Send": "Enter Keys to Send",
- "Find and Select in Source": "Find and Select in Source",
- "Clear": "Clear",
- "Send Keys": "Send Keys",
- "Done": "Done",
- "Search": "Search",
- "Show/Hide Boilerplate Code": "Show/Hide Boilerplate Code",
- "Copy code to clipboard": "Copy code to clipboard",
- "Start this Kind of Session with Code": "Start this Kind of Session with Code",
- "Clear Actions": "Clear Actions",
- "Close Recorder": "Close Recorder",
- "enableRecordingAndPerformActions": "Enable recording in the application header, then perform some actions to see code show up here",
- "Recorder": "Recorder",
- "Attribute": "Attribute",
- "Value": "Value",
- "Find By": "Find By",
- "Selector": "Selector",
- "Time": "Time (ms)",
- "Get Timing": "Get Timing",
- "interactionsNotAvailable": "Interactions for this element may not be available",
- "usingXPathNotRecommended": "Using XPath locators is not recommended and can lead to fragile tests. Ask your development team to provide unique accessibility locators instead!",
- "noAdditionalContextsFound": "No additional contexts have been detected",
- "contextDropdownInfo": "Multiple contexts detected; certain elements might only be accessible after switching to a different context. Note that webview inspection in Appium Inspector is less accurate than the DevTools of Chrome or Safari. For more information, see:",
- "idAutocompletionCanBeDisabled": "The requested id selector does not have a package name prefix. This Appium session has package name autocompletion enabled, which may be the reason why no elements were found. To disable this behavior, relaunch this session with the capability 'appium:disableIdLocatorAutocompletion' set to 'true'.",
- "missingAutomationNameForStrategies": "Additional locator strategies may be available. To view them, add the capability 'appium:automationName' when launching the session. Note that this capability is mandatory in Appium 2.",
- "Tap": "Tap",
- "Gathering initial app source…": "Gathering initial app source…",
- "couldNotObtainSource": "Could not obtain source: {{errorMsg}}",
- "iOS": "iOS",
- "Android": "Android",
- "desiredCapabilitiesDocumentation": "Capabilities Documentation",
- "startSession": "Start Session",
- "saveAs": "Save As…",
- "attachToSession": "Attach to Session",
- "selectedElement": "Selected Element",
- "unnamed": "(Unnamed)",
- "No Description": "No Description",
- "couldNotFindEntryWithId": "Could not find an entry with ID {{id}}",
- "couldNotFindAnyElements": "Could not find any elements",
- "elementsCount": "Elements found:",
- "xCoordinate": "X: {{x}}",
- "yCoordinate": "Y: {{y}}",
- "SauceLabs Data Center": "SauceLabs Data Center",
- "US-West": "US West 1",
- "US-East": "US East 4",
- "EU-Central": "EU Central 1",
- "proxyThroughSC": "Proxy through Sauce Connect's Selenium Relay",
- "SSL": "SSL",
- "text": "text",
- "boolean": "boolean",
- "number": "number",
- "JSON object": "JSON object",
- "filepath": "filepath",
- "connectToExistingSessionInstructions": "If you have an already-running session of the above server type, you can attach an inspector to it directly.",
- "selectSessionIDInDropdown": "Select the Session ID in the dropdown below.",
- "allowUnauthorizedCerts": "Allow Unauthorized Certificates",
- "Use Proxy": "Use Proxy",
- "JSON Representation": "JSON Representation",
- "Capability Builder": "Capability Builder",
- "Saved Capability Sets": "Saved Capability Sets",
- "Attach to Session": "Attach to Session…",
- "localhost": "localhost",
- "Host": "Host",
- "Port": "Port",
- "usingDataFoundIn": "Using data found in {{environmentVariable}}",
- "yourUsername": "Your Username",
- "Sauce Username": "Sauce Username",
- "Sauce Access Key": "Sauce Access Key",
- "yourAccessKey": "Your Access Key",
- "yourApiKey": "Your API Key",
- "Perfecto Host": "Perfecto Host",
- "Perfecto Port": "Perfecto Port",
- "Pcloudy User Name": "Pcloudy User Name",
- "Pcloudy Host": "Pcloudy Host",
- "Pcloudy API Key": "Pcloudy API Key",
- "Add your token": "Add your token",
- "Perfecto Token": "Perfecto Token",
- "Your Kobiton Username": "Your Kobiton Username",
- "Kobiton Access Key": "Kobiton Access Key",
- "serverTabHeasdpinWebDriverURL": "HeadSpin Web Driver URL",
- "sessionHeadspinWebDriverURLDescription": "Get the URL from the HeadSpin UI or the HeadSpin API using the automation configuration route",
- "Remote Host": "Remote Host",
- "Remote Port": "Remote Port",
- "Remote Path": "Remote Path",
- "BrowserStack Username": "BrowserStack Username",
- "BrowserStack Access Key": "BrowserStack Access Key",
- "LambdaTest Username": "LambdaTest Username",
- "LambdaTest Access Key": "LambdaTest Access Key",
- "Bitbar API Key": "Bitbar API Key",
- "RemoteTestKit AccessToken": "RemoteTestKit AccessToken",
- "RobotQA Token": "RobotQA Token",
- "Name": "Name",
- "Description": "Description",
- "Created": "Created",
- "Actions": "Actions",
- "enterYourSessionId": "Enter your session ID here",
- "Proxy URL": "Proxy URL",
- "Source": "Source",
- "Commands": "Commands",
- "Execute Commands": "Execute Commands",
- "Gestures": "Gestures",
- "Gesture Builder": "Gesture Builder",
- "Saved Gestures": "Saved Gestures",
- "gesturesDescription": "Create, save, and execute custom gestures here. Gestures are identical to action chains in the W3C WebDriver Actions API.",
- "Session Information": "Session Information",
- "Execute Command": "Execute Command",
- "commandsDescription": "Run various commands using the current Appium driver. Note that not all drivers support all commands.",
- "Click to Set Coordinates": "Click to Set Coordinates",
- "Set Coordinates Via Field": "Set Coordinates Via Field",
- "Action Type": "Action Type",
- "Pointer Up": "Pointer Up",
- "Pointer Down": "Pointer Down",
- "Pause": "Pause",
- "Move": "Move",
- "Action Type Not Defined": "Action Type Not Defined",
- "Duration": "Duration",
- "Button": "Button",
- "Untitled Gesture": "Untitled Gesture",
- "Add Description": "Add Description",
- "Gesture saved": "Gesture saved",
- "Gesture saved as": "Gesture saved as '{{gestureName}}'",
- "Duplicate pointer names are not allowed": "Duplicate pointer names are not allowed",
- "Left": "Left",
- "Right": "Right",
- "Play": "Play",
- "Save Capability Set As": "Save Capability Set As…",
- "Edit Raw JSON": "Edit Raw JSON",
- "Enter Parameters for:": "Enter Parameters for:",
- "invalidJson": "Invalid JSON",
- "Execute Script": "Execute Script",
- "App Management": "App Management",
- "Clipboard": "Clipboard",
- "File Transfer": "File Transfer",
- "Device Interaction": "Device Interaction",
- "Keyboard": "Keyboard",
- "Connectivity": "Connectivity",
- "Performance Data": "Performance Data",
- "System": "System",
- "Session": "Session",
- "Web": "Web",
- "Context": "Context",
- "Window (W3C)": "Window (W3C)",
- "simulatorOnly": "Emulator/simulator only",
- "minAndroidSDK": "Minimum Android SDK level",
- "Error": "Error",
- "findingElementInSourceFailed": "Could not find the specified element. The current application source or element ID may have changed, or there may be too many elements with the same coordinates.",
- "callToMethodFailed": "Call to '{{methodName}}' failed",
- "methodCallResult": "'{{methodName}}' result",
- "TestingBot Key": "TestingBot Key",
- "TestingBot Secret": "TestingBot Secret",
- "Appium Server": "Appium Server",
- "Select Cloud Providers": "Select Cloud Providers",
- "Advanced Settings": "Advanced Settings",
- "Native App Mode": "Native App Mode",
- "Web/Hybrid App Mode": "Web/Hybrid App Mode",
- "autoAddPrefixes": "Automatically add necessary Appium vendor prefixes on start",
- "attachSessionNotRunning": "Could not confirm that session {{attachSessId}} is running on the provided server. Please check details before trying to attach to the session again.",
- "Mobitru WebDriver URL": "Mobitru WebDriver URL",
- "Mobitru Billing Unit": "Mobitru Billing Unit",
- "Mobitru Access Key": "Mobitru Access Key",
- "mobitruCredentialsRequired": "Mobitru Access Key is required",
- "Session URL": "Session URL",
- "Server Details": "Server Details",
- "Session Length": "Session Length",
- "Session Details": "Session Details",
- "Currently Active App ID": "Currently Active App ID",
- "Session ID": "Session ID",
- "confirmDeletion": "Are you sure you want to delete this?",
- "Copied!": "Copied!",
- "Error Fetching Session URL": "Error Fetching Session URL",
- "noResultsFound": "No results found",
- "invalidCapType": "Invalid capability type: {{type}}",
- "whitespaceDetected": "Text Starts and/or Ends With Whitespace"
-}
diff --git a/assets/locales/zh-CN/translation.json b/assets/locales/zh-CN/translation.json
deleted file mode 100644
index e16160f592..0000000000
--- a/assets/locales/zh-CN/translation.json
+++ /dev/null
@@ -1,285 +0,0 @@
-{
- "appiumInspector": "应用检查器",
- "Edit": "编辑",
- "Redo": "恢复",
- "Cut": "剪切",
- "Copy": "复制",
- "Paste": "粘贴",
- "Delete": "Delete",
- "Select All": "全部选择",
- "Window": "窗口",
- "Minimize": "最小化",
- "Zoom": "Zoom",
- "Zoom In": "Zoom In",
- "Zoom Out": "Zoom Out",
- "Reset Zoom Level": "Reset Zoom Level",
- "Close Window": "Close Window",
- "Open Session File…": "Open Session File…",
- "Bring All to Front": "前置全部窗口",
- "Help": "帮助",
- "Appium Documentation": "Appium 文档",
- "Inspector Documentation": "Inspector Documentation",
- "Appium Discussion Forum": "Appium Discussion Forum",
- "Report Issues": "Report Issues",
- "About Appium Inspector": "About Appium Inspector",
- "showAppInfo": "App Version: {{appVersion}}\nElectron: {{electronVersion}}\nNode.js: {{nodejsVersion}}\n",
- "Improve Translations": "Improve Translations",
- "Check for Updates…": "Check for Updates…",
- "File": "文件",
- "New Window": "New Window",
- "Hide Appium Inspector": "Hide Appium Inspector",
- "Hide Others": "隐藏其他窗口",
- "Show All": "显示全部窗口",
- "Quit Appium Inspector": "Quit Appium Inspector",
- "Toggle Full Screen": "切换至全屏",
- "Languages": "切换语言",
- "View": "视图",
- "Reload": "重新加载",
- "Toggle Developer Tools": "切换开发者工具",
- "Undo": "撤销",
- "Restart Now": "立即重启",
- "Save Server Arguments Preset": "保存服务器预设参数",
- "Save": "保存",
- "Cancel": "取消",
- "datetimeFormat": "YYYY-MM-DD HH:mm",
- "updateDetails": "发布日期: {{pubDate}}\n\n版本注释: {{notes}}",
- "appiumIsAvailable": "Appium Inspector {{name}} 可用",
- "updateIsBeingDownloaded": "更新正在下载。完成后将再次通知您",
- "updateIsDownloaded": "Appium Inspector {{releaseName}} 已经下载。必须重新启动以应用更新(注意:它可能需要几分钟时间,以便安装并重启)",
- "updateDownloadFailed": "下载更新失败。原因: {{message}}",
- "OK": "OK",
- "Install Now": "立即安装",
- "Install Later": "稍后安装",
- "Update Download Started": "更新下载开始",
- "No update available": "没有可用的更新",
- "Appium Inspector is up-to-date": "Appium Inspector 是最新的",
- "Later": "稍后",
- "Update Downloaded": "已经成功下载更新",
- "Could not download update": "无法下载更新",
- "Unexpected Error:": "意外错误:",
- "Please report this issue at:": "请在以下地方报告这个问题:",
- "Full error trace:": "完整错误跟踪:",
- "Copy Error Trace": "Copy Error Trace",
- "Inspect element": "检查元素",
- "Session closed due to inactivity": "会话因无活动而关闭",
- "Session has been terminated": "会话已终止",
- "frameworkNotSupported": "框架 \"{{framework}}\" 不受支持",
- "findElementFailure": "找不到 '{{methodName}}' 的元素。请刷新页面并重试。",
- "Could not start session": "无法启动会话",
- "couldNotConnect": "Could not connect to Appium server URL '{{url}}'. Please check if the server is running and the URL is correct (valid URLs can be found at the start of the Appium server log). If you are using the Inspector's browser version, ensure the server has been started with '--allow-cors'.",
- "Invalid URL:": "Invalid URL:",
- "sauceCredentialsRequired": "需要 Sauce 用户名和访问密钥!",
- "testingbotCredentialsRequired": "TestingBot key 与 secret是必需的!",
- "Perfecto SecurityToken is required": "需要填写 Security Token",
- "browserstackCredentialsRequired": "需要浏览用户名和访问密钥!",
- "lambdatestCredentialsRequired": "需要 Sauce 用户名和访问密钥!",
- "bitbarCredentialsRequired": "需要 Bitbar API 密钥!",
- "kobitonCredentialsRequired": "KOBITON用户名和apiKey 是必需的!",
- "experitestAccessKeyURLRequired": "AccessKey 和 URL 是必需的",
- "experitestAccessKey": "AccessKey",
- "experitestUrl": "Url",
- "locatorStrategy": "定位策略:",
- "selector": "选择器:",
- "couldNotObtainScreenshot": "无法获取屏幕截图: {{screenshotError}}",
- "selectElementInSource": "选择一个要开始的源元素。",
- "Press Home Button": "按主页按钮",
- "Execute Siri Command": "执行 Siri 命令",
- "Press Back Button": "按返回按钮",
- "Press App Switch Button": "按下应用切换按钮",
- "Command": "Command 键",
- "Show Element Handles": "显示元素处理器",
- "Hide Element Handles": "隐藏元素处理器",
- "Select Elements": "选择元素",
- "Tap/Swipe By Coordinates": "Tap/Swipe By Coordinates",
- "Download Screenshot": "Download Screenshot",
- "Back": "返回",
- "Start Refreshing Source": "开始刷新源",
- "Pause Refreshing Source": "暂停刷新源",
- "refreshSource": "刷新源和屏幕截图",
- "Start Recording": "开始录制",
- "Pause Recording": "暂停录制",
- "Search for element": "搜索元素",
- "App Source": "应用源",
- "Toggle Attributes": "切换属性",
- "Copy XML Source to Clipboard": "将 XML 源复制到剪贴板",
- "Download Source as .XML File": "下载源文件为 .XML 文件",
- "Copy Attributes to Clipboard": "复制属性到剪贴板",
- "quitSessionAndClose": "退出会话和关闭检查器",
- "Session Inactive": "会话不活动",
- "Keep Session Running": "保持会话运行",
- "Quit Session": "退出会话",
- "Your session is about to expire": "您的会话即将过期",
- "Enter Keys to Send": "Enter Keys to Send",
- "Find and Select in Source": "Find and Select in Source",
- "Clear": "清空",
- "Send Keys": "发送密钥",
- "Done": "完成",
- "Search": "查找",
- "Show/Hide Boilerplate Code": "显示/隐藏样板代码",
- "Copy code to clipboard": "将代码复制到剪贴板",
- "Start this Kind of Session with Code": "用代码开始这个类别的会话",
- "Clear Actions": "清除操作",
- "Close Recorder": "关闭录制",
- "enableRecordingAndPerformActions": "Enable recording in the application header, then perform some actions to see code show up here",
- "Recorder": "录制",
- "Attribute": "属性",
- "Value": "值",
- "Find By": "查找",
- "Selector": "选择器",
- "Time": "时间 (ms)",
- "Get Timing": "获取计时",
- "interactionsNotAvailable": "Interactions for this element may not be available",
- "usingXPathNotRecommended": "不建议使用 XPath 定位器,这可能会导致脆弱的测试。请您的开发团队提供独特的辅助定位器!",
- "noAdditionalContextsFound": "No additional contexts have been detected",
- "contextDropdownInfo": "Multiple contexts detected; certain elements might only be accessible after switching to a different context. Note that webview inspection in Appium Inspector is less accurate than the DevTools of Chrome or Safari. For more information, see:",
- "idAutocompletionCanBeDisabled": "The requested id selector does not have a package name prefix. This Appium session has package name autocompletion enabled, which may be the reason why no elements were found. To disable this behavior, relaunch this session with the capability 'appium:disableIdLocatorAutocompletion' set to 'true'.",
- "missingAutomationNameForStrategies": "Additional locator strategies may be available. To view them, add the capability 'appium:automationName' when launching the session. Note that this capability is mandatory in Appium 2.",
- "Tap": "点击",
- "Gathering initial app source…": "收集初始应用源…",
- "couldNotObtainSource": "无法获取源代码: {{errorMsg}}",
- "iOS": "iOS",
- "Android": "Android",
- "desiredCapabilitiesDocumentation": "Capabilities Documentation",
- "startSession": "启动会话",
- "saveAs": "另存为...",
- "attachToSession": "附加到会话",
- "selectedElement": "选定的元素",
- "unnamed": "(Unnamed)",
- "No Description": "No Description",
- "couldNotFindEntryWithId": "Could not find an entry with ID {{id}}",
- "couldNotFindAnyElements": "找不到任何元素",
- "elementsCount": "Elements found:",
- "xCoordinate": "X: {{x}}",
- "yCoordinate": "Y: {{y}}",
- "SauceLabs Data Center": "SauceLabs 数据中心",
- "US-West": "US West 1",
- "US-East": "US East 4",
- "EU-Central": "EU Central 1",
- "proxyThroughSC": "通过 Sauce Connect 的 Selenium Relay 代理",
- "SSL": "SSL",
- "text": "文本",
- "boolean": "布尔值",
- "number": "数字",
- "JSON object": "JSON 对象",
- "filepath": "文件路径",
- "connectToExistingSessionInstructions": "如果您有上述服务器类型的已运行会话, 则可以直接将检查器附加到该会话。",
- "selectSessionIDInDropdown": "从以下下拉列表中选择会话 ID。",
- "allowUnauthorizedCerts": "允许未经授权的证书",
- "Use Proxy": "使用代理",
- "JSON Representation": "JSON Representation",
- "Capability Builder": "Capability Builder",
- "Saved Capability Sets": "已保存的能力集",
- "Attach to Session": "附加到会话…",
- "localhost": "本地主机",
- "Host": "主机",
- "Port": "端口",
- "usingDataFoundIn": "使用在 {{environmentVariable}} 中找到的数据",
- "yourUsername": "您的用户名",
- "Sauce Username": "Sauce 用户名",
- "Sauce Access Key": "Sauce 访问密钥",
- "yourAccessKey": "您的访问密钥",
- "yourApiKey": "您的 API 密钥",
- "Perfecto Host": "Perfecto 主机",
- "Perfecto Port": "Perfecto 端口",
- "Pcloudy User Name": "Pcloudy 用户名",
- "Pcloudy Host": "Pcloudy 主机",
- "Pcloudy API Key": "Pcloudy API 密钥",
- "Add your token": "添加您的 Token",
- "Perfecto Token": "Perfecto Token",
- "Your Kobiton Username": "您的 Kobiton 用户名",
- "Kobiton Access Key": "Kobiton 访问密钥",
- "serverTabHeasdpinWebDriverURL": "HeadSpin Web Driver URL",
- "sessionHeadspinWebDriverURLDescription": "使用自动配置路由从 HeadSpin UI 或 HeadSpin API获取 URL",
- "Remote Host": "远程主机",
- "Remote Port": "远程端口",
- "Remote Path": "远程路径",
- "BrowserStack Username": "BrowserStack 用户名",
- "BrowserStack Access Key": "BrowserStack 访问密钥",
- "LambdaTest Username": "LambdaTest 用户名",
- "LambdaTest Access Key": "LambdaTest 访问密钥",
- "Bitbar API Key": "Bitbar API 密钥",
- "RemoteTestKit AccessToken": "RemoteTestKit 访问令牌",
- "RobotQA Token": "RobotQA 令牌",
- "Name": "名称",
- "Description": "Description",
- "Created": "Created",
- "Actions": "Actions",
- "enterYourSessionId": "在此输入您的会话ID",
- "Proxy URL": "代理 URL",
- "Source": "源",
- "Commands": "命令",
- "Execute Commands": "执行命令",
- "Gestures": "Gestures",
- "Gesture Builder": "Gesture Builder",
- "Saved Gestures": "Saved Gestures",
- "gesturesDescription": "Create, save, and execute custom gestures here. Gestures are identical to action chains in the W3C WebDriver Actions API.",
- "Session Information": "会话信息",
- "Execute Command": "Execute Command",
- "commandsDescription": "Run various commands using the current Appium driver. Note that not all drivers support all commands.",
- "Click to Set Coordinates": "点击设置坐标",
- "Set Coordinates Via Field": "手动设置坐标",
- "Action Type": "Action Type",
- "Pointer Up": "Pointer Up",
- "Pointer Down": "Pointer Down",
- "Pause": "Pause",
- "Move": "Move",
- "Action Type Not Defined": "Action Type Not Defined",
- "Duration": "期限",
- "Button": "Button",
- "Untitled Gesture": "Untitled Gesture",
- "Add Description": "Add Description",
- "Gesture saved": "Gesture saved",
- "Gesture saved as": "Gesture saved as '{{gestureName}}'",
- "Duplicate pointer names are not allowed": "Duplicate pointer names are not allowed",
- "Left": "Left",
- "Right": "Right",
- "Play": "播放",
- "Save Capability Set As": "保存能力设置为…",
- "Edit Raw JSON": "直接编辑 JSON",
- "Enter Parameters for:": "Enter Parameters for:",
- "invalidJson": "Invalid JSON",
- "Execute Script": "Execute Script",
- "App Management": "App Management",
- "Clipboard": "剪贴板",
- "File Transfer": "File Transfer",
- "Device Interaction": "Device Interaction",
- "Keyboard": "Keyboard",
- "Connectivity": "Connectivity",
- "Performance Data": "性能数据",
- "System": "系统",
- "Session": "Session会话",
- "Web": "Web",
- "Context": "上下文",
- "Window (W3C)": "Window (W3C)",
- "simulatorOnly": "Emulator/simulator only",
- "minAndroidSDK": "Minimum Android SDK level",
- "Error": "错误",
- "findingElementInSourceFailed": "Could not find the specified element. The current application source or element ID may have changed, or there may be too many elements with the same coordinates.",
- "callToMethodFailed": "调用 '{{methodName}}' 失败",
- "methodCallResult": "'{{methodName}}' 结果",
- "TestingBot Key": "TestingBot 键",
- "TestingBot Secret": "TestingBot Secret",
- "Appium Server": "Appium 服务",
- "Select Cloud Providers": "选择云提供商",
- "Advanced Settings": "高级设置",
- "Native App Mode": "Native App Mode",
- "Web/Hybrid App Mode": "Web/Hybrid App Mode",
- "autoAddPrefixes": "启动时自动添加必要的 Appium 供应商前缀",
- "attachSessionNotRunning": "Could not confirm that session {{attachSessId}} is running on the provided server. Please check details before trying to attach to the session again.",
- "Mobitru WebDriver URL": "Mobitru WebDriver URL",
- "Mobitru Billing Unit": "Mobitru Billing Unit",
- "Mobitru Access Key": "Mobitru Access Key",
- "mobitruCredentialsRequired": "Mobitru Access Key is required",
- "Session URL": "Session URL",
- "Server Details": "Server Details",
- "Session Length": "Session Length",
- "Session Details": "Session Details",
- "Currently Active App ID": "Currently Active App ID",
- "Session ID": "Session ID",
- "confirmDeletion": "Are you sure you want to delete this?",
- "Copied!": "Copied!",
- "Error Fetching Session URL": "Error Fetching Session URL",
- "noResultsFound": "No results found",
- "invalidCapType": "Invalid capability type: {{type}}",
- "whitespaceDetected": "Text Starts and/or Ends With Whitespace"
-}
diff --git a/babel.config.js b/babel.config.js
deleted file mode 100644
index c5bb2e8857..0000000000
--- a/babel.config.js
+++ /dev/null
@@ -1,26 +0,0 @@
-function makeBabelConfig(electronVersion) {
- return (api) => {
- api.cache(true);
- return {
- plugins: [
- '@babel/plugin-proposal-class-properties',
- '@babel/plugin-syntax-jsx',
- '@babel/plugin-transform-react-jsx',
- '@babel/plugin-transform-runtime',
- ],
- presets: [
- [
- '@babel/preset-env',
- {
- targets: {electron: electronVersion},
- useBuiltIns: 'usage',
- corejs: 2,
- },
- ],
- ['@babel/preset-react'],
- ],
- };
- };
-}
-
-module.exports = makeBabelConfig(require('./node_modules/electron/package.json').version);
diff --git a/build/entitlements.mac.plist b/build/entitlements.mac.plist
new file mode 100644
index 0000000000..661feb77a4
--- /dev/null
+++ b/build/entitlements.mac.plist
@@ -0,0 +1,8 @@
+
+
+
+
+ com.apple.security.cs.allow-jit
+
+
+
\ No newline at end of file
diff --git a/build/icon.icns b/build/icon.icns
index 613fa80c1a..1b951c785b 100644
Binary files a/build/icon.icns and b/build/icon.icns differ
diff --git a/build/icon.ico b/build/icon.ico
index 0aa3136744..901e5cf4d9 100644
Binary files a/build/icon.ico and b/build/icon.ico differ
diff --git a/ci-jobs/package.yml b/ci-jobs/package.yml
deleted file mode 100644
index aba24a8a05..0000000000
--- a/ci-jobs/package.yml
+++ /dev/null
@@ -1,23 +0,0 @@
-# Packager. Runs on refs/tags/*
-trigger:
- branches:
- include:
- - refs/tags/*
-pr: none
-jobs:
- - template: templates/package.yml
- parameters:
- pool:
- vmImage: 'macOS-12'
- name: 'osx_package'
- - template: templates/package.yml
- parameters:
- pool:
- vmImage: 'windows-2022'
- name: 'windows_package'
- buildScript: 'npx electron-builder build -w --ia32 --x64 --publish always'
- - template: templates/package.yml
- parameters:
- pool:
- vmImage: 'ubuntu-22.04'
- name: 'linux_package'
diff --git a/ci-jobs/templates/package.yml b/ci-jobs/templates/package.yml
deleted file mode 100644
index e93eebefcd..0000000000
--- a/ci-jobs/templates/package.yml
+++ /dev/null
@@ -1,36 +0,0 @@
-# Node.js
-# Build a general Node.js application with npm.
-# Add steps that analyze code, save build artifacts, deploy, and more:
-# https://docs.microsoft.com/vsts/pipelines/languages/javascript
-parameters:
- name: ''
- pool: ''
- xvfb: false
- target: ''
- buildScript: 'npx electron-builder build --publish always'
-jobs:
- - job: ${{parameters.name}}
- pool: ${{parameters.pool}}
- variables:
- PYTHON_ENV: 'python'
- TARGET: ${{ parameters.target }}
- E2E_TIMEOUT: 600000
- CI: true
- CSC_IDENTITY_AUTO_DISCOVERY: true
- USE_HARD_LINKS: 'false'
- steps:
- - checkout: self
- persistCredentials: true
- - task: NodeTool@0
- inputs:
- versionSpec: '16.x'
- - script: npm ci
- displayName: Install dependencies
- - script: npm run build
- displayName: Build
- - script: ${{ parameters.buildScript }}
- displayName: Bundle
- env:
- GH_TOKEN: $(GH_TOKEN)
- CSC_LINK: $(CSC_LINK)
- CSC_KEY_PASSWORD: $(CSC_KEY_PASSWORD)
diff --git a/docs/assets/images/icon.png b/docs/assets/images/icon.png
index cc048cef39..91bc513520 100644
Binary files a/docs/assets/images/icon.png and b/docs/assets/images/icon.png differ
diff --git a/docs/assets/images/inspector-window.png b/docs/assets/images/inspector-window.png
deleted file mode 100644
index 6ee7cb74f1..0000000000
Binary files a/docs/assets/images/inspector-window.png and /dev/null differ
diff --git a/docs/assets/images/session-builder.png b/docs/assets/images/session-builder.png
index dfcaf958ea..ce241cc752 100644
Binary files a/docs/assets/images/session-builder.png and b/docs/assets/images/session-builder.png differ
diff --git a/docs/assets/images/session-inspector.png b/docs/assets/images/session-inspector.png
index bd3fc1294c..6f9691fe3e 100644
Binary files a/docs/assets/images/session-inspector.png and b/docs/assets/images/session-inspector.png differ
diff --git a/docs/contributing.md b/docs/contributing.md
index 31878d94a3..685b7ec3a2 100644
--- a/docs/contributing.md
+++ b/docs/contributing.md
@@ -9,7 +9,7 @@ Want to contribute to this app? We'd love it!
## Code
-The code for this app is based on React and Electron.
+The application is primarily built using React, with the desktop app version being based on Electron.
To start off, clone the project from GitHub and run:
@@ -25,18 +25,19 @@ npm ci
- [Python](https://www.python.org/)
- some C/C++ compiler tools matching your operating system
-Watch changes during development:
+Run in development mode:
```bash
-npm run dev # desktop app
-npm run watch:browser # browser app
+npm run dev:browser # same as the plugin version
+npm run dev:electron
```
-Start the production version of the desktop app:
+!!! tip
-```bash
-npm run start
-```
+ Development mode runs in a separate dev server, so all Inspector sessions are subject to
+ [cross-origin resource sharing](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS) (CORS)
+ issues. In order to avoid this, before requesting a new session in dev mode, ensure your Appium
+ server has been launched with the `--allow-cors` flag.
Run tests:
@@ -45,26 +46,42 @@ npm run test:lint
npm run test:format
npm run test:unit
npm run test:integration
-npm run e2e
+npm run test:e2e
npm run test # lint, unit & integration
```
-Build the full app (desktop app into `/dist`, browser app into `/dist-browser`):
+Build the production version:
+
+```bash
+npm run build:browser # output directory: /dist-browser
+npm run build:plugin # output directory: /plugins/dist-browser
+npm run build:electron # output directory: /dist
+```
+
+Build the production version and run it:
```bash
-npm run build # desktop and browser
-npm run build:browser
+npm run preview:browser
+npm run preview:plugin
+npm run preview:electron
```
-Build the app executable package (and other artifacts) for your platform into `/release`:
+Build the desktop app executable package (and other artifacts) for your platform into `/release`:
!!! note
For macOS, this requires code signing environment variables to be set.
```bash
-npx electron-builder build --publish never
+npm run pack:electron
+```
+
+Link the plugin version to your local Appium server:
+
+```bash
+cd plugins && npm install && cd .. # install @appium/base-plugin
+appium plugin install --source=local plugins # link the plugin to Appium
```
## Documentation
@@ -87,6 +104,6 @@ synchronized with [Crowdin](https://crowdin.com/project/appium-desktop). If you
contribute translations, please leave your suggestions on Crowdin.
If you find yourself needing to add completely new strings, first you need to make code changes that
-add the strings in the [English translation file](https://github.com/appium/appium-inspector/blob/main/assets/locales/en/translation.json).
+add the strings in the [English translation file](https://github.com/appium/appium-inspector/blob/main/app/common/public/locales/en/translation.json).
After your changes are merged, the new strings will be automatically added to Crowdin, and become
available for translation into other languages.
diff --git a/docs/index.md b/docs/index.md
index 0129abd595..644036f67c 100644
--- a/docs/index.md
+++ b/docs/index.md
@@ -28,12 +28,12 @@ Appium Inspector is part of the Appium ecosystem. For information on Appium itse
-- Check out the [**Overview**](./overview.md) to learn the basics of the Inspector
-- Go through the [**Quickstart**](./quickstart/index.md) steps to get set up and start inspecting your app
-- The [**Menu Bar**](./menu-bar.md) section acts as a reference for the application menu bar
-- The [**Session Builder**](./session-builder/index.md) section acts as a reference for the default landing screen
-- The [**Session Inspector**](./session-inspector/index.md) section acts as a reference for the inspector screen
-- Refer to the [**Troubleshooting**](./troubleshooting.md) page for a list of potential issues
-- For contributions to the Inspector, refer to the [**Contributing**](./contributing.md) page
+- Check out the [**Overview**](./overview.md) to learn the basics of the Inspector
+- Go through the [**Quickstart**](./quickstart/index.md) steps to get set up and start inspecting your app
+- The [**Menu Bar**](./menu-bar.md) section acts as a reference for the application menu bar
+- The [**Session Builder**](./session-builder/index.md) section acts as a reference for the default landing screen
+- The [**Session Inspector**](./session-inspector/index.md) section acts as a reference for the inspector screen
+- Refer to the [**Troubleshooting**](./troubleshooting.md) page for a list of potential issues
+- For contributions to the Inspector, refer to the [**Contributing**](./contributing.md) page
diff --git a/docs/menu-bar.md b/docs/menu-bar.md
index 2ced373563..762618a9b3 100644
--- a/docs/menu-bar.md
+++ b/docs/menu-bar.md
@@ -5,50 +5,26 @@ hide:
title: Menu Bar
---
-The **Menu Bar** is the always shown either at the top of the application window (Windows) or in the
-system menu bar (macOS).
+The **Menu Bar** is the always shown either at the top of the application window (Windows/Linux) or
+in the system menu bar (macOS).

!!! note
- The menu bar is not available in the [web app version](./overview.md#formats) of the Inspector.
+ The menu bar is only available in the [standalone app version](./overview.md#formats) of the Inspector.
Several standard menu bar options are included, mainly related to window and text management.
However, there are a few specific options as well:
## Update Checker
-!!! warning
-
- [This functionality is currently unavailable.](./troubleshooting.md#auto-updater-not-working)
-
The update checker is available under the _File_ menu (Windows/Linux) or the application menu
(macOS). It can be used to check if there is a newer version of the Inspector available, and if so,
it is possible to automatically download and install the latest version.
-## Open/Save Session
-
-The _Open Session File_ / _Save As_ options in the _File_ menu provides the ability to import and
-export session details. Only one set of session details can be imported/exported at a time.
-
-### Exporting Sessions
-
-Selecting the _Save As_ option will package the currently specified server and session details into
-a downloadable `.appiumsession` file, which can then be shared to other computers.
-
-### Importing Sessions
-
-Selecting the _Open Session File_ option will load the server and session details in the
-[Session Builder](./session-builder/index.md). The loaded information can then be modified and/or
-saved inside the Inspector.
-
-## Change Language
-
-The _Language_ option in the _View_ menu allows to change the entire application language. Currently
-there are over 20 available languages with community-provided translations!
-
-!!! note
+Updating is supported for the following application formats:
- Most languages only include partial translations. You can help by providing your translations on
- [Crowdin](https://crowdin.com/project/appium-desktop)!
+- macOS: `.dmg`
+- Windows: `.exe` installer
+- Linux: `.AppImage`
diff --git a/docs/overview.md b/docs/overview.md
index 958f120b18..61ce78ebf2 100644
--- a/docs/overview.md
+++ b/docs/overview.md
@@ -16,11 +16,16 @@ with a graphical user interface and additional features.
The Inspector is distributed in two formats:
-- Standalone desktop application for Windows, macOS, and Linux, available for download from
- [its GitHub repo](https://github.com/appium/appium-inspector/releases)
-- Web application, available at
+- Standalone desktop application for Windows, macOS, and Linux, available for download from
+ [its GitHub repo](https://github.com/appium/appium-inspector/releases)
+- Appium server plugin, available for installation using
+ [Appium's Extension CLI](https://appium.io/docs/en/latest/cli/extensions/)
-Note that the web application may not be fully up-to-date with the desktop application.
+!!! note
+
+ The Inspector was also formerly released as a web application hosted at . The Appium team no longer has developer access to this site, so even though it remains operational, it is highly unlikely to be updated to a newer Inspector version, and may be taken down without notice. We recommend migrating to the standalone app or the plugin version.
+
+ The Appium team is exploring the idea of hosting an up-to-date version of the web app in the future.
## GUI Overview
@@ -28,13 +33,13 @@ There are two main parts to the Inspector user interface:
-- **[The Session Builder](./session-builder/index.md)**
- 
- The default screen, where all the server and session details must be specified.
+- **[The Session Builder](./session-builder/index.md)**
+ 
+ The default screen, where all the server and session details must be specified.
-- **[The Session Inspector](./session-inspector/index.md)**
- 
- The active session screen, showing the app screenshot, page source, and more.
+- **[The Session Inspector](./session-inspector/index.md)**
+ 
+ The active session screen, showing the app screenshot, page source, and more.
@@ -43,21 +48,21 @@ There are two main parts to the Inspector user interface:
In addition to page source and screenshot inspection, the Inspector provides many other useful
features. Here is a non-exhaustive list of such features:
-- Easily define Appium server connection details and capabilities
-- Save server details and capability sets for future sessions
-- Connect to 10+ different cloud platforms
-- Attach to an existing Appium session
-- Interact with the application through its screenshot (click/tap, swipe)
-- Create and save custom gestures
-- Select elements directly through the application screenshot
-- Search for elements using supported locator strategies and your own selectors
-- Interact with elements (click/tap, send keys, clear)
-- View suggested element locator strategies and selectors to be used in your scripts
-- Compare the speed of different element finding strategies
-- Record your actions directly into Appium client code for 5+ different programming languages
-- Simulate system actions for iOS (home, Siri) and Android (back, home, app switch)
-- Switch to different application contexts
-- Access a library of various Appium driver commands
+- Easily define Appium server connection details and capabilities
+- Save server details and capability sets for future sessions
+- Connect to 10+ different cloud platforms
+- Attach to an existing Appium session
+- Interact with the application through its screenshot (click/tap, swipe)
+- Create and save custom gestures
+- Select elements directly through the application screenshot
+- Search for elements using supported locator strategies and your own selectors
+- Interact with elements (click/tap, send keys, clear)
+- View suggested element locator strategies and selectors to be used in your scripts
+- Compare the speed of different element finding strategies
+- Record your actions directly into Appium client code for 5+ different programming languages
+- Simulate system actions for iOS (home, Siri) and Android (back, home, app switch)
+- Switch to different application contexts
+- Access a library of various Appium driver commands
All features are described in detail in the [Session Builder](./session-builder/index.md) and
[Session Inspector](./session-inspector/index.md) sections.
diff --git a/docs/quickstart/assets/images/open-warning-macos.png b/docs/quickstart/assets/images/open-warning-macos.png
new file mode 100644
index 0000000000..6981ed8248
Binary files /dev/null and b/docs/quickstart/assets/images/open-warning-macos.png differ
diff --git a/docs/quickstart/assets/images/open-warning-sequoia.png b/docs/quickstart/assets/images/open-warning-sequoia.png
new file mode 100644
index 0000000000..f9de5b2b83
Binary files /dev/null and b/docs/quickstart/assets/images/open-warning-sequoia.png differ
diff --git a/docs/quickstart/assets/images/open-warning-windows.png b/docs/quickstart/assets/images/open-warning-windows.png
new file mode 100644
index 0000000000..d744580efc
Binary files /dev/null and b/docs/quickstart/assets/images/open-warning-windows.png differ
diff --git a/docs/quickstart/assets/images/open-warning.png b/docs/quickstart/assets/images/open-warning.png
deleted file mode 100644
index fa9a5aa505..0000000000
Binary files a/docs/quickstart/assets/images/open-warning.png and /dev/null differ
diff --git a/docs/quickstart/index.md b/docs/quickstart/index.md
index 5a400e0cff..ec53eeea5b 100644
--- a/docs/quickstart/index.md
+++ b/docs/quickstart/index.md
@@ -15,4 +15,4 @@ This quickstart will cover the following:
3. [Configure Appium session details](./starting-a-session.md)
4. [Start an Inspector session](./starting-a-session.md#launching-the-session)
-Continue with the [installation requirements](./requirements.md)!
+Continue with the [system requirements](./requirements.md)!
diff --git a/docs/quickstart/installation.md b/docs/quickstart/installation.md
index ca359ed11c..2135130a86 100644
--- a/docs/quickstart/installation.md
+++ b/docs/quickstart/installation.md
@@ -2,53 +2,160 @@
title: Installation
---
-If you are using the Inspector's web app version, this step is, of course, not required. But if
-you wish to use the Inspector desktop app, it needs to be installed first.
+This step is only relevant if using the Inspector desktop app or Appium plugin formats.
+
+## Appium Plugin
+
+Like all Appium plugins, the Inspector plugin can be installed and activated using
+[the Appium command line](https://appium.io/docs/en/latest/cli/).
+
+1. Install the plugin:
+ 1. For Appium 3:
+
+ ```bash
+ appium plugin install inspector
+ ```
+
+ 2. For Appium 2 (last compatible version):
+
+ ```bash
+ appium plugin install --source=npm appium-inspector-plugin@2025.7.3
+ ```
+
+2. Launch the Appium server with the plugin activated:
+
+ ```bash
+ appium --use-plugins=inspector
+ ```
+
+3. Open the Inspector URL in your web browser:
+ ```
+ http://127.0.0.1:4723/inspector
+ ```
+
+!!! info
+
+ Make sure the above **host URL** and **port** match those of the Appium server. The server's
+ **base path** value is irrelevant, as the plugin always uses the `/inspector` path.
+
+ Check [the Troubleshooting guide](../troubleshooting.md#cannot-start-a-session-using-plugin-version)
+ if you are unable to create a session.
+
+## Desktop App
The app can be downloaded from [the Inspector's GitHub repository](https://github.com/appium/appium-inspector/releases).
-Different file formats are provided for each supported platform.
+Different file formats are provided for each supported platform. In addition to manual downloads,
+there are also unofficial ways to install the app using the command line.
+
+### Windows
-## Windows
+#### Manual Download
-Installing the Windows version is easiest by downloading the appropriate `.exe` file. When opening
-the file, it is possible that Windows [may show a warning](https://github.com/appium/appium-inspector/issues/1134),
-though this can be bypassed. If successful, the installation wizard will open, and after following
-the required steps, the Inspector should be installed and ready to use.
+It is recommended to download the `.exe` installer file, as it supports [checking for updates](../menu-bar.md#update-checker).
-## macOS
+Since the app is currently not signed, Windows will show a security warning to prevent you from
+opening the installer file. This can be bypassed with sufficient user permissions:
-The macOS version may be easiest to set up by downloading the `.dmg` file. Opening it will show a
-simple window, where the Inspector icon should be dragged-and-dropped to the _Applications_ folder
-icon. This will extract the app, after which it can be opened from the _Applications_ folder.
+??? info "Handling installation warnings on Windows"
-When you run the app, you may be greeted with some error about the app not being able to be opened,
-not verified by Apple, or something similar. The easiest way to get around this is as follows:
+ 1. Right-click on the installer file and click _Properties_ - a new window should open.
+ 2. Near the bottom of the window, there will be an _Unblock_ checkbox - check it.
+ 3. Click _OK_.
+ 4. You should now be able to open the installer without issues.
-1. _Control+Click_ the Appium Inspector icon in the _Applications_ folder and choose _Open_.
- 
+ Alternatively, you can also bypass this after having opened the installer:
-2. The dialog below will open. Just click _Open_ and Appium Inspector should launch.
- 
+ 1. Upon opening the installer, the following warning will likely be shown.
+ 
+ 2. Click _More info_ - a new button _Run anyway_ should appear at the bottom.
+ 3. Click _Run anyway_ - the installer window should open.
-There is also an alternative approach which uses the command line. Run the following command:
+ After following the installer steps, the Inspector app should be installed, and you should be able
+ to open it without any warnings.
+#### WinGet
+
+It is possible to install the Inspector through WinGet. Please note that this method is only
+community-supported, and is not maintained by the Appium team.
+
+```sh
+winget install AppiumDevelopers.AppiumInspector
```
-xattr -cr "/Applications/Appium Inspector.app"
+
+### macOS
+
+#### Manual Download
+
+It is recommended to download the `.dmg` installer file, as it supports [checking for updates](../menu-bar.md#update-checker).
+
+Opening the file will open a simple window, showing icons for the Inspector and the _Applications_ folder.
+Drag-and-drop the Inspector icon over the _Applications_ icon to extract the app.
+
+Since the app [is currently not notarized](https://developer.apple.com/documentation/security/notarizing-macos-software-before-distribution),
+macOS will show various security warnings to prevent you from opening the app for the first time.
+These can be handled as described below:
+
+??? info "Handling first-time warnings via command-line (any macOS)"
+
+ Simply open your Terminal app and run the following command:
+
+ ```
+ xattr -cr "/Applications/Appium Inspector.app"
+ ```
+
+ You should now be able to open the app with no warnings.
+
+??? info "Handling first-time warnings via GUI (macOS Sequoia or later)"
+
+ !!! note
+
+ If your Mac has an Apple chip, you can skip these steps by installing Appium Inspector v2024.9.1
+ (which should not show any warnings), then using [the update checker](../menu-bar.md#update-checker)
+ to upgrade to the most recent version.
+
+ 1. Upon opening the app, the following warning will be shown. Click _Done_.
+ 
+ 2. Open macOS Settings -> _Privacy & Security_, then scroll down to the _Security_ section. You should
+ see the info text _"Appium Inspector" was blocked to protect your Mac._
+ 3. Click _Open Anyway_.
+ 4. A prompt should appear - click _Open Anyway_ again.
+ 5. A prompt should appear, requiring you to confirm the action using administrator user credentials.
+ 6. After confirming the action, the app should open.
+
+??? info "Handling first-time warnings via GUI (macOS Sonoma or earlier)"
+
+ 1. Upon opening the app, the following warning will be shown. Click _OK_.
+ 
+ 2. Open _Finder_ -> _Applications_ and find Appium Inspector.
+ 3. _Control+Click_/click with two fingers on Appium Inspector and click _Open_.
+ 4. A prompt should appear - click _Open_ again.
+ 5. After accepting the prompt, the app should open.
+
+#### Homebrew
+
+It is possible to install the Inspector through Homebrew. Please note that this method is only
+community-supported, and is not maintained by the Appium team.
+
+!!! warning
+
+ This method is deprecated and will be disabled on September 1st, 2026, since the app is not notarized.
+
+```sh
+brew install --cask appium-inspector
```
-After this, opening the app should not produce any warnings anymore.
+### Linux
-## Linux
+It is recommended to download the `.AppImage` file, as it supports [checking for updates](../menu-bar.md#update-checker).
-The Linux version is packaged as an `.AppImage` file. In order to open the file, its executable flag
-needs to be set first:
+In order to open the file, its executable flag needs to be set first:
```
-chmod a+x Appium-Inspector-linux-.AppImage
+chmod a+x Appium-Inspector--linux-.AppImage
```
Afterwards, the app can be opened through the command line:
```
-./Appium-Inspector-linux-.AppImage
+./Appium-Inspector--linux-.AppImage
```
diff --git a/docs/quickstart/requirements.md b/docs/quickstart/requirements.md
index 4624cc3936..a43b73fd3c 100644
--- a/docs/quickstart/requirements.md
+++ b/docs/quickstart/requirements.md
@@ -5,26 +5,38 @@ hide:
title: System Requirements
---
-Since the Inspector has two versions, [a desktop app and a web app](../overview.md#formats), the
-requirements for these will differ.
+Since the Inspector is released in [2 versions](../overview.md#formats), the requirements for these
+will differ:
-- The web app supports Chrome and Firefox browsers
- ([Safari is not supported](../troubleshooting.md#browser-version-does-not-work-in-safari))
- - Viewport size of at least **870 x 610** pixels is recommended
-- The desktop app requires up to around **600MB** of space on the computer
- - The minimum application window size is **890 x 710** pixels
+- Desktop app
+ - Works on Windows 10+, macOS 12+, Ubuntu 18.04+, Debian 10+, openSUSE 15.5+, or Fedora Linux 39+
+ - [These requirements are taken from Chrome](https://support.google.com/chrome/a/answer/7100626),
+ as the Inspector is built using Electron (which uses Chromium)
+ - Around **500MB** of free space is required
+ - The minimum application window size is **890 x 710** pixels
+- Appium server plugin
+ - Works in Chrome/Edge/Firefox/Safari, released in 2022 or later
+ - Around **6MB** of free space is required
+ - Viewport size of at least **870 x 610** pixels is recommended
-Both Inspector versions also require an **Appium server** to connect to, which is _not_ bundled with
-the Inspector. This server can be run either locally or remotely. If you need to install it, please
-check the [Appium Install documentation](https://appium.io/docs/en/latest/quickstart/install/)
-for details.
+### Appium Server Requirements
-!!! note
+The Inspector cannot do much without an **Appium server** to connect to. Unless you only want to
+connect to existing Appium servers, you will need to install and set up a server of your own,
+which can be hosted either locally or remotely. For instructions on how to do this, please refer
+to the [Appium documentation](https://appium.io/docs/en/latest/quickstart/install/).
- If using a standalone Appium server, make sure the server also has the necessary
- [driver(s)](https://appium.io/docs/en/latest/ecosystem/drivers/) for your target platform(s)!
+If setting up your own server, make sure to also install the **Appium driver(s)** for your target
+platform(s). You can find links to all known drivers in the [Appium documentation's Ecosystem page](https://appium.io/docs/en/latest/ecosystem/drivers/).
+Refer to each driver's documentation for its specific requirements and setup instructions.
-While the Inspector is designed to work with Appium 2, it is also compatible with
-later versions of Appium 1. Please be aware of
-[the differences between both Appium versions](https://appium.io/docs/en/latest/guides/migrating-1-to-2/) -
-in particular, the default server base path.
+For official drivers, the following versions are recommended for best compatibility:
+
+- [Espresso](https://github.com/appium/appium-espresso-driver): `4.0.0` or later
+- [Mac2](https://github.com/appium/appium-mac2-driver): `2.0.0` or later
+- [UiAutomator2](https://github.com/appium/appium-uiautomator2-driver): `4.0.0` or later
+- [Windows](https://github.com/appium/appium-windows-driver/): `4.0.0` or later
+- [XCUITest](https://appium.github.io/appium-xcuitest-driver/latest/): `4.21.27` or later
+
+Continue with the [Installation](./installation.md) steps, or jump directly to
+[Starting a Session](./starting-a-session.md)!
diff --git a/docs/quickstart/starting-a-session.md b/docs/quickstart/starting-a-session.md
index aa380d943c..d2f8fc91a9 100644
--- a/docs/quickstart/starting-a-session.md
+++ b/docs/quickstart/starting-a-session.md
@@ -17,25 +17,18 @@ and session details are specified.
The [server details section](../session-builder/server-details.md) at the top of the window is where
information about the Appium server is specified, so that the Inspector knows how to connect to it:
-- If you wish to connect to a cloud provider service, choose your vendor using the _Select Cloud
- Providers_ button, switch to its tab, and fill in the required details.
+- If you wish to connect to a cloud provider service, choose your vendor using the _Select Cloud
+ Providers_ button, switch to its tab, and fill in the required details.
-- If you wish to connect to a standalone local or remote Appium server, first make sure the server
- is launched and running. The start of the server log will have a list of IP addresses and ports
- that can be used to connect to the server.
+- If you wish to connect to a standalone local or remote Appium server, first make sure the server
+ is launched and running. The start of the server log will have a list of IP addresses and ports
+ that can be used to connect to the server.
+ - For a local Appium server running on its default port, **all server details fields can be left
+ unchanged**. By default, the Inspector will attempt to connect to `http://127.0.0.1:4723`,
+ which matches the default values of the Appium server.
- - For a local Appium server running on its default port, **all server details fields can be left
- unchanged**. By default, the Inspector will attempt to connect to `http://127.0.0.1:4723`,
- which matches the default values of the Appium server.
-
- !!! note
-
- The above assumes that you are using Appium 2. If using Appium 1, the _Remote Path_ value
- must be changed to `/wd/hub`. This may also apply to an Appium 2 server, if it was launched
- with the `--base-path="/wd/hub"` argument.
-
- - For a local or remote Appium server with non-default properties, please change the field
- values accordingly.
+ - For a local or remote Appium server with non-default properties, please change the field
+ values accordingly.
With the server details specified, you can move on to the session details!
@@ -107,10 +100,10 @@ and session information:
You can see the following details:
-- The server details are unchanged, which means the Inspector will try to connect to a local Appium
- server on its default port
-- The session capabilities are set to use the UiAutomator2 driver, with additional capabilities for
- the Android system settings app
+- The server details are unchanged, which means the Inspector will try to connect to a local Appium
+ server on its default port
+- The session capabilities are set to use the UiAutomator2 driver, with additional capabilities for
+ the Android system settings app
Of course, your own server and session details will likely vary.
diff --git a/docs/session-builder/app-settings.md b/docs/session-builder/app-settings.md
new file mode 100644
index 0000000000..1fd1c9caec
--- /dev/null
+++ b/docs/session-builder/app-settings.md
@@ -0,0 +1,25 @@
+---
+hide:
+ - toc
+
+title: Application Settings
+---
+
+The application settings can be accessed using the button in the top-right of the Session Builder screen.
+
+
+
+## Theme
+
+By default, the Inspector follows the system theme, but it is possible to explicitly switch to
+a light or dark theme.
+
+## Language
+
+The language dropdown allows you to change the entire application language. Currently there are over 20
+available languages with community-provided translations!
+
+!!! note
+
+ Most languages only include partial translations. You can help by providing your translations on
+ [Crowdin](https://crowdin.com/project/appium-desktop)!
diff --git a/docs/session-builder/assets/images/app-settings.png b/docs/session-builder/assets/images/app-settings.png
new file mode 100644
index 0000000000..f8128d03b7
Binary files /dev/null and b/docs/session-builder/assets/images/app-settings.png differ
diff --git a/docs/session-builder/assets/images/attach-to-session/attach-to-session.png b/docs/session-builder/assets/images/attach-to-session/attach-to-session.png
index dd24edaa2b..df792940d4 100644
Binary files a/docs/session-builder/assets/images/attach-to-session/attach-to-session.png and b/docs/session-builder/assets/images/attach-to-session/attach-to-session.png differ
diff --git a/docs/session-builder/assets/images/attach-to-session/found-session.png b/docs/session-builder/assets/images/attach-to-session/found-session.png
deleted file mode 100644
index 898a2dca8f..0000000000
Binary files a/docs/session-builder/assets/images/attach-to-session/found-session.png and /dev/null differ
diff --git a/docs/session-builder/assets/images/attach-to-session/found-sessions.png b/docs/session-builder/assets/images/attach-to-session/found-sessions.png
new file mode 100644
index 0000000000..1451560b94
Binary files /dev/null and b/docs/session-builder/assets/images/attach-to-session/found-sessions.png differ
diff --git a/docs/session-builder/assets/images/attach-to-session/no-found-sessions.png b/docs/session-builder/assets/images/attach-to-session/no-found-sessions.png
new file mode 100644
index 0000000000..64b56b167e
Binary files /dev/null and b/docs/session-builder/assets/images/attach-to-session/no-found-sessions.png differ
diff --git a/docs/session-builder/assets/images/capability-builder/capability-builder-footer.png b/docs/session-builder/assets/images/capability-builder/capability-builder-footer.png
index db3176406b..0a81e87f42 100644
Binary files a/docs/session-builder/assets/images/capability-builder/capability-builder-footer.png and b/docs/session-builder/assets/images/capability-builder/capability-builder-footer.png differ
diff --git a/docs/session-builder/assets/images/capability-builder/capability-builder.png b/docs/session-builder/assets/images/capability-builder/capability-builder.png
index d32f81aa7b..d0363f28c4 100644
Binary files a/docs/session-builder/assets/images/capability-builder/capability-builder.png and b/docs/session-builder/assets/images/capability-builder/capability-builder.png differ
diff --git a/docs/session-builder/assets/images/capability-builder/capability-fields.png b/docs/session-builder/assets/images/capability-builder/capability-fields.png
index cba40ec8c7..173277ee25 100644
Binary files a/docs/session-builder/assets/images/capability-builder/capability-fields.png and b/docs/session-builder/assets/images/capability-builder/capability-fields.png differ
diff --git a/docs/session-builder/assets/images/capability-builder/capability-json-editor.png b/docs/session-builder/assets/images/capability-builder/capability-json-editor.png
index b23041c028..2eb9766427 100644
Binary files a/docs/session-builder/assets/images/capability-builder/capability-json-editor.png and b/docs/session-builder/assets/images/capability-builder/capability-json-editor.png differ
diff --git a/docs/session-builder/assets/images/capability-builder/capability-json.png b/docs/session-builder/assets/images/capability-builder/capability-json.png
index 8786be64f2..5cb0b1945b 100644
Binary files a/docs/session-builder/assets/images/capability-builder/capability-json.png and b/docs/session-builder/assets/images/capability-builder/capability-json.png differ
diff --git a/docs/session-builder/assets/images/empty-session-builder.png b/docs/session-builder/assets/images/empty-session-builder.png
index 109fc13813..3a98d5411a 100644
Binary files a/docs/session-builder/assets/images/empty-session-builder.png and b/docs/session-builder/assets/images/empty-session-builder.png differ
diff --git a/docs/session-builder/assets/images/saved-capability-sets/saved-caps-name-editor.png b/docs/session-builder/assets/images/saved-capability-sets/saved-caps-name-editor.png
index 880c1673a1..41397552d5 100644
Binary files a/docs/session-builder/assets/images/saved-capability-sets/saved-caps-name-editor.png and b/docs/session-builder/assets/images/saved-capability-sets/saved-caps-name-editor.png differ
diff --git a/docs/session-builder/assets/images/saved-capability-sets/saved-caps-set-list.png b/docs/session-builder/assets/images/saved-capability-sets/saved-caps-set-list.png
index 27a16e3c9a..1a4d6b8d01 100644
Binary files a/docs/session-builder/assets/images/saved-capability-sets/saved-caps-set-list.png and b/docs/session-builder/assets/images/saved-capability-sets/saved-caps-set-list.png differ
diff --git a/docs/session-builder/assets/images/saved-capability-sets/saved-caps-sets.png b/docs/session-builder/assets/images/saved-capability-sets/saved-caps-sets.png
index 17ea97bea4..87bc1bc527 100644
Binary files a/docs/session-builder/assets/images/saved-capability-sets/saved-caps-sets.png and b/docs/session-builder/assets/images/saved-capability-sets/saved-caps-sets.png differ
diff --git a/docs/session-builder/assets/images/server-details/advanced-settings.png b/docs/session-builder/assets/images/server-details/advanced-settings.png
index 0c44657b59..1f59eba177 100644
Binary files a/docs/session-builder/assets/images/server-details/advanced-settings.png and b/docs/session-builder/assets/images/server-details/advanced-settings.png differ
diff --git a/docs/session-builder/assets/images/server-details/cloud-providers.png b/docs/session-builder/assets/images/server-details/cloud-providers.png
index c98f223996..24a5904790 100644
Binary files a/docs/session-builder/assets/images/server-details/cloud-providers.png and b/docs/session-builder/assets/images/server-details/cloud-providers.png differ
diff --git a/docs/session-builder/assets/images/server-details/default-server-details.png b/docs/session-builder/assets/images/server-details/default-server-details.png
index 53f41c4cf2..9912ff8c07 100644
Binary files a/docs/session-builder/assets/images/server-details/default-server-details.png and b/docs/session-builder/assets/images/server-details/default-server-details.png differ
diff --git a/docs/session-builder/assets/images/server-details/lambdatest-details.png b/docs/session-builder/assets/images/server-details/lambdatest-details.png
deleted file mode 100644
index 321729fa5c..0000000000
Binary files a/docs/session-builder/assets/images/server-details/lambdatest-details.png and /dev/null differ
diff --git a/docs/session-builder/assets/images/server-details/server-configuration.png b/docs/session-builder/assets/images/server-details/server-configuration.png
index fc8e01b6b9..57f0ca0304 100644
Binary files a/docs/session-builder/assets/images/server-details/server-configuration.png and b/docs/session-builder/assets/images/server-details/server-configuration.png differ
diff --git a/docs/session-builder/assets/images/server-details/testmuai-details.png b/docs/session-builder/assets/images/server-details/testmuai-details.png
new file mode 100644
index 0000000000..b65e08c3db
Binary files /dev/null and b/docs/session-builder/assets/images/server-details/testmuai-details.png differ
diff --git a/docs/session-builder/attach-to-session.md b/docs/session-builder/attach-to-session.md
index aef5814c51..f4c7f65781 100644
--- a/docs/session-builder/attach-to-session.md
+++ b/docs/session-builder/attach-to-session.md
@@ -5,24 +5,40 @@ hide:
title: Attach to Session Tab
---
-The Attach to Session tab of the Session Builder provides the ability to connect to an existing
-Appium session using the Inspector.
+The Attach to Session tab of the Session Builder allows attaching to an already-running session
+[on the specified Appium server](./server-details.md).

-The Inspector automatically tries to discover existing sessions when the application is opened.
-If no sessions are discovered, the dropdown will be empty. But if there is at least one session,
-the dropdown will populate with the session identifier and other details:
+There are 2 ways of attaching to a session:
-
+- Manually entering the ID of the target session
+- Selecting from a list of automatically discovered sessions
-There is also a refresh button to retry the session discovery process.
+!!! warning
-!!! note
+ Discovering sessions from servers running Appium 3 or later requires the server to have enabled
+ the `session_discovery` [insecure feature](https://appium.io/docs/en/latest/guides/security/).
+ Note that, even if session discovery is disabled, it is still possible to manually attach to a
+ session using its ID.
+
+Session discovery is run automatically upon switching to the Attach to Session tab, but there is
+also a dedicated button for refreshing the list of discovered sessions.
+
+If the server has no active sessions, or the discovery process failed (for example, if the target
+server is running Appium 3 or later with session discovery disabled), an empty indicator is shown:
+
+
- The session discovery process uses the current [server details](./server-details.md). Make sure
- to select the correct server tab and enter the expected server details before pressing the
- refresh button.
+If the discovery process _does_ find one or more sessions, they are shown in a grid of cards, with
+each card listing key information extracted from the session's capabilities, and a button to
+attach to that session. The cards are sorted in reverse order, with the first card corresponding to
+the most recently started session.
+
+
+
+!!! note
-The footer of this screen contains a link the Appium documentation, and a single button for
-connecting to the selected session.
+ Support for discovering sessions from cloud provider-hosted servers depends on the provider. If
+ the Inspector does not discover any sessions for your cloud provider, contact them to check
+ whether they support this functionality.
diff --git a/docs/session-builder/capability-builder.md b/docs/session-builder/capability-builder.md
index bef07a4cde..9e6d9d1915 100644
--- a/docs/session-builder/capability-builder.md
+++ b/docs/session-builder/capability-builder.md
@@ -10,6 +10,9 @@ To learn more about capabilities, [please visit the Appium documentation](https:

+The divider line in the middle of the tab can be used to collapse/expand either half of
+this tab.
+
## Capability Fields
The left side of the Capability Builder shows the capability fields editor. It provides several form
@@ -20,13 +23,12 @@ fields for specifying each capability in parts: its name, value type, and the va
Changing the name or value of any capability will automatically adjust the contents of
[the JSON structure](#capability-json-structure) on the right side of the Session Builder.
-There are 5 options for the value type:
+There are 4 options for the value type:
-- text
-- boolean
-- number
-- JSON object
-- filepath
+- text
+- boolean
+- number
+- JSON object
Selecting a different option may change the value input field.
@@ -37,10 +39,14 @@ Selecting a different option may change the value input field.
To add or remove capabilities, use the add and delete buttons on the right side.
-There is also a checkbox that allows automatically adding the Appium vendor prefix to capabilities
-that do not have them, when starting a new session. This means that if you have a non-W3C capability
-without a vendor prefix (e.g. `deviceName`), the Inspector will automatically add the `appium:`
-prefix to it when starting the session (e.g. `appium:deviceName`). This checkbox is checked by default.
+The checkbox next to the delete button can also be used to enable/disable the capability, which may
+be useful when testing session behavior with/without specific capabilities.
+
+Finally, below the list of capabilites there is a checkbox that allows automatically adding the
+Appium vendor prefix to capabilities that do not have them, when starting a new session. This means
+that if you have a non-W3C capability without a vendor prefix (e.g. `deviceName`), the Inspector will
+automatically add the `appium:` prefix to it when starting the session (e.g. `appium:deviceName`).
+This checkbox is checked by default.
## Capability JSON Structure
@@ -65,7 +71,7 @@ The Session Builder footer also contains a few items:

-- The _Capabilities Documentation_ link opens the [Appium documentation on capabilities](https://appium.io/docs/en/latest/guides/caps/)
-- The _Save As_ button allows saving the current capabilities as a new capability set for future use
- (see [Saved Capability Sets](./saved-capability-sets.md) for more details)
-- The _Start Session_ button attempts to start an Inspector session using the current capabilities
+- The _Capabilities Documentation_ link opens the [Appium documentation on capabilities](https://appium.io/docs/en/latest/guides/caps/)
+- The _Save As_ button allows saving the current capabilities as a new capability set for future use
+ (see [Saved Capability Sets](./saved-capability-sets.md) for more details)
+- The _Start Session_ button attempts to start an Inspector session using the current capabilities
diff --git a/docs/session-builder/index.md b/docs/session-builder/index.md
index 95dbacb2bc..9929e3e9a1 100644
--- a/docs/session-builder/index.md
+++ b/docs/session-builder/index.md
@@ -11,7 +11,8 @@ The **Session Builder** is the default screen shown upon opening the Inspector.
The user interface here can be divided into several groups:
-- [Configuration of Server Details](./server-details.md)
-- [Capability Builder tab](./capability-builder.md)
-- [Saved Capability Sets tab](./saved-capability-sets.md)
-- [Attaching to Existing Session tab](./attach-to-session.md)
+- [Application Settings](./app-settings.md)
+- [Configuration of Server Details](./server-details.md)
+- [Capability Builder tab](./capability-builder.md)
+- [Saved Capability Sets tab](./saved-capability-sets.md)
+- [Attaching to Existing Session tab](./attach-to-session.md)
diff --git a/docs/session-builder/saved-capability-sets.md b/docs/session-builder/saved-capability-sets.md
index d1207931e0..23c1967cc5 100644
--- a/docs/session-builder/saved-capability-sets.md
+++ b/docs/session-builder/saved-capability-sets.md
@@ -8,6 +8,9 @@ Parts of this tab are similar to the Capability Builder tab.

+The divider line in the middle of the tab can be used to adjust the widths of both halves of this
+tab, as well as collapse/expand the right half.
+
## List of Saved Capability Sets
The left side of this screen contains a list of all saved capability sets. The number of saved sets
@@ -15,8 +18,23 @@ is also shown in the title of the Saved Capability Sets tab.

-Selecting any set populates the JSON structure on the right side with the contents of the set. There
-are also 2 buttons: one for opening the set in the Capability Builder tab, and one for deleting the set.
+Selecting any set populates the JSON structure on the right side with the contents of the set.
+The Actions column of each set also has 3 buttons:
+
+- Open the set in the Capability Builder tab
+- Export the set (along with the current session details) as an `.appiumsession` file
+- Delete the set
+
+There is also a button at the bottom of the saved capability sets list, which can be used to import
+previously exported `.appiumsession` files and automatically add them to the list of saved
+capability sets. Multiple files can be imported at the same time.
+
+!!! tip
+
+ If you have installed the standalone desktop app version, you can also open an `.appiumsession`
+ file using your file manager/command line. This will launch the Inspector and load the session
+ file details in the [Capability Builder tab](./capability-builder.md), which may be useful if
+ you do not want to add it as a saved capability set.
## Saved Capability Set JSON Structure
@@ -31,6 +49,6 @@ additional functionality here is the ability to rename a saved set:
The footer is largely similar to [that in the Capability Builder tab](./capability-builder.md#footer),
with one additional button:
-- The _Save_ button is shown upon selecting any saved capability set, and is enabled after making
- any changes in its capabilities. Pressing it overwrites the capabilities in the saved set with the
- new changes.
+- The _Save_ button is shown upon selecting any saved capability set, and is enabled after making
+ any changes in its capabilities. Pressing it overwrites the capabilities in the saved set with the
+ new changes.
diff --git a/docs/session-builder/server-details.md b/docs/session-builder/server-details.md
index aced3016e8..724899f92e 100644
--- a/docs/session-builder/server-details.md
+++ b/docs/session-builder/server-details.md
@@ -17,14 +17,13 @@ The default server details have 4 fields:

-- **Remote Host**: the host URL of the server
-- **Remote Port**: the port on which the server is running
-- **Remote Path**: the path used to access the server. Appium 2 servers use `/` by default, whereas
- Appium 1 servers use `/wd/hub`
-- **SSL**: by default, the server is accessed over HTTP - tick this checkbox to use HTTPS
+- **Remote Host**: the host URL of the server (default: `127.0.0.1`)
+- **Remote Port**: the port on which the server is running (default: `4723`)
+- **Remote Path**: the base path used to access the server (default: `/`)
+- **SSL**: whether HTTPS should be used when connecting to the server (default: `false`)
If using the placeholder details, the Inspector will try to connect to `http://127.0.0.1:4723/`.
-If you have a locally-running Appium 2 server that was launched with default parameters, it should
+If you have a locally-running Appium server that was launched with default parameters, it should
also be using this address, in which case you can leave the fields unchanged.
## Cloud Providers
@@ -36,9 +35,9 @@ support integration through Appium Inspector:
Selecting any provider then adds a new tab next to the default _Appium Server_ tab, and switching to
the provider's tab changes the available server detail fields. Different providers will have
-different fields - for example, LambdaTest only requires the _username_ and _access key_:
+different fields - for example, TestMu AI only requires the _username_ and _access key_:
-
+
## Advanced Settings
diff --git a/docs/session-inspector/assets/images/commands/command-info.png b/docs/session-inspector/assets/images/commands/command-info.png
new file mode 100644
index 0000000000..700a4d1f40
Binary files /dev/null and b/docs/session-inspector/assets/images/commands/command-info.png differ
diff --git a/docs/session-inspector/assets/images/commands/command-params.png b/docs/session-inspector/assets/images/commands/command-params.png
index 03f0e18dfe..57bf45b293 100644
Binary files a/docs/session-inspector/assets/images/commands/command-params.png and b/docs/session-inspector/assets/images/commands/command-params.png differ
diff --git a/docs/session-inspector/assets/images/commands/command-result.png b/docs/session-inspector/assets/images/commands/command-result.png
index 8d63a9921a..23d3ce68ad 100644
Binary files a/docs/session-inspector/assets/images/commands/command-result.png and b/docs/session-inspector/assets/images/commands/command-result.png differ
diff --git a/docs/session-inspector/assets/images/commands/commands-nav.png b/docs/session-inspector/assets/images/commands/commands-nav.png
new file mode 100644
index 0000000000..dc60424cd7
Binary files /dev/null and b/docs/session-inspector/assets/images/commands/commands-nav.png differ
diff --git a/docs/session-inspector/assets/images/commands/commands-tab.png b/docs/session-inspector/assets/images/commands/commands-tab.png
index 3caab36c1e..355d8b4934 100644
Binary files a/docs/session-inspector/assets/images/commands/commands-tab.png and b/docs/session-inspector/assets/images/commands/commands-tab.png differ
diff --git a/docs/session-inspector/assets/images/commands/copy-button.png b/docs/session-inspector/assets/images/commands/copy-button.png
new file mode 100644
index 0000000000..410bfee5cd
Binary files /dev/null and b/docs/session-inspector/assets/images/commands/copy-button.png differ
diff --git a/docs/session-inspector/assets/images/commands/deprecated-command.png b/docs/session-inspector/assets/images/commands/deprecated-command.png
new file mode 100644
index 0000000000..dcaf91bb9f
Binary files /dev/null and b/docs/session-inspector/assets/images/commands/deprecated-command.png differ
diff --git a/docs/session-inspector/assets/images/commands/opened-category.png b/docs/session-inspector/assets/images/commands/opened-category.png
deleted file mode 100644
index f8663a9360..0000000000
Binary files a/docs/session-inspector/assets/images/commands/opened-category.png and /dev/null differ
diff --git a/docs/session-inspector/assets/images/commands/table-formatting-button.png b/docs/session-inspector/assets/images/commands/table-formatting-button.png
new file mode 100644
index 0000000000..55f67441bf
Binary files /dev/null and b/docs/session-inspector/assets/images/commands/table-formatting-button.png differ
diff --git a/docs/session-inspector/assets/images/gestures/gesture-editor-actions.png b/docs/session-inspector/assets/images/gestures/gesture-editor-actions.png
index 900bcd5601..9b9aa3870e 100644
Binary files a/docs/session-inspector/assets/images/gestures/gesture-editor-actions.png and b/docs/session-inspector/assets/images/gestures/gesture-editor-actions.png differ
diff --git a/docs/session-inspector/assets/images/gestures/gesture-editor-header.png b/docs/session-inspector/assets/images/gestures/gesture-editor-header.png
index 838c092dda..4eb02715e6 100644
Binary files a/docs/session-inspector/assets/images/gestures/gesture-editor-header.png and b/docs/session-inspector/assets/images/gestures/gesture-editor-header.png differ
diff --git a/docs/session-inspector/assets/images/gestures/gesture-editor-pointers.png b/docs/session-inspector/assets/images/gestures/gesture-editor-pointers.png
index 3fa1d3d35a..abc6226c6d 100644
Binary files a/docs/session-inspector/assets/images/gestures/gesture-editor-pointers.png and b/docs/session-inspector/assets/images/gestures/gesture-editor-pointers.png differ
diff --git a/docs/session-inspector/assets/images/gestures/gesture-timeline-empty.png b/docs/session-inspector/assets/images/gestures/gesture-timeline-empty.png
index 357f00873f..a60bd9a4c9 100644
Binary files a/docs/session-inspector/assets/images/gestures/gesture-timeline-empty.png and b/docs/session-inspector/assets/images/gestures/gesture-timeline-empty.png differ
diff --git a/docs/session-inspector/assets/images/gestures/gesture-timeline-full.png b/docs/session-inspector/assets/images/gestures/gesture-timeline-full.png
index e6514ab319..8ef7d9800a 100644
Binary files a/docs/session-inspector/assets/images/gestures/gesture-timeline-full.png and b/docs/session-inspector/assets/images/gestures/gesture-timeline-full.png differ
diff --git a/docs/session-inspector/assets/images/gestures/gestures-tab.png b/docs/session-inspector/assets/images/gestures/gestures-tab.png
index a809635f15..abc478f8be 100644
Binary files a/docs/session-inspector/assets/images/gestures/gestures-tab.png and b/docs/session-inspector/assets/images/gestures/gestures-tab.png differ
diff --git a/docs/session-inspector/assets/images/gestures/move-action.png b/docs/session-inspector/assets/images/gestures/move-action.png
index dc76ec1b91..3244c59178 100644
Binary files a/docs/session-inspector/assets/images/gestures/move-action.png and b/docs/session-inspector/assets/images/gestures/move-action.png differ
diff --git a/docs/session-inspector/assets/images/gestures/new-gesture-builder.png b/docs/session-inspector/assets/images/gestures/new-gesture-builder.png
index 7a1d323856..fa232469a3 100644
Binary files a/docs/session-inspector/assets/images/gestures/new-gesture-builder.png and b/docs/session-inspector/assets/images/gestures/new-gesture-builder.png differ
diff --git a/docs/session-inspector/assets/images/gestures/pause-action.png b/docs/session-inspector/assets/images/gestures/pause-action.png
index a3a2c48a20..94a7b93792 100644
Binary files a/docs/session-inspector/assets/images/gestures/pause-action.png and b/docs/session-inspector/assets/images/gestures/pause-action.png differ
diff --git a/docs/session-inspector/assets/images/gestures/pointer-action-visualisation.png b/docs/session-inspector/assets/images/gestures/pointer-action-visualisation.png
deleted file mode 100644
index 9fd13afc79..0000000000
Binary files a/docs/session-inspector/assets/images/gestures/pointer-action-visualisation.png and /dev/null differ
diff --git a/docs/session-inspector/assets/images/gestures/pointer-action-visualization.png b/docs/session-inspector/assets/images/gestures/pointer-action-visualization.png
new file mode 100644
index 0000000000..3740ffca1d
Binary files /dev/null and b/docs/session-inspector/assets/images/gestures/pointer-action-visualization.png differ
diff --git a/docs/session-inspector/assets/images/gestures/pointer-down-action.png b/docs/session-inspector/assets/images/gestures/pointer-down-action.png
index 0c331c25c2..66326475dc 100644
Binary files a/docs/session-inspector/assets/images/gestures/pointer-down-action.png and b/docs/session-inspector/assets/images/gestures/pointer-down-action.png differ
diff --git a/docs/session-inspector/assets/images/gestures/three-pointers.png b/docs/session-inspector/assets/images/gestures/three-pointers.png
new file mode 100644
index 0000000000..82c99031c5
Binary files /dev/null and b/docs/session-inspector/assets/images/gestures/three-pointers.png differ
diff --git a/docs/session-inspector/assets/images/gestures/two-pointers.png b/docs/session-inspector/assets/images/gestures/two-pointers.png
deleted file mode 100644
index 52b17534e6..0000000000
Binary files a/docs/session-inspector/assets/images/gestures/two-pointers.png and /dev/null differ
diff --git a/docs/session-inspector/assets/images/header/app-header.png b/docs/session-inspector/assets/images/header/app-header.png
index 17072d211f..dd207f9df3 100644
Binary files a/docs/session-inspector/assets/images/header/app-header.png and b/docs/session-inspector/assets/images/header/app-header.png differ
diff --git a/docs/session-inspector/assets/images/header/context-group.png b/docs/session-inspector/assets/images/header/context-group.png
index b96eb5f4ec..d7689862af 100644
Binary files a/docs/session-inspector/assets/images/header/context-group.png and b/docs/session-inspector/assets/images/header/context-group.png differ
diff --git a/docs/session-inspector/assets/images/header/detach-button.png b/docs/session-inspector/assets/images/header/detach-button.png
new file mode 100644
index 0000000000..10ce1194c8
Binary files /dev/null and b/docs/session-inspector/assets/images/header/detach-button.png differ
diff --git a/docs/session-inspector/assets/images/header/multi-display-button.png b/docs/session-inspector/assets/images/header/multi-display-button.png
new file mode 100644
index 0000000000..8814b507a4
Binary files /dev/null and b/docs/session-inspector/assets/images/header/multi-display-button.png differ
diff --git a/docs/session-inspector/assets/images/header/multi-display-dropdown.png b/docs/session-inspector/assets/images/header/multi-display-dropdown.png
new file mode 100644
index 0000000000..9bb28696b3
Binary files /dev/null and b/docs/session-inspector/assets/images/header/multi-display-dropdown.png differ
diff --git a/docs/session-inspector/assets/images/header/multiple-contexts.png b/docs/session-inspector/assets/images/header/multiple-contexts.png
index 7562369e14..84946fd06f 100644
Binary files a/docs/session-inspector/assets/images/header/multiple-contexts.png and b/docs/session-inspector/assets/images/header/multiple-contexts.png differ
diff --git a/docs/session-inspector/assets/images/header/no-additional-contexts.png b/docs/session-inspector/assets/images/header/no-additional-contexts.png
index a2fbcb13dd..d77ced55a1 100644
Binary files a/docs/session-inspector/assets/images/header/no-additional-contexts.png and b/docs/session-inspector/assets/images/header/no-additional-contexts.png differ
diff --git a/docs/session-inspector/assets/images/header/quit-button.png b/docs/session-inspector/assets/images/header/quit-button.png
index 8b0174c6ba..fde7625cef 100644
Binary files a/docs/session-inspector/assets/images/header/quit-button.png and b/docs/session-inspector/assets/images/header/quit-button.png differ
diff --git a/docs/session-inspector/assets/images/header/record-start-button.png b/docs/session-inspector/assets/images/header/record-start-button.png
index 2d79a54884..57fe3dc44d 100644
Binary files a/docs/session-inspector/assets/images/header/record-start-button.png and b/docs/session-inspector/assets/images/header/record-start-button.png differ
diff --git a/docs/session-inspector/assets/images/header/record-stop-button.png b/docs/session-inspector/assets/images/header/record-stop-button.png
index 55fa6e767f..44e1b1950d 100644
Binary files a/docs/session-inspector/assets/images/header/record-stop-button.png and b/docs/session-inspector/assets/images/header/record-stop-button.png differ
diff --git a/docs/session-inspector/assets/images/header/refresh-button.png b/docs/session-inspector/assets/images/header/refresh-button.png
index 01738af6e9..7fa4760d08 100644
Binary files a/docs/session-inspector/assets/images/header/refresh-button.png and b/docs/session-inspector/assets/images/header/refresh-button.png differ
diff --git a/docs/session-inspector/assets/images/header/refresh-source-pause.png b/docs/session-inspector/assets/images/header/refresh-source-pause.png
index 4c3f17167f..bcab1a29e5 100644
Binary files a/docs/session-inspector/assets/images/header/refresh-source-pause.png and b/docs/session-inspector/assets/images/header/refresh-source-pause.png differ
diff --git a/docs/session-inspector/assets/images/header/refresh-source-resume.png b/docs/session-inspector/assets/images/header/refresh-source-resume.png
index 9c6615c76f..aa3812d34f 100644
Binary files a/docs/session-inspector/assets/images/header/refresh-source-resume.png and b/docs/session-inspector/assets/images/header/refresh-source-resume.png differ
diff --git a/docs/session-inspector/assets/images/header/reload-on-disconnect-button.png b/docs/session-inspector/assets/images/header/reload-on-disconnect-button.png
new file mode 100644
index 0000000000..3cbe66383c
Binary files /dev/null and b/docs/session-inspector/assets/images/header/reload-on-disconnect-button.png differ
diff --git a/docs/session-inspector/assets/images/header/search-button.png b/docs/session-inspector/assets/images/header/search-button.png
index cbc0f98f57..d2e9c57cf8 100644
Binary files a/docs/session-inspector/assets/images/header/search-button.png and b/docs/session-inspector/assets/images/header/search-button.png differ
diff --git a/docs/session-inspector/assets/images/header/search-inputs.png b/docs/session-inspector/assets/images/header/search-inputs.png
index 0fe9ac46d3..e0aebe490f 100644
Binary files a/docs/session-inspector/assets/images/header/search-inputs.png and b/docs/session-inspector/assets/images/header/search-inputs.png differ
diff --git a/docs/session-inspector/assets/images/header/search-results.png b/docs/session-inspector/assets/images/header/search-results.png
index f7bc5f0bb7..2718561bbe 100644
Binary files a/docs/session-inspector/assets/images/header/search-results.png and b/docs/session-inspector/assets/images/header/search-results.png differ
diff --git a/docs/session-inspector/assets/images/header/search-reveal-element.png b/docs/session-inspector/assets/images/header/search-reveal-element.png
index 02bf738f6e..62d7d7bf44 100644
Binary files a/docs/session-inspector/assets/images/header/search-reveal-element.png and b/docs/session-inspector/assets/images/header/search-reveal-element.png differ
diff --git a/docs/session-inspector/assets/images/header/search-send-clear-element-text.png b/docs/session-inspector/assets/images/header/search-send-clear-element-text.png
index 1509fae62b..56e5ebcf0b 100644
Binary files a/docs/session-inspector/assets/images/header/search-send-clear-element-text.png and b/docs/session-inspector/assets/images/header/search-send-clear-element-text.png differ
diff --git a/docs/session-inspector/assets/images/header/search-tap-element.png b/docs/session-inspector/assets/images/header/search-tap-element.png
index 52f1ad42bb..464b4ee493 100644
Binary files a/docs/session-inspector/assets/images/header/search-tap-element.png and b/docs/session-inspector/assets/images/header/search-tap-element.png differ
diff --git a/docs/session-inspector/assets/images/header/system-buttons-android.png b/docs/session-inspector/assets/images/header/system-buttons-android.png
index 60f80705fe..885ed60385 100644
Binary files a/docs/session-inspector/assets/images/header/system-buttons-android.png and b/docs/session-inspector/assets/images/header/system-buttons-android.png differ
diff --git a/docs/session-inspector/assets/images/header/system-buttons-ios.png b/docs/session-inspector/assets/images/header/system-buttons-ios.png
index 16322cd548..acba26f144 100644
Binary files a/docs/session-inspector/assets/images/header/system-buttons-ios.png and b/docs/session-inspector/assets/images/header/system-buttons-ios.png differ
diff --git a/docs/session-inspector/assets/images/recorder/recorder-tab-buttons.png b/docs/session-inspector/assets/images/recorder/recorder-tab-buttons.png
index 0bb8a25583..f7182198ab 100644
Binary files a/docs/session-inspector/assets/images/recorder/recorder-tab-buttons.png and b/docs/session-inspector/assets/images/recorder/recorder-tab-buttons.png differ
diff --git a/docs/session-inspector/assets/images/recorder/recorder-tab-empty.png b/docs/session-inspector/assets/images/recorder/recorder-tab-empty.png
index fd146b8506..465a0f9de5 100644
Binary files a/docs/session-inspector/assets/images/recorder/recorder-tab-empty.png and b/docs/session-inspector/assets/images/recorder/recorder-tab-empty.png differ
diff --git a/docs/session-inspector/assets/images/recorder/recorder-tab-filled.png b/docs/session-inspector/assets/images/recorder/recorder-tab-filled.png
index b4abf8f965..a8f67322d6 100644
Binary files a/docs/session-inspector/assets/images/recorder/recorder-tab-filled.png and b/docs/session-inspector/assets/images/recorder/recorder-tab-filled.png differ
diff --git a/docs/session-inspector/assets/images/recorder/recorder-tab-language.png b/docs/session-inspector/assets/images/recorder/recorder-tab-language.png
index 07ca9bd85c..d31e528f6a 100644
Binary files a/docs/session-inspector/assets/images/recorder/recorder-tab-language.png and b/docs/session-inspector/assets/images/recorder/recorder-tab-language.png differ
diff --git a/docs/session-inspector/assets/images/screenshot/app-screenshot-highlighters.png b/docs/session-inspector/assets/images/screenshot/app-screenshot-highlighters.png
index f347f1f0db..63af38ebae 100644
Binary files a/docs/session-inspector/assets/images/screenshot/app-screenshot-highlighters.png and b/docs/session-inspector/assets/images/screenshot/app-screenshot-highlighters.png differ
diff --git a/docs/session-inspector/assets/images/screenshot/app-screenshot-landscape.png b/docs/session-inspector/assets/images/screenshot/app-screenshot-landscape.png
index f39b4a3398..b5ac7d5cac 100644
Binary files a/docs/session-inspector/assets/images/screenshot/app-screenshot-landscape.png and b/docs/session-inspector/assets/images/screenshot/app-screenshot-landscape.png differ
diff --git a/docs/session-inspector/assets/images/screenshot/app-screenshot.png b/docs/session-inspector/assets/images/screenshot/app-screenshot.png
index 1457c91d6c..3756c4cd1c 100644
Binary files a/docs/session-inspector/assets/images/screenshot/app-screenshot.png and b/docs/session-inspector/assets/images/screenshot/app-screenshot.png differ
diff --git a/docs/session-inspector/assets/images/screenshot/download-screenshot-button.png b/docs/session-inspector/assets/images/screenshot/download-screenshot-button.png
index 5fec49d533..ea3df4d042 100644
Binary files a/docs/session-inspector/assets/images/screenshot/download-screenshot-button.png and b/docs/session-inspector/assets/images/screenshot/download-screenshot-button.png differ
diff --git a/docs/session-inspector/assets/images/screenshot/expanded-group-handle.png b/docs/session-inspector/assets/images/screenshot/expanded-group-handle.png
index ae12010c3a..7e0c7fd5bc 100644
Binary files a/docs/session-inspector/assets/images/screenshot/expanded-group-handle.png and b/docs/session-inspector/assets/images/screenshot/expanded-group-handle.png differ
diff --git a/docs/session-inspector/assets/images/screenshot/interaction-mode-buttons.png b/docs/session-inspector/assets/images/screenshot/interaction-mode-buttons.png
index 28a9a28ec5..adef6803c3 100644
Binary files a/docs/session-inspector/assets/images/screenshot/interaction-mode-buttons.png and b/docs/session-inspector/assets/images/screenshot/interaction-mode-buttons.png differ
diff --git a/docs/session-inspector/assets/images/screenshot/screenshot-origin-buttons.png b/docs/session-inspector/assets/images/screenshot/screenshot-origin-buttons.png
new file mode 100644
index 0000000000..7b21b0bd1e
Binary files /dev/null and b/docs/session-inspector/assets/images/screenshot/screenshot-origin-buttons.png differ
diff --git a/docs/session-inspector/assets/images/screenshot/toggle-element-handles-button.png b/docs/session-inspector/assets/images/screenshot/toggle-element-handles-button.png
index 0df7c3b661..fc88a19983 100644
Binary files a/docs/session-inspector/assets/images/screenshot/toggle-element-handles-button.png and b/docs/session-inspector/assets/images/screenshot/toggle-element-handles-button.png differ
diff --git a/docs/session-inspector/assets/images/session-info/sesion-overall-info.png b/docs/session-inspector/assets/images/session-info/sesion-overall-info.png
deleted file mode 100644
index 963e095249..0000000000
Binary files a/docs/session-inspector/assets/images/session-info/sesion-overall-info.png and /dev/null differ
diff --git a/docs/session-inspector/assets/images/session-info/session-boilerplate.png b/docs/session-inspector/assets/images/session-info/session-boilerplate.png
index 794aff5fea..981e87905c 100644
Binary files a/docs/session-inspector/assets/images/session-info/session-boilerplate.png and b/docs/session-inspector/assets/images/session-info/session-boilerplate.png differ
diff --git a/docs/session-inspector/assets/images/session-info/session-info-tab.png b/docs/session-inspector/assets/images/session-info/session-info-tab.png
index a4fb15531a..f7f58d25ec 100644
Binary files a/docs/session-inspector/assets/images/session-info/session-info-tab.png and b/docs/session-inspector/assets/images/session-info/session-info-tab.png differ
diff --git a/docs/session-inspector/assets/images/session-info/session-overall-info.png b/docs/session-inspector/assets/images/session-info/session-overall-info.png
new file mode 100644
index 0000000000..d23b9c1ef1
Binary files /dev/null and b/docs/session-inspector/assets/images/session-info/session-overall-info.png differ
diff --git a/docs/session-inspector/assets/images/source/app-source-expanded.png b/docs/session-inspector/assets/images/source/app-source-expanded.png
deleted file mode 100644
index c39513cef3..0000000000
Binary files a/docs/session-inspector/assets/images/source/app-source-expanded.png and /dev/null differ
diff --git a/docs/session-inspector/assets/images/source/app-source.png b/docs/session-inspector/assets/images/source/app-source.png
index 07c9c45d93..19ce6979c9 100644
Binary files a/docs/session-inspector/assets/images/source/app-source.png and b/docs/session-inspector/assets/images/source/app-source.png differ
diff --git a/docs/session-inspector/assets/images/source/box-model.png b/docs/session-inspector/assets/images/source/box-model.png
new file mode 100644
index 0000000000..b9ff9a8f6f
Binary files /dev/null and b/docs/session-inspector/assets/images/source/box-model.png differ
diff --git a/docs/session-inspector/assets/images/source/collapse-all-button.png b/docs/session-inspector/assets/images/source/collapse-all-button.png
new file mode 100644
index 0000000000..0872a15e48
Binary files /dev/null and b/docs/session-inspector/assets/images/source/collapse-all-button.png differ
diff --git a/docs/session-inspector/assets/images/source/copy-attributes.png b/docs/session-inspector/assets/images/source/copy-attributes.png
deleted file mode 100644
index 5616ceabc6..0000000000
Binary files a/docs/session-inspector/assets/images/source/copy-attributes.png and /dev/null differ
diff --git a/docs/session-inspector/assets/images/source/copy-button.png b/docs/session-inspector/assets/images/source/copy-button.png
new file mode 100644
index 0000000000..c772e06e2e
Binary files /dev/null and b/docs/session-inspector/assets/images/source/copy-button.png differ
diff --git a/docs/session-inspector/assets/images/source/copy-xml-button.png b/docs/session-inspector/assets/images/source/copy-xml-button.png
deleted file mode 100644
index 07f794f061..0000000000
Binary files a/docs/session-inspector/assets/images/source/copy-xml-button.png and /dev/null differ
diff --git a/docs/session-inspector/assets/images/source/download-button.png b/docs/session-inspector/assets/images/source/download-button.png
new file mode 100644
index 0000000000..18da6257e7
Binary files /dev/null and b/docs/session-inspector/assets/images/source/download-button.png differ
diff --git a/docs/session-inspector/assets/images/source/download-xml-button.png b/docs/session-inspector/assets/images/source/download-xml-button.png
deleted file mode 100644
index adb0921929..0000000000
Binary files a/docs/session-inspector/assets/images/source/download-xml-button.png and /dev/null differ
diff --git a/docs/session-inspector/assets/images/source/get-timings-button.png b/docs/session-inspector/assets/images/source/get-timings-button.png
new file mode 100644
index 0000000000..f2cd6790e3
Binary files /dev/null and b/docs/session-inspector/assets/images/source/get-timings-button.png differ
diff --git a/docs/session-inspector/assets/images/source/get-timings.png b/docs/session-inspector/assets/images/source/get-timings.png
deleted file mode 100644
index 0a94f623aa..0000000000
Binary files a/docs/session-inspector/assets/images/source/get-timings.png and /dev/null differ
diff --git a/docs/session-inspector/assets/images/source/search-source.png b/docs/session-inspector/assets/images/source/search-source.png
new file mode 100644
index 0000000000..eb437b23ce
Binary files /dev/null and b/docs/session-inspector/assets/images/source/search-source.png differ
diff --git a/docs/session-inspector/assets/images/source/selected-element.png b/docs/session-inspector/assets/images/source/selected-element.png
index 2729fb0ac8..30e68abdb5 100644
Binary files a/docs/session-inspector/assets/images/source/selected-element.png and b/docs/session-inspector/assets/images/source/selected-element.png differ
diff --git a/docs/session-inspector/assets/images/source/source-tab.png b/docs/session-inspector/assets/images/source/source-tab.png
index e13f677306..145a37fa2c 100644
Binary files a/docs/session-inspector/assets/images/source/source-tab.png and b/docs/session-inspector/assets/images/source/source-tab.png differ
diff --git a/docs/session-inspector/assets/images/source/timing-values.png b/docs/session-inspector/assets/images/source/timing-values.png
index ded904d125..86317cbde5 100644
Binary files a/docs/session-inspector/assets/images/source/timing-values.png and b/docs/session-inspector/assets/images/source/timing-values.png differ
diff --git a/docs/session-inspector/assets/images/source/toggle-attributes-button.png b/docs/session-inspector/assets/images/source/toggle-attributes-button.png
index 30c11e0840..2c6624f31a 100644
Binary files a/docs/session-inspector/assets/images/source/toggle-attributes-button.png and b/docs/session-inspector/assets/images/source/toggle-attributes-button.png differ
diff --git a/docs/session-inspector/commands.md b/docs/session-inspector/commands.md
index ec021c84cb..882d5582e6 100644
--- a/docs/session-inspector/commands.md
+++ b/docs/session-inspector/commands.md
@@ -1,40 +1,81 @@
---
-hide:
- - toc
-
title: Commands Tab
---
-The Commands tab provides a way to execute various Appium driver commands through the Inspector GUI.
+The Commands tab provides a way to run various Appium driver commands and
+[execute methods](https://appium.io/docs/en/latest/guides/execute-methods/) through the
+Inspector GUI.

-All commands are grouped into various categories. Opening any category shows several buttons, each
-of which corresponds to an Appium driver command.
+The list of available commands and execute methods is tied to the active Appium driver: all drivers
+support a set of [common protocol commands](https://appium.io/docs/en/latest/reference/api/),
+but they can also define their own commands and execute methods. The Inspector retrieves all of
+these commands/methods from the driver itself, and adjusts the list accordingly.
-
+Appium _plugins_ may also define their own commands and execute methods. If such plugins are
+active during an Inspector session, their commands/methods are also included in the Commands tab.
-!!! note
+Note that there are two important limitations to this approach:
- Commands may be driver-specific, in which case their buttons may not be visible when using
- other drivers.
+- The Commands sub-tab ^^**only lists the commands supported by [the WebdriverIO client](https://webdriver.io/).**^^
+ Under the hood, the Inspector uses WebdriverIO to run all commands, therefore any command that is
+ not defined in WebdriverIO (for example, any custom third-party driver command) will not work. Due
+ to this, the Inspector simply filters out all such commands from the Commands list. This limitation
+ does not apply to execute methods.
-The available buttons may correspond to commands without parameters, and commands with parameters:
+- ^^**Appium `2.16.0` or later is required.**^^ For older Appium versions, a predefined list of
+ commands is shown instead. Please be aware that not all commands in the predefined list are
+ compatible with all drivers.
-- For a command without parameters, clicking its button will execute the command
-- For a command with parameters, clicking its button will open the parameter popup:
+## Navigation
- 
+The top of the Commands tab includes two sub-tabs, which can be used to switch between the
+supported commands and execute methods. Since these lists can be lengthy, a search bar is also
+available, which can be used to filter both sub-tabs simultaneously.
+
+
+
+## Command Properties
+
+Commands and execute methods may have additional properties specified by their driver/plugin:
+
+- They may be marked as deprecated, in which case they are shown with a yellow-tinted background.
+ Check the driver/plugin documentation for more details on these commands.
+
+ 
+
+- They may include additional information, which is shown upon mouseover:
+
+ 
-Some commands may require special conditions (e.g. they are only supported in simulators). This
-additional information, if present, is shown as follows:
+- They may support additional parameters, and clicking on them will open the parameters popup.
+ Parameters can be either required or optional.
-- For a command without parameters, this is shown by hovering over the button
-- For a command with parameters, this is listed inside the parameter popup
+ 
+
+## Command Result
-Regardless of the command type, once it is run and its execution finishes, a new popup will show the
-result returned by the command.
+Upon finishing execution, any command or execute method will always trigger a new popup with the
+command result:

-Depending on the command, it may also trigger a refresh for the application screenshot and source.
+The popup also has several buttons for interacting with the result:
+
+### Toggle Table Formatting
+
+
+
+Formats the result as a table, which provides sorting and filtering capabilities. Filters are not
+shown for array or object values. Clicking on the contents of any table cell allows copying them to
+the clipboard.
+
+This button is enabled only if the command/method result is an array or object. While this button
+is toggled on, the Copy Result button is disabled.
+
+### Copy Result
+
+
+
+Copies the result to the clipboard. Disabled while table formatting is active.
diff --git a/docs/session-inspector/gestures.md b/docs/session-inspector/gestures.md
index 64180f6d9e..5a402b57e4 100644
--- a/docs/session-inspector/gestures.md
+++ b/docs/session-inspector/gestures.md
@@ -9,17 +9,21 @@ tab shows the Saved Gestures screen.
## Saved Gestures
-The default saved gestures list is empty, but can be populated by creating and saving new gestures.
-This can be done by pressing the `+` button in the bottom left, which will open the
-[Gesture Builder](#gesture-builder) screen.
+The default saved gestures list is empty, but can be populated using either of the two buttons at
+the bottom of the list:
-Once a gesture has been created and saved, clicking its entry in the saved gestures list will show
-its expected actions as an overlay over the [screenshot](./screenshot.md). There are also 3 buttons
-for each gesture:
+- Clicking `Create New Gesture` will open the [Gesture Builder](#gesture-builder) screen
+- Clicking `Import from File` will open a file browser window, allowing to upload previously
+ exported gesture JSON files. Multiple files can be imported at the same time.
-- Execute the gesture
-- Edit the gesture (will open it in the [Gesture Builder](#gesture-builder))
-- Delete the gesture
+Once a gesture has been created and saved, hovering over its entry in the saved gestures list will
+show its actions as an overlay over the [screenshot](./screenshot.md). There are also 4
+buttons for each gesture:
+
+- Execute the gesture
+- Edit the gesture (will open it in the [Gesture Builder](#gesture-builder))
+- Export the gesture as a JSON file
+- Delete the gesture
## Gesture Builder
@@ -32,10 +36,10 @@ while the gesture builder is opened.
The builder screen can be divided into 4 parts:
-- Header
-- Gesture timeline
-- Pointer tabs
-- Pointer actions
+- Header
+- Gesture timeline
+- Pointer tabs
+- Pointer actions
### Header
@@ -43,18 +47,18 @@ The header lists general gesture information, settings, and actions.

-- The gesture title and description can be clicked and edited
-- The 2-button group allows to set the X/Y coordinate units used for [Move pointer actions](#move):
- either the default relative (percentage) or absolute (pixels)
-- The _Play_ button executes the gesture
-- The _Save As_ button allows to save the gesture using the specified gesture title
-- The _Save_ button is only enabled when editing an existing gesture, and it overwrites the previously
- saved gesture details with the current ones
+- The gesture title and description can be clicked and edited
+- The 2-button group allows to set the X/Y coordinate units used for [Move pointer actions](#move):
+ either the default relative (percentage) or absolute (pixels)
+- The _Play_ button executes the gesture
+- The _Save As_ button allows to save the gesture using the specified gesture title
+- The _Save_ button is only enabled when editing an existing gesture, and it overwrites the previously
+ saved gesture details with the current ones
### Gesture Timeline
-When creating a new gesture, a red circle with a questionmark is shown right below the gesture
-description. This is the gesture timeline.
+When creating a new gesture, a red questionmark is shown right below the gesture description. This
+is the gesture timeline.

@@ -82,7 +86,7 @@ When creating a new gesture, only one pointer is added by default, but it is pos
5 pointers in the same gesture! Each pointer is underlined with its unique colour, and appears as a
separate row in the [gesture timeline](#gesture-timeline).
-
+
The title of each pointer can also be clicked and edited.
@@ -99,7 +103,7 @@ pointer up, or pause. Each action requires different parameters.
Valid combinations of move/pointer down/pointer up actions will automatically be reflected on the
[screenshot](./screenshot.md), showing the exact behavior of the gesture.
-
+
#### Move
diff --git a/docs/session-inspector/header.md b/docs/session-inspector/header.md
index 85c07cb171..aaed222185 100644
--- a/docs/session-inspector/header.md
+++ b/docs/session-inspector/header.md
@@ -14,16 +14,39 @@ the system buttons, which simulate the equivalent Android or iOS system function
 
-- Android: back / home / app switcher
-- iOS: home / Siri
- - The Siri button will open a prompt for input text, which will be used as the Siri command.
- Please note that the command will not work if Siri is disabled.
+- Android: back / home / app switcher
+- iOS: home / Siri
+ - The Siri button will open a prompt for input text, which will be used as the Siri command.
+ Please note that the command will not work if Siri is disabled.
+
+## Display Switcher
+
+!!! note
+
+ This functionality is only supported for the UiAutomator2 driver `6.6.0`+, on devices
+ running Android 11 or newer.
+
+
+
+The display switcher allows selecting the currently active device display. Pressing the
+multi-display button will trigger discovery of available displays, and a new dropdown will be
+created, listing all discovered displays.
+
+
+
+Selecting a different display in the dropdown will automatically switch the screenshot and app
+source to those of the new display. Most screenshot and element interactions will work as normal,
+though some functionality will still only target the default display (such as device system buttons
+and MJPEG screenshot stream).
+
+Pressing the multi-display button while multi-display mode is active will switch to the default
+display and hide the dropdown.
## Context Switcher

-The context switcher button group allows to change to a
+The context switcher button group allows changing to a
[different application context](https://appium.io/docs/en/latest/guides/context/). By default, the
Inspector works in _native mode_, and makes no attempts to discover other contexts. Pressing the
globe icon will switch to _hybrid mode_, and the Inspector will start the context discovery process.
@@ -52,7 +75,7 @@ The current context can now be switched by selecting the new context in the drop
!!! info
This button is only visible when using MJPEG screenshotting capabilities like
- `appium:mjpegServerUrl`.
+ `appium:mjpegServerPort`.
This button allows to disable or re-enable refreshing the application XML source, when executing
actions that normally trigger a refresh (these are listed in the [Source tab page](./source.md#refreshing-the-source)).
@@ -107,10 +130,10 @@ and translate them into code that can be used with various [Appium clients](http
Interactions that can be recorded include:
-- Actions for a specific element (tap/send keys/clear)
-- Generic tap/swipe actions on the application screenshot
-- [Mobile device system actions](#device-system-buttons)
-- [Driver commands](./commands.md)
+- Actions for a specific element (tap/send keys/clear)
+- Generic tap/swipe actions on the application screenshot
+- [Mobile device system actions](#device-system-buttons)
+- [Driver commands](./commands.md)
!!! note
@@ -119,8 +142,28 @@ Interactions that can be recorded include:
While recording is enabled, the [Recorder tab](./recorder.md) contents are automatically populated
with Appium client code for all supported interactions.
+## Reload on Disconnect
+
+
+
+This button controls the ability to automatically reload the session if the device under test
+temporarily disconnects. The session reload is triggered upon any interaction with the Appium
+session (selecting an element, interacting with the screenshot, searching for elements, etc.)
+that returns a failed response. Since such a response is not guaranteed to be caused by a
+disconnected device, this functionality is disabled by default.
+
+## Detach from Session
+
+
+
+This button disconnects the Inspector from the active session and returns to the
+[Session Builder](../session-builder/index.md), but the session itself ^^is not deleted^^, and
+^^remains running^^ on the Appium server. This approach may be useful if you are attaching to an
+existing session mid-test and want to resume the test afterwards, or if you want to reuse the
+session later.
+
## Quit Session

-This button quits the Inspector session and returns to the [Session Builder](../session-builder/index.md).
+This button deletes the active session and returns to the Session Builder.
diff --git a/docs/session-inspector/index.md b/docs/session-inspector/index.md
index 9ea3c2f684..706d849555 100644
--- a/docs/session-inspector/index.md
+++ b/docs/session-inspector/index.md
@@ -12,10 +12,10 @@ of the Inspector's functionality.
The user interface here can be divided into several groups:
-- [Header (buttons and more)](./header.md)
-- [The Screenshot panel](./screenshot.md)
-- [Source tab](./source.md)
-- [Commands tab](./commands.md)
-- [Gestures tab](./gestures.md)
-- [Recorder tab](./recorder.md)
-- [Session Information tab](./session-info.md)
+- [Header (buttons and more)](./header.md)
+- [The Screenshot panel](./screenshot.md)
+- [Source tab](./source.md)
+- [Commands tab](./commands.md)
+- [Gestures tab](./gestures.md)
+- [Recorder tab](./recorder.md)
+- [Session Information tab](./session-info.md)
diff --git a/docs/session-inspector/recorder.md b/docs/session-inspector/recorder.md
index 84e83e46e4..0ab5518414 100644
--- a/docs/session-inspector/recorder.md
+++ b/docs/session-inspector/recorder.md
@@ -19,7 +19,7 @@ interactions that can be recorded.
!!! tip
- The recording of Inspector actions does not require the Recorder tab to remain opened.
+ The Recorder tab does not need to remain opened in order to record actions.
Once recording is enabled and a few actions are recorded, the tab contents are populated with the
generated code.
@@ -34,8 +34,8 @@ There are also a few management buttons shown next to the language dropdown:

-- The boilerplate toggle button allows showing or hiding additional boilerplate code. This code is
- also shown in the [Session Information tab](./session-info.md#session-boilerplate).
-- The copy button copies the currently recorded code to the clipboard. If enabled, boilerplate code
- is copied as well.
-- The clear button deletes all the currently recorded code. Note that the recording state is not changed.
+- The boilerplate toggle button allows showing or hiding additional boilerplate code. This code is
+ also shown in the [Session Information tab](./session-info.md#session-boilerplate).
+- The copy button copies the currently recorded code to the clipboard. If enabled, boilerplate code
+ is copied as well.
+- The clear button deletes all the currently recorded code. Note that the recording state is not changed.
diff --git a/docs/session-inspector/screenshot.md b/docs/session-inspector/screenshot.md
index 41503c88cc..78789ab57f 100644
--- a/docs/session-inspector/screenshot.md
+++ b/docs/session-inspector/screenshot.md
@@ -32,14 +32,26 @@ by using MJPEG session capabilities, such as `appium:mjpegServerPort`.
## Screenshot Panel Header
-The panel header contains several interface elements that allow interacting with the screenshot in
-various ways.
+The panel header contains several buttons for interacting with the screenshot.
-### Element Handles Toggle
+### Screenshot Origin
+
+
+
+!!! info
+
+ These buttons are only shown when using MJPEG screenshotting capabilities like
+ `appium:mjpegServerPort`.
+
+The Screenshot Origin buttons allow switching the source of the rendered screenshot between the
+MJPEG stream and the W3C WebDriver screenshot endpoint. This functionality can be useful in case
+the MJPEG server is unreachable or has other issues.
+
+### Toggle Element Handles

-This switch toggles the visibility of highlighter handles for all identified elements.
+This button toggles the visibility of highlighter handles for all identified elements.
!!! info
@@ -68,11 +80,11 @@ Mode. The differences are as follows:
### Download Screenshot
-
+
!!! info
- This button is not visible when using MJPEG screenshotting capabilities like
- `appium:mjpegServerUrl`.
+ This button is disabled when using MJPEG screenshotting capabilities like
+ `appium:mjpegServerPort`.
This button allows to save the currently shown screenshot to your computer as a `.PNG` file.
diff --git a/docs/session-inspector/session-info.md b/docs/session-inspector/session-info.md
index 5356002406..3a9eb246f5 100644
--- a/docs/session-inspector/session-info.md
+++ b/docs/session-inspector/session-info.md
@@ -11,9 +11,9 @@ at the bottom.
## Informational Tables
-
+
-These tables provide general information about the session, such as its ID, URL, server details,
+These tables provide general information about the session, such as its URL, server details,
capabilities, and so on. The _Server Details_ and _Session Details_ sub-tables can be scrolled for
further information.
diff --git a/docs/session-inspector/source.md b/docs/session-inspector/source.md
index 62c301a308..e59d49e01d 100644
--- a/docs/session-inspector/source.md
+++ b/docs/session-inspector/source.md
@@ -3,28 +3,51 @@ title: Source Tab
---
The Source tab is the default tab opened after starting an Inspector session. It can be divided into
-two connected parts: the Application Source panel, and the Selected Element panel.
+two connected parts: the Application Source panel, and the Selected Element panel (only shown if an
+element is selected).

+The divider line in the middle of the tab can be used to adjust the widths of both halves of this
+tab, as well as collapse/expand them.
+
## Application Source
-The Application Source is the central panel of the Source Tab. It shows the application source XML
-in a tree-like structure, and provides a few additional buttons in the top right corner.
+The Application Source is the central panel of the Source Tab, and shows the application source XML
+in a tree-like structure.

-The application source tree is generated from the XML data returned by the Appium driver. By
-default, the tree only shows the class name for each element entry, along with several 'important'
-attributes such as `value` and `content-desc`. All non-'important' attributes are hidden by default
-for ease of navigation, but can be revealed with the [Toggle Attributes button](#toggle-attributes-button).
+The panel can be divided into 3 parts: header buttons, source actions, and the source tree.
+
+### Source Header Buttons
+
+| Icon | Description |
+| ------------------------------------------------------------------ | ----------------------------------------- |
+|  | Copy the application XML to the clipboard |
+|  | Download the source as an `.xml` file |
+
+### Source Action Buttons
+
+| Icon | Description |
+| -------------------------------------------------------------------------------- | --------------------------------------------- |
+|  | Collapse all nodes in the source tree |
+|  | Toggle all non-'important' element attributes |
+|  | Perform a plaintext search in the source XML |
+
+### Source Tree
+
+The application source tree is generated from the XML data returned by the Appium driver. By default,
+the tree only shows the class name for each element entry, along with several 'important' attributes
+such as `value` and `content-desc`. All non-'important' attributes are hidden by default for ease of
+navigation, but can be revealed with the [Toggle Attributes button](#source-action-buttons).
All elements in the XML tree are interactable, and clicking on one causes 3 actions:
-- The element entry in the XML tree is highlighted
-- The element highlighter appears in the [Screenshot panel](./screenshot.md) (if
- [Element Mode](./screenshot.md#interaction-mode) is selected)
-- The element details are shown in the [Selected Element panel](#selected-element)
+- The element entry in the XML tree is highlighted
+- The element highlighter appears in the [Screenshot panel](./screenshot.md) (if
+ [Element Mode](./screenshot.md#interaction-mode) is selected)
+- The element details are shown in the [Selected Element panel](#selected-element)
Elements that have one or more child elements have an arrow on their left side, which can be clicked
to toggle visibility of such child elements.
@@ -36,12 +59,12 @@ For supported Appium drivers, the maximum depth of the returned XML tree can be
By default, the source XML is only updated when a refresh is requested. This can happen when:
-- interacting with an element (tap/send keys/clear)
-- interacting with the [screenshot](./screenshot.md) (tap/swipe)
-- [simulating system actions](./header.md#device-system-buttons)
-- [executing driver commands](./commands.md) (depends on the command)
-- [executing custom gestures](./gestures.md)
-- [pressing the Refresh button](./header.md#refresh-source-screenshot)
+- interacting with an element (tap/send keys/clear)
+- interacting with the [screenshot](./screenshot.md) (tap/swipe)
+- [simulating system actions](./header.md#device-system-buttons)
+- [executing driver commands](./commands.md) (depends on the command)
+- [executing custom gestures](./gestures.md)
+- [pressing the Refresh button](./header.md#refresh-source-screenshot)
Note that interacting with the application outside of the Inspector will _not_ cause the source XML
to refresh.
@@ -51,41 +74,29 @@ behavior. While the default source refresh behavior in MJPEG mode stays the same
[automatic source refresh button](./header.md#toggle-automatic-source-refresh) in the application
header, which allows to disable automatic refreshing.
-### Toggle Attributes Button
-
-
-
-This button allows to show/hide all non-'important' element attributes in the source tree:
-
-
-
-### Copy XML Button
-
-
-
-This button copies the full application XML source to the clipboard.
-
-### Download XML Button
+## Selected Element
-
+Once any element is selected, the Selected Element panel is shown to the right of the Source tab.
-This button allows to download the full application source as an `.xml` file.
+
-## Selected Element
+An element can be selected in one of the following ways:
-The Selected Element panel is shown on the right side of the Source tab. It is empty by default, but
-becomes populated once an element is selected.
+- Selecting a tree node in the [Application Source](#application-source)
+- Selecting a highlighter in the [Screenshot panel](./screenshot.md)
+- Clicking the [Reveal Element in Source button in the Search Results](./header.md#search-for-element)
-
+Unselecting the element will hide the Selected Element panel.
-In order to populate the panel, an element can be selected in one of the following ways:
+The panel can be divided into 5 parts: header buttons, element action buttons, suggested locators,
+box model, and element attributes.
-- Selecting an entry in the [Application Source](#application-source)
-- Selecting a highlighter in the [Screenshot panel](./screenshot.md)
-- Clicking the [Reveal Element in Source button in the Search Results](./header.md#search-for-element)
+### Element Header Buttons
-The panel can be divided into 3 parts: element action buttons, suggested locators, and element
-attributes.
+| Icon | Description |
+| -------------------------------------------------------------------------- | ------------------------------------------------------------------------ |
+|  | Copy the element attributes to the clipboard as an array of JSON objects |
+|  | Download a screenshot of the element as a `.PNG` file |
### Element Action Buttons
@@ -93,8 +104,7 @@ attributes.
| ---------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------- |
|  | Tap the element |
|  | Enter text to send to the element, or clear its text |
-|  | Copy the element attributes to the clipboard as an array of JSON objects |
-|  | Run a timing comparison for the [suggested element locators](#suggested-locators) |
+|  | Run a timing comparison for the [suggested element locators](#suggested-locators) |
### Suggested Locators
@@ -107,10 +117,18 @@ was returned.

+### Box Model
+
+
+
+The box model provides an easy reference to the element's position and size values. It shows the
+element's width and height, and the exact coordinates for each of its corners, plus its midpoint.
+
### Element Attributes
This table lists all attributes retrieved from the element, along with their values. Clicking on a
value copies it to the clipboard.
-Refer to your [Appium driver](https://appium.io/docs/en/latest/ecosystem/drivers/) documentation for
-ways to customize the attributes shown in this table.
+Depending on your [Appium driver](https://appium.io/docs/en/latest/ecosystem/drivers/), you may also
+be able to configure these attributes, for example, by including certain attributes that may be
+hidden by default due to performance reasons. Check your driver documentation for more information.
diff --git a/docs/troubleshooting.md b/docs/troubleshooting.md
index af4de0751e..abd0b7a01a 100644
--- a/docs/troubleshooting.md
+++ b/docs/troubleshooting.md
@@ -11,24 +11,17 @@ This page aims to act as a reference for issues that may be encountered when usi
Please refer to the [Installation guide](./quickstart/installation.md).
-## Auto-updater not working
-
-This is [a known issue](https://github.com/appium/appium-inspector/issues/733) and is planned to be
-fixed in future versions.
-
-## Cannot start a session using browser Inspector
+## Cannot start a session using plugin version
The reason for this issue is [cross-origin resource sharing](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS)
-(CORS). Web browsers have security features which prevent CORS. The browser version of the Inspector
-needs to make requests to the Appium server directly from the browser via JavaScript, but these
-requests are typically not made to the same host (for example, the Inspector is accessed at
-`appiumpro.com`, whereas your local Appium server is `localhost:4723`).
+(CORS). The browser will prevent you from connecting to the Appium server if the base URLs of
+the Inspector and the Appium server do not match (typically `127.0.0.1`).
-In this scenario, you will be unable to start a session, because the browser will prevent it. You
-can resolve this issue by starting your Appium server with the `--allow-cors` flag:
+If you want to access the Inspector using another base URL (such as `localhost`), you can do so by
+adding the `--allow-cors` flag when starting the server:
```
-appium --allow-cors
+appium --use-plugins=inspector --allow-cors
```
This will instruct the server to sent the correct CORS-related headers, and it should be possible to
@@ -39,11 +32,6 @@ create a session.
If you encounter this issue with a cloud provider, the fix must be applied on the provider side,
because they are the ones hosting the Appium server.
-## Browser version does not work in Safari
-
-This is [a known issue](https://github.com/appium/appium-inspector/issues/103). Currently it is
-advised to use Chrome or Firefox instead.
-
## Start Session button is cut off
This problem may appear if your computer screen size is too small. Check the
@@ -55,17 +43,17 @@ This is [a known issue](https://github.com/appium/appium/issues/14825). The prob
Apple's XCTest framework, so unfortunately it cannot be resolved from the Appium side. However,
there are a few suggestions that may help mitigate this:
-- Set [the `snapshotMaxDepth` setting](https://appium.github.io/appium-xcuitest-driver/latest/settings/)
- to `62` (the maximum stable value)
-- Configure [the `pageSourceExcludedAttributes` setting](https://appium.github.io/appium-xcuitest-driver/latest/settings/)
- to exclude some attributes that you may find less relevant (e.g. `"visible,accessible"`)
-- Set [the `customSnapshotTimeout` setting](https://appium.github.io/appium-xcuitest-driver/latest/settings/)
- to a higher value
+- Set [the `snapshotMaxDepth` setting](https://appium.github.io/appium-xcuitest-driver/latest/settings/)
+ to `62` (the maximum stable value)
+- Configure [the `pageSourceExcludedAttributes` setting](https://appium.github.io/appium-xcuitest-driver/latest/settings/)
+ to exclude some attributes that you may find less relevant (e.g. `"visible,accessible"`)
+- Set [the `customSnapshotTimeout` setting](https://appium.github.io/appium-xcuitest-driver/latest/settings/)
+ to a higher value
If these do not help, then the only remaining solution is to work with the app developers to
refactor the application code. Some suggestions from the linked issue thread include:
-- Try to remove unnecessary nesting levels
-- Use the Fabric renderer with [View Flattening](https://reactnative.dev/architecture/view-flattening)
-- Use native stack navigator instead of stack navigator
-- Reduce the amount of view tags/test IDs
+- Try to remove unnecessary nesting levels
+- Use the Fabric renderer with [View Flattening](https://reactnative.dev/architecture/view-flattening)
+- Use native stack navigator instead of stack navigator
+- Reduce the amount of view tags/test IDs
diff --git a/electron-builder.json b/electron-builder.json
new file mode 100644
index 0000000000..5879b7aca9
--- /dev/null
+++ b/electron-builder.json
@@ -0,0 +1,51 @@
+{
+ "productName": "Appium Inspector",
+ "appId": "io.appium.inspector",
+ "asar": true,
+ "directories": {
+ "output": "release"
+ },
+ "files": ["dist/"],
+ "artifactName": "${productName}-${version}-${os}-${arch}.${ext}",
+ "fileAssociations": [
+ {
+ "ext": "appiumsession",
+ "name": "Appium Session",
+ "role": "Editor"
+ }
+ ],
+ "mac": {
+ "category": "public.app-category.developer-tools"
+ },
+ "dmg": {
+ "contents": [
+ {
+ "x": 410,
+ "y": 150,
+ "type": "link",
+ "path": "/Applications"
+ },
+ {
+ "x": 130,
+ "y": 150,
+ "type": "file"
+ }
+ ]
+ },
+ "win": {
+ "target": ["nsis", "zip"]
+ },
+ "nsis": {
+ "allowToChangeInstallationDirectory": true,
+ "oneClick": false
+ },
+ "linux": {
+ "target": ["AppImage", "tar.gz"],
+ "category": "Development"
+ },
+ "publish": {
+ "provider": "github",
+ "owner": "appium",
+ "vPrefixedTagName": true
+ }
+}
diff --git a/electron.vite.config.mjs b/electron.vite.config.mjs
new file mode 100644
index 0000000000..350c8f90c0
--- /dev/null
+++ b/electron.vite.config.mjs
@@ -0,0 +1,55 @@
+import {join} from 'node:path';
+
+import react from '@vitejs/plugin-react';
+import {defineConfig} from 'electron-vite';
+import renderer from 'vite-plugin-electron-renderer';
+
+export default defineConfig({
+ main: {
+ build: {
+ outDir: join(__dirname, 'dist', 'main'),
+ lib: {
+ entry: join(__dirname, 'app', 'electron', 'main', 'main.js'),
+ },
+ },
+ // main process has a few imports from common, so this is needed
+ resolve: {
+ alias: {
+ '#local-polyfills': join(__dirname, 'app', 'electron', 'renderer', 'polyfills'),
+ },
+ },
+ },
+ preload: {
+ build: {
+ outDir: join(__dirname, 'dist', 'preload'),
+ lib: {
+ entry: join(__dirname, 'app', 'electron', 'preload', 'preload.mjs'),
+ },
+ },
+ },
+ renderer: {
+ build: {
+ outDir: join(__dirname, 'dist', 'renderer'),
+ rollupOptions: {
+ input: {
+ main: join(__dirname, 'app', 'common', 'index.html'),
+ splash: join(__dirname, 'app', 'common', 'splash.html'),
+ },
+ },
+ },
+ plugins: [
+ react({
+ babel: {
+ plugins: ['babel-plugin-react-compiler'],
+ },
+ }),
+ renderer(),
+ ],
+ resolve: {
+ alias: {
+ '#local-polyfills': join(__dirname, 'app', 'electron', 'renderer', 'polyfills'),
+ },
+ },
+ root: join(__dirname, 'app', 'common'),
+ },
+});
diff --git a/env/.env-dev.js b/env/.env-dev.js
deleted file mode 100644
index ff8b4c5632..0000000000
--- a/env/.env-dev.js
+++ /dev/null
@@ -1 +0,0 @@
-export default {};
diff --git a/env/.env-nsis.js b/env/.env-nsis.js
deleted file mode 100644
index de107458bf..0000000000
--- a/env/.env-nsis.js
+++ /dev/null
@@ -1,6 +0,0 @@
-/**
- * Env configuration for NSIS target
- */
-module.exports = {
- NO_AUTO_UPDATE: true,
-};
diff --git a/env/.env.js b/env/.env.js
deleted file mode 100644
index 8eaedbbd31..0000000000
--- a/env/.env.js
+++ /dev/null
@@ -1,7 +0,0 @@
-let env = {};
-
-if (process.env.TARGET) {
- env = require(`./.env-${process.env.TARGET}`);
-}
-
-export default env;
diff --git a/eslint.config.mjs b/eslint.config.mjs
new file mode 100644
index 0000000000..def43e703c
--- /dev/null
+++ b/eslint.config.mjs
@@ -0,0 +1,43 @@
+import appiumConfig from '@appium/eslint-config-appium-ts';
+import eslintReact from '@eslint-react/eslint-plugin';
+import {defineConfig, globalIgnores} from 'eslint/config';
+import reactHooks from 'eslint-plugin-react-hooks';
+import simpleImportSortPlugin from 'eslint-plugin-simple-import-sort';
+import globals from 'globals';
+
+export default defineConfig([
+ {
+ files: ['**/*.{js,mjs,cjs,jsx,mjsx,ts,tsx,mtsx}'],
+ languageOptions: {
+ globals: {
+ ...globals.browser,
+ ...globals.node,
+ document: 'readonly',
+ },
+ parserOptions: {
+ ecmaFeatures: {
+ jsx: true,
+ },
+ },
+ },
+ plugins: {
+ 'simple-import-sort': simpleImportSortPlugin,
+ },
+ extends: [appiumConfig, eslintReact.configs.recommended, reactHooks.configs.flat.recommended],
+ settings: {
+ react: {
+ version: 'detect',
+ },
+ 'react-x': {
+ compilationMode: 'all',
+ },
+ },
+ },
+ {
+ rules: {
+ 'simple-import-sort/imports': 'error',
+ 'simple-import-sort/exports': 'error',
+ },
+ },
+ globalIgnores(['**/*.xml', '**/*.html']),
+]);
diff --git a/mkdocs.yml b/mkdocs.yml
index f092192491..c0b2cdc513 100644
--- a/mkdocs.yml
+++ b/mkdocs.yml
@@ -2,7 +2,10 @@ INHERIT: ./node_modules/@appium/docutils/base-mkdocs.yml
site_name: Appium Inspector
repo_url: https://github.com/appium/appium-inspector
repo_name: appium/appium-inspector
-copyright: Copyright © 2012 OpenJS Foundation - Change cookie settings
+copyright: |
+ Copyright OpenJS Foundation and Appium contributors. All rights reserved. The OpenJS Foundation has registered trademarks and uses trademarks. For a list of trademarks of the OpenJS Foundation , please see our Trademark Policy and Trademark List . Trademarks and logos not indicated on the list of OpenJS Foundation trademarks are trademarks™ or registered® trademarks of their respective holders. Use of them does not imply any affiliation with or endorsement by them.
+ The OpenJS Foundation | Terms of Use | Privacy Policy | Bylaws | Code of Conduct | Trademark Policy | Trademark List | Cookie Policy
+ Change cookie settings
site_url: https://appium.github.io/appium-inspector
edit_uri: edit/main/docs
site_description: Appium Inspector Documentation
@@ -35,6 +38,7 @@ nav:
- menu-bar.md
- Session Builder:
- session-builder/index.md
+ - session-builder/app-settings.md
- session-builder/server-details.md
- session-builder/capability-builder.md
- session-builder/saved-capability-sets.md
diff --git a/package-lock.json b/package-lock.json
index 47e0bd0269..166f013795 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,136 +1,137 @@
{
"name": "appium-inspector",
- "version": "2024.2.2",
+ "version": "2026.5.1",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "appium-inspector",
- "version": "2024.2.2",
+ "version": "2026.5.1",
"license": "Apache-2.0",
"dependencies": {
- "@reduxjs/toolkit": "2.2.1",
- "@xmldom/xmldom": "0.8.10",
- "antd": "4.24.15",
- "axios": "1.6.7",
- "bluebird": "3.7.2",
- "cheerio": "1.0.0-rc.10",
- "electron-log": "4.4.8",
- "electron-settings": "4.0.2",
- "electron-updater": "6.1.8",
- "highlight.js": "11.9.0",
- "htmlparser2": "7.2.0",
- "i18next": "23.10.0",
- "i18next-chained-backend": "4.6.2",
- "i18next-fs-backend": "2.3.1",
- "i18next-http-backend": "2.5.0",
- "i18next-localstorage-backend": "4.2.0",
- "lodash": "4.17.21",
- "moment": "2.30.1",
- "react": "18.2.0",
- "react-dom": "18.2.0",
- "react-i18next": "14.0.5",
- "react-icons": "5.0.1",
- "react-redux": "9.1.0",
- "react-router-dom": "6.22.1",
- "semver": "7.6.0",
- "uuid": "9.0.1",
- "web2driver": "3.0.4",
+ "@ant-design/icons": "6.2.5",
+ "@reduxjs/toolkit": "2.12.0",
+ "@tabler/icons-react": "3.44.0",
+ "@wdio/protocols": "9.29.0",
+ "@xmldom/xmldom": "0.9.10",
+ "antd": "6.4.4",
+ "cheerio": "1.2.0",
+ "css.escape": "1.5.1",
+ "dayjs": "1.11.21",
+ "electron-debug": "4.1.0",
+ "electron-settings": "4.0.4",
+ "electron-updater": "6.8.9",
+ "i18next": "26.3.1",
+ "i18next-fs-backend": "2.6.6",
+ "i18next-http-backend": "4.0.0",
+ "ky": "1.14.3",
+ "lodash": "4.18.1",
+ "react": "19.2.7",
+ "react-dom": "19.2.7",
+ "react-i18next": "17.0.8",
+ "react-redux": "9.3.0",
+ "react-refractor": "4.0.0",
+ "react-router": "7.18.0",
+ "sanitize-filename": "1.6.4",
+ "webdriver": "9.29.0",
"xpath": "0.0.34"
},
"bin": {
"electron": "node_modules/.bin/electron"
},
"devDependencies": {
- "@appium/docutils": "1.0.4",
- "@appium/eslint-config-appium": "8.0.5",
- "@appium/fake-driver": "5.5.1",
- "@appium/support": "4.2.2",
- "@babel/core": "7.23.9",
- "@babel/eslint-parser": "7.23.10",
- "@babel/eslint-plugin": "7.23.5",
- "@babel/plugin-proposal-class-properties": "7.18.6",
- "@babel/plugin-transform-runtime": "7.23.9",
- "@babel/preset-env": "7.23.9",
- "@babel/preset-react": "7.23.3",
- "@babel/register": "7.23.7",
- "asyncbox": "3.0.0",
- "chai": "4.4.1",
- "chai-as-promised": "7.1.1",
- "check-engines": "1.6.0",
- "concurrently": "8.2.2",
- "cross-env": "7.0.3",
- "devtron": "1.4.0",
- "electron": "13.6.9",
- "electron-builder": "24.12.0",
- "electron-debug": "3.2.0",
- "electron-extension-installer": "1.2.0",
- "eslint": "8.57.0",
- "eslint-plugin-import": "2.29.1",
- "eslint-plugin-mocha": "10.3.0",
- "eslint-plugin-promise": "6.1.1",
- "eslint-plugin-react": "7.33.2",
- "eslint-plugin-react-native": "4.1.0",
- "less": "4.2.0",
- "mocha": "10.3.0",
- "mocha-junit-reporter": "2.2.1",
- "mocha-multi-reporters": "1.5.1",
- "node-libs-browser": "2.2.1",
- "parcel-bundler": "1.12.5",
- "parcel-plugin-asset-copier": "1.1.1",
- "postcss-modules": "3.2.2",
- "prettier": "3.2.5",
- "redux-logger": "3.0.6",
- "rimraf": "5.0.5",
- "sinon": "17.0.1",
- "spectron": "15.0.0"
- },
- "engines": {
- "node": ">=18.x",
- "npm": ">=8.x"
- }
- },
- "node_modules/@aashutoshrathi/word-wrap": {
- "version": "1.2.6",
- "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz",
- "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
+ "@appium/docutils": "2.5.1",
+ "@appium/eslint-config-appium-ts": "3.2.3",
+ "@appium/fake-driver": "6.2.1",
+ "@appium/support": "7.2.5",
+ "@eslint-react/eslint-plugin": "5.9.1",
+ "@tomjs/electron-devtools-installer": "4.0.1",
+ "@types/lodash": "4.17.24",
+ "@types/react": "19.2.17",
+ "@types/react-dom": "19.2.3",
+ "@vitejs/plugin-react": "5.2.0",
+ "asyncbox": "6.3.0",
+ "babel-plugin-react-compiler": "1.0.0",
+ "electron": "41.8.0",
+ "electron-builder": "26.15.3",
+ "electron-vite": "5.0.0",
+ "eslint": "10.5.0",
+ "eslint-plugin-react-hooks": "7.1.1",
+ "eslint-plugin-simple-import-sort": "13.0.0",
+ "globals": "17.6.0",
+ "prettier": "3.8.4",
+ "rimraf": "6.1.3",
+ "vite": "7.3.5",
+ "vite-plugin-electron-renderer": "0.14.7",
+ "vitest": "4.1.9"
+ },
+ "engines": {
+ "node": "^20.19.0 || ^22.12.0 || >=24.0.0",
+ "npm": ">=10.x"
}
},
- "node_modules/@ampproject/remapping": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz",
- "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==",
- "dev": true,
+ "node_modules/@ant-design/colors": {
+ "version": "8.0.1",
+ "resolved": "https://registry.npmjs.org/@ant-design/colors/-/colors-8.0.1.tgz",
+ "integrity": "sha512-foPVl0+SWIslGUtD/xBr1p9U4AKzPhNYEseXYRRo5QSzGACYZrQbe11AYJbYfAWnWSpGBx6JjBmSeugUsD9vqQ==",
+ "license": "MIT",
"dependencies": {
- "@jridgewell/gen-mapping": "^0.3.0",
- "@jridgewell/trace-mapping": "^0.3.9"
+ "@ant-design/fast-color": "^3.0.0"
+ }
+ },
+ "node_modules/@ant-design/cssinjs": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/@ant-design/cssinjs/-/cssinjs-2.1.2.tgz",
+ "integrity": "sha512-2Hy8BnCEH31xPeSLbhhB2ctCPXE2ZnASdi+KbSeS79BNbUhL9hAEe20SkUk+BR8aKTmqb6+FKFruk7w8z0VoRQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.11.1",
+ "@emotion/hash": "^0.8.0",
+ "@emotion/unitless": "^0.7.5",
+ "@rc-component/util": "^1.4.0",
+ "clsx": "^2.1.1",
+ "csstype": "^3.1.3",
+ "stylis": "^4.3.4"
},
- "engines": {
- "node": ">=6.0.0"
+ "peerDependencies": {
+ "react": ">=16.0.0",
+ "react-dom": ">=16.0.0"
}
},
- "node_modules/@ant-design/colors": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/@ant-design/colors/-/colors-6.0.0.tgz",
- "integrity": "sha512-qAZRvPzfdWHtfameEGP2Qvuf838NhergR35o+EuVyB5XvSA98xod5r4utvi4TJ3ywmevm290g9nsCG5MryrdWQ==",
+ "node_modules/@ant-design/cssinjs-utils": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/@ant-design/cssinjs-utils/-/cssinjs-utils-2.1.2.tgz",
+ "integrity": "sha512-5fTHQ158jJJ5dC/ECeyIdZUzKxE/mpEMRZxthyG1sw/AKRHKgJBg00Yi6ACVXgycdje7KahRNvNET/uBccwCnA==",
+ "license": "MIT",
"dependencies": {
- "@ctrl/tinycolor": "^3.4.0"
+ "@ant-design/cssinjs": "^2.1.2",
+ "@babel/runtime": "^7.23.2",
+ "@rc-component/util": "^1.4.0"
+ },
+ "peerDependencies": {
+ "react": ">=18",
+ "react-dom": ">=18"
+ }
+ },
+ "node_modules/@ant-design/fast-color": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/@ant-design/fast-color/-/fast-color-3.0.1.tgz",
+ "integrity": "sha512-esKJegpW4nckh0o6kV3Tkb7NPIZYbPnnFxmQDUmL08ukXZAvV85TZBr70eGuke/CIArLaP6aw8lt9KILjnWuOw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.x"
}
},
"node_modules/@ant-design/icons": {
- "version": "4.8.1",
- "resolved": "https://registry.npmjs.org/@ant-design/icons/-/icons-4.8.1.tgz",
- "integrity": "sha512-JRAuiqllnMsiZIO8OvBOeFconprC3cnMpJ9MvXrHh+H5co9rlg8/aSHQfLf5jKKe18lUgRaIwC2pz8YxH9VuCA==",
- "dependencies": {
- "@ant-design/colors": "^6.0.0",
- "@ant-design/icons-svg": "^4.3.0",
- "@babel/runtime": "^7.11.2",
- "classnames": "^2.2.6",
- "lodash": "^4.17.15",
- "rc-util": "^5.9.4"
+ "version": "6.2.5",
+ "resolved": "https://registry.npmjs.org/@ant-design/icons/-/icons-6.2.5.tgz",
+ "integrity": "sha512-0hKtoKqTjGFOndUyJLJmC9Cg6k4rEO7rLo6xmgbNJH+/ZX1C57RVals2v1j1knHl9n7Q+sBOveTvn931wLOCKw==",
+ "license": "MIT",
+ "dependencies": {
+ "@ant-design/colors": "^8.0.1",
+ "@ant-design/icons-svg": "^4.4.2",
+ "@rc-component/util": "^1.11.0",
+ "clsx": "^2.1.1"
},
"engines": {
"node": ">=8"
@@ -141,1246 +142,1520 @@
}
},
"node_modules/@ant-design/icons-svg": {
- "version": "4.3.1",
- "resolved": "https://registry.npmjs.org/@ant-design/icons-svg/-/icons-svg-4.3.1.tgz",
- "integrity": "sha512-4QBZg8ccyC6LPIRii7A0bZUk3+lEDCLnhB+FVsflGdcWPPmV+j3fire4AwwoqHV/BibgvBmR9ZIo4s867smv+g=="
+ "version": "4.4.2",
+ "resolved": "https://registry.npmjs.org/@ant-design/icons-svg/-/icons-svg-4.4.2.tgz",
+ "integrity": "sha512-vHbT+zJEVzllwP+CM+ul7reTEfBR0vgxFe7+lREAsAA7YGsYpboiq2sQNeQeRvh09GfQgs/GyFEvZpJ9cLXpXA==",
+ "license": "MIT"
},
"node_modules/@ant-design/react-slick": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/@ant-design/react-slick/-/react-slick-1.0.2.tgz",
- "integrity": "sha512-Wj8onxL/T8KQLFFiCA4t8eIRGpRR+UPgOdac2sYzonv+i0n3kXHmvHLLiOYL655DQx2Umii9Y9nNgL7ssu5haQ==",
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@ant-design/react-slick/-/react-slick-2.0.0.tgz",
+ "integrity": "sha512-HMS9sRoEmZey8LsE/Yo6+klhlzU12PisjrVcydW3So7RdklyEd2qehyU6a7Yp+OYN72mgsYs3NFCyP2lCPFVqg==",
+ "license": "MIT",
"dependencies": {
- "@babel/runtime": "^7.10.4",
- "classnames": "^2.2.5",
+ "@babel/runtime": "^7.28.4",
+ "clsx": "^2.1.1",
"json2mq": "^0.2.0",
- "resize-observer-polyfill": "^1.5.1",
"throttle-debounce": "^5.0.0"
},
"peerDependencies": {
- "react": ">=16.9.0"
+ "react": "^0.14.0 || ^15.0.1 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0",
+ "react-dom": "^0.14.0 || ^15.0.1 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
}
},
"node_modules/@appium/base-driver": {
- "version": "9.5.2",
- "resolved": "https://registry.npmjs.org/@appium/base-driver/-/base-driver-9.5.2.tgz",
- "integrity": "sha512-0e/QYNPwGkcpeZ2ibRApopCrvH+ULeWeptbpVHq/dIAxYQXVs+8C7KgmK6vgf0/zuz6pdCT7jzRIY74nbuwJug==",
+ "version": "10.6.0",
+ "resolved": "https://registry.npmjs.org/@appium/base-driver/-/base-driver-10.6.0.tgz",
+ "integrity": "sha512-UP37xbRVrdfO0QPkDNVdFhLWc4M817K8mvJsGHWMZe1P//tPYio4lqmsA3baF10Fe5jcwYEoQZDROJLodAivKw==",
"dev": true,
+ "license": "Apache-2.0",
"peer": true,
"dependencies": {
- "@appium/support": "^4.2.2",
- "@appium/types": "^0.16.1",
+ "@appium/support": "7.2.3",
+ "@appium/types": "1.5.0",
"@colors/colors": "1.6.0",
- "@types/async-lock": "1.4.2",
- "@types/bluebird": "3.5.42",
- "@types/express": "4.17.21",
- "@types/lodash": "4.14.202",
- "@types/method-override": "0.0.35",
- "@types/serve-favicon": "2.5.7",
"async-lock": "1.4.1",
- "asyncbox": "3.0.0",
- "axios": "1.6.7",
- "bluebird": "3.7.2",
- "body-parser": "1.20.2",
- "es6-error": "4.1.1",
- "express": "4.18.2",
+ "asyncbox": "6.3.0",
+ "axios": "1.16.1",
+ "body-parser": "2.2.2",
+ "express": "5.2.1",
+ "fastest-levenshtein": "1.0.16",
"http-status-codes": "2.3.0",
- "lodash": "4.17.21",
- "lru-cache": "10.2.0",
+ "lru-cache": "11.5.0",
"method-override": "3.0.0",
- "morgan": "1.10.0",
- "path-to-regexp": "6.2.1",
- "serve-favicon": "2.5.0",
- "source-map-support": "0.5.21",
- "type-fest": "4.10.1",
- "validate.js": "0.13.1"
+ "morgan": "1.10.1",
+ "path-to-regexp": "8.4.2",
+ "serve-favicon": "2.5.1",
+ "type-fest": "5.6.0"
},
"engines": {
- "node": "^14.17.0 || ^16.13.0 || >=18.0.0",
- "npm": ">=8"
+ "node": "^20.19.0 || ^22.12.0 || >=24.0.0",
+ "npm": ">=10"
},
"optionalDependencies": {
"spdy": "4.0.2"
}
},
- "node_modules/@appium/base-driver/node_modules/lru-cache": {
- "version": "10.2.0",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz",
- "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": "14 || >=16.14"
- }
- },
- "node_modules/@appium/base-plugin": {
- "version": "2.2.28",
- "resolved": "https://registry.npmjs.org/@appium/base-plugin/-/base-plugin-2.2.28.tgz",
- "integrity": "sha512-FtDm0pbXDk3fRW46dxEYSAOgx2zebaCQilNRRZxdhmYE6kE15B8GXkyWVI0Mk37WJo+1eLrlngM+jlCO5xMx8g==",
+ "node_modules/@appium/base-driver/node_modules/@appium/support": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/@appium/support/-/support-7.2.3.tgz",
+ "integrity": "sha512-/NVMUffjnH9rNrxE+DyM811B1hd0pZl8RT+DlZfqXVyAWzhUjBWw3U2VwSycowDoV9dBpXSpWQ3S+zfRnrMcTg==",
"dev": true,
+ "license": "Apache-2.0",
"peer": true,
"dependencies": {
- "@appium/base-driver": "^9.5.2",
- "@appium/support": "^4.2.2"
- },
- "engines": {
- "node": "^14.17.0 || ^16.13.0 || >=18.0.0",
- "npm": ">=8"
- }
- },
- "node_modules/@appium/docutils": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/@appium/docutils/-/docutils-1.0.4.tgz",
- "integrity": "sha512-5+2OfvKwGJqwqSXF/WqoprwGONWdNRrXePESoebhs18natLUVZ2PnGhPv9gPHo+UcAobTaWO3YuhhPt7hwVrZA==",
- "dev": true,
- "dependencies": {
- "@appium/support": "^4.2.2",
- "@appium/tsconfig": "^0.x",
- "@sliphua/lilconfig-ts-loader": "3.2.2",
- "@types/which": "3.0.3",
- "chalk": "4.1.2",
- "consola": "3.2.3",
- "diff": "5.2.0",
- "json5": "2.2.3",
- "lilconfig": "3.0.0",
- "lodash": "4.17.21",
- "pkg-dir": "5.0.0",
- "read-pkg": "5.2.0",
- "semver": "7.6.0",
- "source-map-support": "0.5.21",
- "teen_process": "2.1.1",
- "type-fest": "4.10.1",
- "typescript": "5.2.2",
- "yaml": "2.3.4",
- "yargs": "17.7.2",
- "yargs-parser": "21.1.1"
- },
- "bin": {
- "appium-docs": "bin/appium-docs.js"
- },
- "engines": {
- "node": "^14.17.0 || ^16.13.0 || >=18.0.0",
- "npm": ">=8"
- }
- },
- "node_modules/@appium/docutils/node_modules/ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "dev": true,
- "dependencies": {
- "color-convert": "^2.0.1"
+ "@appium/logger": "2.0.8",
+ "@appium/tsconfig": "1.1.2",
+ "@appium/types": "1.5.0",
+ "@colors/colors": "1.6.0",
+ "archiver": "8.0.0",
+ "asyncbox": "6.3.0",
+ "axios": "1.16.1",
+ "base64-stream": "1.0.0",
+ "bluebird": "3.7.2",
+ "bplist-creator": "0.1.1",
+ "bplist-parser": "0.3.2",
+ "form-data": "4.0.5",
+ "get-stream": "9.0.1",
+ "glob": "13.0.6",
+ "jsftp": "2.1.3",
+ "klaw": "4.1.0",
+ "lockfile": "1.0.4",
+ "log-symbols": "7.0.1",
+ "ncp": "2.0.0",
+ "package-directory": "8.2.0",
+ "plist": "4.0.0",
+ "pluralize": "8.0.0",
+ "read-pkg": "10.1.0",
+ "resolve-from": "5.0.0",
+ "sanitize-filename": "1.6.4",
+ "semver": "7.8.1",
+ "shell-quote": "1.8.4",
+ "supports-color": "10.2.2",
+ "teen_process": "4.1.3",
+ "type-fest": "5.6.0",
+ "uuid": "14.0.0",
+ "which": "6.0.1",
+ "yauzl": "3.3.1"
},
"engines": {
- "node": ">=8"
+ "node": "^20.19.0 || ^22.12.0 || >=24.0.0",
+ "npm": ">=10"
},
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ "optionalDependencies": {
+ "sharp": "0.34.5"
}
},
- "node_modules/@appium/docutils/node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "node_modules/@appium/base-driver/node_modules/buffer-crc32": {
+ "version": "0.2.13",
+ "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
+ "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==",
"dev": true,
- "dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
+ "license": "MIT",
+ "peer": true,
"engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
+ "node": "*"
}
},
- "node_modules/@appium/docutils/node_modules/chalk/node_modules/supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "node_modules/@appium/base-driver/node_modules/plist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/plist/-/plist-4.0.0.tgz",
+ "integrity": "sha512-4dOqNo0Y2NpfSf9q4+zr4bh7pzNWeckIam34Z0KYJhg8qtNNfh59VbD+Yna5SjwcxawVvLKx5w5FtuCijpEF4Q==",
"dev": true,
+ "license": "MIT",
+ "peer": true,
"dependencies": {
- "has-flag": "^4.0.0"
+ "@xmldom/xmldom": "^0.9.10",
+ "xmlbuilder": "^15.1.1"
},
"engines": {
- "node": ">=8"
+ "node": ">=18"
}
},
- "node_modules/@appium/docutils/node_modules/color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "node_modules/@appium/base-driver/node_modules/semver": {
+ "version": "7.8.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.1.tgz",
+ "integrity": "sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg==",
"dev": true,
- "dependencies": {
- "color-name": "~1.1.4"
+ "license": "ISC",
+ "peer": true,
+ "bin": {
+ "semver": "bin/semver.js"
},
"engines": {
- "node": ">=7.0.0"
- }
- },
- "node_modules/@appium/docutils/node_modules/color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "dev": true
- },
- "node_modules/@appium/eslint-config-appium": {
- "version": "8.0.5",
- "resolved": "https://registry.npmjs.org/@appium/eslint-config-appium/-/eslint-config-appium-8.0.5.tgz",
- "integrity": "sha512-Hi6HHPs6Y0xO09cXfWkrV1NSzxQm5FRDKjGBmvnam7uxmKySKvSwS1jFAkPAom/CJi5B2MijvvdlCSWXVyFWUA==",
- "dev": true,
- "engines": {
- "node": "^14.17.0 || ^16.13.0 || >=18.0.0",
- "npm": ">=8"
- },
- "peerDependencies": {
- "eslint": "^8.21.0",
- "eslint-config-prettier": "^8.5.0 || ^9.0.0",
- "eslint-plugin-import": "^2.26.0",
- "eslint-plugin-mocha": "^10.1.0",
- "eslint-plugin-promise": "^6.0.0"
+ "node": ">=10"
}
},
- "node_modules/@appium/fake-driver": {
- "version": "5.5.1",
- "resolved": "https://registry.npmjs.org/@appium/fake-driver/-/fake-driver-5.5.1.tgz",
- "integrity": "sha512-YzVRO9L1OJACE8UBpVLRWJIPoXRe2uYuym8dNYEvwTiDzann8fuhIxGLjV03Qzz1dQBTV8upala7Qy/vXvzxWQ==",
+ "node_modules/@appium/base-driver/node_modules/yauzl": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-3.3.1.tgz",
+ "integrity": "sha512-RNPCUkiE/ZgO4w8i9U5yDQVHaFDdnzaFANElRvpJteCspvmv2VqrRb9lvS6odVD+jqI/zDsxAHJVsafpcheVQQ==",
"dev": true,
+ "license": "MIT",
+ "peer": true,
"dependencies": {
- "@types/bluebird": "3.5.42",
- "@xmldom/xmldom": "0.8.10",
- "asyncbox": "3.0.0",
- "bluebird": "3.7.2",
- "lodash": "4.17.21",
- "source-map-support": "0.5.21",
- "xpath": "0.0.34"
+ "buffer-crc32": "~0.2.3",
+ "pend": "~1.2.0"
},
"engines": {
- "node": "^14.17.0 || ^16.13.0 || >=18.0.0",
- "npm": ">=8"
- },
- "peerDependencies": {
- "appium": "^2.4.1"
+ "node": ">=12"
}
},
- "node_modules/@appium/schema": {
- "version": "0.5.0",
- "resolved": "https://registry.npmjs.org/@appium/schema/-/schema-0.5.0.tgz",
- "integrity": "sha512-HFed9HtFU6+kLdVyp/xpS/Wfcge8PuMS37LJVShviT6OuzHOYvNFx1/y8+KMa/l0Npvll5eafdfHmUsWlRnUAA==",
+ "node_modules/@appium/base-plugin": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/@appium/base-plugin/-/base-plugin-3.3.0.tgz",
+ "integrity": "sha512-3xhkU+oBnMWSIJbq1x+oYgvV4dJyLkslQ8ONwH2Dbvr63bUdjgSmiXZ4vbY7aiNEQZv+A5aBWFS5NVMA8zRd5Q==",
"dev": true,
+ "license": "Apache-2.0",
+ "peer": true,
"dependencies": {
- "@types/json-schema": "7.0.15",
- "json-schema": "0.4.0",
- "source-map-support": "0.5.21"
+ "@appium/base-driver": "10.6.0",
+ "@appium/support": "7.2.3",
+ "@appium/types": "1.5.0"
},
"engines": {
- "node": "^14.17.0 || ^16.13.0 || >=18.0.0",
- "npm": ">=8"
+ "node": "^20.19.0 || ^22.12.0 || >=24.0.0",
+ "npm": ">=10"
}
},
- "node_modules/@appium/support": {
- "version": "4.2.2",
- "resolved": "https://registry.npmjs.org/@appium/support/-/support-4.2.2.tgz",
- "integrity": "sha512-sBaBoGCBbW8l7ZMoVL6KkLLqQxxTRzA06iYLUSP77UI4BSIAgT+ZomLNaZisoHw9ioljQyOSJp2QX3OWqxPPIA==",
+ "node_modules/@appium/base-plugin/node_modules/@appium/support": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/@appium/support/-/support-7.2.3.tgz",
+ "integrity": "sha512-/NVMUffjnH9rNrxE+DyM811B1hd0pZl8RT+DlZfqXVyAWzhUjBWw3U2VwSycowDoV9dBpXSpWQ3S+zfRnrMcTg==",
"dev": true,
+ "license": "Apache-2.0",
+ "peer": true,
"dependencies": {
- "@appium/tsconfig": "^0.x",
- "@appium/types": "^0.16.1",
+ "@appium/logger": "2.0.8",
+ "@appium/tsconfig": "1.1.2",
+ "@appium/types": "1.5.0",
"@colors/colors": "1.6.0",
- "@types/archiver": "6.0.2",
- "@types/base64-stream": "1.0.5",
- "@types/find-root": "1.1.4",
- "@types/jsftp": "2.1.5",
- "@types/klaw": "3.0.6",
- "@types/lockfile": "1.0.4",
- "@types/mv": "2.1.4",
- "@types/ncp": "2.0.8",
- "@types/npmlog": "7.0.0",
- "@types/pluralize": "0.0.33",
- "@types/semver": "7.5.7",
- "@types/shell-quote": "1.7.5",
- "@types/supports-color": "8.1.3",
- "@types/teen_process": "2.0.4",
- "@types/uuid": "9.0.8",
- "@types/which": "3.0.3",
- "archiver": "6.0.1",
- "axios": "1.6.7",
+ "archiver": "8.0.0",
+ "asyncbox": "6.3.0",
+ "axios": "1.16.1",
"base64-stream": "1.0.0",
"bluebird": "3.7.2",
"bplist-creator": "0.1.1",
"bplist-parser": "0.3.2",
- "form-data": "4.0.0",
- "get-stream": "6.0.1",
- "glob": "10.3.10",
+ "form-data": "4.0.5",
+ "get-stream": "9.0.1",
+ "glob": "13.0.6",
"jsftp": "2.1.3",
"klaw": "4.1.0",
"lockfile": "1.0.4",
- "lodash": "4.17.21",
- "log-symbols": "4.1.0",
- "moment": "2.30.1",
- "mv": "2.1.1",
+ "log-symbols": "7.0.1",
"ncp": "2.0.0",
- "npmlog": "7.0.1",
- "opencv-bindings": "4.5.5",
- "pkg-dir": "5.0.0",
- "plist": "3.1.0",
+ "package-directory": "8.2.0",
+ "plist": "4.0.0",
"pluralize": "8.0.0",
- "read-pkg": "5.2.0",
+ "read-pkg": "10.1.0",
"resolve-from": "5.0.0",
- "sanitize-filename": "1.6.3",
- "semver": "7.6.0",
- "shell-quote": "1.8.1",
- "source-map-support": "0.5.21",
- "supports-color": "8.1.1",
- "teen_process": "2.1.1",
- "type-fest": "4.10.1",
- "uuid": "9.0.1",
- "which": "4.0.0",
- "yauzl": "2.10.0"
+ "sanitize-filename": "1.6.4",
+ "semver": "7.8.1",
+ "shell-quote": "1.8.4",
+ "supports-color": "10.2.2",
+ "teen_process": "4.1.3",
+ "type-fest": "5.6.0",
+ "uuid": "14.0.0",
+ "which": "6.0.1",
+ "yauzl": "3.3.1"
},
"engines": {
- "node": "^14.17.0 || ^16.13.0 || >=18.0.0",
- "npm": ">=8"
+ "node": "^20.19.0 || ^22.12.0 || >=24.0.0",
+ "npm": ">=10"
},
"optionalDependencies": {
- "sharp": "0.33.2"
+ "sharp": "0.34.5"
}
},
- "node_modules/@appium/tsconfig": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/@appium/tsconfig/-/tsconfig-0.3.2.tgz",
- "integrity": "sha512-GPJKATPBHbOC1lRX3+mq4wPRHzilEsBDh64TFBa156BtBRPhKi2DoLv38I93gNAWPJ+StwqZ5YMndriuu/8jKQ==",
+ "node_modules/@appium/base-plugin/node_modules/buffer-crc32": {
+ "version": "0.2.13",
+ "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
+ "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/@appium/base-plugin/node_modules/plist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/plist/-/plist-4.0.0.tgz",
+ "integrity": "sha512-4dOqNo0Y2NpfSf9q4+zr4bh7pzNWeckIam34Z0KYJhg8qtNNfh59VbD+Yna5SjwcxawVvLKx5w5FtuCijpEF4Q==",
"dev": true,
+ "license": "MIT",
+ "peer": true,
"dependencies": {
- "@tsconfig/node14": "14.1.0"
+ "@xmldom/xmldom": "^0.9.10",
+ "xmlbuilder": "^15.1.1"
},
"engines": {
- "node": "^14.17.0 || ^16.13.0 || >=18.0.0",
- "npm": ">=8"
+ "node": ">=18"
}
},
- "node_modules/@appium/types": {
- "version": "0.16.1",
- "resolved": "https://registry.npmjs.org/@appium/types/-/types-0.16.1.tgz",
- "integrity": "sha512-fEQDDIJzJj5ppQBfMExweZKjW6OEonAmcZQh6teH2ykDRo2MJl1jazqxt9LYUbXdH4qChjsh2nYPcgpD6m4usw==",
+ "node_modules/@appium/base-plugin/node_modules/semver": {
+ "version": "7.8.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.1.tgz",
+ "integrity": "sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg==",
"dev": true,
- "dependencies": {
- "@appium/schema": "^0.5.0",
- "@appium/tsconfig": "^0.x",
- "@types/express": "4.17.21",
- "@types/npmlog": "7.0.0",
- "@types/ws": "8.5.10",
- "type-fest": "4.10.1"
+ "license": "ISC",
+ "peer": true,
+ "bin": {
+ "semver": "bin/semver.js"
},
"engines": {
- "node": "^14.17.0 || ^16.13.0 || >=18.0.0",
- "npm": ">=8"
+ "node": ">=10"
}
},
- "node_modules/@babel/code-frame": {
- "version": "7.23.5",
- "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz",
- "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==",
+ "node_modules/@appium/base-plugin/node_modules/yauzl": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-3.3.1.tgz",
+ "integrity": "sha512-RNPCUkiE/ZgO4w8i9U5yDQVHaFDdnzaFANElRvpJteCspvmv2VqrRb9lvS6odVD+jqI/zDsxAHJVsafpcheVQQ==",
"dev": true,
+ "license": "MIT",
+ "peer": true,
"dependencies": {
- "@babel/highlight": "^7.23.4",
- "chalk": "^2.4.2"
+ "buffer-crc32": "~0.2.3",
+ "pend": "~1.2.0"
},
"engines": {
- "node": ">=6.9.0"
+ "node": ">=12"
}
},
- "node_modules/@babel/compat-data": {
- "version": "7.23.5",
- "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz",
- "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==",
+ "node_modules/@appium/docutils": {
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/@appium/docutils/-/docutils-2.5.1.tgz",
+ "integrity": "sha512-P2Kveb4I68KGC6gAY0TRTVgvqBaZW3WqpnHgK0iiN+lLhaxBoRrqoaGJR95oPb93sgkZQT59ZexdZ5KXf8wFtA==",
"dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@appium/support": "7.2.5",
+ "consola": "3.4.2",
+ "diff": "9.0.0",
+ "lilconfig": "3.1.3",
+ "normalize-package-data": "8.0.0",
+ "teen_process": "4.1.3",
+ "type-fest": "5.7.0",
+ "yaml": "2.9.0",
+ "yargs": "18.0.0",
+ "yargs-parser": "22.0.0"
+ },
+ "bin": {
+ "appium-docs": "bin/appium-docs.js"
+ },
"engines": {
- "node": ">=6.9.0"
+ "node": "^20.19.0 || ^22.12.0 || >=24.0.0",
+ "npm": ">=10"
}
},
- "node_modules/@babel/core": {
- "version": "7.23.9",
- "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.9.tgz",
- "integrity": "sha512-5q0175NOjddqpvvzU+kDiSOAk4PfdO6FvwCWoQ6RO7rTzEe8vlo+4HVfcnAREhD4npMs0e9uZypjTwzZPCf/cw==",
- "dev": true,
- "dependencies": {
- "@ampproject/remapping": "^2.2.0",
- "@babel/code-frame": "^7.23.5",
- "@babel/generator": "^7.23.6",
- "@babel/helper-compilation-targets": "^7.23.6",
- "@babel/helper-module-transforms": "^7.23.3",
- "@babel/helpers": "^7.23.9",
- "@babel/parser": "^7.23.9",
- "@babel/template": "^7.23.9",
- "@babel/traverse": "^7.23.9",
- "@babel/types": "^7.23.9",
- "convert-source-map": "^2.0.0",
- "debug": "^4.1.0",
- "gensync": "^1.0.0-beta.2",
- "json5": "^2.2.3",
- "semver": "^6.3.1"
+ "node_modules/@appium/docutils/node_modules/type-fest": {
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-5.7.0.tgz",
+ "integrity": "sha512-1URUxUqfHFM1c+zfSPsa3gnkO7Aq21qyH75SIduNYz4SzY964rn1X2vCMQaHSHhktiw+0kPa2iyb6PUpXqB6Vg==",
+ "dev": true,
+ "license": "(MIT OR CC0-1.0)",
+ "dependencies": {
+ "tagged-tag": "^1.0.0"
},
"engines": {
- "node": ">=6.9.0"
+ "node": ">=20"
},
"funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/babel"
- }
- },
- "node_modules/@babel/core/node_modules/semver": {
- "version": "6.3.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
- "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
- "dev": true,
- "bin": {
- "semver": "bin/semver.js"
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/@babel/eslint-parser": {
- "version": "7.23.10",
- "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.23.10.tgz",
- "integrity": "sha512-3wSYDPZVnhseRnxRJH6ZVTNknBz76AEnyC+AYYhasjP3Yy23qz0ERR7Fcd2SHmYuSFJ2kY9gaaDd3vyqU09eSw==",
+ "node_modules/@appium/eslint-config-appium-ts": {
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/@appium/eslint-config-appium-ts/-/eslint-config-appium-ts-3.2.3.tgz",
+ "integrity": "sha512-GaCfThC0usUNQFZ8GrMRTfTMShnkqTyIXHQyh8LX+C9M/dNuQWlYB2p2jShzWpqKqXS8X4you8eSk37Dv+zZ9w==",
"dev": true,
+ "license": "Apache-2.0",
"dependencies": {
- "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1",
- "eslint-visitor-keys": "^2.1.0",
- "semver": "^6.3.1"
+ "@eslint/compat": "2.1.0",
+ "@eslint/js": "10.0.1",
+ "@stylistic/eslint-plugin": "5.10.0",
+ "eslint-config-prettier": "10.1.8",
+ "eslint-import-resolver-typescript": "4.4.5",
+ "eslint-plugin-import-x": "4.16.2",
+ "eslint-plugin-jsdoc": "63.0.2",
+ "eslint-plugin-mocha": "11.3.0",
+ "eslint-plugin-n": "18.1.0",
+ "eslint-plugin-perfectionist": "5.9.0",
+ "eslint-plugin-promise": "7.3.0",
+ "eslint-plugin-unicorn": "65.0.1",
+ "typescript-eslint": "8.61.0"
},
"engines": {
- "node": "^10.13.0 || ^12.13.0 || >=14.0.0"
+ "node": "^20.19.0 || ^22.12.0 || >=24.0.0",
+ "npm": ">=10"
},
"peerDependencies": {
- "@babel/core": "^7.11.0",
- "eslint": "^7.5.0 || ^8.0.0"
+ "eslint": "^9.0.0 || ^10.0.0"
}
},
- "node_modules/@babel/eslint-parser/node_modules/semver": {
- "version": "6.3.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
- "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "node_modules/@appium/eslint-config-appium-ts/node_modules/eslint-import-resolver-typescript": {
+ "version": "4.4.5",
+ "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-4.4.5.tgz",
+ "integrity": "sha512-nbE5XLph6TLtGYcu/U6e6ZVXyKBhbDWK5cLGk76eJ7NdZpwf1P9EFkpt1Z01mNZNrrilsAYWKH6zUkL4reoXbw==",
"dev": true,
- "bin": {
- "semver": "bin/semver.js"
+ "license": "ISC",
+ "dependencies": {
+ "debug": "^4.4.1",
+ "eslint-import-context": "^0.1.8",
+ "get-tsconfig": "^4.10.1",
+ "is-bun-module": "^2.0.0",
+ "stable-hash-x": "^0.2.0",
+ "tinyglobby": "^0.2.14",
+ "unrs-resolver": "^1.7.11"
+ },
+ "engines": {
+ "node": "^16.17.0 || >=18.6.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint-import-resolver-typescript"
+ },
+ "peerDependencies": {
+ "eslint": "*",
+ "eslint-plugin-import": "*",
+ "eslint-plugin-import-x": "*"
+ },
+ "peerDependenciesMeta": {
+ "eslint-plugin-import": {
+ "optional": true
+ },
+ "eslint-plugin-import-x": {
+ "optional": true
+ }
}
},
- "node_modules/@babel/eslint-plugin": {
- "version": "7.23.5",
- "resolved": "https://registry.npmjs.org/@babel/eslint-plugin/-/eslint-plugin-7.23.5.tgz",
- "integrity": "sha512-03+E/58Hoo/ui69gR+beFdGpplpoVK0BSIdke2iw4/Bz7eGN0ssRenNlnU4nmbkowNQOPCStKSwFr8H6DiY49g==",
+ "node_modules/@appium/fake-driver": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/@appium/fake-driver/-/fake-driver-6.2.1.tgz",
+ "integrity": "sha512-uQulZ6E+VpE7wUOLMBiU6O1tEFJmLoFjL6OHXHxwM0cDfG99Mzww7jMtQQrZlUVaPjOLQ3FsMAHgIphMwCvA4g==",
"dev": true,
+ "license": "Apache-2.0",
"dependencies": {
- "eslint-rule-composer": "^0.3.0"
+ "@xmldom/xmldom": "0.9.10",
+ "asyncbox": "6.3.0",
+ "xpath": "0.0.34"
},
"engines": {
- "node": "^10.13.0 || ^12.13.0 || >=14.0.0"
+ "node": "^20.19.0 || ^22.12.0 || >=24.0.0",
+ "npm": ">=10"
},
"peerDependencies": {
- "@babel/eslint-parser": "^7.11.0",
- "eslint": "^7.5.0 || ^8.0.0"
+ "appium": "^3.0.0-beta.0"
}
},
- "node_modules/@babel/generator": {
- "version": "7.23.6",
- "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz",
- "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==",
+ "node_modules/@appium/logger": {
+ "version": "2.0.8",
+ "resolved": "https://registry.npmjs.org/@appium/logger/-/logger-2.0.8.tgz",
+ "integrity": "sha512-G5uYRq97Kn1CEdgI2eq237NkgUMrxKecSsuagGiI5usNH8ttjFN+LP95QJi9JERxMW/djfXKv7dz6eJ0ZY3SbA==",
"dev": true,
+ "license": "ISC",
+ "peer": true,
"dependencies": {
- "@babel/types": "^7.23.6",
- "@jridgewell/gen-mapping": "^0.3.2",
- "@jridgewell/trace-mapping": "^0.3.17",
- "jsesc": "^2.5.1"
+ "console-control-strings": "1.1.0",
+ "lru-cache": "11.5.0",
+ "set-blocking": "2.0.0"
},
"engines": {
- "node": ">=6.9.0"
+ "node": "^20.19.0 || ^22.12.0 || >=24.0.0",
+ "npm": ">=10"
}
},
- "node_modules/@babel/helper-annotate-as-pure": {
- "version": "7.22.5",
- "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz",
- "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==",
+ "node_modules/@appium/schema": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@appium/schema/-/schema-1.2.0.tgz",
+ "integrity": "sha512-6MqniwVPLSM5qkP0Azi0ktLIC4hMwUa1R4JWNDDqicZcWQmPUCUJF4keqZl1rGAbNdbQQ3++BIiTVm1Duvl/5A==",
"dev": true,
+ "license": "Apache-2.0",
+ "peer": true,
"dependencies": {
- "@babel/types": "^7.22.5"
+ "json-schema": "0.4.0"
},
"engines": {
- "node": ">=6.9.0"
+ "node": "^20.19.0 || ^22.12.0 || >=24.0.0",
+ "npm": ">=10"
}
},
- "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": {
- "version": "7.22.15",
- "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz",
- "integrity": "sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==",
+ "node_modules/@appium/support": {
+ "version": "7.2.5",
+ "resolved": "https://registry.npmjs.org/@appium/support/-/support-7.2.5.tgz",
+ "integrity": "sha512-+sk7HdWYD5EMcSVtiMK09aA960suBJY/8d+r5v8j9vHw47R4ukLrM2lShpIpFFCTTfz5ZTCjCtvqNwwM8EqyMg==",
"dev": true,
+ "license": "Apache-2.0",
"dependencies": {
- "@babel/types": "^7.22.15"
+ "@appium/logger": "2.0.9",
+ "@appium/types": "1.5.1",
+ "archiver": "8.0.0",
+ "asyncbox": "6.3.0",
+ "axios": "1.18.0",
+ "bluebird": "3.7.2",
+ "bplist-creator": "0.1.1",
+ "bplist-parser": "0.3.2",
+ "form-data": "4.0.6",
+ "glob": "13.0.6",
+ "jsftp": "2.1.3",
+ "klaw": "4.1.0",
+ "lockfile": "1.0.4",
+ "normalize-package-data": "8.0.0",
+ "plist": "4.0.0",
+ "pluralize": "8.0.0",
+ "sanitize-filename": "1.6.4",
+ "semver": "7.8.4",
+ "shell-quote": "1.8.4",
+ "teen_process": "4.1.3",
+ "type-fest": "5.7.0",
+ "uuid": "14.0.0",
+ "which": "6.0.1",
+ "yauzl": "3.4.0"
},
"engines": {
- "node": ">=6.9.0"
+ "node": "^20.19.0 || ^22.12.0 || >=24.0.0",
+ "npm": ">=10"
+ },
+ "optionalDependencies": {
+ "sharp": "0.35.1"
}
},
- "node_modules/@babel/helper-compilation-targets": {
- "version": "7.23.6",
- "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz",
- "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==",
+ "node_modules/@appium/support/node_modules/@appium/logger": {
+ "version": "2.0.9",
+ "resolved": "https://registry.npmjs.org/@appium/logger/-/logger-2.0.9.tgz",
+ "integrity": "sha512-3rNqtyxTygrDkxEMA2UB35EQfzxlnGCkIJLdIRDLKhVfbHgFw8XEnPnYuvMKvzG8zVeBUoh76dxKVHyIezPsIQ==",
"dev": true,
+ "license": "ISC",
"dependencies": {
- "@babel/compat-data": "^7.23.5",
- "@babel/helper-validator-option": "^7.23.5",
- "browserslist": "^4.22.2",
- "lru-cache": "^5.1.1",
- "semver": "^6.3.1"
+ "lru-cache": "11.5.1"
},
"engines": {
- "node": ">=6.9.0"
+ "node": "^20.19.0 || ^22.12.0 || >=24.0.0",
+ "npm": ">=10"
}
},
- "node_modules/@babel/helper-compilation-targets/node_modules/semver": {
- "version": "6.3.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
- "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "node_modules/@appium/support/node_modules/@appium/schema": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@appium/schema/-/schema-1.2.1.tgz",
+ "integrity": "sha512-+XmwihFeW10Q0UI/WdLsMTfnC2d2ec0ceGRdhRcfBuo5cClfm/E7VCJH2PE64KE0A17ZlsZf63FRkKfNHw9PKw==",
"dev": true,
- "bin": {
- "semver": "bin/semver.js"
+ "license": "Apache-2.0",
+ "dependencies": {
+ "json-schema": "0.4.0"
+ },
+ "engines": {
+ "node": "^20.19.0 || ^22.12.0 || >=24.0.0",
+ "npm": ">=10"
}
},
- "node_modules/@babel/helper-create-class-features-plugin": {
- "version": "7.23.6",
- "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.23.6.tgz",
- "integrity": "sha512-cBXU1vZni/CpGF29iTu4YRbOZt3Wat6zCoMDxRF1MayiEc4URxOj31tT65HUM0CRpMowA3HCJaAOVOUnMf96cw==",
+ "node_modules/@appium/support/node_modules/@appium/types": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/@appium/types/-/types-1.5.1.tgz",
+ "integrity": "sha512-cQkbSh6AwEGlowfKBxVngtBc5fkqAPmg4WdjGZ2txa81lpfuNTLX50VWM8Nxf3hiCgRMsRVfBWdU9x38OJqDrQ==",
"dev": true,
+ "license": "Apache-2.0",
"dependencies": {
- "@babel/helper-annotate-as-pure": "^7.22.5",
- "@babel/helper-environment-visitor": "^7.22.20",
- "@babel/helper-function-name": "^7.23.0",
- "@babel/helper-member-expression-to-functions": "^7.23.0",
- "@babel/helper-optimise-call-expression": "^7.22.5",
- "@babel/helper-replace-supers": "^7.22.20",
- "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5",
- "@babel/helper-split-export-declaration": "^7.22.6",
- "semver": "^6.3.1"
+ "@appium/schema": "1.2.1",
+ "type-fest": "5.7.0"
},
"engines": {
- "node": ">=6.9.0"
+ "node": "^20.19.0 || ^22.12.0 || >=24.0.0",
+ "npm": ">=10"
},
"peerDependencies": {
- "@babel/core": "^7.0.0"
+ "@appium/logger": "^2.0.0"
}
},
- "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": {
- "version": "6.3.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
- "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "node_modules/@appium/support/node_modules/@img/sharp-darwin-arm64": {
+ "version": "0.35.1",
+ "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.35.1.tgz",
+ "integrity": "sha512-T15JRWOubQ3f5+GxnWeIvo47u5qV0M9HBgJhT+f2gE1e9e6OhR6K73Re52Hm80qWcu1DNb3GweKmpr/MnuP2Ow==",
+ "cpu": [
+ "arm64"
+ ],
"dev": true,
- "bin": {
- "semver": "bin/semver.js"
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=20.9.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-darwin-arm64": "1.3.0"
}
},
- "node_modules/@babel/helper-create-regexp-features-plugin": {
- "version": "7.22.15",
- "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz",
- "integrity": "sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==",
+ "node_modules/@appium/support/node_modules/@img/sharp-darwin-x64": {
+ "version": "0.35.1",
+ "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.35.1.tgz",
+ "integrity": "sha512-t1CPD0cr7XCHjwUj6tQ5MC0pCi866I+gUW6zbUX4aFPnKd1DFBtk0M+gWcjX8VeEzgfCNiSiNTVFZ6b7kvdbnQ==",
+ "cpu": [
+ "x64"
+ ],
"dev": true,
- "dependencies": {
- "@babel/helper-annotate-as-pure": "^7.22.5",
- "regexpu-core": "^5.3.1",
- "semver": "^6.3.1"
- },
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
"engines": {
- "node": ">=6.9.0"
+ "node": ">=20.9.0"
},
- "peerDependencies": {
- "@babel/core": "^7.0.0"
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-darwin-x64": "1.3.0"
}
},
- "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": {
- "version": "6.3.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
- "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "node_modules/@appium/support/node_modules/@img/sharp-libvips-darwin-arm64": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.3.0.tgz",
+ "integrity": "sha512-EKbmBKtyTH+GPFDRw2TgK2oV6hyxxlJVIar4hoTYSNmIwipgMFdxPQqR392GmfdsPGWga0mCFN1cCKjRb9cljw==",
+ "cpu": [
+ "arm64"
+ ],
"dev": true,
- "bin": {
- "semver": "bin/semver.js"
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
}
},
- "node_modules/@babel/helper-define-polyfill-provider": {
- "version": "0.5.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.5.0.tgz",
- "integrity": "sha512-NovQquuQLAQ5HuyjCz7WQP9MjRj7dx++yspwiyUiGl9ZyadHRSql1HZh5ogRd8W8w6YM6EQ/NTB8rgjLt5W65Q==",
+ "node_modules/@appium/support/node_modules/@img/sharp-libvips-darwin-x64": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.3.0.tgz",
+ "integrity": "sha512-Pl2OmOvrJ42adUllESxBsG54PfXLo1OYg9i3c5/5Ln/qJ0gZuTM9YMhQJPIbXqwidLRc/c2zuHt4RsrymmNv7A==",
+ "cpu": [
+ "x64"
+ ],
"dev": true,
- "dependencies": {
- "@babel/helper-compilation-targets": "^7.22.6",
- "@babel/helper-plugin-utils": "^7.22.5",
- "debug": "^4.1.1",
- "lodash.debounce": "^4.0.8",
- "resolve": "^1.14.2"
- },
- "peerDependencies": {
- "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
}
},
- "node_modules/@babel/helper-environment-visitor": {
- "version": "7.22.20",
- "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz",
- "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==",
+ "node_modules/@appium/support/node_modules/@img/sharp-libvips-linux-arm": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.3.0.tgz",
+ "integrity": "sha512-A8UpHoUDW4DwnXoV6+q3C1s7QLRAHtPDEjWuNZjwHMyoCNZnm0GeNN8ls9f/bsEYTRQRW96C/n34XJQHJ2fT7A==",
+ "cpu": [
+ "arm"
+ ],
"dev": true,
- "engines": {
- "node": ">=6.9.0"
+ "libc": [
+ "glibc"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
}
},
- "node_modules/@babel/helper-function-name": {
- "version": "7.23.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz",
- "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==",
+ "node_modules/@appium/support/node_modules/@img/sharp-libvips-linux-arm64": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.3.0.tgz",
+ "integrity": "sha512-C0SqjoFKnszqa44EQ7xoaT48nnO0lOyXEULfXMWi8krrjOPGYkeK30Okzla6ATbBYsyZ0ySinK0FVkpv3DwzfQ==",
+ "cpu": [
+ "arm64"
+ ],
"dev": true,
- "dependencies": {
- "@babel/template": "^7.22.15",
- "@babel/types": "^7.23.0"
- },
- "engines": {
- "node": ">=6.9.0"
+ "libc": [
+ "glibc"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
}
},
- "node_modules/@babel/helper-hoist-variables": {
- "version": "7.22.5",
- "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz",
- "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==",
+ "node_modules/@appium/support/node_modules/@img/sharp-libvips-linux-ppc64": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.3.0.tgz",
+ "integrity": "sha512-WOpkVxAjFd369iaIzEgNRreFD+gWdUMIGD5zplhNKNeqS6mm5dac3q2AFyCBmzYoAdouzZvRBgxy4z8QHZb4/A==",
+ "cpu": [
+ "ppc64"
+ ],
"dev": true,
- "dependencies": {
- "@babel/types": "^7.22.5"
- },
- "engines": {
- "node": ">=6.9.0"
+ "libc": [
+ "glibc"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
}
},
- "node_modules/@babel/helper-member-expression-to-functions": {
- "version": "7.23.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz",
- "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==",
+ "node_modules/@appium/support/node_modules/@img/sharp-libvips-linux-riscv64": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.3.0.tgz",
+ "integrity": "sha512-DRWw0mOHusrCCuw2rqP87oLg6PGlkomVDFqw2hIwsSfwWpu4k3XLcBPaKKl6ct/GtL/cwNkgwjV/tc0Mqht3VA==",
+ "cpu": [
+ "riscv64"
+ ],
"dev": true,
- "dependencies": {
- "@babel/types": "^7.23.0"
- },
- "engines": {
- "node": ">=6.9.0"
+ "libc": [
+ "glibc"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
}
},
- "node_modules/@babel/helper-module-imports": {
- "version": "7.22.15",
- "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz",
- "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==",
+ "node_modules/@appium/support/node_modules/@img/sharp-libvips-linux-s390x": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.3.0.tgz",
+ "integrity": "sha512-9APy+nFWhHS+kzLgWZfLcyrUd7YqnAQVa4BPOo4xkoHpdoktOAPG4cEr9+Jpl0TtqfVmcMJimNL5qNTyyOHZNA==",
+ "cpu": [
+ "s390x"
+ ],
"dev": true,
- "dependencies": {
- "@babel/types": "^7.22.15"
- },
- "engines": {
- "node": ">=6.9.0"
+ "libc": [
+ "glibc"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
}
},
- "node_modules/@babel/helper-module-transforms": {
- "version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz",
- "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==",
+ "node_modules/@appium/support/node_modules/@img/sharp-libvips-linux-x64": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.3.0.tgz",
+ "integrity": "sha512-y9RNUYDe2A1UAdhLyfeOodGRszQdaEoe4nfOpp/sNVPl2CWIcUyFaDoCh4vPLPxu19803j2naLqZup2WxDXCLA==",
+ "cpu": [
+ "x64"
+ ],
"dev": true,
- "dependencies": {
- "@babel/helper-environment-visitor": "^7.22.20",
- "@babel/helper-module-imports": "^7.22.15",
- "@babel/helper-simple-access": "^7.22.5",
- "@babel/helper-split-export-declaration": "^7.22.6",
- "@babel/helper-validator-identifier": "^7.22.20"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0"
+ "libc": [
+ "glibc"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
}
},
- "node_modules/@babel/helper-optimise-call-expression": {
- "version": "7.22.5",
- "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz",
- "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==",
+ "node_modules/@appium/support/node_modules/@img/sharp-libvips-linuxmusl-arm64": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.3.0.tgz",
+ "integrity": "sha512-cC1wkC0Mlucd0KSiGrLkJnB/ZqPvZCntc/Lk7ZnYO5ZSbF2euNek4Xvxafojq+wN1q/W0eprdpUIjUr/EV2PBg==",
+ "cpu": [
+ "arm64"
+ ],
"dev": true,
- "dependencies": {
- "@babel/types": "^7.22.5"
- },
- "engines": {
- "node": ">=6.9.0"
+ "libc": [
+ "musl"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
}
},
- "node_modules/@babel/helper-plugin-utils": {
- "version": "7.22.5",
- "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz",
- "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==",
+ "node_modules/@appium/support/node_modules/@img/sharp-libvips-linuxmusl-x64": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.3.0.tgz",
+ "integrity": "sha512-LiYMhUZicB1QG//+RvmYZpXJO8fYRENfp+MZUCnG9aw+AKvGAy9gPaCnuwsPcBFs8EV66M0NNxj9VHcNklE8zw==",
+ "cpu": [
+ "x64"
+ ],
"dev": true,
- "engines": {
- "node": ">=6.9.0"
+ "libc": [
+ "musl"
+ ],
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "funding": {
+ "url": "https://opencollective.com/libvips"
}
},
- "node_modules/@babel/helper-remap-async-to-generator": {
- "version": "7.22.20",
- "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz",
- "integrity": "sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==",
+ "node_modules/@appium/support/node_modules/@img/sharp-linux-arm": {
+ "version": "0.35.1",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.35.1.tgz",
+ "integrity": "sha512-jygmR02PpCYypt7xB7nst1vqjZp/BpRA/Kf9nK7qRponJ/KrLPaZWEG4G15z1d2FZ6XqI+T0350ha3RSnKx24A==",
+ "cpu": [
+ "arm"
+ ],
"dev": true,
- "dependencies": {
- "@babel/helper-annotate-as-pure": "^7.22.5",
- "@babel/helper-environment-visitor": "^7.22.20",
- "@babel/helper-wrap-function": "^7.22.20"
- },
+ "libc": [
+ "glibc"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
"engines": {
- "node": ">=6.9.0"
+ "node": ">=20.9.0"
},
- "peerDependencies": {
- "@babel/core": "^7.0.0"
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linux-arm": "1.3.0"
}
},
- "node_modules/@babel/helper-replace-supers": {
- "version": "7.22.20",
- "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz",
- "integrity": "sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==",
+ "node_modules/@appium/support/node_modules/@img/sharp-linux-arm64": {
+ "version": "0.35.1",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.35.1.tgz",
+ "integrity": "sha512-ErCRyGU7LeoaFBZ0xW8hhLlXzhAg80sc4vxePB86qvtEvW1jEhhmbiNBP4oEzZfPMnu6HwHXfzD2W2kBU+RnCw==",
+ "cpu": [
+ "arm64"
+ ],
"dev": true,
- "dependencies": {
- "@babel/helper-environment-visitor": "^7.22.20",
- "@babel/helper-member-expression-to-functions": "^7.22.15",
- "@babel/helper-optimise-call-expression": "^7.22.5"
- },
+ "libc": [
+ "glibc"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
"engines": {
- "node": ">=6.9.0"
+ "node": ">=20.9.0"
},
- "peerDependencies": {
- "@babel/core": "^7.0.0"
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linux-arm64": "1.3.0"
}
},
- "node_modules/@babel/helper-simple-access": {
- "version": "7.22.5",
- "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz",
- "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==",
+ "node_modules/@appium/support/node_modules/@img/sharp-linux-ppc64": {
+ "version": "0.35.1",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.35.1.tgz",
+ "integrity": "sha512-LUWZ2+r2UoLCd8j0RLCwQ4gL6w47+Y7igxtVnPIDXOOEjV86LpBkAHq5VpJeg+GHbw0KN/JWlPJOdZjyZnFqFQ==",
+ "cpu": [
+ "ppc64"
+ ],
"dev": true,
- "dependencies": {
- "@babel/types": "^7.22.5"
- },
+ "libc": [
+ "glibc"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
"engines": {
- "node": ">=6.9.0"
+ "node": ">=20.9.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linux-ppc64": "1.3.0"
}
},
- "node_modules/@babel/helper-skip-transparent-expression-wrappers": {
- "version": "7.22.5",
- "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz",
- "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==",
+ "node_modules/@appium/support/node_modules/@img/sharp-linux-riscv64": {
+ "version": "0.35.1",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.35.1.tgz",
+ "integrity": "sha512-i7x6J3mwF4JgT0sM4V4WlAWdJ0bucPtA9rzO1bTji1n5qgBq/W5nn87RvOQPleuuxahNoLdTngByD8/vDDLArw==",
+ "cpu": [
+ "riscv64"
+ ],
"dev": true,
- "dependencies": {
- "@babel/types": "^7.22.5"
- },
+ "libc": [
+ "glibc"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
"engines": {
- "node": ">=6.9.0"
+ "node": ">=20.9.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linux-riscv64": "1.3.0"
}
},
- "node_modules/@babel/helper-split-export-declaration": {
- "version": "7.22.6",
- "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz",
- "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==",
+ "node_modules/@appium/support/node_modules/@img/sharp-linux-s390x": {
+ "version": "0.35.1",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.35.1.tgz",
+ "integrity": "sha512-0zSaTUjTF0kIWTSYxD4EG/nvCU4jez53+3RdURtoY3HvbXtIQ98W90JnrGz/oLRFuEnfIy9+7xeq883euc0ZWw==",
+ "cpu": [
+ "s390x"
+ ],
"dev": true,
- "dependencies": {
- "@babel/types": "^7.22.5"
+ "libc": [
+ "glibc"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=20.9.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
},
+ "optionalDependencies": {
+ "@img/sharp-libvips-linux-s390x": "1.3.0"
+ }
+ },
+ "node_modules/@appium/support/node_modules/@img/sharp-linux-x64": {
+ "version": "0.35.1",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.35.1.tgz",
+ "integrity": "sha512-NbJD4mWdeyrNQKluO/tR/wBDOelcowSVGNBWxI0e3ZtlXc6F/UOVKDj1MLD4zl3oHTuvKW3s+MA9N54YTldAYw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "libc": [
+ "glibc"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
"engines": {
- "node": ">=6.9.0"
+ "node": ">=20.9.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linux-x64": "1.3.0"
}
},
- "node_modules/@babel/helper-string-parser": {
- "version": "7.23.4",
- "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz",
- "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==",
+ "node_modules/@appium/support/node_modules/@img/sharp-linuxmusl-arm64": {
+ "version": "0.35.1",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.35.1.tgz",
+ "integrity": "sha512-VoW2sQCWI+0YIKQEmWJ8vzaQjTg9wIyfkFpvEfAS2h43X6iHu7GTk1hhOgB4IpSzCHe8UwQZIcx7b81VTaOrJA==",
+ "cpu": [
+ "arm64"
+ ],
"dev": true,
+ "libc": [
+ "musl"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
"engines": {
- "node": ">=6.9.0"
+ "node": ">=20.9.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linuxmusl-arm64": "1.3.0"
}
},
- "node_modules/@babel/helper-validator-identifier": {
- "version": "7.22.20",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz",
- "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==",
+ "node_modules/@appium/support/node_modules/@img/sharp-linuxmusl-x64": {
+ "version": "0.35.1",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.35.1.tgz",
+ "integrity": "sha512-LjBoSd/c5JU0/K5MwzDMlgsSRP2bPn98JQGFFQAOLQ0bU/1z4ekxUdSKY9BmlwSh/cA+OrvpgsWqfZyYfVHBRw==",
+ "cpu": [
+ "x64"
+ ],
"dev": true,
+ "libc": [
+ "musl"
+ ],
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
"engines": {
- "node": ">=6.9.0"
+ "node": ">=20.9.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linuxmusl-x64": "1.3.0"
}
},
- "node_modules/@babel/helper-validator-option": {
- "version": "7.23.5",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz",
- "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==",
+ "node_modules/@appium/support/node_modules/@img/sharp-win32-arm64": {
+ "version": "0.35.1",
+ "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.35.1.tgz",
+ "integrity": "sha512-IkmHwuFhYpd3bTsN5SAahjwhiAcyXPooBt8vEUgxY3T0IP70sSJ0nU1xiPzZY8AH/OB1XpV3j8aZSVSOSfTbdA==",
+ "cpu": [
+ "arm64"
+ ],
"dev": true,
+ "license": "Apache-2.0 AND LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
"engines": {
- "node": ">=6.9.0"
+ "node": ">=20.9.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
}
},
- "node_modules/@babel/helper-wrap-function": {
- "version": "7.22.20",
- "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz",
- "integrity": "sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==",
+ "node_modules/@appium/support/node_modules/@img/sharp-win32-ia32": {
+ "version": "0.35.1",
+ "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.35.1.tgz",
+ "integrity": "sha512-wQahqCi9MD8Yxzg4gVM4fNrZxh+r6vD55PyIg+WJPaM5ZRUyF35iQpwJCuma3r6viU9/8Pxlc+XHV+woVa6nCQ==",
+ "cpu": [
+ "ia32"
+ ],
"dev": true,
- "dependencies": {
- "@babel/helper-function-name": "^7.22.5",
- "@babel/template": "^7.22.15",
- "@babel/types": "^7.22.19"
+ "license": "Apache-2.0 AND LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": "^20.9.0"
},
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@appium/support/node_modules/@img/sharp-win32-x64": {
+ "version": "0.35.1",
+ "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.35.1.tgz",
+ "integrity": "sha512-WzBtkYtZHATLPe8XRharxZXxQ9cdLrQWHiwxt+BJ5rBsisQrKeeV86ErxPSVhcG6xCEuNhs0SqLpWr7XDa2k6w==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "Apache-2.0 AND LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
"engines": {
- "node": ">=6.9.0"
+ "node": ">=20.9.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
}
},
- "node_modules/@babel/helpers": {
- "version": "7.23.9",
- "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.9.tgz",
- "integrity": "sha512-87ICKgU5t5SzOT7sBMfCOZQ2rHjRU+Pcb9BoILMYz600W6DkVRLFBPwQ18gwUVvggqXivaUakpnxWQGbpywbBQ==",
+ "node_modules/@appium/support/node_modules/agent-base": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
+ "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/template": "^7.23.9",
- "@babel/traverse": "^7.23.9",
- "@babel/types": "^7.23.9"
+ "debug": "4"
},
"engines": {
- "node": ">=6.9.0"
+ "node": ">= 6.0.0"
}
},
- "node_modules/@babel/highlight": {
- "version": "7.23.4",
- "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz",
- "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==",
+ "node_modules/@appium/support/node_modules/axios": {
+ "version": "1.18.0",
+ "resolved": "https://registry.npmjs.org/axios/-/axios-1.18.0.tgz",
+ "integrity": "sha512-E32NzpYKp++W7XRe52rHiXV2ehxmh3wbdgO7MHeFM+vqxLBYHzt0ElkiImtOBxtOmyp0yoC8C6uESVV84Y2/hw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/helper-validator-identifier": "^7.22.20",
- "chalk": "^2.4.2",
- "js-tokens": "^4.0.0"
- },
- "engines": {
- "node": ">=6.9.0"
+ "follow-redirects": "^1.16.0",
+ "form-data": "^4.0.5",
+ "https-proxy-agent": "^5.0.1",
+ "proxy-from-env": "^2.1.0"
}
},
- "node_modules/@babel/parser": {
- "version": "7.23.9",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.9.tgz",
- "integrity": "sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==",
+ "node_modules/@appium/support/node_modules/form-data": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.6.tgz",
+ "integrity": "sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ==",
"dev": true,
- "bin": {
- "parser": "bin/babel-parser.js"
+ "license": "MIT",
+ "dependencies": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.8",
+ "es-set-tostringtag": "^2.1.0",
+ "hasown": "^2.0.4",
+ "mime-types": "^2.1.35"
},
"engines": {
- "node": ">=6.0.0"
+ "node": ">= 6"
}
},
- "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": {
- "version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.23.3.tgz",
- "integrity": "sha512-iRkKcCqb7iGnq9+3G6rZ+Ciz5VywC4XNRHe57lKM+jOeYAoR0lVqdeeDRfh0tQcTfw/+vBhHn926FmQhLtlFLQ==",
+ "node_modules/@appium/support/node_modules/https-proxy-agent": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
+ "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.22.5"
+ "agent-base": "6",
+ "debug": "4"
},
"engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0"
+ "node": ">= 6"
}
},
- "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": {
- "version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.23.3.tgz",
- "integrity": "sha512-WwlxbfMNdVEpQjZmK5mhm7oSwD3dS6eU+Iwsi4Knl9wAletWem7kaRsGOG+8UEbRyqxY4SS5zvtfXwX+jMxUwQ==",
+ "node_modules/@appium/support/node_modules/lru-cache": {
+ "version": "11.5.1",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.1.tgz",
+ "integrity": "sha512-RPimw/7aMdv2oqRrxKwvZXcPfwBrn/JZ2xYcY9Hus/6LaS3VOAKVWKWgNLCFSiOm1ESXinjsDlidVU7JlnCN2A==",
"dev": true,
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.22.5",
- "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5",
- "@babel/plugin-transform-optional-chaining": "^7.23.3"
- },
+ "license": "BlueOak-1.0.0",
"engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.13.0"
+ "node": "20 || >=22"
+ }
+ },
+ "node_modules/@appium/support/node_modules/mime-db": {
+ "version": "1.52.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
}
},
- "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": {
- "version": "7.23.7",
- "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.23.7.tgz",
- "integrity": "sha512-LlRT7HgaifEpQA1ZgLVOIJZZFVPWN5iReq/7/JixwBtwcoeVGDBD53ZV28rrsLYOZs1Y/EHhA8N/Z6aazHR8cw==",
+ "node_modules/@appium/support/node_modules/mime-types": {
+ "version": "2.1.35",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/helper-environment-visitor": "^7.22.20",
- "@babel/helper-plugin-utils": "^7.22.5"
+ "mime-db": "1.52.0"
},
"engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0"
+ "node": ">= 0.6"
}
},
- "node_modules/@babel/plugin-proposal-class-properties": {
- "version": "7.18.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz",
- "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==",
- "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead.",
+ "node_modules/@appium/support/node_modules/plist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/plist/-/plist-4.0.0.tgz",
+ "integrity": "sha512-4dOqNo0Y2NpfSf9q4+zr4bh7pzNWeckIam34Z0KYJhg8qtNNfh59VbD+Yna5SjwcxawVvLKx5w5FtuCijpEF4Q==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/helper-create-class-features-plugin": "^7.18.6",
- "@babel/helper-plugin-utils": "^7.18.6"
+ "@xmldom/xmldom": "^0.9.10",
+ "xmlbuilder": "^15.1.1"
},
"engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
+ "node": ">=18"
}
},
- "node_modules/@babel/plugin-proposal-private-property-in-object": {
- "version": "7.21.0-placeholder-for-preset-env.2",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz",
- "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==",
+ "node_modules/@appium/support/node_modules/proxy-from-env": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-2.1.0.tgz",
+ "integrity": "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==",
"dev": true,
+ "license": "MIT",
"engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
+ "node": ">=10"
}
},
- "node_modules/@babel/plugin-syntax-async-generators": {
+ "node_modules/@appium/support/node_modules/semver": {
"version": "7.8.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz",
- "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.4.tgz",
+ "integrity": "sha512-rUCObTnP32Q08R2uuIrt7r9PlEonuTmtuXYcW6s5kjdlj3xbnwe+21yXptAUYcMAABLkYYTtnmzb3w3EDZfueA==",
"dev": true,
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.8.0"
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
},
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
+ "engines": {
+ "node": ">=10"
}
},
- "node_modules/@babel/plugin-syntax-class-properties": {
- "version": "7.12.13",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz",
- "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==",
+ "node_modules/@appium/support/node_modules/sharp": {
+ "version": "0.35.1",
+ "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.35.1.tgz",
+ "integrity": "sha512-lW979AMi+ESidzMv/Lnv+F9bknzLyxLqFI05Sm433vOeRcltgxQmXpnfOOFIAlKtwXU/ksupm2srQoFCkR214g==",
"dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
"dependencies": {
- "@babel/helper-plugin-utils": "^7.12.13"
+ "@img/colour": "^1.1.0",
+ "detect-libc": "^2.1.2",
+ "semver": "^7.8.4"
},
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
+ "engines": {
+ "node": ">=20.9.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-darwin-arm64": "0.35.1",
+ "@img/sharp-darwin-x64": "0.35.1",
+ "@img/sharp-freebsd-wasm32": "0.35.1",
+ "@img/sharp-libvips-darwin-arm64": "1.3.0",
+ "@img/sharp-libvips-darwin-x64": "1.3.0",
+ "@img/sharp-libvips-linux-arm": "1.3.0",
+ "@img/sharp-libvips-linux-arm64": "1.3.0",
+ "@img/sharp-libvips-linux-ppc64": "1.3.0",
+ "@img/sharp-libvips-linux-riscv64": "1.3.0",
+ "@img/sharp-libvips-linux-s390x": "1.3.0",
+ "@img/sharp-libvips-linux-x64": "1.3.0",
+ "@img/sharp-libvips-linuxmusl-arm64": "1.3.0",
+ "@img/sharp-libvips-linuxmusl-x64": "1.3.0",
+ "@img/sharp-linux-arm": "0.35.1",
+ "@img/sharp-linux-arm64": "0.35.1",
+ "@img/sharp-linux-ppc64": "0.35.1",
+ "@img/sharp-linux-riscv64": "0.35.1",
+ "@img/sharp-linux-s390x": "0.35.1",
+ "@img/sharp-linux-x64": "0.35.1",
+ "@img/sharp-linuxmusl-arm64": "0.35.1",
+ "@img/sharp-linuxmusl-x64": "0.35.1",
+ "@img/sharp-webcontainers-wasm32": "0.35.1",
+ "@img/sharp-win32-arm64": "0.35.1",
+ "@img/sharp-win32-ia32": "0.35.1",
+ "@img/sharp-win32-x64": "0.35.1"
+ }
+ },
+ "node_modules/@appium/support/node_modules/type-fest": {
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-5.7.0.tgz",
+ "integrity": "sha512-1URUxUqfHFM1c+zfSPsa3gnkO7Aq21qyH75SIduNYz4SzY964rn1X2vCMQaHSHhktiw+0kPa2iyb6PUpXqB6Vg==",
+ "dev": true,
+ "license": "(MIT OR CC0-1.0)",
+ "dependencies": {
+ "tagged-tag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=20"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/@babel/plugin-syntax-class-static-block": {
- "version": "7.14.5",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz",
- "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==",
+ "node_modules/@appium/support/node_modules/yauzl": {
+ "version": "3.4.0",
+ "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-3.4.0.tgz",
+ "integrity": "sha512-jIH9yLR9wqr0wOS0TpBvo/g/2UgZH5qePVbjgRliiF0BYvOZyaBknKsF+x9Iht0O6sqgnB93rCICdOZFecJuDw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.14.5"
+ "pend": "~1.2.0"
},
"engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
+ "node": ">=12"
}
},
- "node_modules/@babel/plugin-syntax-dynamic-import": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz",
- "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==",
+ "node_modules/@appium/tsconfig": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@appium/tsconfig/-/tsconfig-1.1.2.tgz",
+ "integrity": "sha512-lHKBm7hXCROc1Ha/cBxS4o3iQkeY96Pz7qM9Uh9vFDkdpTGBk56V1lmc3iGcgBYKBlaRT/LZmTsqClvHoiXhvw==",
"dev": true,
+ "license": "Apache-2.0",
+ "peer": true,
"dependencies": {
- "@babel/helper-plugin-utils": "^7.8.0"
+ "@tsconfig/node20": "20.1.9"
},
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
+ "engines": {
+ "node": "^20.19.0 || ^22.12.0 || >=24.0.0",
+ "npm": ">=10"
}
},
- "node_modules/@babel/plugin-syntax-export-namespace-from": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz",
- "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==",
+ "node_modules/@appium/types": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/@appium/types/-/types-1.5.0.tgz",
+ "integrity": "sha512-xo7ahFernVOi/GK5Pnid7ewJL16TyP9lINwe+tmoRsNcNhr2hxa2yn4pAx9BjyvM5gNZrlH6GIsmq+5gDPsgKw==",
"dev": true,
+ "license": "Apache-2.0",
+ "peer": true,
"dependencies": {
- "@babel/helper-plugin-utils": "^7.8.3"
+ "@appium/logger": "2.0.8",
+ "@appium/schema": "1.2.0",
+ "@appium/tsconfig": "1.1.2",
+ "type-fest": "5.6.0"
},
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
+ "engines": {
+ "node": "^20.19.0 || ^22.12.0 || >=24.0.0",
+ "npm": ">=10"
}
},
- "node_modules/@babel/plugin-syntax-flow": {
- "version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.23.3.tgz",
- "integrity": "sha512-YZiAIpkJAwQXBJLIQbRFayR5c+gJ35Vcz3bg954k7cd73zqjvhacJuL9RbrzPz8qPmZdgqP6EUKwy0PCNhaaPA==",
+ "node_modules/@babel/code-frame": {
+ "version": "7.29.0",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz",
+ "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.22.5"
+ "@babel/helper-validator-identifier": "^7.28.5",
+ "js-tokens": "^4.0.0",
+ "picocolors": "^1.1.1"
},
"engines": {
"node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
}
},
- "node_modules/@babel/plugin-syntax-import-assertions": {
- "version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.23.3.tgz",
- "integrity": "sha512-lPgDSU+SJLK3xmFDTV2ZRQAiM7UuUjGidwBywFavObCiZc1BeAAcMtHJKUya92hPHO+at63JJPLygilZard8jw==",
+ "node_modules/@babel/compat-data": {
+ "version": "7.29.0",
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz",
+ "integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==",
"dev": true,
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.22.5"
- },
+ "license": "MIT",
"engines": {
"node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
}
},
- "node_modules/@babel/plugin-syntax-import-attributes": {
- "version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.23.3.tgz",
- "integrity": "sha512-pawnE0P9g10xgoP7yKr6CK63K2FMsTE+FZidZO/1PwRdzmAPVs+HS1mAURUsgaoxammTJvULUdIkEK0gOcU2tA==",
- "dev": true,
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.22.5"
+ "node_modules/@babel/core": {
+ "version": "7.29.0",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz",
+ "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.29.0",
+ "@babel/generator": "^7.29.0",
+ "@babel/helper-compilation-targets": "^7.28.6",
+ "@babel/helper-module-transforms": "^7.28.6",
+ "@babel/helpers": "^7.28.6",
+ "@babel/parser": "^7.29.0",
+ "@babel/template": "^7.28.6",
+ "@babel/traverse": "^7.29.0",
+ "@babel/types": "^7.29.0",
+ "@jridgewell/remapping": "^2.3.5",
+ "convert-source-map": "^2.0.0",
+ "debug": "^4.1.0",
+ "gensync": "^1.0.0-beta.2",
+ "json5": "^2.2.3",
+ "semver": "^6.3.1"
},
"engines": {
"node": ">=6.9.0"
},
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/babel"
}
},
- "node_modules/@babel/plugin-syntax-import-meta": {
- "version": "7.10.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz",
- "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==",
+ "node_modules/@babel/core/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
"dev": true,
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.10.4"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
}
},
- "node_modules/@babel/plugin-syntax-json-strings": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz",
- "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==",
+ "node_modules/@babel/generator": {
+ "version": "7.29.1",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz",
+ "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.8.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-syntax-jsx": {
- "version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz",
- "integrity": "sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==",
- "dev": true,
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.22.5"
+ "@babel/parser": "^7.29.0",
+ "@babel/types": "^7.29.0",
+ "@jridgewell/gen-mapping": "^0.3.12",
+ "@jridgewell/trace-mapping": "^0.3.28",
+ "jsesc": "^3.0.2"
},
"engines": {
"node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
}
},
- "node_modules/@babel/plugin-syntax-logical-assignment-operators": {
- "version": "7.10.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz",
- "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==",
+ "node_modules/@babel/helper-compilation-targets": {
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz",
+ "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.10.4"
+ "@babel/compat-data": "^7.28.6",
+ "@babel/helper-validator-option": "^7.27.1",
+ "browserslist": "^4.24.0",
+ "lru-cache": "^5.1.1",
+ "semver": "^6.3.1"
},
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
+ "engines": {
+ "node": ">=6.9.0"
}
},
- "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz",
- "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==",
+ "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
+ "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
"dev": true,
+ "license": "ISC",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.8.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
+ "yallist": "^3.0.2"
}
},
- "node_modules/@babel/plugin-syntax-numeric-separator": {
- "version": "7.10.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz",
- "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==",
+ "node_modules/@babel/helper-compilation-targets/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
"dev": true,
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.10.4"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
}
},
- "node_modules/@babel/plugin-syntax-object-rest-spread": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz",
- "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==",
+ "node_modules/@babel/helper-compilation-targets/node_modules/yallist": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
+ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
"dev": true,
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.8.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
+ "license": "ISC"
},
- "node_modules/@babel/plugin-syntax-optional-catch-binding": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz",
- "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==",
+ "node_modules/@babel/helper-globals": {
+ "version": "7.28.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz",
+ "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==",
"dev": true,
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.8.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
}
},
- "node_modules/@babel/plugin-syntax-optional-chaining": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz",
- "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==",
+ "node_modules/@babel/helper-module-imports": {
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz",
+ "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.8.0"
+ "@babel/traverse": "^7.28.6",
+ "@babel/types": "^7.28.6"
},
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
+ "engines": {
+ "node": ">=6.9.0"
}
},
- "node_modules/@babel/plugin-syntax-private-property-in-object": {
- "version": "7.14.5",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz",
- "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==",
+ "node_modules/@babel/helper-module-transforms": {
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz",
+ "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.14.5"
+ "@babel/helper-module-imports": "^7.28.6",
+ "@babel/helper-validator-identifier": "^7.28.5",
+ "@babel/traverse": "^7.28.6"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
- "@babel/core": "^7.0.0-0"
+ "@babel/core": "^7.0.0"
}
},
- "node_modules/@babel/plugin-syntax-top-level-await": {
- "version": "7.14.5",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz",
- "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==",
+ "node_modules/@babel/helper-plugin-utils": {
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz",
+ "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==",
"dev": true,
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.14.5"
- },
+ "license": "MIT",
"engines": {
"node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
}
},
- "node_modules/@babel/plugin-syntax-unicode-sets-regex": {
- "version": "7.18.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz",
- "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==",
+ "node_modules/@babel/helper-string-parser": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz",
+ "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==",
"dev": true,
- "dependencies": {
- "@babel/helper-create-regexp-features-plugin": "^7.18.6",
- "@babel/helper-plugin-utils": "^7.18.6"
- },
+ "license": "MIT",
"engines": {
"node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0"
}
},
- "node_modules/@babel/plugin-transform-arrow-functions": {
- "version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.23.3.tgz",
- "integrity": "sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ==",
+ "node_modules/@babel/helper-validator-identifier": {
+ "version": "7.28.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz",
+ "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==",
"dev": true,
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.22.5"
- },
+ "license": "MIT",
"engines": {
"node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
}
},
- "node_modules/@babel/plugin-transform-async-generator-functions": {
- "version": "7.23.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.9.tgz",
- "integrity": "sha512-8Q3veQEDGe14dTYuwagbRtwxQDnytyg1JFu4/HwEMETeofocrB0U0ejBJIXoeG/t2oXZ8kzCyI0ZZfbT80VFNQ==",
+ "node_modules/@babel/helper-validator-option": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz",
+ "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==",
"dev": true,
- "dependencies": {
- "@babel/helper-environment-visitor": "^7.22.20",
- "@babel/helper-plugin-utils": "^7.22.5",
- "@babel/helper-remap-async-to-generator": "^7.22.20",
- "@babel/plugin-syntax-async-generators": "^7.8.4"
- },
+ "license": "MIT",
"engines": {
"node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
}
},
- "node_modules/@babel/plugin-transform-async-to-generator": {
- "version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.23.3.tgz",
- "integrity": "sha512-A7LFsKi4U4fomjqXJlZg/u0ft/n8/7n7lpffUP/ZULx/DtV9SGlNKZolHH6PE8Xl1ngCc0M11OaeZptXVkfKSw==",
+ "node_modules/@babel/helpers": {
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.6.tgz",
+ "integrity": "sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/helper-module-imports": "^7.22.15",
- "@babel/helper-plugin-utils": "^7.22.5",
- "@babel/helper-remap-async-to-generator": "^7.22.20"
+ "@babel/template": "^7.28.6",
+ "@babel/types": "^7.28.6"
},
"engines": {
"node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
}
},
- "node_modules/@babel/plugin-transform-block-scoped-functions": {
- "version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.23.3.tgz",
- "integrity": "sha512-vI+0sIaPIO6CNuM9Kk5VmXcMVRiOpDh7w2zZt9GXzmE/9KD70CUEVhvPR/etAeNK/FAEkhxQtXOzVF3EuRL41A==",
+ "node_modules/@babel/parser": {
+ "version": "7.29.0",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.0.tgz",
+ "integrity": "sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.22.5"
+ "@babel/types": "^7.29.0"
},
- "engines": {
- "node": ">=6.9.0"
+ "bin": {
+ "parser": "bin/babel-parser.js"
},
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
+ "engines": {
+ "node": ">=6.0.0"
}
},
- "node_modules/@babel/plugin-transform-block-scoping": {
- "version": "7.23.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.4.tgz",
- "integrity": "sha512-0QqbP6B6HOh7/8iNR4CQU2Th/bbRtBp4KS9vcaZd1fZ0wSh5Fyssg0UCIHwxh+ka+pNDREbVLQnHCMHKZfPwfw==",
+ "node_modules/@babel/plugin-transform-arrow-functions": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.27.1.tgz",
+ "integrity": "sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.22.5"
+ "@babel/helper-plugin-utils": "^7.27.1"
},
"engines": {
"node": ">=6.9.0"
@@ -1389,14 +1664,14 @@
"@babel/core": "^7.0.0-0"
}
},
- "node_modules/@babel/plugin-transform-class-properties": {
- "version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.23.3.tgz",
- "integrity": "sha512-uM+AN8yCIjDPccsKGlw271xjJtGii+xQIF/uMPS8H15L12jZTsLfF4o5vNO7d/oUguOyfdikHGc/yi9ge4SGIg==",
+ "node_modules/@babel/plugin-transform-react-jsx-self": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz",
+ "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/helper-create-class-features-plugin": "^7.22.15",
- "@babel/helper-plugin-utils": "^7.22.5"
+ "@babel/helper-plugin-utils": "^7.27.1"
},
"engines": {
"node": ">=6.9.0"
@@ -1405,15610 +1680,7951 @@
"@babel/core": "^7.0.0-0"
}
},
- "node_modules/@babel/plugin-transform-class-static-block": {
- "version": "7.23.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.23.4.tgz",
- "integrity": "sha512-nsWu/1M+ggti1SOALj3hfx5FXzAY06fwPJsUZD4/A5e1bWi46VUIWtD+kOX6/IdhXGsXBWllLFDSnqSCdUNydQ==",
+ "node_modules/@babel/plugin-transform-react-jsx-source": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz",
+ "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/helper-create-class-features-plugin": "^7.22.15",
- "@babel/helper-plugin-utils": "^7.22.5",
- "@babel/plugin-syntax-class-static-block": "^7.14.5"
+ "@babel/helper-plugin-utils": "^7.27.1"
},
"engines": {
"node": ">=6.9.0"
},
"peerDependencies": {
- "@babel/core": "^7.12.0"
+ "@babel/core": "^7.0.0-0"
}
},
- "node_modules/@babel/plugin-transform-classes": {
- "version": "7.23.8",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.23.8.tgz",
- "integrity": "sha512-yAYslGsY1bX6Knmg46RjiCiNSwJKv2IUC8qOdYKqMMr0491SXFhcHqOdRDeCRohOOIzwN/90C6mQ9qAKgrP7dg==",
- "dev": true,
- "dependencies": {
- "@babel/helper-annotate-as-pure": "^7.22.5",
- "@babel/helper-compilation-targets": "^7.23.6",
- "@babel/helper-environment-visitor": "^7.22.20",
- "@babel/helper-function-name": "^7.23.0",
- "@babel/helper-plugin-utils": "^7.22.5",
- "@babel/helper-replace-supers": "^7.22.20",
- "@babel/helper-split-export-declaration": "^7.22.6",
- "globals": "^11.1.0"
- },
+ "node_modules/@babel/runtime": {
+ "version": "7.29.2",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.2.tgz",
+ "integrity": "sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==",
+ "license": "MIT",
"engines": {
"node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
}
},
- "node_modules/@babel/plugin-transform-computed-properties": {
- "version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.23.3.tgz",
- "integrity": "sha512-dTj83UVTLw/+nbiHqQSFdwO9CbTtwq1DsDqm3CUEtDrZNET5rT5E6bIdTlOftDTDLMYxvxHNEYO4B9SLl8SLZw==",
+ "node_modules/@babel/template": {
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz",
+ "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.22.5",
- "@babel/template": "^7.22.15"
+ "@babel/code-frame": "^7.28.6",
+ "@babel/parser": "^7.28.6",
+ "@babel/types": "^7.28.6"
},
"engines": {
"node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
}
},
- "node_modules/@babel/plugin-transform-destructuring": {
- "version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.3.tgz",
- "integrity": "sha512-n225npDqjDIr967cMScVKHXJs7rout1q+tt50inyBCPkyZ8KxeI6d+GIbSBTT/w/9WdlWDOej3V9HE5Lgk57gw==",
+ "node_modules/@babel/traverse": {
+ "version": "7.29.0",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz",
+ "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.22.5"
+ "@babel/code-frame": "^7.29.0",
+ "@babel/generator": "^7.29.0",
+ "@babel/helper-globals": "^7.28.0",
+ "@babel/parser": "^7.29.0",
+ "@babel/template": "^7.28.6",
+ "@babel/types": "^7.29.0",
+ "debug": "^4.3.1"
},
"engines": {
"node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
}
},
- "node_modules/@babel/plugin-transform-dotall-regex": {
- "version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.23.3.tgz",
- "integrity": "sha512-vgnFYDHAKzFaTVp+mneDsIEbnJ2Np/9ng9iviHw3P/KVcgONxpNULEW/51Z/BaFojG2GI2GwwXck5uV1+1NOYQ==",
+ "node_modules/@babel/types": {
+ "version": "7.29.0",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz",
+ "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/helper-create-regexp-features-plugin": "^7.22.15",
- "@babel/helper-plugin-utils": "^7.22.5"
+ "@babel/helper-string-parser": "^7.27.1",
+ "@babel/helper-validator-identifier": "^7.28.5"
},
"engines": {
"node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
}
},
- "node_modules/@babel/plugin-transform-duplicate-keys": {
- "version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.23.3.tgz",
- "integrity": "sha512-RrqQ+BQmU3Oyav3J+7/myfvRCq7Tbz+kKLLshUmMwNlDHExbGL7ARhajvoBJEvc+fCguPPu887N+3RRXBVKZUA==",
+ "node_modules/@colors/colors": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz",
+ "integrity": "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==",
"dev": true,
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.22.5"
- },
+ "license": "MIT",
+ "peer": true,
"engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
+ "node": ">=0.1.90"
}
},
- "node_modules/@babel/plugin-transform-dynamic-import": {
- "version": "7.23.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.23.4.tgz",
- "integrity": "sha512-V6jIbLhdJK86MaLh4Jpghi8ho5fGzt3imHOBu/x0jlBaPYqDoWz4RDXjmMOfnh+JWNaQleEAByZLV0QzBT4YQQ==",
+ "node_modules/@dabh/diagnostics": {
+ "version": "2.0.8",
+ "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.8.tgz",
+ "integrity": "sha512-R4MSXTVnuMzGD7bzHdW2ZhhdPC/igELENcq5IjEverBvq5hn1SXCWcsi6eSsdWP0/Ur+SItRRjAktmdoX/8R/Q==",
"dev": true,
+ "license": "MIT",
+ "peer": true,
"dependencies": {
- "@babel/helper-plugin-utils": "^7.22.5",
- "@babel/plugin-syntax-dynamic-import": "^7.8.3"
- },
+ "@so-ric/colorspace": "^1.1.6",
+ "enabled": "2.0.x",
+ "kuler": "^2.0.0"
+ }
+ },
+ "node_modules/@electron-internal/extract-zip": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/@electron-internal/extract-zip/-/extract-zip-1.0.2.tgz",
+ "integrity": "sha512-VJuNETNPEhrmQEZezeTZO5TZMV+dobBRyJ7zHjGJWIhMS7m7W1UeClt69u4hkUxv9ZZVxuli/E9Yvc4gDNHGsg==",
+ "license": "BSD-2-Clause",
"engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
+ "node": ">=22.12.0"
}
},
- "node_modules/@babel/plugin-transform-exponentiation-operator": {
- "version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.23.3.tgz",
- "integrity": "sha512-5fhCsl1odX96u7ILKHBj4/Y8vipoqwsJMh4csSA8qFfxrZDEA4Ssku2DyNvMJSmZNOEBT750LfFPbtrnTP90BQ==",
+ "node_modules/@electron/asar": {
+ "version": "3.4.1",
+ "resolved": "https://registry.npmjs.org/@electron/asar/-/asar-3.4.1.tgz",
+ "integrity": "sha512-i4/rNPRS84t0vSRa2HorerGRXWyF4vThfHesw0dmcWHp+cspK743UanA0suA5Q5y8kzY2y6YKrvbIUn69BCAiA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.15",
- "@babel/helper-plugin-utils": "^7.22.5"
+ "commander": "^5.0.0",
+ "glob": "^7.1.6",
+ "minimatch": "^3.0.4"
},
- "engines": {
- "node": ">=6.9.0"
+ "bin": {
+ "asar": "bin/asar.js"
},
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
+ "engines": {
+ "node": ">=10.12.0"
}
},
- "node_modules/@babel/plugin-transform-export-namespace-from": {
- "version": "7.23.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.23.4.tgz",
- "integrity": "sha512-GzuSBcKkx62dGzZI1WVgTWvkkz84FZO5TC5T8dl/Tht/rAla6Dg/Mz9Yhypg+ezVACf/rgDuQt3kbWEv7LdUDQ==",
+ "node_modules/@electron/asar/node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@electron/asar/node_modules/brace-expansion": {
+ "version": "1.1.14",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz",
+ "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.22.5",
- "@babel/plugin-syntax-export-namespace-from": "^7.8.3"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
}
},
- "node_modules/@babel/plugin-transform-flow-strip-types": {
- "version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.23.3.tgz",
- "integrity": "sha512-26/pQTf9nQSNVJCrLB1IkHUKyPxR+lMrH2QDPG89+Znu9rAMbtrybdbWeE9bb7gzjmE5iXHEY+e0HUwM6Co93Q==",
+ "node_modules/@electron/asar/node_modules/glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me",
"dev": true,
+ "license": "ISC",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.22.5",
- "@babel/plugin-syntax-flow": "^7.23.3"
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.1.1",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
},
"engines": {
- "node": ">=6.9.0"
+ "node": "*"
},
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
}
},
- "node_modules/@babel/plugin-transform-for-of": {
- "version": "7.23.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.23.6.tgz",
- "integrity": "sha512-aYH4ytZ0qSuBbpfhuofbg/e96oQ7U2w1Aw/UQmKT+1l39uEhUPoFS3fHevDc1G0OvewyDudfMKY1OulczHzWIw==",
+ "node_modules/@electron/asar/node_modules/minimatch": {
+ "version": "3.1.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz",
+ "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==",
"dev": true,
+ "license": "ISC",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.22.5",
- "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5"
+ "brace-expansion": "^1.1.7"
},
"engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
+ "node": "*"
}
},
- "node_modules/@babel/plugin-transform-function-name": {
- "version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.23.3.tgz",
- "integrity": "sha512-I1QXp1LxIvt8yLaib49dRW5Okt7Q4oaxao6tFVKS/anCdEOMtYwWVKoiOA1p34GOWIZjUK0E+zCp7+l1pfQyiw==",
+ "node_modules/@electron/fuses": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/@electron/fuses/-/fuses-1.8.0.tgz",
+ "integrity": "sha512-zx0EIq78WlY/lBb1uXlziZmDZI4ubcCXIMJ4uGjXzZW0nS19TjSPeXPAjzzTmKQlJUZm0SbmZhPKP7tuQ1SsEw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/helper-compilation-targets": "^7.22.15",
- "@babel/helper-function-name": "^7.23.0",
- "@babel/helper-plugin-utils": "^7.22.5"
- },
- "engines": {
- "node": ">=6.9.0"
+ "chalk": "^4.1.1",
+ "fs-extra": "^9.0.1",
+ "minimist": "^1.2.5"
},
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
+ "bin": {
+ "electron-fuses": "dist/bin.js"
}
},
- "node_modules/@babel/plugin-transform-json-strings": {
- "version": "7.23.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.23.4.tgz",
- "integrity": "sha512-81nTOqM1dMwZ/aRXQ59zVubN9wHGqk6UtqRK+/q+ciXmRy8fSolhGVvG09HHRGo4l6fr/c4ZhXUQH0uFW7PZbg==",
+ "node_modules/@electron/fuses/node_modules/fs-extra": {
+ "version": "9.1.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
+ "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.22.5",
- "@babel/plugin-syntax-json-strings": "^7.8.3"
+ "at-least-node": "^1.0.0",
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
},
"engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
+ "node": ">=10"
}
},
- "node_modules/@babel/plugin-transform-literals": {
- "version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.23.3.tgz",
- "integrity": "sha512-wZ0PIXRxnwZvl9AYpqNUxpZ5BiTGrYt7kueGQ+N5FiQ7RCOD4cm8iShd6S6ggfVIWaJf2EMk8eRzAh52RfP4rQ==",
+ "node_modules/@electron/fuses/node_modules/jsonfile": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz",
+ "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.22.5"
- },
- "engines": {
- "node": ">=6.9.0"
+ "universalify": "^2.0.0"
},
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
+ "optionalDependencies": {
+ "graceful-fs": "^4.1.6"
}
},
- "node_modules/@babel/plugin-transform-logical-assignment-operators": {
- "version": "7.23.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.23.4.tgz",
- "integrity": "sha512-Mc/ALf1rmZTP4JKKEhUwiORU+vcfarFVLfcFiolKUo6sewoxSEgl36ak5t+4WamRsNr6nzjZXQjM35WsU+9vbg==",
+ "node_modules/@electron/fuses/node_modules/universalify": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
+ "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
"dev": true,
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.22.5",
- "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4"
- },
+ "license": "MIT",
"engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
+ "node": ">= 10.0.0"
}
},
- "node_modules/@babel/plugin-transform-member-expression-literals": {
- "version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.23.3.tgz",
- "integrity": "sha512-sC3LdDBDi5x96LA+Ytekz2ZPk8i/Ck+DEuDbRAll5rknJ5XRTSaPKEYwomLcs1AA8wg9b3KjIQRsnApj+q51Ag==",
- "dev": true,
+ "node_modules/@electron/get": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/@electron/get/-/get-5.0.0.tgz",
+ "integrity": "sha512-pjoBpru1KdEtcExBnuHAP1cAc/5faoedw0hzJkL3o4/IJp7HNF1+fbrdxT3gMYRX2oJfvnA/WXeCTVQpYYxyJA==",
+ "license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.22.5"
+ "debug": "^4.1.1",
+ "env-paths": "^3.0.0",
+ "graceful-fs": "^4.2.11",
+ "progress": "^2.0.3",
+ "semver": "^7.6.3",
+ "sumchecker": "^3.0.1"
},
"engines": {
- "node": ">=6.9.0"
+ "node": ">=22.12.0"
},
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
+ "optionalDependencies": {
+ "undici": "^7.24.4"
}
},
- "node_modules/@babel/plugin-transform-modules-amd": {
- "version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.3.tgz",
- "integrity": "sha512-vJYQGxeKM4t8hYCKVBlZX/gtIY2I7mRGFNcm85sgXGMTBcoV3QdVtdpbcWEbzbfUIUZKwvgFT82mRvaQIebZzw==",
- "dev": true,
- "dependencies": {
- "@babel/helper-module-transforms": "^7.23.3",
- "@babel/helper-plugin-utils": "^7.22.5"
- },
+ "node_modules/@electron/get/node_modules/env-paths": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-3.0.0.tgz",
+ "integrity": "sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==",
+ "license": "MIT",
"engines": {
- "node": ">=6.9.0"
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
},
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/@babel/plugin-transform-modules-commonjs": {
- "version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.3.tgz",
- "integrity": "sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA==",
+ "node_modules/@electron/notarize": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/@electron/notarize/-/notarize-2.5.0.tgz",
+ "integrity": "sha512-jNT8nwH1f9X5GEITXaQ8IF/KdskvIkOFfB2CvwumsveVidzpSc+mvhhTMdAGSYF3O+Nq49lJ7y+ssODRXu06+A==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/helper-module-transforms": "^7.23.3",
- "@babel/helper-plugin-utils": "^7.22.5",
- "@babel/helper-simple-access": "^7.22.5"
+ "debug": "^4.1.1",
+ "fs-extra": "^9.0.1",
+ "promise-retry": "^2.0.1"
},
"engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
+ "node": ">= 10.0.0"
}
},
- "node_modules/@babel/plugin-transform-modules-systemjs": {
- "version": "7.23.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.9.tgz",
- "integrity": "sha512-KDlPRM6sLo4o1FkiSlXoAa8edLXFsKKIda779fbLrvmeuc3itnjCtaO6RrtoaANsIJANj+Vk1zqbZIMhkCAHVw==",
+ "node_modules/@electron/notarize/node_modules/fs-extra": {
+ "version": "9.1.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
+ "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/helper-hoist-variables": "^7.22.5",
- "@babel/helper-module-transforms": "^7.23.3",
- "@babel/helper-plugin-utils": "^7.22.5",
- "@babel/helper-validator-identifier": "^7.22.20"
+ "at-least-node": "^1.0.0",
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
},
"engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
+ "node": ">=10"
}
},
- "node_modules/@babel/plugin-transform-modules-umd": {
- "version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.23.3.tgz",
- "integrity": "sha512-zHsy9iXX2nIsCBFPud3jKn1IRPWg3Ing1qOZgeKV39m1ZgIdpJqvlWVeiHBZC6ITRG0MfskhYe9cLgntfSFPIg==",
+ "node_modules/@electron/notarize/node_modules/jsonfile": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz",
+ "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/helper-module-transforms": "^7.23.3",
- "@babel/helper-plugin-utils": "^7.22.5"
- },
- "engines": {
- "node": ">=6.9.0"
+ "universalify": "^2.0.0"
},
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
+ "optionalDependencies": {
+ "graceful-fs": "^4.1.6"
}
},
- "node_modules/@babel/plugin-transform-named-capturing-groups-regex": {
- "version": "7.22.5",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz",
- "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==",
+ "node_modules/@electron/notarize/node_modules/universalify": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
+ "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
"dev": true,
- "dependencies": {
- "@babel/helper-create-regexp-features-plugin": "^7.22.5",
- "@babel/helper-plugin-utils": "^7.22.5"
- },
+ "license": "MIT",
"engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0"
+ "node": ">= 10.0.0"
}
},
- "node_modules/@babel/plugin-transform-new-target": {
- "version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.23.3.tgz",
- "integrity": "sha512-YJ3xKqtJMAT5/TIZnpAR3I+K+WaDowYbN3xyxI8zxx/Gsypwf9B9h0VB+1Nh6ACAAPRS5NSRje0uVv5i79HYGQ==",
+ "node_modules/@electron/osx-sign": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/@electron/osx-sign/-/osx-sign-1.3.3.tgz",
+ "integrity": "sha512-KZ8mhXvWv2rIEgMbWZ4y33bDHyUKMXnx4M0sTyPNK/vcB81ImdeY9Ggdqy0SWbMDgmbqyQ+phgejh6V3R2QuSg==",
"dev": true,
+ "license": "BSD-2-Clause",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.22.5"
+ "compare-version": "^0.1.2",
+ "debug": "^4.3.4",
+ "fs-extra": "^10.0.0",
+ "isbinaryfile": "^4.0.8",
+ "minimist": "^1.2.6",
+ "plist": "^3.0.5"
},
- "engines": {
- "node": ">=6.9.0"
+ "bin": {
+ "electron-osx-flat": "bin/electron-osx-flat.js",
+ "electron-osx-sign": "bin/electron-osx-sign.js"
},
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
+ "engines": {
+ "node": ">=12.0.0"
}
},
- "node_modules/@babel/plugin-transform-nullish-coalescing-operator": {
- "version": "7.23.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.23.4.tgz",
- "integrity": "sha512-jHE9EVVqHKAQx+VePv5LLGHjmHSJR76vawFPTdlxR/LVJPfOEGxREQwQfjuZEOPTwG92X3LINSh3M40Rv4zpVA==",
+ "node_modules/@electron/osx-sign/node_modules/isbinaryfile": {
+ "version": "4.0.10",
+ "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz",
+ "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==",
"dev": true,
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.22.5",
- "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3"
- },
+ "license": "MIT",
"engines": {
- "node": ">=6.9.0"
+ "node": ">= 8.0.0"
},
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
+ "funding": {
+ "url": "https://github.com/sponsors/gjtorikian/"
}
},
- "node_modules/@babel/plugin-transform-numeric-separator": {
- "version": "7.23.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.23.4.tgz",
- "integrity": "sha512-mps6auzgwjRrwKEZA05cOwuDc9FAzoyFS4ZsG/8F43bTLf/TgkJg7QXOrPO1JO599iA3qgK9MXdMGOEC8O1h6Q==",
+ "node_modules/@electron/rebuild": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/@electron/rebuild/-/rebuild-4.0.4.tgz",
+ "integrity": "sha512-Rzc39XPdk/+/wBG8MfwAHohXflep0ITUfulb6Rgz3R0NeSB1noE+E9/M/cb8ftCAiyDD9PPhLuuWgE1GaInbKg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.22.5",
- "@babel/plugin-syntax-numeric-separator": "^7.10.4"
+ "@malept/cross-spawn-promise": "^2.0.0",
+ "debug": "^4.1.1",
+ "node-abi": "^4.2.0",
+ "node-api-version": "^0.2.1",
+ "node-gyp": "^12.2.0",
+ "read-binary-file-arch": "^1.0.6"
},
- "engines": {
- "node": ">=6.9.0"
+ "bin": {
+ "electron-rebuild": "lib/cli.js"
},
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
+ "engines": {
+ "node": ">=22.12.0"
}
},
- "node_modules/@babel/plugin-transform-object-rest-spread": {
- "version": "7.23.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.23.4.tgz",
- "integrity": "sha512-9x9K1YyeQVw0iOXJlIzwm8ltobIIv7j2iLyP2jIhEbqPRQ7ScNgwQufU2I0Gq11VjyG4gI4yMXt2VFags+1N3g==",
+ "node_modules/@electron/universal": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/@electron/universal/-/universal-2.0.3.tgz",
+ "integrity": "sha512-Wn9sPYIVFRFl5HmwMJkARCCf7rqK/EurkfQ/rJZ14mHP3iYTjZSIOSVonEAnhWeAXwtw7zOekGRlc6yTtZ0t+g==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/compat-data": "^7.23.3",
- "@babel/helper-compilation-targets": "^7.22.15",
- "@babel/helper-plugin-utils": "^7.22.5",
- "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
- "@babel/plugin-transform-parameters": "^7.23.3"
+ "@electron/asar": "^3.3.1",
+ "@malept/cross-spawn-promise": "^2.0.0",
+ "debug": "^4.3.1",
+ "dir-compare": "^4.2.0",
+ "fs-extra": "^11.1.1",
+ "minimatch": "^9.0.3",
+ "plist": "^3.1.0"
},
"engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
+ "node": ">=16.4"
}
},
- "node_modules/@babel/plugin-transform-object-super": {
- "version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.23.3.tgz",
- "integrity": "sha512-BwQ8q0x2JG+3lxCVFohg+KbQM7plfpBwThdW9A6TMtWwLsbDA01Ek2Zb/AgDN39BiZsExm4qrXxjk+P1/fzGrA==",
+ "node_modules/@electron/universal/node_modules/fs-extra": {
+ "version": "11.3.3",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.3.tgz",
+ "integrity": "sha512-VWSRii4t0AFm6ixFFmLLx1t7wS1gh+ckoa84aOeapGum0h+EZd1EhEumSB+ZdDLnEPuucsVB9oB7cxJHap6Afg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.22.5",
- "@babel/helper-replace-supers": "^7.22.20"
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
},
"engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
+ "node": ">=14.14"
}
},
- "node_modules/@babel/plugin-transform-optional-catch-binding": {
- "version": "7.23.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.23.4.tgz",
- "integrity": "sha512-XIq8t0rJPHf6Wvmbn9nFxU6ao4c7WhghTR5WyV8SrJfUFzyxhCm4nhC+iAp3HFhbAKLfYpgzhJ6t4XCtVwqO5A==",
+ "node_modules/@electron/universal/node_modules/jsonfile": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz",
+ "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/helper-plugin-utils": "^7.22.5",
- "@babel/plugin-syntax-optional-catch-binding": "^7.8.3"
- },
- "engines": {
- "node": ">=6.9.0"
+ "universalify": "^2.0.0"
},
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
+ "optionalDependencies": {
+ "graceful-fs": "^4.1.6"
}
},
- "node_modules/@babel/plugin-transform-optional-chaining": {
- "version": "7.23.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.4.tgz",
- "integrity": "sha512-ZU8y5zWOfjM5vZ+asjgAPwDaBjJzgufjES89Rs4Lpq63O300R/kOz30WCLo6BxxX6QVEilwSlpClnG5cZaikTA==",
+ "node_modules/@electron/universal/node_modules/universalify": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
+ "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
"dev": true,
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.22.5",
- "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5",
- "@babel/plugin-syntax-optional-chaining": "^7.8.3"
- },
+ "license": "MIT",
"engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
+ "node": ">= 10.0.0"
}
},
- "node_modules/@babel/plugin-transform-parameters": {
- "version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.23.3.tgz",
- "integrity": "sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw==",
+ "node_modules/@electron/windows-sign": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/@electron/windows-sign/-/windows-sign-1.2.2.tgz",
+ "integrity": "sha512-dfZeox66AvdPtb2lD8OsIIQh12Tp0GNCRUDfBHIKGpbmopZto2/A8nSpYYLoedPIHpqkeblZ/k8OV0Gy7PYuyQ==",
"dev": true,
+ "license": "BSD-2-Clause",
+ "optional": true,
+ "peer": true,
"dependencies": {
- "@babel/helper-plugin-utils": "^7.22.5"
+ "cross-dirname": "^0.1.0",
+ "debug": "^4.3.4",
+ "fs-extra": "^11.1.1",
+ "minimist": "^1.2.8",
+ "postject": "^1.0.0-alpha.6"
},
- "engines": {
- "node": ">=6.9.0"
+ "bin": {
+ "electron-windows-sign": "bin/electron-windows-sign.js"
},
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
+ "engines": {
+ "node": ">=14.14"
}
},
- "node_modules/@babel/plugin-transform-private-methods": {
- "version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.23.3.tgz",
- "integrity": "sha512-UzqRcRtWsDMTLrRWFvUBDwmw06tCQH9Rl1uAjfh6ijMSmGYQ+fpdB+cnqRC8EMh5tuuxSv0/TejGL+7vyj+50g==",
+ "node_modules/@electron/windows-sign/node_modules/fs-extra": {
+ "version": "11.3.5",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.5.tgz",
+ "integrity": "sha512-eKpRKAovdpZtR1WopLHxlBWvAgPny3c4gX1G5Jhwmmw4XJj0ifSD5qB5TOo8hmA0wlRKDAOAhEE1yVPgs6Fgcg==",
"dev": true,
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
- "@babel/helper-create-class-features-plugin": "^7.22.15",
- "@babel/helper-plugin-utils": "^7.22.5"
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
},
"engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
+ "node": ">=14.14"
}
},
- "node_modules/@babel/plugin-transform-private-property-in-object": {
- "version": "7.23.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.23.4.tgz",
- "integrity": "sha512-9G3K1YqTq3F4Vt88Djx1UZ79PDyj+yKRnUy7cZGSMe+a7jkwD259uKKuUzQlPkGam7R+8RJwh5z4xO27fA1o2A==",
+ "node_modules/@electron/windows-sign/node_modules/jsonfile": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz",
+ "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==",
"dev": true,
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
- "@babel/helper-annotate-as-pure": "^7.22.5",
- "@babel/helper-create-class-features-plugin": "^7.22.15",
- "@babel/helper-plugin-utils": "^7.22.5",
- "@babel/plugin-syntax-private-property-in-object": "^7.14.5"
- },
- "engines": {
- "node": ">=6.9.0"
+ "universalify": "^2.0.0"
},
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
+ "optionalDependencies": {
+ "graceful-fs": "^4.1.6"
}
},
- "node_modules/@babel/plugin-transform-property-literals": {
- "version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.23.3.tgz",
- "integrity": "sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw==",
+ "node_modules/@electron/windows-sign/node_modules/universalify": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
+ "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
"dev": true,
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.22.5"
- },
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
"engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
+ "node": ">= 10.0.0"
}
},
- "node_modules/@babel/plugin-transform-react-display-name": {
- "version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.23.3.tgz",
- "integrity": "sha512-GnvhtVfA2OAtzdX58FJxU19rhoGeQzyVndw3GgtdECQvQFXPEZIOVULHVZGAYmOgmqjXpVpfocAbSjh99V/Fqw==",
+ "node_modules/@emnapi/core": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.8.1.tgz",
+ "integrity": "sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg==",
"dev": true,
+ "license": "MIT",
+ "optional": true,
"dependencies": {
- "@babel/helper-plugin-utils": "^7.22.5"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
+ "@emnapi/wasi-threads": "1.1.0",
+ "tslib": "^2.4.0"
}
},
- "node_modules/@babel/plugin-transform-react-jsx": {
- "version": "7.23.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.23.4.tgz",
- "integrity": "sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA==",
+ "node_modules/@emnapi/runtime": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.1.tgz",
+ "integrity": "sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==",
"dev": true,
+ "license": "MIT",
+ "optional": true,
"dependencies": {
- "@babel/helper-annotate-as-pure": "^7.22.5",
- "@babel/helper-module-imports": "^7.22.15",
- "@babel/helper-plugin-utils": "^7.22.5",
- "@babel/plugin-syntax-jsx": "^7.23.3",
- "@babel/types": "^7.23.4"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
+ "tslib": "^2.4.0"
}
},
- "node_modules/@babel/plugin-transform-react-jsx-development": {
- "version": "7.22.5",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.22.5.tgz",
- "integrity": "sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A==",
+ "node_modules/@emnapi/wasi-threads": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.1.0.tgz",
+ "integrity": "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==",
"dev": true,
+ "license": "MIT",
+ "optional": true,
"dependencies": {
- "@babel/plugin-transform-react-jsx": "^7.22.5"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
+ "tslib": "^2.4.0"
}
},
- "node_modules/@babel/plugin-transform-react-pure-annotations": {
- "version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.23.3.tgz",
- "integrity": "sha512-qMFdSS+TUhB7Q/3HVPnEdYJDQIk57jkntAwSuz9xfSE4n+3I+vHYCli3HoHawN1Z3RfCz/y1zXA/JXjG6cVImQ==",
+ "node_modules/@emotion/hash": {
+ "version": "0.8.0",
+ "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz",
+ "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==",
+ "license": "MIT"
+ },
+ "node_modules/@emotion/unitless": {
+ "version": "0.7.5",
+ "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz",
+ "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==",
+ "license": "MIT"
+ },
+ "node_modules/@es-joy/jsdoccomment": {
+ "version": "0.87.0",
+ "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.87.0.tgz",
+ "integrity": "sha512-mFXZloZMzuJZXSHUmAFu/pXTk0ZJTJBluuAkrvbzidpTN8W6F2bpRFuedSH+85kbdlRLJqc+gfN+kD3JOLJK5g==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/helper-annotate-as-pure": "^7.22.5",
- "@babel/helper-plugin-utils": "^7.22.5"
+ "@types/estree": "^1.0.9",
+ "@typescript-eslint/types": "^8.59.4",
+ "comment-parser": "1.4.7",
+ "esquery": "^1.7.0",
+ "jsdoc-type-pratt-parser": "~7.2.0"
},
"engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
+ "node": "^20.19.0 || ^22.13.0 || >=24"
}
},
- "node_modules/@babel/plugin-transform-regenerator": {
- "version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.23.3.tgz",
- "integrity": "sha512-KP+75h0KghBMcVpuKisx3XTu9Ncut8Q8TuvGO4IhY+9D5DFEckQefOuIsB/gQ2tG71lCke4NMrtIPS8pOj18BQ==",
+ "node_modules/@es-joy/jsdoccomment/node_modules/@types/estree": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz",
+ "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==",
"dev": true,
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.22.5",
- "regenerator-transform": "^0.15.2"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
+ "license": "MIT"
},
- "node_modules/@babel/plugin-transform-reserved-words": {
- "version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.23.3.tgz",
- "integrity": "sha512-QnNTazY54YqgGxwIexMZva9gqbPa15t/x9VS+0fsEFWplwVpXYZivtgl43Z1vMpc1bdPP2PP8siFeVcnFvA3Cg==",
+ "node_modules/@es-joy/resolve.exports": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@es-joy/resolve.exports/-/resolve.exports-1.2.0.tgz",
+ "integrity": "sha512-Q9hjxWI5xBM+qW2enxfe8wDKdFWMfd0Z29k5ZJnuBqD/CasY5Zryj09aCA6owbGATWz+39p5uIdaHXpopOcG8g==",
"dev": true,
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.22.5"
- },
+ "license": "MIT",
"engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
+ "node": ">=10"
}
},
- "node_modules/@babel/plugin-transform-runtime": {
- "version": "7.23.9",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.23.9.tgz",
- "integrity": "sha512-A7clW3a0aSjm3ONU9o2HAILSegJCYlEZmOhmBRReVtIpY/Z/p7yIZ+wR41Z+UipwdGuqwtID/V/dOdZXjwi9gQ==",
+ "node_modules/@esbuild/aix-ppc64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz",
+ "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==",
+ "cpu": [
+ "ppc64"
+ ],
"dev": true,
- "dependencies": {
- "@babel/helper-module-imports": "^7.22.15",
- "@babel/helper-plugin-utils": "^7.22.5",
- "babel-plugin-polyfill-corejs2": "^0.4.8",
- "babel-plugin-polyfill-corejs3": "^0.9.0",
- "babel-plugin-polyfill-regenerator": "^0.5.5",
- "semver": "^6.3.1"
- },
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "aix"
+ ],
"engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
+ "node": ">=18"
}
},
- "node_modules/@babel/plugin-transform-runtime/node_modules/semver": {
- "version": "6.3.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
- "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "node_modules/@esbuild/android-arm": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz",
+ "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==",
+ "cpu": [
+ "arm"
+ ],
"dev": true,
- "bin": {
- "semver": "bin/semver.js"
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=18"
}
},
- "node_modules/@babel/plugin-transform-shorthand-properties": {
- "version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.23.3.tgz",
- "integrity": "sha512-ED2fgqZLmexWiN+YNFX26fx4gh5qHDhn1O2gvEhreLW2iI63Sqm4llRLCXALKrCnbN4Jy0VcMQZl/SAzqug/jg==",
+ "node_modules/@esbuild/android-arm64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz",
+ "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==",
+ "cpu": [
+ "arm64"
+ ],
"dev": true,
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.22.5"
- },
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
"engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
+ "node": ">=18"
}
},
- "node_modules/@babel/plugin-transform-spread": {
- "version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.23.3.tgz",
- "integrity": "sha512-VvfVYlrlBVu+77xVTOAoxQ6mZbnIq5FM0aGBSFEcIh03qHf+zNqA4DC/3XMUozTg7bZV3e3mZQ0i13VB6v5yUg==",
+ "node_modules/@esbuild/android-x64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz",
+ "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==",
+ "cpu": [
+ "x64"
+ ],
"dev": true,
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.22.5",
- "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5"
- },
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
"engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
+ "node": ">=18"
}
},
- "node_modules/@babel/plugin-transform-sticky-regex": {
- "version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.23.3.tgz",
- "integrity": "sha512-HZOyN9g+rtvnOU3Yh7kSxXrKbzgrm5X4GncPY1QOquu7epga5MxKHVpYu2hvQnry/H+JjckSYRb93iNfsioAGg==",
+ "node_modules/@esbuild/darwin-arm64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz",
+ "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==",
+ "cpu": [
+ "arm64"
+ ],
"dev": true,
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.22.5"
- },
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
"engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
+ "node": ">=18"
}
},
- "node_modules/@babel/plugin-transform-template-literals": {
- "version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.23.3.tgz",
- "integrity": "sha512-Flok06AYNp7GV2oJPZZcP9vZdszev6vPBkHLwxwSpaIqx75wn6mUd3UFWsSsA0l8nXAKkyCmL/sR02m8RYGeHg==",
+ "node_modules/@esbuild/darwin-x64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz",
+ "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==",
+ "cpu": [
+ "x64"
+ ],
"dev": true,
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.22.5"
- },
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
"engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
+ "node": ">=18"
}
},
- "node_modules/@babel/plugin-transform-typeof-symbol": {
- "version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.23.3.tgz",
- "integrity": "sha512-4t15ViVnaFdrPC74be1gXBSMzXk3B4Us9lP7uLRQHTFpV5Dvt33pn+2MyyNxmN3VTTm3oTrZVMUmuw3oBnQ2oQ==",
+ "node_modules/@esbuild/freebsd-arm64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz",
+ "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==",
+ "cpu": [
+ "arm64"
+ ],
"dev": true,
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.22.5"
- },
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
"engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
+ "node": ">=18"
}
},
- "node_modules/@babel/plugin-transform-unicode-escapes": {
- "version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.23.3.tgz",
- "integrity": "sha512-OMCUx/bU6ChE3r4+ZdylEqAjaQgHAgipgW8nsCfu5pGqDcFytVd91AwRvUJSBZDz0exPGgnjoqhgRYLRjFZc9Q==",
+ "node_modules/@esbuild/freebsd-x64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz",
+ "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==",
+ "cpu": [
+ "x64"
+ ],
"dev": true,
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.22.5"
- },
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
"engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
+ "node": ">=18"
}
},
- "node_modules/@babel/plugin-transform-unicode-property-regex": {
- "version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.23.3.tgz",
- "integrity": "sha512-KcLIm+pDZkWZQAFJ9pdfmh89EwVfmNovFBcXko8szpBeF8z68kWIPeKlmSOkT9BXJxs2C0uk+5LxoxIv62MROA==",
+ "node_modules/@esbuild/linux-arm": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz",
+ "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==",
+ "cpu": [
+ "arm"
+ ],
"dev": true,
- "dependencies": {
- "@babel/helper-create-regexp-features-plugin": "^7.22.15",
- "@babel/helper-plugin-utils": "^7.22.5"
- },
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
"engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
+ "node": ">=18"
}
},
- "node_modules/@babel/plugin-transform-unicode-regex": {
- "version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.23.3.tgz",
- "integrity": "sha512-wMHpNA4x2cIA32b/ci3AfwNgheiva2W0WUKWTK7vBHBhDKfPsc5cFGNWm69WBqpwd86u1qwZ9PWevKqm1A3yAw==",
+ "node_modules/@esbuild/linux-arm64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz",
+ "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==",
+ "cpu": [
+ "arm64"
+ ],
"dev": true,
- "dependencies": {
- "@babel/helper-create-regexp-features-plugin": "^7.22.15",
- "@babel/helper-plugin-utils": "^7.22.5"
- },
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
"engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
+ "node": ">=18"
}
},
- "node_modules/@babel/plugin-transform-unicode-sets-regex": {
- "version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.23.3.tgz",
- "integrity": "sha512-W7lliA/v9bNR83Qc3q1ip9CQMZ09CcHDbHfbLRDNuAhn1Mvkr1ZNF7hPmztMQvtTGVLJ9m8IZqWsTkXOml8dbw==",
+ "node_modules/@esbuild/linux-ia32": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz",
+ "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==",
+ "cpu": [
+ "ia32"
+ ],
"dev": true,
- "dependencies": {
- "@babel/helper-create-regexp-features-plugin": "^7.22.15",
- "@babel/helper-plugin-utils": "^7.22.5"
- },
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
"engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0"
+ "node": ">=18"
}
},
- "node_modules/@babel/preset-env": {
- "version": "7.23.9",
- "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.23.9.tgz",
- "integrity": "sha512-3kBGTNBBk9DQiPoXYS0g0BYlwTQYUTifqgKTjxUwEUkduRT2QOa0FPGBJ+NROQhGyYO5BuTJwGvBnqKDykac6A==",
- "dev": true,
- "dependencies": {
- "@babel/compat-data": "^7.23.5",
- "@babel/helper-compilation-targets": "^7.23.6",
- "@babel/helper-plugin-utils": "^7.22.5",
- "@babel/helper-validator-option": "^7.23.5",
- "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.23.3",
- "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.23.3",
- "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.23.7",
- "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2",
- "@babel/plugin-syntax-async-generators": "^7.8.4",
- "@babel/plugin-syntax-class-properties": "^7.12.13",
- "@babel/plugin-syntax-class-static-block": "^7.14.5",
- "@babel/plugin-syntax-dynamic-import": "^7.8.3",
- "@babel/plugin-syntax-export-namespace-from": "^7.8.3",
- "@babel/plugin-syntax-import-assertions": "^7.23.3",
- "@babel/plugin-syntax-import-attributes": "^7.23.3",
- "@babel/plugin-syntax-import-meta": "^7.10.4",
- "@babel/plugin-syntax-json-strings": "^7.8.3",
- "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4",
- "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3",
- "@babel/plugin-syntax-numeric-separator": "^7.10.4",
- "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
- "@babel/plugin-syntax-optional-catch-binding": "^7.8.3",
- "@babel/plugin-syntax-optional-chaining": "^7.8.3",
- "@babel/plugin-syntax-private-property-in-object": "^7.14.5",
- "@babel/plugin-syntax-top-level-await": "^7.14.5",
- "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6",
- "@babel/plugin-transform-arrow-functions": "^7.23.3",
- "@babel/plugin-transform-async-generator-functions": "^7.23.9",
- "@babel/plugin-transform-async-to-generator": "^7.23.3",
- "@babel/plugin-transform-block-scoped-functions": "^7.23.3",
- "@babel/plugin-transform-block-scoping": "^7.23.4",
- "@babel/plugin-transform-class-properties": "^7.23.3",
- "@babel/plugin-transform-class-static-block": "^7.23.4",
- "@babel/plugin-transform-classes": "^7.23.8",
- "@babel/plugin-transform-computed-properties": "^7.23.3",
- "@babel/plugin-transform-destructuring": "^7.23.3",
- "@babel/plugin-transform-dotall-regex": "^7.23.3",
- "@babel/plugin-transform-duplicate-keys": "^7.23.3",
- "@babel/plugin-transform-dynamic-import": "^7.23.4",
- "@babel/plugin-transform-exponentiation-operator": "^7.23.3",
- "@babel/plugin-transform-export-namespace-from": "^7.23.4",
- "@babel/plugin-transform-for-of": "^7.23.6",
- "@babel/plugin-transform-function-name": "^7.23.3",
- "@babel/plugin-transform-json-strings": "^7.23.4",
- "@babel/plugin-transform-literals": "^7.23.3",
- "@babel/plugin-transform-logical-assignment-operators": "^7.23.4",
- "@babel/plugin-transform-member-expression-literals": "^7.23.3",
- "@babel/plugin-transform-modules-amd": "^7.23.3",
- "@babel/plugin-transform-modules-commonjs": "^7.23.3",
- "@babel/plugin-transform-modules-systemjs": "^7.23.9",
- "@babel/plugin-transform-modules-umd": "^7.23.3",
- "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5",
- "@babel/plugin-transform-new-target": "^7.23.3",
- "@babel/plugin-transform-nullish-coalescing-operator": "^7.23.4",
- "@babel/plugin-transform-numeric-separator": "^7.23.4",
- "@babel/plugin-transform-object-rest-spread": "^7.23.4",
- "@babel/plugin-transform-object-super": "^7.23.3",
- "@babel/plugin-transform-optional-catch-binding": "^7.23.4",
- "@babel/plugin-transform-optional-chaining": "^7.23.4",
- "@babel/plugin-transform-parameters": "^7.23.3",
- "@babel/plugin-transform-private-methods": "^7.23.3",
- "@babel/plugin-transform-private-property-in-object": "^7.23.4",
- "@babel/plugin-transform-property-literals": "^7.23.3",
- "@babel/plugin-transform-regenerator": "^7.23.3",
- "@babel/plugin-transform-reserved-words": "^7.23.3",
- "@babel/plugin-transform-shorthand-properties": "^7.23.3",
- "@babel/plugin-transform-spread": "^7.23.3",
- "@babel/plugin-transform-sticky-regex": "^7.23.3",
- "@babel/plugin-transform-template-literals": "^7.23.3",
- "@babel/plugin-transform-typeof-symbol": "^7.23.3",
- "@babel/plugin-transform-unicode-escapes": "^7.23.3",
- "@babel/plugin-transform-unicode-property-regex": "^7.23.3",
- "@babel/plugin-transform-unicode-regex": "^7.23.3",
- "@babel/plugin-transform-unicode-sets-regex": "^7.23.3",
- "@babel/preset-modules": "0.1.6-no-external-plugins",
- "babel-plugin-polyfill-corejs2": "^0.4.8",
- "babel-plugin-polyfill-corejs3": "^0.9.0",
- "babel-plugin-polyfill-regenerator": "^0.5.5",
- "core-js-compat": "^3.31.0",
- "semver": "^6.3.1"
- },
+ "node_modules/@esbuild/linux-loong64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz",
+ "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==",
+ "cpu": [
+ "loong64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
"engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
+ "node": ">=18"
}
},
- "node_modules/@babel/preset-env/node_modules/semver": {
- "version": "6.3.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
- "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "node_modules/@esbuild/linux-mips64el": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz",
+ "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==",
+ "cpu": [
+ "mips64el"
+ ],
"dev": true,
- "bin": {
- "semver": "bin/semver.js"
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
}
},
- "node_modules/@babel/preset-modules": {
- "version": "0.1.6-no-external-plugins",
- "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz",
- "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==",
+ "node_modules/@esbuild/linux-ppc64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz",
+ "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==",
+ "cpu": [
+ "ppc64"
+ ],
"dev": true,
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.0.0",
- "@babel/types": "^7.4.4",
- "esutils": "^2.0.2"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0"
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
}
},
- "node_modules/@babel/preset-react": {
- "version": "7.23.3",
- "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.23.3.tgz",
- "integrity": "sha512-tbkHOS9axH6Ysf2OUEqoSZ6T3Fa2SrNH6WTWSPBboxKzdxNc9qOICeLXkNG0ZEwbQ1HY8liwOce4aN/Ceyuq6w==",
+ "node_modules/@esbuild/linux-riscv64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz",
+ "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==",
+ "cpu": [
+ "riscv64"
+ ],
"dev": true,
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.22.5",
- "@babel/helper-validator-option": "^7.22.15",
- "@babel/plugin-transform-react-display-name": "^7.23.3",
- "@babel/plugin-transform-react-jsx": "^7.22.15",
- "@babel/plugin-transform-react-jsx-development": "^7.22.5",
- "@babel/plugin-transform-react-pure-annotations": "^7.23.3"
- },
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
"engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
+ "node": ">=18"
}
},
- "node_modules/@babel/register": {
- "version": "7.23.7",
- "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.23.7.tgz",
- "integrity": "sha512-EjJeB6+kvpk+Y5DAkEAmbOBEFkh9OASx0huoEkqYTFxAZHzOAX2Oh5uwAUuL2rUddqfM0SA+KPXV2TbzoZ2kvQ==",
+ "node_modules/@esbuild/linux-s390x": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz",
+ "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==",
+ "cpu": [
+ "s390x"
+ ],
"dev": true,
- "dependencies": {
- "clone-deep": "^4.0.1",
- "find-cache-dir": "^2.0.0",
- "make-dir": "^2.1.0",
- "pirates": "^4.0.6",
- "source-map-support": "^0.5.16"
- },
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
"engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
+ "node": ">=18"
}
},
- "node_modules/@babel/regjsgen": {
- "version": "0.8.0",
- "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz",
- "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==",
- "dev": true
- },
- "node_modules/@babel/runtime": {
- "version": "7.23.9",
- "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.9.tgz",
- "integrity": "sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw==",
- "dependencies": {
- "regenerator-runtime": "^0.14.0"
- },
+ "node_modules/@esbuild/linux-x64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz",
+ "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
"engines": {
- "node": ">=6.9.0"
+ "node": ">=18"
}
},
- "node_modules/@babel/template": {
- "version": "7.23.9",
- "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.23.9.tgz",
- "integrity": "sha512-+xrD2BWLpvHKNmX2QbpdpsBaWnRxahMwJjO+KZk2JOElj5nSmKezyS1B4u+QbHMTX69t4ukm6hh9lsYQ7GHCKA==",
+ "node_modules/@esbuild/netbsd-arm64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz",
+ "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==",
+ "cpu": [
+ "arm64"
+ ],
"dev": true,
- "dependencies": {
- "@babel/code-frame": "^7.23.5",
- "@babel/parser": "^7.23.9",
- "@babel/types": "^7.23.9"
- },
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
"engines": {
- "node": ">=6.9.0"
+ "node": ">=18"
}
},
- "node_modules/@babel/traverse": {
- "version": "7.23.9",
- "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.9.tgz",
- "integrity": "sha512-I/4UJ9vs90OkBtY6iiiTORVMyIhJ4kAVmsKo9KFc8UOxMeUfi2hvtIBsET5u9GizXE6/GFSuKCTNfgCswuEjRg==",
- "dev": true,
- "dependencies": {
- "@babel/code-frame": "^7.23.5",
- "@babel/generator": "^7.23.6",
- "@babel/helper-environment-visitor": "^7.22.20",
- "@babel/helper-function-name": "^7.23.0",
- "@babel/helper-hoist-variables": "^7.22.5",
- "@babel/helper-split-export-declaration": "^7.22.6",
- "@babel/parser": "^7.23.9",
- "@babel/types": "^7.23.9",
- "debug": "^4.3.1",
- "globals": "^11.1.0"
- },
+ "node_modules/@esbuild/netbsd-x64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz",
+ "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
"engines": {
- "node": ">=6.9.0"
+ "node": ">=18"
}
},
- "node_modules/@babel/types": {
- "version": "7.23.9",
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.9.tgz",
- "integrity": "sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q==",
+ "node_modules/@esbuild/openbsd-arm64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz",
+ "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==",
+ "cpu": [
+ "arm64"
+ ],
"dev": true,
- "dependencies": {
- "@babel/helper-string-parser": "^7.23.4",
- "@babel/helper-validator-identifier": "^7.22.20",
- "to-fast-properties": "^2.0.0"
- },
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
"engines": {
- "node": ">=6.9.0"
+ "node": ">=18"
}
},
- "node_modules/@colors/colors": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz",
- "integrity": "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==",
+ "node_modules/@esbuild/openbsd-x64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz",
+ "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==",
+ "cpu": [
+ "x64"
+ ],
"dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
"engines": {
- "node": ">=0.1.90"
+ "node": ">=18"
}
},
- "node_modules/@ctrl/tinycolor": {
- "version": "3.6.1",
- "resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-3.6.1.tgz",
- "integrity": "sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==",
+ "node_modules/@esbuild/openharmony-arm64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz",
+ "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openharmony"
+ ],
"engines": {
- "node": ">=10"
+ "node": ">=18"
}
},
- "node_modules/@dabh/diagnostics": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz",
- "integrity": "sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==",
+ "node_modules/@esbuild/sunos-x64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz",
+ "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==",
+ "cpu": [
+ "x64"
+ ],
"dev": true,
- "peer": true,
- "dependencies": {
- "colorspace": "1.1.x",
- "enabled": "2.0.x",
- "kuler": "^2.0.0"
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "sunos"
+ ],
+ "engines": {
+ "node": ">=18"
}
},
- "node_modules/@develar/schema-utils": {
- "version": "2.6.5",
- "resolved": "https://registry.npmjs.org/@develar/schema-utils/-/schema-utils-2.6.5.tgz",
- "integrity": "sha512-0cp4PsWQ/9avqTVMCtZ+GirikIA36ikvjtHweU4/j8yLtgObI0+JUPhYFScgwlteveGB1rt3Cm8UhN04XayDig==",
+ "node_modules/@esbuild/win32-arm64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz",
+ "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==",
+ "cpu": [
+ "arm64"
+ ],
"dev": true,
- "dependencies": {
- "ajv": "^6.12.0",
- "ajv-keywords": "^3.4.1"
- },
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
"engines": {
- "node": ">= 8.9.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/webpack"
+ "node": ">=18"
}
},
- "node_modules/@develar/schema-utils/node_modules/ajv": {
- "version": "6.12.6",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
- "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "node_modules/@esbuild/win32-ia32": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz",
+ "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==",
+ "cpu": [
+ "ia32"
+ ],
"dev": true,
- "dependencies": {
- "fast-deep-equal": "^3.1.1",
- "fast-json-stable-stringify": "^2.0.0",
- "json-schema-traverse": "^0.4.1",
- "uri-js": "^4.2.2"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/epoberezkin"
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
}
},
- "node_modules/@develar/schema-utils/node_modules/ajv-keywords": {
- "version": "3.5.2",
- "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
- "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
+ "node_modules/@esbuild/win32-x64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz",
+ "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==",
+ "cpu": [
+ "x64"
+ ],
"dev": true,
- "peerDependencies": {
- "ajv": "^6.9.1"
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
}
},
- "node_modules/@develar/schema-utils/node_modules/json-schema-traverse": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
- "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
- "dev": true
- },
- "node_modules/@electron/asar": {
- "version": "3.2.8",
- "resolved": "https://registry.npmjs.org/@electron/asar/-/asar-3.2.8.tgz",
- "integrity": "sha512-cmskk5M06ewHMZAplSiF4AlME3IrnnZhKnWbtwKVLRkdJkKyUVjMLhDIiPIx/+6zQWVlKX/LtmK9xDme7540Sg==",
+ "node_modules/@eslint-community/eslint-utils": {
+ "version": "4.9.1",
+ "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz",
+ "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "commander": "^5.0.0",
- "glob": "^7.1.6",
- "minimatch": "^3.0.4"
+ "eslint-visitor-keys": "^3.4.3"
},
- "bin": {
- "asar": "bin/asar.js"
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
},
+ "peerDependencies": {
+ "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
+ }
+ },
+ "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": {
+ "version": "3.4.3",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
+ "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
+ "dev": true,
+ "license": "Apache-2.0",
"engines": {
- "node": ">=10.12.0"
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
}
},
- "node_modules/@electron/asar/node_modules/brace-expansion": {
- "version": "1.1.11",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "node_modules/@eslint-community/regexpp": {
+ "version": "4.12.2",
+ "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz",
+ "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==",
"dev": true,
- "dependencies": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
+ "license": "MIT",
+ "engines": {
+ "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
}
},
- "node_modules/@electron/asar/node_modules/glob": {
- "version": "7.2.3",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
- "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "node_modules/@eslint-react/ast": {
+ "version": "5.9.1",
+ "resolved": "https://registry.npmjs.org/@eslint-react/ast/-/ast-5.9.1.tgz",
+ "integrity": "sha512-PEBHBKxuKGrseO828u5/HFo89TdOa946q5veEjdDR+BjxlMuxhZxIqHkPyoS93dh6E+9mkZkcDerSGY5nCsm8Q==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.1.1",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
+ "@typescript-eslint/types": "^8.61.1",
+ "@typescript-eslint/typescript-estree": "^8.61.1",
+ "@typescript-eslint/utils": "^8.61.1",
+ "string-ts": "^2.3.1"
},
"engines": {
- "node": "*"
+ "node": ">=22.0.0"
},
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
+ "peerDependencies": {
+ "eslint": "*",
+ "typescript": "*"
}
},
- "node_modules/@electron/asar/node_modules/minimatch": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
- "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "node_modules/@eslint-react/ast/node_modules/@typescript-eslint/project-service": {
+ "version": "8.61.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.61.1.tgz",
+ "integrity": "sha512-PrC4JYGmR241lYnfhmKGTXkFqv8+ymbTFgSAY0fVXpY82/QkMw5TZPl+vGzuDDU2QYJk9fIDOBTntF+yDv9LEA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "brace-expansion": "^1.1.7"
+ "@typescript-eslint/tsconfig-utils": "^8.61.1",
+ "@typescript-eslint/types": "^8.61.1",
+ "debug": "^4.4.3"
},
"engines": {
- "node": "*"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4 <6.1.0"
}
},
- "node_modules/@electron/get": {
- "version": "1.14.1",
- "resolved": "https://registry.npmjs.org/@electron/get/-/get-1.14.1.tgz",
- "integrity": "sha512-BrZYyL/6m0ZXz/lDxy/nlVhQz+WF+iPS6qXolEU8atw7h6v1aYkjwJZ63m+bJMBTxDE66X+r2tPS4a/8C82sZw==",
+ "node_modules/@eslint-react/ast/node_modules/@typescript-eslint/scope-manager": {
+ "version": "8.61.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.61.1.tgz",
+ "integrity": "sha512-L2bdIeoQS8FlKAvONAr20w6OcLXeB+qiDKbAooS9A0Ben+iSIkBef0FxqwKWYqt5sa0i4KJtxVyVmhMylKzF5w==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "debug": "^4.1.1",
- "env-paths": "^2.2.0",
- "fs-extra": "^8.1.0",
- "got": "^9.6.0",
- "progress": "^2.0.3",
- "semver": "^6.2.0",
- "sumchecker": "^3.0.1"
+ "@typescript-eslint/types": "8.61.1",
+ "@typescript-eslint/visitor-keys": "8.61.1"
},
"engines": {
- "node": ">=8.6"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
- "optionalDependencies": {
- "global-agent": "^3.0.0",
- "global-tunnel-ng": "^2.7.1"
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
}
},
- "node_modules/@electron/get/node_modules/semver": {
- "version": "6.3.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
- "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
- "bin": {
- "semver": "bin/semver.js"
+ "node_modules/@eslint-react/ast/node_modules/@typescript-eslint/tsconfig-utils": {
+ "version": "8.61.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.61.1.tgz",
+ "integrity": "sha512-UN/H4di+OO7EWx2ovME+8t31YO+KVnK0RRKEHR3kOt21/Ay8BOq3M1OMvWs5vNiqcFCYGYoxK3MXPZzmMUE+yg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4 <6.1.0"
}
},
- "node_modules/@electron/notarize": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/@electron/notarize/-/notarize-2.1.0.tgz",
- "integrity": "sha512-Q02xem1D0sg4v437xHgmBLxI2iz/fc0D4K7fiVWHa/AnW8o7D751xyKNXgziA6HrTOme9ul1JfWN5ark8WH1xA==",
+ "node_modules/@eslint-react/ast/node_modules/@typescript-eslint/types": {
+ "version": "8.61.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.61.1.tgz",
+ "integrity": "sha512-G+CRlPqLv7Bz1IZVs03x5K59F1veqL0EJUROAdGhKsEq8qOiRiZbI+HUojPq5l0fEGOKModD9br6lObhB8zkoA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@eslint-react/ast/node_modules/@typescript-eslint/typescript-estree": {
+ "version": "8.61.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.61.1.tgz",
+ "integrity": "sha512-u+oQD3BqYWPc8YV9Zab4vaJElJuwOLPRc10Jm1o/qS+6Qwen14HCWwx0Seo4LnSn2wxea2Ik8DxPt2/FHmuhrg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "debug": "^4.1.1",
- "fs-extra": "^9.0.1",
- "promise-retry": "^2.0.1"
+ "@typescript-eslint/project-service": "8.61.1",
+ "@typescript-eslint/tsconfig-utils": "8.61.1",
+ "@typescript-eslint/types": "8.61.1",
+ "@typescript-eslint/visitor-keys": "8.61.1",
+ "debug": "^4.4.3",
+ "minimatch": "^10.2.2",
+ "semver": "^7.7.3",
+ "tinyglobby": "^0.2.15",
+ "ts-api-utils": "^2.5.0"
},
"engines": {
- "node": ">= 10.0.0"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4 <6.1.0"
}
},
- "node_modules/@electron/notarize/node_modules/fs-extra": {
- "version": "9.1.0",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
- "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
+ "node_modules/@eslint-react/ast/node_modules/@typescript-eslint/utils": {
+ "version": "8.61.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.61.1.tgz",
+ "integrity": "sha512-1+P/3Dj6jvtybE1q0HQ6yBt/gq+oKJyLdEv4HdnqasaEXRSYCAsD59mXEVQnM/ULNdQxbX77tdG4jPRjIS6knA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "at-least-node": "^1.0.0",
- "graceful-fs": "^4.2.0",
- "jsonfile": "^6.0.1",
- "universalify": "^2.0.0"
+ "@eslint-community/eslint-utils": "^4.9.1",
+ "@typescript-eslint/scope-manager": "8.61.1",
+ "@typescript-eslint/types": "8.61.1",
+ "@typescript-eslint/typescript-estree": "8.61.1"
},
"engines": {
- "node": ">=10"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
+ "typescript": ">=4.8.4 <6.1.0"
}
},
- "node_modules/@electron/notarize/node_modules/jsonfile": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
- "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
+ "node_modules/@eslint-react/ast/node_modules/@typescript-eslint/visitor-keys": {
+ "version": "8.61.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.61.1.tgz",
+ "integrity": "sha512-6fJ9MHWtK14C1DSkiMlHUSOmrVebL7150xZJBlJiL62jjhIA4JmOq6flwBgDxIdBKKdoiZRel+dfPD5MLfny3w==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "universalify": "^2.0.0"
+ "@typescript-eslint/types": "8.61.1",
+ "eslint-visitor-keys": "^5.0.0"
},
- "optionalDependencies": {
- "graceful-fs": "^4.1.6"
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
}
},
- "node_modules/@electron/notarize/node_modules/universalify": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
- "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
+ "node_modules/@eslint-react/ast/node_modules/eslint-visitor-keys": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz",
+ "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==",
"dev": true,
+ "license": "Apache-2.0",
"engines": {
- "node": ">= 10.0.0"
+ "node": "^20.19.0 || ^22.13.0 || >=24"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
}
},
- "node_modules/@electron/osx-sign": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/@electron/osx-sign/-/osx-sign-1.0.5.tgz",
- "integrity": "sha512-k9ZzUQtamSoweGQDV2jILiRIHUu7lYlJ3c6IEmjv1hC17rclE+eb9U+f6UFlOOETo0JzY1HNlXy4YOlCvl+Lww==",
+ "node_modules/@eslint-react/ast/node_modules/minimatch": {
+ "version": "10.2.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz",
+ "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==",
"dev": true,
+ "license": "BlueOak-1.0.0",
"dependencies": {
- "compare-version": "^0.1.2",
- "debug": "^4.3.4",
- "fs-extra": "^10.0.0",
- "isbinaryfile": "^4.0.8",
- "minimist": "^1.2.6",
- "plist": "^3.0.5"
- },
- "bin": {
- "electron-osx-flat": "bin/electron-osx-flat.js",
- "electron-osx-sign": "bin/electron-osx-sign.js"
+ "brace-expansion": "^5.0.5"
},
"engines": {
- "node": ">=12.0.0"
+ "node": "18 || 20 || >=22"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
}
},
- "node_modules/@electron/osx-sign/node_modules/fs-extra": {
- "version": "10.1.0",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz",
- "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==",
+ "node_modules/@eslint-react/core": {
+ "version": "5.9.1",
+ "resolved": "https://registry.npmjs.org/@eslint-react/core/-/core-5.9.1.tgz",
+ "integrity": "sha512-CQ7ZQCRoqaHSBxld2zzfvjPBWuH0R6Op9FvCq+Nfennv/k6gbecA7IV47SlaXC7TKVB7zxiiwD3kD8ftaL8+xA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "graceful-fs": "^4.2.0",
- "jsonfile": "^6.0.1",
- "universalify": "^2.0.0"
+ "@eslint-react/ast": "5.9.1",
+ "@eslint-react/eslint": "5.9.1",
+ "@eslint-react/jsx": "5.9.1",
+ "@eslint-react/shared": "5.9.1",
+ "@eslint-react/var": "5.9.1",
+ "@typescript-eslint/scope-manager": "^8.61.1",
+ "@typescript-eslint/types": "^8.61.1",
+ "@typescript-eslint/utils": "^8.61.1",
+ "ts-pattern": "^5.9.0"
},
"engines": {
- "node": ">=12"
+ "node": ">=22.0.0"
+ },
+ "peerDependencies": {
+ "eslint": "*",
+ "typescript": "*"
}
},
- "node_modules/@electron/osx-sign/node_modules/isbinaryfile": {
- "version": "4.0.10",
- "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz",
- "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==",
+ "node_modules/@eslint-react/core/node_modules/@typescript-eslint/project-service": {
+ "version": "8.61.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.61.1.tgz",
+ "integrity": "sha512-PrC4JYGmR241lYnfhmKGTXkFqv8+ymbTFgSAY0fVXpY82/QkMw5TZPl+vGzuDDU2QYJk9fIDOBTntF+yDv9LEA==",
"dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/tsconfig-utils": "^8.61.1",
+ "@typescript-eslint/types": "^8.61.1",
+ "debug": "^4.4.3"
+ },
"engines": {
- "node": ">= 8.0.0"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
"funding": {
- "url": "https://github.com/sponsors/gjtorikian/"
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4 <6.1.0"
}
},
- "node_modules/@electron/osx-sign/node_modules/jsonfile": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
- "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
+ "node_modules/@eslint-react/core/node_modules/@typescript-eslint/scope-manager": {
+ "version": "8.61.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.61.1.tgz",
+ "integrity": "sha512-L2bdIeoQS8FlKAvONAr20w6OcLXeB+qiDKbAooS9A0Ben+iSIkBef0FxqwKWYqt5sa0i4KJtxVyVmhMylKzF5w==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "universalify": "^2.0.0"
+ "@typescript-eslint/types": "8.61.1",
+ "@typescript-eslint/visitor-keys": "8.61.1"
},
- "optionalDependencies": {
- "graceful-fs": "^4.1.6"
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
}
},
- "node_modules/@electron/osx-sign/node_modules/universalify": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
- "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
+ "node_modules/@eslint-react/core/node_modules/@typescript-eslint/tsconfig-utils": {
+ "version": "8.61.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.61.1.tgz",
+ "integrity": "sha512-UN/H4di+OO7EWx2ovME+8t31YO+KVnK0RRKEHR3kOt21/Ay8BOq3M1OMvWs5vNiqcFCYGYoxK3MXPZzmMUE+yg==",
"dev": true,
+ "license": "MIT",
"engines": {
- "node": ">= 10.0.0"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4 <6.1.0"
}
},
- "node_modules/@electron/remote": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/@electron/remote/-/remote-1.2.2.tgz",
- "integrity": "sha512-PfnXpQGWh4vpX866NNucJRnNOzDRZcsLcLaT32fUth9k0hccsohfxprqEDYLzRg+ZK2xRrtyUN5wYYoHimMCJg==",
+ "node_modules/@eslint-react/core/node_modules/@typescript-eslint/types": {
+ "version": "8.61.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.61.1.tgz",
+ "integrity": "sha512-G+CRlPqLv7Bz1IZVs03x5K59F1veqL0EJUROAdGhKsEq8qOiRiZbI+HUojPq5l0fEGOKModD9br6lObhB8zkoA==",
"dev": true,
- "peerDependencies": {
- "electron": ">= 10.0.0-beta.1"
+ "license": "MIT",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
}
},
- "node_modules/@electron/universal": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/@electron/universal/-/universal-1.4.1.tgz",
- "integrity": "sha512-lE/U3UNw1YHuowNbTmKNs9UlS3En3cPgwM5MI+agIgr/B1hSze9NdOP0qn7boZaI9Lph8IDv3/24g9IxnJP7aQ==",
+ "node_modules/@eslint-react/core/node_modules/@typescript-eslint/typescript-estree": {
+ "version": "8.61.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.61.1.tgz",
+ "integrity": "sha512-u+oQD3BqYWPc8YV9Zab4vaJElJuwOLPRc10Jm1o/qS+6Qwen14HCWwx0Seo4LnSn2wxea2Ik8DxPt2/FHmuhrg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@electron/asar": "^3.2.1",
- "@malept/cross-spawn-promise": "^1.1.0",
- "debug": "^4.3.1",
- "dir-compare": "^3.0.0",
- "fs-extra": "^9.0.1",
- "minimatch": "^3.0.4",
- "plist": "^3.0.4"
+ "@typescript-eslint/project-service": "8.61.1",
+ "@typescript-eslint/tsconfig-utils": "8.61.1",
+ "@typescript-eslint/types": "8.61.1",
+ "@typescript-eslint/visitor-keys": "8.61.1",
+ "debug": "^4.4.3",
+ "minimatch": "^10.2.2",
+ "semver": "^7.7.3",
+ "tinyglobby": "^0.2.15",
+ "ts-api-utils": "^2.5.0"
},
"engines": {
- "node": ">=8.6"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4 <6.1.0"
}
},
- "node_modules/@electron/universal/node_modules/brace-expansion": {
- "version": "1.1.11",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "node_modules/@eslint-react/core/node_modules/@typescript-eslint/utils": {
+ "version": "8.61.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.61.1.tgz",
+ "integrity": "sha512-1+P/3Dj6jvtybE1q0HQ6yBt/gq+oKJyLdEv4HdnqasaEXRSYCAsD59mXEVQnM/ULNdQxbX77tdG4jPRjIS6knA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
+ "@eslint-community/eslint-utils": "^4.9.1",
+ "@typescript-eslint/scope-manager": "8.61.1",
+ "@typescript-eslint/types": "8.61.1",
+ "@typescript-eslint/typescript-estree": "8.61.1"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
+ "typescript": ">=4.8.4 <6.1.0"
}
},
- "node_modules/@electron/universal/node_modules/fs-extra": {
- "version": "9.1.0",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
- "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
+ "node_modules/@eslint-react/core/node_modules/@typescript-eslint/visitor-keys": {
+ "version": "8.61.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.61.1.tgz",
+ "integrity": "sha512-6fJ9MHWtK14C1DSkiMlHUSOmrVebL7150xZJBlJiL62jjhIA4JmOq6flwBgDxIdBKKdoiZRel+dfPD5MLfny3w==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "at-least-node": "^1.0.0",
- "graceful-fs": "^4.2.0",
- "jsonfile": "^6.0.1",
- "universalify": "^2.0.0"
+ "@typescript-eslint/types": "8.61.1",
+ "eslint-visitor-keys": "^5.0.0"
},
"engines": {
- "node": ">=10"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
}
},
- "node_modules/@electron/universal/node_modules/jsonfile": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
- "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
+ "node_modules/@eslint-react/core/node_modules/eslint-visitor-keys": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz",
+ "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==",
"dev": true,
- "dependencies": {
- "universalify": "^2.0.0"
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^20.19.0 || ^22.13.0 || >=24"
},
- "optionalDependencies": {
- "graceful-fs": "^4.1.6"
+ "funding": {
+ "url": "https://opencollective.com/eslint"
}
},
- "node_modules/@electron/universal/node_modules/minimatch": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
- "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "node_modules/@eslint-react/core/node_modules/minimatch": {
+ "version": "10.2.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz",
+ "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==",
"dev": true,
+ "license": "BlueOak-1.0.0",
"dependencies": {
- "brace-expansion": "^1.1.7"
+ "brace-expansion": "^5.0.5"
},
"engines": {
- "node": "*"
+ "node": "18 || 20 || >=22"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
}
},
- "node_modules/@electron/universal/node_modules/universalify": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
- "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
+ "node_modules/@eslint-react/eslint": {
+ "version": "5.9.1",
+ "resolved": "https://registry.npmjs.org/@eslint-react/eslint/-/eslint-5.9.1.tgz",
+ "integrity": "sha512-YJVfj1Z0+uaYI+KmdNDQpLT8KceLRjf8UH3gd/fJJ+Ye3jBuS5sXDxBBoG74OF61/mtTugrc9aBCes4hlouwBg==",
"dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/utils": "^8.61.1"
+ },
"engines": {
- "node": ">= 10.0.0"
- }
- },
- "node_modules/@emnapi/runtime": {
- "version": "0.45.0",
- "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-0.45.0.tgz",
- "integrity": "sha512-Txumi3td7J4A/xTTwlssKieHKTGl3j4A1tglBx72auZ49YK7ePY6XZricgIg9mnZT4xPfA+UPCUdnhRuEFDL+w==",
- "dev": true,
- "optional": true,
- "dependencies": {
- "tslib": "^2.4.0"
+ "node": ">=22.0.0"
+ },
+ "peerDependencies": {
+ "eslint": "*",
+ "typescript": "*"
}
},
- "node_modules/@eslint-community/eslint-utils": {
- "version": "4.4.0",
- "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz",
- "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==",
+ "node_modules/@eslint-react/eslint-plugin": {
+ "version": "5.9.1",
+ "resolved": "https://registry.npmjs.org/@eslint-react/eslint-plugin/-/eslint-plugin-5.9.1.tgz",
+ "integrity": "sha512-UVkd9g/NzpyoBIJb8O1OcjNLKe5BNGg+IZH5Pns/aPFdkdXqzmVHpgTtLg+w2fDNzv+hivqjUdWw99EQ7kC0fA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "eslint-visitor-keys": "^3.3.0"
+ "@eslint-react/shared": "5.9.1",
+ "eslint-plugin-react-dom": "5.9.1",
+ "eslint-plugin-react-jsx": "5.9.1",
+ "eslint-plugin-react-naming-convention": "5.9.1",
+ "eslint-plugin-react-rsc": "5.9.1",
+ "eslint-plugin-react-web-api": "5.9.1",
+ "eslint-plugin-react-x": "5.9.1"
},
"engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ "node": ">=22.0.0"
},
"peerDependencies": {
- "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
+ "eslint": "*",
+ "typescript": "*"
}
},
- "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": {
- "version": "3.4.3",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
- "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
+ "node_modules/@eslint-react/eslint/node_modules/@typescript-eslint/project-service": {
+ "version": "8.61.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.61.1.tgz",
+ "integrity": "sha512-PrC4JYGmR241lYnfhmKGTXkFqv8+ymbTFgSAY0fVXpY82/QkMw5TZPl+vGzuDDU2QYJk9fIDOBTntF+yDv9LEA==",
"dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/tsconfig-utils": "^8.61.1",
+ "@typescript-eslint/types": "^8.61.1",
+ "debug": "^4.4.3"
+ },
"engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
"funding": {
- "url": "https://opencollective.com/eslint"
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4 <6.1.0"
}
},
- "node_modules/@eslint-community/regexpp": {
- "version": "4.10.0",
- "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz",
- "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==",
+ "node_modules/@eslint-react/eslint/node_modules/@typescript-eslint/scope-manager": {
+ "version": "8.61.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.61.1.tgz",
+ "integrity": "sha512-L2bdIeoQS8FlKAvONAr20w6OcLXeB+qiDKbAooS9A0Ben+iSIkBef0FxqwKWYqt5sa0i4KJtxVyVmhMylKzF5w==",
"dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/types": "8.61.1",
+ "@typescript-eslint/visitor-keys": "8.61.1"
+ },
"engines": {
- "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
}
},
- "node_modules/@eslint/eslintrc": {
- "version": "2.1.4",
- "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz",
- "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==",
+ "node_modules/@eslint-react/eslint/node_modules/@typescript-eslint/tsconfig-utils": {
+ "version": "8.61.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.61.1.tgz",
+ "integrity": "sha512-UN/H4di+OO7EWx2ovME+8t31YO+KVnK0RRKEHR3kOt21/Ay8BOq3M1OMvWs5vNiqcFCYGYoxK3MXPZzmMUE+yg==",
"dev": true,
- "dependencies": {
- "ajv": "^6.12.4",
- "debug": "^4.3.2",
- "espree": "^9.6.0",
- "globals": "^13.19.0",
- "ignore": "^5.2.0",
- "import-fresh": "^3.2.1",
- "js-yaml": "^4.1.0",
- "minimatch": "^3.1.2",
- "strip-json-comments": "^3.1.1"
- },
+ "license": "MIT",
"engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
"funding": {
- "url": "https://opencollective.com/eslint"
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4 <6.1.0"
}
},
- "node_modules/@eslint/eslintrc/node_modules/ajv": {
- "version": "6.12.6",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
- "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "node_modules/@eslint-react/eslint/node_modules/@typescript-eslint/types": {
+ "version": "8.61.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.61.1.tgz",
+ "integrity": "sha512-G+CRlPqLv7Bz1IZVs03x5K59F1veqL0EJUROAdGhKsEq8qOiRiZbI+HUojPq5l0fEGOKModD9br6lObhB8zkoA==",
"dev": true,
- "dependencies": {
- "fast-deep-equal": "^3.1.1",
- "fast-json-stable-stringify": "^2.0.0",
- "json-schema-traverse": "^0.4.1",
- "uri-js": "^4.2.2"
+ "license": "MIT",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
"funding": {
- "type": "github",
- "url": "https://github.com/sponsors/epoberezkin"
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
}
},
- "node_modules/@eslint/eslintrc/node_modules/brace-expansion": {
- "version": "1.1.11",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "node_modules/@eslint-react/eslint/node_modules/@typescript-eslint/typescript-estree": {
+ "version": "8.61.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.61.1.tgz",
+ "integrity": "sha512-u+oQD3BqYWPc8YV9Zab4vaJElJuwOLPRc10Jm1o/qS+6Qwen14HCWwx0Seo4LnSn2wxea2Ik8DxPt2/FHmuhrg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
+ "@typescript-eslint/project-service": "8.61.1",
+ "@typescript-eslint/tsconfig-utils": "8.61.1",
+ "@typescript-eslint/types": "8.61.1",
+ "@typescript-eslint/visitor-keys": "8.61.1",
+ "debug": "^4.4.3",
+ "minimatch": "^10.2.2",
+ "semver": "^7.7.3",
+ "tinyglobby": "^0.2.15",
+ "ts-api-utils": "^2.5.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4 <6.1.0"
}
},
- "node_modules/@eslint/eslintrc/node_modules/globals": {
- "version": "13.24.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz",
- "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==",
+ "node_modules/@eslint-react/eslint/node_modules/@typescript-eslint/utils": {
+ "version": "8.61.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.61.1.tgz",
+ "integrity": "sha512-1+P/3Dj6jvtybE1q0HQ6yBt/gq+oKJyLdEv4HdnqasaEXRSYCAsD59mXEVQnM/ULNdQxbX77tdG4jPRjIS6knA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "type-fest": "^0.20.2"
+ "@eslint-community/eslint-utils": "^4.9.1",
+ "@typescript-eslint/scope-manager": "8.61.1",
+ "@typescript-eslint/types": "8.61.1",
+ "@typescript-eslint/typescript-estree": "8.61.1"
},
"engines": {
- "node": ">=8"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
"funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
+ "typescript": ">=4.8.4 <6.1.0"
}
},
- "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
- "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
- "dev": true
- },
- "node_modules/@eslint/eslintrc/node_modules/minimatch": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
- "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "node_modules/@eslint-react/eslint/node_modules/@typescript-eslint/visitor-keys": {
+ "version": "8.61.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.61.1.tgz",
+ "integrity": "sha512-6fJ9MHWtK14C1DSkiMlHUSOmrVebL7150xZJBlJiL62jjhIA4JmOq6flwBgDxIdBKKdoiZRel+dfPD5MLfny3w==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "brace-expansion": "^1.1.7"
+ "@typescript-eslint/types": "8.61.1",
+ "eslint-visitor-keys": "^5.0.0"
},
"engines": {
- "node": "*"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
}
},
- "node_modules/@eslint/eslintrc/node_modules/type-fest": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
- "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
+ "node_modules/@eslint-react/eslint/node_modules/eslint-visitor-keys": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz",
+ "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==",
"dev": true,
+ "license": "Apache-2.0",
"engines": {
- "node": ">=10"
+ "node": "^20.19.0 || ^22.13.0 || >=24"
},
"funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "url": "https://opencollective.com/eslint"
}
},
- "node_modules/@eslint/js": {
- "version": "8.57.0",
- "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz",
- "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==",
+ "node_modules/@eslint-react/eslint/node_modules/minimatch": {
+ "version": "10.2.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz",
+ "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==",
"dev": true,
+ "license": "BlueOak-1.0.0",
+ "dependencies": {
+ "brace-expansion": "^5.0.5"
+ },
"engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ "node": "18 || 20 || >=22"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
}
},
- "node_modules/@humanwhocodes/config-array": {
- "version": "0.11.14",
- "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz",
- "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==",
+ "node_modules/@eslint-react/jsx": {
+ "version": "5.9.1",
+ "resolved": "https://registry.npmjs.org/@eslint-react/jsx/-/jsx-5.9.1.tgz",
+ "integrity": "sha512-rZVIWotHLOYdbsmBEMJCQlu2gUeHcU8dYa7EkhWPwuh3p1q1ydV+Jfn4whJwHVb/mTI8zy4957RnFbGGWVLa6g==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@humanwhocodes/object-schema": "^2.0.2",
- "debug": "^4.3.1",
- "minimatch": "^3.0.5"
+ "@eslint-react/ast": "5.9.1",
+ "@eslint-react/eslint": "5.9.1",
+ "@eslint-react/shared": "5.9.1",
+ "@eslint-react/var": "5.9.1",
+ "@typescript-eslint/types": "^8.61.1",
+ "@typescript-eslint/utils": "^8.61.1",
+ "ts-pattern": "^5.9.0"
},
"engines": {
- "node": ">=10.10.0"
+ "node": ">=22.0.0"
+ },
+ "peerDependencies": {
+ "eslint": "*",
+ "typescript": "*"
}
},
- "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": {
- "version": "1.1.11",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "node_modules/@eslint-react/jsx/node_modules/@typescript-eslint/project-service": {
+ "version": "8.61.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.61.1.tgz",
+ "integrity": "sha512-PrC4JYGmR241lYnfhmKGTXkFqv8+ymbTFgSAY0fVXpY82/QkMw5TZPl+vGzuDDU2QYJk9fIDOBTntF+yDv9LEA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
+ "@typescript-eslint/tsconfig-utils": "^8.61.1",
+ "@typescript-eslint/types": "^8.61.1",
+ "debug": "^4.4.3"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4 <6.1.0"
}
},
- "node_modules/@humanwhocodes/config-array/node_modules/minimatch": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
- "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "node_modules/@eslint-react/jsx/node_modules/@typescript-eslint/scope-manager": {
+ "version": "8.61.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.61.1.tgz",
+ "integrity": "sha512-L2bdIeoQS8FlKAvONAr20w6OcLXeB+qiDKbAooS9A0Ben+iSIkBef0FxqwKWYqt5sa0i4KJtxVyVmhMylKzF5w==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "brace-expansion": "^1.1.7"
+ "@typescript-eslint/types": "8.61.1",
+ "@typescript-eslint/visitor-keys": "8.61.1"
},
"engines": {
- "node": "*"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
}
},
- "node_modules/@humanwhocodes/module-importer": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
- "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
+ "node_modules/@eslint-react/jsx/node_modules/@typescript-eslint/tsconfig-utils": {
+ "version": "8.61.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.61.1.tgz",
+ "integrity": "sha512-UN/H4di+OO7EWx2ovME+8t31YO+KVnK0RRKEHR3kOt21/Ay8BOq3M1OMvWs5vNiqcFCYGYoxK3MXPZzmMUE+yg==",
"dev": true,
+ "license": "MIT",
"engines": {
- "node": ">=12.22"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
"funding": {
- "type": "github",
- "url": "https://github.com/sponsors/nzakas"
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4 <6.1.0"
}
},
- "node_modules/@humanwhocodes/object-schema": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz",
- "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==",
- "dev": true
- },
- "node_modules/@iarna/toml": {
- "version": "2.2.5",
- "resolved": "https://registry.npmjs.org/@iarna/toml/-/toml-2.2.5.tgz",
- "integrity": "sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==",
- "dev": true
+ "node_modules/@eslint-react/jsx/node_modules/@typescript-eslint/types": {
+ "version": "8.61.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.61.1.tgz",
+ "integrity": "sha512-G+CRlPqLv7Bz1IZVs03x5K59F1veqL0EJUROAdGhKsEq8qOiRiZbI+HUojPq5l0fEGOKModD9br6lObhB8zkoA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
},
- "node_modules/@img/sharp-darwin-arm64": {
- "version": "0.33.2",
- "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.2.tgz",
- "integrity": "sha512-itHBs1rPmsmGF9p4qRe++CzCgd+kFYktnsoR1sbIAfsRMrJZau0Tt1AH9KVnufc2/tU02Gf6Ibujx+15qRE03w==",
- "cpu": [
- "arm64"
- ],
+ "node_modules/@eslint-react/jsx/node_modules/@typescript-eslint/typescript-estree": {
+ "version": "8.61.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.61.1.tgz",
+ "integrity": "sha512-u+oQD3BqYWPc8YV9Zab4vaJElJuwOLPRc10Jm1o/qS+6Qwen14HCWwx0Seo4LnSn2wxea2Ik8DxPt2/FHmuhrg==",
"dev": true,
- "optional": true,
- "os": [
- "darwin"
- ],
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/project-service": "8.61.1",
+ "@typescript-eslint/tsconfig-utils": "8.61.1",
+ "@typescript-eslint/types": "8.61.1",
+ "@typescript-eslint/visitor-keys": "8.61.1",
+ "debug": "^4.4.3",
+ "minimatch": "^10.2.2",
+ "semver": "^7.7.3",
+ "tinyglobby": "^0.2.15",
+ "ts-api-utils": "^2.5.0"
+ },
"engines": {
- "glibc": ">=2.26",
- "node": "^18.17.0 || ^20.3.0 || >=21.0.0",
- "npm": ">=9.6.5",
- "pnpm": ">=7.1.0",
- "yarn": ">=3.2.0"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
"funding": {
- "url": "https://opencollective.com/libvips"
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
},
- "optionalDependencies": {
- "@img/sharp-libvips-darwin-arm64": "1.0.1"
+ "peerDependencies": {
+ "typescript": ">=4.8.4 <6.1.0"
}
},
- "node_modules/@img/sharp-darwin-x64": {
- "version": "0.33.2",
- "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.33.2.tgz",
- "integrity": "sha512-/rK/69Rrp9x5kaWBjVN07KixZanRr+W1OiyKdXcbjQD6KbW+obaTeBBtLUAtbBsnlTTmWthw99xqoOS7SsySDg==",
- "cpu": [
- "x64"
- ],
+ "node_modules/@eslint-react/jsx/node_modules/@typescript-eslint/utils": {
+ "version": "8.61.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.61.1.tgz",
+ "integrity": "sha512-1+P/3Dj6jvtybE1q0HQ6yBt/gq+oKJyLdEv4HdnqasaEXRSYCAsD59mXEVQnM/ULNdQxbX77tdG4jPRjIS6knA==",
"dev": true,
- "optional": true,
- "os": [
- "darwin"
- ],
+ "license": "MIT",
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.9.1",
+ "@typescript-eslint/scope-manager": "8.61.1",
+ "@typescript-eslint/types": "8.61.1",
+ "@typescript-eslint/typescript-estree": "8.61.1"
+ },
"engines": {
- "glibc": ">=2.26",
- "node": "^18.17.0 || ^20.3.0 || >=21.0.0",
- "npm": ">=9.6.5",
- "pnpm": ">=7.1.0",
- "yarn": ">=3.2.0"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
"funding": {
- "url": "https://opencollective.com/libvips"
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
},
- "optionalDependencies": {
- "@img/sharp-libvips-darwin-x64": "1.0.1"
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
+ "typescript": ">=4.8.4 <6.1.0"
}
},
- "node_modules/@img/sharp-libvips-darwin-arm64": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.1.tgz",
- "integrity": "sha512-kQyrSNd6lmBV7O0BUiyu/OEw9yeNGFbQhbxswS1i6rMDwBBSX+e+rPzu3S+MwAiGU3HdLze3PanQ4Xkfemgzcw==",
- "cpu": [
- "arm64"
- ],
+ "node_modules/@eslint-react/jsx/node_modules/@typescript-eslint/visitor-keys": {
+ "version": "8.61.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.61.1.tgz",
+ "integrity": "sha512-6fJ9MHWtK14C1DSkiMlHUSOmrVebL7150xZJBlJiL62jjhIA4JmOq6flwBgDxIdBKKdoiZRel+dfPD5MLfny3w==",
"dev": true,
- "optional": true,
- "os": [
- "darwin"
- ],
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/types": "8.61.1",
+ "eslint-visitor-keys": "^5.0.0"
+ },
"engines": {
- "macos": ">=11",
- "npm": ">=9.6.5",
- "pnpm": ">=7.1.0",
- "yarn": ">=3.2.0"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
"funding": {
- "url": "https://opencollective.com/libvips"
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
}
},
- "node_modules/@img/sharp-libvips-darwin-x64": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.1.tgz",
- "integrity": "sha512-eVU/JYLPVjhhrd8Tk6gosl5pVlvsqiFlt50wotCvdkFGf+mDNBJxMh+bvav+Wt3EBnNZWq8Sp2I7XfSjm8siog==",
- "cpu": [
- "x64"
- ],
+ "node_modules/@eslint-react/jsx/node_modules/eslint-visitor-keys": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz",
+ "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==",
"dev": true,
- "optional": true,
- "os": [
- "darwin"
- ],
+ "license": "Apache-2.0",
"engines": {
- "macos": ">=10.13",
- "npm": ">=9.6.5",
- "pnpm": ">=7.1.0",
- "yarn": ">=3.2.0"
+ "node": "^20.19.0 || ^22.13.0 || >=24"
},
"funding": {
- "url": "https://opencollective.com/libvips"
+ "url": "https://opencollective.com/eslint"
}
},
- "node_modules/@img/sharp-libvips-linux-arm": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.0.1.tgz",
- "integrity": "sha512-FtdMvR4R99FTsD53IA3LxYGghQ82t3yt0ZQ93WMZ2xV3dqrb0E8zq4VHaTOuLEAuA83oDawHV3fd+BsAPadHIQ==",
- "cpu": [
- "arm"
- ],
+ "node_modules/@eslint-react/jsx/node_modules/minimatch": {
+ "version": "10.2.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz",
+ "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==",
"dev": true,
- "optional": true,
- "os": [
- "linux"
- ],
+ "license": "BlueOak-1.0.0",
+ "dependencies": {
+ "brace-expansion": "^5.0.5"
+ },
"engines": {
- "glibc": ">=2.28",
- "npm": ">=9.6.5",
- "pnpm": ">=7.1.0",
- "yarn": ">=3.2.0"
+ "node": "18 || 20 || >=22"
},
"funding": {
- "url": "https://opencollective.com/libvips"
+ "url": "https://github.com/sponsors/isaacs"
}
},
- "node_modules/@img/sharp-libvips-linux-arm64": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.0.1.tgz",
- "integrity": "sha512-bnGG+MJjdX70mAQcSLxgeJco11G+MxTz+ebxlz8Y3dxyeb3Nkl7LgLI0mXupoO+u1wRNx/iRj5yHtzA4sde1yA==",
- "cpu": [
- "arm64"
- ],
+ "node_modules/@eslint-react/shared": {
+ "version": "5.9.1",
+ "resolved": "https://registry.npmjs.org/@eslint-react/shared/-/shared-5.9.1.tgz",
+ "integrity": "sha512-6VBZo5KTlyUrn27aW6u6nqVvX9igWxzQX0vVNCv/ObnCA6ElOn1TBC9ENwRoK73FJ86PcT25PWyz1LJRgwnefw==",
"dev": true,
- "optional": true,
- "os": [
- "linux"
- ],
+ "license": "MIT",
+ "dependencies": {
+ "@eslint-react/eslint": "5.9.1",
+ "@typescript-eslint/utils": "^8.61.1",
+ "ts-pattern": "^5.9.0",
+ "zod": "^3.25.0 || ^4.0.0"
+ },
"engines": {
- "glibc": ">=2.26",
- "npm": ">=9.6.5",
- "pnpm": ">=7.1.0",
- "yarn": ">=3.2.0"
+ "node": ">=22.0.0"
},
- "funding": {
- "url": "https://opencollective.com/libvips"
+ "peerDependencies": {
+ "eslint": "*",
+ "typescript": "*"
}
},
- "node_modules/@img/sharp-libvips-linux-s390x": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.1.tgz",
- "integrity": "sha512-3+rzfAR1YpMOeA2zZNp+aYEzGNWK4zF3+sdMxuCS3ey9HhDbJ66w6hDSHDMoap32DueFwhhs3vwooAB2MaK4XQ==",
- "cpu": [
- "s390x"
- ],
+ "node_modules/@eslint-react/shared/node_modules/@typescript-eslint/project-service": {
+ "version": "8.61.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.61.1.tgz",
+ "integrity": "sha512-PrC4JYGmR241lYnfhmKGTXkFqv8+ymbTFgSAY0fVXpY82/QkMw5TZPl+vGzuDDU2QYJk9fIDOBTntF+yDv9LEA==",
"dev": true,
- "optional": true,
- "os": [
- "linux"
- ],
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/tsconfig-utils": "^8.61.1",
+ "@typescript-eslint/types": "^8.61.1",
+ "debug": "^4.4.3"
+ },
"engines": {
- "glibc": ">=2.28",
- "npm": ">=9.6.5",
- "pnpm": ">=7.1.0",
- "yarn": ">=3.2.0"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
"funding": {
- "url": "https://opencollective.com/libvips"
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4 <6.1.0"
}
},
- "node_modules/@img/sharp-libvips-linux-x64": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.1.tgz",
- "integrity": "sha512-3NR1mxFsaSgMMzz1bAnnKbSAI+lHXVTqAHgc1bgzjHuXjo4hlscpUxc0vFSAPKI3yuzdzcZOkq7nDPrP2F8Jgw==",
- "cpu": [
- "x64"
- ],
+ "node_modules/@eslint-react/shared/node_modules/@typescript-eslint/scope-manager": {
+ "version": "8.61.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.61.1.tgz",
+ "integrity": "sha512-L2bdIeoQS8FlKAvONAr20w6OcLXeB+qiDKbAooS9A0Ben+iSIkBef0FxqwKWYqt5sa0i4KJtxVyVmhMylKzF5w==",
"dev": true,
- "optional": true,
- "os": [
- "linux"
- ],
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/types": "8.61.1",
+ "@typescript-eslint/visitor-keys": "8.61.1"
+ },
"engines": {
- "glibc": ">=2.26",
- "npm": ">=9.6.5",
- "pnpm": ">=7.1.0",
- "yarn": ">=3.2.0"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
"funding": {
- "url": "https://opencollective.com/libvips"
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
}
},
- "node_modules/@img/sharp-libvips-linuxmusl-arm64": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.0.1.tgz",
- "integrity": "sha512-5aBRcjHDG/T6jwC3Edl3lP8nl9U2Yo8+oTl5drd1dh9Z1EBfzUKAJFUDTDisDjUwc7N4AjnPGfCA3jl3hY8uDg==",
- "cpu": [
- "arm64"
- ],
+ "node_modules/@eslint-react/shared/node_modules/@typescript-eslint/tsconfig-utils": {
+ "version": "8.61.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.61.1.tgz",
+ "integrity": "sha512-UN/H4di+OO7EWx2ovME+8t31YO+KVnK0RRKEHR3kOt21/Ay8BOq3M1OMvWs5vNiqcFCYGYoxK3MXPZzmMUE+yg==",
"dev": true,
- "optional": true,
- "os": [
- "linux"
- ],
+ "license": "MIT",
"engines": {
- "musl": ">=1.2.2",
- "npm": ">=9.6.5",
- "pnpm": ">=7.1.0",
- "yarn": ">=3.2.0"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
"funding": {
- "url": "https://opencollective.com/libvips"
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4 <6.1.0"
}
},
- "node_modules/@img/sharp-libvips-linuxmusl-x64": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.0.1.tgz",
- "integrity": "sha512-dcT7inI9DBFK6ovfeWRe3hG30h51cBAP5JXlZfx6pzc/Mnf9HFCQDLtYf4MCBjxaaTfjCCjkBxcy3XzOAo5txw==",
- "cpu": [
- "x64"
- ],
+ "node_modules/@eslint-react/shared/node_modules/@typescript-eslint/types": {
+ "version": "8.61.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.61.1.tgz",
+ "integrity": "sha512-G+CRlPqLv7Bz1IZVs03x5K59F1veqL0EJUROAdGhKsEq8qOiRiZbI+HUojPq5l0fEGOKModD9br6lObhB8zkoA==",
"dev": true,
- "optional": true,
- "os": [
- "linux"
- ],
+ "license": "MIT",
"engines": {
- "musl": ">=1.2.2",
- "npm": ">=9.6.5",
- "pnpm": ">=7.1.0",
- "yarn": ">=3.2.0"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
"funding": {
- "url": "https://opencollective.com/libvips"
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
}
},
- "node_modules/@img/sharp-linux-arm": {
- "version": "0.33.2",
- "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.33.2.tgz",
- "integrity": "sha512-Fndk/4Zq3vAc4G/qyfXASbS3HBZbKrlnKZLEJzPLrXoJuipFNNwTes71+Ki1hwYW5lch26niRYoZFAtZVf3EGA==",
- "cpu": [
- "arm"
- ],
+ "node_modules/@eslint-react/shared/node_modules/@typescript-eslint/typescript-estree": {
+ "version": "8.61.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.61.1.tgz",
+ "integrity": "sha512-u+oQD3BqYWPc8YV9Zab4vaJElJuwOLPRc10Jm1o/qS+6Qwen14HCWwx0Seo4LnSn2wxea2Ik8DxPt2/FHmuhrg==",
"dev": true,
- "optional": true,
- "os": [
- "linux"
- ],
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/project-service": "8.61.1",
+ "@typescript-eslint/tsconfig-utils": "8.61.1",
+ "@typescript-eslint/types": "8.61.1",
+ "@typescript-eslint/visitor-keys": "8.61.1",
+ "debug": "^4.4.3",
+ "minimatch": "^10.2.2",
+ "semver": "^7.7.3",
+ "tinyglobby": "^0.2.15",
+ "ts-api-utils": "^2.5.0"
+ },
"engines": {
- "glibc": ">=2.28",
- "node": "^18.17.0 || ^20.3.0 || >=21.0.0",
- "npm": ">=9.6.5",
- "pnpm": ">=7.1.0",
- "yarn": ">=3.2.0"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
"funding": {
- "url": "https://opencollective.com/libvips"
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
},
- "optionalDependencies": {
- "@img/sharp-libvips-linux-arm": "1.0.1"
+ "peerDependencies": {
+ "typescript": ">=4.8.4 <6.1.0"
}
},
- "node_modules/@img/sharp-linux-arm64": {
- "version": "0.33.2",
- "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.33.2.tgz",
- "integrity": "sha512-pz0NNo882vVfqJ0yNInuG9YH71smP4gRSdeL09ukC2YLE6ZyZePAlWKEHgAzJGTiOh8Qkaov6mMIMlEhmLdKew==",
- "cpu": [
- "arm64"
- ],
+ "node_modules/@eslint-react/shared/node_modules/@typescript-eslint/utils": {
+ "version": "8.61.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.61.1.tgz",
+ "integrity": "sha512-1+P/3Dj6jvtybE1q0HQ6yBt/gq+oKJyLdEv4HdnqasaEXRSYCAsD59mXEVQnM/ULNdQxbX77tdG4jPRjIS6knA==",
"dev": true,
- "optional": true,
- "os": [
- "linux"
- ],
+ "license": "MIT",
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.9.1",
+ "@typescript-eslint/scope-manager": "8.61.1",
+ "@typescript-eslint/types": "8.61.1",
+ "@typescript-eslint/typescript-estree": "8.61.1"
+ },
"engines": {
- "glibc": ">=2.26",
- "node": "^18.17.0 || ^20.3.0 || >=21.0.0",
- "npm": ">=9.6.5",
- "pnpm": ">=7.1.0",
- "yarn": ">=3.2.0"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
"funding": {
- "url": "https://opencollective.com/libvips"
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
},
- "optionalDependencies": {
- "@img/sharp-libvips-linux-arm64": "1.0.1"
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
+ "typescript": ">=4.8.4 <6.1.0"
}
},
- "node_modules/@img/sharp-linux-s390x": {
- "version": "0.33.2",
- "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.33.2.tgz",
- "integrity": "sha512-MBoInDXDppMfhSzbMmOQtGfloVAflS2rP1qPcUIiITMi36Mm5YR7r0ASND99razjQUpHTzjrU1flO76hKvP5RA==",
- "cpu": [
- "s390x"
- ],
+ "node_modules/@eslint-react/shared/node_modules/@typescript-eslint/visitor-keys": {
+ "version": "8.61.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.61.1.tgz",
+ "integrity": "sha512-6fJ9MHWtK14C1DSkiMlHUSOmrVebL7150xZJBlJiL62jjhIA4JmOq6flwBgDxIdBKKdoiZRel+dfPD5MLfny3w==",
"dev": true,
- "optional": true,
- "os": [
- "linux"
- ],
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/types": "8.61.1",
+ "eslint-visitor-keys": "^5.0.0"
+ },
"engines": {
- "glibc": ">=2.28",
- "node": "^18.17.0 || ^20.3.0 || >=21.0.0",
- "npm": ">=9.6.5",
- "pnpm": ">=7.1.0",
- "yarn": ">=3.2.0"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
"funding": {
- "url": "https://opencollective.com/libvips"
- },
- "optionalDependencies": {
- "@img/sharp-libvips-linux-s390x": "1.0.1"
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
}
},
- "node_modules/@img/sharp-linux-x64": {
- "version": "0.33.2",
- "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.2.tgz",
- "integrity": "sha512-xUT82H5IbXewKkeF5aiooajoO1tQV4PnKfS/OZtb5DDdxS/FCI/uXTVZ35GQ97RZXsycojz/AJ0asoz6p2/H/A==",
- "cpu": [
- "x64"
- ],
+ "node_modules/@eslint-react/shared/node_modules/eslint-visitor-keys": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz",
+ "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==",
"dev": true,
- "optional": true,
- "os": [
- "linux"
- ],
+ "license": "Apache-2.0",
"engines": {
- "glibc": ">=2.26",
- "node": "^18.17.0 || ^20.3.0 || >=21.0.0",
- "npm": ">=9.6.5",
- "pnpm": ">=7.1.0",
- "yarn": ">=3.2.0"
+ "node": "^20.19.0 || ^22.13.0 || >=24"
},
"funding": {
- "url": "https://opencollective.com/libvips"
- },
- "optionalDependencies": {
- "@img/sharp-libvips-linux-x64": "1.0.1"
+ "url": "https://opencollective.com/eslint"
}
},
- "node_modules/@img/sharp-linuxmusl-arm64": {
- "version": "0.33.2",
- "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.33.2.tgz",
- "integrity": "sha512-F+0z8JCu/UnMzg8IYW1TMeiViIWBVg7IWP6nE0p5S5EPQxlLd76c8jYemG21X99UzFwgkRo5yz2DS+zbrnxZeA==",
- "cpu": [
- "arm64"
- ],
+ "node_modules/@eslint-react/shared/node_modules/minimatch": {
+ "version": "10.2.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz",
+ "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==",
"dev": true,
- "optional": true,
- "os": [
- "linux"
- ],
+ "license": "BlueOak-1.0.0",
+ "dependencies": {
+ "brace-expansion": "^5.0.5"
+ },
"engines": {
- "musl": ">=1.2.2",
- "node": "^18.17.0 || ^20.3.0 || >=21.0.0",
- "npm": ">=9.6.5",
- "pnpm": ">=7.1.0",
- "yarn": ">=3.2.0"
+ "node": "18 || 20 || >=22"
},
"funding": {
- "url": "https://opencollective.com/libvips"
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/@eslint-react/var": {
+ "version": "5.9.1",
+ "resolved": "https://registry.npmjs.org/@eslint-react/var/-/var-5.9.1.tgz",
+ "integrity": "sha512-s+hb4H+6CzFsL2E6Yw6/c3bzSFfNc2XNOP2Q60k4G05VCbUew30Aqcf0Ehiac5wgGmpDZ9/9wkJiNanW2M1viA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@eslint-react/ast": "5.9.1",
+ "@eslint-react/eslint": "5.9.1",
+ "@typescript-eslint/scope-manager": "^8.61.1",
+ "@typescript-eslint/types": "^8.61.1",
+ "@typescript-eslint/utils": "^8.61.1",
+ "ts-pattern": "^5.9.0"
},
- "optionalDependencies": {
- "@img/sharp-libvips-linuxmusl-arm64": "1.0.1"
+ "engines": {
+ "node": ">=22.0.0"
+ },
+ "peerDependencies": {
+ "eslint": "*",
+ "typescript": "*"
}
},
- "node_modules/@img/sharp-linuxmusl-x64": {
- "version": "0.33.2",
- "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.33.2.tgz",
- "integrity": "sha512-+ZLE3SQmSL+Fn1gmSaM8uFusW5Y3J9VOf+wMGNnTtJUMUxFhv+P4UPaYEYT8tqnyYVaOVGgMN/zsOxn9pSsO2A==",
- "cpu": [
- "x64"
- ],
+ "node_modules/@eslint-react/var/node_modules/@typescript-eslint/project-service": {
+ "version": "8.61.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.61.1.tgz",
+ "integrity": "sha512-PrC4JYGmR241lYnfhmKGTXkFqv8+ymbTFgSAY0fVXpY82/QkMw5TZPl+vGzuDDU2QYJk9fIDOBTntF+yDv9LEA==",
"dev": true,
- "optional": true,
- "os": [
- "linux"
- ],
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/tsconfig-utils": "^8.61.1",
+ "@typescript-eslint/types": "^8.61.1",
+ "debug": "^4.4.3"
+ },
"engines": {
- "musl": ">=1.2.2",
- "node": "^18.17.0 || ^20.3.0 || >=21.0.0",
- "npm": ">=9.6.5",
- "pnpm": ">=7.1.0",
- "yarn": ">=3.2.0"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
"funding": {
- "url": "https://opencollective.com/libvips"
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
},
- "optionalDependencies": {
- "@img/sharp-libvips-linuxmusl-x64": "1.0.1"
+ "peerDependencies": {
+ "typescript": ">=4.8.4 <6.1.0"
}
},
- "node_modules/@img/sharp-wasm32": {
- "version": "0.33.2",
- "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.33.2.tgz",
- "integrity": "sha512-fLbTaESVKuQcpm8ffgBD7jLb/CQLcATju/jxtTXR1XCLwbOQt+OL5zPHSDMmp2JZIeq82e18yE0Vv7zh6+6BfQ==",
- "cpu": [
- "wasm32"
- ],
+ "node_modules/@eslint-react/var/node_modules/@typescript-eslint/scope-manager": {
+ "version": "8.61.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.61.1.tgz",
+ "integrity": "sha512-L2bdIeoQS8FlKAvONAr20w6OcLXeB+qiDKbAooS9A0Ben+iSIkBef0FxqwKWYqt5sa0i4KJtxVyVmhMylKzF5w==",
"dev": true,
- "optional": true,
+ "license": "MIT",
"dependencies": {
- "@emnapi/runtime": "^0.45.0"
+ "@typescript-eslint/types": "8.61.1",
+ "@typescript-eslint/visitor-keys": "8.61.1"
},
"engines": {
- "node": "^18.17.0 || ^20.3.0 || >=21.0.0",
- "npm": ">=9.6.5",
- "pnpm": ">=7.1.0",
- "yarn": ">=3.2.0"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
"funding": {
- "url": "https://opencollective.com/libvips"
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
}
},
- "node_modules/@img/sharp-win32-ia32": {
- "version": "0.33.2",
- "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.2.tgz",
- "integrity": "sha512-okBpql96hIGuZ4lN3+nsAjGeggxKm7hIRu9zyec0lnfB8E7Z6p95BuRZzDDXZOl2e8UmR4RhYt631i7mfmKU8g==",
- "cpu": [
- "ia32"
- ],
+ "node_modules/@eslint-react/var/node_modules/@typescript-eslint/tsconfig-utils": {
+ "version": "8.61.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.61.1.tgz",
+ "integrity": "sha512-UN/H4di+OO7EWx2ovME+8t31YO+KVnK0RRKEHR3kOt21/Ay8BOq3M1OMvWs5vNiqcFCYGYoxK3MXPZzmMUE+yg==",
"dev": true,
- "optional": true,
- "os": [
- "win32"
- ],
+ "license": "MIT",
"engines": {
- "node": "^18.17.0 || ^20.3.0 || >=21.0.0",
- "npm": ">=9.6.5",
- "pnpm": ">=7.1.0",
- "yarn": ">=3.2.0"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
"funding": {
- "url": "https://opencollective.com/libvips"
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4 <6.1.0"
}
},
- "node_modules/@img/sharp-win32-x64": {
- "version": "0.33.2",
- "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.2.tgz",
- "integrity": "sha512-E4magOks77DK47FwHUIGH0RYWSgRBfGdK56kIHSVeB9uIS4pPFr4N2kIVsXdQQo4LzOsENKV5KAhRlRL7eMAdg==",
- "cpu": [
- "x64"
- ],
+ "node_modules/@eslint-react/var/node_modules/@typescript-eslint/types": {
+ "version": "8.61.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.61.1.tgz",
+ "integrity": "sha512-G+CRlPqLv7Bz1IZVs03x5K59F1veqL0EJUROAdGhKsEq8qOiRiZbI+HUojPq5l0fEGOKModD9br6lObhB8zkoA==",
"dev": true,
- "optional": true,
- "os": [
- "win32"
- ],
+ "license": "MIT",
"engines": {
- "node": "^18.17.0 || ^20.3.0 || >=21.0.0",
- "npm": ">=9.6.5",
- "pnpm": ">=7.1.0",
- "yarn": ">=3.2.0"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
"funding": {
- "url": "https://opencollective.com/libvips"
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
}
},
- "node_modules/@isaacs/cliui": {
- "version": "8.0.2",
- "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
- "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==",
+ "node_modules/@eslint-react/var/node_modules/@typescript-eslint/typescript-estree": {
+ "version": "8.61.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.61.1.tgz",
+ "integrity": "sha512-u+oQD3BqYWPc8YV9Zab4vaJElJuwOLPRc10Jm1o/qS+6Qwen14HCWwx0Seo4LnSn2wxea2Ik8DxPt2/FHmuhrg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "string-width": "^5.1.2",
- "string-width-cjs": "npm:string-width@^4.2.0",
- "strip-ansi": "^7.0.1",
- "strip-ansi-cjs": "npm:strip-ansi@^6.0.1",
- "wrap-ansi": "^8.1.0",
- "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0"
+ "@typescript-eslint/project-service": "8.61.1",
+ "@typescript-eslint/tsconfig-utils": "8.61.1",
+ "@typescript-eslint/types": "8.61.1",
+ "@typescript-eslint/visitor-keys": "8.61.1",
+ "debug": "^4.4.3",
+ "minimatch": "^10.2.2",
+ "semver": "^7.7.3",
+ "tinyglobby": "^0.2.15",
+ "ts-api-utils": "^2.5.0"
},
"engines": {
- "node": ">=12"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4 <6.1.0"
}
},
- "node_modules/@isaacs/cliui/node_modules/ansi-regex": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz",
- "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==",
+ "node_modules/@eslint-react/var/node_modules/@typescript-eslint/utils": {
+ "version": "8.61.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.61.1.tgz",
+ "integrity": "sha512-1+P/3Dj6jvtybE1q0HQ6yBt/gq+oKJyLdEv4HdnqasaEXRSYCAsD59mXEVQnM/ULNdQxbX77tdG4jPRjIS6knA==",
"dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.9.1",
+ "@typescript-eslint/scope-manager": "8.61.1",
+ "@typescript-eslint/types": "8.61.1",
+ "@typescript-eslint/typescript-estree": "8.61.1"
+ },
"engines": {
- "node": ">=12"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
"funding": {
- "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
+ "typescript": ">=4.8.4 <6.1.0"
}
},
- "node_modules/@isaacs/cliui/node_modules/ansi-styles": {
- "version": "6.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
- "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
+ "node_modules/@eslint-react/var/node_modules/@typescript-eslint/visitor-keys": {
+ "version": "8.61.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.61.1.tgz",
+ "integrity": "sha512-6fJ9MHWtK14C1DSkiMlHUSOmrVebL7150xZJBlJiL62jjhIA4JmOq6flwBgDxIdBKKdoiZRel+dfPD5MLfny3w==",
"dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/types": "8.61.1",
+ "eslint-visitor-keys": "^5.0.0"
+ },
"engines": {
- "node": ">=12"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
"funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
}
},
- "node_modules/@isaacs/cliui/node_modules/emoji-regex": {
- "version": "9.2.2",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
- "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
- "dev": true
- },
- "node_modules/@isaacs/cliui/node_modules/string-width": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
- "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
+ "node_modules/@eslint-react/var/node_modules/eslint-visitor-keys": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz",
+ "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==",
"dev": true,
- "dependencies": {
- "eastasianwidth": "^0.2.0",
- "emoji-regex": "^9.2.2",
- "strip-ansi": "^7.0.1"
- },
+ "license": "Apache-2.0",
"engines": {
- "node": ">=12"
+ "node": "^20.19.0 || ^22.13.0 || >=24"
},
"funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "url": "https://opencollective.com/eslint"
}
},
- "node_modules/@isaacs/cliui/node_modules/strip-ansi": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
- "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
+ "node_modules/@eslint-react/var/node_modules/minimatch": {
+ "version": "10.2.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz",
+ "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==",
"dev": true,
+ "license": "BlueOak-1.0.0",
"dependencies": {
- "ansi-regex": "^6.0.1"
+ "brace-expansion": "^5.0.5"
},
"engines": {
- "node": ">=12"
+ "node": "18 || 20 || >=22"
},
"funding": {
- "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+ "url": "https://github.com/sponsors/isaacs"
}
},
- "node_modules/@isaacs/cliui/node_modules/wrap-ansi": {
- "version": "8.1.0",
- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
- "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
+ "node_modules/@eslint/compat": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/@eslint/compat/-/compat-2.1.0.tgz",
+ "integrity": "sha512-LgaSCymEpw7tF53xvDw9SNsraPb1IBHxpdABIOM0hW8UAlP8znrjYtuxfR58FSJ3L9BhwD+FaPRFQpZq84Nh6g==",
"dev": true,
+ "license": "Apache-2.0",
"dependencies": {
- "ansi-styles": "^6.1.0",
- "string-width": "^5.0.1",
- "strip-ansi": "^7.0.1"
+ "@eslint/core": "^1.2.1"
},
"engines": {
- "node": ">=12"
+ "node": "^20.19.0 || ^22.13.0 || >=24"
},
- "funding": {
- "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ "peerDependencies": {
+ "eslint": "^8.40 || 9 || 10"
+ },
+ "peerDependenciesMeta": {
+ "eslint": {
+ "optional": true
+ }
}
},
- "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==",
+ "node_modules/@eslint/config-array": {
+ "version": "0.23.5",
+ "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.23.5.tgz",
+ "integrity": "sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==",
"dev": true,
+ "license": "Apache-2.0",
"dependencies": {
- "@jridgewell/set-array": "^1.0.1",
- "@jridgewell/sourcemap-codec": "^1.4.10",
- "@jridgewell/trace-mapping": "^0.3.9"
+ "@eslint/object-schema": "^3.0.5",
+ "debug": "^4.3.1",
+ "minimatch": "^10.2.4"
},
"engines": {
- "node": ">=6.0.0"
+ "node": "^20.19.0 || ^22.13.0 || >=24"
}
},
- "node_modules/@jridgewell/resolve-uri": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz",
- "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==",
+ "node_modules/@eslint/config-array/node_modules/minimatch": {
+ "version": "10.2.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz",
+ "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==",
"dev": true,
+ "license": "BlueOak-1.0.0",
+ "dependencies": {
+ "brace-expansion": "^5.0.5"
+ },
"engines": {
- "node": ">=6.0.0"
+ "node": "18 || 20 || >=22"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
}
},
- "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==",
+ "node_modules/@eslint/config-helpers": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.6.0.tgz",
+ "integrity": "sha512-ii6Bw9jJ2zi2cWA2Z+9/QZ/+3DX6kwaV5Q986D/CdP3Lap3w/pgQZ373FV7byY/i7L4IRH/G43I5dz1ClsCbpA==",
"dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@eslint/core": "^1.2.1"
+ },
"engines": {
- "node": ">=6.0.0"
+ "node": "^20.19.0 || ^22.13.0 || >=24"
}
},
- "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==",
+ "node_modules/@eslint/core": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@eslint/core/-/core-1.2.1.tgz",
+ "integrity": "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==",
"dev": true,
+ "license": "Apache-2.0",
"dependencies": {
- "@jridgewell/gen-mapping": "^0.3.0",
- "@jridgewell/trace-mapping": "^0.3.9"
+ "@types/json-schema": "^7.0.15"
+ },
+ "engines": {
+ "node": "^20.19.0 || ^22.13.0 || >=24"
}
},
- "node_modules/@jridgewell/sourcemap-codec": {
- "version": "1.4.15",
- "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz",
- "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==",
- "dev": true
- },
- "node_modules/@jridgewell/trace-mapping": {
- "version": "0.3.20",
- "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz",
- "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==",
+ "node_modules/@eslint/js": {
+ "version": "10.0.1",
+ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-10.0.1.tgz",
+ "integrity": "sha512-zeR9k5pd4gxjZ0abRoIaxdc7I3nDktoXZk2qOv9gCNWx3mVwEn32VRhyLaRsDiJjTs0xq/T8mfPtyuXu7GWBcA==",
"dev": true,
- "dependencies": {
- "@jridgewell/resolve-uri": "^3.1.0",
- "@jridgewell/sourcemap-codec": "^1.4.14"
+ "license": "MIT",
+ "engines": {
+ "node": "^20.19.0 || ^22.13.0 || >=24"
+ },
+ "funding": {
+ "url": "https://eslint.org/donate"
+ },
+ "peerDependencies": {
+ "eslint": "^10.0.0"
+ },
+ "peerDependenciesMeta": {
+ "eslint": {
+ "optional": true
+ }
}
},
- "node_modules/@malept/cross-spawn-promise": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/@malept/cross-spawn-promise/-/cross-spawn-promise-1.1.1.tgz",
- "integrity": "sha512-RTBGWL5FWQcg9orDOCcp4LvItNzUPcyEU9bwaeJX0rJ1IQxzucC48Y0/sQLp/g6t99IQgAlGIaesJS+gTn7tVQ==",
+ "node_modules/@eslint/object-schema": {
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-3.0.5.tgz",
+ "integrity": "sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==",
"dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://github.com/sponsors/malept"
- },
- {
- "type": "tidelift",
- "url": "https://tidelift.com/subscription/pkg/npm-.malept-cross-spawn-promise?utm_medium=referral&utm_source=npm_fund"
- }
- ],
- "dependencies": {
- "cross-spawn": "^7.0.1"
- },
+ "license": "Apache-2.0",
"engines": {
- "node": ">= 10"
+ "node": "^20.19.0 || ^22.13.0 || >=24"
}
},
- "node_modules/@malept/cross-spawn-promise/node_modules/cross-spawn": {
- "version": "7.0.3",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
- "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+ "node_modules/@eslint/plugin-kit": {
+ "version": "0.7.2",
+ "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.7.2.tgz",
+ "integrity": "sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A==",
"dev": true,
+ "license": "Apache-2.0",
"dependencies": {
- "path-key": "^3.1.0",
- "shebang-command": "^2.0.0",
- "which": "^2.0.1"
+ "@eslint/core": "^1.2.1",
+ "levn": "^0.4.1"
},
"engines": {
- "node": ">= 8"
+ "node": "^20.19.0 || ^22.13.0 || >=24"
}
},
- "node_modules/@malept/cross-spawn-promise/node_modules/isexe": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
- "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
- "dev": true
- },
- "node_modules/@malept/cross-spawn-promise/node_modules/shebang-command": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
- "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "node_modules/@humanfs/core": {
+ "version": "0.19.1",
+ "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz",
+ "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==",
"dev": true,
- "dependencies": {
- "shebang-regex": "^3.0.0"
- },
+ "license": "Apache-2.0",
"engines": {
- "node": ">=8"
+ "node": ">=18.18.0"
}
},
- "node_modules/@malept/cross-spawn-promise/node_modules/shebang-regex": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
- "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "node_modules/@humanfs/node": {
+ "version": "0.16.7",
+ "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz",
+ "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==",
"dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@humanfs/core": "^0.19.1",
+ "@humanwhocodes/retry": "^0.4.0"
+ },
"engines": {
- "node": ">=8"
+ "node": ">=18.18.0"
}
},
- "node_modules/@malept/cross-spawn-promise/node_modules/which": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
- "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "node_modules/@humanwhocodes/module-importer": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
+ "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
"dev": true,
- "dependencies": {
- "isexe": "^2.0.0"
- },
- "bin": {
- "node-which": "bin/node-which"
- },
+ "license": "Apache-2.0",
"engines": {
- "node": ">= 8"
+ "node": ">=12.22"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/nzakas"
}
},
- "node_modules/@malept/flatpak-bundler": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/@malept/flatpak-bundler/-/flatpak-bundler-0.4.0.tgz",
- "integrity": "sha512-9QOtNffcOF/c1seMCDnjckb3R9WHcG34tky+FHpNKKCW0wc/scYLwMtO+ptyGUfMW0/b/n4qRiALlaFHc9Oj7Q==",
+ "node_modules/@humanwhocodes/retry": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz",
+ "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==",
"dev": true,
- "dependencies": {
- "debug": "^4.1.1",
- "fs-extra": "^9.0.0",
- "lodash": "^4.17.15",
- "tmp-promise": "^3.0.2"
- },
+ "license": "Apache-2.0",
"engines": {
- "node": ">= 10.0.0"
+ "node": ">=18.18"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/nzakas"
}
},
- "node_modules/@malept/flatpak-bundler/node_modules/fs-extra": {
- "version": "9.1.0",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
- "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
+ "node_modules/@img/colour": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.1.0.tgz",
+ "integrity": "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==",
"dev": true,
- "dependencies": {
- "at-least-node": "^1.0.0",
- "graceful-fs": "^4.2.0",
- "jsonfile": "^6.0.1",
- "universalify": "^2.0.0"
- },
+ "license": "MIT",
+ "optional": true,
"engines": {
- "node": ">=10"
+ "node": ">=18"
}
},
- "node_modules/@malept/flatpak-bundler/node_modules/jsonfile": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
- "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
+ "node_modules/@img/sharp-darwin-arm64": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz",
+ "integrity": "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==",
+ "cpu": [
+ "arm64"
+ ],
"dev": true,
- "dependencies": {
- "universalify": "^2.0.0"
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "peer": true,
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
},
"optionalDependencies": {
- "graceful-fs": "^4.1.6"
+ "@img/sharp-libvips-darwin-arm64": "1.2.4"
}
},
- "node_modules/@malept/flatpak-bundler/node_modules/universalify": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
- "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
+ "node_modules/@img/sharp-darwin-x64": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz",
+ "integrity": "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==",
+ "cpu": [
+ "x64"
+ ],
"dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "peer": true,
"engines": {
- "node": ">= 10.0.0"
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-darwin-x64": "1.2.4"
}
},
- "node_modules/@mrmlnc/readdir-enhanced": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz",
- "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==",
+ "node_modules/@img/sharp-freebsd-wasm32": {
+ "version": "0.35.1",
+ "resolved": "https://registry.npmjs.org/@img/sharp-freebsd-wasm32/-/sharp-freebsd-wasm32-0.35.1.tgz",
+ "integrity": "sha512-MBSQXqNPThW9EcZ905H6N4sEdX5EwZEYzGx5EBq9ncDCGJALMiY1xPFJxNdzuB1iBjLOpIfxajM6YxdvwmQSLA==",
"dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
"dependencies": {
- "call-me-maybe": "^1.0.1",
- "glob-to-regexp": "^0.3.0"
+ "@img/sharp-wasm32": "0.35.1"
},
"engines": {
- "node": ">=4"
- }
- },
- "node_modules/@nicolo-ribaudo/eslint-scope-5-internals": {
- "version": "5.1.1-v1",
- "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz",
- "integrity": "sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==",
- "dev": true,
- "dependencies": {
- "eslint-scope": "5.1.1"
+ "node": ">=20.9.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
}
},
- "node_modules/@nodelib/fs.scandir": {
- "version": "2.1.5",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
- "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+ "node_modules/@img/sharp-freebsd-wasm32/node_modules/@img/sharp-wasm32": {
+ "version": "0.35.1",
+ "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.35.1.tgz",
+ "integrity": "sha512-PCQUoQdZyE8tp3HpbevuihfUmgSP4qWI0FGEPWoeXqaS+cUrFfemabHQiebUmUmlUhCuNnQMxGrQ+CPqK4hnxg==",
"dev": true,
+ "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT",
+ "optional": true,
"dependencies": {
- "@nodelib/fs.stat": "2.0.5",
- "run-parallel": "^1.1.9"
+ "@emnapi/runtime": "^1.11.0"
},
"engines": {
- "node": ">= 8"
+ "node": ">=20.9.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
}
},
- "node_modules/@nodelib/fs.stat": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
- "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
+ "node_modules/@img/sharp-libvips-darwin-arm64": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz",
+ "integrity": "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==",
+ "cpu": [
+ "arm64"
+ ],
"dev": true,
- "engines": {
- "node": ">= 8"
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "peer": true,
+ "funding": {
+ "url": "https://opencollective.com/libvips"
}
},
- "node_modules/@nodelib/fs.walk": {
- "version": "1.2.8",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
- "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+ "node_modules/@img/sharp-libvips-darwin-x64": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz",
+ "integrity": "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==",
+ "cpu": [
+ "x64"
+ ],
"dev": true,
- "dependencies": {
- "@nodelib/fs.scandir": "2.1.5",
- "fastq": "^1.6.0"
- },
- "engines": {
- "node": ">= 8"
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "peer": true,
+ "funding": {
+ "url": "https://opencollective.com/libvips"
}
},
- "node_modules/@parcel/fs": {
- "version": "1.11.0",
- "resolved": "https://registry.npmjs.org/@parcel/fs/-/fs-1.11.0.tgz",
- "integrity": "sha512-86RyEqULbbVoeo8OLcv+LQ1Vq2PKBAvWTU9fCgALxuCTbbs5Ppcvll4Vr+Ko1AnmMzja/k++SzNAwJfeQXVlpA==",
+ "node_modules/@img/sharp-libvips-linux-arm": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz",
+ "integrity": "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==",
+ "cpu": [
+ "arm"
+ ],
"dev": true,
- "dependencies": {
- "@parcel/utils": "^1.11.0",
- "mkdirp": "^0.5.1",
- "rimraf": "^2.6.2"
- },
- "engines": {
- "node": ">= 6.0.0"
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "peer": true,
+ "funding": {
+ "url": "https://opencollective.com/libvips"
}
},
- "node_modules/@parcel/fs/node_modules/brace-expansion": {
- "version": "1.1.11",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "node_modules/@img/sharp-libvips-linux-arm64": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz",
+ "integrity": "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==",
+ "cpu": [
+ "arm64"
+ ],
"dev": true,
- "dependencies": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "peer": true,
+ "funding": {
+ "url": "https://opencollective.com/libvips"
}
},
- "node_modules/@parcel/fs/node_modules/glob": {
- "version": "7.2.3",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
- "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "node_modules/@img/sharp-libvips-linux-ppc64": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.4.tgz",
+ "integrity": "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==",
+ "cpu": [
+ "ppc64"
+ ],
"dev": true,
- "dependencies": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.1.1",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
- },
- "engines": {
- "node": "*"
- },
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "peer": true,
"funding": {
- "url": "https://github.com/sponsors/isaacs"
+ "url": "https://opencollective.com/libvips"
}
},
- "node_modules/@parcel/fs/node_modules/minimatch": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
- "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "node_modules/@img/sharp-libvips-linux-riscv64": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz",
+ "integrity": "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==",
+ "cpu": [
+ "riscv64"
+ ],
"dev": true,
- "dependencies": {
- "brace-expansion": "^1.1.7"
- },
- "engines": {
- "node": "*"
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "peer": true,
+ "funding": {
+ "url": "https://opencollective.com/libvips"
}
},
- "node_modules/@parcel/fs/node_modules/mkdirp": {
- "version": "0.5.6",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz",
- "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
+ "node_modules/@img/sharp-libvips-linux-s390x": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz",
+ "integrity": "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==",
+ "cpu": [
+ "s390x"
+ ],
"dev": true,
- "dependencies": {
- "minimist": "^1.2.6"
- },
- "bin": {
- "mkdirp": "bin/cmd.js"
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "peer": true,
+ "funding": {
+ "url": "https://opencollective.com/libvips"
}
},
- "node_modules/@parcel/fs/node_modules/rimraf": {
- "version": "2.7.1",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
- "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
+ "node_modules/@img/sharp-libvips-linux-x64": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz",
+ "integrity": "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==",
+ "cpu": [
+ "x64"
+ ],
"dev": true,
- "dependencies": {
- "glob": "^7.1.3"
- },
- "bin": {
- "rimraf": "bin.js"
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "peer": true,
+ "funding": {
+ "url": "https://opencollective.com/libvips"
}
},
- "node_modules/@parcel/logger": {
- "version": "1.11.1",
- "resolved": "https://registry.npmjs.org/@parcel/logger/-/logger-1.11.1.tgz",
- "integrity": "sha512-9NF3M6UVeP2udOBDILuoEHd8VrF4vQqoWHEafymO1pfSoOMfxrSJZw1MfyAAIUN/IFp9qjcpDCUbDZB+ioVevA==",
+ "node_modules/@img/sharp-libvips-linuxmusl-arm64": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.4.tgz",
+ "integrity": "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==",
+ "cpu": [
+ "arm64"
+ ],
"dev": true,
- "dependencies": {
- "@parcel/workers": "^1.11.0",
- "chalk": "^2.1.0",
- "grapheme-breaker": "^0.3.2",
- "ora": "^2.1.0",
- "strip-ansi": "^4.0.0"
- },
- "engines": {
- "node": ">= 6.0.0"
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "peer": true,
+ "funding": {
+ "url": "https://opencollective.com/libvips"
}
},
- "node_modules/@parcel/logger/node_modules/ansi-regex": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz",
- "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==",
+ "node_modules/@img/sharp-libvips-linuxmusl-x64": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.4.tgz",
+ "integrity": "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==",
+ "cpu": [
+ "x64"
+ ],
"dev": true,
- "engines": {
- "node": ">=4"
+ "license": "LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "peer": true,
+ "funding": {
+ "url": "https://opencollective.com/libvips"
}
},
- "node_modules/@parcel/logger/node_modules/cli-cursor": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz",
- "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==",
+ "node_modules/@img/sharp-linux-arm": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.5.tgz",
+ "integrity": "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==",
+ "cpu": [
+ "arm"
+ ],
"dev": true,
- "dependencies": {
- "restore-cursor": "^2.0.0"
- },
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "peer": true,
"engines": {
- "node": ">=4"
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linux-arm": "1.2.4"
}
},
- "node_modules/@parcel/logger/node_modules/cli-spinners": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-1.3.1.tgz",
- "integrity": "sha512-1QL4544moEsDVH9T/l6Cemov/37iv1RtoKf7NJ04A60+4MREXNfx/QvavbH6QoGdsD4N4Mwy49cmaINR/o2mdg==",
+ "node_modules/@img/sharp-linux-arm64": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.5.tgz",
+ "integrity": "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==",
+ "cpu": [
+ "arm64"
+ ],
"dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "peer": true,
"engines": {
- "node": ">=4"
- }
- },
- "node_modules/@parcel/logger/node_modules/log-symbols": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz",
- "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==",
- "dev": true,
- "dependencies": {
- "chalk": "^2.0.1"
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
},
- "engines": {
- "node": ">=4"
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linux-arm64": "1.2.4"
}
},
- "node_modules/@parcel/logger/node_modules/mimic-fn": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz",
- "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==",
+ "node_modules/@img/sharp-linux-ppc64": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.5.tgz",
+ "integrity": "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==",
+ "cpu": [
+ "ppc64"
+ ],
"dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "peer": true,
"engines": {
- "node": ">=4"
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linux-ppc64": "1.2.4"
}
},
- "node_modules/@parcel/logger/node_modules/onetime": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz",
- "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==",
+ "node_modules/@img/sharp-linux-riscv64": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.34.5.tgz",
+ "integrity": "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==",
+ "cpu": [
+ "riscv64"
+ ],
"dev": true,
- "dependencies": {
- "mimic-fn": "^1.0.0"
- },
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "peer": true,
"engines": {
- "node": ">=4"
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linux-riscv64": "1.2.4"
}
},
- "node_modules/@parcel/logger/node_modules/ora": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/ora/-/ora-2.1.0.tgz",
- "integrity": "sha512-hNNlAd3gfv/iPmsNxYoAPLvxg7HuPozww7fFonMZvL84tP6Ox5igfk5j/+a9rtJJwqMgKK+JgWsAQik5o0HTLA==",
+ "node_modules/@img/sharp-linux-s390x": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz",
+ "integrity": "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==",
+ "cpu": [
+ "s390x"
+ ],
"dev": true,
- "dependencies": {
- "chalk": "^2.3.1",
- "cli-cursor": "^2.1.0",
- "cli-spinners": "^1.1.0",
- "log-symbols": "^2.2.0",
- "strip-ansi": "^4.0.0",
- "wcwidth": "^1.0.1"
- },
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "peer": true,
"engines": {
- "node": ">=4"
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linux-s390x": "1.2.4"
}
},
- "node_modules/@parcel/logger/node_modules/restore-cursor": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz",
- "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==",
+ "node_modules/@img/sharp-linux-x64": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz",
+ "integrity": "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==",
+ "cpu": [
+ "x64"
+ ],
"dev": true,
- "dependencies": {
- "onetime": "^2.0.0",
- "signal-exit": "^3.0.2"
- },
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "peer": true,
"engines": {
- "node": ">=4"
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linux-x64": "1.2.4"
}
},
- "node_modules/@parcel/logger/node_modules/signal-exit": {
- "version": "3.0.7",
- "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
- "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
- "dev": true
- },
- "node_modules/@parcel/logger/node_modules/strip-ansi": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
- "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==",
+ "node_modules/@img/sharp-linuxmusl-arm64": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz",
+ "integrity": "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==",
+ "cpu": [
+ "arm64"
+ ],
"dev": true,
- "dependencies": {
- "ansi-regex": "^3.0.0"
- },
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "peer": true,
"engines": {
- "node": ">=4"
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linuxmusl-arm64": "1.2.4"
}
},
- "node_modules/@parcel/utils": {
- "version": "1.11.0",
- "resolved": "https://registry.npmjs.org/@parcel/utils/-/utils-1.11.0.tgz",
- "integrity": "sha512-cA3p4jTlaMeOtAKR/6AadanOPvKeg8VwgnHhOyfi0yClD0TZS/hi9xu12w4EzA/8NtHu0g6o4RDfcNjqN8l1AQ==",
+ "node_modules/@img/sharp-linuxmusl-x64": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz",
+ "integrity": "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==",
+ "cpu": [
+ "x64"
+ ],
"dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "peer": true,
"engines": {
- "node": ">= 6.0.0"
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-libvips-linuxmusl-x64": "1.2.4"
}
},
- "node_modules/@parcel/watcher": {
- "version": "1.12.1",
- "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-1.12.1.tgz",
- "integrity": "sha512-od+uCtCxC/KoNQAIE1vWx1YTyKYY+7CTrxBJPRh3cDWw/C0tCtlBMVlrbplscGoEpt6B27KhJDCv82PBxOERNA==",
+ "node_modules/@img/sharp-wasm32": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz",
+ "integrity": "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==",
+ "cpu": [
+ "wasm32"
+ ],
"dev": true,
+ "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
- "@parcel/utils": "^1.11.0",
- "chokidar": "^2.1.5"
+ "@emnapi/runtime": "^1.7.0"
+ },
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
}
},
- "node_modules/@parcel/watcher/node_modules/anymatch": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz",
- "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==",
+ "node_modules/@img/sharp-webcontainers-wasm32": {
+ "version": "0.35.1",
+ "resolved": "https://registry.npmjs.org/@img/sharp-webcontainers-wasm32/-/sharp-webcontainers-wasm32-0.35.1.tgz",
+ "integrity": "sha512-xU2ml2bU2OPxYVvW2A6ae4M1g5QKyhKG06P4FAt+YEaFQQO0919Qx+XxIZEUuWTMoDViLpMws2/dQwoe/VcA6A==",
+ "cpu": [
+ "wasm32"
+ ],
"dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
"dependencies": {
- "micromatch": "^3.1.4",
- "normalize-path": "^2.1.1"
+ "@img/sharp-wasm32": "0.35.1"
+ },
+ "engines": {
+ "node": ">=20.9.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
}
},
- "node_modules/@parcel/watcher/node_modules/anymatch/node_modules/normalize-path": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
- "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==",
+ "node_modules/@img/sharp-webcontainers-wasm32/node_modules/@img/sharp-wasm32": {
+ "version": "0.35.1",
+ "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.35.1.tgz",
+ "integrity": "sha512-PCQUoQdZyE8tp3HpbevuihfUmgSP4qWI0FGEPWoeXqaS+cUrFfemabHQiebUmUmlUhCuNnQMxGrQ+CPqK4hnxg==",
"dev": true,
+ "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT",
+ "optional": true,
"dependencies": {
- "remove-trailing-separator": "^1.0.1"
+ "@emnapi/runtime": "^1.11.0"
},
"engines": {
- "node": ">=0.10.0"
+ "node": ">=20.9.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
}
},
- "node_modules/@parcel/watcher/node_modules/binary-extensions": {
- "version": "1.13.1",
- "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz",
- "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==",
+ "node_modules/@img/sharp-win32-arm64": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz",
+ "integrity": "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==",
+ "cpu": [
+ "arm64"
+ ],
"dev": true,
+ "license": "Apache-2.0 AND LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "peer": true,
"engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/@parcel/watcher/node_modules/braces": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
- "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
- "dev": true,
- "dependencies": {
- "arr-flatten": "^1.1.0",
- "array-unique": "^0.3.2",
- "extend-shallow": "^2.0.1",
- "fill-range": "^4.0.0",
- "isobject": "^3.0.1",
- "repeat-element": "^1.1.2",
- "snapdragon": "^0.8.1",
- "snapdragon-node": "^2.0.1",
- "split-string": "^3.0.2",
- "to-regex": "^3.0.1"
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
},
- "engines": {
- "node": ">=0.10.0"
+ "funding": {
+ "url": "https://opencollective.com/libvips"
}
},
- "node_modules/@parcel/watcher/node_modules/chokidar": {
- "version": "2.1.8",
- "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz",
- "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==",
- "deprecated": "Chokidar 2 does not receive security updates since 2019. Upgrade to chokidar 3 with 15x fewer dependencies",
+ "node_modules/@img/sharp-win32-ia32": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz",
+ "integrity": "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==",
+ "cpu": [
+ "ia32"
+ ],
"dev": true,
- "dependencies": {
- "anymatch": "^2.0.0",
- "async-each": "^1.0.1",
- "braces": "^2.3.2",
- "glob-parent": "^3.1.0",
- "inherits": "^2.0.3",
- "is-binary-path": "^1.0.0",
- "is-glob": "^4.0.0",
- "normalize-path": "^3.0.0",
- "path-is-absolute": "^1.0.0",
- "readdirp": "^2.2.1",
- "upath": "^1.1.1"
+ "license": "Apache-2.0 AND LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "peer": true,
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
},
- "optionalDependencies": {
- "fsevents": "^1.2.7"
+ "funding": {
+ "url": "https://opencollective.com/libvips"
}
},
- "node_modules/@parcel/watcher/node_modules/extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==",
+ "node_modules/@img/sharp-win32-x64": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz",
+ "integrity": "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==",
+ "cpu": [
+ "x64"
+ ],
"dev": true,
+ "license": "Apache-2.0 AND LGPL-3.0-or-later",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "peer": true,
+ "engines": {
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ }
+ },
+ "node_modules/@isaacs/cliui": {
+ "version": "8.0.2",
+ "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
+ "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==",
+ "license": "ISC",
"dependencies": {
- "is-extendable": "^0.1.0"
+ "string-width": "^5.1.2",
+ "string-width-cjs": "npm:string-width@^4.2.0",
+ "strip-ansi": "^7.0.1",
+ "strip-ansi-cjs": "npm:strip-ansi@^6.0.1",
+ "wrap-ansi": "^8.1.0",
+ "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0"
},
"engines": {
- "node": ">=0.10.0"
+ "node": ">=12"
}
},
- "node_modules/@parcel/watcher/node_modules/fill-range": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
- "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==",
- "dev": true,
- "dependencies": {
- "extend-shallow": "^2.0.1",
- "is-number": "^3.0.0",
- "repeat-string": "^1.6.1",
- "to-regex-range": "^2.1.0"
+ "node_modules/@isaacs/cliui/node_modules/ansi-regex": {
+ "version": "6.2.2",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz",
+ "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
},
+ "funding": {
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+ }
+ },
+ "node_modules/@isaacs/cliui/node_modules/ansi-styles": {
+ "version": "6.2.3",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz",
+ "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==",
+ "license": "MIT",
"engines": {
- "node": ">=0.10.0"
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
- "node_modules/@parcel/watcher/node_modules/fsevents": {
- "version": "1.2.13",
- "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz",
- "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==",
- "deprecated": "The v1 package contains DANGEROUS / INSECURE binaries. Upgrade to safe fsevents v2",
- "dev": true,
- "hasInstallScript": true,
- "optional": true,
- "os": [
- "darwin"
- ],
+ "node_modules/@isaacs/cliui/node_modules/emoji-regex": {
+ "version": "9.2.2",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
+ "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
+ "license": "MIT"
+ },
+ "node_modules/@isaacs/cliui/node_modules/string-width": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
+ "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
+ "license": "MIT",
"dependencies": {
- "bindings": "^1.5.0",
- "nan": "^2.12.1"
+ "eastasianwidth": "^0.2.0",
+ "emoji-regex": "^9.2.2",
+ "strip-ansi": "^7.0.1"
},
"engines": {
- "node": ">= 4.0"
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/@parcel/watcher/node_modules/glob-parent": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
- "integrity": "sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==",
- "dev": true,
+ "node_modules/@isaacs/cliui/node_modules/strip-ansi": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz",
+ "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==",
+ "license": "MIT",
"dependencies": {
- "is-glob": "^3.1.0",
- "path-dirname": "^1.0.0"
+ "ansi-regex": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/strip-ansi?sponsor=1"
}
},
- "node_modules/@parcel/watcher/node_modules/glob-parent/node_modules/is-glob": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
- "integrity": "sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==",
- "dev": true,
+ "node_modules/@isaacs/cliui/node_modules/wrap-ansi": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
+ "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
+ "license": "MIT",
"dependencies": {
- "is-extglob": "^2.1.0"
+ "ansi-styles": "^6.1.0",
+ "string-width": "^5.0.1",
+ "strip-ansi": "^7.0.1"
},
"engines": {
- "node": ">=0.10.0"
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
}
},
- "node_modules/@parcel/watcher/node_modules/is-binary-path": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz",
- "integrity": "sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q==",
+ "node_modules/@isaacs/fs-minipass": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz",
+ "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==",
"dev": true,
+ "license": "ISC",
"dependencies": {
- "binary-extensions": "^1.0.0"
+ "minipass": "^7.0.4"
},
"engines": {
- "node": ">=0.10.0"
+ "node": ">=18.0.0"
}
},
- "node_modules/@parcel/watcher/node_modules/is-extendable": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
- "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==",
+ "node_modules/@jridgewell/gen-mapping": {
+ "version": "0.3.13",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz",
+ "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==",
"dev": true,
- "engines": {
- "node": ">=0.10.0"
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.5.0",
+ "@jridgewell/trace-mapping": "^0.3.24"
}
},
- "node_modules/@parcel/watcher/node_modules/isarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
- "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
- "dev": true
- },
- "node_modules/@parcel/watcher/node_modules/readable-stream": {
- "version": "2.3.8",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
- "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
+ "node_modules/@jridgewell/remapping": {
+ "version": "2.3.5",
+ "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz",
+ "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.3",
- "isarray": "~1.0.0",
- "process-nextick-args": "~2.0.0",
- "safe-buffer": "~5.1.1",
- "string_decoder": "~1.1.1",
- "util-deprecate": "~1.0.1"
+ "@jridgewell/gen-mapping": "^0.3.5",
+ "@jridgewell/trace-mapping": "^0.3.24"
}
},
- "node_modules/@parcel/watcher/node_modules/readdirp": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz",
- "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==",
+ "node_modules/@jridgewell/resolve-uri": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
+ "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
"dev": true,
- "dependencies": {
- "graceful-fs": "^4.1.11",
- "micromatch": "^3.1.10",
- "readable-stream": "^2.0.2"
- },
+ "license": "MIT",
"engines": {
- "node": ">=0.10"
+ "node": ">=6.0.0"
}
},
- "node_modules/@parcel/watcher/node_modules/safe-buffer": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
- "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
- "dev": true
+ "node_modules/@jridgewell/sourcemap-codec": {
+ "version": "1.5.5",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz",
+ "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==",
+ "dev": true,
+ "license": "MIT"
},
- "node_modules/@parcel/watcher/node_modules/string_decoder": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
- "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "node_modules/@jridgewell/trace-mapping": {
+ "version": "0.3.31",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz",
+ "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "safe-buffer": "~5.1.0"
+ "@jridgewell/resolve-uri": "^3.1.0",
+ "@jridgewell/sourcemap-codec": "^1.4.14"
}
},
- "node_modules/@parcel/watcher/node_modules/to-regex-range": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
- "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==",
+ "node_modules/@malept/cross-spawn-promise": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@malept/cross-spawn-promise/-/cross-spawn-promise-2.0.0.tgz",
+ "integrity": "sha512-1DpKU0Z5ThltBwjNySMC14g0CkbyhCaz9FkhxqNsZI6uAPJXFS8cMXlBKo26FJ8ZuW6S9GCMcR9IO5k2X5/9Fg==",
"dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://github.com/sponsors/malept"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/subscription/pkg/npm-.malept-cross-spawn-promise?utm_medium=referral&utm_source=npm_fund"
+ }
+ ],
+ "license": "Apache-2.0",
"dependencies": {
- "is-number": "^3.0.0",
- "repeat-string": "^1.6.1"
+ "cross-spawn": "^7.0.1"
},
"engines": {
- "node": ">=0.10.0"
+ "node": ">= 12.13.0"
}
},
- "node_modules/@parcel/workers": {
- "version": "1.11.0",
- "resolved": "https://registry.npmjs.org/@parcel/workers/-/workers-1.11.0.tgz",
- "integrity": "sha512-USSjRAAQYsZFlv43FUPdD+jEGML5/8oLF0rUzPQTtK4q9kvaXr49F5ZplyLz5lox78cLZ0TxN2bIDQ1xhOkulQ==",
+ "node_modules/@malept/flatpak-bundler": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/@malept/flatpak-bundler/-/flatpak-bundler-0.4.0.tgz",
+ "integrity": "sha512-9QOtNffcOF/c1seMCDnjckb3R9WHcG34tky+FHpNKKCW0wc/scYLwMtO+ptyGUfMW0/b/n4qRiALlaFHc9Oj7Q==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@parcel/utils": "^1.11.0",
- "physical-cpu-count": "^2.0.0"
+ "debug": "^4.1.1",
+ "fs-extra": "^9.0.0",
+ "lodash": "^4.17.15",
+ "tmp-promise": "^3.0.2"
},
"engines": {
- "node": ">= 6.0.0"
+ "node": ">= 10.0.0"
}
},
- "node_modules/@pkgjs/parseargs": {
- "version": "0.11.0",
- "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
- "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==",
+ "node_modules/@malept/flatpak-bundler/node_modules/fs-extra": {
+ "version": "9.1.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
+ "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
"dev": true,
- "optional": true,
+ "license": "MIT",
+ "dependencies": {
+ "at-least-node": "^1.0.0",
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
+ },
"engines": {
- "node": ">=14"
+ "node": ">=10"
}
},
- "node_modules/@puppeteer/browsers": {
- "version": "1.9.0",
- "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-1.9.0.tgz",
- "integrity": "sha512-QwguOLy44YBGC8vuPP2nmpX4MUN2FzWbsnvZJtiCzecU3lHmVZkaC1tq6rToi9a200m8RzlVtDyxCS0UIDrxUg==",
+ "node_modules/@malept/flatpak-bundler/node_modules/jsonfile": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz",
+ "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "debug": "4.3.4",
- "extract-zip": "2.0.1",
- "progress": "2.0.3",
- "proxy-agent": "6.3.1",
- "tar-fs": "3.0.4",
- "unbzip2-stream": "1.4.3",
- "yargs": "17.7.2"
- },
- "bin": {
- "browsers": "lib/cjs/main-cli.js"
+ "universalify": "^2.0.0"
},
- "engines": {
- "node": ">=16.3.0"
+ "optionalDependencies": {
+ "graceful-fs": "^4.1.6"
}
},
- "node_modules/@puppeteer/browsers/node_modules/extract-zip": {
+ "node_modules/@malept/flatpak-bundler/node_modules/universalify": {
"version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz",
- "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
+ "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
"dev": true,
- "dependencies": {
- "debug": "^4.1.1",
- "get-stream": "^5.1.0",
- "yauzl": "^2.10.0"
- },
- "bin": {
- "extract-zip": "cli.js"
- },
+ "license": "MIT",
"engines": {
- "node": ">= 10.17.0"
- },
- "optionalDependencies": {
- "@types/yauzl": "^2.9.1"
+ "node": ">= 10.0.0"
}
},
- "node_modules/@puppeteer/browsers/node_modules/get-stream": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
- "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
+ "node_modules/@napi-rs/wasm-runtime": {
+ "version": "0.2.12",
+ "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz",
+ "integrity": "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==",
"dev": true,
+ "license": "MIT",
+ "optional": true,
"dependencies": {
- "pump": "^3.0.0"
- },
+ "@emnapi/core": "^1.4.3",
+ "@emnapi/runtime": "^1.4.3",
+ "@tybys/wasm-util": "^0.10.0"
+ }
+ },
+ "node_modules/@noble/hashes": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-2.2.0.tgz",
+ "integrity": "sha512-IYqDGiTXab6FniAgnSdZwgWbomxpy9FtYvLKs7wCUs2a8RkITG+DFGO1DM9cr+E3/RgADRpFjrKVaJ1z6sjtEg==",
+ "dev": true,
+ "license": "MIT",
"engines": {
- "node": ">=8"
+ "node": ">= 20.19.0"
},
"funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "url": "https://paulmillr.com/funding/"
}
},
- "node_modules/@rc-component/portal": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/@rc-component/portal/-/portal-1.1.2.tgz",
- "integrity": "sha512-6f813C0IsasTZms08kfA8kPAGxbbkYToa8ALaiDIGGECU4i9hj8Plgbx0sNJDrey3EtHO30hmdaxtT0138xZcg==",
+ "node_modules/@nodable/entities": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/@nodable/entities/-/entities-2.2.0.tgz",
+ "integrity": "sha512-9uGyhaQavEUMC8AIddIjau4NsnsXhou+j5sBAGojCM1oxmQpVKTWR/9JxABD6UAv12vpIms55fPZKFQEhG6uBg==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/nodable"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/@package-json/types": {
+ "version": "0.0.12",
+ "resolved": "https://registry.npmjs.org/@package-json/types/-/types-0.0.12.tgz",
+ "integrity": "sha512-uu43FGU34B5VM9mCNjXCwLaGHYjXdNincqKLaraaCW+7S2+SmiBg1Nv8bPnmschrIfZmfKNY9f3fC376MRrObw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@peculiar/asn1-schema": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/@peculiar/asn1-schema/-/asn1-schema-2.7.0.tgz",
+ "integrity": "sha512-W8ZfWzLmQnrcky+eh3tni4IozMdqBDiHWU0N+vve/UGjMaUs8c0L7A2oEdkBXS8rTpWDpK/aoI3DG/L/hxmxPg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@peculiar/utils": "^2.0.2",
+ "asn1js": "^3.0.6",
+ "tslib": "^2.8.1"
+ }
+ },
+ "node_modules/@peculiar/json-schema": {
+ "version": "1.1.12",
+ "resolved": "https://registry.npmjs.org/@peculiar/json-schema/-/json-schema-1.1.12.tgz",
+ "integrity": "sha512-coUfuoMeIB7B8/NMekxaDzLhaYmp0HZNPEjYRm9goRou8UZIC3z21s0sL9AWoCw4EG876QyO3kYrc61WNF9B/w==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/runtime": "^7.18.0",
- "classnames": "^2.3.2",
- "rc-util": "^5.24.4"
+ "tslib": "^2.0.0"
},
"engines": {
- "node": ">=8.x"
- },
- "peerDependencies": {
- "react": ">=16.9.0",
- "react-dom": ">=16.9.0"
+ "node": ">=8.0.0"
}
},
- "node_modules/@reduxjs/toolkit": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.2.1.tgz",
- "integrity": "sha512-8CREoqJovQW/5I4yvvijm/emUiCCmcs4Ev4XPWd4mizSO+dD3g5G6w34QK5AGeNrSH7qM8Fl66j4vuV7dpOdkw==",
+ "node_modules/@peculiar/utils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/@peculiar/utils/-/utils-2.0.3.tgz",
+ "integrity": "sha512-+oL3HPFRIZ1St2K50lWCXiioIgSoxzz7R1J3uF6neO2yl1sgmpgY6XXJH4BdpoDkMWznQTeYF6oWNDZLCdQ4eQ==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "immer": "^10.0.3",
- "redux": "^5.0.1",
- "redux-thunk": "^3.1.0",
- "reselect": "^5.0.1"
- },
- "peerDependencies": {
- "react": "^16.9.0 || ^17.0.0 || ^18",
- "react-redux": "^7.2.1 || ^8.1.3 || ^9.0.0"
+ "tslib": "^2.8.1"
+ }
+ },
+ "node_modules/@peculiar/webcrypto": {
+ "version": "1.7.1",
+ "resolved": "https://registry.npmjs.org/@peculiar/webcrypto/-/webcrypto-1.7.1.tgz",
+ "integrity": "sha512-ODOov0sGMJMf3jPonOkgGqPknTsu+DdQ7kD++gz8aI+aFMOMHFbWAA2taqXXVTdP+OTOQR/znGvSpmkeI0WTYQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@peculiar/asn1-schema": "^2.7.0",
+ "@peculiar/json-schema": "^1.1.12",
+ "@peculiar/utils": "^2.0.2",
+ "tslib": "^2.8.1",
+ "webcrypto-core": "^1.9.2"
},
- "peerDependenciesMeta": {
- "react": {
- "optional": true
- },
- "react-redux": {
- "optional": true
- }
+ "engines": {
+ "node": ">=14.18.0"
}
},
- "node_modules/@remix-run/router": {
- "version": "1.15.1",
- "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.15.1.tgz",
- "integrity": "sha512-zcU0gM3z+3iqj8UX45AmWY810l3oUmXM7uH4dt5xtzvMhRtYVhKGOmgOd1877dOPPepfCjUv57w+syamWIYe7w==",
+ "node_modules/@pkgjs/parseargs": {
+ "version": "0.11.0",
+ "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
+ "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==",
+ "license": "MIT",
+ "optional": true,
"engines": {
- "node": ">=14.0.0"
+ "node": ">=14"
}
},
- "node_modules/@sidvind/better-ajv-errors": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/@sidvind/better-ajv-errors/-/better-ajv-errors-2.1.3.tgz",
- "integrity": "sha512-lWuod/rh7Xz5uXiEGSfm2Sd5PG7K/6yJfoAZVqzsEswjPJhUz15R7Gn/o8RczA041QS15hBd/BCSeu9vwPArkA==",
- "dev": true,
- "peer": true,
+ "node_modules/@promptbook/utils": {
+ "version": "0.69.5",
+ "resolved": "https://registry.npmjs.org/@promptbook/utils/-/utils-0.69.5.tgz",
+ "integrity": "sha512-xm5Ti/Hp3o4xHrsK9Yy3MS6KbDxYbq485hDsFvxqaNA7equHLPdo8H8faTitTeb14QCDfLW4iwCxdVYu5sn6YQ==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://buymeacoffee.com/hejny"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/webgptorg/promptbook/blob/main/README.md#%EF%B8%8F-contributing"
+ }
+ ],
+ "license": "CC-BY-4.0",
"dependencies": {
- "@babel/code-frame": "^7.16.0",
- "chalk": "^4.1.0"
+ "spacetrim": "0.11.59"
+ }
+ },
+ "node_modules/@puppeteer/browsers": {
+ "version": "2.13.2",
+ "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.13.2.tgz",
+ "integrity": "sha512-5EUZSUIc37H6aIXyWO0Z4y8NlF8NnjgmqeQgOGiswAU7pY0HOo16ho4+alIWmSfdZnjqBRawMsP3I5YqLSn6kw==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "debug": "^4.4.3",
+ "extract-zip": "^2.0.1",
+ "progress": "^2.0.3",
+ "proxy-agent": "^6.5.0",
+ "semver": "^7.7.4",
+ "tar-fs": "^3.1.1",
+ "yargs": "^17.7.2"
},
- "engines": {
- "node": ">= 16.14"
+ "bin": {
+ "browsers": "lib/cjs/main-cli.js"
},
- "peerDependencies": {
- "ajv": "4.11.8 - 8"
+ "engines": {
+ "node": ">=18"
}
},
- "node_modules/@sidvind/better-ajv-errors/node_modules/ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "dev": true,
- "peer": true,
+ "node_modules/@puppeteer/browsers/node_modules/cliui": {
+ "version": "8.0.1",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
+ "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
+ "license": "ISC",
"dependencies": {
- "color-convert": "^2.0.1"
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.1",
+ "wrap-ansi": "^7.0.0"
},
"engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ "node": ">=12"
}
},
- "node_modules/@sidvind/better-ajv-errors/node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "dev": true,
- "peer": true,
+ "node_modules/@puppeteer/browsers/node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "license": "MIT",
"dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
},
"engines": {
"node": ">=10"
},
"funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
}
},
- "node_modules/@sidvind/better-ajv-errors/node_modules/color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
- "dev": true,
- "peer": true,
+ "node_modules/@puppeteer/browsers/node_modules/yargs": {
+ "version": "17.7.3",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.3.tgz",
+ "integrity": "sha512-GZtjxm/J/4TSxuL3FNYjCmLktBTnIw/rVmKSIyKeYAZpmJB2ig9VauCC5xsa82GNKVKDAqpOn3KVzNt0zmrU0g==",
+ "license": "MIT",
"dependencies": {
- "color-name": "~1.1.4"
+ "cliui": "^8.0.1",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.3",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^21.1.1"
},
"engines": {
- "node": ">=7.0.0"
+ "node": ">=12"
}
},
- "node_modules/@sidvind/better-ajv-errors/node_modules/color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "dev": true,
- "peer": true
+ "node_modules/@puppeteer/browsers/node_modules/yargs-parser": {
+ "version": "21.1.1",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
+ "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=12"
+ }
},
- "node_modules/@sidvind/better-ajv-errors/node_modules/supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
- "dev": true,
- "peer": true,
+ "node_modules/@rc-component/async-validator": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/@rc-component/async-validator/-/async-validator-6.0.0.tgz",
+ "integrity": "sha512-D3AGQwdyE58gmvx6waVSXJ80JGO+IY5L2O8HDnSOex7JNlzB3GuN/4hyHNTdhy2qtOhkpbIjmeAN3tL993wKbA==",
+ "license": "MIT",
"dependencies": {
- "has-flag": "^4.0.0"
+ "@babel/runtime": "^7.24.4"
},
"engines": {
- "node": ">=8"
+ "node": ">=14.x"
}
},
- "node_modules/@sindresorhus/is": {
- "version": "0.14.0",
- "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz",
- "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==",
- "engines": {
- "node": ">=6"
+ "node_modules/@rc-component/cascader": {
+ "version": "1.16.1",
+ "resolved": "https://registry.npmjs.org/@rc-component/cascader/-/cascader-1.16.1.tgz",
+ "integrity": "sha512-wxLopwM+EBed0zNNGdnGE4coYoqcO+XD42fHgn+pDvO+XzhNFbdgSlSNXdKocIYqccvqgWvoxDPNb0OVRdi59A==",
+ "license": "MIT",
+ "dependencies": {
+ "@rc-component/select": "~1.7.1",
+ "@rc-component/tree": "~1.3.2",
+ "@rc-component/util": "^1.11.1",
+ "clsx": "^2.1.1"
+ },
+ "peerDependencies": {
+ "react": ">=18.0.0",
+ "react-dom": ">=18.0.0"
}
},
- "node_modules/@sinonjs/commons": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz",
- "integrity": "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==",
- "dev": true,
+ "node_modules/@rc-component/checkbox": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@rc-component/checkbox/-/checkbox-2.0.0.tgz",
+ "integrity": "sha512-3CXGPpAR9gsPKeO2N78HAPOzU30UdemD6HGJoWVJOpa6WleaGB5kzZj3v6bdTZab31YuWgY/RxV3VKPctn0DwQ==",
+ "license": "MIT",
"dependencies": {
- "type-detect": "4.0.8"
+ "@rc-component/util": "^1.3.0",
+ "clsx": "^2.1.1"
+ },
+ "peerDependencies": {
+ "react": ">=16.9.0",
+ "react-dom": ">=16.9.0"
}
},
- "node_modules/@sinonjs/fake-timers": {
- "version": "11.2.2",
- "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-11.2.2.tgz",
- "integrity": "sha512-G2piCSxQ7oWOxwGSAyFHfPIsyeJGXYtc6mFbnFA+kRXkiEnTl8c/8jul2S329iFBnDI9HGoeWWAZvuvOkZccgw==",
- "dev": true,
+ "node_modules/@rc-component/collapse": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@rc-component/collapse/-/collapse-1.2.0.tgz",
+ "integrity": "sha512-ZRYSKSS39qsFx93p26bde7JUZJshsUBEQRlRXPuJYlAiNX0vyYlF5TsAm8JZN3LcF8XvKikdzPbgAtXSbkLUkw==",
+ "license": "MIT",
"dependencies": {
- "@sinonjs/commons": "^3.0.0"
+ "@babel/runtime": "^7.10.1",
+ "@rc-component/motion": "^1.1.4",
+ "@rc-component/util": "^1.3.0",
+ "clsx": "^2.1.1"
+ },
+ "peerDependencies": {
+ "react": ">=18.0.0",
+ "react-dom": ">=18.0.0"
}
},
- "node_modules/@sinonjs/samsam": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-8.0.0.tgz",
- "integrity": "sha512-Bp8KUVlLp8ibJZrnvq2foVhP0IVX2CIprMJPK0vqGqgrDa0OHVKeZyBykqskkrdxV6yKBPmGasO8LVjAKR3Gew==",
- "dev": true,
+ "node_modules/@rc-component/color-picker": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/@rc-component/color-picker/-/color-picker-3.1.1.tgz",
+ "integrity": "sha512-OHaCHLHszCegdXmIq2ZRIZBN/EtpT6Wm8SG/gpzLATHbVKc/avvuKi+zlOuk05FTWvgaMmpxAko44uRJ3M+2pg==",
+ "license": "MIT",
"dependencies": {
- "@sinonjs/commons": "^2.0.0",
- "lodash.get": "^4.4.2",
- "type-detect": "^4.0.8"
+ "@ant-design/fast-color": "^3.0.1",
+ "@rc-component/util": "^1.3.0",
+ "clsx": "^2.1.1"
+ },
+ "peerDependencies": {
+ "react": ">=16.9.0",
+ "react-dom": ">=16.9.0"
}
},
- "node_modules/@sinonjs/samsam/node_modules/@sinonjs/commons": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz",
- "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==",
- "dev": true,
+ "node_modules/@rc-component/context": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/@rc-component/context/-/context-2.0.1.tgz",
+ "integrity": "sha512-HyZbYm47s/YqtP6pKXNMjPEMaukyg7P0qVfgMLzr7YiFNMHbK2fKTAGzms9ykfGHSfyf75nBbgWw+hHkp+VImw==",
+ "license": "MIT",
"dependencies": {
- "type-detect": "4.0.8"
+ "@rc-component/util": "^1.3.0"
+ },
+ "peerDependencies": {
+ "react": ">=16.9.0",
+ "react-dom": ">=16.9.0"
}
},
- "node_modules/@sinonjs/text-encoding": {
- "version": "0.7.2",
- "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.2.tgz",
- "integrity": "sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==",
- "dev": true
- },
- "node_modules/@sliphua/lilconfig-ts-loader": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/@sliphua/lilconfig-ts-loader/-/lilconfig-ts-loader-3.2.2.tgz",
- "integrity": "sha512-nX2aBwAykiG50fSUzK9eyA5UvWcrEKzA0ZzCq9mLwHMwpKxM+U05YH8PHba1LJrbeZ7R1HSjJagWKMqFyq8cxw==",
- "dev": true,
+ "node_modules/@rc-component/dialog": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/@rc-component/dialog/-/dialog-1.9.0.tgz",
+ "integrity": "sha512-zbAAogkg4kkKum79sLE6M+vq1jSAW25zdkafrahgcTP9t9S//SD634Znd1A4c8F2Gc12ZKnehGLsVaaOvZzD2A==",
+ "license": "MIT",
"dependencies": {
- "lodash.get": "^4",
- "make-error": "^1",
- "ts-node": "^9",
- "tslib": "^2"
- },
- "engines": {
- "node": ">=10.0.0"
+ "@rc-component/motion": "^1.1.3",
+ "@rc-component/portal": "^2.1.0",
+ "@rc-component/util": "^1.9.0",
+ "clsx": "^2.1.1"
},
"peerDependencies": {
- "lilconfig": ">=2"
+ "react": ">=18.0.0",
+ "react-dom": ">=18.0.0"
}
},
- "node_modules/@szmarczak/http-timer": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz",
- "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==",
+ "node_modules/@rc-component/drawer": {
+ "version": "1.4.2",
+ "resolved": "https://registry.npmjs.org/@rc-component/drawer/-/drawer-1.4.2.tgz",
+ "integrity": "sha512-1ib+fZEp6FBu+YvcIktm+nCQ+Q+qIpwpoaJH6opGr4ofh2QMq+qdr5DLC4oCf5qf3pcWX9lUWPYX652k4ini8Q==",
+ "license": "MIT",
"dependencies": {
- "defer-to-connect": "^1.0.1"
+ "@rc-component/motion": "^1.1.4",
+ "@rc-component/portal": "^2.1.3",
+ "@rc-component/util": "^1.9.0",
+ "clsx": "^2.1.1"
},
- "engines": {
- "node": ">=6"
+ "peerDependencies": {
+ "react": ">=18.0.0",
+ "react-dom": ">=18.0.0"
}
},
- "node_modules/@tootallnate/once": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz",
- "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==",
- "dev": true,
- "engines": {
- "node": ">= 10"
+ "node_modules/@rc-component/dropdown": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/@rc-component/dropdown/-/dropdown-1.0.2.tgz",
+ "integrity": "sha512-6PY2ecUSYhDPhkNHHb4wfeAya04WhpmUSKzdR60G+kMNVUCX2vjT/AgTS0Lz0I/K6xrPMJ3enQbwVpeN3sHCgg==",
+ "license": "MIT",
+ "dependencies": {
+ "@rc-component/trigger": "^3.0.0",
+ "@rc-component/util": "^1.2.1",
+ "clsx": "^2.1.1"
+ },
+ "peerDependencies": {
+ "react": ">=16.11.0",
+ "react-dom": ">=16.11.0"
}
},
- "node_modules/@tootallnate/quickjs-emscripten": {
- "version": "0.23.0",
- "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz",
- "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==",
- "dev": true
- },
- "node_modules/@tsconfig/node14": {
- "version": "14.1.0",
- "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-14.1.0.tgz",
- "integrity": "sha512-VmsCG04YR58ciHBeJKBDNMWWfYbyP8FekWVuTlpstaUPlat1D0x/tXzkWP7yCMU0eSz9V4OZU0LBWTFJ3xZf6w==",
- "dev": true
- },
- "node_modules/@types/archiver": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/@types/archiver/-/archiver-6.0.2.tgz",
- "integrity": "sha512-KmROQqbQzKGuaAbmK+ZcytkJ51+YqDa7NmbXjmtC5YBLSyQYo21YaUnQ3HbaPFKL1ooo6RQ6OPYPIDyxfpDDXw==",
- "dev": true,
+ "node_modules/@rc-component/form": {
+ "version": "1.8.3",
+ "resolved": "https://registry.npmjs.org/@rc-component/form/-/form-1.8.3.tgz",
+ "integrity": "sha512-jNkat3uxZ246ELudKwnjQhnDI8+rSxgLxjztvQU3Mrb0G+LwDyOrPu9RNfekOjqU5GQ5QJepi225x+9LhCizJw==",
+ "license": "MIT",
"dependencies": {
- "@types/readdir-glob": "*"
+ "@rc-component/async-validator": "^6.0.0",
+ "@rc-component/util": "^1.11.1",
+ "clsx": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=8.x"
+ },
+ "peerDependencies": {
+ "react": ">=16.9.0",
+ "react-dom": ">=16.9.0"
}
},
- "node_modules/@types/argparse": {
- "version": "2.0.14",
- "resolved": "https://registry.npmjs.org/@types/argparse/-/argparse-2.0.14.tgz",
- "integrity": "sha512-jJ6NMs9rXQ0rsqNt3TL4Elcwhd6wygo3lJOVoiHzURD34vsCcAlw443uGu4PXTtEmMF7sYKoadTCLXNmuJuQGw==",
- "dev": true,
- "peer": true
- },
- "node_modules/@types/async-lock": {
- "version": "1.4.2",
- "resolved": "https://registry.npmjs.org/@types/async-lock/-/async-lock-1.4.2.tgz",
- "integrity": "sha512-HlZ6Dcr205BmNhwkdXqrg2vkFMN2PluI7Lgr8In3B3wE5PiQHhjRqtW/lGdVU9gw+sM0JcIDx2AN+cW8oSWIcw==",
- "dev": true,
- "peer": true
- },
- "node_modules/@types/base64-stream": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/@types/base64-stream/-/base64-stream-1.0.5.tgz",
- "integrity": "sha512-gXuo/a7pQ1EXlR5ksM2MccBLl6UUgAgnzR01r/QoHnkaSNinmzSdaGcCq5NAxn72dZ5A1zNYQIl+J9hPsBgBrA==",
- "dev": true,
+ "node_modules/@rc-component/image": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/@rc-component/image/-/image-1.9.0.tgz",
+ "integrity": "sha512-khF7w7xkBH5B1bsBcI1FSUZdkyd1aqpl2eYyILCqCzzQH3XdfehGUaZTnptyaJJfs09/R5hv9jXWyazOMFIClQ==",
+ "license": "MIT",
"dependencies": {
- "@types/node": "*"
+ "@rc-component/motion": "^1.0.0",
+ "@rc-component/portal": "^2.1.2",
+ "@rc-component/util": "^1.10.1",
+ "clsx": "^2.1.1"
+ },
+ "peerDependencies": {
+ "react": ">=16.9.0",
+ "react-dom": ">=16.9.0"
}
},
- "node_modules/@types/bluebird": {
- "version": "3.5.42",
- "resolved": "https://registry.npmjs.org/@types/bluebird/-/bluebird-3.5.42.tgz",
- "integrity": "sha512-Jhy+MWRlro6UjVi578V/4ZGNfeCOcNCp0YaFNIUGFKlImowqwb1O/22wDVk3FDGMLqxdpOV3qQHD5fPEH4hK6A==",
- "dev": true
- },
- "node_modules/@types/body-parser": {
- "version": "1.19.5",
- "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz",
- "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==",
- "dev": true,
+ "node_modules/@rc-component/input": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/@rc-component/input/-/input-1.3.1.tgz",
+ "integrity": "sha512-iFvTUT9W+JC/MSin2aGAk8NqsVlTzcExNC9DZariON1IWirju9NoNeEk47an4Q8iHazkoVI/y1LnDi88+CPcig==",
+ "license": "MIT",
"dependencies": {
- "@types/connect": "*",
- "@types/node": "*"
+ "@rc-component/resize-observer": "^1.1.1",
+ "@rc-component/util": "^1.11.1",
+ "clsx": "^2.1.1"
+ },
+ "peerDependencies": {
+ "react": ">=16.0.0",
+ "react-dom": ">=16.0.0"
}
},
- "node_modules/@types/cacheable-request": {
- "version": "6.0.3",
- "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz",
- "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==",
+ "node_modules/@rc-component/input-number": {
+ "version": "1.6.2",
+ "resolved": "https://registry.npmjs.org/@rc-component/input-number/-/input-number-1.6.2.tgz",
+ "integrity": "sha512-Gjcq7meZlCOiWN1t1xCC+7/s85humHVokTBI7PJgTfoyw5OWF74y3e6P8PHX104g9+b54jsodFIzyaj6p8LI9w==",
+ "license": "MIT",
"dependencies": {
- "@types/http-cache-semantics": "*",
- "@types/keyv": "^3.1.4",
- "@types/node": "*",
- "@types/responselike": "^1.0.0"
+ "@rc-component/mini-decimal": "^1.0.1",
+ "@rc-component/util": "^1.4.0",
+ "clsx": "^2.1.1"
+ },
+ "peerDependencies": {
+ "react": ">=16.9.0",
+ "react-dom": ">=16.9.0"
}
},
- "node_modules/@types/connect": {
- "version": "3.4.38",
- "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz",
- "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==",
- "dev": true,
+ "node_modules/@rc-component/mentions": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/@rc-component/mentions/-/mentions-1.9.0.tgz",
+ "integrity": "sha512-WUwfFKDSOF5S9UPsNsXcLYtzjTxBGsftTXWRbZuxX6BYrsySISTnujfJNgaaQ6qVzaCDJ35QUkZKvsYxip1C5g==",
+ "license": "MIT",
"dependencies": {
- "@types/node": "*"
+ "@rc-component/input": "~1.3.0",
+ "@rc-component/menu": "~1.3.0",
+ "@rc-component/trigger": "^3.0.0",
+ "@rc-component/util": "^1.3.0",
+ "clsx": "^2.1.1"
+ },
+ "peerDependencies": {
+ "react": ">=16.9.0",
+ "react-dom": ">=16.9.0"
}
},
- "node_modules/@types/debug": {
- "version": "4.1.12",
- "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz",
- "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==",
- "dev": true,
+ "node_modules/@rc-component/menu": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/@rc-component/menu/-/menu-1.3.1.tgz",
+ "integrity": "sha512-pSZl9nBPgKgxN0aaW7NilIBEwWsc+43S+ulGdWAg9afak96dNOGWsGx0DLLBB1VQsAJvo6bQMTDzXoPlEHsBEw==",
+ "license": "MIT",
"dependencies": {
- "@types/ms": "*"
+ "@rc-component/motion": "^1.1.4",
+ "@rc-component/overflow": "^1.0.0",
+ "@rc-component/trigger": "^3.0.0",
+ "@rc-component/util": "^1.11.1",
+ "clsx": "^2.1.1"
+ },
+ "peerDependencies": {
+ "react": ">=16.9.0",
+ "react-dom": ">=16.9.0"
}
},
- "node_modules/@types/express": {
- "version": "4.17.21",
- "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz",
- "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==",
- "dev": true,
+ "node_modules/@rc-component/mini-decimal": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@rc-component/mini-decimal/-/mini-decimal-1.1.0.tgz",
+ "integrity": "sha512-jS4E7T9Li2GuYwI6PyiVXmxTiM6b07rlD9Ge8uGZSCz3WlzcG5ZK7g5bbuKNeZ9pgUuPK/5guV781ujdVpm4HQ==",
+ "license": "MIT",
"dependencies": {
- "@types/body-parser": "*",
- "@types/express-serve-static-core": "^4.17.33",
- "@types/qs": "*",
- "@types/serve-static": "*"
+ "@babel/runtime": "^7.18.0"
+ },
+ "engines": {
+ "node": ">=8.x"
}
},
- "node_modules/@types/express-serve-static-core": {
- "version": "4.17.41",
- "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.41.tgz",
- "integrity": "sha512-OaJ7XLaelTgrvlZD8/aa0vvvxZdUmlCn6MtWeB7TkiKW70BQLc9XEPpDLPdbo52ZhXUCrznlWdCHWxJWtdyajA==",
- "dev": true,
+ "node_modules/@rc-component/motion": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/@rc-component/motion/-/motion-1.3.3.tgz",
+ "integrity": "sha512-Xh3IszxvlSv3/PLYFyC2UZi9LNB83yOnkB/LNmRzaypZLvkhqUIPS7MQpGZcCMWrNsXV2p6YTSWbSGvFpEle9A==",
+ "license": "MIT",
"dependencies": {
- "@types/node": "*",
- "@types/qs": "*",
- "@types/range-parser": "*",
- "@types/send": "*"
+ "@rc-component/util": "^1.11.0",
+ "clsx": "^2.1.1"
+ },
+ "peerDependencies": {
+ "react": ">=16.9.0",
+ "react-dom": ">=16.9.0"
}
},
- "node_modules/@types/fancy-log": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/@types/fancy-log/-/fancy-log-2.0.2.tgz",
- "integrity": "sha512-SXVJvqWjsl90VwBfp7w4iQ0iO+vxAjQImglcpwbV9GkqNoUD5/p9Wsgetl40F1WL7pzWFN/eZPTF1g5FZXJsIw==",
- "dev": true,
- "peer": true
- },
- "node_modules/@types/find-root": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/@types/find-root/-/find-root-1.1.4.tgz",
- "integrity": "sha512-2EXK/+gVhVgtt4JqThbEncORvpYJKzi9tQGmI3EkU2jTgMzQsrPm/hbd5xe5uPdeFzIW5gh2PRvvPjaUsI8vpg==",
- "dev": true
- },
- "node_modules/@types/fs-extra": {
- "version": "9.0.13",
- "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.13.tgz",
- "integrity": "sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==",
- "dev": true,
+ "node_modules/@rc-component/mutate-observer": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/@rc-component/mutate-observer/-/mutate-observer-2.0.1.tgz",
+ "integrity": "sha512-AyarjoLU5YlxuValRi+w8JRH2Z84TBbFO2RoGWz9d8bSu0FqT8DtugH3xC3BV7mUwlmROFauyWuXFuq4IFbH+w==",
+ "license": "MIT",
"dependencies": {
- "@types/node": "*"
+ "@rc-component/util": "^1.2.0"
+ },
+ "engines": {
+ "node": ">=8.x"
+ },
+ "peerDependencies": {
+ "react": ">=16.9.0",
+ "react-dom": ">=16.9.0"
}
},
- "node_modules/@types/glob": {
- "version": "8.1.0",
- "resolved": "https://registry.npmjs.org/@types/glob/-/glob-8.1.0.tgz",
- "integrity": "sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w==",
+ "node_modules/@rc-component/notification": {
+ "version": "2.0.7",
+ "resolved": "https://registry.npmjs.org/@rc-component/notification/-/notification-2.0.7.tgz",
+ "integrity": "sha512-nqZzpf6BPdaj+3ILx7si79LLmqPKyUmQoXa+/9gg0SkH0v1DbD66oJgRMSBEVnd/zUT3D4gwxWIHUKebYf2ZXQ==",
+ "license": "MIT",
"dependencies": {
- "@types/minimatch": "^5.1.2",
- "@types/node": "*"
+ "@rc-component/motion": "^1.1.4",
+ "@rc-component/util": "^1.11.0",
+ "clsx": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=8.x"
+ },
+ "peerDependencies": {
+ "react": ">=18.0.0",
+ "react-dom": ">=18.0.0"
}
},
- "node_modules/@types/http-cache-semantics": {
- "version": "4.0.4",
- "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz",
- "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA=="
- },
- "node_modules/@types/http-errors": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz",
- "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==",
- "dev": true
- },
- "node_modules/@types/jsftp": {
- "version": "2.1.5",
- "resolved": "https://registry.npmjs.org/@types/jsftp/-/jsftp-2.1.5.tgz",
- "integrity": "sha512-g2W6f06wXWVYZw3f/z/N5VHRK69kb1nFaNcRnxs6YxwLph+G7ebd0+Aobd3jWu43oZuyHgycpJZPn+YdIU6qRw==",
- "dev": true,
+ "node_modules/@rc-component/overflow": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@rc-component/overflow/-/overflow-1.0.0.tgz",
+ "integrity": "sha512-GSlBeoE0XTBi5cf3zl8Qh7Uqhn7v8RrlJ8ajeVpEkNe94HWy5l5BQ0Mwn2TVUq9gdgbfEMUmTX7tJFAg7mz0Rw==",
+ "license": "MIT",
"dependencies": {
- "@types/node": "*"
+ "@babel/runtime": "^7.11.1",
+ "@rc-component/resize-observer": "^1.0.1",
+ "@rc-component/util": "^1.4.0",
+ "clsx": "^2.1.1"
+ },
+ "peerDependencies": {
+ "react": ">=16.9.0",
+ "react-dom": ">=16.9.0"
}
},
- "node_modules/@types/json-schema": {
- "version": "7.0.15",
- "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
- "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
- "dev": true
- },
- "node_modules/@types/json5": {
- "version": "0.0.29",
- "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz",
- "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==",
- "dev": true
- },
- "node_modules/@types/jszip": {
- "version": "3.4.1",
- "resolved": "https://registry.npmjs.org/@types/jszip/-/jszip-3.4.1.tgz",
- "integrity": "sha512-TezXjmf3lj+zQ651r6hPqvSScqBLvyPI9FxdXBqpEwBijNGQ2NXpaFW/7joGzveYkKQUil7iiDHLo6LV71Pc0A==",
- "deprecated": "This is a stub types definition. jszip provides its own type definitions, so you do not need this installed.",
- "dev": true,
+ "node_modules/@rc-component/pagination": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/@rc-component/pagination/-/pagination-1.3.0.tgz",
+ "integrity": "sha512-12ahTY+HPITg1L2bjWKXUqBJe/oOnpA2QsChdCjthqLVf/e19StiCsv8OLKpWoHbc+8PFEkNjRqRqrLoRBHjFw==",
+ "license": "MIT",
"dependencies": {
- "jszip": "*"
+ "@rc-component/util": "^1.11.1",
+ "clsx": "^2.1.1"
+ },
+ "peerDependencies": {
+ "react": ">=16.9.0",
+ "react-dom": ">=16.9.0"
}
},
- "node_modules/@types/keyv": {
- "version": "3.1.4",
- "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz",
- "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==",
+ "node_modules/@rc-component/picker": {
+ "version": "1.10.0",
+ "resolved": "https://registry.npmjs.org/@rc-component/picker/-/picker-1.10.0.tgz",
+ "integrity": "sha512-vVOXP2RVWozwpERGUFAehVH1Jz6o/uRrAb9qSZm1LC+iJs8rvEwFo1bzz2jlOYV+uWwu0dIuG86tnDui14Ea0w==",
+ "license": "MIT",
"dependencies": {
- "@types/node": "*"
+ "@rc-component/overflow": "^1.0.0",
+ "@rc-component/resize-observer": "^1.0.0",
+ "@rc-component/trigger": "^3.6.15",
+ "@rc-component/util": "^1.3.0",
+ "clsx": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=12.x"
+ },
+ "peerDependencies": {
+ "date-fns": ">= 2.x",
+ "dayjs": ">= 1.x",
+ "luxon": ">= 3.x",
+ "moment": ">= 2.x",
+ "react": ">=16.9.0",
+ "react-dom": ">=16.9.0"
+ },
+ "peerDependenciesMeta": {
+ "date-fns": {
+ "optional": true
+ },
+ "dayjs": {
+ "optional": true
+ },
+ "luxon": {
+ "optional": true
+ },
+ "moment": {
+ "optional": true
+ }
}
},
- "node_modules/@types/klaw": {
- "version": "3.0.6",
- "resolved": "https://registry.npmjs.org/@types/klaw/-/klaw-3.0.6.tgz",
- "integrity": "sha512-BErW5TrTz4nzt/c3VRGf0Bug4JyQJ1o807F4mAfXfvOzFZ8SKgFeHJ0T28Y1KtqlMEB+cUgN7S7CsyQDQ/qxqg==",
- "dev": true,
+ "node_modules/@rc-component/portal": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/@rc-component/portal/-/portal-2.2.0.tgz",
+ "integrity": "sha512-oc6FlA+uXCMiwArHsJyHcIkX4q6uKyndrPol2eWX8YPkAnztHOPsFIRtmWG4BMlGE5h7YIRE3NiaJ5VS8Lb1QQ==",
+ "license": "MIT",
"dependencies": {
- "@types/node": "*"
+ "@rc-component/util": "^1.2.1",
+ "clsx": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=12.x"
+ },
+ "peerDependencies": {
+ "react": ">=18.0.0",
+ "react-dom": ">=18.0.0"
}
},
- "node_modules/@types/lockfile": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/@types/lockfile/-/lockfile-1.0.4.tgz",
- "integrity": "sha512-Q8oFIHJHr+htLrTXN2FuZfg+WXVHQRwU/hC2GpUu+Q8e3FUM9EDkS2pE3R2AO1ZGu56f479ybdMCNF1DAu8cAQ==",
- "dev": true
- },
- "node_modules/@types/lodash": {
- "version": "4.14.202",
- "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.202.tgz",
- "integrity": "sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ==",
- "dev": true,
- "peer": true
- },
- "node_modules/@types/method-override": {
- "version": "0.0.35",
- "resolved": "https://registry.npmjs.org/@types/method-override/-/method-override-0.0.35.tgz",
- "integrity": "sha512-HdhM5xiIV8fwsZ3B8e9IKWJOqEgmXXBJ/qQzhs5Z8idjsszqEX4j/7/QAcso27ArZ1tSBXg2XMlI1cIHAsCTXA==",
- "dev": true,
- "peer": true,
+ "node_modules/@rc-component/progress": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/@rc-component/progress/-/progress-1.0.2.tgz",
+ "integrity": "sha512-WZUnH9eGxH1+xodZKqdrHke59uyGZSWgj5HBM5Kwk5BrTMuAORO7VJ2IP5Qbm9aH3n9x3IcesqHHR0NWPBC7fQ==",
+ "license": "MIT",
"dependencies": {
- "@types/express": "*"
+ "@rc-component/util": "^1.2.1",
+ "clsx": "^2.1.1"
+ },
+ "peerDependencies": {
+ "react": ">=16.9.0",
+ "react-dom": ">=16.9.0"
}
},
- "node_modules/@types/mime": {
- "version": "1.3.5",
- "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz",
- "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==",
- "dev": true
- },
- "node_modules/@types/minimatch": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz",
- "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA=="
- },
- "node_modules/@types/ms": {
- "version": "0.7.34",
- "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz",
- "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==",
- "dev": true
- },
- "node_modules/@types/mv": {
- "version": "2.1.4",
- "resolved": "https://registry.npmjs.org/@types/mv/-/mv-2.1.4.tgz",
- "integrity": "sha512-MgEHBpXnQo44Q43j8G0Bvp/Yi8LYbC8hxKrRFMgDEDZMmzDKZLgiyMWtW49B37ko+QupgZ3G5rtPUnOGe5ixLw==",
- "dev": true
- },
- "node_modules/@types/ncp": {
- "version": "2.0.8",
- "resolved": "https://registry.npmjs.org/@types/ncp/-/ncp-2.0.8.tgz",
- "integrity": "sha512-pLNWVLCVWBLVM4F2OPjjK6FWFtByFKD7LhHryF+MbVLws7ENj09mKxRFlhkGPOXfJuaBAG+2iADKJsZwnAbYDw==",
- "dev": true,
+ "node_modules/@rc-component/qrcode": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@rc-component/qrcode/-/qrcode-2.0.0.tgz",
+ "integrity": "sha512-aAv3QhPP1xyafuTZOxub6a54pCeBnN3IwQkpETrBtthq4BL5IgxnCbuoBWPDpdLw1y1j6BgBUCAKV92+yX06Dw==",
+ "license": "MIT",
"dependencies": {
- "@types/node": "*"
+ "@babel/runtime": "^7.24.7"
+ },
+ "engines": {
+ "node": ">=8.x"
+ },
+ "peerDependencies": {
+ "react": ">=16.9.0",
+ "react-dom": ">=16.9.0"
}
},
- "node_modules/@types/node": {
- "version": "20.10.5",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.5.tgz",
- "integrity": "sha512-nNPsNE65wjMxEKI93yOP+NPGGBJz/PoN3kZsVLee0XMiJolxSekEVD8wRwBUBqkwc7UWop0edW50yrCQW4CyRw==",
+ "node_modules/@rc-component/rate": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@rc-component/rate/-/rate-1.0.1.tgz",
+ "integrity": "sha512-bkXxeBqDpl5IOC7yL7GcSYjQx9G8H+6kLYQnNZWeBYq2OYIv1MONd6mqKTjnnJYpV0cQIU2z3atdW0j1kttpTw==",
+ "license": "MIT",
"dependencies": {
- "undici-types": "~5.26.4"
+ "@rc-component/util": "^1.3.0",
+ "clsx": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=8.x"
+ },
+ "peerDependencies": {
+ "react": ">=16.9.0",
+ "react-dom": ">=16.9.0"
}
},
- "node_modules/@types/normalize-package-data": {
- "version": "2.4.4",
- "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz",
- "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==",
- "dev": true
- },
- "node_modules/@types/npmlog": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/@types/npmlog/-/npmlog-7.0.0.tgz",
- "integrity": "sha512-hJWbrKFvxKyWwSUXjZMYTINsSOY6IclhvGOZ97M8ac2tmR9hMwmTnYaMdpGhvju9ctWLTPhCS+eLfQNluiEjQQ==",
- "dev": true,
+ "node_modules/@rc-component/resize-observer": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@rc-component/resize-observer/-/resize-observer-1.1.2.tgz",
+ "integrity": "sha512-t/Bb0W8uvL4PYKAB3YcChC+DlHh0Wt5kM7q/J+0qpVEUMLe7Hk5zuvc9km0hMnTFPSx5Z7Wu/fzCLN6erVLE8Q==",
+ "license": "MIT",
"dependencies": {
- "@types/node": "*"
+ "@rc-component/util": "^1.2.0"
+ },
+ "peerDependencies": {
+ "react": ">=16.9.0",
+ "react-dom": ">=16.9.0"
}
},
- "node_modules/@types/plist": {
- "version": "3.0.5",
- "resolved": "https://registry.npmjs.org/@types/plist/-/plist-3.0.5.tgz",
- "integrity": "sha512-E6OCaRmAe4WDmWNsL/9RMqdkkzDCY1etutkflWk4c+AcjDU07Pcz1fQwTX0TQz+Pxqn9i4L1TU3UFpjnrcDgxA==",
- "dev": true,
- "optional": true,
+ "node_modules/@rc-component/segmented": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/@rc-component/segmented/-/segmented-1.3.0.tgz",
+ "integrity": "sha512-5J/bJ01mbDnoA6P/FW8SxUvKn+OgUSTZJPzCNnTBntG50tzoP7DydGhqxp7ggZXZls7me3mc2EQDXakU3iTVFg==",
+ "license": "MIT",
"dependencies": {
- "@types/node": "*",
- "xmlbuilder": ">=11.0.1"
+ "@babel/runtime": "^7.11.1",
+ "@rc-component/motion": "^1.1.4",
+ "@rc-component/util": "^1.3.0",
+ "clsx": "^2.1.1"
+ },
+ "peerDependencies": {
+ "react": ">=16.0.0",
+ "react-dom": ">=16.0.0"
}
},
- "node_modules/@types/pluralize": {
- "version": "0.0.33",
- "resolved": "https://registry.npmjs.org/@types/pluralize/-/pluralize-0.0.33.tgz",
- "integrity": "sha512-JOqsl+ZoCpP4e8TDke9W79FDcSgPAR0l6pixx2JHkhnRjvShyYiAYw2LVsnA7K08Y6DeOnaU6ujmENO4os/cYg==",
- "dev": true
- },
- "node_modules/@types/puppeteer": {
- "version": "7.0.4",
- "resolved": "https://registry.npmjs.org/@types/puppeteer/-/puppeteer-7.0.4.tgz",
- "integrity": "sha512-ja78vquZc8y+GM2al07GZqWDKQskQXygCDiu0e3uO0DMRKqE0MjrFBFmTulfPYzLB6WnL7Kl2tFPy0WXSpPomg==",
- "deprecated": "This is a stub types definition. puppeteer provides its own type definitions, so you do not need this installed.",
- "dev": true,
+ "node_modules/@rc-component/select": {
+ "version": "1.7.1",
+ "resolved": "https://registry.npmjs.org/@rc-component/select/-/select-1.7.1.tgz",
+ "integrity": "sha512-GZ1cMJk2xQh0VHyOQjjG8drYL4iu24NcbkXioUcReQOCUr+ub/3fmRonZe6cRPEZhWMbJdeHsqnEltogDaZ5Tg==",
+ "license": "MIT",
"dependencies": {
- "puppeteer": "*"
+ "@rc-component/overflow": "^1.0.0",
+ "@rc-component/trigger": "^3.0.0",
+ "@rc-component/util": "^1.11.1",
+ "@rc-component/virtual-list": "^1.2.0",
+ "clsx": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=8.x"
+ },
+ "peerDependencies": {
+ "react": "*",
+ "react-dom": "*"
}
},
- "node_modules/@types/puppeteer-core": {
- "version": "5.4.0",
- "resolved": "https://registry.npmjs.org/@types/puppeteer-core/-/puppeteer-core-5.4.0.tgz",
- "integrity": "sha512-yqRPuv4EFcSkTyin6Yy17pN6Qz2vwVwTCJIDYMXbE3j8vTPhv0nCQlZOl5xfi0WHUkqvQsjAR8hAfjeMCoetwg==",
- "dev": true,
+ "node_modules/@rc-component/slider": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@rc-component/slider/-/slider-1.0.1.tgz",
+ "integrity": "sha512-uDhEPU1z3WDfCJhaL9jfd2ha/Eqpdfxsn0Zb0Xcq1NGQAman0TWaR37OWp2vVXEOdV2y0njSILTMpTfPV1454g==",
+ "license": "MIT",
"dependencies": {
- "@types/puppeteer": "*"
+ "@rc-component/util": "^1.3.0",
+ "clsx": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=8.x"
+ },
+ "peerDependencies": {
+ "react": ">=16.9.0",
+ "react-dom": ">=16.9.0"
}
},
- "node_modules/@types/q": {
- "version": "1.5.8",
- "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.8.tgz",
- "integrity": "sha512-hroOstUScF6zhIi+5+x0dzqrHA1EJi+Irri6b1fxolMTqqHIV/Cg77EtnQcZqZCu8hR3mX2BzIxN4/GzI68Kfw==",
- "dev": true
- },
- "node_modules/@types/qs": {
- "version": "6.9.10",
- "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.10.tgz",
- "integrity": "sha512-3Gnx08Ns1sEoCrWssEgTSJs/rsT2vhGP+Ja9cnnk9k4ALxinORlQneLXFeFKOTJMOeZUFD1s7w+w2AphTpvzZw==",
- "dev": true
- },
- "node_modules/@types/range-parser": {
- "version": "1.2.7",
- "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz",
- "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==",
- "dev": true
- },
- "node_modules/@types/readdir-glob": {
- "version": "1.1.5",
- "resolved": "https://registry.npmjs.org/@types/readdir-glob/-/readdir-glob-1.1.5.tgz",
- "integrity": "sha512-raiuEPUYqXu+nvtY2Pe8s8FEmZ3x5yAH4VkLdihcPdalvsHltomrRC9BzuStrJ9yk06470hS0Crw0f1pXqD+Hg==",
- "dev": true,
+ "node_modules/@rc-component/steps": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/@rc-component/steps/-/steps-1.2.2.tgz",
+ "integrity": "sha512-/yVIZ00gDYYPHSY0JP+M+s3ZvuXLu2f9rEjQqiUDs7EcYsUYrpJ/1bLj9aI9R7MBR3fu/NGh6RM9u2qGfqp+Nw==",
+ "license": "MIT",
"dependencies": {
- "@types/node": "*"
+ "@rc-component/util": "^1.2.1",
+ "clsx": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=8.x"
+ },
+ "peerDependencies": {
+ "react": ">=16.9.0",
+ "react-dom": ">=16.9.0"
}
},
- "node_modules/@types/responselike": {
+ "node_modules/@rc-component/switch": {
"version": "1.0.3",
- "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.3.tgz",
- "integrity": "sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==",
+ "resolved": "https://registry.npmjs.org/@rc-component/switch/-/switch-1.0.3.tgz",
+ "integrity": "sha512-Jgi+EbOBquje/XNdofr7xbJQZPYJP+BlPfR0h+WN4zFkdtB2EWqEfvkXJWeipflwjWip0/17rNbxEAqs8hVHfw==",
+ "license": "MIT",
"dependencies": {
- "@types/node": "*"
+ "@rc-component/util": "^1.3.0",
+ "clsx": "^2.1.1"
+ },
+ "peerDependencies": {
+ "react": ">=16.9.0",
+ "react-dom": ">=16.9.0"
}
},
- "node_modules/@types/semver": {
- "version": "7.5.7",
- "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.7.tgz",
- "integrity": "sha512-/wdoPq1QqkSj9/QOeKkFquEuPzQbHTWAMPH/PaUMB+JuR31lXhlWXRZ52IpfDYVlDOUBvX09uBrPwxGT1hjNBg==",
- "dev": true
- },
- "node_modules/@types/send": {
- "version": "0.17.4",
- "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz",
- "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==",
- "dev": true,
+ "node_modules/@rc-component/table": {
+ "version": "1.10.2",
+ "resolved": "https://registry.npmjs.org/@rc-component/table/-/table-1.10.2.tgz",
+ "integrity": "sha512-b3PjqB9Gp25p5t/zq+9QrbXbodkptT8/zvLmwgd2FNPUUtaYyDnQqfxeD5a7ao8E8lpinLHsi2u2vdfPhyNvAw==",
+ "license": "MIT",
"dependencies": {
- "@types/mime": "^1",
- "@types/node": "*"
+ "@rc-component/context": "^2.0.1",
+ "@rc-component/resize-observer": "^1.0.0",
+ "@rc-component/util": "^1.11.1",
+ "@rc-component/virtual-list": "^1.0.1",
+ "clsx": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=8.x"
+ },
+ "peerDependencies": {
+ "react": ">=18.0.0",
+ "react-dom": ">=18.0.0"
}
},
- "node_modules/@types/serve-favicon": {
- "version": "2.5.7",
- "resolved": "https://registry.npmjs.org/@types/serve-favicon/-/serve-favicon-2.5.7.tgz",
- "integrity": "sha512-z9TNUQXdQ+W/OJMP1e3KOYUZ99qJS4+ZfFOIrPGImcayqKoyifbJSEFkVq1MCKBbqjMZpjPj3B5ilrQAR2+TOw==",
- "dev": true,
- "peer": true,
+ "node_modules/@rc-component/tabs": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/@rc-component/tabs/-/tabs-1.9.1.tgz",
+ "integrity": "sha512-6mY08Fce6aNOHuGsxbzT+f2ekgL9mg1cGGHkittMlVGymjGg+kGupu5v90sRxcUd/paRU9jclLLXtF/PkK1FUA==",
+ "license": "MIT",
"dependencies": {
- "@types/express": "*"
+ "@rc-component/dropdown": "~1.0.0",
+ "@rc-component/menu": "~1.3.0",
+ "@rc-component/motion": "^1.1.3",
+ "@rc-component/resize-observer": "^1.0.0",
+ "@rc-component/util": "^1.11.1",
+ "clsx": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=8.x"
+ },
+ "peerDependencies": {
+ "react": ">=16.9.0",
+ "react-dom": ">=16.9.0"
}
},
- "node_modules/@types/serve-static": {
- "version": "1.15.5",
- "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.5.tgz",
- "integrity": "sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==",
- "dev": true,
+ "node_modules/@rc-component/tooltip": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/@rc-component/tooltip/-/tooltip-1.4.0.tgz",
+ "integrity": "sha512-8Rx5DCctIlLI4raR0I0xHjVTf1aF48+gKCNeAAo5bmF5VoR5YED+A/XEqzXv9KKqrJDRcd3Wndpxh2hyzrTtSg==",
+ "license": "MIT",
"dependencies": {
- "@types/http-errors": "*",
- "@types/mime": "*",
- "@types/node": "*"
+ "@rc-component/trigger": "^3.7.1",
+ "@rc-component/util": "^1.3.0",
+ "clsx": "^2.1.1"
+ },
+ "peerDependencies": {
+ "react": ">=18.0.0",
+ "react-dom": ">=18.0.0"
}
},
- "node_modules/@types/shell-quote": {
- "version": "1.7.5",
- "resolved": "https://registry.npmjs.org/@types/shell-quote/-/shell-quote-1.7.5.tgz",
- "integrity": "sha512-+UE8GAGRPbJVQDdxi16dgadcBfQ+KG2vgZhV1+3A1XmHbmwcdwhCUwIdy+d3pAGrbvgRoVSjeI9vOWyq376Yzw==",
- "dev": true
- },
- "node_modules/@types/supports-color": {
- "version": "8.1.3",
- "resolved": "https://registry.npmjs.org/@types/supports-color/-/supports-color-8.1.3.tgz",
- "integrity": "sha512-Hy6UMpxhE3j1tLpl27exp1XqHD7n8chAiNPzWfz16LPZoMMoSc4dzLl6w9qijkEb/r5O1ozdu1CWGA2L83ZeZg==",
- "dev": true
- },
- "node_modules/@types/teen_process": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/@types/teen_process/-/teen_process-2.0.4.tgz",
- "integrity": "sha512-AJT0syZovEDa4j17szoRJX5BE2RxD3FVp6SownH43mF16TPnsV0zhtsvFGlgs5QkgsNpoooNnF+HjMow7Jd3jA==",
- "dev": true,
+ "node_modules/@rc-component/tour": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/@rc-component/tour/-/tour-2.4.0.tgz",
+ "integrity": "sha512-aui4r4TqmTzwaBgcQxHYep8kM8PTjZFufjokObpy35KfFeZ0k9ArquWFZqegQlH24P14t+F0qO0mGTgzlav1yg==",
+ "license": "MIT",
"dependencies": {
- "@types/node": "*"
+ "@rc-component/portal": "^2.2.0",
+ "@rc-component/trigger": "^3.0.0",
+ "@rc-component/util": "^1.7.0",
+ "clsx": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=8.x"
+ },
+ "peerDependencies": {
+ "react": ">=16.9.0",
+ "react-dom": ">=16.9.0"
}
},
- "node_modules/@types/triple-beam": {
- "version": "1.3.5",
- "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz",
- "integrity": "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==",
- "dev": true,
- "peer": true
- },
- "node_modules/@types/use-sync-external-store": {
- "version": "0.0.3",
- "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.3.tgz",
- "integrity": "sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA=="
- },
- "node_modules/@types/uuid": {
- "version": "9.0.8",
- "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.8.tgz",
- "integrity": "sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==",
- "dev": true
- },
- "node_modules/@types/verror": {
- "version": "1.10.9",
- "resolved": "https://registry.npmjs.org/@types/verror/-/verror-1.10.9.tgz",
- "integrity": "sha512-MLx9Z+9lGzwEuW16ubGeNkpBDE84RpB/NyGgg6z2BTpWzKkGU451cAY3UkUzZEp72RHF585oJ3V8JVNqIplcAQ==",
- "dev": true,
- "optional": true
- },
- "node_modules/@types/which": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/@types/which/-/which-3.0.3.tgz",
- "integrity": "sha512-2C1+XoY0huExTbs8MQv1DuS5FS86+SEjdM9F/+GS61gg5Hqbtj8ZiDSx8MfWcyei907fIPbfPGCOrNUTnVHY1g==",
- "dev": true
- },
- "node_modules/@types/wrap-ansi": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/@types/wrap-ansi/-/wrap-ansi-3.0.0.tgz",
- "integrity": "sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g==",
- "dev": true,
- "peer": true
- },
- "node_modules/@types/ws": {
- "version": "8.5.10",
- "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.10.tgz",
- "integrity": "sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==",
- "dev": true,
+ "node_modules/@rc-component/tree": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/@rc-component/tree/-/tree-1.3.2.tgz",
+ "integrity": "sha512-bJFj46wEkpBPnWyTm18XmgAgNQ/4YvprxMOPPY2a6rmhGJYxLuNKEFiL5Qej4Qctu9wHJm8WW+v2SYskafE0kA==",
+ "license": "MIT",
"dependencies": {
- "@types/node": "*"
+ "@rc-component/motion": "^1.0.0",
+ "@rc-component/util": "^1.11.1",
+ "@rc-component/virtual-list": "^1.2.0",
+ "clsx": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=10.x"
+ },
+ "peerDependencies": {
+ "react": "*",
+ "react-dom": "*"
}
},
- "node_modules/@types/yauzl": {
- "version": "2.10.3",
- "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz",
- "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==",
- "dev": true,
- "optional": true,
- "dependencies": {
- "@types/node": "*"
- }
- },
- "node_modules/@ungap/structured-clone": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz",
- "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==",
- "dev": true
- },
- "node_modules/@wdio/config": {
- "version": "7.33.0",
- "resolved": "https://registry.npmjs.org/@wdio/config/-/config-7.33.0.tgz",
- "integrity": "sha512-SaCZNKrDtBghf7ujyaxTiU4pBW+1Kms32shSoXpJ/wFop6/MiA7nb19qpUPoJtEDw5/NOKevUKz8nBMBXphiew==",
- "dependencies": {
- "@types/glob": "^8.1.0",
- "@wdio/logger": "7.26.0",
- "@wdio/types": "7.33.0",
- "@wdio/utils": "7.33.0",
- "deepmerge": "^4.0.0",
- "glob": "^8.0.3"
- },
- "engines": {
- "node": ">=12.0.0"
- }
- },
- "node_modules/@wdio/config/node_modules/@sindresorhus/is": {
- "version": "4.6.0",
- "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz",
- "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sindresorhus/is?sponsor=1"
- }
- },
- "node_modules/@wdio/config/node_modules/@szmarczak/http-timer": {
- "version": "4.0.6",
- "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz",
- "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==",
- "dependencies": {
- "defer-to-connect": "^2.0.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/@wdio/config/node_modules/@types/node": {
- "version": "18.19.3",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.3.tgz",
- "integrity": "sha512-k5fggr14DwAytoA/t8rPrIz++lXK7/DqckthCmoZOKNsEbJkId4Z//BqgApXBUGrGddrigYa1oqheo/7YmW4rg==",
- "dependencies": {
- "undici-types": "~5.26.4"
- }
- },
- "node_modules/@wdio/config/node_modules/@wdio/types": {
- "version": "7.33.0",
- "resolved": "https://registry.npmjs.org/@wdio/types/-/types-7.33.0.tgz",
- "integrity": "sha512-tNcuN5Kl+i5CffaeTYV1omzAo4rVjiI1m9raIA8ph6iVteWdCzYv2/ImpGgFiBPb7Mf6VokU3+q9Slh5Jitaww==",
- "dependencies": {
- "@types/node": "^18.0.0",
- "got": "^11.8.1"
- },
- "engines": {
- "node": ">=12.0.0"
- },
- "peerDependencies": {
- "typescript": "^4.6.2"
- },
- "peerDependenciesMeta": {
- "typescript": {
- "optional": true
- }
- }
- },
- "node_modules/@wdio/config/node_modules/cacheable-request": {
- "version": "7.0.4",
- "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz",
- "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==",
- "dependencies": {
- "clone-response": "^1.0.2",
- "get-stream": "^5.1.0",
- "http-cache-semantics": "^4.0.0",
- "keyv": "^4.0.0",
- "lowercase-keys": "^2.0.0",
- "normalize-url": "^6.0.1",
- "responselike": "^2.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/@wdio/config/node_modules/decompress-response": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz",
- "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==",
- "dependencies": {
- "mimic-response": "^3.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/@wdio/config/node_modules/defer-to-connect": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz",
- "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==",
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/@wdio/config/node_modules/get-stream": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
- "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
- "dependencies": {
- "pump": "^3.0.0"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/@wdio/config/node_modules/glob": {
- "version": "8.1.0",
- "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz",
- "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==",
- "dependencies": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^5.0.1",
- "once": "^1.3.0"
- },
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/@wdio/config/node_modules/got": {
- "version": "11.8.6",
- "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz",
- "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==",
- "dependencies": {
- "@sindresorhus/is": "^4.0.0",
- "@szmarczak/http-timer": "^4.0.5",
- "@types/cacheable-request": "^6.0.1",
- "@types/responselike": "^1.0.0",
- "cacheable-lookup": "^5.0.3",
- "cacheable-request": "^7.0.2",
- "decompress-response": "^6.0.0",
- "http2-wrapper": "^1.0.0-beta.5.2",
- "lowercase-keys": "^2.0.0",
- "p-cancelable": "^2.0.0",
- "responselike": "^2.0.0"
- },
- "engines": {
- "node": ">=10.19.0"
- },
- "funding": {
- "url": "https://github.com/sindresorhus/got?sponsor=1"
- }
- },
- "node_modules/@wdio/config/node_modules/lowercase-keys": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz",
- "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/@wdio/config/node_modules/mimic-response": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz",
- "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/@wdio/config/node_modules/normalize-url": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz",
- "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/@wdio/config/node_modules/p-cancelable": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz",
- "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/@wdio/config/node_modules/responselike": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz",
- "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==",
- "dependencies": {
- "lowercase-keys": "^2.0.0"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/@wdio/config/node_modules/typescript": {
- "version": "4.9.5",
- "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz",
- "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==",
- "optional": true,
- "peer": true,
- "bin": {
- "tsc": "bin/tsc",
- "tsserver": "bin/tsserver"
- },
- "engines": {
- "node": ">=4.2.0"
- }
- },
- "node_modules/@wdio/logger": {
- "version": "7.26.0",
- "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-7.26.0.tgz",
- "integrity": "sha512-kQj9s5JudAG9qB+zAAcYGPHVfATl2oqKgqj47yjehOQ1zzG33xmtL1ArFbQKWhDG32y1A8sN6b0pIqBEIwgg8Q==",
- "dependencies": {
- "chalk": "^4.0.0",
- "loglevel": "^1.6.0",
- "loglevel-plugin-prefix": "^0.8.4",
- "strip-ansi": "^6.0.0"
- },
- "engines": {
- "node": ">=12.0.0"
- }
- },
- "node_modules/@wdio/logger/node_modules/ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "dependencies": {
- "color-convert": "^2.0.1"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/@wdio/logger/node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
- }
- },
- "node_modules/@wdio/logger/node_modules/color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
- "dependencies": {
- "color-name": "~1.1.4"
- },
- "engines": {
- "node": ">=7.0.0"
- }
- },
- "node_modules/@wdio/logger/node_modules/color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
- },
- "node_modules/@wdio/logger/node_modules/supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
- "dependencies": {
- "has-flag": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/@wdio/protocols": {
- "version": "7.27.0",
- "resolved": "https://registry.npmjs.org/@wdio/protocols/-/protocols-7.27.0.tgz",
- "integrity": "sha512-hT/U22R5i3HhwPjkaKAG0yd59eaOaZB0eibRj2+esCImkb5Y6rg8FirrlYRxIGFVBl0+xZV0jKHzR5+o097nvg==",
- "engines": {
- "node": ">=12.0.0"
- }
- },
- "node_modules/@wdio/repl": {
- "version": "6.11.0",
- "resolved": "https://registry.npmjs.org/@wdio/repl/-/repl-6.11.0.tgz",
- "integrity": "sha512-FxrFKiTkFyELNGGVEH1uijyvNY7lUpmff6x+FGskFGZB4uSRs0rxkOMaEjxnxw7QP1zgQKr2xC7GyO03gIGRGg==",
- "dev": true,
- "dependencies": {
- "@wdio/utils": "6.11.0"
- },
- "engines": {
- "node": ">=10.0.0"
- }
- },
- "node_modules/@wdio/repl/node_modules/@wdio/logger": {
- "version": "6.10.10",
- "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-6.10.10.tgz",
- "integrity": "sha512-2nh0hJz9HeZE0VIEMI+oPgjr/Q37ohrR9iqsl7f7GW5ik+PnKYCT9Eab5mR1GNMG60askwbskgGC1S9ygtvrSw==",
- "dev": true,
- "dependencies": {
- "chalk": "^4.0.0",
- "loglevel": "^1.6.0",
- "loglevel-plugin-prefix": "^0.8.4",
- "strip-ansi": "^6.0.0"
- },
- "engines": {
- "node": ">=10.0.0"
- }
- },
- "node_modules/@wdio/repl/node_modules/@wdio/utils": {
- "version": "6.11.0",
- "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-6.11.0.tgz",
- "integrity": "sha512-vf0sOQzd28WbI26d6/ORrQ4XKWTzSlWLm9W/K/eJO0NASKPEzR+E+Q2kaa+MJ4FKXUpjbt+Lxfo+C26TzBk7tg==",
- "dev": true,
- "dependencies": {
- "@wdio/logger": "6.10.10"
- },
- "engines": {
- "node": ">=10.0.0"
- }
- },
- "node_modules/@wdio/repl/node_modules/ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "dev": true,
- "dependencies": {
- "color-convert": "^2.0.1"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/@wdio/repl/node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "dev": true,
- "dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
- }
- },
- "node_modules/@wdio/repl/node_modules/color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
- "dev": true,
- "dependencies": {
- "color-name": "~1.1.4"
- },
- "engines": {
- "node": ">=7.0.0"
- }
- },
- "node_modules/@wdio/repl/node_modules/color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "dev": true
- },
- "node_modules/@wdio/repl/node_modules/supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
- "dev": true,
- "dependencies": {
- "has-flag": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/@wdio/utils": {
- "version": "7.33.0",
- "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-7.33.0.tgz",
- "integrity": "sha512-4kQQ86EvEN6fBY5+u7M08cT6LfJtpk1rHd203xyxmbmV9lpNv/OCl4CsC+SD0jGT0aZZqYSIJ/Pil07pAh5K0g==",
- "dependencies": {
- "@wdio/logger": "7.26.0",
- "@wdio/types": "7.33.0",
- "p-iteration": "^1.1.8"
- },
- "engines": {
- "node": ">=12.0.0"
- }
- },
- "node_modules/@wdio/utils/node_modules/@sindresorhus/is": {
- "version": "4.6.0",
- "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz",
- "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sindresorhus/is?sponsor=1"
- }
- },
- "node_modules/@wdio/utils/node_modules/@szmarczak/http-timer": {
- "version": "4.0.6",
- "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz",
- "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==",
- "dependencies": {
- "defer-to-connect": "^2.0.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/@wdio/utils/node_modules/@types/node": {
- "version": "18.19.3",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.3.tgz",
- "integrity": "sha512-k5fggr14DwAytoA/t8rPrIz++lXK7/DqckthCmoZOKNsEbJkId4Z//BqgApXBUGrGddrigYa1oqheo/7YmW4rg==",
- "dependencies": {
- "undici-types": "~5.26.4"
- }
- },
- "node_modules/@wdio/utils/node_modules/@wdio/types": {
- "version": "7.33.0",
- "resolved": "https://registry.npmjs.org/@wdio/types/-/types-7.33.0.tgz",
- "integrity": "sha512-tNcuN5Kl+i5CffaeTYV1omzAo4rVjiI1m9raIA8ph6iVteWdCzYv2/ImpGgFiBPb7Mf6VokU3+q9Slh5Jitaww==",
- "dependencies": {
- "@types/node": "^18.0.0",
- "got": "^11.8.1"
- },
- "engines": {
- "node": ">=12.0.0"
- },
- "peerDependencies": {
- "typescript": "^4.6.2"
- },
- "peerDependenciesMeta": {
- "typescript": {
- "optional": true
- }
- }
- },
- "node_modules/@wdio/utils/node_modules/cacheable-request": {
- "version": "7.0.4",
- "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz",
- "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==",
- "dependencies": {
- "clone-response": "^1.0.2",
- "get-stream": "^5.1.0",
- "http-cache-semantics": "^4.0.0",
- "keyv": "^4.0.0",
- "lowercase-keys": "^2.0.0",
- "normalize-url": "^6.0.1",
- "responselike": "^2.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/@wdio/utils/node_modules/decompress-response": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz",
- "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==",
- "dependencies": {
- "mimic-response": "^3.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/@wdio/utils/node_modules/defer-to-connect": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz",
- "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==",
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/@wdio/utils/node_modules/get-stream": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
- "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
- "dependencies": {
- "pump": "^3.0.0"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/@wdio/utils/node_modules/got": {
- "version": "11.8.6",
- "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz",
- "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==",
- "dependencies": {
- "@sindresorhus/is": "^4.0.0",
- "@szmarczak/http-timer": "^4.0.5",
- "@types/cacheable-request": "^6.0.1",
- "@types/responselike": "^1.0.0",
- "cacheable-lookup": "^5.0.3",
- "cacheable-request": "^7.0.2",
- "decompress-response": "^6.0.0",
- "http2-wrapper": "^1.0.0-beta.5.2",
- "lowercase-keys": "^2.0.0",
- "p-cancelable": "^2.0.0",
- "responselike": "^2.0.0"
- },
- "engines": {
- "node": ">=10.19.0"
- },
- "funding": {
- "url": "https://github.com/sindresorhus/got?sponsor=1"
- }
- },
- "node_modules/@wdio/utils/node_modules/lowercase-keys": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz",
- "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/@wdio/utils/node_modules/mimic-response": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz",
- "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/@wdio/utils/node_modules/normalize-url": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz",
- "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/@wdio/utils/node_modules/p-cancelable": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz",
- "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/@wdio/utils/node_modules/responselike": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz",
- "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==",
- "dependencies": {
- "lowercase-keys": "^2.0.0"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/@wdio/utils/node_modules/typescript": {
- "version": "4.9.5",
- "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz",
- "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==",
- "optional": true,
- "peer": true,
- "bin": {
- "tsc": "bin/tsc",
- "tsserver": "bin/tsserver"
- },
- "engines": {
- "node": ">=4.2.0"
- }
- },
- "node_modules/@xmldom/xmldom": {
- "version": "0.8.10",
- "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.10.tgz",
- "integrity": "sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==",
- "engines": {
- "node": ">=10.0.0"
- }
- },
- "node_modules/7zip-bin": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/7zip-bin/-/7zip-bin-5.2.0.tgz",
- "integrity": "sha512-ukTPVhqG4jNzMro2qA9HSCSSVJN3aN7tlb+hfqYCt3ER0yWroeA2VR38MNrOHLQ/cVj+DaIMad0kFCtWWowh/A==",
- "dev": true
- },
- "node_modules/abab": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz",
- "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==",
- "deprecated": "Use your platform's native atob() and btoa() methods instead",
- "dev": true
- },
- "node_modules/abort-controller": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz",
- "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==",
- "dev": true,
- "dependencies": {
- "event-target-shim": "^5.0.0"
- },
- "engines": {
- "node": ">=6.5"
- }
- },
- "node_modules/accepts": {
- "version": "1.3.8",
- "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
- "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "mime-types": "~2.1.34",
- "negotiator": "0.6.3"
- },
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/accessibility-developer-tools": {
- "version": "2.12.0",
- "resolved": "https://registry.npmjs.org/accessibility-developer-tools/-/accessibility-developer-tools-2.12.0.tgz",
- "integrity": "sha512-ltexLD/Bzwr1tDskQQFi88L4akbn8zFLIFIc00vFkH3G4hNEHruuJVcJuJTeUXLxms9dSon+cHSCmfFThnowFQ==",
- "dev": true
- },
- "node_modules/acorn": {
- "version": "8.11.2",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz",
- "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==",
- "dev": true,
- "bin": {
- "acorn": "bin/acorn"
- },
- "engines": {
- "node": ">=0.4.0"
- }
- },
- "node_modules/acorn-globals": {
- "version": "4.3.4",
- "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.4.tgz",
- "integrity": "sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==",
- "dev": true,
- "dependencies": {
- "acorn": "^6.0.1",
- "acorn-walk": "^6.0.1"
- }
- },
- "node_modules/acorn-globals/node_modules/acorn": {
- "version": "6.4.2",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz",
- "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==",
- "dev": true,
- "bin": {
- "acorn": "bin/acorn"
- },
- "engines": {
- "node": ">=0.4.0"
- }
- },
- "node_modules/acorn-jsx": {
- "version": "5.3.2",
- "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
- "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
- "dev": true,
- "peerDependencies": {
- "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
- }
- },
- "node_modules/acorn-walk": {
- "version": "6.2.0",
- "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz",
- "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==",
- "dev": true,
- "engines": {
- "node": ">=0.4.0"
- }
- },
- "node_modules/agent-base": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
- "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
- "dev": true,
- "dependencies": {
- "debug": "4"
- },
- "engines": {
- "node": ">= 6.0.0"
- }
- },
- "node_modules/ajv": {
- "version": "8.12.0",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz",
- "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "fast-deep-equal": "^3.1.1",
- "json-schema-traverse": "^1.0.0",
- "require-from-string": "^2.0.2",
- "uri-js": "^4.2.2"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/epoberezkin"
- }
- },
- "node_modules/ajv-formats": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz",
- "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "ajv": "^8.0.0"
- },
- "peerDependencies": {
- "ajv": "^8.0.0"
- },
- "peerDependenciesMeta": {
- "ajv": {
- "optional": true
- }
- }
- },
- "node_modules/alphanum-sort": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz",
- "integrity": "sha512-0FcBfdcmaumGPQ0qPn7Q5qTgz/ooXgIyp1rf8ik5bGX8mpE2YHjC0P/eyQvxu1GURYQgq9ozf2mteQ5ZD9YiyQ==",
- "dev": true
- },
- "node_modules/ansi-colors": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz",
- "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==",
- "dev": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/ansi-regex": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
- "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/ansi-styles": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
- "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
- "dev": true,
- "dependencies": {
- "color-convert": "^1.9.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/ansi-to-html": {
- "version": "0.6.15",
- "resolved": "https://registry.npmjs.org/ansi-to-html/-/ansi-to-html-0.6.15.tgz",
- "integrity": "sha512-28ijx2aHJGdzbs+O5SNQF65r6rrKYnkuwTYm8lZlChuoJ9P1vVzIpWO20sQTqTPDXYp6NFwk326vApTtLVFXpQ==",
- "dev": true,
- "dependencies": {
- "entities": "^2.0.0"
- },
- "bin": {
- "ansi-to-html": "bin/ansi-to-html"
- },
- "engines": {
- "node": ">=8.0.0"
- }
- },
- "node_modules/antd": {
- "version": "4.24.15",
- "resolved": "https://registry.npmjs.org/antd/-/antd-4.24.15.tgz",
- "integrity": "sha512-pXCNJB8cTSjQdqeW5RNadraiYiJkMec/Qt0Zh+fEKUK9UqwmD4TxIYs/xnEbyQIVtHHwtl0fW684xql73KhCyQ==",
- "dependencies": {
- "@ant-design/colors": "^6.0.0",
- "@ant-design/icons": "^4.8.1",
- "@ant-design/react-slick": "~1.0.2",
- "@babel/runtime": "^7.18.3",
- "@ctrl/tinycolor": "^3.6.1",
- "classnames": "^2.2.6",
- "copy-to-clipboard": "^3.2.0",
- "lodash": "^4.17.21",
- "moment": "^2.29.2",
- "rc-cascader": "~3.7.3",
- "rc-checkbox": "~3.0.1",
- "rc-collapse": "~3.4.2",
- "rc-dialog": "~9.0.2",
- "rc-drawer": "~6.3.0",
- "rc-dropdown": "~4.0.1",
- "rc-field-form": "~1.38.2",
- "rc-image": "~5.13.0",
- "rc-input": "~0.1.4",
- "rc-input-number": "~7.3.11",
- "rc-mentions": "~1.13.1",
- "rc-menu": "~9.8.4",
- "rc-motion": "^2.9.0",
- "rc-notification": "~4.6.1",
- "rc-pagination": "~3.2.0",
- "rc-picker": "~2.7.6",
- "rc-progress": "~3.4.2",
- "rc-rate": "~2.9.3",
- "rc-resize-observer": "^1.3.1",
- "rc-segmented": "~2.1.2",
- "rc-select": "~14.1.18",
- "rc-slider": "~10.0.1",
- "rc-steps": "~5.0.0",
- "rc-switch": "~3.2.2",
- "rc-table": "~7.26.0",
- "rc-tabs": "~12.5.10",
- "rc-textarea": "~0.4.7",
- "rc-tooltip": "~5.2.2",
- "rc-tree": "~5.7.12",
- "rc-tree-select": "~5.5.5",
- "rc-trigger": "^5.3.4",
- "rc-upload": "~4.3.5",
- "rc-util": "^5.37.0",
- "scroll-into-view-if-needed": "^2.2.25"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/ant-design"
- },
- "peerDependencies": {
- "react": ">=16.9.0",
- "react-dom": ">=16.9.0"
- }
- },
- "node_modules/anymatch": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
- "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
- "dev": true,
- "dependencies": {
- "normalize-path": "^3.0.0",
- "picomatch": "^2.0.4"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/app-builder-bin": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/app-builder-bin/-/app-builder-bin-4.0.0.tgz",
- "integrity": "sha512-xwdG0FJPQMe0M0UA4Tz0zEB8rBJTRA5a476ZawAqiBkMv16GRK5xpXThOjMaEOFnZ6zabejjG4J3da0SXG63KA==",
- "dev": true
- },
- "node_modules/app-builder-lib": {
- "version": "24.12.0",
- "resolved": "https://registry.npmjs.org/app-builder-lib/-/app-builder-lib-24.12.0.tgz",
- "integrity": "sha512-t/xinVrMbsEhwljLDoFOtGkiZlaxY1aceZbHERGAS02EkUHJp9lgs/+L8okXLlYCaDSqYdB05Yb8Co+krvguXA==",
- "dev": true,
- "dependencies": {
- "@develar/schema-utils": "~2.6.5",
- "@electron/notarize": "2.1.0",
- "@electron/osx-sign": "1.0.5",
- "@electron/universal": "1.4.1",
- "@malept/flatpak-bundler": "^0.4.0",
- "@types/fs-extra": "9.0.13",
- "async-exit-hook": "^2.0.1",
- "bluebird-lst": "^1.0.9",
- "builder-util": "24.9.4",
- "builder-util-runtime": "9.2.3",
- "chromium-pickle-js": "^0.2.0",
- "debug": "^4.3.4",
- "ejs": "^3.1.8",
- "electron-publish": "24.9.4",
- "form-data": "^4.0.0",
- "fs-extra": "^10.1.0",
- "hosted-git-info": "^4.1.0",
- "is-ci": "^3.0.0",
- "isbinaryfile": "^5.0.0",
- "js-yaml": "^4.1.0",
- "lazy-val": "^1.0.5",
- "minimatch": "^5.1.1",
- "read-config-file": "6.3.2",
- "sanitize-filename": "^1.6.3",
- "semver": "^7.3.8",
- "tar": "^6.1.12",
- "temp-file": "^3.4.0"
- },
- "engines": {
- "node": ">=14.0.0"
- }
- },
- "node_modules/app-builder-lib/node_modules/fs-extra": {
- "version": "10.1.0",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz",
- "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==",
- "dev": true,
- "dependencies": {
- "graceful-fs": "^4.2.0",
- "jsonfile": "^6.0.1",
- "universalify": "^2.0.0"
- },
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/app-builder-lib/node_modules/jsonfile": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
- "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
- "dev": true,
- "dependencies": {
- "universalify": "^2.0.0"
- },
- "optionalDependencies": {
- "graceful-fs": "^4.1.6"
- }
- },
- "node_modules/app-builder-lib/node_modules/universalify": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
- "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
- "dev": true,
- "engines": {
- "node": ">= 10.0.0"
- }
- },
- "node_modules/appium": {
- "version": "2.5.1",
- "resolved": "https://registry.npmjs.org/appium/-/appium-2.5.1.tgz",
- "integrity": "sha512-f+ho3FfAiEbDewW1VFDaR8027njOsY6RSPwgxhZNSeBySAOwUNO5P43u21pJwyVh/7ooK0CKVyk7c4d+tA/P/g==",
- "dev": true,
- "hasInstallScript": true,
- "peer": true,
- "dependencies": {
- "@appium/base-driver": "^9.5.2",
- "@appium/base-plugin": "^2.2.28",
- "@appium/docutils": "^1.0.4",
- "@appium/schema": "~0.5.0",
- "@appium/support": "^4.2.2",
- "@appium/types": "^0.16.1",
- "@sidvind/better-ajv-errors": "2.1.3",
- "@types/argparse": "2.0.14",
- "@types/bluebird": "3.5.42",
- "@types/fancy-log": "2.0.2",
- "@types/semver": "7.5.7",
- "@types/teen_process": "2.0.4",
- "@types/wrap-ansi": "3.0.0",
- "ajv": "8.12.0",
- "ajv-formats": "2.1.1",
- "argparse": "2.0.1",
- "async-lock": "1.4.1",
- "asyncbox": "3.0.0",
- "axios": "1.6.7",
- "bluebird": "3.7.2",
- "cross-env": "7.0.3",
- "lilconfig": "3.0.0",
- "lodash": "4.17.21",
- "npmlog": "7.0.1",
- "ora": "5.4.1",
- "package-changed": "3.0.0",
- "resolve-from": "5.0.0",
- "semver": "7.6.0",
- "source-map-support": "0.5.21",
- "teen_process": "2.1.1",
- "type-fest": "4.10.1",
- "winston": "3.11.0",
- "wrap-ansi": "7.0.0",
- "ws": "8.16.0",
- "yaml": "2.3.4"
- },
- "bin": {
- "appium": "index.js"
- },
- "engines": {
- "node": "^14.17.0 || ^16.13.0 || >=18.0.0",
- "npm": ">=8"
- }
- },
- "node_modules/appium/node_modules/ws": {
- "version": "8.16.0",
- "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz",
- "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=10.0.0"
- },
- "peerDependencies": {
- "bufferutil": "^4.0.1",
- "utf-8-validate": ">=5.0.2"
- },
- "peerDependenciesMeta": {
- "bufferutil": {
- "optional": true
- },
- "utf-8-validate": {
- "optional": true
- }
- }
- },
- "node_modules/aproba": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz",
- "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==",
- "dev": true
- },
- "node_modules/archiver": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/archiver/-/archiver-6.0.1.tgz",
- "integrity": "sha512-CXGy4poOLBKptiZH//VlWdFuUC1RESbdZjGjILwBuZ73P7WkAUN0htfSfBq/7k6FRFlpu7bg4JOkj1vU9G6jcQ==",
- "dev": true,
- "dependencies": {
- "archiver-utils": "^4.0.1",
- "async": "^3.2.4",
- "buffer-crc32": "^0.2.1",
- "readable-stream": "^3.6.0",
- "readdir-glob": "^1.1.2",
- "tar-stream": "^3.0.0",
- "zip-stream": "^5.0.1"
- },
- "engines": {
- "node": ">= 12.0.0"
- }
- },
- "node_modules/archiver-utils": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-4.0.1.tgz",
- "integrity": "sha512-Q4Q99idbvzmgCTEAAhi32BkOyq8iVI5EwdO0PmBDSGIzzjYNdcFn7Q7k3OzbLy4kLUPXfJtG6fO2RjftXbobBg==",
- "dev": true,
- "dependencies": {
- "glob": "^8.0.0",
- "graceful-fs": "^4.2.0",
- "lazystream": "^1.0.0",
- "lodash": "^4.17.15",
- "normalize-path": "^3.0.0",
- "readable-stream": "^3.6.0"
- },
- "engines": {
- "node": ">= 12.0.0"
- }
- },
- "node_modules/archiver-utils/node_modules/glob": {
- "version": "8.1.0",
- "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz",
- "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==",
- "dev": true,
- "dependencies": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^5.0.1",
- "once": "^1.3.0"
- },
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/are-we-there-yet": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-4.0.1.tgz",
- "integrity": "sha512-2zuA+jpOYBRgoBCfa+fB87Rk0oGJjDX6pxGzqH6f33NzUhG25Xur6R0u0Z9VVAq8Z5JvQpQI6j6rtonuivC8QA==",
- "dev": true,
- "dependencies": {
- "delegates": "^1.0.0",
- "readable-stream": "^4.1.0"
- },
- "engines": {
- "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
- }
- },
- "node_modules/are-we-there-yet/node_modules/buffer": {
- "version": "6.0.3",
- "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz",
- "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ],
- "dependencies": {
- "base64-js": "^1.3.1",
- "ieee754": "^1.2.1"
- }
- },
- "node_modules/are-we-there-yet/node_modules/readable-stream": {
- "version": "4.5.1",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.1.tgz",
- "integrity": "sha512-uQjbf34vmf/asGnOHQEw07Q4llgMACQZTWWa4MmICS0IKJoHbLwKCy71H3eR99Dw5iYejc6W+pqZZEeqRtUFAw==",
- "dev": true,
- "dependencies": {
- "abort-controller": "^3.0.0",
- "buffer": "^6.0.3",
- "events": "^3.3.0",
- "process": "^0.11.10",
- "string_decoder": "^1.3.0"
- },
- "engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
- }
- },
- "node_modules/arg": {
- "version": "4.1.3",
- "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz",
- "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==",
- "dev": true
- },
- "node_modules/argparse": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
- "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="
- },
- "node_modules/arr-diff": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
- "integrity": "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/arr-flatten": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
- "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/arr-union": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
- "integrity": "sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/array-buffer-byte-length": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz",
- "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "is-array-buffer": "^3.0.1"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/array-differ": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz",
- "integrity": "sha512-LeZY+DZDRnvP7eMuQ6LHfCzUGxAAIViUBliK24P3hWXL6y4SortgR6Nim6xrkfSLlmH0+k+9NYNwVC2s53ZrYQ==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/array-equal": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.2.tgz",
- "integrity": "sha512-gUHx76KtnhEgB3HOuFYiCm3FIdEs6ocM2asHvNTkfu/Y09qQVrrVVaOKENmS2KkSaGoxgXNqC+ZVtR/n0MOkSA==",
- "dev": true,
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/array-flatten": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
- "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==",
- "dev": true,
- "peer": true
- },
- "node_modules/array-includes": {
- "version": "3.1.7",
- "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz",
- "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.2.0",
- "es-abstract": "^1.22.1",
- "get-intrinsic": "^1.2.1",
- "is-string": "^1.0.7"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/array-tree-filter": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/array-tree-filter/-/array-tree-filter-2.1.0.tgz",
- "integrity": "sha512-4ROwICNlNw/Hqa9v+rk5h22KjmzB1JGTMVKP2AKJBOCgb0yL0ASf0+YvCcLNNwquOHNX48jkeZIJ3a+oOQqKcw=="
- },
- "node_modules/array-union": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz",
- "integrity": "sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==",
- "dev": true,
- "dependencies": {
- "array-uniq": "^1.0.1"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/array-uniq": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz",
- "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/array-unique": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
- "integrity": "sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/array.prototype.findlastindex": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz",
- "integrity": "sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.2.0",
- "es-abstract": "^1.22.1",
- "es-shim-unscopables": "^1.0.0",
- "get-intrinsic": "^1.2.1"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/array.prototype.flat": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz",
- "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.2.0",
- "es-abstract": "^1.22.1",
- "es-shim-unscopables": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/array.prototype.flatmap": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz",
- "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.2.0",
- "es-abstract": "^1.22.1",
- "es-shim-unscopables": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/array.prototype.reduce": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.6.tgz",
- "integrity": "sha512-UW+Mz8LG/sPSU8jRDCjVr6J/ZKAGpHfwrZ6kWTG5qCxIEiXdVshqGnu5vEZA8S1y6X4aCSbQZ0/EEsfvEvBiSg==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.2.0",
- "es-abstract": "^1.22.1",
- "es-array-method-boxes-properly": "^1.0.0",
- "is-string": "^1.0.7"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/array.prototype.tosorted": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.2.tgz",
- "integrity": "sha512-HuQCHOlk1Weat5jzStICBCd83NxiIMwqDg/dHEsoefabn/hJRj5pVdWcPUSpRrwhwxZOsQassMpgN/xRYFBMIg==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.2.0",
- "es-abstract": "^1.22.1",
- "es-shim-unscopables": "^1.0.0",
- "get-intrinsic": "^1.2.1"
- }
- },
- "node_modules/arraybuffer.prototype.slice": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz",
- "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==",
- "dev": true,
- "dependencies": {
- "array-buffer-byte-length": "^1.0.0",
- "call-bind": "^1.0.2",
- "define-properties": "^1.2.0",
- "es-abstract": "^1.22.1",
- "get-intrinsic": "^1.2.1",
- "is-array-buffer": "^3.0.2",
- "is-shared-array-buffer": "^1.0.2"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/arrify": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
- "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/asap": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
- "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==",
- "dev": true
- },
- "node_modules/asn1": {
- "version": "0.2.6",
- "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz",
- "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==",
- "dev": true,
- "dependencies": {
- "safer-buffer": "~2.1.0"
- }
- },
- "node_modules/asn1.js": {
- "version": "5.4.1",
- "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz",
- "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==",
- "dev": true,
- "dependencies": {
- "bn.js": "^4.0.0",
- "inherits": "^2.0.1",
- "minimalistic-assert": "^1.0.0",
- "safer-buffer": "^2.1.0"
- }
- },
- "node_modules/asn1.js/node_modules/bn.js": {
- "version": "4.12.0",
- "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
- "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==",
- "dev": true
- },
- "node_modules/assert": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.1.tgz",
- "integrity": "sha512-zzw1uCAgLbsKwBfFc8CX78DDg+xZeBksSO3vwVIDDN5i94eOrPsSSyiVhmsSABFDM/OcpE2aagCat9dnWQLG1A==",
- "dev": true,
- "dependencies": {
- "object.assign": "^4.1.4",
- "util": "^0.10.4"
- }
- },
- "node_modules/assert-plus": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
- "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==",
- "dev": true,
- "engines": {
- "node": ">=0.8"
- }
- },
- "node_modules/assert/node_modules/inherits": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
- "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==",
- "dev": true
- },
- "node_modules/assert/node_modules/util": {
- "version": "0.10.4",
- "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz",
- "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==",
- "dev": true,
- "dependencies": {
- "inherits": "2.0.3"
- }
- },
- "node_modules/assertion-error": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz",
- "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==",
- "dev": true,
- "engines": {
- "node": "*"
- }
- },
- "node_modules/assign-symbols": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
- "integrity": "sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/ast-types": {
- "version": "0.13.4",
- "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz",
- "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==",
- "dev": true,
- "dependencies": {
- "tslib": "^2.0.1"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/astral-regex": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
- "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==",
- "dev": true,
- "optional": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/async": {
- "version": "3.2.5",
- "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz",
- "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==",
- "dev": true
- },
- "node_modules/async-each": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.6.tgz",
- "integrity": "sha512-c646jH1avxr+aVpndVMeAfYw7wAa6idufrlN3LPA4PmKS0QEGp6PIC9nwz0WQkkvBGAMEki3pFdtxaF39J9vvg==",
- "dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://paulmillr.com/funding/"
- }
- ]
- },
- "node_modules/async-exit-hook": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/async-exit-hook/-/async-exit-hook-2.0.1.tgz",
- "integrity": "sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw==",
- "dev": true,
- "engines": {
- "node": ">=0.12.0"
- }
- },
- "node_modules/async-limiter": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz",
- "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==",
- "dev": true
- },
- "node_modules/async-lock": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/async-lock/-/async-lock-1.4.1.tgz",
- "integrity": "sha512-Az2ZTpuytrtqENulXwO3GGv1Bztugx6TT37NIo7imr/Qo0gsYiGtSdBa2B6fsXhTpVZDNfu1Qn3pk531e3q+nQ==",
- "dev": true,
- "peer": true
- },
- "node_modules/async-validator": {
- "version": "4.2.5",
- "resolved": "https://registry.npmjs.org/async-validator/-/async-validator-4.2.5.tgz",
- "integrity": "sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg=="
- },
- "node_modules/asyncbox": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/asyncbox/-/asyncbox-3.0.0.tgz",
- "integrity": "sha512-X7U0nedUMKV3nn9c4R0Zgvdvv6cw97tbDlHSZicq1snGPi/oX9DgGmFSURWtxDdnBWd3V0YviKhqAYAVvoWQ/A==",
- "dev": true,
- "dependencies": {
- "bluebird": "^3.5.1",
- "lodash": "^4.17.4",
- "source-map-support": "^0.x"
- },
- "engines": {
- "node": ">=16"
- }
- },
- "node_modules/asynciterator.prototype": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz",
- "integrity": "sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==",
- "dev": true,
- "dependencies": {
- "has-symbols": "^1.0.3"
- }
- },
- "node_modules/asynckit": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
- "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
- },
- "node_modules/at-least-node": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz",
- "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==",
- "dev": true,
- "engines": {
- "node": ">= 4.0.0"
- }
- },
- "node_modules/atob": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz",
- "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==",
- "dev": true,
- "bin": {
- "atob": "bin/atob.js"
- },
- "engines": {
- "node": ">= 4.5.0"
- }
- },
- "node_modules/available-typed-arrays": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz",
- "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==",
- "dev": true,
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/aws-sign2": {
- "version": "0.7.0",
- "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
- "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==",
- "dev": true,
- "engines": {
- "node": "*"
- }
- },
- "node_modules/aws4": {
- "version": "1.12.0",
- "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz",
- "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==",
- "dev": true
- },
- "node_modules/axios": {
- "version": "1.6.7",
- "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.7.tgz",
- "integrity": "sha512-/hDJGff6/c7u0hDkvkGxR/oy6CbCs8ziCsC7SqmhjfozqiJGc8Z11wrv9z9lYfY4K8l+H9TpjcMDX0xOZmx+RA==",
- "dependencies": {
- "follow-redirects": "^1.15.4",
- "form-data": "^4.0.0",
- "proxy-from-env": "^1.1.0"
- }
- },
- "node_modules/b4a": {
- "version": "1.6.4",
- "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.4.tgz",
- "integrity": "sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw==",
- "dev": true
- },
- "node_modules/babel-plugin-polyfill-corejs2": {
- "version": "0.4.8",
- "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.8.tgz",
- "integrity": "sha512-OtIuQfafSzpo/LhnJaykc0R/MMnuLSSVjVYy9mHArIZ9qTCSZ6TpWCuEKZYVoN//t8HqBNScHrOtCrIK5IaGLg==",
- "dev": true,
- "dependencies": {
- "@babel/compat-data": "^7.22.6",
- "@babel/helper-define-polyfill-provider": "^0.5.0",
- "semver": "^6.3.1"
- },
- "peerDependencies": {
- "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
- }
- },
- "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": {
- "version": "6.3.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
- "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
- "dev": true,
- "bin": {
- "semver": "bin/semver.js"
- }
- },
- "node_modules/babel-plugin-polyfill-corejs3": {
- "version": "0.9.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.9.0.tgz",
- "integrity": "sha512-7nZPG1uzK2Ymhy/NbaOWTg3uibM2BmGASS4vHS4szRZAIR8R6GwA/xAujpdrXU5iyklrimWnLWU+BLF9suPTqg==",
- "dev": true,
- "dependencies": {
- "@babel/helper-define-polyfill-provider": "^0.5.0",
- "core-js-compat": "^3.34.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
- }
- },
- "node_modules/babel-plugin-polyfill-regenerator": {
- "version": "0.5.5",
- "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.5.tgz",
- "integrity": "sha512-OJGYZlhLqBh2DDHeqAxWB1XIvr49CxiJ2gIt61/PU55CQK4Z58OzMqjDe1zwQdQk+rBYsRc+1rJmdajM3gimHg==",
- "dev": true,
- "dependencies": {
- "@babel/helper-define-polyfill-provider": "^0.5.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
- }
- },
- "node_modules/babel-runtime": {
- "version": "6.26.0",
- "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
- "integrity": "sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==",
- "dev": true,
- "dependencies": {
- "core-js": "^2.4.0",
- "regenerator-runtime": "^0.11.0"
- }
- },
- "node_modules/babel-runtime/node_modules/regenerator-runtime": {
- "version": "0.11.1",
- "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
- "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==",
- "dev": true
- },
- "node_modules/babel-types": {
- "version": "6.26.0",
- "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
- "integrity": "sha512-zhe3V/26rCWsEZK8kZN+HaQj5yQ1CilTObixFzKW1UWjqG7618Twz6YEsCnjfg5gBcJh02DrpCkS9h98ZqDY+g==",
- "dev": true,
- "dependencies": {
- "babel-runtime": "^6.26.0",
- "esutils": "^2.0.2",
- "lodash": "^4.17.4",
- "to-fast-properties": "^1.0.3"
- }
- },
- "node_modules/babel-types/node_modules/to-fast-properties": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz",
- "integrity": "sha512-lxrWP8ejsq+7E3nNjwYmUBMAgjMTZoTI+sdBOpvNyijeDLa29LUn9QaoXAHv4+Z578hbmHHJKZknzxVtvo77og==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/babylon-walk": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/babylon-walk/-/babylon-walk-1.0.2.tgz",
- "integrity": "sha512-/AcxC8CZ6YzmKNfiH3+XLjJDbhED3qxSrd4uFNvJ91pcsPuwMNXxfjwHxhiYOidhpis0BiBu/gupOdv2EYyglg==",
- "dev": true,
- "dependencies": {
- "babel-runtime": "^6.11.6",
- "babel-types": "^6.15.0",
- "lodash.clone": "^4.5.0"
- }
- },
- "node_modules/balanced-match": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
- "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
- },
- "node_modules/base": {
- "version": "0.11.2",
- "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz",
- "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==",
- "dev": true,
- "dependencies": {
- "cache-base": "^1.0.1",
- "class-utils": "^0.3.5",
- "component-emitter": "^1.2.1",
- "define-property": "^1.0.0",
- "isobject": "^3.0.1",
- "mixin-deep": "^1.2.0",
- "pascalcase": "^0.1.1"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/base/node_modules/define-property": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
- "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==",
- "dev": true,
- "dependencies": {
- "is-descriptor": "^1.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/base64-js": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
- "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ]
- },
- "node_modules/base64-stream": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/base64-stream/-/base64-stream-1.0.0.tgz",
- "integrity": "sha512-BQQZftaO48FcE1Kof9CmXMFaAdqkcNorgc8CxesZv9nMbbTF1EFyQe89UOuh//QMmdtfUDXyO8rgUalemL5ODA==",
- "dev": true
- },
- "node_modules/basic-auth": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz",
- "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "safe-buffer": "5.1.2"
- },
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/basic-auth/node_modules/safe-buffer": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
- "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
- "dev": true,
- "peer": true
- },
- "node_modules/basic-ftp": {
- "version": "5.0.4",
- "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.4.tgz",
- "integrity": "sha512-8PzkB0arJFV4jJWSGOYR+OEic6aeKMu/osRhBULN6RY0ykby6LKhbmuQ5ublvaas5BOwboah5D87nrHyuh8PPA==",
- "dev": true,
- "engines": {
- "node": ">=10.0.0"
- }
- },
- "node_modules/bcrypt-pbkdf": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
- "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==",
- "dev": true,
- "dependencies": {
- "tweetnacl": "^0.14.3"
- }
- },
- "node_modules/big-integer": {
- "version": "1.6.52",
- "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz",
- "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==",
- "dev": true,
- "engines": {
- "node": ">=0.6"
- }
- },
- "node_modules/big.js": {
- "version": "5.2.2",
- "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz",
- "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==",
- "dev": true,
- "engines": {
- "node": "*"
- }
- },
- "node_modules/binary-extensions": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
- "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/bindings": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz",
- "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==",
- "dev": true,
- "dependencies": {
- "file-uri-to-path": "1.0.0"
- }
- },
- "node_modules/bl": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz",
- "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==",
- "dev": true,
- "dependencies": {
- "buffer": "^5.5.0",
- "inherits": "^2.0.4",
- "readable-stream": "^3.4.0"
- }
- },
- "node_modules/bluebird": {
- "version": "3.7.2",
- "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
- "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg=="
- },
- "node_modules/bluebird-lst": {
- "version": "1.0.9",
- "resolved": "https://registry.npmjs.org/bluebird-lst/-/bluebird-lst-1.0.9.tgz",
- "integrity": "sha512-7B1Rtx82hjnSD4PGLAjVWeYH3tHAcVUmChh85a3lltKQm6FresXh9ErQo6oAv6CqxttczC3/kEg8SY5NluPuUw==",
- "dev": true,
- "dependencies": {
- "bluebird": "^3.5.5"
- }
- },
- "node_modules/bn.js": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz",
- "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==",
- "dev": true
- },
- "node_modules/body-parser": {
- "version": "1.20.2",
- "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz",
- "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "bytes": "3.1.2",
- "content-type": "~1.0.5",
- "debug": "2.6.9",
- "depd": "2.0.0",
- "destroy": "1.2.0",
- "http-errors": "2.0.0",
- "iconv-lite": "0.4.24",
- "on-finished": "2.4.1",
- "qs": "6.11.0",
- "raw-body": "2.5.2",
- "type-is": "~1.6.18",
- "unpipe": "1.0.0"
- },
- "engines": {
- "node": ">= 0.8",
- "npm": "1.2.8000 || >= 1.4.16"
- }
- },
- "node_modules/body-parser/node_modules/debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "ms": "2.0.0"
- }
- },
- "node_modules/body-parser/node_modules/ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
- "dev": true,
- "peer": true
- },
- "node_modules/boolbase": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
- "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww=="
- },
- "node_modules/boolean": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz",
- "integrity": "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==",
- "optional": true
- },
- "node_modules/bplist-creator": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/bplist-creator/-/bplist-creator-0.1.1.tgz",
- "integrity": "sha512-Ese7052fdWrxp/vqSJkydgx/1MdBnNOCV2XVfbmdGWD2H6EYza+Q4pyYSuVSnCUD22hfI/BFI4jHaC3NLXLlJQ==",
- "dev": true,
- "dependencies": {
- "stream-buffers": "2.2.x"
- }
- },
- "node_modules/bplist-parser": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.2.tgz",
- "integrity": "sha512-apC2+fspHGI3mMKj+dGevkGo/tCqVB8jMb6i+OX+E29p0Iposz07fABkRIfVUPNd5A5VbuOz1bZbnmkKLYF+wQ==",
- "dev": true,
- "dependencies": {
- "big-integer": "1.6.x"
- },
- "engines": {
- "node": ">= 5.10.0"
- }
- },
- "node_modules/brace-expansion": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
- "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
- "dependencies": {
- "balanced-match": "^1.0.0"
- }
- },
- "node_modules/braces": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
- "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
- "dev": true,
- "dependencies": {
- "fill-range": "^7.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/brfs": {
- "version": "1.6.1",
- "resolved": "https://registry.npmjs.org/brfs/-/brfs-1.6.1.tgz",
- "integrity": "sha512-OfZpABRQQf+Xsmju8XE9bDjs+uU4vLREGolP7bDgcpsI17QREyZ4Bl+2KLxxx1kCgA0fAIhKQBaBYh+PEcCqYQ==",
- "dev": true,
- "dependencies": {
- "quote-stream": "^1.0.1",
- "resolve": "^1.1.5",
- "static-module": "^2.2.0",
- "through2": "^2.0.0"
- },
- "bin": {
- "brfs": "bin/cmd.js"
- }
- },
- "node_modules/brorand": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz",
- "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==",
- "dev": true
- },
- "node_modules/browser-process-hrtime": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz",
- "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==",
- "dev": true
- },
- "node_modules/browser-stdout": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz",
- "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==",
- "dev": true
- },
- "node_modules/browserify-aes": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz",
- "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==",
- "dev": true,
- "dependencies": {
- "buffer-xor": "^1.0.3",
- "cipher-base": "^1.0.0",
- "create-hash": "^1.1.0",
- "evp_bytestokey": "^1.0.3",
- "inherits": "^2.0.1",
- "safe-buffer": "^5.0.1"
- }
- },
- "node_modules/browserify-cipher": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz",
- "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==",
- "dev": true,
- "dependencies": {
- "browserify-aes": "^1.0.4",
- "browserify-des": "^1.0.0",
- "evp_bytestokey": "^1.0.0"
- }
- },
- "node_modules/browserify-des": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz",
- "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==",
- "dev": true,
- "dependencies": {
- "cipher-base": "^1.0.1",
- "des.js": "^1.0.0",
- "inherits": "^2.0.1",
- "safe-buffer": "^5.1.2"
- }
- },
- "node_modules/browserify-rsa": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz",
- "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==",
- "dev": true,
- "dependencies": {
- "bn.js": "^5.0.0",
- "randombytes": "^2.0.1"
- }
- },
- "node_modules/browserify-sign": {
- "version": "4.2.2",
- "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.2.tgz",
- "integrity": "sha512-1rudGyeYY42Dk6texmv7c4VcQ0EsvVbLwZkA+AQB7SxvXxmcD93jcHie8bzecJ+ChDlmAm2Qyu0+Ccg5uhZXCg==",
- "dev": true,
- "dependencies": {
- "bn.js": "^5.2.1",
- "browserify-rsa": "^4.1.0",
- "create-hash": "^1.2.0",
- "create-hmac": "^1.1.7",
- "elliptic": "^6.5.4",
- "inherits": "^2.0.4",
- "parse-asn1": "^5.1.6",
- "readable-stream": "^3.6.2",
- "safe-buffer": "^5.2.1"
- },
- "engines": {
- "node": ">= 4"
- }
- },
- "node_modules/browserify-zlib": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz",
- "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==",
- "dev": true,
- "dependencies": {
- "pako": "~1.0.5"
- }
- },
- "node_modules/browserslist": {
- "version": "4.22.2",
- "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz",
- "integrity": "sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==",
- "dev": true,
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/browserslist"
- },
- {
- "type": "tidelift",
- "url": "https://tidelift.com/funding/github/npm/browserslist"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
- "dependencies": {
- "caniuse-lite": "^1.0.30001565",
- "electron-to-chromium": "^1.4.601",
- "node-releases": "^2.0.14",
- "update-browserslist-db": "^1.0.13"
- },
- "bin": {
- "browserslist": "cli.js"
- },
- "engines": {
- "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
- }
- },
- "node_modules/buffer": {
- "version": "5.7.1",
- "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
- "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ],
- "dependencies": {
- "base64-js": "^1.3.1",
- "ieee754": "^1.1.13"
- }
- },
- "node_modules/buffer-crc32": {
- "version": "0.2.13",
- "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
- "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==",
- "engines": {
- "node": "*"
- }
- },
- "node_modules/buffer-equal": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.1.tgz",
- "integrity": "sha512-QoV3ptgEaQpvVwbXdSO39iqPQTCxSF7A5U99AxbHYqUdCizL/lH2Z0A2y6nbZucxMEOtNyZfG2s6gsVugGpKkg==",
- "dev": true,
- "engines": {
- "node": ">=0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/buffer-from": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
- "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="
- },
- "node_modules/buffer-xor": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz",
- "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==",
- "dev": true
- },
- "node_modules/builder-util": {
- "version": "24.9.4",
- "resolved": "https://registry.npmjs.org/builder-util/-/builder-util-24.9.4.tgz",
- "integrity": "sha512-YNon3rYjPSm4XDDho9wD6jq7vLRJZUy9FR+yFZnHoWvvdVCnZakL4BctTlPABP41MvIH5yk2cTZ2YfkOhGistQ==",
- "dev": true,
- "dependencies": {
- "@types/debug": "^4.1.6",
- "7zip-bin": "~5.2.0",
- "app-builder-bin": "4.0.0",
- "bluebird-lst": "^1.0.9",
- "builder-util-runtime": "9.2.3",
- "chalk": "^4.1.2",
- "cross-spawn": "^7.0.3",
- "debug": "^4.3.4",
- "fs-extra": "^10.1.0",
- "http-proxy-agent": "^5.0.0",
- "https-proxy-agent": "^5.0.1",
- "is-ci": "^3.0.0",
- "js-yaml": "^4.1.0",
- "source-map-support": "^0.5.19",
- "stat-mode": "^1.0.0",
- "temp-file": "^3.4.0"
- }
- },
- "node_modules/builder-util-runtime": {
- "version": "9.2.3",
- "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.2.3.tgz",
- "integrity": "sha512-FGhkqXdFFZ5dNC4C+yuQB9ak311rpGAw+/ASz8ZdxwODCv1GGMWgLDeofRkdi0F3VCHQEWy/aXcJQozx2nOPiw==",
- "dependencies": {
- "debug": "^4.3.4",
- "sax": "^1.2.4"
- },
- "engines": {
- "node": ">=12.0.0"
- }
- },
- "node_modules/builder-util/node_modules/ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "dev": true,
- "dependencies": {
- "color-convert": "^2.0.1"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/builder-util/node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "dev": true,
- "dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
- }
- },
- "node_modules/builder-util/node_modules/color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
- "dev": true,
- "dependencies": {
- "color-name": "~1.1.4"
- },
- "engines": {
- "node": ">=7.0.0"
- }
- },
- "node_modules/builder-util/node_modules/color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "dev": true
- },
- "node_modules/builder-util/node_modules/cross-spawn": {
- "version": "7.0.3",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
- "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
- "dev": true,
- "dependencies": {
- "path-key": "^3.1.0",
- "shebang-command": "^2.0.0",
- "which": "^2.0.1"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/builder-util/node_modules/fs-extra": {
- "version": "10.1.0",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz",
- "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==",
- "dev": true,
- "dependencies": {
- "graceful-fs": "^4.2.0",
- "jsonfile": "^6.0.1",
- "universalify": "^2.0.0"
- },
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/builder-util/node_modules/isexe": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
- "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
- "dev": true
- },
- "node_modules/builder-util/node_modules/jsonfile": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
- "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
- "dev": true,
- "dependencies": {
- "universalify": "^2.0.0"
- },
- "optionalDependencies": {
- "graceful-fs": "^4.1.6"
- }
- },
- "node_modules/builder-util/node_modules/shebang-command": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
- "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
- "dev": true,
- "dependencies": {
- "shebang-regex": "^3.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/builder-util/node_modules/shebang-regex": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
- "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/builder-util/node_modules/supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
- "dev": true,
- "dependencies": {
- "has-flag": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/builder-util/node_modules/universalify": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
- "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
- "dev": true,
- "engines": {
- "node": ">= 10.0.0"
- }
- },
- "node_modules/builder-util/node_modules/which": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
- "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
- "dev": true,
- "dependencies": {
- "isexe": "^2.0.0"
- },
- "bin": {
- "node-which": "bin/node-which"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/builtin-status-codes": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz",
- "integrity": "sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==",
- "dev": true
- },
- "node_modules/bytes": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
- "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/cache-base": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz",
- "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==",
- "dev": true,
- "dependencies": {
- "collection-visit": "^1.0.0",
- "component-emitter": "^1.2.1",
- "get-value": "^2.0.6",
- "has-value": "^1.0.0",
- "isobject": "^3.0.1",
- "set-value": "^2.0.0",
- "to-object-path": "^0.3.0",
- "union-value": "^1.0.0",
- "unset-value": "^1.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/cacheable-lookup": {
- "version": "5.0.4",
- "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz",
- "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==",
- "engines": {
- "node": ">=10.6.0"
- }
- },
- "node_modules/cacheable-request": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz",
- "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==",
- "dependencies": {
- "clone-response": "^1.0.2",
- "get-stream": "^5.1.0",
- "http-cache-semantics": "^4.0.0",
- "keyv": "^3.0.0",
- "lowercase-keys": "^2.0.0",
- "normalize-url": "^4.1.0",
- "responselike": "^1.0.2"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/cacheable-request/node_modules/get-stream": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
- "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
- "dependencies": {
- "pump": "^3.0.0"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/cacheable-request/node_modules/json-buffer": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz",
- "integrity": "sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ=="
- },
- "node_modules/cacheable-request/node_modules/keyv": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz",
- "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==",
- "dependencies": {
- "json-buffer": "3.0.0"
- }
- },
- "node_modules/cacheable-request/node_modules/lowercase-keys": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz",
- "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/call-bind": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz",
- "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==",
- "dev": true,
- "dependencies": {
- "function-bind": "^1.1.2",
- "get-intrinsic": "^1.2.1",
- "set-function-length": "^1.1.1"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/call-me-maybe": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.2.tgz",
- "integrity": "sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==",
- "dev": true
- },
- "node_modules/caller-callsite": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz",
- "integrity": "sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ==",
- "dev": true,
- "dependencies": {
- "callsites": "^2.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/caller-callsite/node_modules/callsites": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz",
- "integrity": "sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ==",
- "dev": true,
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/caller-path": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz",
- "integrity": "sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A==",
- "dev": true,
- "dependencies": {
- "caller-callsite": "^2.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/callsites": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
- "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
- "dev": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/camelcase": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz",
- "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
- "dev": true,
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/caniuse-api": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz",
- "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==",
- "dev": true,
- "dependencies": {
- "browserslist": "^4.0.0",
- "caniuse-lite": "^1.0.0",
- "lodash.memoize": "^4.1.2",
- "lodash.uniq": "^4.5.0"
- }
- },
- "node_modules/caniuse-lite": {
- "version": "1.0.30001570",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001570.tgz",
- "integrity": "sha512-+3e0ASu4sw1SWaoCtvPeyXp+5PsjigkSt8OXZbF9StH5pQWbxEjLAZE3n8Aup5udop1uRiKA7a4utUk/uoSpUw==",
- "dev": true,
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/browserslist"
- },
- {
- "type": "tidelift",
- "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ]
- },
- "node_modules/caseless": {
- "version": "0.12.0",
- "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
- "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==",
- "dev": true
- },
- "node_modules/chai": {
- "version": "4.4.1",
- "resolved": "https://registry.npmjs.org/chai/-/chai-4.4.1.tgz",
- "integrity": "sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==",
- "dev": true,
- "dependencies": {
- "assertion-error": "^1.1.0",
- "check-error": "^1.0.3",
- "deep-eql": "^4.1.3",
- "get-func-name": "^2.0.2",
- "loupe": "^2.3.6",
- "pathval": "^1.1.1",
- "type-detect": "^4.0.8"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/chai-as-promised": {
- "version": "7.1.1",
- "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-7.1.1.tgz",
- "integrity": "sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==",
- "dev": true,
- "dependencies": {
- "check-error": "^1.0.2"
- },
- "peerDependencies": {
- "chai": ">= 2.1.2 < 5"
- }
- },
- "node_modules/chalk": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
- "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
- "dev": true,
- "dependencies": {
- "ansi-styles": "^3.2.1",
- "escape-string-regexp": "^1.0.5",
- "supports-color": "^5.3.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/chalk/node_modules/has-flag": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
- "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
- "dev": true,
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/chalk/node_modules/supports-color": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
- "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
- "dev": true,
- "dependencies": {
- "has-flag": "^3.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/charenc": {
- "version": "0.0.2",
- "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz",
- "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==",
- "dev": true,
- "engines": {
- "node": "*"
- }
- },
- "node_modules/check-engines": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/check-engines/-/check-engines-1.6.0.tgz",
- "integrity": "sha512-ZnpTC/GW4f7lmqbI5tIzHdH3t3tMkqBtKfgR4FoJgpTlWuh4GYONgeBOu78TpnjAB19YCG25ncBYky/X9OzmRA==",
- "dev": true,
- "dependencies": {
- "cross-spawn": "^5.0.1",
- "semver": ">=4.3.6"
- },
- "bin": {
- "check-engines": "bin/check-engines"
- }
- },
- "node_modules/check-error": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz",
- "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==",
- "dev": true,
- "dependencies": {
- "get-func-name": "^2.0.2"
- },
- "engines": {
- "node": "*"
- }
- },
- "node_modules/cheerio": {
- "version": "1.0.0-rc.10",
- "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.10.tgz",
- "integrity": "sha512-g0J0q/O6mW8z5zxQ3A8E8J1hUgp4SMOvEoW/x84OwyHKe/Zccz83PVT4y5Crcr530FV6NgmKI1qvGTKVl9XXVw==",
- "dependencies": {
- "cheerio-select": "^1.5.0",
- "dom-serializer": "^1.3.2",
- "domhandler": "^4.2.0",
- "htmlparser2": "^6.1.0",
- "parse5": "^6.0.1",
- "parse5-htmlparser2-tree-adapter": "^6.0.1",
- "tslib": "^2.2.0"
- },
- "engines": {
- "node": ">= 6"
- },
- "funding": {
- "url": "https://github.com/cheeriojs/cheerio?sponsor=1"
- }
- },
- "node_modules/cheerio-select": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-1.6.0.tgz",
- "integrity": "sha512-eq0GdBvxVFbqWgmCm7M3XGs1I8oLy/nExUnh6oLqmBditPO9AqQJrkslDpMun/hZ0yyTs8L0m85OHp4ho6Qm9g==",
- "dependencies": {
- "css-select": "^4.3.0",
- "css-what": "^6.0.1",
- "domelementtype": "^2.2.0",
- "domhandler": "^4.3.1",
- "domutils": "^2.8.0"
- },
- "funding": {
- "url": "https://github.com/sponsors/fb55"
- }
- },
- "node_modules/cheerio/node_modules/htmlparser2": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz",
- "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==",
- "funding": [
- "https://github.com/fb55/htmlparser2?sponsor=1",
- {
- "type": "github",
- "url": "https://github.com/sponsors/fb55"
- }
- ],
- "dependencies": {
- "domelementtype": "^2.0.1",
- "domhandler": "^4.0.0",
- "domutils": "^2.5.2",
- "entities": "^2.0.0"
- }
- },
- "node_modules/chokidar": {
- "version": "3.5.3",
- "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
- "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
- "dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://paulmillr.com/funding/"
- }
- ],
- "dependencies": {
- "anymatch": "~3.1.2",
- "braces": "~3.0.2",
- "glob-parent": "~5.1.2",
- "is-binary-path": "~2.1.0",
- "is-glob": "~4.0.1",
- "normalize-path": "~3.0.0",
- "readdirp": "~3.6.0"
- },
- "engines": {
- "node": ">= 8.10.0"
- },
- "optionalDependencies": {
- "fsevents": "~2.3.2"
- }
- },
- "node_modules/chokidar/node_modules/glob-parent": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
- "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
- "dev": true,
- "dependencies": {
- "is-glob": "^4.0.1"
- },
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/chownr": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz",
- "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==",
- "dev": true,
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/chrome-launcher": {
- "version": "0.13.4",
- "resolved": "https://registry.npmjs.org/chrome-launcher/-/chrome-launcher-0.13.4.tgz",
- "integrity": "sha512-nnzXiDbGKjDSK6t2I+35OAPBy5Pw/39bgkb/ZAFwMhwJbdYBp6aH+vW28ZgtjdU890Q7D+3wN/tB8N66q5Gi2A==",
- "dev": true,
- "dependencies": {
- "@types/node": "*",
- "escape-string-regexp": "^1.0.5",
- "is-wsl": "^2.2.0",
- "lighthouse-logger": "^1.0.0",
- "mkdirp": "^0.5.3",
- "rimraf": "^3.0.2"
- }
- },
- "node_modules/chrome-launcher/node_modules/brace-expansion": {
- "version": "1.1.11",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
- "dev": true,
- "dependencies": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
- }
- },
- "node_modules/chrome-launcher/node_modules/glob": {
- "version": "7.2.3",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
- "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
- "dev": true,
- "dependencies": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.1.1",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
- },
- "engines": {
- "node": "*"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/chrome-launcher/node_modules/is-wsl": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz",
- "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==",
- "dev": true,
- "dependencies": {
- "is-docker": "^2.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/chrome-launcher/node_modules/minimatch": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
- "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
- "dev": true,
- "dependencies": {
- "brace-expansion": "^1.1.7"
- },
- "engines": {
- "node": "*"
- }
- },
- "node_modules/chrome-launcher/node_modules/mkdirp": {
- "version": "0.5.6",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz",
- "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
- "dev": true,
- "dependencies": {
- "minimist": "^1.2.6"
- },
- "bin": {
- "mkdirp": "bin/cmd.js"
- }
- },
- "node_modules/chrome-launcher/node_modules/rimraf": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
- "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
- "dev": true,
- "dependencies": {
- "glob": "^7.1.3"
- },
- "bin": {
- "rimraf": "bin.js"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/chromium-bidi": {
- "version": "0.5.1",
- "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.5.1.tgz",
- "integrity": "sha512-dcCqOgq9fHKExc2R4JZs/oKbOghWpUNFAJODS8WKRtLhp3avtIH5UDCBrutdqZdh3pARogH8y1ObXm87emwb3g==",
- "dev": true,
- "dependencies": {
- "mitt": "3.0.1",
- "urlpattern-polyfill": "9.0.0"
- },
- "peerDependencies": {
- "devtools-protocol": "*"
- }
- },
- "node_modules/chromium-pickle-js": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz",
- "integrity": "sha512-1R5Fho+jBq0DDydt+/vHWj5KJNJCKdARKOCwZUen84I5BreWoLqRLANH1U87eJy1tiASPtMnGqJJq0ZsLoRPOw==",
- "dev": true
- },
- "node_modules/ci-info": {
- "version": "3.9.0",
- "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz",
- "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/sibiraj-s"
- }
- ],
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/cipher-base": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz",
- "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==",
- "dev": true,
- "dependencies": {
- "inherits": "^2.0.1",
- "safe-buffer": "^5.0.1"
- }
- },
- "node_modules/class-utils": {
- "version": "0.3.6",
- "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz",
- "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==",
- "dev": true,
- "dependencies": {
- "arr-union": "^3.1.0",
- "define-property": "^0.2.5",
- "isobject": "^3.0.0",
- "static-extend": "^0.1.1"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/class-utils/node_modules/define-property": {
- "version": "0.2.5",
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
- "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==",
- "dev": true,
- "dependencies": {
- "is-descriptor": "^0.1.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/class-utils/node_modules/is-descriptor": {
- "version": "0.1.7",
- "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.7.tgz",
- "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==",
- "dev": true,
- "dependencies": {
- "is-accessor-descriptor": "^1.0.1",
- "is-data-descriptor": "^1.0.1"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/classnames": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz",
- "integrity": "sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw=="
- },
- "node_modules/cli-cursor": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz",
- "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "restore-cursor": "^3.1.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/cli-spinners": {
- "version": "2.9.2",
- "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz",
- "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">=6"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/cli-truncate": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz",
- "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==",
- "dev": true,
- "optional": true,
- "dependencies": {
- "slice-ansi": "^3.0.0",
- "string-width": "^4.2.0"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/cliui": {
- "version": "8.0.1",
- "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
- "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
- "dev": true,
- "dependencies": {
- "string-width": "^4.2.0",
- "strip-ansi": "^6.0.1",
- "wrap-ansi": "^7.0.0"
- },
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/clone": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
- "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==",
- "dev": true,
- "engines": {
- "node": ">=0.8"
- }
- },
- "node_modules/clone-deep": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz",
- "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==",
- "dev": true,
- "dependencies": {
- "is-plain-object": "^2.0.4",
- "kind-of": "^6.0.2",
- "shallow-clone": "^3.0.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/clone-response": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz",
- "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==",
- "dependencies": {
- "mimic-response": "^1.0.0"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/coa": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz",
- "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==",
- "dev": true,
- "dependencies": {
- "@types/q": "^1.5.1",
- "chalk": "^2.4.1",
- "q": "^1.1.2"
- },
- "engines": {
- "node": ">= 4.0"
- }
- },
- "node_modules/collection-visit": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
- "integrity": "sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==",
- "dev": true,
- "dependencies": {
- "map-visit": "^1.0.0",
- "object-visit": "^1.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/color": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz",
- "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==",
- "dev": true,
- "dependencies": {
- "color-convert": "^1.9.3",
- "color-string": "^1.6.0"
- }
- },
- "node_modules/color-convert": {
- "version": "1.9.3",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
- "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
- "dev": true,
- "dependencies": {
- "color-name": "1.1.3"
- }
- },
- "node_modules/color-name": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
- "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
- "dev": true
- },
- "node_modules/color-string": {
- "version": "1.9.1",
- "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz",
- "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==",
- "dev": true,
- "dependencies": {
- "color-name": "^1.0.0",
- "simple-swizzle": "^0.2.2"
- }
- },
- "node_modules/color-support": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz",
- "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==",
- "dev": true,
- "bin": {
- "color-support": "bin.js"
- }
- },
- "node_modules/colorspace": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz",
- "integrity": "sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "color": "^3.1.3",
- "text-hex": "1.0.x"
- }
- },
- "node_modules/combined-stream": {
- "version": "1.0.8",
- "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
- "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
- "dependencies": {
- "delayed-stream": "~1.0.0"
- },
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/command-exists": {
- "version": "1.2.9",
- "resolved": "https://registry.npmjs.org/command-exists/-/command-exists-1.2.9.tgz",
- "integrity": "sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==",
- "dev": true
- },
- "node_modules/commander": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz",
- "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==",
- "dev": true,
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/commondir": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
- "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==",
- "dev": true
- },
- "node_modules/compare-version": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/compare-version/-/compare-version-0.1.2.tgz",
- "integrity": "sha512-pJDh5/4wrEnXX/VWRZvruAGHkzKdr46z11OlTPN+VrATlWWhSKewNCJ1futCO5C7eJB3nPMFZA1LeYtcFboZ2A==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/component-emitter": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.1.tgz",
- "integrity": "sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==",
- "dev": true,
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/compress-commons": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-5.0.1.tgz",
- "integrity": "sha512-MPh//1cERdLtqwO3pOFLeXtpuai0Y2WCd5AhtKxznqM7WtaMYaOEMSgn45d9D10sIHSfIKE603HlOp8OPGrvag==",
- "dev": true,
- "dependencies": {
- "crc-32": "^1.2.0",
- "crc32-stream": "^5.0.0",
- "normalize-path": "^3.0.0",
- "readable-stream": "^3.6.0"
- },
- "engines": {
- "node": ">= 12.0.0"
- }
- },
- "node_modules/compute-scroll-into-view": {
- "version": "1.0.20",
- "resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-1.0.20.tgz",
- "integrity": "sha512-UCB0ioiyj8CRjtrvaceBLqqhZCVP+1B8+NWQhmdsm0VXOJtobBCf1dBQmebCCo34qZmUwZfIH2MZLqNHazrfjg=="
- },
- "node_modules/concat-map": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
- "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
- "dev": true
- },
- "node_modules/concat-stream": {
- "version": "1.6.2",
- "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
- "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
- "engines": [
- "node >= 0.8"
- ],
- "dependencies": {
- "buffer-from": "^1.0.0",
- "inherits": "^2.0.3",
- "readable-stream": "^2.2.2",
- "typedarray": "^0.0.6"
- }
- },
- "node_modules/concat-stream/node_modules/isarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
- "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="
- },
- "node_modules/concat-stream/node_modules/readable-stream": {
- "version": "2.3.8",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
- "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
- "dependencies": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.3",
- "isarray": "~1.0.0",
- "process-nextick-args": "~2.0.0",
- "safe-buffer": "~5.1.1",
- "string_decoder": "~1.1.1",
- "util-deprecate": "~1.0.1"
- }
- },
- "node_modules/concat-stream/node_modules/safe-buffer": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
- "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
- },
- "node_modules/concat-stream/node_modules/string_decoder": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
- "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
- "dependencies": {
- "safe-buffer": "~5.1.0"
- }
- },
- "node_modules/concurrently": {
- "version": "8.2.2",
- "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-8.2.2.tgz",
- "integrity": "sha512-1dP4gpXFhei8IOtlXRE/T/4H88ElHgTiUzh71YUmtjTEHMSRS2Z/fgOxHSxxusGHogsRfxNq1vyAwxSC+EVyDg==",
- "dev": true,
- "dependencies": {
- "chalk": "^4.1.2",
- "date-fns": "^2.30.0",
- "lodash": "^4.17.21",
- "rxjs": "^7.8.1",
- "shell-quote": "^1.8.1",
- "spawn-command": "0.0.2",
- "supports-color": "^8.1.1",
- "tree-kill": "^1.2.2",
- "yargs": "^17.7.2"
- },
- "bin": {
- "conc": "dist/bin/concurrently.js",
- "concurrently": "dist/bin/concurrently.js"
- },
- "engines": {
- "node": "^14.13.0 || >=16.0.0"
- },
- "funding": {
- "url": "https://github.com/open-cli-tools/concurrently?sponsor=1"
- }
- },
- "node_modules/concurrently/node_modules/ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "dev": true,
- "dependencies": {
- "color-convert": "^2.0.1"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/concurrently/node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "dev": true,
- "dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
- }
- },
- "node_modules/concurrently/node_modules/chalk/node_modules/supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
- "dev": true,
- "dependencies": {
- "has-flag": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/concurrently/node_modules/color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
- "dev": true,
- "dependencies": {
- "color-name": "~1.1.4"
- },
- "engines": {
- "node": ">=7.0.0"
- }
- },
- "node_modules/concurrently/node_modules/color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "dev": true
- },
- "node_modules/config-chain": {
- "version": "1.1.13",
- "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz",
- "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==",
- "optional": true,
- "dependencies": {
- "ini": "^1.3.4",
- "proto-list": "~1.2.1"
- }
- },
- "node_modules/config-file-ts": {
- "version": "0.2.4",
- "resolved": "https://registry.npmjs.org/config-file-ts/-/config-file-ts-0.2.4.tgz",
- "integrity": "sha512-cKSW0BfrSaAUnxpgvpXPLaaW/umg4bqg4k3GO1JqlRfpx+d5W0GDXznCMkWotJQek5Mmz1MJVChQnz3IVaeMZQ==",
- "dev": true,
- "dependencies": {
- "glob": "^7.1.6",
- "typescript": "^4.0.2"
- }
- },
- "node_modules/config-file-ts/node_modules/brace-expansion": {
- "version": "1.1.11",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
- "dev": true,
- "dependencies": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
- }
- },
- "node_modules/config-file-ts/node_modules/glob": {
- "version": "7.2.3",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
- "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
- "dev": true,
- "dependencies": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.1.1",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
- },
- "engines": {
- "node": "*"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/config-file-ts/node_modules/minimatch": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
- "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
- "dev": true,
- "dependencies": {
- "brace-expansion": "^1.1.7"
- },
- "engines": {
- "node": "*"
- }
- },
- "node_modules/config-file-ts/node_modules/typescript": {
- "version": "4.9.5",
- "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz",
- "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==",
- "dev": true,
- "bin": {
- "tsc": "bin/tsc",
- "tsserver": "bin/tsserver"
- },
- "engines": {
- "node": ">=4.2.0"
- }
- },
- "node_modules/consola": {
- "version": "3.2.3",
- "resolved": "https://registry.npmjs.org/consola/-/consola-3.2.3.tgz",
- "integrity": "sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==",
- "dev": true,
- "engines": {
- "node": "^14.18.0 || >=16.10.0"
- }
- },
- "node_modules/console-browserify": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz",
- "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==",
- "dev": true
- },
- "node_modules/console-control-strings": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
- "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==",
- "dev": true
- },
- "node_modules/constants-browserify": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz",
- "integrity": "sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==",
- "dev": true
- },
- "node_modules/content-disposition": {
- "version": "0.5.4",
- "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
- "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "safe-buffer": "5.2.1"
- },
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/content-type": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
- "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/convert-source-map": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
- "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
- "dev": true
- },
- "node_modules/cookie": {
- "version": "0.5.0",
- "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz",
- "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/cookie-signature": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
- "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==",
- "dev": true,
- "peer": true
- },
- "node_modules/copy-anything": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.6.tgz",
- "integrity": "sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==",
- "dev": true,
- "dependencies": {
- "is-what": "^3.14.1"
- },
- "funding": {
- "url": "https://github.com/sponsors/mesqueeb"
- }
- },
- "node_modules/copy-descriptor": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
- "integrity": "sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/copy-to-clipboard": {
- "version": "3.3.3",
- "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz",
- "integrity": "sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==",
- "dependencies": {
- "toggle-selection": "^1.0.6"
- }
- },
- "node_modules/core-js": {
- "version": "2.6.12",
- "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz",
- "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==",
- "deprecated": "core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.",
- "dev": true,
- "hasInstallScript": true
- },
- "node_modules/core-js-compat": {
- "version": "3.34.0",
- "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.34.0.tgz",
- "integrity": "sha512-4ZIyeNbW/Cn1wkMMDy+mvrRUxrwFNjKwbhCfQpDd+eLgYipDqp8oGFGtLmhh18EDPKA0g3VUBYOxQGGwvWLVpA==",
- "dev": true,
- "dependencies": {
- "browserslist": "^4.22.2"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/core-js"
- }
- },
- "node_modules/core-util-is": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
- "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ=="
- },
- "node_modules/cosmiconfig": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz",
- "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==",
- "dev": true,
- "dependencies": {
- "import-fresh": "^2.0.0",
- "is-directory": "^0.3.1",
- "js-yaml": "^3.13.1",
- "parse-json": "^4.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/cosmiconfig/node_modules/argparse": {
- "version": "1.0.10",
- "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
- "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
- "dev": true,
- "dependencies": {
- "sprintf-js": "~1.0.2"
- }
- },
- "node_modules/cosmiconfig/node_modules/esprima": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
- "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
- "dev": true,
- "bin": {
- "esparse": "bin/esparse.js",
- "esvalidate": "bin/esvalidate.js"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/cosmiconfig/node_modules/import-fresh": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz",
- "integrity": "sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg==",
- "dev": true,
- "dependencies": {
- "caller-path": "^2.0.0",
- "resolve-from": "^3.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/cosmiconfig/node_modules/js-yaml": {
- "version": "3.14.1",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
- "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
- "dev": true,
- "dependencies": {
- "argparse": "^1.0.7",
- "esprima": "^4.0.0"
- },
- "bin": {
- "js-yaml": "bin/js-yaml.js"
- }
- },
- "node_modules/cosmiconfig/node_modules/resolve-from": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz",
- "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==",
- "dev": true,
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/cosmiconfig/node_modules/sprintf-js": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
- "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==",
- "dev": true
- },
- "node_modules/crc": {
- "version": "3.8.0",
- "resolved": "https://registry.npmjs.org/crc/-/crc-3.8.0.tgz",
- "integrity": "sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==",
- "dev": true,
- "optional": true,
- "dependencies": {
- "buffer": "^5.1.0"
- }
- },
- "node_modules/crc-32": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz",
- "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==",
- "dev": true,
- "bin": {
- "crc32": "bin/crc32.njs"
- },
- "engines": {
- "node": ">=0.8"
- }
- },
- "node_modules/crc32-stream": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-5.0.0.tgz",
- "integrity": "sha512-B0EPa1UK+qnpBZpG+7FgPCu0J2ETLpXq09o9BkLkEAhdB6Z61Qo4pJ3JYu0c+Qi+/SAL7QThqnzS06pmSSyZaw==",
- "dev": true,
- "dependencies": {
- "crc-32": "^1.2.0",
- "readable-stream": "^3.4.0"
- },
- "engines": {
- "node": ">= 12.0.0"
- }
- },
- "node_modules/create-ecdh": {
- "version": "4.0.4",
- "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz",
- "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==",
- "dev": true,
- "dependencies": {
- "bn.js": "^4.1.0",
- "elliptic": "^6.5.3"
- }
- },
- "node_modules/create-ecdh/node_modules/bn.js": {
- "version": "4.12.0",
- "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
- "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==",
- "dev": true
- },
- "node_modules/create-hash": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz",
- "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==",
- "dev": true,
- "dependencies": {
- "cipher-base": "^1.0.1",
- "inherits": "^2.0.1",
- "md5.js": "^1.3.4",
- "ripemd160": "^2.0.1",
- "sha.js": "^2.4.0"
- }
- },
- "node_modules/create-hmac": {
- "version": "1.1.7",
- "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz",
- "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==",
- "dev": true,
- "dependencies": {
- "cipher-base": "^1.0.3",
- "create-hash": "^1.1.0",
- "inherits": "^2.0.1",
- "ripemd160": "^2.0.0",
- "safe-buffer": "^5.0.1",
- "sha.js": "^2.4.8"
- }
- },
- "node_modules/create-require": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz",
- "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==",
- "dev": true
- },
- "node_modules/cross-env": {
- "version": "7.0.3",
- "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz",
- "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==",
- "dev": true,
- "dependencies": {
- "cross-spawn": "^7.0.1"
- },
- "bin": {
- "cross-env": "src/bin/cross-env.js",
- "cross-env-shell": "src/bin/cross-env-shell.js"
- },
- "engines": {
- "node": ">=10.14",
- "npm": ">=6",
- "yarn": ">=1"
- }
- },
- "node_modules/cross-env/node_modules/cross-spawn": {
- "version": "7.0.3",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
- "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
- "dev": true,
- "dependencies": {
- "path-key": "^3.1.0",
- "shebang-command": "^2.0.0",
- "which": "^2.0.1"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/cross-env/node_modules/isexe": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
- "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
- "dev": true
- },
- "node_modules/cross-env/node_modules/shebang-command": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
- "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
- "dev": true,
- "dependencies": {
- "shebang-regex": "^3.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/cross-env/node_modules/shebang-regex": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
- "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/cross-env/node_modules/which": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
- "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
- "dev": true,
- "dependencies": {
- "isexe": "^2.0.0"
- },
- "bin": {
- "node-which": "bin/node-which"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/cross-fetch": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz",
- "integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==",
- "dependencies": {
- "node-fetch": "^2.6.12"
- }
- },
- "node_modules/cross-spawn": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz",
- "integrity": "sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==",
- "dev": true,
- "dependencies": {
- "lru-cache": "^4.0.1",
- "shebang-command": "^1.2.0",
- "which": "^1.2.9"
- }
- },
- "node_modules/cross-spawn/node_modules/isexe": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
- "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
- "dev": true
- },
- "node_modules/cross-spawn/node_modules/lru-cache": {
- "version": "4.1.5",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz",
- "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==",
- "dev": true,
- "dependencies": {
- "pseudomap": "^1.0.2",
- "yallist": "^2.1.2"
- }
- },
- "node_modules/cross-spawn/node_modules/which": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
- "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
- "dev": true,
- "dependencies": {
- "isexe": "^2.0.0"
- },
- "bin": {
- "which": "bin/which"
- }
- },
- "node_modules/cross-spawn/node_modules/yallist": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
- "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==",
- "dev": true
- },
- "node_modules/crypt": {
- "version": "0.0.2",
- "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz",
- "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==",
- "dev": true,
- "engines": {
- "node": "*"
- }
- },
- "node_modules/crypto-browserify": {
- "version": "3.12.0",
- "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz",
- "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==",
- "dev": true,
- "dependencies": {
- "browserify-cipher": "^1.0.0",
- "browserify-sign": "^4.0.0",
- "create-ecdh": "^4.0.0",
- "create-hash": "^1.1.0",
- "create-hmac": "^1.1.0",
- "diffie-hellman": "^5.0.0",
- "inherits": "^2.0.1",
- "pbkdf2": "^3.0.3",
- "public-encrypt": "^4.0.0",
- "randombytes": "^2.0.0",
- "randomfill": "^1.0.3"
- },
- "engines": {
- "node": "*"
- }
- },
- "node_modules/css-color-names": {
- "version": "0.0.4",
- "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz",
- "integrity": "sha512-zj5D7X1U2h2zsXOAM8EyUREBnnts6H+Jm+d1M2DbiQQcUtnqgQsMrdo8JW9R80YFUmIdBZeMu5wvYM7hcgWP/Q==",
- "dev": true,
- "engines": {
- "node": "*"
- }
- },
- "node_modules/css-declaration-sorter": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz",
- "integrity": "sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==",
- "dev": true,
- "dependencies": {
- "postcss": "^7.0.1",
- "timsort": "^0.3.0"
- },
- "engines": {
- "node": ">4"
- }
- },
- "node_modules/css-modules-loader-core": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/css-modules-loader-core/-/css-modules-loader-core-1.1.0.tgz",
- "integrity": "sha512-XWOBwgy5nwBn76aA+6ybUGL/3JBnCtBX9Ay9/OWIpzKYWlVHMazvJ+WtHumfi+xxdPF440cWK7JCYtt8xDifew==",
- "dev": true,
- "dependencies": {
- "icss-replace-symbols": "1.1.0",
- "postcss": "6.0.1",
- "postcss-modules-extract-imports": "1.1.0",
- "postcss-modules-local-by-default": "1.2.0",
- "postcss-modules-scope": "1.1.0",
- "postcss-modules-values": "1.3.0"
- }
- },
- "node_modules/css-modules-loader-core/node_modules/ansi-regex": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
- "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/css-modules-loader-core/node_modules/ansi-styles": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
- "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/css-modules-loader-core/node_modules/chalk": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
- "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==",
- "dev": true,
- "dependencies": {
- "ansi-styles": "^2.2.1",
- "escape-string-regexp": "^1.0.2",
- "has-ansi": "^2.0.0",
- "strip-ansi": "^3.0.0",
- "supports-color": "^2.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/css-modules-loader-core/node_modules/chalk/node_modules/supports-color": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
- "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==",
- "dev": true,
- "engines": {
- "node": ">=0.8.0"
- }
- },
- "node_modules/css-modules-loader-core/node_modules/has-flag": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
- "integrity": "sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/css-modules-loader-core/node_modules/postcss": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.1.tgz",
- "integrity": "sha512-VbGX1LQgQbf9l3cZ3qbUuC3hGqIEOGQFHAEHQ/Diaeo0yLgpgK5Rb8J+OcamIfQ9PbAU/fzBjVtQX3AhJHUvZw==",
- "dev": true,
- "dependencies": {
- "chalk": "^1.1.3",
- "source-map": "^0.5.6",
- "supports-color": "^3.2.3"
- },
- "engines": {
- "node": ">=4.0.0"
- }
- },
- "node_modules/css-modules-loader-core/node_modules/source-map": {
- "version": "0.5.7",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
- "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/css-modules-loader-core/node_modules/strip-ansi": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
- "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==",
- "dev": true,
- "dependencies": {
- "ansi-regex": "^2.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/css-modules-loader-core/node_modules/supports-color": {
- "version": "3.2.3",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
- "integrity": "sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==",
- "dev": true,
- "dependencies": {
- "has-flag": "^1.0.0"
- },
- "engines": {
- "node": ">=0.8.0"
- }
- },
- "node_modules/css-select": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz",
- "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==",
- "dependencies": {
- "boolbase": "^1.0.0",
- "css-what": "^6.0.1",
- "domhandler": "^4.3.1",
- "domutils": "^2.8.0",
- "nth-check": "^2.0.1"
- },
- "funding": {
- "url": "https://github.com/sponsors/fb55"
- }
- },
- "node_modules/css-select-base-adapter": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz",
- "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==",
- "dev": true
- },
- "node_modules/css-selector-tokenizer": {
- "version": "0.7.3",
- "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.3.tgz",
- "integrity": "sha512-jWQv3oCEL5kMErj4wRnK/OPoBi0D+P1FR2cDCKYPaMeD2eW3/mttav8HT4hT1CKopiJI/psEULjkClhvJo4Lvg==",
- "dev": true,
- "dependencies": {
- "cssesc": "^3.0.0",
- "fastparse": "^1.1.2"
- }
- },
- "node_modules/css-shorthand-properties": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/css-shorthand-properties/-/css-shorthand-properties-1.1.1.tgz",
- "integrity": "sha512-Md+Juc7M3uOdbAFwOYlTrccIZ7oCFuzrhKYQjdeUEW/sE1hv17Jp/Bws+ReOPpGVBTYCBoYo+G17V5Qo8QQ75A==",
- "dev": true
- },
- "node_modules/css-tree": {
- "version": "1.0.0-alpha.37",
- "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz",
- "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==",
- "dev": true,
- "dependencies": {
- "mdn-data": "2.0.4",
- "source-map": "^0.6.1"
- },
- "engines": {
- "node": ">=8.0.0"
- }
- },
- "node_modules/css-value": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/css-value/-/css-value-0.0.1.tgz",
- "integrity": "sha512-FUV3xaJ63buRLgHrLQVlVgQnQdR4yqdLGaDu7g8CQcWjInDfM9plBTPI9FRfpahju1UBSaMckeb2/46ApS/V1Q==",
- "dev": true
- },
- "node_modules/css-what": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz",
- "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==",
- "engines": {
- "node": ">= 6"
- },
- "funding": {
- "url": "https://github.com/sponsors/fb55"
- }
- },
- "node_modules/cssesc": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
- "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
- "dev": true,
- "bin": {
- "cssesc": "bin/cssesc"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/cssnano": {
- "version": "4.1.11",
- "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-4.1.11.tgz",
- "integrity": "sha512-6gZm2htn7xIPJOHY824ERgj8cNPgPxyCSnkXc4v7YvNW+TdVfzgngHcEhy/8D11kUWRUMbke+tC+AUcUsnMz2g==",
- "dev": true,
- "dependencies": {
- "cosmiconfig": "^5.0.0",
- "cssnano-preset-default": "^4.0.8",
- "is-resolvable": "^1.0.0",
- "postcss": "^7.0.0"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/cssnano-preset-default": {
- "version": "4.0.8",
- "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.8.tgz",
- "integrity": "sha512-LdAyHuq+VRyeVREFmuxUZR1TXjQm8QQU/ktoo/x7bz+SdOge1YKc5eMN6pRW7YWBmyq59CqYba1dJ5cUukEjLQ==",
- "dev": true,
- "dependencies": {
- "css-declaration-sorter": "^4.0.1",
- "cssnano-util-raw-cache": "^4.0.1",
- "postcss": "^7.0.0",
- "postcss-calc": "^7.0.1",
- "postcss-colormin": "^4.0.3",
- "postcss-convert-values": "^4.0.1",
- "postcss-discard-comments": "^4.0.2",
- "postcss-discard-duplicates": "^4.0.2",
- "postcss-discard-empty": "^4.0.1",
- "postcss-discard-overridden": "^4.0.1",
- "postcss-merge-longhand": "^4.0.11",
- "postcss-merge-rules": "^4.0.3",
- "postcss-minify-font-values": "^4.0.2",
- "postcss-minify-gradients": "^4.0.2",
- "postcss-minify-params": "^4.0.2",
- "postcss-minify-selectors": "^4.0.2",
- "postcss-normalize-charset": "^4.0.1",
- "postcss-normalize-display-values": "^4.0.2",
- "postcss-normalize-positions": "^4.0.2",
- "postcss-normalize-repeat-style": "^4.0.2",
- "postcss-normalize-string": "^4.0.2",
- "postcss-normalize-timing-functions": "^4.0.2",
- "postcss-normalize-unicode": "^4.0.1",
- "postcss-normalize-url": "^4.0.1",
- "postcss-normalize-whitespace": "^4.0.2",
- "postcss-ordered-values": "^4.1.2",
- "postcss-reduce-initial": "^4.0.3",
- "postcss-reduce-transforms": "^4.0.2",
- "postcss-svgo": "^4.0.3",
- "postcss-unique-selectors": "^4.0.1"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/cssnano-util-get-arguments": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz",
- "integrity": "sha512-6RIcwmV3/cBMG8Aj5gucQRsJb4vv4I4rn6YjPbVWd5+Pn/fuG+YseGvXGk00XLkoZkaj31QOD7vMUpNPC4FIuw==",
- "dev": true,
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/cssnano-util-get-match": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz",
- "integrity": "sha512-JPMZ1TSMRUPVIqEalIBNoBtAYbi8okvcFns4O0YIhcdGebeYZK7dMyHJiQ6GqNBA9kE0Hym4Aqym5rPdsV/4Cw==",
- "dev": true,
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/cssnano-util-raw-cache": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz",
- "integrity": "sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==",
- "dev": true,
- "dependencies": {
- "postcss": "^7.0.0"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/cssnano-util-same-parent": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz",
- "integrity": "sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==",
- "dev": true,
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/csso": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz",
- "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==",
- "dev": true,
- "dependencies": {
- "css-tree": "^1.1.2"
- },
- "engines": {
- "node": ">=8.0.0"
- }
- },
- "node_modules/csso/node_modules/css-tree": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz",
- "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==",
- "dev": true,
- "dependencies": {
- "mdn-data": "2.0.14",
- "source-map": "^0.6.1"
- },
- "engines": {
- "node": ">=8.0.0"
- }
- },
- "node_modules/csso/node_modules/mdn-data": {
- "version": "2.0.14",
- "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz",
- "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==",
- "dev": true
- },
- "node_modules/cssom": {
- "version": "0.3.8",
- "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz",
- "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==",
- "dev": true
- },
- "node_modules/cssstyle": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.4.0.tgz",
- "integrity": "sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA==",
- "dev": true,
- "dependencies": {
- "cssom": "0.3.x"
- }
- },
- "node_modules/dashdash": {
- "version": "1.14.1",
- "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
- "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==",
- "dev": true,
- "dependencies": {
- "assert-plus": "^1.0.0"
- },
- "engines": {
- "node": ">=0.10"
- }
- },
- "node_modules/data-uri-to-buffer": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.1.tgz",
- "integrity": "sha512-MZd3VlchQkp8rdend6vrx7MmVDJzSNTBvghvKjirLkD+WTChA3KUf0jkE68Q4UyctNqI11zZO9/x2Yx+ub5Cvg==",
- "dev": true,
- "engines": {
- "node": ">= 14"
- }
- },
- "node_modules/data-urls": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz",
- "integrity": "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==",
- "dev": true,
- "dependencies": {
- "abab": "^2.0.0",
- "whatwg-mimetype": "^2.2.0",
- "whatwg-url": "^7.0.0"
- }
- },
- "node_modules/data-urls/node_modules/punycode": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
- "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
- "dev": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/data-urls/node_modules/tr46": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz",
- "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==",
- "dev": true,
- "dependencies": {
- "punycode": "^2.1.0"
- }
- },
- "node_modules/data-urls/node_modules/whatwg-url": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz",
- "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==",
- "dev": true,
- "dependencies": {
- "lodash.sortby": "^4.7.0",
- "tr46": "^1.0.1",
- "webidl-conversions": "^4.0.2"
- }
- },
- "node_modules/date-fns": {
- "version": "2.30.0",
- "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz",
- "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==",
- "dependencies": {
- "@babel/runtime": "^7.21.0"
- },
- "engines": {
- "node": ">=0.11"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/date-fns"
- }
- },
- "node_modules/dayjs": {
- "version": "1.11.10",
- "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.10.tgz",
- "integrity": "sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ=="
- },
- "node_modules/deasync": {
- "version": "0.1.29",
- "resolved": "https://registry.npmjs.org/deasync/-/deasync-0.1.29.tgz",
- "integrity": "sha512-EBtfUhVX23CE9GR6m+F8WPeImEE4hR/FW9RkK0PMl9V1t283s0elqsTD8EZjaKX28SY1BW2rYfCgNsAYdpamUw==",
- "dev": true,
- "hasInstallScript": true,
- "dependencies": {
- "bindings": "^1.5.0",
- "node-addon-api": "^1.7.1"
- },
- "engines": {
- "node": ">=0.11.0"
- }
- },
- "node_modules/debug": {
- "version": "4.3.4",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
- "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
- "dependencies": {
- "ms": "2.1.2"
- },
- "engines": {
- "node": ">=6.0"
- },
- "peerDependenciesMeta": {
- "supports-color": {
- "optional": true
- }
- }
- },
- "node_modules/decamelize": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz",
- "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==",
- "dev": true,
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/decode-uri-component": {
- "version": "0.2.2",
- "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz",
- "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==",
- "dev": true,
- "engines": {
- "node": ">=0.10"
- }
- },
- "node_modules/decompress-response": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz",
- "integrity": "sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==",
- "dependencies": {
- "mimic-response": "^1.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/deep-diff": {
- "version": "0.3.8",
- "resolved": "https://registry.npmjs.org/deep-diff/-/deep-diff-0.3.8.tgz",
- "integrity": "sha512-yVn6RZmHiGnxRKR9sJb3iVV2XTF1Ghh2DiWRZ3dMnGc43yUdWWF/kX6lQyk3+P84iprfWKU/8zFTrlkvtFm1ug==",
- "dev": true
- },
- "node_modules/deep-eql": {
- "version": "4.1.3",
- "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz",
- "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==",
- "dev": true,
- "dependencies": {
- "type-detect": "^4.0.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/deep-is": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
- "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
- "dev": true
- },
- "node_modules/deepmerge": {
- "version": "4.3.1",
- "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz",
- "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/defaults": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz",
- "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==",
- "dev": true,
- "dependencies": {
- "clone": "^1.0.2"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/defaults/node_modules/clone": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
- "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==",
- "dev": true,
- "engines": {
- "node": ">=0.8"
- }
- },
- "node_modules/defer-to-connect": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz",
- "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ=="
- },
- "node_modules/define-data-property": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz",
- "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==",
- "devOptional": true,
- "dependencies": {
- "get-intrinsic": "^1.2.1",
- "gopd": "^1.0.1",
- "has-property-descriptors": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/define-properties": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz",
- "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==",
- "devOptional": true,
- "dependencies": {
- "define-data-property": "^1.0.1",
- "has-property-descriptors": "^1.0.0",
- "object-keys": "^1.1.1"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/define-property": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
- "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
- "dev": true,
- "dependencies": {
- "is-descriptor": "^1.0.2",
- "isobject": "^3.0.1"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/degenerator": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz",
- "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==",
- "dev": true,
- "dependencies": {
- "ast-types": "^0.13.4",
- "escodegen": "^2.1.0",
- "esprima": "^4.0.1"
- },
- "engines": {
- "node": ">= 14"
- }
- },
- "node_modules/degenerator/node_modules/escodegen": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz",
- "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==",
- "dev": true,
- "dependencies": {
- "esprima": "^4.0.1",
- "estraverse": "^5.2.0",
- "esutils": "^2.0.2"
- },
- "bin": {
- "escodegen": "bin/escodegen.js",
- "esgenerate": "bin/esgenerate.js"
- },
- "engines": {
- "node": ">=6.0"
- },
- "optionalDependencies": {
- "source-map": "~0.6.1"
- }
- },
- "node_modules/degenerator/node_modules/esprima": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
- "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
- "dev": true,
- "bin": {
- "esparse": "bin/esparse.js",
- "esvalidate": "bin/esvalidate.js"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/delayed-stream": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
- "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
- "engines": {
- "node": ">=0.4.0"
- }
- },
- "node_modules/delegates": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
- "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==",
- "dev": true
- },
- "node_modules/depd": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
- "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
- "dev": true,
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/des.js": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.1.0.tgz",
- "integrity": "sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==",
- "dev": true,
- "dependencies": {
- "inherits": "^2.0.1",
- "minimalistic-assert": "^1.0.0"
- }
- },
- "node_modules/destroy": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
- "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==",
- "dev": true,
- "engines": {
- "node": ">= 0.8",
- "npm": "1.2.8000 || >= 1.4.16"
- }
- },
- "node_modules/detect-libc": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.2.tgz",
- "integrity": "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==",
- "dev": true,
- "optional": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/detect-node": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz",
- "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==",
- "optional": true
- },
- "node_modules/dev-null": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/dev-null/-/dev-null-0.1.1.tgz",
- "integrity": "sha512-nMNZG0zfMgmdv8S5O0TM5cpwNbGKRGPCxVsr0SmA3NZZy9CYBbuNLL0PD3Acx9e5LIUgwONXtM9kM6RlawPxEQ==",
- "dev": true
- },
- "node_modules/devtools": {
- "version": "6.12.1",
- "resolved": "https://registry.npmjs.org/devtools/-/devtools-6.12.1.tgz",
- "integrity": "sha512-JyG46suEiZmld7/UVeogkCWM0zYGt+2ML/TI+SkEp+bTv9cs46cDb0pKF3glYZJA7wVVL2gC07Ic0iCxyJEnCQ==",
- "dev": true,
- "dependencies": {
- "@wdio/config": "6.12.1",
- "@wdio/logger": "6.10.10",
- "@wdio/protocols": "6.12.0",
- "@wdio/utils": "6.11.0",
- "chrome-launcher": "^0.13.1",
- "edge-paths": "^2.1.0",
- "puppeteer-core": "^5.1.0",
- "ua-parser-js": "^0.7.21",
- "uuid": "^8.0.0"
- },
- "engines": {
- "node": ">=10.0.0"
- }
- },
- "node_modules/devtools-protocol": {
- "version": "0.0.818844",
- "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.818844.tgz",
- "integrity": "sha512-AD1hi7iVJ8OD0aMLQU5VK0XH9LDlA1+BcPIgrAxPfaibx2DbWucuyOhc4oyQCbnvDDO68nN6/LcKfqTP343Jjg==",
- "dev": true
- },
- "node_modules/devtools/node_modules/@wdio/config": {
- "version": "6.12.1",
- "resolved": "https://registry.npmjs.org/@wdio/config/-/config-6.12.1.tgz",
- "integrity": "sha512-V5hTIW5FNlZ1W33smHF4Rd5BKjGW2KeYhyXDQfXHjqLCeRiirZ9fABCo9plaVQDnwWSUMWYaAaIAifV82/oJCQ==",
- "dev": true,
- "dependencies": {
- "@wdio/logger": "6.10.10",
- "deepmerge": "^4.0.0",
- "glob": "^7.1.2"
- },
- "engines": {
- "node": ">=10.0.0"
- }
- },
- "node_modules/devtools/node_modules/@wdio/logger": {
- "version": "6.10.10",
- "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-6.10.10.tgz",
- "integrity": "sha512-2nh0hJz9HeZE0VIEMI+oPgjr/Q37ohrR9iqsl7f7GW5ik+PnKYCT9Eab5mR1GNMG60askwbskgGC1S9ygtvrSw==",
- "dev": true,
- "dependencies": {
- "chalk": "^4.0.0",
- "loglevel": "^1.6.0",
- "loglevel-plugin-prefix": "^0.8.4",
- "strip-ansi": "^6.0.0"
- },
- "engines": {
- "node": ">=10.0.0"
- }
- },
- "node_modules/devtools/node_modules/@wdio/protocols": {
- "version": "6.12.0",
- "resolved": "https://registry.npmjs.org/@wdio/protocols/-/protocols-6.12.0.tgz",
- "integrity": "sha512-UhTBZxClCsM3VjaiDp4DoSCnsa7D1QNmI2kqEBfIpyNkT3GcZhJb7L+nL0fTkzCwi7+/uLastb3/aOwH99gt0A==",
- "dev": true,
- "engines": {
- "node": ">=10.0.0"
- }
- },
- "node_modules/devtools/node_modules/@wdio/utils": {
- "version": "6.11.0",
- "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-6.11.0.tgz",
- "integrity": "sha512-vf0sOQzd28WbI26d6/ORrQ4XKWTzSlWLm9W/K/eJO0NASKPEzR+E+Q2kaa+MJ4FKXUpjbt+Lxfo+C26TzBk7tg==",
- "dev": true,
- "dependencies": {
- "@wdio/logger": "6.10.10"
- },
- "engines": {
- "node": ">=10.0.0"
- }
- },
- "node_modules/devtools/node_modules/ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "dev": true,
- "dependencies": {
- "color-convert": "^2.0.1"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/devtools/node_modules/brace-expansion": {
- "version": "1.1.11",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
- "dev": true,
- "dependencies": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
- }
- },
- "node_modules/devtools/node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "dev": true,
- "dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
- }
- },
- "node_modules/devtools/node_modules/color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
- "dev": true,
- "dependencies": {
- "color-name": "~1.1.4"
- },
- "engines": {
- "node": ">=7.0.0"
- }
- },
- "node_modules/devtools/node_modules/color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "dev": true
- },
- "node_modules/devtools/node_modules/glob": {
- "version": "7.2.3",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
- "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
- "dev": true,
- "dependencies": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.1.1",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
- },
- "engines": {
- "node": "*"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/devtools/node_modules/minimatch": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
- "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
- "dev": true,
- "dependencies": {
- "brace-expansion": "^1.1.7"
- },
- "engines": {
- "node": "*"
- }
- },
- "node_modules/devtools/node_modules/supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
- "dev": true,
- "dependencies": {
- "has-flag": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/devtools/node_modules/uuid": {
- "version": "8.3.2",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
- "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
- "dev": true,
- "bin": {
- "uuid": "dist/bin/uuid"
- }
- },
- "node_modules/devtron": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/devtron/-/devtron-1.4.0.tgz",
- "integrity": "sha512-BFWB7plA0PSprN1l3UnI4jtzV4xopPFaB87nF1Kl5yNjMwdHDxUVb8ov9ymQA1ZfeulbstVLYGDkUTJ8YZpKJw==",
- "dev": true,
- "dependencies": {
- "accessibility-developer-tools": "^2.11.0",
- "highlight.js": "^9.3.0",
- "humanize-plus": "^1.8.1"
- }
- },
- "node_modules/devtron/node_modules/highlight.js": {
- "version": "9.18.5",
- "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-9.18.5.tgz",
- "integrity": "sha512-a5bFyofd/BHCX52/8i8uJkjr9DYwXIPnM/plwI6W7ezItLGqzt7X2G2nXuYSfsIJdkwwj/g9DG1LkcGJI/dDoA==",
- "deprecated": "Support has ended for 9.x series. Upgrade to @latest",
- "dev": true,
- "hasInstallScript": true,
- "engines": {
- "node": "*"
- }
- },
- "node_modules/diff": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz",
- "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==",
- "dev": true,
- "engines": {
- "node": ">=0.3.1"
- }
- },
- "node_modules/diffie-hellman": {
- "version": "5.0.3",
- "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz",
- "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==",
- "dev": true,
- "dependencies": {
- "bn.js": "^4.1.0",
- "miller-rabin": "^4.0.0",
- "randombytes": "^2.0.0"
- }
- },
- "node_modules/diffie-hellman/node_modules/bn.js": {
- "version": "4.12.0",
- "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
- "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==",
- "dev": true
- },
- "node_modules/dir-compare": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/dir-compare/-/dir-compare-3.3.0.tgz",
- "integrity": "sha512-J7/et3WlGUCxjdnD3HAAzQ6nsnc0WL6DD7WcwJb7c39iH1+AWfg+9OqzJNaI6PkBwBvm1mhZNL9iY/nRiZXlPg==",
- "dev": true,
- "dependencies": {
- "buffer-equal": "^1.0.0",
- "minimatch": "^3.0.4"
- }
- },
- "node_modules/dir-compare/node_modules/brace-expansion": {
- "version": "1.1.11",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
- "dev": true,
- "dependencies": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
- }
- },
- "node_modules/dir-compare/node_modules/minimatch": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
- "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
- "dev": true,
- "dependencies": {
- "brace-expansion": "^1.1.7"
- },
- "engines": {
- "node": "*"
- }
- },
- "node_modules/dmg-builder": {
- "version": "24.12.0",
- "resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-24.12.0.tgz",
- "integrity": "sha512-nS22OyHUIYcK40UnILOtqC5Qffd1SN1Ljqy/6e+QR2H1wM3iNBrKJoEbDRfEmYYaALKNFRkKPqSbZKRsGUBdPw==",
- "dev": true,
- "dependencies": {
- "app-builder-lib": "24.12.0",
- "builder-util": "24.9.4",
- "builder-util-runtime": "9.2.3",
- "fs-extra": "^10.1.0",
- "iconv-lite": "^0.6.2",
- "js-yaml": "^4.1.0"
- },
- "optionalDependencies": {
- "dmg-license": "^1.0.11"
- }
- },
- "node_modules/dmg-builder/node_modules/fs-extra": {
- "version": "10.1.0",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz",
- "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==",
- "dev": true,
- "dependencies": {
- "graceful-fs": "^4.2.0",
- "jsonfile": "^6.0.1",
- "universalify": "^2.0.0"
- },
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/dmg-builder/node_modules/iconv-lite": {
- "version": "0.6.3",
- "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
- "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
- "dev": true,
- "dependencies": {
- "safer-buffer": ">= 2.1.2 < 3.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/dmg-builder/node_modules/jsonfile": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
- "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
- "dev": true,
- "dependencies": {
- "universalify": "^2.0.0"
- },
- "optionalDependencies": {
- "graceful-fs": "^4.1.6"
- }
- },
- "node_modules/dmg-builder/node_modules/universalify": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
- "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
- "dev": true,
- "engines": {
- "node": ">= 10.0.0"
- }
- },
- "node_modules/dmg-license": {
- "version": "1.0.11",
- "resolved": "https://registry.npmjs.org/dmg-license/-/dmg-license-1.0.11.tgz",
- "integrity": "sha512-ZdzmqwKmECOWJpqefloC5OJy1+WZBBse5+MR88z9g9Zn4VY+WYUkAyojmhzJckH5YbbZGcYIuGAkY5/Ys5OM2Q==",
- "dev": true,
- "optional": true,
- "os": [
- "darwin"
- ],
- "dependencies": {
- "@types/plist": "^3.0.1",
- "@types/verror": "^1.10.3",
- "ajv": "^6.10.0",
- "crc": "^3.8.0",
- "iconv-corefoundation": "^1.1.7",
- "plist": "^3.0.4",
- "smart-buffer": "^4.0.2",
- "verror": "^1.10.0"
- },
- "bin": {
- "dmg-license": "bin/dmg-license.js"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/dmg-license/node_modules/ajv": {
- "version": "6.12.6",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
- "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
- "dev": true,
- "optional": true,
- "dependencies": {
- "fast-deep-equal": "^3.1.1",
- "fast-json-stable-stringify": "^2.0.0",
- "json-schema-traverse": "^0.4.1",
- "uri-js": "^4.2.2"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/epoberezkin"
- }
- },
- "node_modules/dmg-license/node_modules/json-schema-traverse": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
- "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
- "dev": true,
- "optional": true
- },
- "node_modules/doctrine": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
- "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
- "dev": true,
- "dependencies": {
- "esutils": "^2.0.2"
- },
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/dom-align": {
- "version": "1.12.4",
- "resolved": "https://registry.npmjs.org/dom-align/-/dom-align-1.12.4.tgz",
- "integrity": "sha512-R8LUSEay/68zE5c8/3BDxiTEvgb4xZTF0RKmAHfiEVN3klfIpXfi2/QCoiWPccVQ0J/ZGdz9OjzL4uJEP/MRAw=="
- },
- "node_modules/dom-serializer": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz",
- "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==",
- "dependencies": {
- "domelementtype": "^2.0.1",
- "domhandler": "^4.2.0",
- "entities": "^2.0.0"
- },
- "funding": {
- "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1"
- }
- },
- "node_modules/domain-browser": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz",
- "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==",
- "dev": true,
- "engines": {
- "node": ">=0.4",
- "npm": ">=1.2"
- }
- },
- "node_modules/domelementtype": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz",
- "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==",
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/fb55"
- }
- ]
- },
- "node_modules/domexception": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz",
- "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==",
- "deprecated": "Use your platform's native DOMException instead",
- "dev": true,
- "dependencies": {
- "webidl-conversions": "^4.0.2"
- }
- },
- "node_modules/domhandler": {
- "version": "4.3.1",
- "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz",
- "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==",
- "dependencies": {
- "domelementtype": "^2.2.0"
- },
- "engines": {
- "node": ">= 4"
- },
- "funding": {
- "url": "https://github.com/fb55/domhandler?sponsor=1"
- }
- },
- "node_modules/domutils": {
- "version": "2.8.0",
- "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz",
- "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==",
- "dependencies": {
- "dom-serializer": "^1.0.1",
- "domelementtype": "^2.2.0",
- "domhandler": "^4.2.0"
- },
- "funding": {
- "url": "https://github.com/fb55/domutils?sponsor=1"
- }
- },
- "node_modules/dot-prop": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz",
- "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==",
- "dev": true,
- "dependencies": {
- "is-obj": "^2.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/dotenv": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-5.0.1.tgz",
- "integrity": "sha512-4As8uPrjfwb7VXC+WnLCbXK7y+Ueb2B3zgNCePYfhxS1PYeaO1YTeplffTEcbfLhvFNGLAz90VvJs9yomG7bow==",
- "dev": true,
- "engines": {
- "node": ">=4.6.0"
- }
- },
- "node_modules/dotenv-expand": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz",
- "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==",
- "dev": true
- },
- "node_modules/duplexer": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz",
- "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==",
- "dev": true
- },
- "node_modules/duplexer2": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz",
- "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==",
- "dev": true,
- "dependencies": {
- "readable-stream": "^2.0.2"
- }
- },
- "node_modules/duplexer2/node_modules/isarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
- "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
- "dev": true
- },
- "node_modules/duplexer2/node_modules/readable-stream": {
- "version": "2.3.8",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
- "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
- "dev": true,
- "dependencies": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.3",
- "isarray": "~1.0.0",
- "process-nextick-args": "~2.0.0",
- "safe-buffer": "~5.1.1",
- "string_decoder": "~1.1.1",
- "util-deprecate": "~1.0.1"
- }
- },
- "node_modules/duplexer2/node_modules/safe-buffer": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
- "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
- "dev": true
- },
- "node_modules/duplexer2/node_modules/string_decoder": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
- "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
- "dev": true,
- "dependencies": {
- "safe-buffer": "~5.1.0"
- }
- },
- "node_modules/duplexer3": {
- "version": "0.1.5",
- "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.5.tgz",
- "integrity": "sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA=="
- },
- "node_modules/eastasianwidth": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
- "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
- "dev": true
- },
- "node_modules/ecc-jsbn": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
- "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==",
- "dev": true,
- "dependencies": {
- "jsbn": "~0.1.0",
- "safer-buffer": "^2.1.0"
- }
- },
- "node_modules/edge-paths": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/edge-paths/-/edge-paths-2.2.1.tgz",
- "integrity": "sha512-AI5fC7dfDmCdKo3m5y7PkYE8m6bMqR6pvVpgtrZkkhcJXFLelUgkjrhk3kXXx8Kbw2cRaTT4LkOR7hqf39KJdw==",
- "dev": true,
- "dependencies": {
- "@types/which": "^1.3.2",
- "which": "^2.0.2"
- }
- },
- "node_modules/edge-paths/node_modules/@types/which": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/@types/which/-/which-1.3.2.tgz",
- "integrity": "sha512-8oDqyLC7eD4HM307boe2QWKyuzdzWBj56xI/imSl2cpL+U3tCMaTAkMJ4ee5JBZ/FsOJlvRGeIShiZDAl1qERA==",
- "dev": true
- },
- "node_modules/edge-paths/node_modules/isexe": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
- "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
- "dev": true
- },
- "node_modules/edge-paths/node_modules/which": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
- "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
- "dev": true,
- "dependencies": {
- "isexe": "^2.0.0"
- },
- "bin": {
- "node-which": "bin/node-which"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/ee-first": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
- "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==",
- "dev": true
- },
- "node_modules/ejs": {
- "version": "3.1.9",
- "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz",
- "integrity": "sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==",
- "dev": true,
- "dependencies": {
- "jake": "^10.8.5"
- },
- "bin": {
- "ejs": "bin/cli.js"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/electron": {
- "version": "13.6.9",
- "resolved": "https://registry.npmjs.org/electron/-/electron-13.6.9.tgz",
- "integrity": "sha512-Es/sBy85NIuqsO9MW41PUCpwIkeinlTQ7g0ainfnmRAM2rmog3GBxVCaoV5dzEjwTF7TKG1Yr/E7Z3qHmlfWAg==",
- "hasInstallScript": true,
- "dependencies": {
- "@electron/get": "^1.0.1",
- "@types/node": "^14.6.2",
- "extract-zip": "^1.0.3"
- },
- "bin": {
- "electron": "cli.js"
- },
- "engines": {
- "node": ">= 8.6"
- }
- },
- "node_modules/electron-builder": {
- "version": "24.12.0",
- "resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-24.12.0.tgz",
- "integrity": "sha512-dH4O9zkxFxFbBVFobIR5FA71yJ1TZSCvjZ2maCskpg7CWjBF+SNRSQAThlDyUfRuB+jBTMwEMzwARywmap0CSw==",
- "dev": true,
- "dependencies": {
- "app-builder-lib": "24.12.0",
- "builder-util": "24.9.4",
- "builder-util-runtime": "9.2.3",
- "chalk": "^4.1.2",
- "dmg-builder": "24.12.0",
- "fs-extra": "^10.1.0",
- "is-ci": "^3.0.0",
- "lazy-val": "^1.0.5",
- "read-config-file": "6.3.2",
- "simple-update-notifier": "2.0.0",
- "yargs": "^17.6.2"
- },
- "bin": {
- "electron-builder": "cli.js",
- "install-app-deps": "install-app-deps.js"
- },
- "engines": {
- "node": ">=14.0.0"
- }
- },
- "node_modules/electron-builder/node_modules/ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "dev": true,
- "dependencies": {
- "color-convert": "^2.0.1"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/electron-builder/node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "dev": true,
- "dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
- }
- },
- "node_modules/electron-builder/node_modules/color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
- "dev": true,
- "dependencies": {
- "color-name": "~1.1.4"
- },
- "engines": {
- "node": ">=7.0.0"
- }
- },
- "node_modules/electron-builder/node_modules/color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "dev": true
- },
- "node_modules/electron-builder/node_modules/fs-extra": {
- "version": "10.1.0",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz",
- "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==",
- "dev": true,
- "dependencies": {
- "graceful-fs": "^4.2.0",
- "jsonfile": "^6.0.1",
- "universalify": "^2.0.0"
- },
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/electron-builder/node_modules/jsonfile": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
- "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
- "dev": true,
- "dependencies": {
- "universalify": "^2.0.0"
- },
- "optionalDependencies": {
- "graceful-fs": "^4.1.6"
- }
- },
- "node_modules/electron-builder/node_modules/supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
- "dev": true,
- "dependencies": {
- "has-flag": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/electron-builder/node_modules/universalify": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
- "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
- "dev": true,
- "engines": {
- "node": ">= 10.0.0"
- }
- },
- "node_modules/electron-chromedriver": {
- "version": "13.0.0",
- "resolved": "https://registry.npmjs.org/electron-chromedriver/-/electron-chromedriver-13.0.0.tgz",
- "integrity": "sha512-fID1ms8wT7qNfoKkXHNpH0ZE8/Nclb5YmkF3O0w57OxsR8S9PxgE9CJAgaSGroxBgZ+ge1i2OU0Aq/WE/e/Neg==",
- "dev": true,
- "hasInstallScript": true,
- "dependencies": {
- "@electron/get": "^1.12.4",
- "extract-zip": "^2.0.0"
- },
- "bin": {
- "chromedriver": "chromedriver.js"
- },
- "engines": {
- "node": ">=10.12.0"
- }
- },
- "node_modules/electron-chromedriver/node_modules/extract-zip": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz",
- "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==",
- "dev": true,
- "dependencies": {
- "debug": "^4.1.1",
- "get-stream": "^5.1.0",
- "yauzl": "^2.10.0"
- },
- "bin": {
- "extract-zip": "cli.js"
- },
- "engines": {
- "node": ">= 10.17.0"
- },
- "optionalDependencies": {
- "@types/yauzl": "^2.9.1"
- }
- },
- "node_modules/electron-chromedriver/node_modules/get-stream": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
- "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
- "dev": true,
- "dependencies": {
- "pump": "^3.0.0"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/electron-debug": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/electron-debug/-/electron-debug-3.2.0.tgz",
- "integrity": "sha512-7xZh+LfUvJ52M9rn6N+tPuDw6oRAjxUj9SoxAZfJ0hVCXhZCsdkrSt7TgXOiWiEOBgEV8qwUIO/ScxllsPS7ow==",
- "dev": true,
- "dependencies": {
- "electron-is-dev": "^1.1.0",
- "electron-localshortcut": "^3.1.0"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/electron-extension-installer": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/electron-extension-installer/-/electron-extension-installer-1.2.0.tgz",
- "integrity": "sha512-NrGe64uN4D3+TqbGVwVvLaegXL5oe7/ccTl4fjNl60w+dSNbSXin4CJ1cuMNEXkYyADcF1ITlEm0nDWTnPzPkQ==",
- "dev": true,
- "dependencies": {
- "@types/jszip": "^3.4.1",
- "fs-jetpack": "^5.1.0",
- "jszip": "^3.10.1",
- "rimraf": "^5.0.0"
- }
- },
- "node_modules/electron-is-accelerator": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/electron-is-accelerator/-/electron-is-accelerator-0.1.2.tgz",
- "integrity": "sha512-fLGSAjXZtdn1sbtZxx52+krefmtNuVwnJCV2gNiVt735/ARUboMl8jnNC9fZEqQdlAv2ZrETfmBUsoQci5evJA==",
- "dev": true
- },
- "node_modules/electron-is-dev": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/electron-is-dev/-/electron-is-dev-1.2.0.tgz",
- "integrity": "sha512-R1oD5gMBPS7PVU8gJwH6CtT0e6VSoD0+SzSnYpNm+dBkcijgA+K7VAMHDfnRq/lkKPZArpzplTW6jfiMYosdzw==",
- "dev": true
- },
- "node_modules/electron-localshortcut": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/electron-localshortcut/-/electron-localshortcut-3.2.1.tgz",
- "integrity": "sha512-DWvhKv36GsdXKnaFFhEiK8kZZA+24/yFLgtTwJJHc7AFgDjNRIBJZ/jq62Y/dWv9E4ypYwrVWN2bVrCYw1uv7Q==",
- "dev": true,
- "dependencies": {
- "debug": "^4.0.1",
- "electron-is-accelerator": "^0.1.0",
- "keyboardevent-from-electron-accelerator": "^2.0.0",
- "keyboardevents-areequal": "^0.2.1"
- }
- },
- "node_modules/electron-log": {
- "version": "4.4.8",
- "resolved": "https://registry.npmjs.org/electron-log/-/electron-log-4.4.8.tgz",
- "integrity": "sha512-QQ4GvrXO+HkgqqEOYbi+DHL7hj5JM+nHi/j+qrN9zeeXVKy8ZABgbu4CnG+BBqDZ2+tbeq9tUC4DZfIWFU5AZA=="
- },
- "node_modules/electron-publish": {
- "version": "24.9.4",
- "resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-24.9.4.tgz",
- "integrity": "sha512-FghbeVMfxHneHjsG2xUSC0NMZYWOOWhBxfZKPTbibcJ0CjPH0Ph8yb5CUO62nqywXfA5u1Otq6K8eOdOixxmNg==",
- "dev": true,
- "dependencies": {
- "@types/fs-extra": "^9.0.11",
- "builder-util": "24.9.4",
- "builder-util-runtime": "9.2.3",
- "chalk": "^4.1.2",
- "fs-extra": "^10.1.0",
- "lazy-val": "^1.0.5",
- "mime": "^2.5.2"
- }
- },
- "node_modules/electron-publish/node_modules/ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "dev": true,
- "dependencies": {
- "color-convert": "^2.0.1"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/electron-publish/node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "dev": true,
- "dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
- }
- },
- "node_modules/electron-publish/node_modules/color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
- "dev": true,
- "dependencies": {
- "color-name": "~1.1.4"
- },
- "engines": {
- "node": ">=7.0.0"
- }
- },
- "node_modules/electron-publish/node_modules/color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "dev": true
- },
- "node_modules/electron-publish/node_modules/fs-extra": {
- "version": "10.1.0",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz",
- "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==",
- "dev": true,
- "dependencies": {
- "graceful-fs": "^4.2.0",
- "jsonfile": "^6.0.1",
- "universalify": "^2.0.0"
- },
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/electron-publish/node_modules/jsonfile": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
- "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
- "dev": true,
- "dependencies": {
- "universalify": "^2.0.0"
- },
- "optionalDependencies": {
- "graceful-fs": "^4.1.6"
- }
- },
- "node_modules/electron-publish/node_modules/supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
- "dev": true,
- "dependencies": {
- "has-flag": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/electron-publish/node_modules/universalify": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
- "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
- "dev": true,
- "engines": {
- "node": ">= 10.0.0"
- }
- },
- "node_modules/electron-settings": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/electron-settings/-/electron-settings-4.0.2.tgz",
- "integrity": "sha512-WnUlrnBsO784oXcag0ym+A3ySoIwonz5GhYFsWroMHVzslzmsP+81f/Fof41T9UrRUxuPPKiZPZMwGO+yvWChg==",
- "dependencies": {
- "lodash.get": "^4.4.2",
- "lodash.has": "^4.5.2",
- "lodash.set": "^4.3.2",
- "lodash.unset": "^4.5.2",
- "mkdirp": "^1.0.4",
- "write-file-atomic": "^3.0.3"
- },
- "peerDependencies": {
- "electron": ">= 2"
- }
- },
- "node_modules/electron-to-chromium": {
- "version": "1.4.615",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.615.tgz",
- "integrity": "sha512-/bKPPcgZVUziECqDc+0HkT87+0zhaWSZHNXqF8FLd2lQcptpmUFwoCSWjCdOng9Gdq+afKArPdEg/0ZW461Eng==",
- "dev": true
- },
- "node_modules/electron-updater": {
- "version": "6.1.8",
- "resolved": "https://registry.npmjs.org/electron-updater/-/electron-updater-6.1.8.tgz",
- "integrity": "sha512-hhOTfaFAd6wRHAfUaBhnAOYc+ymSGCWJLtFkw4xJqOvtpHmIdNHnXDV9m1MHC+A6q08Abx4Ykgyz/R5DGKNAMQ==",
- "dependencies": {
- "builder-util-runtime": "9.2.3",
- "fs-extra": "^10.1.0",
- "js-yaml": "^4.1.0",
- "lazy-val": "^1.0.5",
- "lodash.escaperegexp": "^4.1.2",
- "lodash.isequal": "^4.5.0",
- "semver": "^7.3.8",
- "tiny-typed-emitter": "^2.1.0"
- }
- },
- "node_modules/electron-updater/node_modules/fs-extra": {
- "version": "10.1.0",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz",
- "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==",
- "dependencies": {
- "graceful-fs": "^4.2.0",
- "jsonfile": "^6.0.1",
- "universalify": "^2.0.0"
- },
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/electron-updater/node_modules/jsonfile": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
- "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
- "dependencies": {
- "universalify": "^2.0.0"
- },
- "optionalDependencies": {
- "graceful-fs": "^4.1.6"
- }
- },
- "node_modules/electron-updater/node_modules/universalify": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
- "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
- "engines": {
- "node": ">= 10.0.0"
- }
- },
- "node_modules/electron/node_modules/@types/node": {
- "version": "14.18.63",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.63.tgz",
- "integrity": "sha512-fAtCfv4jJg+ExtXhvCkCqUKZ+4ok/JQk01qDKhL5BDDoS3AxKXhV5/MAVUZyQnSEd2GT92fkgZl0pz0Q0AzcIQ=="
- },
- "node_modules/elliptic": {
- "version": "6.5.4",
- "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz",
- "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==",
- "dev": true,
- "dependencies": {
- "bn.js": "^4.11.9",
- "brorand": "^1.1.0",
- "hash.js": "^1.0.0",
- "hmac-drbg": "^1.0.1",
- "inherits": "^2.0.4",
- "minimalistic-assert": "^1.0.1",
- "minimalistic-crypto-utils": "^1.0.1"
- }
- },
- "node_modules/elliptic/node_modules/bn.js": {
- "version": "4.12.0",
- "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
- "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==",
- "dev": true
- },
- "node_modules/emoji-regex": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
- "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
- "dev": true
- },
- "node_modules/emojis-list": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz",
- "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==",
- "dev": true,
- "engines": {
- "node": ">= 4"
- }
- },
- "node_modules/enabled": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz",
- "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==",
- "dev": true,
- "peer": true
- },
- "node_modules/encodeurl": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
- "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
- "devOptional": true,
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/end-of-stream": {
- "version": "1.4.4",
- "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
- "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
- "dependencies": {
- "once": "^1.4.0"
- }
- },
- "node_modules/entities": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz",
- "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==",
- "funding": {
- "url": "https://github.com/fb55/entities?sponsor=1"
- }
- },
- "node_modules/env-paths": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz",
- "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/envinfo": {
- "version": "7.11.0",
- "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.11.0.tgz",
- "integrity": "sha512-G9/6xF1FPbIw0TtalAMaVPpiq2aDEuKLXM314jPVAO9r2fo2a4BLqMNkmRS7O/xPPZ+COAhGIz3ETvHEV3eUcg==",
- "dev": true,
- "bin": {
- "envinfo": "dist/cli.js"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/err-code": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz",
- "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==",
- "dev": true
- },
- "node_modules/errno": {
- "version": "0.1.8",
- "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz",
- "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==",
- "dev": true,
- "dependencies": {
- "prr": "~1.0.1"
- },
- "bin": {
- "errno": "cli.js"
- }
- },
- "node_modules/error-ex": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
- "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
- "dev": true,
- "dependencies": {
- "is-arrayish": "^0.2.1"
- }
- },
- "node_modules/es-abstract": {
- "version": "1.22.3",
- "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.3.tgz",
- "integrity": "sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==",
- "dev": true,
- "dependencies": {
- "array-buffer-byte-length": "^1.0.0",
- "arraybuffer.prototype.slice": "^1.0.2",
- "available-typed-arrays": "^1.0.5",
- "call-bind": "^1.0.5",
- "es-set-tostringtag": "^2.0.1",
- "es-to-primitive": "^1.2.1",
- "function.prototype.name": "^1.1.6",
- "get-intrinsic": "^1.2.2",
- "get-symbol-description": "^1.0.0",
- "globalthis": "^1.0.3",
- "gopd": "^1.0.1",
- "has-property-descriptors": "^1.0.0",
- "has-proto": "^1.0.1",
- "has-symbols": "^1.0.3",
- "hasown": "^2.0.0",
- "internal-slot": "^1.0.5",
- "is-array-buffer": "^3.0.2",
- "is-callable": "^1.2.7",
- "is-negative-zero": "^2.0.2",
- "is-regex": "^1.1.4",
- "is-shared-array-buffer": "^1.0.2",
- "is-string": "^1.0.7",
- "is-typed-array": "^1.1.12",
- "is-weakref": "^1.0.2",
- "object-inspect": "^1.13.1",
- "object-keys": "^1.1.1",
- "object.assign": "^4.1.4",
- "regexp.prototype.flags": "^1.5.1",
- "safe-array-concat": "^1.0.1",
- "safe-regex-test": "^1.0.0",
- "string.prototype.trim": "^1.2.8",
- "string.prototype.trimend": "^1.0.7",
- "string.prototype.trimstart": "^1.0.7",
- "typed-array-buffer": "^1.0.0",
- "typed-array-byte-length": "^1.0.0",
- "typed-array-byte-offset": "^1.0.0",
- "typed-array-length": "^1.0.4",
- "unbox-primitive": "^1.0.2",
- "which-typed-array": "^1.1.13"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/es-array-method-boxes-properly": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz",
- "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==",
- "dev": true
- },
- "node_modules/es-iterator-helpers": {
- "version": "1.0.15",
- "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.15.tgz",
- "integrity": "sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g==",
- "dev": true,
- "dependencies": {
- "asynciterator.prototype": "^1.0.0",
- "call-bind": "^1.0.2",
- "define-properties": "^1.2.1",
- "es-abstract": "^1.22.1",
- "es-set-tostringtag": "^2.0.1",
- "function-bind": "^1.1.1",
- "get-intrinsic": "^1.2.1",
- "globalthis": "^1.0.3",
- "has-property-descriptors": "^1.0.0",
- "has-proto": "^1.0.1",
- "has-symbols": "^1.0.3",
- "internal-slot": "^1.0.5",
- "iterator.prototype": "^1.1.2",
- "safe-array-concat": "^1.0.1"
- }
- },
- "node_modules/es-set-tostringtag": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz",
- "integrity": "sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==",
- "dev": true,
- "dependencies": {
- "get-intrinsic": "^1.2.2",
- "has-tostringtag": "^1.0.0",
- "hasown": "^2.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/es-shim-unscopables": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz",
- "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==",
- "dev": true,
- "dependencies": {
- "hasown": "^2.0.0"
- }
- },
- "node_modules/es-to-primitive": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
- "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
- "dev": true,
- "dependencies": {
- "is-callable": "^1.1.4",
- "is-date-object": "^1.0.1",
- "is-symbol": "^1.0.2"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/es6-error": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz",
- "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==",
- "devOptional": true
- },
- "node_modules/escalade": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
- "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
- "dev": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/escape-html": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
- "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==",
- "dev": true
- },
- "node_modules/escape-string-regexp": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
- "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
- "dev": true,
- "engines": {
- "node": ">=0.8.0"
- }
- },
- "node_modules/escodegen": {
- "version": "1.9.1",
- "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.9.1.tgz",
- "integrity": "sha512-6hTjO1NAWkHnDk3OqQ4YrCuwwmGHL9S3nPlzBOUG/R44rda3wLNrfvQ5fkSGjyhHFKM7ALPKcKGrwvCLe0lC7Q==",
- "dev": true,
- "dependencies": {
- "esprima": "^3.1.3",
- "estraverse": "^4.2.0",
- "esutils": "^2.0.2",
- "optionator": "^0.8.1"
- },
- "bin": {
- "escodegen": "bin/escodegen.js",
- "esgenerate": "bin/esgenerate.js"
- },
- "engines": {
- "node": ">=4.0"
- },
- "optionalDependencies": {
- "source-map": "~0.6.1"
- }
- },
- "node_modules/escodegen/node_modules/estraverse": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
- "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
- "dev": true,
- "engines": {
- "node": ">=4.0"
- }
- },
- "node_modules/escodegen/node_modules/levn": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
- "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==",
- "dev": true,
- "dependencies": {
- "prelude-ls": "~1.1.2",
- "type-check": "~0.3.2"
- },
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/escodegen/node_modules/optionator": {
- "version": "0.8.3",
- "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz",
- "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==",
- "dev": true,
- "dependencies": {
- "deep-is": "~0.1.3",
- "fast-levenshtein": "~2.0.6",
- "levn": "~0.3.0",
- "prelude-ls": "~1.1.2",
- "type-check": "~0.3.2",
- "word-wrap": "~1.2.3"
- },
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/escodegen/node_modules/prelude-ls": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
- "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==",
- "dev": true,
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/escodegen/node_modules/type-check": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
- "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==",
- "dev": true,
- "dependencies": {
- "prelude-ls": "~1.1.2"
- },
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/eslint": {
- "version": "8.57.0",
- "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz",
- "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==",
- "dev": true,
- "dependencies": {
- "@eslint-community/eslint-utils": "^4.2.0",
- "@eslint-community/regexpp": "^4.6.1",
- "@eslint/eslintrc": "^2.1.4",
- "@eslint/js": "8.57.0",
- "@humanwhocodes/config-array": "^0.11.14",
- "@humanwhocodes/module-importer": "^1.0.1",
- "@nodelib/fs.walk": "^1.2.8",
- "@ungap/structured-clone": "^1.2.0",
- "ajv": "^6.12.4",
- "chalk": "^4.0.0",
- "cross-spawn": "^7.0.2",
- "debug": "^4.3.2",
- "doctrine": "^3.0.0",
- "escape-string-regexp": "^4.0.0",
- "eslint-scope": "^7.2.2",
- "eslint-visitor-keys": "^3.4.3",
- "espree": "^9.6.1",
- "esquery": "^1.4.2",
- "esutils": "^2.0.2",
- "fast-deep-equal": "^3.1.3",
- "file-entry-cache": "^6.0.1",
- "find-up": "^5.0.0",
- "glob-parent": "^6.0.2",
- "globals": "^13.19.0",
- "graphemer": "^1.4.0",
- "ignore": "^5.2.0",
- "imurmurhash": "^0.1.4",
- "is-glob": "^4.0.0",
- "is-path-inside": "^3.0.3",
- "js-yaml": "^4.1.0",
- "json-stable-stringify-without-jsonify": "^1.0.1",
- "levn": "^0.4.1",
- "lodash.merge": "^4.6.2",
- "minimatch": "^3.1.2",
- "natural-compare": "^1.4.0",
- "optionator": "^0.9.3",
- "strip-ansi": "^6.0.1",
- "text-table": "^0.2.0"
- },
- "bin": {
- "eslint": "bin/eslint.js"
- },
- "engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/eslint"
- }
- },
- "node_modules/eslint-config-prettier": {
- "version": "9.1.0",
- "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz",
- "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==",
- "dev": true,
- "peer": true,
- "bin": {
- "eslint-config-prettier": "bin/cli.js"
- },
- "peerDependencies": {
- "eslint": ">=7.0.0"
- }
- },
- "node_modules/eslint-import-resolver-node": {
- "version": "0.3.9",
- "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz",
- "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==",
- "dev": true,
- "dependencies": {
- "debug": "^3.2.7",
- "is-core-module": "^2.13.0",
- "resolve": "^1.22.4"
- }
- },
- "node_modules/eslint-import-resolver-node/node_modules/debug": {
- "version": "3.2.7",
- "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
- "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
- "dev": true,
- "dependencies": {
- "ms": "^2.1.1"
- }
- },
- "node_modules/eslint-module-utils": {
- "version": "2.8.0",
- "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz",
- "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==",
- "dev": true,
- "dependencies": {
- "debug": "^3.2.7"
- },
- "engines": {
- "node": ">=4"
- },
- "peerDependenciesMeta": {
- "eslint": {
- "optional": true
- }
- }
- },
- "node_modules/eslint-module-utils/node_modules/debug": {
- "version": "3.2.7",
- "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
- "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
- "dev": true,
- "dependencies": {
- "ms": "^2.1.1"
- }
- },
- "node_modules/eslint-plugin-import": {
- "version": "2.29.1",
- "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz",
- "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==",
- "dev": true,
- "dependencies": {
- "array-includes": "^3.1.7",
- "array.prototype.findlastindex": "^1.2.3",
- "array.prototype.flat": "^1.3.2",
- "array.prototype.flatmap": "^1.3.2",
- "debug": "^3.2.7",
- "doctrine": "^2.1.0",
- "eslint-import-resolver-node": "^0.3.9",
- "eslint-module-utils": "^2.8.0",
- "hasown": "^2.0.0",
- "is-core-module": "^2.13.1",
- "is-glob": "^4.0.3",
- "minimatch": "^3.1.2",
- "object.fromentries": "^2.0.7",
- "object.groupby": "^1.0.1",
- "object.values": "^1.1.7",
- "semver": "^6.3.1",
- "tsconfig-paths": "^3.15.0"
- },
- "engines": {
- "node": ">=4"
- },
- "peerDependencies": {
- "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8"
- }
- },
- "node_modules/eslint-plugin-import/node_modules/brace-expansion": {
- "version": "1.1.11",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
- "dev": true,
- "dependencies": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
- }
- },
- "node_modules/eslint-plugin-import/node_modules/debug": {
- "version": "3.2.7",
- "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
- "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
- "dev": true,
- "dependencies": {
- "ms": "^2.1.1"
- }
- },
- "node_modules/eslint-plugin-import/node_modules/doctrine": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
- "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
- "dev": true,
- "dependencies": {
- "esutils": "^2.0.2"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/eslint-plugin-import/node_modules/minimatch": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
- "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
- "dev": true,
- "dependencies": {
- "brace-expansion": "^1.1.7"
- },
- "engines": {
- "node": "*"
- }
- },
- "node_modules/eslint-plugin-import/node_modules/semver": {
- "version": "6.3.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
- "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
- "dev": true,
- "bin": {
- "semver": "bin/semver.js"
- }
- },
- "node_modules/eslint-plugin-mocha": {
- "version": "10.3.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-10.3.0.tgz",
- "integrity": "sha512-IWzbg2K6B1Q7h37Ih4zMyW+nhmw1JvUlHlbCUUUu6PfOOAUGCB0gxmvv7/U+TQQ6e8yHUv+q7KMdIIum4bx+PA==",
- "dev": true,
- "dependencies": {
- "eslint-utils": "^3.0.0",
- "rambda": "^7.4.0"
- },
- "engines": {
- "node": ">=14.0.0"
- },
- "peerDependencies": {
- "eslint": ">=7.0.0"
- }
- },
- "node_modules/eslint-plugin-promise": {
- "version": "6.1.1",
- "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.1.1.tgz",
- "integrity": "sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig==",
- "dev": true,
- "engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
- },
- "peerDependencies": {
- "eslint": "^7.0.0 || ^8.0.0"
- }
- },
- "node_modules/eslint-plugin-react": {
- "version": "7.33.2",
- "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.33.2.tgz",
- "integrity": "sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==",
- "dev": true,
- "dependencies": {
- "array-includes": "^3.1.6",
- "array.prototype.flatmap": "^1.3.1",
- "array.prototype.tosorted": "^1.1.1",
- "doctrine": "^2.1.0",
- "es-iterator-helpers": "^1.0.12",
- "estraverse": "^5.3.0",
- "jsx-ast-utils": "^2.4.1 || ^3.0.0",
- "minimatch": "^3.1.2",
- "object.entries": "^1.1.6",
- "object.fromentries": "^2.0.6",
- "object.hasown": "^1.1.2",
- "object.values": "^1.1.6",
- "prop-types": "^15.8.1",
- "resolve": "^2.0.0-next.4",
- "semver": "^6.3.1",
- "string.prototype.matchall": "^4.0.8"
- },
- "engines": {
- "node": ">=4"
- },
- "peerDependencies": {
- "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8"
- }
- },
- "node_modules/eslint-plugin-react-native": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/eslint-plugin-react-native/-/eslint-plugin-react-native-4.1.0.tgz",
- "integrity": "sha512-QLo7rzTBOl43FvVqDdq5Ql9IoElIuTdjrz9SKAXCvULvBoRZ44JGSkx9z4999ZusCsb4rK3gjS8gOGyeYqZv2Q==",
- "dev": true,
- "dependencies": {
- "eslint-plugin-react-native-globals": "^0.1.1"
- },
- "peerDependencies": {
- "eslint": "^3.17.0 || ^4 || ^5 || ^6 || ^7 || ^8"
- }
- },
- "node_modules/eslint-plugin-react-native-globals": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/eslint-plugin-react-native-globals/-/eslint-plugin-react-native-globals-0.1.2.tgz",
- "integrity": "sha512-9aEPf1JEpiTjcFAmmyw8eiIXmcNZOqaZyHO77wgm0/dWfT/oxC1SrIq8ET38pMxHYrcB6Uew+TzUVsBeczF88g==",
- "dev": true
- },
- "node_modules/eslint-plugin-react/node_modules/brace-expansion": {
- "version": "1.1.11",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
- "dev": true,
- "dependencies": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
- }
- },
- "node_modules/eslint-plugin-react/node_modules/doctrine": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
- "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
- "dev": true,
- "dependencies": {
- "esutils": "^2.0.2"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/eslint-plugin-react/node_modules/minimatch": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
- "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
- "dev": true,
- "dependencies": {
- "brace-expansion": "^1.1.7"
- },
- "engines": {
- "node": "*"
- }
- },
- "node_modules/eslint-plugin-react/node_modules/resolve": {
- "version": "2.0.0-next.5",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz",
- "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==",
- "dev": true,
- "dependencies": {
- "is-core-module": "^2.13.0",
- "path-parse": "^1.0.7",
- "supports-preserve-symlinks-flag": "^1.0.0"
- },
- "bin": {
- "resolve": "bin/resolve"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/eslint-plugin-react/node_modules/semver": {
- "version": "6.3.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
- "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
- "dev": true,
- "bin": {
- "semver": "bin/semver.js"
- }
- },
- "node_modules/eslint-rule-composer": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/eslint-rule-composer/-/eslint-rule-composer-0.3.0.tgz",
- "integrity": "sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg==",
- "dev": true,
- "engines": {
- "node": ">=4.0.0"
- }
- },
- "node_modules/eslint-scope": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
- "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
- "dev": true,
- "dependencies": {
- "esrecurse": "^4.3.0",
- "estraverse": "^4.1.1"
- },
- "engines": {
- "node": ">=8.0.0"
- }
- },
- "node_modules/eslint-scope/node_modules/estraverse": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
- "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
- "dev": true,
- "engines": {
- "node": ">=4.0"
- }
- },
- "node_modules/eslint-utils": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz",
- "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==",
- "dev": true,
- "dependencies": {
- "eslint-visitor-keys": "^2.0.0"
- },
- "engines": {
- "node": "^10.0.0 || ^12.0.0 || >= 14.0.0"
- },
- "funding": {
- "url": "https://github.com/sponsors/mysticatea"
- },
- "peerDependencies": {
- "eslint": ">=5"
- }
- },
- "node_modules/eslint-visitor-keys": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz",
- "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==",
- "dev": true,
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/eslint/node_modules/ajv": {
- "version": "6.12.6",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
- "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
- "dev": true,
- "dependencies": {
- "fast-deep-equal": "^3.1.1",
- "fast-json-stable-stringify": "^2.0.0",
- "json-schema-traverse": "^0.4.1",
- "uri-js": "^4.2.2"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/epoberezkin"
- }
- },
- "node_modules/eslint/node_modules/ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "dev": true,
- "dependencies": {
- "color-convert": "^2.0.1"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/eslint/node_modules/brace-expansion": {
- "version": "1.1.11",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
- "dev": true,
- "dependencies": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
- }
- },
- "node_modules/eslint/node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
- "dev": true,
- "dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
- }
- },
- "node_modules/eslint/node_modules/color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
- "dev": true,
- "dependencies": {
- "color-name": "~1.1.4"
- },
- "engines": {
- "node": ">=7.0.0"
- }
- },
- "node_modules/eslint/node_modules/color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "dev": true
- },
- "node_modules/eslint/node_modules/cross-spawn": {
- "version": "7.0.3",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
- "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
- "dev": true,
- "dependencies": {
- "path-key": "^3.1.0",
- "shebang-command": "^2.0.0",
- "which": "^2.0.1"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/eslint/node_modules/escape-string-regexp": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
- "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
- "dev": true,
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/eslint/node_modules/eslint-scope": {
- "version": "7.2.2",
- "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz",
- "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==",
- "dev": true,
- "dependencies": {
- "esrecurse": "^4.3.0",
- "estraverse": "^5.2.0"
- },
- "engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/eslint"
- }
- },
- "node_modules/eslint/node_modules/eslint-visitor-keys": {
- "version": "3.4.3",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
- "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
- "dev": true,
- "engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/eslint"
- }
- },
- "node_modules/eslint/node_modules/globals": {
- "version": "13.24.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz",
- "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==",
- "dev": true,
- "dependencies": {
- "type-fest": "^0.20.2"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/eslint/node_modules/isexe": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
- "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
- "dev": true
- },
- "node_modules/eslint/node_modules/json-schema-traverse": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
- "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
- "dev": true
- },
- "node_modules/eslint/node_modules/minimatch": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
- "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
- "dev": true,
- "dependencies": {
- "brace-expansion": "^1.1.7"
- },
- "engines": {
- "node": "*"
- }
- },
- "node_modules/eslint/node_modules/shebang-command": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
- "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
- "dev": true,
- "dependencies": {
- "shebang-regex": "^3.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/eslint/node_modules/shebang-regex": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
- "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/eslint/node_modules/supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
- "dev": true,
- "dependencies": {
- "has-flag": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/eslint/node_modules/type-fest": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
- "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
- "dev": true,
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/eslint/node_modules/which": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
- "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
- "dev": true,
- "dependencies": {
- "isexe": "^2.0.0"
- },
- "bin": {
- "node-which": "bin/node-which"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/espree": {
- "version": "9.6.1",
- "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz",
- "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==",
- "dev": true,
- "dependencies": {
- "acorn": "^8.9.0",
- "acorn-jsx": "^5.3.2",
- "eslint-visitor-keys": "^3.4.1"
- },
- "engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/eslint"
- }
- },
- "node_modules/espree/node_modules/eslint-visitor-keys": {
- "version": "3.4.3",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
- "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
- "dev": true,
- "engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/eslint"
- }
- },
- "node_modules/esprima": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz",
- "integrity": "sha512-AWwVMNxwhN8+NIPQzAQZCm7RkLC4RbM3B1OobMuyp3i+w73X57KCKaVIxaRZb+DYCojq7rspo+fmuQfAboyhFg==",
- "dev": true,
- "bin": {
- "esparse": "bin/esparse.js",
- "esvalidate": "bin/esvalidate.js"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/esquery": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz",
- "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==",
- "dev": true,
- "dependencies": {
- "estraverse": "^5.1.0"
- },
- "engines": {
- "node": ">=0.10"
- }
- },
- "node_modules/esrecurse": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
- "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
- "dev": true,
- "dependencies": {
- "estraverse": "^5.2.0"
- },
- "engines": {
- "node": ">=4.0"
- }
- },
- "node_modules/estraverse": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
- "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
- "dev": true,
- "engines": {
- "node": ">=4.0"
- }
- },
- "node_modules/esutils": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
- "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/etag": {
- "version": "1.8.1",
- "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
- "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
- "dev": true,
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/event-target-shim": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz",
- "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==",
- "dev": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/events": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
- "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==",
- "dev": true,
- "engines": {
- "node": ">=0.8.x"
- }
- },
- "node_modules/evp_bytestokey": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz",
- "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==",
- "dev": true,
- "dependencies": {
- "md5.js": "^1.3.4",
- "safe-buffer": "^5.1.1"
- }
- },
- "node_modules/expand-brackets": {
- "version": "2.1.4",
- "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
- "integrity": "sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==",
- "dev": true,
- "dependencies": {
- "debug": "^2.3.3",
- "define-property": "^0.2.5",
- "extend-shallow": "^2.0.1",
- "posix-character-classes": "^0.1.0",
- "regex-not": "^1.0.0",
- "snapdragon": "^0.8.1",
- "to-regex": "^3.0.1"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/expand-brackets/node_modules/debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "dev": true,
- "dependencies": {
- "ms": "2.0.0"
- }
- },
- "node_modules/expand-brackets/node_modules/define-property": {
- "version": "0.2.5",
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
- "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==",
- "dev": true,
- "dependencies": {
- "is-descriptor": "^0.1.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/expand-brackets/node_modules/extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==",
- "dev": true,
- "dependencies": {
- "is-extendable": "^0.1.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/expand-brackets/node_modules/is-descriptor": {
- "version": "0.1.7",
- "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.7.tgz",
- "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==",
- "dev": true,
- "dependencies": {
- "is-accessor-descriptor": "^1.0.1",
- "is-data-descriptor": "^1.0.1"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/expand-brackets/node_modules/is-extendable": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
- "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/expand-brackets/node_modules/ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
- "dev": true
- },
- "node_modules/express": {
- "version": "4.18.2",
- "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz",
- "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "accepts": "~1.3.8",
- "array-flatten": "1.1.1",
- "body-parser": "1.20.1",
- "content-disposition": "0.5.4",
- "content-type": "~1.0.4",
- "cookie": "0.5.0",
- "cookie-signature": "1.0.6",
- "debug": "2.6.9",
- "depd": "2.0.0",
- "encodeurl": "~1.0.2",
- "escape-html": "~1.0.3",
- "etag": "~1.8.1",
- "finalhandler": "1.2.0",
- "fresh": "0.5.2",
- "http-errors": "2.0.0",
- "merge-descriptors": "1.0.1",
- "methods": "~1.1.2",
- "on-finished": "2.4.1",
- "parseurl": "~1.3.3",
- "path-to-regexp": "0.1.7",
- "proxy-addr": "~2.0.7",
- "qs": "6.11.0",
- "range-parser": "~1.2.1",
- "safe-buffer": "5.2.1",
- "send": "0.18.0",
- "serve-static": "1.15.0",
- "setprototypeof": "1.2.0",
- "statuses": "2.0.1",
- "type-is": "~1.6.18",
- "utils-merge": "1.0.1",
- "vary": "~1.1.2"
- },
- "engines": {
- "node": ">= 0.10.0"
- }
- },
- "node_modules/express/node_modules/body-parser": {
- "version": "1.20.1",
- "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz",
- "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "bytes": "3.1.2",
- "content-type": "~1.0.4",
- "debug": "2.6.9",
- "depd": "2.0.0",
- "destroy": "1.2.0",
- "http-errors": "2.0.0",
- "iconv-lite": "0.4.24",
- "on-finished": "2.4.1",
- "qs": "6.11.0",
- "raw-body": "2.5.1",
- "type-is": "~1.6.18",
- "unpipe": "1.0.0"
- },
- "engines": {
- "node": ">= 0.8",
- "npm": "1.2.8000 || >= 1.4.16"
- }
- },
- "node_modules/express/node_modules/debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "ms": "2.0.0"
- }
- },
- "node_modules/express/node_modules/ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
- "dev": true,
- "peer": true
- },
- "node_modules/express/node_modules/path-to-regexp": {
- "version": "0.1.7",
- "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
- "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==",
- "dev": true,
- "peer": true
- },
- "node_modules/express/node_modules/raw-body": {
- "version": "2.5.1",
- "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz",
- "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "bytes": "3.1.2",
- "http-errors": "2.0.0",
- "iconv-lite": "0.4.24",
- "unpipe": "1.0.0"
- },
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/extend": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
- "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
- "dev": true
- },
- "node_modules/extend-shallow": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
- "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==",
- "dev": true,
- "dependencies": {
- "assign-symbols": "^1.0.0",
- "is-extendable": "^1.0.1"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/extglob": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
- "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
- "dev": true,
- "dependencies": {
- "array-unique": "^0.3.2",
- "define-property": "^1.0.0",
- "expand-brackets": "^2.1.4",
- "extend-shallow": "^2.0.1",
- "fragment-cache": "^0.2.1",
- "regex-not": "^1.0.0",
- "snapdragon": "^0.8.1",
- "to-regex": "^3.0.1"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/extglob/node_modules/define-property": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
- "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==",
- "dev": true,
- "dependencies": {
- "is-descriptor": "^1.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/extglob/node_modules/extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==",
- "dev": true,
- "dependencies": {
- "is-extendable": "^0.1.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/extglob/node_modules/is-extendable": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
- "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/extract-zip": {
- "version": "1.7.0",
- "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.7.0.tgz",
- "integrity": "sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA==",
- "dependencies": {
- "concat-stream": "^1.6.2",
- "debug": "^2.6.9",
- "mkdirp": "^0.5.4",
- "yauzl": "^2.10.0"
- },
- "bin": {
- "extract-zip": "cli.js"
- }
- },
- "node_modules/extract-zip/node_modules/debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "dependencies": {
- "ms": "2.0.0"
- }
- },
- "node_modules/extract-zip/node_modules/mkdirp": {
- "version": "0.5.6",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz",
- "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
- "dependencies": {
- "minimist": "^1.2.6"
- },
- "bin": {
- "mkdirp": "bin/cmd.js"
- }
- },
- "node_modules/extract-zip/node_modules/ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
- },
- "node_modules/extsprintf": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
- "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==",
- "dev": true,
- "engines": [
- "node >=0.6.0"
- ]
- },
- "node_modules/falafel": {
- "version": "2.2.5",
- "resolved": "https://registry.npmjs.org/falafel/-/falafel-2.2.5.tgz",
- "integrity": "sha512-HuC1qF9iTnHDnML9YZAdCDQwT0yKl/U55K4XSUXqGAA2GLoafFgWRqdAbhWJxXaYD4pyoVxAJ8wH670jMpI9DQ==",
- "dev": true,
- "dependencies": {
- "acorn": "^7.1.1",
- "isarray": "^2.0.1"
- },
- "engines": {
- "node": ">=0.4.0"
- }
- },
- "node_modules/falafel/node_modules/acorn": {
- "version": "7.4.1",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
- "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
- "dev": true,
- "bin": {
- "acorn": "bin/acorn"
- },
- "engines": {
- "node": ">=0.4.0"
- }
- },
- "node_modules/fast-deep-equal": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
- "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
- "dev": true
- },
- "node_modules/fast-fifo": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz",
- "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==",
- "dev": true
- },
- "node_modules/fast-glob": {
- "version": "2.2.7",
- "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz",
- "integrity": "sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==",
- "dev": true,
- "dependencies": {
- "@mrmlnc/readdir-enhanced": "^2.2.1",
- "@nodelib/fs.stat": "^1.1.2",
- "glob-parent": "^3.1.0",
- "is-glob": "^4.0.0",
- "merge2": "^1.2.3",
- "micromatch": "^3.1.10"
- },
- "engines": {
- "node": ">=4.0.0"
- }
- },
- "node_modules/fast-glob/node_modules/@nodelib/fs.stat": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz",
- "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==",
- "dev": true,
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/fast-glob/node_modules/glob-parent": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
- "integrity": "sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==",
- "dev": true,
- "dependencies": {
- "is-glob": "^3.1.0",
- "path-dirname": "^1.0.0"
- }
- },
- "node_modules/fast-glob/node_modules/glob-parent/node_modules/is-glob": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
- "integrity": "sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==",
- "dev": true,
- "dependencies": {
- "is-extglob": "^2.1.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/fast-json-stable-stringify": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
- "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
- "dev": true
- },
- "node_modules/fast-levenshtein": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
- "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
- "dev": true
- },
- "node_modules/fastparse": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz",
- "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==",
- "dev": true
- },
- "node_modules/fastq": {
- "version": "1.16.0",
- "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.16.0.tgz",
- "integrity": "sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==",
- "dev": true,
- "dependencies": {
- "reusify": "^1.0.4"
- }
- },
- "node_modules/fd-slicer": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz",
- "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==",
- "dependencies": {
- "pend": "~1.2.0"
- }
- },
- "node_modules/fecha": {
- "version": "4.2.3",
- "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz",
- "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==",
- "dev": true,
- "peer": true
- },
- "node_modules/file-entry-cache": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
- "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
- "dev": true,
- "dependencies": {
- "flat-cache": "^3.0.4"
- },
- "engines": {
- "node": "^10.12.0 || >=12.0.0"
- }
- },
- "node_modules/file-uri-to-path": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz",
- "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==",
- "dev": true
- },
- "node_modules/filelist": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz",
- "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==",
- "dev": true,
- "dependencies": {
- "minimatch": "^5.0.1"
- }
- },
- "node_modules/filesize": {
- "version": "3.6.1",
- "resolved": "https://registry.npmjs.org/filesize/-/filesize-3.6.1.tgz",
- "integrity": "sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg==",
- "dev": true,
- "engines": {
- "node": ">= 0.4.0"
- }
- },
- "node_modules/fill-range": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
- "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
- "dev": true,
- "dependencies": {
- "to-regex-range": "^5.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/finalhandler": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz",
- "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "debug": "2.6.9",
- "encodeurl": "~1.0.2",
- "escape-html": "~1.0.3",
- "on-finished": "2.4.1",
- "parseurl": "~1.3.3",
- "statuses": "2.0.1",
- "unpipe": "~1.0.0"
- },
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/finalhandler/node_modules/debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "dev": true,
- "peer": true,
- "dependencies": {
- "ms": "2.0.0"
- }
- },
- "node_modules/finalhandler/node_modules/ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
- "dev": true,
- "peer": true
- },
- "node_modules/find-cache-dir": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz",
- "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==",
- "dev": true,
- "dependencies": {
- "commondir": "^1.0.1",
- "make-dir": "^2.0.0",
- "pkg-dir": "^3.0.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/find-cache-dir/node_modules/find-up": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
- "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
- "dev": true,
- "dependencies": {
- "locate-path": "^3.0.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/find-cache-dir/node_modules/locate-path": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
- "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
- "dev": true,
- "dependencies": {
- "p-locate": "^3.0.0",
- "path-exists": "^3.0.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/find-cache-dir/node_modules/p-limit": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
- "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
- "dev": true,
- "dependencies": {
- "p-try": "^2.0.0"
- },
- "engines": {
- "node": ">=6"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/find-cache-dir/node_modules/p-locate": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
- "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
- "dev": true,
- "dependencies": {
- "p-limit": "^2.0.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/find-cache-dir/node_modules/path-exists": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
- "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==",
- "dev": true,
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/find-cache-dir/node_modules/pkg-dir": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz",
- "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==",
- "dev": true,
- "dependencies": {
- "find-up": "^3.0.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/find-up": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
- "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
- "dev": true,
- "dependencies": {
- "locate-path": "^6.0.0",
- "path-exists": "^4.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/flat": {
- "version": "5.0.2",
- "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz",
- "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==",
- "dev": true,
- "bin": {
- "flat": "cli.js"
- }
- },
- "node_modules/flat-cache": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz",
- "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==",
- "dev": true,
- "dependencies": {
- "flatted": "^3.2.9",
- "keyv": "^4.5.3",
- "rimraf": "^3.0.2"
- },
- "engines": {
- "node": "^10.12.0 || >=12.0.0"
- }
- },
- "node_modules/flat-cache/node_modules/brace-expansion": {
- "version": "1.1.11",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
- "dev": true,
- "dependencies": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
- }
- },
- "node_modules/flat-cache/node_modules/glob": {
- "version": "7.2.3",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
- "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
- "dev": true,
- "dependencies": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.1.1",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
- },
- "engines": {
- "node": "*"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/flat-cache/node_modules/minimatch": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
- "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
- "dev": true,
- "dependencies": {
- "brace-expansion": "^1.1.7"
- },
- "engines": {
- "node": "*"
- }
- },
- "node_modules/flat-cache/node_modules/rimraf": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
- "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
- "dev": true,
- "dependencies": {
- "glob": "^7.1.3"
- },
- "bin": {
- "rimraf": "bin.js"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/flatted": {
- "version": "3.2.9",
- "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz",
- "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==",
- "dev": true
- },
- "node_modules/fn.name": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz",
- "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==",
- "dev": true,
- "peer": true
- },
- "node_modules/follow-redirects": {
- "version": "1.15.4",
- "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.4.tgz",
- "integrity": "sha512-Cr4D/5wlrb0z9dgERpUL3LrmPKVDsETIJhaCMeDfuFYcqa5bldGV6wBsAN6X/vxlXQtFBMrXdXxdL8CbDTGniw==",
- "funding": [
- {
- "type": "individual",
- "url": "https://github.com/sponsors/RubenVerborgh"
- }
- ],
- "engines": {
- "node": ">=4.0"
- },
- "peerDependenciesMeta": {
- "debug": {
- "optional": true
- }
- }
- },
- "node_modules/for-each": {
- "version": "0.3.3",
- "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz",
- "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==",
- "dev": true,
- "dependencies": {
- "is-callable": "^1.1.3"
- }
- },
- "node_modules/for-in": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
- "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/foreground-child": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz",
- "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==",
- "dev": true,
- "dependencies": {
- "cross-spawn": "^7.0.0",
- "signal-exit": "^4.0.1"
- },
- "engines": {
- "node": ">=14"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/foreground-child/node_modules/cross-spawn": {
- "version": "7.0.3",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
- "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
- "dev": true,
- "dependencies": {
- "path-key": "^3.1.0",
- "shebang-command": "^2.0.0",
- "which": "^2.0.1"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/foreground-child/node_modules/isexe": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
- "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
- "dev": true
- },
- "node_modules/foreground-child/node_modules/shebang-command": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
- "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
- "dev": true,
- "dependencies": {
- "shebang-regex": "^3.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/foreground-child/node_modules/shebang-regex": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
- "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/foreground-child/node_modules/which": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
- "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
- "dev": true,
- "dependencies": {
- "isexe": "^2.0.0"
- },
- "bin": {
- "node-which": "bin/node-which"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/forever-agent": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
- "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==",
- "dev": true,
- "engines": {
- "node": "*"
- }
- },
- "node_modules/form-data": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
- "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
- "dependencies": {
- "asynckit": "^0.4.0",
- "combined-stream": "^1.0.8",
- "mime-types": "^2.1.12"
- },
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/forwarded": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
- "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/fragment-cache": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz",
- "integrity": "sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==",
- "dev": true,
- "dependencies": {
- "map-cache": "^0.2.2"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/fresh": {
- "version": "0.5.2",
- "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
- "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
- "dev": true,
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/fs-constants": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz",
- "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==",
- "dev": true
- },
- "node_modules/fs-extra": {
- "version": "8.1.0",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz",
- "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==",
- "dependencies": {
- "graceful-fs": "^4.2.0",
- "jsonfile": "^4.0.0",
- "universalify": "^0.1.0"
- },
- "engines": {
- "node": ">=6 <7 || >=8"
- }
- },
- "node_modules/fs-jetpack": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/fs-jetpack/-/fs-jetpack-5.1.0.tgz",
- "integrity": "sha512-Xn4fDhLydXkuzepZVsr02jakLlmoARPy+YWIclo4kh0GyNGUHnTqeH/w/qIsVn50dFxtp8otPL2t/HcPJBbxUA==",
- "dev": true,
- "dependencies": {
- "minimatch": "^5.1.0"
- }
- },
- "node_modules/fs-minipass": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz",
- "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==",
- "dev": true,
- "dependencies": {
- "minipass": "^3.0.0"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/fs-minipass/node_modules/minipass": {
- "version": "3.3.6",
- "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
- "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
- "dev": true,
- "dependencies": {
- "yallist": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/fs-minipass/node_modules/yallist": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
- "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
- "dev": true
- },
- "node_modules/fs.realpath": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
- "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="
- },
- "node_modules/fsevents": {
- "version": "2.3.3",
- "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
- "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
- "dev": true,
- "hasInstallScript": true,
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
- }
- },
- "node_modules/ftp-response-parser": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/ftp-response-parser/-/ftp-response-parser-1.0.1.tgz",
- "integrity": "sha512-++Ahlo2hs/IC7UVQzjcSAfeUpCwTTzs4uvG5XfGnsinIFkWUYF4xWwPd5qZuK8MJrmUIxFMuHcfqaosCDjvIWw==",
- "dev": true,
- "dependencies": {
- "readable-stream": "^1.0.31"
- },
- "engines": {
- "node": ">=0.8.0"
- }
- },
- "node_modules/ftp-response-parser/node_modules/isarray": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
- "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==",
- "dev": true
- },
- "node_modules/ftp-response-parser/node_modules/readable-stream": {
- "version": "1.1.14",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
- "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==",
- "dev": true,
- "dependencies": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.1",
- "isarray": "0.0.1",
- "string_decoder": "~0.10.x"
- }
- },
- "node_modules/ftp-response-parser/node_modules/string_decoder": {
- "version": "0.10.31",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
- "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==",
- "dev": true
- },
- "node_modules/function-bind": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
- "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
- "devOptional": true,
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/function.prototype.name": {
- "version": "1.1.6",
- "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz",
- "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.2.0",
- "es-abstract": "^1.22.1",
- "functions-have-names": "^1.2.3"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/functions-have-names": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz",
- "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==",
- "dev": true,
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/gauge": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/gauge/-/gauge-5.0.1.tgz",
- "integrity": "sha512-CmykPMJGuNan/3S4kZOpvvPYSNqSHANiWnh9XcMU2pSjtBfF0XzZ2p1bFAxTbnFxyBuPxQYHhzwaoOmUdqzvxQ==",
- "dev": true,
- "dependencies": {
- "aproba": "^1.0.3 || ^2.0.0",
- "color-support": "^1.1.3",
- "console-control-strings": "^1.1.0",
- "has-unicode": "^2.0.1",
- "signal-exit": "^4.0.1",
- "string-width": "^4.2.3",
- "strip-ansi": "^6.0.1",
- "wide-align": "^1.1.5"
- },
- "engines": {
- "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
- }
- },
- "node_modules/generic-names": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/generic-names/-/generic-names-2.0.1.tgz",
- "integrity": "sha512-kPCHWa1m9wGG/OwQpeweTwM/PYiQLrUIxXbt/P4Nic3LbGjCP0YwrALHW1uNLKZ0LIMg+RF+XRlj2ekT9ZlZAQ==",
- "dev": true,
- "dependencies": {
- "loader-utils": "^1.1.0"
- }
- },
- "node_modules/gensync": {
- "version": "1.0.0-beta.2",
- "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
- "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
- "dev": true,
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/get-caller-file": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
- "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
- "dev": true,
- "engines": {
- "node": "6.* || 8.* || >= 10.*"
- }
- },
- "node_modules/get-func-name": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz",
- "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==",
- "dev": true,
- "engines": {
- "node": "*"
- }
- },
- "node_modules/get-intrinsic": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz",
- "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==",
- "devOptional": true,
- "dependencies": {
- "function-bind": "^1.1.2",
- "has-proto": "^1.0.1",
- "has-symbols": "^1.0.3",
- "hasown": "^2.0.0"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/get-port": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz",
- "integrity": "sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==",
- "dev": true,
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/get-stream": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
- "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
- "dev": true,
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/get-symbol-description": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz",
- "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "get-intrinsic": "^1.1.1"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/get-uri": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.2.tgz",
- "integrity": "sha512-5KLucCJobh8vBY1K07EFV4+cPZH3mrV9YeAruUseCQKHB58SGjjT2l9/eA9LD082IiuMjSlFJEcdJ27TXvbZNw==",
- "dev": true,
- "dependencies": {
- "basic-ftp": "^5.0.2",
- "data-uri-to-buffer": "^6.0.0",
- "debug": "^4.3.4",
- "fs-extra": "^8.1.0"
- },
- "engines": {
- "node": ">= 14"
- }
- },
- "node_modules/get-value": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
- "integrity": "sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/getpass": {
- "version": "0.1.7",
- "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
- "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==",
- "dev": true,
- "dependencies": {
- "assert-plus": "^1.0.0"
- }
- },
- "node_modules/glob": {
- "version": "10.3.10",
- "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz",
- "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==",
- "dev": true,
- "dependencies": {
- "foreground-child": "^3.1.0",
- "jackspeak": "^2.3.5",
- "minimatch": "^9.0.1",
- "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0",
- "path-scurry": "^1.10.1"
- },
- "bin": {
- "glob": "dist/esm/bin.mjs"
- },
- "engines": {
- "node": ">=16 || 14 >=14.17"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/glob-parent": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
- "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
- "dev": true,
- "dependencies": {
- "is-glob": "^4.0.3"
- },
- "engines": {
- "node": ">=10.13.0"
- }
- },
- "node_modules/glob-to-regexp": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz",
- "integrity": "sha512-Iozmtbqv0noj0uDDqoL0zNq0VBEfK2YFoMAZoxJe4cwphvLR+JskfF30QhXHOR4m3KrE6NLRYw+U9MRXvifyig==",
- "dev": true
- },
- "node_modules/glob/node_modules/minimatch": {
- "version": "9.0.3",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz",
- "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==",
- "dev": true,
- "dependencies": {
- "brace-expansion": "^2.0.1"
- },
- "engines": {
- "node": ">=16 || 14 >=14.17"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/global-agent": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-3.0.0.tgz",
- "integrity": "sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==",
- "optional": true,
- "dependencies": {
- "boolean": "^3.0.1",
- "es6-error": "^4.1.1",
- "matcher": "^3.0.0",
- "roarr": "^2.15.3",
- "semver": "^7.3.2",
- "serialize-error": "^7.0.1"
- },
- "engines": {
- "node": ">=10.0"
- }
- },
- "node_modules/global-tunnel-ng": {
- "version": "2.7.1",
- "resolved": "https://registry.npmjs.org/global-tunnel-ng/-/global-tunnel-ng-2.7.1.tgz",
- "integrity": "sha512-4s+DyciWBV0eK148wqXxcmVAbFVPqtc3sEtUE/GTQfuU80rySLcMhUmHKSHI7/LDj8q0gDYI1lIhRRB7ieRAqg==",
- "optional": true,
- "dependencies": {
- "encodeurl": "^1.0.2",
- "lodash": "^4.17.10",
- "npm-conf": "^1.1.3",
- "tunnel": "^0.0.6"
- },
- "engines": {
- "node": ">=0.10"
- }
- },
- "node_modules/globals": {
- "version": "11.12.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
- "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
- "dev": true,
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/globalthis": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz",
- "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==",
- "devOptional": true,
- "dependencies": {
- "define-properties": "^1.1.3"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/gopd": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
- "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
- "devOptional": true,
- "dependencies": {
- "get-intrinsic": "^1.1.3"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/got": {
- "version": "9.6.0",
- "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz",
- "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==",
- "dependencies": {
- "@sindresorhus/is": "^0.14.0",
- "@szmarczak/http-timer": "^1.1.2",
- "cacheable-request": "^6.0.0",
- "decompress-response": "^3.3.0",
- "duplexer3": "^0.1.4",
- "get-stream": "^4.1.0",
- "lowercase-keys": "^1.0.1",
- "mimic-response": "^1.0.1",
- "p-cancelable": "^1.0.0",
- "to-readable-stream": "^1.0.0",
- "url-parse-lax": "^3.0.0"
- },
- "engines": {
- "node": ">=8.6"
- }
- },
- "node_modules/got/node_modules/get-stream": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz",
- "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==",
- "dependencies": {
- "pump": "^3.0.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/graceful-fs": {
- "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=="
- },
- "node_modules/grapheme-breaker": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/grapheme-breaker/-/grapheme-breaker-0.3.2.tgz",
- "integrity": "sha512-mB6rwkw1Z7z4z2RkFFTd/+q6Ug1gnCgjKAervAKgBeNI1mSr8E5EUWoYzFNOZsLHFArLfpk+O8X8qXC7uvuawQ==",
- "dev": true,
- "dependencies": {
- "brfs": "^1.2.0",
- "unicode-trie": "^0.3.1"
- }
- },
- "node_modules/grapheme-splitter": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz",
- "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==",
- "dev": true
- },
- "node_modules/graphemer": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz",
- "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==",
- "dev": true
- },
- "node_modules/handle-thing": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz",
- "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==",
- "dev": true,
- "optional": true,
- "peer": true
- },
- "node_modules/har-schema": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
- "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==",
- "dev": true,
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/har-validator": {
- "version": "5.1.5",
- "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz",
- "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==",
- "deprecated": "this library is no longer supported",
- "dev": true,
- "dependencies": {
- "ajv": "^6.12.3",
- "har-schema": "^2.0.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/har-validator/node_modules/ajv": {
- "version": "6.12.6",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
- "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
- "dev": true,
- "dependencies": {
- "fast-deep-equal": "^3.1.1",
- "fast-json-stable-stringify": "^2.0.0",
- "json-schema-traverse": "^0.4.1",
- "uri-js": "^4.2.2"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/epoberezkin"
- }
- },
- "node_modules/har-validator/node_modules/json-schema-traverse": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
- "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
- "dev": true
- },
- "node_modules/has": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/has/-/has-1.0.4.tgz",
- "integrity": "sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==",
- "dev": true,
- "engines": {
- "node": ">= 0.4.0"
- }
- },
- "node_modules/has-ansi": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
- "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==",
- "dev": true,
- "dependencies": {
- "ansi-regex": "^2.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/has-ansi/node_modules/ansi-regex": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
- "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/has-bigints": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz",
- "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==",
- "dev": true,
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/has-flag": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/has-property-descriptors": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz",
- "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==",
- "devOptional": true,
- "dependencies": {
- "get-intrinsic": "^1.2.2"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/has-proto": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz",
- "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==",
- "devOptional": true,
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/has-symbols": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
- "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
- "devOptional": true,
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/has-tostringtag": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz",
- "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==",
- "dev": true,
- "dependencies": {
- "has-symbols": "^1.0.2"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/has-unicode": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
- "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==",
- "dev": true
- },
- "node_modules/has-value": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz",
- "integrity": "sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==",
- "dev": true,
- "dependencies": {
- "get-value": "^2.0.6",
- "has-values": "^1.0.0",
- "isobject": "^3.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/has-values": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz",
- "integrity": "sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==",
- "dev": true,
- "dependencies": {
- "is-number": "^3.0.0",
- "kind-of": "^4.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/has-values/node_modules/kind-of": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
- "integrity": "sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==",
- "dev": true,
- "dependencies": {
- "is-buffer": "^1.1.5"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/hash-base": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz",
- "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==",
- "dev": true,
- "dependencies": {
- "inherits": "^2.0.4",
- "readable-stream": "^3.6.0",
- "safe-buffer": "^5.2.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/hash.js": {
- "version": "1.1.7",
- "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz",
- "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==",
- "dev": true,
- "dependencies": {
- "inherits": "^2.0.3",
- "minimalistic-assert": "^1.0.1"
- }
- },
- "node_modules/hasown": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz",
- "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==",
- "devOptional": true,
- "dependencies": {
- "function-bind": "^1.1.2"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/he": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
- "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
- "dev": true,
- "bin": {
- "he": "bin/he"
- }
- },
- "node_modules/hex-color-regex": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz",
- "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==",
- "dev": true
- },
- "node_modules/highlight.js": {
- "version": "11.9.0",
- "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.9.0.tgz",
- "integrity": "sha512-fJ7cW7fQGCYAkgv4CPfwFHrfd/cLS4Hau96JuJ+ZTOWhjnhoeN1ub1tFmALm/+lW5z4WCAuAV9bm05AP0mS6Gw==",
- "engines": {
- "node": ">=12.0.0"
- }
- },
- "node_modules/hmac-drbg": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz",
- "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==",
- "dev": true,
- "dependencies": {
- "hash.js": "^1.0.3",
- "minimalistic-assert": "^1.0.0",
- "minimalistic-crypto-utils": "^1.0.1"
- }
- },
- "node_modules/hosted-git-info": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz",
- "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==",
- "dev": true,
- "dependencies": {
- "lru-cache": "^6.0.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/hosted-git-info/node_modules/lru-cache": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
- "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
- "dev": true,
- "dependencies": {
- "yallist": "^4.0.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/hosted-git-info/node_modules/yallist": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
- "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
- "dev": true
- },
- "node_modules/hpack.js": {
- "version": "2.1.6",
- "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz",
- "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==",
- "dev": true,
- "optional": true,
- "peer": true,
- "dependencies": {
- "inherits": "^2.0.1",
- "obuf": "^1.0.0",
- "readable-stream": "^2.0.1",
- "wbuf": "^1.1.0"
- }
- },
- "node_modules/hpack.js/node_modules/isarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
- "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
- "dev": true,
- "optional": true,
- "peer": true
- },
- "node_modules/hpack.js/node_modules/readable-stream": {
- "version": "2.3.8",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
- "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
- "dev": true,
- "optional": true,
- "peer": true,
- "dependencies": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.3",
- "isarray": "~1.0.0",
- "process-nextick-args": "~2.0.0",
- "safe-buffer": "~5.1.1",
- "string_decoder": "~1.1.1",
- "util-deprecate": "~1.0.1"
- }
- },
- "node_modules/hpack.js/node_modules/safe-buffer": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
- "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
- "dev": true,
- "optional": true,
- "peer": true
- },
- "node_modules/hpack.js/node_modules/string_decoder": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
- "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
- "dev": true,
- "optional": true,
- "peer": true,
- "dependencies": {
- "safe-buffer": "~5.1.0"
- }
- },
- "node_modules/hsl-regex": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz",
- "integrity": "sha512-M5ezZw4LzXbBKMruP+BNANf0k+19hDQMgpzBIYnya//Al+fjNct9Wf3b1WedLqdEs2hKBvxq/jh+DsHJLj0F9A==",
- "dev": true
- },
- "node_modules/hsla-regex": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz",
- "integrity": "sha512-7Wn5GMLuHBjZCb2bTmnDOycho0p/7UVaAeqXZGbHrBCl6Yd/xDhQJAXe6Ga9AXJH2I5zY1dEdYw2u1UptnSBJA==",
- "dev": true
- },
- "node_modules/html-encoding-sniffer": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz",
- "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==",
- "dev": true,
- "dependencies": {
- "whatwg-encoding": "^1.0.1"
- }
- },
- "node_modules/html-parse-stringify": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/html-parse-stringify/-/html-parse-stringify-3.0.1.tgz",
- "integrity": "sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg==",
- "dependencies": {
- "void-elements": "3.1.0"
- }
- },
- "node_modules/html-tags": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-1.2.0.tgz",
- "integrity": "sha512-uVteDXUCs08M7QJx0eY6ue7qQztwIfknap81vAtNob2sdEPKa8PjPinx0vxbs2JONPamovZjMvKZWNW44/PBKg==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/htmlnano": {
- "version": "0.2.9",
- "resolved": "https://registry.npmjs.org/htmlnano/-/htmlnano-0.2.9.tgz",
- "integrity": "sha512-jWTtP3dCd7R8x/tt9DK3pvpcQd7HDMcRPUqPxr/i9989q2k5RHIhmlRDFeyQ/LSd8IKrteG8Ce5g0Ig4eGIipg==",
- "dev": true,
- "dependencies": {
- "cssnano": "^4.1.11",
- "posthtml": "^0.15.1",
- "purgecss": "^2.3.0",
- "relateurl": "^0.2.7",
- "srcset": "^3.0.0",
- "svgo": "^1.3.2",
- "terser": "^5.6.1",
- "timsort": "^0.3.0",
- "uncss": "^0.17.3"
- }
- },
- "node_modules/htmlnano/node_modules/commander": {
- "version": "2.20.3",
- "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
- "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
- "dev": true
- },
- "node_modules/htmlnano/node_modules/htmlparser2": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz",
- "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==",
- "dev": true,
- "funding": [
- "https://github.com/fb55/htmlparser2?sponsor=1",
- {
- "type": "github",
- "url": "https://github.com/sponsors/fb55"
- }
- ],
- "dependencies": {
- "domelementtype": "^2.0.1",
- "domhandler": "^4.0.0",
- "domutils": "^2.5.2",
- "entities": "^2.0.0"
- }
- },
- "node_modules/htmlnano/node_modules/posthtml": {
- "version": "0.15.2",
- "resolved": "https://registry.npmjs.org/posthtml/-/posthtml-0.15.2.tgz",
- "integrity": "sha512-YugEJ5ze/0DLRIVBjCpDwANWL4pPj1kHJ/2llY8xuInr0nbkon3qTiMPe5LQa+cCwNjxS7nAZZTp+1M+6mT4Zg==",
- "dev": true,
- "dependencies": {
- "posthtml-parser": "^0.7.2",
- "posthtml-render": "^1.3.1"
- },
- "engines": {
- "node": ">=10.0.0"
- }
- },
- "node_modules/htmlnano/node_modules/posthtml-parser": {
- "version": "0.7.2",
- "resolved": "https://registry.npmjs.org/posthtml-parser/-/posthtml-parser-0.7.2.tgz",
- "integrity": "sha512-LjEEG/3fNcWZtBfsOE3Gbyg1Li4CmsZRkH1UmbMR7nKdMXVMYI3B4/ZMiCpaq8aI1Aym4FRMMW9SAOLSwOnNsQ==",
- "dev": true,
- "dependencies": {
- "htmlparser2": "^6.0.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/htmlnano/node_modules/terser": {
- "version": "5.26.0",
- "resolved": "https://registry.npmjs.org/terser/-/terser-5.26.0.tgz",
- "integrity": "sha512-dytTGoE2oHgbNV9nTzgBEPaqAWvcJNl66VZ0BkJqlvp71IjO8CxdBx/ykCNb47cLnCmCvRZ6ZR0tLkqvZCdVBQ==",
- "dev": true,
- "dependencies": {
- "@jridgewell/source-map": "^0.3.3",
- "acorn": "^8.8.2",
- "commander": "^2.20.0",
- "source-map-support": "~0.5.20"
- },
- "bin": {
- "terser": "bin/terser"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/htmlparser2": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-7.2.0.tgz",
- "integrity": "sha512-H7MImA4MS6cw7nbyURtLPO1Tms7C5H602LRETv95z1MxO/7CP7rDVROehUYeYBUYEON94NXXDEPmZuq+hX4sog==",
- "funding": [
- "https://github.com/fb55/htmlparser2?sponsor=1",
- {
- "type": "github",
- "url": "https://github.com/sponsors/fb55"
- }
- ],
- "dependencies": {
- "domelementtype": "^2.0.1",
- "domhandler": "^4.2.2",
- "domutils": "^2.8.0",
- "entities": "^3.0.1"
- }
- },
- "node_modules/htmlparser2/node_modules/entities": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz",
- "integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==",
- "engines": {
- "node": ">=0.12"
- },
- "funding": {
- "url": "https://github.com/fb55/entities?sponsor=1"
- }
- },
- "node_modules/http-cache-semantics": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz",
- "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ=="
- },
- "node_modules/http-deceiver": {
- "version": "1.2.7",
- "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz",
- "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==",
- "dev": true,
- "optional": true,
- "peer": true
- },
- "node_modules/http-errors": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
- "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
- "dev": true,
- "dependencies": {
- "depd": "2.0.0",
- "inherits": "2.0.4",
- "setprototypeof": "1.2.0",
- "statuses": "2.0.1",
- "toidentifier": "1.0.1"
- },
- "engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/http-proxy-agent": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz",
- "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==",
- "dev": true,
- "dependencies": {
- "@tootallnate/once": "2",
- "agent-base": "6",
- "debug": "4"
- },
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/http-signature": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
- "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==",
- "dev": true,
+ "node_modules/@rc-component/tree-select": {
+ "version": "1.10.0",
+ "resolved": "https://registry.npmjs.org/@rc-component/tree-select/-/tree-select-1.10.0.tgz",
+ "integrity": "sha512-E1U4pn2LAbXEhLJdzIzid7WYbIuFbkTIctuFoeC6weppf8UbPR3+YYB6/ay0c0ksand4gXMRQpa1Z60Auo7VJA==",
+ "license": "MIT",
"dependencies": {
- "assert-plus": "^1.0.0",
- "jsprim": "^1.2.2",
- "sshpk": "^1.7.0"
+ "@rc-component/select": "~1.7.0",
+ "@rc-component/tree": "~1.3.0",
+ "@rc-component/util": "^1.4.0",
+ "clsx": "^2.1.1"
},
- "engines": {
- "node": ">=0.8",
- "npm": ">=1.3.7"
+ "peerDependencies": {
+ "react": "*",
+ "react-dom": "*"
}
},
- "node_modules/http-status-codes": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/http-status-codes/-/http-status-codes-2.3.0.tgz",
- "integrity": "sha512-RJ8XvFvpPM/Dmc5SV+dC4y5PCeOhT3x1Hq0NU3rjGeg5a/CqlhZ7uudknPwZFz4aeAXDcbAyaeP7GAo9lvngtA==",
- "dev": true,
- "peer": true
- },
- "node_modules/http2-wrapper": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz",
- "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==",
+ "node_modules/@rc-component/trigger": {
+ "version": "3.9.1",
+ "resolved": "https://registry.npmjs.org/@rc-component/trigger/-/trigger-3.9.1.tgz",
+ "integrity": "sha512-LNsYvz60mrLJ/kRvKcHE7boUvcQfVMCfRqZ71x3Fo9AOiZ1KKIEqkzMA8DNvz2V3Bcvir/vwQNn7JF1NPODQ7Q==",
+ "license": "MIT",
"dependencies": {
- "quick-lru": "^5.1.1",
- "resolve-alpn": "^1.0.0"
+ "@rc-component/motion": "^1.1.4",
+ "@rc-component/portal": "^2.2.0",
+ "@rc-component/resize-observer": "^1.1.1",
+ "@rc-component/util": "^1.2.1",
+ "clsx": "^2.1.1"
},
"engines": {
- "node": ">=10.19.0"
- }
- },
- "node_modules/https-browserify": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz",
- "integrity": "sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==",
- "dev": true
- },
- "node_modules/https-proxy-agent": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
- "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==",
- "dev": true,
- "dependencies": {
- "agent-base": "6",
- "debug": "4"
+ "node": ">=8.x"
},
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/humanize-plus": {
- "version": "1.8.2",
- "resolved": "https://registry.npmjs.org/humanize-plus/-/humanize-plus-1.8.2.tgz",
- "integrity": "sha512-jaLeQyyzjjINGv7O9JJegjsaUcWjSj/1dcXvLEgU3pGdqCdP1PiC/uwr+saJXhTNBHZtmKnmpXyazgh+eceRxA==",
- "dev": true,
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/i18next": {
- "version": "23.10.0",
- "resolved": "https://registry.npmjs.org/i18next/-/i18next-23.10.0.tgz",
- "integrity": "sha512-/TgHOqsa7/9abUKJjdPeydoyDc0oTi/7u9F8lMSj6ufg4cbC1Oj3f/Jja7zj7WRIhEQKB7Q4eN6y68I9RDxxGQ==",
- "funding": [
- {
- "type": "individual",
- "url": "https://locize.com"
- },
- {
- "type": "individual",
- "url": "https://locize.com/i18next.html"
- },
- {
- "type": "individual",
- "url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project"
- }
- ],
- "dependencies": {
- "@babel/runtime": "^7.23.2"
- }
- },
- "node_modules/i18next-chained-backend": {
- "version": "4.6.2",
- "resolved": "https://registry.npmjs.org/i18next-chained-backend/-/i18next-chained-backend-4.6.2.tgz",
- "integrity": "sha512-2P092fR+nAPQlGzPUoIIxbwo7PTBqQYgLxwv1XhSTQUAUoelLo5LkX+FqRxxSDg9WEAsrc8+2WL6mJtMGIa6WQ==",
- "dependencies": {
- "@babel/runtime": "^7.23.2"
+ "peerDependencies": {
+ "react": ">=18.0.0",
+ "react-dom": ">=18.0.0"
}
},
- "node_modules/i18next-fs-backend": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/i18next-fs-backend/-/i18next-fs-backend-2.3.1.tgz",
- "integrity": "sha512-tvfXskmG/9o+TJ5Fxu54sSO5OkY6d+uMn+K6JiUGLJrwxAVfer+8V3nU8jq3ts9Pe5lXJv4b1N7foIjJ8Iy2Gg=="
- },
- "node_modules/i18next-http-backend": {
- "version": "2.5.0",
- "resolved": "https://registry.npmjs.org/i18next-http-backend/-/i18next-http-backend-2.5.0.tgz",
- "integrity": "sha512-Z/aQsGZk1gSxt2/DztXk92DuDD20J+rNudT7ZCdTrNOiK8uQppfvdjq9+DFQfpAnFPn3VZS+KQIr1S/W1KxhpQ==",
+ "node_modules/@rc-component/upload": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@rc-component/upload/-/upload-1.1.1.tgz",
+ "integrity": "sha512-GvYWSKeaJTOxxC5p6+nOSadzfvXA1h8C/iHFPFZX+szH3JUXrvs+DLiW8YUTBgvMh8m63mJeHrlYlJzAlg+pDA==",
+ "license": "MIT",
"dependencies": {
- "cross-fetch": "4.0.0"
+ "@rc-component/util": "^1.11.1",
+ "clsx": "^2.1.1"
+ },
+ "peerDependencies": {
+ "react": ">=16.9.0",
+ "react-dom": ">=16.9.0"
}
},
- "node_modules/i18next-localstorage-backend": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/i18next-localstorage-backend/-/i18next-localstorage-backend-4.2.0.tgz",
- "integrity": "sha512-vglEQF0AnLriX7dLA2drHnqAYzHxnLwWQzBDw8YxcIDjOvYZz5rvpal59Dq4In+IHNmGNM32YgF0TDjBT0fHmA==",
+ "node_modules/@rc-component/util": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@rc-component/util/-/util-1.11.1.tgz",
+ "integrity": "sha512-awVlI3ub2vqfqkYxOBc/uQ0efm3jw0wcrhtO/YWLyZfxiKXczKwNbVuhlnyxytDt7H9pbbVQiqr+O6MLATtRYg==",
+ "license": "MIT",
"dependencies": {
- "@babel/runtime": "^7.22.15"
+ "is-mobile": "^5.0.0",
+ "react-is": "^18.2.0"
+ },
+ "peerDependencies": {
+ "react": ">=18.0.0",
+ "react-dom": ">=18.0.0"
}
},
- "node_modules/iconv-corefoundation": {
- "version": "1.1.7",
- "resolved": "https://registry.npmjs.org/iconv-corefoundation/-/iconv-corefoundation-1.1.7.tgz",
- "integrity": "sha512-T10qvkw0zz4wnm560lOEg0PovVqUXuOFhhHAkixw8/sycy7TJt7v/RrkEKEQnAw2viPSJu6iAkErxnzR0g8PpQ==",
- "dev": true,
- "optional": true,
- "os": [
- "darwin"
- ],
+ "node_modules/@rc-component/virtual-list": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@rc-component/virtual-list/-/virtual-list-1.2.0.tgz",
+ "integrity": "sha512-iavRm1Jo4GDbASQwdGa7jFyk93RvSOo9xHyBT4QL1pgFJj/Fdf1G+3RErH7/7BmAMvx2AkF62mjGYxDbXsK9TQ==",
+ "license": "MIT",
"dependencies": {
- "cli-truncate": "^2.1.0",
- "node-addon-api": "^1.6.3"
+ "@babel/runtime": "^7.20.0",
+ "@rc-component/resize-observer": "^1.0.1",
+ "@rc-component/util": "^1.4.0",
+ "clsx": "^2.1.1"
},
"engines": {
- "node": "^8.11.2 || >=10"
+ "node": ">=8.x"
+ },
+ "peerDependencies": {
+ "react": ">=18.0.0",
+ "react-dom": ">=18.0.0"
}
},
- "node_modules/iconv-lite": {
- "version": "0.4.24",
- "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
- "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
- "dev": true,
+ "node_modules/@reduxjs/toolkit": {
+ "version": "2.12.0",
+ "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.12.0.tgz",
+ "integrity": "sha512-KiT+RzZbp6mQET+Mg+h2c97+9j1sNflUxQkIHI7Yuzf6Peu+OYpmkn6nbHWmLLWj+1ZODUJFwGZ7gx3L9R9EOw==",
+ "license": "MIT",
"dependencies": {
- "safer-buffer": ">= 2.1.2 < 3"
+ "@standard-schema/spec": "^1.0.0",
+ "@standard-schema/utils": "^0.3.0",
+ "immer": "^11.0.0",
+ "redux": "^5.0.1",
+ "redux-thunk": "^3.1.0",
+ "reselect": "^5.1.0"
},
- "engines": {
- "node": ">=0.10.0"
+ "peerDependencies": {
+ "react": "^16.9.0 || ^17.0.0 || ^18 || ^19",
+ "react-redux": "^7.2.1 || ^8.1.3 || ^9.0.0"
+ },
+ "peerDependenciesMeta": {
+ "react": {
+ "optional": true
+ },
+ "react-redux": {
+ "optional": true
+ }
}
},
- "node_modules/icss-replace-symbols": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz",
- "integrity": "sha512-chIaY3Vh2mh2Q3RGXttaDIzeiPvaVXJ+C4DAh/w3c37SKZ/U6PGMmuicR2EQQp9bKG8zLMCl7I+PtIoOOPp8Gg==",
- "dev": true
- },
- "node_modules/icss-utils": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.1.tgz",
- "integrity": "sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==",
+ "node_modules/@rolldown/pluginutils": {
+ "version": "1.0.0-rc.3",
+ "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.3.tgz",
+ "integrity": "sha512-eybk3TjzzzV97Dlj5c+XrBFW57eTNhzod66y9HrBlzJ6NsCrWCp/2kaPS3K9wJmurBC0Tdw4yPjXKZqlznim3Q==",
"dev": true,
- "dependencies": {
- "postcss": "^7.0.14"
- },
- "engines": {
- "node": ">= 6"
- }
+ "license": "MIT"
},
- "node_modules/ieee754": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
- "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
+ "node_modules/@rollup/rollup-android-arm-eabi": {
+ "version": "4.59.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.59.0.tgz",
+ "integrity": "sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg==",
+ "cpu": [
+ "arm"
+ ],
"dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
]
},
- "node_modules/ignore": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz",
- "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==",
+ "node_modules/@rollup/rollup-android-arm64": {
+ "version": "4.59.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.59.0.tgz",
+ "integrity": "sha512-hZ+Zxj3SySm4A/DylsDKZAeVg0mvi++0PYVceVyX7hemkw7OreKdCvW2oQ3T1FMZvCaQXqOTHb8qmBShoqk69Q==",
+ "cpu": [
+ "arm64"
+ ],
"dev": true,
- "engines": {
- "node": ">= 4"
- }
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ]
},
- "node_modules/image-size": {
- "version": "0.5.5",
- "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz",
- "integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==",
+ "node_modules/@rollup/rollup-darwin-arm64": {
+ "version": "4.59.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.59.0.tgz",
+ "integrity": "sha512-W2Psnbh1J8ZJw0xKAd8zdNgF9HRLkdWwwdWqubSVk0pUuQkoHnv7rx4GiF9rT4t5DIZGAsConRE3AxCdJ4m8rg==",
+ "cpu": [
+ "arm64"
+ ],
"dev": true,
+ "license": "MIT",
"optional": true,
- "bin": {
- "image-size": "bin/image-size.js"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/immediate": {
- "version": "3.0.6",
- "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz",
- "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==",
- "dev": true
- },
- "node_modules/immer": {
- "version": "10.0.3",
- "resolved": "https://registry.npmjs.org/immer/-/immer-10.0.3.tgz",
- "integrity": "sha512-pwupu3eWfouuaowscykeckFmVTpqbzW+rXFCX8rQLkZzM9ftBmU/++Ra+o+L27mz03zJTlyV4UUr+fdKNffo4A==",
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/immer"
- }
+ "os": [
+ "darwin"
+ ]
},
- "node_modules/import-fresh": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
- "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
+ "node_modules/@rollup/rollup-darwin-x64": {
+ "version": "4.59.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.59.0.tgz",
+ "integrity": "sha512-ZW2KkwlS4lwTv7ZVsYDiARfFCnSGhzYPdiOU4IM2fDbL+QGlyAbjgSFuqNRbSthybLbIJ915UtZBtmuLrQAT/w==",
+ "cpu": [
+ "x64"
+ ],
"dev": true,
- "dependencies": {
- "parent-module": "^1.0.0",
- "resolve-from": "^4.0.0"
- },
- "engines": {
- "node": ">=6"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
},
- "node_modules/import-fresh/node_modules/resolve-from": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
- "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
+ "node_modules/@rollup/rollup-freebsd-arm64": {
+ "version": "4.59.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.59.0.tgz",
+ "integrity": "sha512-EsKaJ5ytAu9jI3lonzn3BgG8iRBjV4LxZexygcQbpiU0wU0ATxhNVEpXKfUa0pS05gTcSDMKpn3Sx+QB9RlTTA==",
+ "cpu": [
+ "arm64"
+ ],
"dev": true,
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/imurmurhash": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
- "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
- "engines": {
- "node": ">=0.8.19"
- }
- },
- "node_modules/indexes-of": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz",
- "integrity": "sha512-bup+4tap3Hympa+JBJUG7XuOsdNQ6fxt0MHyXMKuLBKn0OqsTfvUxkUrroEX1+B2VsSHvCjiIcZVxRtYa4nllA==",
- "dev": true
- },
- "node_modules/inflight": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
- "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
- "dependencies": {
- "once": "^1.3.0",
- "wrappy": "1"
- }
- },
- "node_modules/inherits": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
- "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
- },
- "node_modules/ini": {
- "version": "1.3.8",
- "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
- "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
- "optional": true
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
},
- "node_modules/internal-slot": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.6.tgz",
- "integrity": "sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==",
+ "node_modules/@rollup/rollup-freebsd-x64": {
+ "version": "4.59.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.59.0.tgz",
+ "integrity": "sha512-d3DuZi2KzTMjImrxoHIAODUZYoUUMsuUiY4SRRcJy6NJoZ6iIqWnJu9IScV9jXysyGMVuW+KNzZvBLOcpdl3Vg==",
+ "cpu": [
+ "x64"
+ ],
"dev": true,
- "dependencies": {
- "get-intrinsic": "^1.2.2",
- "hasown": "^2.0.0",
- "side-channel": "^1.0.4"
- },
- "engines": {
- "node": ">= 0.4"
- }
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
},
- "node_modules/ip": {
- "version": "1.1.8",
- "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz",
- "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==",
- "dev": true
+ "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
+ "version": "4.59.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.59.0.tgz",
+ "integrity": "sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
},
- "node_modules/ipaddr.js": {
- "version": "1.9.1",
- "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
- "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
+ "node_modules/@rollup/rollup-linux-arm-musleabihf": {
+ "version": "4.59.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.59.0.tgz",
+ "integrity": "sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA==",
+ "cpu": [
+ "arm"
+ ],
"dev": true,
- "peer": true,
- "engines": {
- "node": ">= 0.10"
- }
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
},
- "node_modules/is-absolute-url": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz",
- "integrity": "sha512-vOx7VprsKyllwjSkLV79NIhpyLfr3jAp7VaTCMXOJHu4m0Ew1CZ2fcjASwmV1jI3BWuWHB013M48eyeldk9gYg==",
+ "node_modules/@rollup/rollup-linux-arm64-gnu": {
+ "version": "4.59.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.59.0.tgz",
+ "integrity": "sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA==",
+ "cpu": [
+ "arm64"
+ ],
"dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
},
- "node_modules/is-accessor-descriptor": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.1.tgz",
- "integrity": "sha512-YBUanLI8Yoihw923YeFUS5fs0fF2f5TSFTNiYAAzhhDscDa3lEqYuz1pDOEP5KvX94I9ey3vsqjJcLVFVU+3QA==",
+ "node_modules/@rollup/rollup-linux-arm64-musl": {
+ "version": "4.59.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.59.0.tgz",
+ "integrity": "sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA==",
+ "cpu": [
+ "arm64"
+ ],
"dev": true,
- "dependencies": {
- "hasown": "^2.0.0"
- },
- "engines": {
- "node": ">= 0.10"
- }
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
},
- "node_modules/is-array-buffer": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz",
- "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==",
+ "node_modules/@rollup/rollup-linux-loong64-gnu": {
+ "version": "4.59.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.59.0.tgz",
+ "integrity": "sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg==",
+ "cpu": [
+ "loong64"
+ ],
"dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "get-intrinsic": "^1.2.0",
- "is-typed-array": "^1.1.10"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
},
- "node_modules/is-arrayish": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
- "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==",
- "dev": true
+ "node_modules/@rollup/rollup-linux-loong64-musl": {
+ "version": "4.59.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.59.0.tgz",
+ "integrity": "sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q==",
+ "cpu": [
+ "loong64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
},
- "node_modules/is-async-function": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz",
- "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==",
+ "node_modules/@rollup/rollup-linux-ppc64-gnu": {
+ "version": "4.59.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.59.0.tgz",
+ "integrity": "sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA==",
+ "cpu": [
+ "ppc64"
+ ],
"dev": true,
- "dependencies": {
- "has-tostringtag": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
},
- "node_modules/is-bigint": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz",
- "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==",
+ "node_modules/@rollup/rollup-linux-ppc64-musl": {
+ "version": "4.59.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.59.0.tgz",
+ "integrity": "sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA==",
+ "cpu": [
+ "ppc64"
+ ],
"dev": true,
- "dependencies": {
- "has-bigints": "^1.0.1"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
},
- "node_modules/is-binary-path": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
- "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+ "node_modules/@rollup/rollup-linux-riscv64-gnu": {
+ "version": "4.59.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.59.0.tgz",
+ "integrity": "sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg==",
+ "cpu": [
+ "riscv64"
+ ],
"dev": true,
- "dependencies": {
- "binary-extensions": "^2.0.0"
- },
- "engines": {
- "node": ">=8"
- }
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
},
- "node_modules/is-boolean-object": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz",
- "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==",
+ "node_modules/@rollup/rollup-linux-riscv64-musl": {
+ "version": "4.59.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.59.0.tgz",
+ "integrity": "sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg==",
+ "cpu": [
+ "riscv64"
+ ],
"dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "has-tostringtag": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
},
- "node_modules/is-buffer": {
- "version": "1.1.6",
- "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
- "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
- "dev": true
+ "node_modules/@rollup/rollup-linux-s390x-gnu": {
+ "version": "4.59.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.59.0.tgz",
+ "integrity": "sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
},
- "node_modules/is-callable": {
- "version": "1.2.7",
- "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz",
- "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==",
+ "node_modules/@rollup/rollup-linux-x64-gnu": {
+ "version": "4.59.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.59.0.tgz",
+ "integrity": "sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg==",
+ "cpu": [
+ "x64"
+ ],
"dev": true,
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
},
- "node_modules/is-ci": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz",
- "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==",
+ "node_modules/@rollup/rollup-linux-x64-musl": {
+ "version": "4.59.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.59.0.tgz",
+ "integrity": "sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg==",
+ "cpu": [
+ "x64"
+ ],
"dev": true,
- "dependencies": {
- "ci-info": "^3.2.0"
- },
- "bin": {
- "is-ci": "bin.js"
- }
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
},
- "node_modules/is-color-stop": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz",
- "integrity": "sha512-H1U8Vz0cfXNujrJzEcvvwMDW9Ra+biSYA3ThdQvAnMLJkEHQXn6bWzLkxHtVYJ+Sdbx0b6finn3jZiaVe7MAHA==",
+ "node_modules/@rollup/rollup-openbsd-x64": {
+ "version": "4.59.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.59.0.tgz",
+ "integrity": "sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ==",
+ "cpu": [
+ "x64"
+ ],
"dev": true,
- "dependencies": {
- "css-color-names": "^0.0.4",
- "hex-color-regex": "^1.1.0",
- "hsl-regex": "^1.0.0",
- "hsla-regex": "^1.0.0",
- "rgb-regex": "^1.0.1",
- "rgba-regex": "^1.0.0"
- }
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ]
},
- "node_modules/is-core-module": {
- "version": "2.13.1",
- "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz",
- "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==",
+ "node_modules/@rollup/rollup-openharmony-arm64": {
+ "version": "4.59.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.59.0.tgz",
+ "integrity": "sha512-tt9KBJqaqp5i5HUZzoafHZX8b5Q2Fe7UjYERADll83O4fGqJ49O1FsL6LpdzVFQcpwvnyd0i+K/VSwu/o/nWlA==",
+ "cpu": [
+ "arm64"
+ ],
"dev": true,
- "dependencies": {
- "hasown": "^2.0.0"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openharmony"
+ ]
},
- "node_modules/is-data-descriptor": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.1.tgz",
- "integrity": "sha512-bc4NlCDiCr28U4aEsQ3Qs2491gVq4V8G7MQyws968ImqjKuYtTJXrl7Vq7jsN7Ly/C3xj5KWFrY7sHNeDkAzXw==",
+ "node_modules/@rollup/rollup-win32-arm64-msvc": {
+ "version": "4.59.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.59.0.tgz",
+ "integrity": "sha512-V5B6mG7OrGTwnxaNUzZTDTjDS7F75PO1ae6MJYdiMu60sq0CqN5CVeVsbhPxalupvTX8gXVSU9gq+Rx1/hvu6A==",
+ "cpu": [
+ "arm64"
+ ],
"dev": true,
- "dependencies": {
- "hasown": "^2.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- }
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
},
- "node_modules/is-date-object": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz",
- "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==",
+ "node_modules/@rollup/rollup-win32-ia32-msvc": {
+ "version": "4.59.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.59.0.tgz",
+ "integrity": "sha512-UKFMHPuM9R0iBegwzKF4y0C4J9u8C6MEJgFuXTBerMk7EJ92GFVFYBfOZaSGLu6COf7FxpQNqhNS4c4icUPqxA==",
+ "cpu": [
+ "ia32"
+ ],
"dev": true,
- "dependencies": {
- "has-tostringtag": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
},
- "node_modules/is-descriptor": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.3.tgz",
- "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==",
+ "node_modules/@rollup/rollup-win32-x64-gnu": {
+ "version": "4.59.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.59.0.tgz",
+ "integrity": "sha512-laBkYlSS1n2L8fSo1thDNGrCTQMmxjYY5G0WFWjFFYZkKPjsMBsgJfGf4TLxXrF6RyhI60L8TMOjBMvXiTcxeA==",
+ "cpu": [
+ "x64"
+ ],
"dev": true,
- "dependencies": {
- "is-accessor-descriptor": "^1.0.1",
- "is-data-descriptor": "^1.0.1"
- },
- "engines": {
- "node": ">= 0.4"
- }
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
},
- "node_modules/is-directory": {
- "version": "0.3.1",
- "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz",
- "integrity": "sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw==",
+ "node_modules/@rollup/rollup-win32-x64-msvc": {
+ "version": "4.59.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.59.0.tgz",
+ "integrity": "sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA==",
+ "cpu": [
+ "x64"
+ ],
"dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
},
- "node_modules/is-docker": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz",
- "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==",
+ "node_modules/@sec-ant/readable-stream": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/@sec-ant/readable-stream/-/readable-stream-0.4.1.tgz",
+ "integrity": "sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==",
"dev": true,
- "bin": {
- "is-docker": "cli.js"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
+ "license": "MIT",
+ "peer": true
},
- "node_modules/is-extendable": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
- "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+ "node_modules/@sidvind/better-ajv-errors": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/@sidvind/better-ajv-errors/-/better-ajv-errors-5.0.0.tgz",
+ "integrity": "sha512-FeI/V2KGtOaDX+r0akidCGYy79lVR4YnAqk1GFgZFuHADErCAEmtZL4+IdCAcDXHqfZsII3fs9DrfC1pIR+19w==",
"dev": true,
+ "license": "Apache-2.0",
+ "peer": true,
"dependencies": {
- "is-plain-object": "^2.0.4"
+ "kleur": "^4.1.0"
},
"engines": {
- "node": ">=0.10.0"
+ "node": "^20.19 || ^22.12 || >= 24.0"
+ },
+ "peerDependencies": {
+ "ajv": "^7.0.0 || ^8.0.0"
}
},
- "node_modules/is-extglob": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
- "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+ "node_modules/@sindresorhus/base62": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@sindresorhus/base62/-/base62-1.0.0.tgz",
+ "integrity": "sha512-TeheYy0ILzBEI/CO55CP6zJCSdSWeRtGnHy8U8dWSUH4I68iqTsy7HkMktR4xakThc9jotkPQUXT4ITdbV7cHA==",
"dev": true,
+ "license": "MIT",
"engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/is-finalizationregistry": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz",
- "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2"
+ "node": ">=18"
},
"funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-fullwidth-code-point": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
- "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
- "dev": true,
- "engines": {
- "node": ">=8"
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/is-generator-function": {
- "version": "1.0.10",
- "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz",
- "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==",
+ "node_modules/@sindresorhus/is": {
+ "version": "4.6.0",
+ "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz",
+ "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==",
"dev": true,
- "dependencies": {
- "has-tostringtag": "^1.0.0"
- },
+ "license": "MIT",
"engines": {
- "node": ">= 0.4"
+ "node": ">=10"
},
"funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "url": "https://github.com/sindresorhus/is?sponsor=1"
}
},
- "node_modules/is-glob": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
- "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "node_modules/@so-ric/colorspace": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/@so-ric/colorspace/-/colorspace-1.1.6.tgz",
+ "integrity": "sha512-/KiKkpHNOBgkFJwu9sh48LkHSMYGyuTcSFK/qMBdnOAlrRJzRSXAOFB5qwzaVQuDl8wAvHVMkaASQDReTahxuw==",
"dev": true,
+ "license": "MIT",
+ "peer": true,
"dependencies": {
- "is-extglob": "^2.1.1"
- },
- "engines": {
- "node": ">=0.10.0"
+ "color": "^5.0.2",
+ "text-hex": "1.0.x"
}
},
- "node_modules/is-html": {
+ "node_modules/@standard-schema/spec": {
"version": "1.1.0",
- "resolved": "https://registry.npmjs.org/is-html/-/is-html-1.1.0.tgz",
- "integrity": "sha512-eoGsQVAAyvLFRKnbt4jo7Il56agsH5I04pDymPoxRp/tnna5yiIpdNzvKPOy5G1Ff0zY/jfN2hClb7ju+sOrdA==",
+ "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz",
+ "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==",
+ "license": "MIT"
+ },
+ "node_modules/@standard-schema/utils": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/@standard-schema/utils/-/utils-0.3.0.tgz",
+ "integrity": "sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==",
+ "license": "MIT"
+ },
+ "node_modules/@stylistic/eslint-plugin": {
+ "version": "5.10.0",
+ "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-5.10.0.tgz",
+ "integrity": "sha512-nPK52ZHvot8Ju/0A4ucSX1dcPV2/1clx0kLcH5wDmrE4naKso7TUC/voUyU1O9OTKTrR6MYip6LP0ogEMQ9jPQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "html-tags": "^1.0.0"
+ "@eslint-community/eslint-utils": "^4.9.1",
+ "@typescript-eslint/types": "^8.56.0",
+ "eslint-visitor-keys": "^4.2.1",
+ "espree": "^10.4.0",
+ "estraverse": "^5.3.0",
+ "picomatch": "^4.0.3"
},
"engines": {
- "node": ">=0.10.0"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "peerDependencies": {
+ "eslint": "^9.0.0 || ^10.0.0"
}
},
- "node_modules/is-interactive": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz",
- "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==",
+ "node_modules/@szmarczak/http-timer": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz",
+ "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==",
"dev": true,
- "peer": true,
+ "license": "MIT",
+ "dependencies": {
+ "defer-to-connect": "^2.0.0"
+ },
"engines": {
- "node": ">=8"
+ "node": ">=10"
}
},
- "node_modules/is-map": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz",
- "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==",
- "dev": true,
+ "node_modules/@tabler/icons": {
+ "version": "3.44.0",
+ "resolved": "https://registry.npmjs.org/@tabler/icons/-/icons-3.44.0.tgz",
+ "integrity": "sha512-Wn0AOZG9sg0L+bjfMqq4eNhC6pQjIrk94LvvWYNYkY8KH8wC3YILRzQlrnVJc4FUeMxH/AK97QsYCX35H3LndA==",
+ "license": "MIT",
"funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "type": "github",
+ "url": "https://github.com/sponsors/codecalm"
}
},
- "node_modules/is-negative-zero": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz",
- "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==",
- "dev": true,
- "engines": {
- "node": ">= 0.4"
+ "node_modules/@tabler/icons-react": {
+ "version": "3.44.0",
+ "resolved": "https://registry.npmjs.org/@tabler/icons-react/-/icons-react-3.44.0.tgz",
+ "integrity": "sha512-8+rvzBbVm/1Z3sG3x7GUNAaxIKxwgz8xaMhRs23nrCnMTKRFAhEC+82zAIFeAA0seXdrAGX5HFCkaLpGK2rVHg==",
+ "license": "MIT",
+ "dependencies": {
+ "@tabler/icons": "3.44.0"
},
"funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-number": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
- "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==",
- "dev": true,
- "dependencies": {
- "kind-of": "^3.0.2"
+ "type": "github",
+ "url": "https://github.com/sponsors/codecalm"
},
- "engines": {
- "node": ">=0.10.0"
+ "peerDependencies": {
+ "react": ">= 16"
}
},
- "node_modules/is-number-object": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz",
- "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==",
+ "node_modules/@tomjs/electron-devtools-installer": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/@tomjs/electron-devtools-installer/-/electron-devtools-installer-4.0.1.tgz",
+ "integrity": "sha512-Me3XEU5MeQ1xIwNz/ijDb4UNmnyyR8ChKO5BOwBDjxg8t/JfMZj1/gxUfunaNROl51FMXJLchj3ulunVufSfqg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "has-tostringtag": "^1.0.0"
+ "@tomjs/unzip-crx": "^1.1.3"
},
"engines": {
- "node": ">= 0.4"
+ "node": ">=16"
},
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "peerDependencies": {
+ "electron": ">=12.0.0"
}
},
- "node_modules/is-number/node_modules/kind-of": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
- "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==",
+ "node_modules/@tomjs/unzip-crx": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/@tomjs/unzip-crx/-/unzip-crx-1.1.3.tgz",
+ "integrity": "sha512-uqolp78TcG5q2ZBOZ57Nf7m7o3kaKAz1E9uFf4FCSO/nCI11HaDWpw7PaGUk1MImeIjNradiLpT2b9kTKSs4uw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "is-buffer": "^1.1.5"
+ "jszip": "^3.10.1"
},
"engines": {
- "node": ">=0.10.0"
+ "node": ">=14"
}
},
- "node_modules/is-obj": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz",
- "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
+ "node_modules/@tootallnate/quickjs-emscripten": {
+ "version": "0.23.0",
+ "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz",
+ "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==",
+ "license": "MIT"
},
- "node_modules/is-path-inside": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
- "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
+ "node_modules/@tsconfig/node20": {
+ "version": "20.1.9",
+ "resolved": "https://registry.npmjs.org/@tsconfig/node20/-/node20-20.1.9.tgz",
+ "integrity": "sha512-IjlTv1RsvnPtUcjTqtVsZExKVq+KQx4g5pCP5tI7rAs6Xesl2qFwSz/tPDBC4JajkL/MlezBu3gPUwqRHl+RIg==",
"dev": true,
- "engines": {
- "node": ">=8"
- }
+ "license": "MIT",
+ "peer": true
},
- "node_modules/is-plain-obj": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz",
- "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==",
+ "node_modules/@tybys/wasm-util": {
+ "version": "0.10.1",
+ "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz",
+ "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==",
"dev": true,
- "engines": {
- "node": ">=8"
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "tslib": "^2.4.0"
}
},
- "node_modules/is-plain-object": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
- "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
+ "node_modules/@types/babel__core": {
+ "version": "7.20.5",
+ "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz",
+ "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "isobject": "^3.0.1"
- },
- "engines": {
- "node": ">=0.10.0"
+ "@babel/parser": "^7.20.7",
+ "@babel/types": "^7.20.7",
+ "@types/babel__generator": "*",
+ "@types/babel__template": "*",
+ "@types/babel__traverse": "*"
}
},
- "node_modules/is-regex": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz",
- "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==",
+ "node_modules/@types/babel__generator": {
+ "version": "7.27.0",
+ "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz",
+ "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "call-bind": "^1.0.2",
- "has-tostringtag": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "@babel/types": "^7.0.0"
}
},
- "node_modules/is-resolvable": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz",
- "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==",
- "dev": true
- },
- "node_modules/is-set": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz",
- "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==",
+ "node_modules/@types/babel__template": {
+ "version": "7.4.4",
+ "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz",
+ "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==",
"dev": true,
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "license": "MIT",
+ "dependencies": {
+ "@babel/parser": "^7.1.0",
+ "@babel/types": "^7.0.0"
}
},
- "node_modules/is-shared-array-buffer": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz",
- "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==",
+ "node_modules/@types/babel__traverse": {
+ "version": "7.28.0",
+ "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz",
+ "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "call-bind": "^1.0.2"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "@babel/types": "^7.28.2"
}
},
- "node_modules/is-stream": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
- "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
+ "node_modules/@types/cacheable-request": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz",
+ "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==",
"dev": true,
- "peer": true,
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "license": "MIT",
+ "dependencies": {
+ "@types/http-cache-semantics": "*",
+ "@types/keyv": "^3.1.4",
+ "@types/node": "*",
+ "@types/responselike": "^1.0.0"
}
},
- "node_modules/is-string": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz",
- "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==",
+ "node_modules/@types/chai": {
+ "version": "5.2.3",
+ "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz",
+ "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "has-tostringtag": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "@types/deep-eql": "*",
+ "assertion-error": "^2.0.1"
}
},
- "node_modules/is-symbol": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz",
- "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==",
+ "node_modules/@types/debug": {
+ "version": "4.1.13",
+ "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.13.tgz",
+ "integrity": "sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "has-symbols": "^1.0.2"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "@types/ms": "*"
}
},
- "node_modules/is-typed-array": {
- "version": "1.1.12",
- "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz",
- "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==",
+ "node_modules/@types/deep-eql": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz",
+ "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/esrecurse": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/@types/esrecurse/-/esrecurse-4.3.1.tgz",
+ "integrity": "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/estree": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
+ "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/fs-extra": {
+ "version": "9.0.13",
+ "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.13.tgz",
+ "integrity": "sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "which-typed-array": "^1.1.11"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "@types/node": "*"
}
},
- "node_modules/is-typedarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
- "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA=="
+ "node_modules/@types/hast": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz",
+ "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "*"
+ }
},
- "node_modules/is-unicode-supported": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz",
- "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==",
+ "node_modules/@types/http-cache-semantics": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz",
+ "integrity": "sha512-L3LgimLHXtGkWikKnsPg0/VFx9OGZaC+eN1u4r+OB1XRqH3meBIAVC2zr1WdMH+RHmnRkqliQAOHNJ/E0j/e0Q==",
"dev": true,
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
+ "license": "MIT"
},
- "node_modules/is-url": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz",
- "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==",
- "dev": true
+ "node_modules/@types/json-schema": {
+ "version": "7.0.15",
+ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
+ "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
+ "dev": true,
+ "license": "MIT"
},
- "node_modules/is-weakmap": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz",
- "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==",
+ "node_modules/@types/keyv": {
+ "version": "3.1.4",
+ "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz",
+ "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==",
"dev": true,
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*"
}
},
- "node_modules/is-weakref": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz",
- "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==",
+ "node_modules/@types/lodash": {
+ "version": "4.17.24",
+ "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.24.tgz",
+ "integrity": "sha512-gIW7lQLZbue7lRSWEFql49QJJWThrTFFeIMJdp3eH4tKoxm1OvEPg02rm4wCCSHS0cL3/Fizimb35b7k8atwsQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/ms": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz",
+ "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==",
"dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/node": {
+ "version": "24.10.13",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.13.tgz",
+ "integrity": "sha512-oH72nZRfDv9lADUBSo104Aq7gPHpQZc4BTx38r9xf9pg5LfP6EzSyH2n7qFmmxRQXh7YlUXODcYsg6PuTDSxGg==",
+ "license": "MIT",
"dependencies": {
- "call-bind": "^1.0.2"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "undici-types": "~7.16.0"
}
},
- "node_modules/is-weakset": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz",
- "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==",
+ "node_modules/@types/normalize-package-data": {
+ "version": "2.4.4",
+ "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz",
+ "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==",
"dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/@types/prismjs": {
+ "version": "1.26.6",
+ "resolved": "https://registry.npmjs.org/@types/prismjs/-/prismjs-1.26.6.tgz",
+ "integrity": "sha512-vqlvI7qlMvcCBbVe0AKAb4f97//Hy0EBTaiW8AalRnG/xAN5zOiWWyrNqNXeq8+KAuvRewjCVY1+IPxk4RdNYw==",
+ "license": "MIT"
+ },
+ "node_modules/@types/react": {
+ "version": "19.2.17",
+ "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.17.tgz",
+ "integrity": "sha512-MXfmqaVPEVgkBT/aY0aGCkRWWtByiYQXo3xdQ8r5RzuFrPiRn8Gar2tQdXSUQ2GKV3bkXckek89V8wQBY2Q/Aw==",
+ "devOptional": true,
+ "license": "MIT",
"dependencies": {
- "call-bind": "^1.0.2",
- "get-intrinsic": "^1.1.1"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "csstype": "^3.2.2"
}
},
- "node_modules/is-what": {
- "version": "3.14.1",
- "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz",
- "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==",
- "dev": true
+ "node_modules/@types/react-dom": {
+ "version": "19.2.3",
+ "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz",
+ "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "^19.2.0"
+ }
},
- "node_modules/is-windows": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
- "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
+ "node_modules/@types/responselike": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.3.tgz",
+ "integrity": "sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==",
"dev": true,
- "engines": {
- "node": ">=0.10.0"
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*"
}
},
- "node_modules/is-wsl": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz",
- "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==",
+ "node_modules/@types/triple-beam": {
+ "version": "1.3.5",
+ "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz",
+ "integrity": "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==",
"dev": true,
- "engines": {
- "node": ">=4"
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/@types/unist": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz",
+ "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==",
+ "license": "MIT"
+ },
+ "node_modules/@types/use-sync-external-store": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.6.tgz",
+ "integrity": "sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==",
+ "license": "MIT"
+ },
+ "node_modules/@types/which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/@types/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-113D3mDkZDjo+EeUEHCFy0qniNc1ZpecGiAU7WSo7YDoSzolZIQKpYFHrPpjkB2nuyahcKfrmLXeQlh7gqJYdw==",
+ "license": "MIT"
+ },
+ "node_modules/@types/ws": {
+ "version": "8.18.1",
+ "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz",
+ "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*"
}
},
- "node_modules/isarray": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
- "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==",
- "dev": true
+ "node_modules/@types/yauzl": {
+ "version": "2.10.3",
+ "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz",
+ "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==",
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@types/node": "*"
+ }
},
- "node_modules/isbinaryfile": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-5.0.0.tgz",
- "integrity": "sha512-UDdnyGvMajJUWCkib7Cei/dvyJrrvo4FIrsvSFWdPpXSUorzXrDJ0S+X5Q4ZlasfPjca4yqCNNsjbCeiy8FFeg==",
+ "node_modules/@typescript-eslint/eslint-plugin": {
+ "version": "8.61.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.61.0.tgz",
+ "integrity": "sha512-bFNvl9ZczlVb+wR2Akszf3gHfKVj/8WanXaGJ3UstTA7brNKg0cNdk6X1Psu5V7MZ2oQtzZKOEzIUehaoxbDGw==",
"dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@eslint-community/regexpp": "^4.12.2",
+ "@typescript-eslint/scope-manager": "8.61.0",
+ "@typescript-eslint/type-utils": "8.61.0",
+ "@typescript-eslint/utils": "8.61.0",
+ "@typescript-eslint/visitor-keys": "8.61.0",
+ "ignore": "^7.0.5",
+ "natural-compare": "^1.4.0",
+ "ts-api-utils": "^2.5.0"
+ },
"engines": {
- "node": ">= 14.0.0"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
"funding": {
- "url": "https://github.com/sponsors/gjtorikian/"
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "@typescript-eslint/parser": "^8.61.0",
+ "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
+ "typescript": ">=4.8.4 <6.1.0"
}
},
- "node_modules/isexe": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz",
- "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==",
+ "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": {
+ "version": "7.0.5",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz",
+ "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==",
"dev": true,
+ "license": "MIT",
"engines": {
- "node": ">=16"
+ "node": ">= 4"
}
},
- "node_modules/isobject": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
- "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==",
+ "node_modules/@typescript-eslint/parser": {
+ "version": "8.61.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.61.0.tgz",
+ "integrity": "sha512-5B7PfA2e1NQGCnDHd/0lW7W3gvp3d59Ryw54FYO8Uswxo9f6ikw3AZV+Xj/TvpImmpsiYyUqAfhC6kJID1jF6w==",
"dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/scope-manager": "8.61.0",
+ "@typescript-eslint/types": "8.61.0",
+ "@typescript-eslint/typescript-estree": "8.61.0",
+ "@typescript-eslint/visitor-keys": "8.61.0",
+ "debug": "^4.4.3"
+ },
"engines": {
- "node": ">=0.10.0"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
+ "typescript": ">=4.8.4 <6.1.0"
}
},
- "node_modules/isstream": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
- "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==",
- "dev": true
- },
- "node_modules/iterator.prototype": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz",
- "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==",
+ "node_modules/@typescript-eslint/project-service": {
+ "version": "8.61.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.61.0.tgz",
+ "integrity": "sha512-DV42F7MLJO6Rax7SK1yg43tcnEfGUrurSpSxKuVX+a3RCTzBlH3fuxprrOJXKCJGAaw82xXocikJ0uQaqwXgGA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "define-properties": "^1.2.1",
- "get-intrinsic": "^1.2.1",
- "has-symbols": "^1.0.3",
- "reflect.getprototypeof": "^1.0.4",
- "set-function-name": "^2.0.1"
+ "@typescript-eslint/tsconfig-utils": "^8.61.0",
+ "@typescript-eslint/types": "^8.61.0",
+ "debug": "^4.4.3"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4 <6.1.0"
}
},
- "node_modules/jackspeak": {
- "version": "2.3.6",
- "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz",
- "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==",
+ "node_modules/@typescript-eslint/scope-manager": {
+ "version": "8.61.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.61.0.tgz",
+ "integrity": "sha512-IWdXFHFSb6mlC3HPc7QsLDm5zYEbUla6trDEHf32D3/dnuUyXd87plScSNXSbm0/RxMvObpI17sv/EDTGrGZkA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@isaacs/cliui": "^8.0.2"
+ "@typescript-eslint/types": "8.61.0",
+ "@typescript-eslint/visitor-keys": "8.61.0"
},
"engines": {
- "node": ">=14"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
"funding": {
- "url": "https://github.com/sponsors/isaacs"
- },
- "optionalDependencies": {
- "@pkgjs/parseargs": "^0.11.0"
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
}
},
- "node_modules/jake": {
- "version": "10.8.7",
- "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz",
- "integrity": "sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==",
+ "node_modules/@typescript-eslint/tsconfig-utils": {
+ "version": "8.61.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.61.0.tgz",
+ "integrity": "sha512-O5Amvdv9ztMpxpf+vmFULGG78IE6Qwdr3bCGvqwG4nwc9H2qXkOYJJnRbRHyMkQTjv1d03olqwwwzHLMqpFePQ==",
"dev": true,
- "dependencies": {
- "async": "^3.2.3",
- "chalk": "^4.0.2",
- "filelist": "^1.0.4",
- "minimatch": "^3.1.2"
+ "license": "MIT",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
- "bin": {
- "jake": "bin/cli.js"
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
},
- "engines": {
- "node": ">=10"
+ "peerDependencies": {
+ "typescript": ">=4.8.4 <6.1.0"
}
},
- "node_modules/jake/node_modules/ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "node_modules/@typescript-eslint/type-utils": {
+ "version": "8.61.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.61.0.tgz",
+ "integrity": "sha512-TuBiQYIkd97yBfInHCTKVYMbX4kvEmpOEuixIuzCU9p8BGT1SfyyO0d0IfDMbPIHcjn/hWnusUX5e8v5Xg+X8A==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "color-convert": "^2.0.1"
+ "@typescript-eslint/types": "8.61.0",
+ "@typescript-eslint/typescript-estree": "8.61.0",
+ "@typescript-eslint/utils": "8.61.0",
+ "debug": "^4.4.3",
+ "ts-api-utils": "^2.5.0"
},
"engines": {
- "node": ">=8"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
"funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
+ "typescript": ">=4.8.4 <6.1.0"
}
},
- "node_modules/jake/node_modules/brace-expansion": {
- "version": "1.1.11",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "node_modules/@typescript-eslint/types": {
+ "version": "8.61.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.61.0.tgz",
+ "integrity": "sha512-9QTQpZ5Iin4CdIodfbDQFSeiSJKidgYJYug1P9CC2xWgUTvlmixViqDZNciMjwLBZyJnG4tGmPl97rVAFb1AJg==",
"dev": true,
- "dependencies": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
+ "license": "MIT",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
}
},
- "node_modules/jake/node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "node_modules/@typescript-eslint/typescript-estree": {
+ "version": "8.61.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.61.0.tgz",
+ "integrity": "sha512-42zatd5qSvvcV1JdDBCLxYRznvP4eIHpPoZXdkPFnAmanA4FuZ5dibSnCBggY8hQnqajPpoGjXFdZ7fIJKQnlA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
+ "@typescript-eslint/project-service": "8.61.0",
+ "@typescript-eslint/tsconfig-utils": "8.61.0",
+ "@typescript-eslint/types": "8.61.0",
+ "@typescript-eslint/visitor-keys": "8.61.0",
+ "debug": "^4.4.3",
+ "minimatch": "^10.2.2",
+ "semver": "^7.7.3",
+ "tinyglobby": "^0.2.15",
+ "ts-api-utils": "^2.5.0"
},
"engines": {
- "node": ">=10"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
"funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4 <6.1.0"
}
},
- "node_modules/jake/node_modules/color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": {
+ "version": "10.2.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz",
+ "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==",
"dev": true,
+ "license": "BlueOak-1.0.0",
"dependencies": {
- "color-name": "~1.1.4"
+ "brace-expansion": "^5.0.5"
},
"engines": {
- "node": ">=7.0.0"
+ "node": "18 || 20 || >=22"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
}
},
- "node_modules/jake/node_modules/color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "dev": true
- },
- "node_modules/jake/node_modules/minimatch": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
- "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "node_modules/@typescript-eslint/utils": {
+ "version": "8.61.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.61.0.tgz",
+ "integrity": "sha512-3bzFt7ImFMW/jVYwJamDoe/dMOdFLSC6pom6rRjdh4SZJEYupyMzem8e7vKZLclLfpHjlwSAXOUxtKxGXUiLqA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "brace-expansion": "^1.1.7"
+ "@eslint-community/eslint-utils": "^4.9.1",
+ "@typescript-eslint/scope-manager": "8.61.0",
+ "@typescript-eslint/types": "8.61.0",
+ "@typescript-eslint/typescript-estree": "8.61.0"
},
"engines": {
- "node": "*"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
+ "typescript": ">=4.8.4 <6.1.0"
}
},
- "node_modules/jake/node_modules/supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "node_modules/@typescript-eslint/visitor-keys": {
+ "version": "8.61.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.61.0.tgz",
+ "integrity": "sha512-QVLZu3ZPQEE+HICQyAMZ2yLQhxf0meY/wx6Hx14YcTNj13JB3qHlX3lJ02L3fLGHgERRH71kvYDwiXIguT3AjQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "has-flag": "^4.0.0"
+ "@typescript-eslint/types": "8.61.0",
+ "eslint-visitor-keys": "^5.0.0"
},
"engines": {
- "node": ">=8"
- }
- },
- "node_modules/js-tokens": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
- "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
- },
- "node_modules/js-yaml": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
- "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
- "dependencies": {
- "argparse": "^2.0.1"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
- "bin": {
- "js-yaml": "bin/js-yaml.js"
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
}
},
- "node_modules/jsbn": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
- "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==",
- "dev": true
- },
- "node_modules/jsdom": {
- "version": "14.1.0",
- "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-14.1.0.tgz",
- "integrity": "sha512-O901mfJSuTdwU2w3Sn+74T+RnDVP+FuV5fH8tcPWyqrseRAb0s5xOtPgCFiPOtLcyK7CLIJwPyD83ZqQWvA5ng==",
- "dev": true,
- "dependencies": {
- "abab": "^2.0.0",
- "acorn": "^6.0.4",
- "acorn-globals": "^4.3.0",
- "array-equal": "^1.0.0",
- "cssom": "^0.3.4",
- "cssstyle": "^1.1.1",
- "data-urls": "^1.1.0",
- "domexception": "^1.0.1",
- "escodegen": "^1.11.0",
- "html-encoding-sniffer": "^1.0.2",
- "nwsapi": "^2.1.3",
- "parse5": "5.1.0",
- "pn": "^1.1.0",
- "request": "^2.88.0",
- "request-promise-native": "^1.0.5",
- "saxes": "^3.1.9",
- "symbol-tree": "^3.2.2",
- "tough-cookie": "^2.5.0",
- "w3c-hr-time": "^1.0.1",
- "w3c-xmlserializer": "^1.1.2",
- "webidl-conversions": "^4.0.2",
- "whatwg-encoding": "^1.0.5",
- "whatwg-mimetype": "^2.3.0",
- "whatwg-url": "^7.0.0",
- "ws": "^6.1.2",
- "xml-name-validator": "^3.0.0"
- },
+ "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz",
+ "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==",
+ "dev": true,
+ "license": "Apache-2.0",
"engines": {
- "node": ">=8"
+ "node": "^20.19.0 || ^22.13.0 || >=24"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
}
},
- "node_modules/jsdom/node_modules/acorn": {
- "version": "6.4.2",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz",
- "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==",
+ "node_modules/@unrs/resolver-binding-android-arm-eabi": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.11.1.tgz",
+ "integrity": "sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-android-arm64": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.11.1.tgz",
+ "integrity": "sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-darwin-arm64": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.11.1.tgz",
+ "integrity": "sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-darwin-x64": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.11.1.tgz",
+ "integrity": "sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-freebsd-x64": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.11.1.tgz",
+ "integrity": "sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-linux-arm-gnueabihf": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.11.1.tgz",
+ "integrity": "sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-linux-arm-musleabihf": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.11.1.tgz",
+ "integrity": "sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-linux-arm64-gnu": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.11.1.tgz",
+ "integrity": "sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-linux-arm64-musl": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.11.1.tgz",
+ "integrity": "sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-linux-ppc64-gnu": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.11.1.tgz",
+ "integrity": "sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-linux-riscv64-gnu": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.11.1.tgz",
+ "integrity": "sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-linux-riscv64-musl": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.11.1.tgz",
+ "integrity": "sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-linux-s390x-gnu": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.11.1.tgz",
+ "integrity": "sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-linux-x64-gnu": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.11.1.tgz",
+ "integrity": "sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-linux-x64-musl": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.11.1.tgz",
+ "integrity": "sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==",
+ "cpu": [
+ "x64"
+ ],
"dev": true,
- "bin": {
- "acorn": "bin/acorn"
- },
- "engines": {
- "node": ">=0.4.0"
- }
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
},
- "node_modules/jsdom/node_modules/escodegen": {
- "version": "1.14.3",
- "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz",
- "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==",
+ "node_modules/@unrs/resolver-binding-wasm32-wasi": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.11.1.tgz",
+ "integrity": "sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==",
+ "cpu": [
+ "wasm32"
+ ],
"dev": true,
+ "license": "MIT",
+ "optional": true,
"dependencies": {
- "esprima": "^4.0.1",
- "estraverse": "^4.2.0",
- "esutils": "^2.0.2",
- "optionator": "^0.8.1"
- },
- "bin": {
- "escodegen": "bin/escodegen.js",
- "esgenerate": "bin/esgenerate.js"
+ "@napi-rs/wasm-runtime": "^0.2.11"
},
"engines": {
- "node": ">=4.0"
- },
- "optionalDependencies": {
- "source-map": "~0.6.1"
+ "node": ">=14.0.0"
}
},
- "node_modules/jsdom/node_modules/esprima": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
- "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+ "node_modules/@unrs/resolver-binding-win32-arm64-msvc": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.11.1.tgz",
+ "integrity": "sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw==",
+ "cpu": [
+ "arm64"
+ ],
"dev": true,
- "bin": {
- "esparse": "bin/esparse.js",
- "esvalidate": "bin/esvalidate.js"
- },
- "engines": {
- "node": ">=4"
- }
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
},
- "node_modules/jsdom/node_modules/estraverse": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
- "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
+ "node_modules/@unrs/resolver-binding-win32-ia32-msvc": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.11.1.tgz",
+ "integrity": "sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ==",
+ "cpu": [
+ "ia32"
+ ],
"dev": true,
- "engines": {
- "node": ">=4.0"
- }
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
},
- "node_modules/jsdom/node_modules/levn": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
- "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==",
+ "node_modules/@unrs/resolver-binding-win32-x64-msvc": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.11.1.tgz",
+ "integrity": "sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g==",
+ "cpu": [
+ "x64"
+ ],
"dev": true,
- "dependencies": {
- "prelude-ls": "~1.1.2",
- "type-check": "~0.3.2"
- },
- "engines": {
- "node": ">= 0.8.0"
- }
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
},
- "node_modules/jsdom/node_modules/optionator": {
- "version": "0.8.3",
- "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz",
- "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==",
+ "node_modules/@vitejs/plugin-react": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-5.2.0.tgz",
+ "integrity": "sha512-YmKkfhOAi3wsB1PhJq5Scj3GXMn3WvtQ/JC0xoopuHoXSdmtdStOpFrYaT1kie2YgFBcIe64ROzMYRjCrYOdYw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "deep-is": "~0.1.3",
- "fast-levenshtein": "~2.0.6",
- "levn": "~0.3.0",
- "prelude-ls": "~1.1.2",
- "type-check": "~0.3.2",
- "word-wrap": "~1.2.3"
+ "@babel/core": "^7.29.0",
+ "@babel/plugin-transform-react-jsx-self": "^7.27.1",
+ "@babel/plugin-transform-react-jsx-source": "^7.27.1",
+ "@rolldown/pluginutils": "1.0.0-rc.3",
+ "@types/babel__core": "^7.20.5",
+ "react-refresh": "^0.18.0"
},
"engines": {
- "node": ">= 0.8.0"
+ "node": "^20.19.0 || >=22.12.0"
+ },
+ "peerDependencies": {
+ "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0"
}
},
- "node_modules/jsdom/node_modules/parse5": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.0.tgz",
- "integrity": "sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==",
- "dev": true
- },
- "node_modules/jsdom/node_modules/prelude-ls": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
- "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==",
+ "node_modules/@vitest/expect": {
+ "version": "4.1.9",
+ "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.9.tgz",
+ "integrity": "sha512-vl/rYsUKcBr3SnQn166+XR5ZQcgMx3DQhFWdfli/cWpLnLUmbxZvyrJZotLFUryib+LtArYMSTJ5RbQ57ZqrlA==",
"dev": true,
- "engines": {
- "node": ">= 0.8.0"
+ "license": "MIT",
+ "dependencies": {
+ "@standard-schema/spec": "^1.1.0",
+ "@types/chai": "^5.2.2",
+ "@vitest/spy": "4.1.9",
+ "@vitest/utils": "4.1.9",
+ "chai": "^6.2.2",
+ "tinyrainbow": "^3.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
}
},
- "node_modules/jsdom/node_modules/punycode": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
- "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
+ "node_modules/@vitest/mocker": {
+ "version": "4.1.9",
+ "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.9.tgz",
+ "integrity": "sha512-EVkXzBjrPGM+cK8/ANWgBrkUCfJfb38/EfTSO8h7pWvKkyPkpWxvR7BkD2MyItMF62C97zAEoqdpUixwR/e+Rw==",
"dev": true,
- "engines": {
- "node": ">=6"
+ "license": "MIT",
+ "dependencies": {
+ "@vitest/spy": "4.1.9",
+ "estree-walker": "^3.0.3",
+ "magic-string": "^0.30.21"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ },
+ "peerDependencies": {
+ "msw": "^2.4.9",
+ "vite": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ },
+ "peerDependenciesMeta": {
+ "msw": {
+ "optional": true
+ },
+ "vite": {
+ "optional": true
+ }
}
},
- "node_modules/jsdom/node_modules/tr46": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz",
- "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==",
+ "node_modules/@vitest/pretty-format": {
+ "version": "4.1.9",
+ "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.9.tgz",
+ "integrity": "sha512-s0iufns3iIFitdgm+YR7g1whCAaGtXz459VS9/PqyKDEEFgYIhsHOQmXgIgDuYCt7DeQmiZT0Qe2OA2p4ZPu5A==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "punycode": "^2.1.0"
+ "tinyrainbow": "^3.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
}
},
- "node_modules/jsdom/node_modules/type-check": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
- "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==",
+ "node_modules/@vitest/runner": {
+ "version": "4.1.9",
+ "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.1.9.tgz",
+ "integrity": "sha512-KXLMDtc7oe70+3mJfGrPUWPesswH+3sTxAMAMl8DG7I8IUQT4XW718dY5ID3vPUcmlu27CcKfY4P3h3I29SLJg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "prelude-ls": "~1.1.2"
+ "@vitest/utils": "4.1.9",
+ "pathe": "^2.0.3"
},
- "engines": {
- "node": ">= 0.8.0"
+ "funding": {
+ "url": "https://opencollective.com/vitest"
}
},
- "node_modules/jsdom/node_modules/whatwg-url": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz",
- "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==",
+ "node_modules/@vitest/snapshot": {
+ "version": "4.1.9",
+ "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.9.tgz",
+ "integrity": "sha512-Jc7RKGNBo8Z28WYIm0Niej4xdSPByRf6mU58VpHQkd6Zh05rlnA+twjbK5HyeIGHxrzsc3mJgS43uM0CZKzaIA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "lodash.sortby": "^4.7.0",
- "tr46": "^1.0.1",
- "webidl-conversions": "^4.0.2"
+ "@vitest/pretty-format": "4.1.9",
+ "@vitest/utils": "4.1.9",
+ "magic-string": "^0.30.21",
+ "pathe": "^2.0.3"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
}
},
- "node_modules/jsdom/node_modules/ws": {
- "version": "6.2.2",
- "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz",
- "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==",
+ "node_modules/@vitest/spy": {
+ "version": "4.1.9",
+ "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.9.tgz",
+ "integrity": "sha512-fHpsS6mIi+PiEW+vcRVOMkX1oSaPKne3VOclSFICPcGOmfKgXPU5iAah+wcNcj2xPrCCmfq99IDGf+EojhhvhA==",
"dev": true,
- "dependencies": {
- "async-limiter": "~1.0.0"
+ "license": "MIT",
+ "funding": {
+ "url": "https://opencollective.com/vitest"
}
},
- "node_modules/jsesc": {
- "version": "2.5.2",
- "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
- "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
+ "node_modules/@vitest/utils": {
+ "version": "4.1.9",
+ "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.9.tgz",
+ "integrity": "sha512-A51o8ymO5PpqlWNnBP9ZHPXDIpuMtTLlGSjN7la4US+LJzoUMyhwjA5QXlm39JexgwHKW4Xjs8Z2d3dLCXOeuA==",
"dev": true,
- "bin": {
- "jsesc": "bin/jsesc"
+ "license": "MIT",
+ "dependencies": {
+ "@vitest/pretty-format": "4.1.9",
+ "convert-source-map": "^2.0.0",
+ "tinyrainbow": "^3.1.0"
},
- "engines": {
- "node": ">=4"
+ "funding": {
+ "url": "https://opencollective.com/vitest"
}
},
- "node_modules/jsftp": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/jsftp/-/jsftp-2.1.3.tgz",
- "integrity": "sha512-r79EVB8jaNAZbq8hvanL8e8JGu2ZNr2bXdHC4ZdQhRImpSPpnWwm5DYVzQ5QxJmtGtKhNNuvqGgbNaFl604fEQ==",
- "dev": true,
+ "node_modules/@wdio/config": {
+ "version": "9.29.0",
+ "resolved": "https://registry.npmjs.org/@wdio/config/-/config-9.29.0.tgz",
+ "integrity": "sha512-uwedUj6gzDy4cGJ3dj8ZiQzlrijgNMS0RxNnPzuNzbjNrgsX1aiihbWSG+c9Vonh9IXNJgZXBwXv+4N7w7sLrg==",
+ "license": "MIT",
"dependencies": {
- "debug": "^3.1.0",
- "ftp-response-parser": "^1.0.1",
- "once": "^1.4.0",
- "parse-listing": "^1.1.3",
- "stream-combiner": "^0.2.2",
- "unorm": "^1.4.1"
+ "@wdio/logger": "9.18.0",
+ "@wdio/types": "9.29.0",
+ "@wdio/utils": "9.29.0",
+ "deepmerge-ts": "^7.0.3",
+ "glob": "^10.2.2",
+ "import-meta-resolve": "^4.0.0",
+ "jiti": "^2.6.1"
},
"engines": {
- "node": ">=6"
+ "node": ">=18.20.0"
}
},
- "node_modules/jsftp/node_modules/debug": {
- "version": "3.2.7",
- "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
- "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
- "dev": true,
+ "node_modules/@wdio/config/node_modules/glob": {
+ "version": "10.5.0",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz",
+ "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==",
+ "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me",
+ "license": "ISC",
"dependencies": {
- "ms": "^2.1.1"
+ "foreground-child": "^3.1.0",
+ "jackspeak": "^3.1.2",
+ "minimatch": "^9.0.4",
+ "minipass": "^7.1.2",
+ "package-json-from-dist": "^1.0.0",
+ "path-scurry": "^1.11.1"
+ },
+ "bin": {
+ "glob": "dist/esm/bin.mjs"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
}
},
- "node_modules/json-buffer": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
- "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ=="
- },
- "node_modules/json-parse-better-errors": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz",
- "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==",
- "dev": true
- },
- "node_modules/json-parse-even-better-errors": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
- "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
- "dev": true
- },
- "node_modules/json-schema": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz",
- "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==",
- "dev": true
- },
- "node_modules/json-schema-traverse": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
- "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
- "dev": true,
- "peer": true
- },
- "node_modules/json-stable-stringify-without-jsonify": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
- "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
- "dev": true
+ "node_modules/@wdio/config/node_modules/lru-cache": {
+ "version": "10.4.3",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",
+ "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==",
+ "license": "ISC"
},
- "node_modules/json-stringify-safe": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
- "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==",
- "devOptional": true
- },
- "node_modules/json2mq": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/json2mq/-/json2mq-0.2.0.tgz",
- "integrity": "sha512-SzoRg7ux5DWTII9J2qkrZrqV1gt+rTaoufMxEzXbS26Uid0NwaJd123HcoB80TgubEppxxIGdNxCx50fEoEWQA==",
+ "node_modules/@wdio/config/node_modules/path-scurry": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz",
+ "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==",
+ "license": "BlueOak-1.0.0",
"dependencies": {
- "string-convert": "^0.2.0"
- }
- },
- "node_modules/json5": {
- "version": "2.2.3",
- "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
- "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
- "dev": true,
- "bin": {
- "json5": "lib/cli.js"
+ "lru-cache": "^10.2.0",
+ "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0"
},
"engines": {
- "node": ">=6"
- }
- },
- "node_modules/jsonfile": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
- "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==",
- "optionalDependencies": {
- "graceful-fs": "^4.1.6"
+ "node": ">=16 || 14 >=14.18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
}
},
- "node_modules/jsprim": {
- "version": "1.4.2",
- "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz",
- "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==",
- "dev": true,
+ "node_modules/@wdio/logger": {
+ "version": "9.18.0",
+ "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-9.18.0.tgz",
+ "integrity": "sha512-HdzDrRs+ywAqbXGKqe1i/bLtCv47plz4TvsHFH3j729OooT5VH38ctFn5aLXgECmiAKDkmH/A6kOq2Zh5DIxww==",
+ "license": "MIT",
"dependencies": {
- "assert-plus": "1.0.0",
- "extsprintf": "1.3.0",
- "json-schema": "0.4.0",
- "verror": "1.10.0"
+ "chalk": "^5.1.2",
+ "loglevel": "^1.6.0",
+ "loglevel-plugin-prefix": "^0.8.4",
+ "safe-regex2": "^5.0.0",
+ "strip-ansi": "^7.1.0"
},
"engines": {
- "node": ">=0.6.0"
+ "node": ">=18.20.0"
}
},
- "node_modules/jsprim/node_modules/verror": {
- "version": "1.10.0",
- "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
- "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==",
- "dev": true,
- "engines": [
- "node >=0.6.0"
- ],
- "dependencies": {
- "assert-plus": "^1.0.0",
- "core-util-is": "1.0.2",
- "extsprintf": "^1.2.0"
+ "node_modules/@wdio/logger/node_modules/ansi-regex": {
+ "version": "6.2.2",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz",
+ "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
}
},
- "node_modules/jsx-ast-utils": {
- "version": "3.3.5",
- "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz",
- "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==",
- "dev": true,
- "dependencies": {
- "array-includes": "^3.1.6",
- "array.prototype.flat": "^1.3.1",
- "object.assign": "^4.1.4",
- "object.values": "^1.1.6"
- },
+ "node_modules/@wdio/logger/node_modules/chalk": {
+ "version": "5.6.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz",
+ "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==",
+ "license": "MIT",
"engines": {
- "node": ">=4.0"
+ "node": "^12.17.0 || ^14.13 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
}
},
- "node_modules/jszip": {
- "version": "3.10.1",
- "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz",
- "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==",
- "dev": true,
+ "node_modules/@wdio/logger/node_modules/strip-ansi": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz",
+ "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==",
+ "license": "MIT",
"dependencies": {
- "lie": "~3.3.0",
- "pako": "~1.0.2",
- "readable-stream": "~2.3.6",
- "setimmediate": "^1.0.5"
+ "ansi-regex": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/strip-ansi?sponsor=1"
}
},
- "node_modules/jszip/node_modules/isarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
- "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
- "dev": true
+ "node_modules/@wdio/protocols": {
+ "version": "9.29.0",
+ "resolved": "https://registry.npmjs.org/@wdio/protocols/-/protocols-9.29.0.tgz",
+ "integrity": "sha512-IFpft5Qvrv3n5mHZce3l9vGxg2sL+llld4G6IkBYku/lgbvevNjkAQtv0WJ12yusc+fSj4kVHvxrPNowYlPxfw==",
+ "license": "MIT"
},
- "node_modules/jszip/node_modules/readable-stream": {
- "version": "2.3.8",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
- "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
- "dev": true,
+ "node_modules/@wdio/types": {
+ "version": "9.29.0",
+ "resolved": "https://registry.npmjs.org/@wdio/types/-/types-9.29.0.tgz",
+ "integrity": "sha512-hofXuWlSVTiQoqRLTHtutp4G8qvrx3bdktH9VEJuNP+hPX7eoGa/d52tCrjw06iLKuQGBjx+/+NhJG180TOidw==",
+ "license": "MIT",
"dependencies": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.3",
- "isarray": "~1.0.0",
- "process-nextick-args": "~2.0.0",
- "safe-buffer": "~5.1.1",
- "string_decoder": "~1.1.1",
- "util-deprecate": "~1.0.1"
+ "@types/node": "^20.1.0"
+ },
+ "engines": {
+ "node": ">=18.20.0"
}
},
- "node_modules/jszip/node_modules/safe-buffer": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
- "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
- "dev": true
- },
- "node_modules/jszip/node_modules/string_decoder": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
- "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
- "dev": true,
+ "node_modules/@wdio/types/node_modules/@types/node": {
+ "version": "20.19.43",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.43.tgz",
+ "integrity": "sha512-6oYBAi5ikg4Pl+kGsoYtawUMBT2zZMCvPNF7pVLnHZfd1zf38DRiWn/gT01RYCdUqkv7Fhr+C9ot4/tb+2sVvA==",
+ "license": "MIT",
"dependencies": {
- "safe-buffer": "~5.1.0"
+ "undici-types": "~6.21.0"
}
},
- "node_modules/junk": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/junk/-/junk-1.0.3.tgz",
- "integrity": "sha512-3KF80UaaSSxo8jVnRYtMKNGFOoVPBdkkVPsw+Ad0y4oxKXPduS6G6iHkrf69yJVff/VAaYXkV42rtZ7daJxU3w==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
+ "node_modules/@wdio/types/node_modules/undici-types": {
+ "version": "6.21.0",
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz",
+ "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==",
+ "license": "MIT"
+ },
+ "node_modules/@wdio/utils": {
+ "version": "9.29.0",
+ "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-9.29.0.tgz",
+ "integrity": "sha512-2vnwgHt2C7hFxwzTzXPXYjqlUSCIAicB8UVXpgvvhl55PXnDWn1mnDBXwHTZ1sVxFSh+MSC1D5zNIAgcT1Mk3w==",
+ "license": "MIT",
+ "dependencies": {
+ "@puppeteer/browsers": "^2.2.0",
+ "@wdio/logger": "9.18.0",
+ "@wdio/types": "9.29.0",
+ "decamelize": "^6.0.0",
+ "deepmerge-ts": "^7.0.3",
+ "edgedriver": "^6.1.2",
+ "geckodriver": "^6.1.0",
+ "get-port": "^7.0.0",
+ "import-meta-resolve": "^4.0.0",
+ "locate-app": "^2.2.24",
+ "mitt": "^3.0.1",
+ "safaridriver": "^1.0.0",
+ "split2": "^4.2.0",
+ "wait-port": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=18.20.0"
}
},
- "node_modules/just-extend": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz",
- "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==",
- "dev": true
+ "node_modules/@xmldom/xmldom": {
+ "version": "0.9.10",
+ "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.9.10.tgz",
+ "integrity": "sha512-A9gOqLdi6cV4ibazAjcQufGj0B1y/vDqYrcuP6d/6x8P27gRS8643Dj9o1dEKtB6O7fwxb2FgBmJS2mX7gpvdw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=14.6"
+ }
},
- "node_modules/keyboardevent-from-electron-accelerator": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/keyboardevent-from-electron-accelerator/-/keyboardevent-from-electron-accelerator-2.0.0.tgz",
- "integrity": "sha512-iQcmNA0M4ETMNi0kG/q0h/43wZk7rMeKYrXP7sqKIJbHkTU8Koowgzv+ieR/vWJbOwxx5nDC3UnudZ0aLSu4VA==",
- "dev": true
+ "node_modules/@zip.js/zip.js": {
+ "version": "2.8.26",
+ "resolved": "https://registry.npmjs.org/@zip.js/zip.js/-/zip.js-2.8.26.tgz",
+ "integrity": "sha512-RQ4h9F6DOiHxpdocUDrOl6xBM+yOtz+LkUol47AVWcfebGBDpZ7w7Xvz9PS24JgXvLGiXXzSAfdCdVy1tPlaFA==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "bun": ">=0.7.0",
+ "deno": ">=1.0.0",
+ "node": ">=18.0.0"
+ }
},
- "node_modules/keyboardevents-areequal": {
- "version": "0.2.2",
- "resolved": "https://registry.npmjs.org/keyboardevents-areequal/-/keyboardevents-areequal-0.2.2.tgz",
- "integrity": "sha512-Nv+Kr33T0mEjxR500q+I6IWisOQ0lK1GGOncV0kWE6n4KFmpcu7RUX5/2B0EUtX51Cb0HjZ9VJsSY3u4cBa0kw==",
- "dev": true
+ "node_modules/abbrev": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-4.0.0.tgz",
+ "integrity": "sha512-a1wflyaL0tHtJSmLSOVybYhy22vRih4eduhhrkcjgrWGnRfrZtovJ2FRjxuTtkkj47O/baf0R86QU5OuYpz8fA==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": "^20.17.0 || >=22.9.0"
+ }
},
- "node_modules/keyv": {
- "version": "4.5.4",
- "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
- "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==",
+ "node_modules/abort-controller": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz",
+ "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "json-buffer": "3.0.1"
+ "event-target-shim": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=6.5"
}
},
- "node_modules/kind-of": {
- "version": "6.0.3",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
- "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
+ "node_modules/accepts": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz",
+ "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==",
"dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "mime-types": "^3.0.0",
+ "negotiator": "^1.0.0"
+ },
"engines": {
- "node": ">=0.10.0"
+ "node": ">= 0.6"
}
},
- "node_modules/klaw": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/klaw/-/klaw-4.1.0.tgz",
- "integrity": "sha512-1zGZ9MF9H22UnkpVeuaGKOjfA2t6WrfdrJmGjy16ykcjnKQDmHVX+KI477rpbGevz/5FD4MC3xf1oxylBgcaQw==",
+ "node_modules/acorn": {
+ "version": "8.16.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz",
+ "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==",
"dev": true,
+ "license": "MIT",
+ "bin": {
+ "acorn": "bin/acorn"
+ },
"engines": {
- "node": ">=14.14.0"
+ "node": ">=0.4.0"
}
},
- "node_modules/kuler": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz",
- "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==",
+ "node_modules/acorn-jsx": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
+ "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
"dev": true,
- "peer": true
+ "license": "MIT",
+ "peerDependencies": {
+ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ }
},
- "node_modules/ky": {
- "version": "0.30.0",
- "resolved": "https://registry.npmjs.org/ky/-/ky-0.30.0.tgz",
- "integrity": "sha512-X/u76z4JtDVq10u1JA5UQfatPxgPaVDMYTrgHyiTpGN2z4TMEJkIHsoSBBSg9SWZEIXTKsi9kHgiQ9o3Y/4yog==",
+ "node_modules/agent-base": {
+ "version": "7.1.4",
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz",
+ "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==",
+ "license": "MIT",
"engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sindresorhus/ky?sponsor=1"
+ "node": ">= 14"
}
},
- "node_modules/lazy-val": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/lazy-val/-/lazy-val-1.0.5.tgz",
- "integrity": "sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q=="
- },
- "node_modules/lazystream": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz",
- "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==",
+ "node_modules/ajv": {
+ "version": "8.20.0",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz",
+ "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "readable-stream": "^2.0.5"
+ "fast-deep-equal": "^3.1.3",
+ "fast-uri": "^3.0.1",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2"
},
- "engines": {
- "node": ">= 0.6.3"
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
}
},
- "node_modules/lazystream/node_modules/isarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
- "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
- "dev": true
- },
- "node_modules/lazystream/node_modules/readable-stream": {
- "version": "2.3.8",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
- "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
+ "node_modules/ajv-formats": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz",
+ "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==",
"dev": true,
+ "license": "MIT",
+ "peer": true,
"dependencies": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.3",
- "isarray": "~1.0.0",
- "process-nextick-args": "~2.0.0",
- "safe-buffer": "~5.1.1",
- "string_decoder": "~1.1.1",
- "util-deprecate": "~1.0.1"
+ "ajv": "^8.0.0"
+ },
+ "peerDependencies": {
+ "ajv": "^8.0.0"
+ },
+ "peerDependenciesMeta": {
+ "ajv": {
+ "optional": true
+ }
}
},
- "node_modules/lazystream/node_modules/safe-buffer": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
- "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
- "dev": true
+ "node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
},
- "node_modules/lazystream/node_modules/string_decoder": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
- "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
- "dev": true,
+ "node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "license": "MIT",
"dependencies": {
- "safe-buffer": "~5.1.0"
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
- "node_modules/less": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/less/-/less-4.2.0.tgz",
- "integrity": "sha512-P3b3HJDBtSzsXUl0im2L7gTO5Ubg8mEN6G8qoTS77iXxXX4Hvu4Qj540PZDvQ8V6DmX6iXo98k7Md0Cm1PrLaA==",
- "dev": true,
- "dependencies": {
- "copy-anything": "^2.0.1",
- "parse-node-version": "^1.0.1",
- "tslib": "^2.3.0"
+ "node_modules/antd": {
+ "version": "6.4.4",
+ "resolved": "https://registry.npmjs.org/antd/-/antd-6.4.4.tgz",
+ "integrity": "sha512-lgPz4KhfhiYddV/qPYo0ieqWimCVgV2OQF72mbeGNixE753JWNnmEc7UNGy08wBS/zZ7hxrmX0pc5aX7EUaIIg==",
+ "license": "MIT",
+ "dependencies": {
+ "@ant-design/colors": "^8.0.1",
+ "@ant-design/cssinjs": "^2.1.2",
+ "@ant-design/cssinjs-utils": "^2.1.2",
+ "@ant-design/fast-color": "^3.0.1",
+ "@ant-design/icons": "^6.2.5",
+ "@ant-design/react-slick": "~2.0.0",
+ "@babel/runtime": "^7.29.2",
+ "@rc-component/cascader": "~1.16.1",
+ "@rc-component/checkbox": "~2.0.0",
+ "@rc-component/collapse": "~1.2.0",
+ "@rc-component/color-picker": "~3.1.1",
+ "@rc-component/dialog": "~1.9.0",
+ "@rc-component/drawer": "~1.4.2",
+ "@rc-component/dropdown": "~1.0.2",
+ "@rc-component/form": "~1.8.3",
+ "@rc-component/image": "~1.9.0",
+ "@rc-component/input": "~1.3.1",
+ "@rc-component/input-number": "~1.6.2",
+ "@rc-component/mentions": "~1.9.0",
+ "@rc-component/menu": "~1.3.1",
+ "@rc-component/motion": "^1.3.3",
+ "@rc-component/mutate-observer": "^2.0.1",
+ "@rc-component/notification": "~2.0.7",
+ "@rc-component/pagination": "~1.3.0",
+ "@rc-component/picker": "~1.10.0",
+ "@rc-component/progress": "~1.0.2",
+ "@rc-component/qrcode": "~2.0.0",
+ "@rc-component/rate": "~1.0.1",
+ "@rc-component/resize-observer": "^1.1.2",
+ "@rc-component/segmented": "~1.3.0",
+ "@rc-component/select": "~1.7.1",
+ "@rc-component/slider": "~1.0.1",
+ "@rc-component/steps": "~1.2.2",
+ "@rc-component/switch": "~1.0.3",
+ "@rc-component/table": "~1.10.2",
+ "@rc-component/tabs": "~1.9.1",
+ "@rc-component/tooltip": "~1.4.0",
+ "@rc-component/tour": "~2.4.0",
+ "@rc-component/tree": "~1.3.2",
+ "@rc-component/tree-select": "~1.10.0",
+ "@rc-component/trigger": "^3.9.1",
+ "@rc-component/upload": "~1.1.1",
+ "@rc-component/util": "^1.11.1",
+ "clsx": "^2.1.1",
+ "dayjs": "^1.11.11",
+ "scroll-into-view-if-needed": "^3.1.0",
+ "throttle-debounce": "^5.0.2"
},
- "bin": {
- "lessc": "bin/lessc"
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/ant-design"
+ },
+ "peerDependencies": {
+ "react": ">=18.0.0",
+ "react-dom": ">=18.0.0"
+ }
+ },
+ "node_modules/anynum": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/anynum/-/anynum-1.0.1.tgz",
+ "integrity": "sha512-N6//FLET/tXYNM/F6ABca1oH6fWB+KlTt909Le28WMDBk8oaT4vY17DCrwg2MvmuqUKt3Ni4N5dGJ/EoBgcO6A==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/NaturalIntelligence"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/app-builder-lib": {
+ "version": "26.15.3",
+ "resolved": "https://registry.npmjs.org/app-builder-lib/-/app-builder-lib-26.15.3.tgz",
+ "integrity": "sha512-2VnyWkqsP5v5XbBhL3tD5Syx8iNPBYsoU7kY4S2fz7wg8Rj/nztWKCUzGKaFRTv0Xwf3/H058CR1Kvtd/3lRow==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@electron/asar": "3.4.1",
+ "@electron/fuses": "^1.8.0",
+ "@electron/get": "^3.0.0",
+ "@electron/notarize": "2.5.0",
+ "@electron/osx-sign": "1.3.3",
+ "@electron/rebuild": "^4.0.4",
+ "@electron/universal": "2.0.3",
+ "@malept/flatpak-bundler": "^0.4.0",
+ "@noble/hashes": "^2.2.0",
+ "@peculiar/webcrypto": "^1.7.1",
+ "@types/fs-extra": "9.0.13",
+ "ajv": "^8.18.0",
+ "asn1js": "^3.0.10",
+ "async-exit-hook": "^2.0.1",
+ "builder-util": "26.15.3",
+ "builder-util-runtime": "9.7.0",
+ "chromium-pickle-js": "^0.2.0",
+ "ci-info": "4.3.1",
+ "debug": "^4.3.4",
+ "dotenv": "^16.4.5",
+ "dotenv-expand": "^11.0.6",
+ "ejs": "^3.1.8",
+ "electron-publish": "26.15.3",
+ "fs-extra": "^10.1.0",
+ "hosted-git-info": "^4.1.0",
+ "isbinaryfile": "^5.0.0",
+ "jiti": "^2.4.2",
+ "js-yaml": "^4.1.0",
+ "json5": "^2.2.3",
+ "lazy-val": "^1.0.5",
+ "minimatch": "^10.2.5",
+ "pkijs": "^3.4.0",
+ "plist": "3.1.0",
+ "proper-lockfile": "^4.1.2",
+ "resedit": "^1.7.0",
+ "semver": "~7.7.3",
+ "tar": "^7.5.7",
+ "temp-file": "^3.4.0",
+ "tiny-async-pool": "1.3.0",
+ "unzipper": "^0.12.3",
+ "which": "^5.0.0"
},
"engines": {
- "node": ">=6"
+ "node": ">=14.0.0"
},
- "optionalDependencies": {
- "errno": "^0.1.1",
- "graceful-fs": "^4.1.2",
- "image-size": "~0.5.0",
- "make-dir": "^2.1.0",
- "mime": "^1.4.1",
- "needle": "^3.1.0",
- "source-map": "~0.6.0"
+ "peerDependencies": {
+ "dmg-builder": "26.15.3",
+ "electron-builder-squirrel-windows": "26.15.3"
}
},
- "node_modules/less/node_modules/mime": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
- "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
+ "node_modules/app-builder-lib/node_modules/@electron/get": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/@electron/get/-/get-3.1.0.tgz",
+ "integrity": "sha512-F+nKc0xW+kVbBRhFzaMgPy3KwmuNTYX1fx6+FxxoSnNgwYX6LD7AKBTWkU0MQ6IBoe7dz069CNkR673sPAgkCQ==",
"dev": true,
- "optional": true,
- "bin": {
- "mime": "cli.js"
+ "license": "MIT",
+ "dependencies": {
+ "debug": "^4.1.1",
+ "env-paths": "^2.2.0",
+ "fs-extra": "^8.1.0",
+ "got": "^11.8.5",
+ "progress": "^2.0.3",
+ "semver": "^6.2.0",
+ "sumchecker": "^3.0.1"
},
"engines": {
- "node": ">=4"
+ "node": ">=14"
+ },
+ "optionalDependencies": {
+ "global-agent": "^3.0.0"
}
},
- "node_modules/levn": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
- "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
+ "node_modules/app-builder-lib/node_modules/@electron/get/node_modules/fs-extra": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz",
+ "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "prelude-ls": "^1.2.1",
- "type-check": "~0.4.0"
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^4.0.0",
+ "universalify": "^0.1.0"
},
"engines": {
- "node": ">= 0.8.0"
+ "node": ">=6 <7 || >=8"
}
},
- "node_modules/lie": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz",
- "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==",
+ "node_modules/app-builder-lib/node_modules/@electron/get/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
"dev": true,
- "dependencies": {
- "immediate": "~3.0.5"
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
}
},
- "node_modules/lighthouse-logger": {
- "version": "1.4.2",
- "resolved": "https://registry.npmjs.org/lighthouse-logger/-/lighthouse-logger-1.4.2.tgz",
- "integrity": "sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g==",
+ "node_modules/app-builder-lib/node_modules/ci-info": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.3.1.tgz",
+ "integrity": "sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA==",
"dev": true,
- "dependencies": {
- "debug": "^2.6.9",
- "marky": "^1.2.2"
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/sibiraj-s"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
}
},
- "node_modules/lighthouse-logger/node_modules/debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "node_modules/app-builder-lib/node_modules/minimatch": {
+ "version": "10.2.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz",
+ "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==",
"dev": true,
+ "license": "BlueOak-1.0.0",
"dependencies": {
- "ms": "2.0.0"
+ "brace-expansion": "^5.0.5"
+ },
+ "engines": {
+ "node": "18 || 20 || >=22"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
}
},
- "node_modules/lighthouse-logger/node_modules/ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
- "dev": true
- },
- "node_modules/lilconfig": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.0.0.tgz",
- "integrity": "sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==",
+ "node_modules/app-builder-lib/node_modules/which": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz",
+ "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==",
"dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "isexe": "^3.1.1"
+ },
+ "bin": {
+ "node-which": "bin/which.js"
+ },
"engines": {
- "node": ">=14"
+ "node": "^18.17.0 || >=20.5.0"
}
},
- "node_modules/lines-and-columns": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
- "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
- "dev": true
- },
- "node_modules/loader-utils": {
- "version": "1.4.2",
- "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz",
- "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==",
+ "node_modules/appium": {
+ "version": "3.5.0",
+ "resolved": "https://registry.npmjs.org/appium/-/appium-3.5.0.tgz",
+ "integrity": "sha512-G9m4J2qlWeP8gutlk6DZv2qkxwWjQ+mfhmHxJDxXcY9nsAi3zbMScod5orn2s8GciBNrsp5To/4EavDH4uO8dw==",
"dev": true,
+ "hasInstallScript": true,
+ "license": "Apache-2.0",
+ "peer": true,
"dependencies": {
- "big.js": "^5.2.2",
- "emojis-list": "^3.0.0",
- "json5": "^1.0.1"
+ "@appium/base-driver": "10.6.0",
+ "@appium/base-plugin": "3.3.0",
+ "@appium/docutils": "2.4.3",
+ "@appium/logger": "2.0.8",
+ "@appium/schema": "1.2.0",
+ "@appium/support": "7.2.3",
+ "@appium/types": "1.5.0",
+ "@sidvind/better-ajv-errors": "5.0.0",
+ "ajv": "8.20.0",
+ "ajv-formats": "3.0.1",
+ "argparse": "2.0.1",
+ "asyncbox": "6.3.0",
+ "axios": "1.16.1",
+ "lilconfig": "3.1.3",
+ "lodash": "4.18.1",
+ "lru-cache": "11.5.0",
+ "ora": "5.4.1",
+ "package-changed": "3.0.0",
+ "resolve-from": "5.0.0",
+ "semver": "7.8.1",
+ "teen_process": "4.1.3",
+ "type-fest": "5.6.0",
+ "winston": "3.19.0",
+ "ws": "8.21.0",
+ "yaml": "2.9.0"
+ },
+ "bin": {
+ "appium": "index.js"
},
"engines": {
- "node": ">=4.0.0"
+ "node": "^20.19.0 || ^22.12.0 || >=24.0.0",
+ "npm": ">=10"
}
},
- "node_modules/loader-utils/node_modules/json5": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
- "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
+ "node_modules/appium/node_modules/@appium/docutils": {
+ "version": "2.4.3",
+ "resolved": "https://registry.npmjs.org/@appium/docutils/-/docutils-2.4.3.tgz",
+ "integrity": "sha512-2267rmUqsA/Tam+tmZNhmGxq2UN2lXWK3xZOYX5a9+oc0y19IB6LFJ9+dRxHh4jRgdLJrtxzqqGPUfs4hBjLgQ==",
"dev": true,
+ "license": "Apache-2.0",
+ "peer": true,
"dependencies": {
- "minimist": "^1.2.0"
+ "@appium/support": "7.2.3",
+ "consola": "3.4.2",
+ "diff": "9.0.0",
+ "lilconfig": "3.1.3",
+ "package-directory": "8.2.0",
+ "read-pkg": "10.1.0",
+ "teen_process": "4.1.3",
+ "type-fest": "5.6.0",
+ "yaml": "2.9.0",
+ "yargs": "18.0.0",
+ "yargs-parser": "22.0.0"
},
"bin": {
- "json5": "lib/cli.js"
+ "appium-docs": "bin/appium-docs.js"
+ },
+ "engines": {
+ "node": "^20.19.0 || ^22.12.0 || >=24.0.0",
+ "npm": ">=10"
}
},
- "node_modules/locate-path": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
- "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+ "node_modules/appium/node_modules/@appium/support": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/@appium/support/-/support-7.2.3.tgz",
+ "integrity": "sha512-/NVMUffjnH9rNrxE+DyM811B1hd0pZl8RT+DlZfqXVyAWzhUjBWw3U2VwSycowDoV9dBpXSpWQ3S+zfRnrMcTg==",
"dev": true,
+ "license": "Apache-2.0",
+ "peer": true,
"dependencies": {
- "p-locate": "^5.0.0"
+ "@appium/logger": "2.0.8",
+ "@appium/tsconfig": "1.1.2",
+ "@appium/types": "1.5.0",
+ "@colors/colors": "1.6.0",
+ "archiver": "8.0.0",
+ "asyncbox": "6.3.0",
+ "axios": "1.16.1",
+ "base64-stream": "1.0.0",
+ "bluebird": "3.7.2",
+ "bplist-creator": "0.1.1",
+ "bplist-parser": "0.3.2",
+ "form-data": "4.0.5",
+ "get-stream": "9.0.1",
+ "glob": "13.0.6",
+ "jsftp": "2.1.3",
+ "klaw": "4.1.0",
+ "lockfile": "1.0.4",
+ "log-symbols": "7.0.1",
+ "ncp": "2.0.0",
+ "package-directory": "8.2.0",
+ "plist": "4.0.0",
+ "pluralize": "8.0.0",
+ "read-pkg": "10.1.0",
+ "resolve-from": "5.0.0",
+ "sanitize-filename": "1.6.4",
+ "semver": "7.8.1",
+ "shell-quote": "1.8.4",
+ "supports-color": "10.2.2",
+ "teen_process": "4.1.3",
+ "type-fest": "5.6.0",
+ "uuid": "14.0.0",
+ "which": "6.0.1",
+ "yauzl": "3.3.1"
},
"engines": {
- "node": ">=10"
+ "node": "^20.19.0 || ^22.12.0 || >=24.0.0",
+ "npm": ">=10"
},
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "optionalDependencies": {
+ "sharp": "0.34.5"
}
},
- "node_modules/lockfile": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/lockfile/-/lockfile-1.0.4.tgz",
- "integrity": "sha512-cvbTwETRfsFh4nHsL1eGWapU1XFi5Ot9E85sWAwia7Y7EgB7vfqcZhTKZ+l7hCGxSPoushMv5GKhT5PdLv03WA==",
+ "node_modules/appium/node_modules/buffer-crc32": {
+ "version": "0.2.13",
+ "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
+ "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==",
"dev": true,
- "dependencies": {
- "signal-exit": "^3.0.2"
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": "*"
}
},
- "node_modules/lockfile/node_modules/signal-exit": {
- "version": "3.0.7",
- "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
- "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
- "dev": true
- },
- "node_modules/lodash": {
- "version": "4.17.21",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
- "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
- },
- "node_modules/lodash.camelcase": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
- "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==",
- "dev": true
- },
- "node_modules/lodash.clone": {
- "version": "4.5.0",
- "resolved": "https://registry.npmjs.org/lodash.clone/-/lodash.clone-4.5.0.tgz",
- "integrity": "sha512-GhrVeweiTD6uTmmn5hV/lzgCQhccwReIVRLHp7LT4SopOjqEZ5BbX8b5WWEtAKasjmy8hR7ZPwsYlxRCku5odg==",
- "dev": true
- },
- "node_modules/lodash.clonedeep": {
- "version": "4.5.0",
- "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz",
- "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==",
- "dev": true
- },
- "node_modules/lodash.debounce": {
- "version": "4.0.8",
- "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
- "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==",
- "dev": true
- },
- "node_modules/lodash.defaults": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz",
- "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==",
- "dev": true
- },
- "node_modules/lodash.difference": {
- "version": "4.5.0",
- "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz",
- "integrity": "sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==",
- "dev": true
- },
- "node_modules/lodash.escaperegexp": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz",
- "integrity": "sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw=="
- },
- "node_modules/lodash.flatten": {
- "version": "4.4.0",
- "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz",
- "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==",
- "dev": true
- },
- "node_modules/lodash.get": {
- "version": "4.4.2",
- "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz",
- "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ=="
- },
- "node_modules/lodash.has": {
- "version": "4.5.2",
- "resolved": "https://registry.npmjs.org/lodash.has/-/lodash.has-4.5.2.tgz",
- "integrity": "sha512-rnYUdIo6xRCJnQmbVFEwcxF144erlD+M3YcJUVesflU9paQaE8p+fJDcIQrlMYbxoANFL+AB9hZrzSBBk5PL+g=="
- },
- "node_modules/lodash.isequal": {
- "version": "4.5.0",
- "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz",
- "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ=="
- },
- "node_modules/lodash.isobject": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/lodash.isobject/-/lodash.isobject-3.0.2.tgz",
- "integrity": "sha512-3/Qptq2vr7WeJbB4KHUSKlq8Pl7ASXi3UG6CMbBm8WRtXi8+GHm7mKaU3urfpSEzWe2wCIChs6/sdocUsTKJiA==",
- "dev": true
- },
- "node_modules/lodash.isplainobject": {
- "version": "4.0.6",
- "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
- "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==",
- "dev": true
- },
- "node_modules/lodash.memoize": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz",
- "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==",
- "dev": true
- },
- "node_modules/lodash.merge": {
- "version": "4.6.2",
- "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
- "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="
- },
- "node_modules/lodash.set": {
- "version": "4.3.2",
- "resolved": "https://registry.npmjs.org/lodash.set/-/lodash.set-4.3.2.tgz",
- "integrity": "sha512-4hNPN5jlm/N/HLMCO43v8BXKq9Z7QdAGc/VGrRD61w8gN9g/6jF9A4L1pbUgBLCffi0w9VsXfTOij5x8iTyFvg=="
- },
- "node_modules/lodash.sortby": {
- "version": "4.7.0",
- "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz",
- "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==",
- "dev": true
- },
- "node_modules/lodash.union": {
- "version": "4.6.0",
- "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz",
- "integrity": "sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==",
- "dev": true
- },
- "node_modules/lodash.uniq": {
- "version": "4.5.0",
- "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz",
- "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==",
- "dev": true
- },
- "node_modules/lodash.unset": {
- "version": "4.5.2",
- "resolved": "https://registry.npmjs.org/lodash.unset/-/lodash.unset-4.5.2.tgz",
- "integrity": "sha512-bwKX88k2JhCV9D1vtE8+naDKlLiGrSmf8zi/Y9ivFHwbmRfA8RxS/aVJ+sIht2XOwqoNr4xUPUkGZpc1sHFEKg=="
- },
- "node_modules/lodash.zip": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/lodash.zip/-/lodash.zip-4.2.0.tgz",
- "integrity": "sha512-C7IOaBBK/0gMORRBd8OETNx3kmOkgIWIPvyDpZSCTwUrpYmgZwJkjZeOD8ww4xbOUOs4/attY+pciKvadNfFbg==",
- "dev": true
- },
- "node_modules/log-symbols": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz",
- "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==",
+ "node_modules/appium/node_modules/plist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/plist/-/plist-4.0.0.tgz",
+ "integrity": "sha512-4dOqNo0Y2NpfSf9q4+zr4bh7pzNWeckIam34Z0KYJhg8qtNNfh59VbD+Yna5SjwcxawVvLKx5w5FtuCijpEF4Q==",
"dev": true,
+ "license": "MIT",
+ "peer": true,
"dependencies": {
- "chalk": "^4.1.0",
- "is-unicode-supported": "^0.1.0"
+ "@xmldom/xmldom": "^0.9.10",
+ "xmlbuilder": "^15.1.1"
},
"engines": {
- "node": ">=10"
+ "node": ">=18"
+ }
+ },
+ "node_modules/appium/node_modules/semver": {
+ "version": "7.8.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.1.tgz",
+ "integrity": "sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg==",
+ "dev": true,
+ "license": "ISC",
+ "peer": true,
+ "bin": {
+ "semver": "bin/semver.js"
},
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "engines": {
+ "node": ">=10"
}
},
- "node_modules/log-symbols/node_modules/ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "node_modules/appium/node_modules/yauzl": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-3.3.1.tgz",
+ "integrity": "sha512-RNPCUkiE/ZgO4w8i9U5yDQVHaFDdnzaFANElRvpJteCspvmv2VqrRb9lvS6odVD+jqI/zDsxAHJVsafpcheVQQ==",
"dev": true,
+ "license": "MIT",
+ "peer": true,
"dependencies": {
- "color-convert": "^2.0.1"
+ "buffer-crc32": "~0.2.3",
+ "pend": "~1.2.0"
},
"engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ "node": ">=12"
}
},
- "node_modules/log-symbols/node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "node_modules/archiver": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/archiver/-/archiver-8.0.0.tgz",
+ "integrity": "sha512-fV1orZfsnPn9BaSByR/qE67rJCLJEy2Ox5bq7nJh+jquWaNh6Sfec75kJ2T6PtdGUbPQlrVoSVCEOa5SdiTQ1g==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
+ "async": "^3.2.4",
+ "buffer-crc32": "^1.0.0",
+ "is-stream": "^4.0.0",
+ "lazystream": "^1.0.0",
+ "normalize-path": "^3.0.0",
+ "readable-stream": "^4.0.0",
+ "readdir-glob": "^3.0.0",
+ "tar-stream": "^3.0.0",
+ "zip-stream": "^7.0.2"
},
"engines": {
- "node": ">=10"
+ "node": ">=18"
+ }
+ },
+ "node_modules/archiver/node_modules/is-stream": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-4.0.1.tgz",
+ "integrity": "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
},
"funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/log-symbols/node_modules/color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "node_modules/are-docs-informative": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/are-docs-informative/-/are-docs-informative-0.0.2.tgz",
+ "integrity": "sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig==",
"dev": true,
- "dependencies": {
- "color-name": "~1.1.4"
- },
+ "license": "MIT",
"engines": {
- "node": ">=7.0.0"
+ "node": ">=14"
}
},
- "node_modules/log-symbols/node_modules/color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "dev": true
+ "node_modules/argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+ "license": "Python-2.0"
},
- "node_modules/log-symbols/node_modules/supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "node_modules/asn1js": {
+ "version": "3.0.10",
+ "resolved": "https://registry.npmjs.org/asn1js/-/asn1js-3.0.10.tgz",
+ "integrity": "sha512-S2s3aOytiKdFRdulw2qPE51MzjzVOisppcVv7jVFR+Kw0kxwvFrDcYA0h7Ndqbmj0HkMIXYWaoj7fli8kgx1eg==",
"dev": true,
+ "license": "BSD-3-Clause",
"dependencies": {
- "has-flag": "^4.0.0"
+ "pvtsutils": "^1.3.6",
+ "pvutils": "^1.1.5",
+ "tslib": "^2.8.1"
},
"engines": {
- "node": ">=8"
+ "node": ">=12.0.0"
}
},
- "node_modules/logform": {
- "version": "2.6.0",
- "resolved": "https://registry.npmjs.org/logform/-/logform-2.6.0.tgz",
- "integrity": "sha512-1ulHeNPp6k/LD8H91o7VYFBng5i1BDE7HoKxVbZiGFidS1Rj65qcywLxX+pVfAPoQJEjRdvKcusKwOupHCVOVQ==",
+ "node_modules/assertion-error": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz",
+ "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==",
"dev": true,
- "peer": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/ast-types": {
+ "version": "0.13.4",
+ "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz",
+ "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==",
+ "license": "MIT",
"dependencies": {
- "@colors/colors": "1.6.0",
- "@types/triple-beam": "^1.3.2",
- "fecha": "^4.2.0",
- "ms": "^2.1.1",
- "safe-stable-stringify": "^2.3.1",
- "triple-beam": "^1.3.0"
+ "tslib": "^2.0.1"
},
"engines": {
- "node": ">= 12.0.0"
+ "node": ">=4"
}
},
- "node_modules/loglevel": {
- "version": "1.8.1",
- "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.8.1.tgz",
- "integrity": "sha512-tCRIJM51SHjAayKwC+QAg8hT8vg6z7GSgLJKGvzuPb1Wc+hLzqtuVLxp6/HzSPOozuK+8ErAhy7U/sVzw8Dgfg==",
+ "node_modules/async": {
+ "version": "3.2.6",
+ "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz",
+ "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/async-exit-hook": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/async-exit-hook/-/async-exit-hook-2.0.1.tgz",
+ "integrity": "sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw==",
+ "dev": true,
+ "license": "MIT",
"engines": {
- "node": ">= 0.6.0"
- },
- "funding": {
- "type": "tidelift",
- "url": "https://tidelift.com/funding/github/npm/loglevel"
+ "node": ">=0.12.0"
}
},
- "node_modules/loglevel-plugin-prefix": {
- "version": "0.8.4",
- "resolved": "https://registry.npmjs.org/loglevel-plugin-prefix/-/loglevel-plugin-prefix-0.8.4.tgz",
- "integrity": "sha512-WpG9CcFAOjz/FtNht+QJeGpvVl/cdR6P0z6OcXSkr8wFJOsV2GRj2j10JLfjuA4aYkcKCNIEqRGCyTife9R8/g=="
+ "node_modules/async-lock": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/async-lock/-/async-lock-1.4.1.tgz",
+ "integrity": "sha512-Az2ZTpuytrtqENulXwO3GGv1Bztugx6TT37NIo7imr/Qo0gsYiGtSdBa2B6fsXhTpVZDNfu1Qn3pk531e3q+nQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
},
- "node_modules/loose-envify": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
- "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
+ "node_modules/asyncbox": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/asyncbox/-/asyncbox-6.3.0.tgz",
+ "integrity": "sha512-7IFpnQDltd5rYQjhIJIpyismJtdWmw/pOABZKJfv2WVo0a6iYh2ZzUuCJJclae5mBtK0H/EychxXg91GB7rGdQ==",
+ "dev": true,
+ "license": "Apache-2.0",
"dependencies": {
- "js-tokens": "^3.0.0 || ^4.0.0"
+ "p-limit": "^7.2.0"
},
- "bin": {
- "loose-envify": "cli.js"
+ "engines": {
+ "node": "^20.19.0 || ^22.12.0 || >=24.0.0",
+ "npm": ">=10"
}
},
- "node_modules/loupe": {
- "version": "2.3.7",
- "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz",
- "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==",
+ "node_modules/asynckit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
"dev": true,
- "dependencies": {
- "get-func-name": "^2.0.1"
- }
+ "license": "MIT"
},
- "node_modules/lowercase-keys": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz",
- "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==",
+ "node_modules/at-least-node": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz",
+ "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==",
+ "dev": true,
+ "license": "ISC",
"engines": {
- "node": ">=0.10.0"
+ "node": ">= 4.0.0"
}
},
- "node_modules/lru-cache": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
- "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
+ "node_modules/aws4": {
+ "version": "1.13.2",
+ "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.13.2.tgz",
+ "integrity": "sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==",
"dev": true,
- "dependencies": {
- "yallist": "^3.0.2"
- }
+ "license": "MIT"
},
- "node_modules/magic-string": {
- "version": "0.22.5",
- "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.22.5.tgz",
- "integrity": "sha512-oreip9rJZkzvA8Qzk9HFs8fZGF/u7H/gtrE8EN6RjKJ9kh2HlC+yQ2QezifqTZfGyiuAV0dRv5a+y/8gBb1m9w==",
+ "node_modules/axios": {
+ "version": "1.16.1",
+ "resolved": "https://registry.npmjs.org/axios/-/axios-1.16.1.tgz",
+ "integrity": "sha512-caYkukvroVPO8KrzuJEb50Hm07KwfBZPEC3VeFHTsqWHvKTsy54hjJz9BS/cdaypROE2rH6xvm9mHX4fgWkr3A==",
"dev": true,
+ "license": "MIT",
+ "peer": true,
"dependencies": {
- "vlq": "^0.2.2"
+ "follow-redirects": "^1.16.0",
+ "form-data": "^4.0.5",
+ "https-proxy-agent": "^5.0.1",
+ "proxy-from-env": "^2.1.0"
}
},
- "node_modules/make-dir": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz",
- "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==",
+ "node_modules/axios/node_modules/agent-base": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
+ "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
"dev": true,
+ "license": "MIT",
+ "peer": true,
"dependencies": {
- "pify": "^4.0.1",
- "semver": "^5.6.0"
+ "debug": "4"
},
"engines": {
- "node": ">=6"
+ "node": ">= 6.0.0"
}
},
- "node_modules/make-dir/node_modules/semver": {
- "version": "5.7.2",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
- "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
+ "node_modules/axios/node_modules/https-proxy-agent": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
+ "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==",
"dev": true,
- "bin": {
- "semver": "bin/semver"
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "agent-base": "6",
+ "debug": "4"
+ },
+ "engines": {
+ "node": ">= 6"
}
},
- "node_modules/make-error": {
- "version": "1.3.6",
- "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz",
- "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==",
- "dev": true
- },
- "node_modules/map-cache": {
- "version": "0.2.2",
- "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
- "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==",
+ "node_modules/axios/node_modules/proxy-from-env": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-2.1.0.tgz",
+ "integrity": "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==",
"dev": true,
+ "license": "MIT",
+ "peer": true,
"engines": {
- "node": ">=0.10.0"
+ "node": ">=10"
+ }
+ },
+ "node_modules/b4a": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.8.1.tgz",
+ "integrity": "sha512-aiqre1Nr0B/6DgE2N5vwTc+2/oQZ4Wh1t4NznYY4E00y8LCt6NqdRv81so00oo27D8MVKTpUa/MwUUtBLXCoDw==",
+ "license": "Apache-2.0",
+ "peerDependencies": {
+ "react-native-b4a": "*"
+ },
+ "peerDependenciesMeta": {
+ "react-native-b4a": {
+ "optional": true
+ }
}
},
- "node_modules/map-visit": {
+ "node_modules/babel-plugin-react-compiler": {
"version": "1.0.0",
- "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz",
- "integrity": "sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==",
+ "resolved": "https://registry.npmjs.org/babel-plugin-react-compiler/-/babel-plugin-react-compiler-1.0.0.tgz",
+ "integrity": "sha512-Ixm8tFfoKKIPYdCCKYTsqv+Fd4IJ0DQqMyEimo+pxUOMUR9cVPlwTrFt9Avu+3cb6Zp3mAzl+t1MrG2fxxKsxw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "object-visit": "^1.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
+ "@babel/types": "^7.26.0"
}
},
- "node_modules/marky": {
- "version": "1.2.5",
- "resolved": "https://registry.npmjs.org/marky/-/marky-1.2.5.tgz",
- "integrity": "sha512-q9JtQJKjpsVxCRVgQ+WapguSbKC3SQ5HEzFGPAJMStgh3QjCawp00UKv3MTTAArTmGmmPUvllHZoNbZ3gs0I+Q==",
- "dev": true
- },
- "node_modules/matcher": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz",
- "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==",
- "optional": true,
- "dependencies": {
- "escape-string-regexp": "^4.0.0"
- },
+ "node_modules/balanced-match": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz",
+ "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==",
+ "dev": true,
+ "license": "MIT",
"engines": {
- "node": ">=10"
+ "node": "18 || 20 || >=22"
}
},
- "node_modules/matcher/node_modules/escape-string-regexp": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
- "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
- "optional": true,
- "engines": {
- "node": ">=10"
+ "node_modules/bare-events": {
+ "version": "2.8.2",
+ "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.8.2.tgz",
+ "integrity": "sha512-riJjyv1/mHLIPX4RwiK+oW9/4c3TEUeORHKefKAKnZ5kyslbN+HXowtbaVEqt4IMUB7OXlfixcs6gsFeo/jhiQ==",
+ "license": "Apache-2.0",
+ "peerDependencies": {
+ "bare-abort-controller": "*"
},
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "peerDependenciesMeta": {
+ "bare-abort-controller": {
+ "optional": true
+ }
}
},
- "node_modules/maximatch": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/maximatch/-/maximatch-0.1.0.tgz",
- "integrity": "sha512-9ORVtDUFk4u/NFfo0vG/ND/z7UQCVZBL539YW0+U1I7H1BkZwizcPx5foFv7LCPcBnm2U6RjFnQOsIvN4/Vm2A==",
- "dev": true,
+ "node_modules/bare-fs": {
+ "version": "4.7.2",
+ "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.7.2.tgz",
+ "integrity": "sha512-aTvMFUWkBmjzKtEQMDGGDNF8bkfpD5N1b/FCwt7A3wrU4t1o/e/85Wzkluh6JlODCjqVESYCkQCdTXqZ9G7VFg==",
+ "license": "Apache-2.0",
+ "optional": true,
"dependencies": {
- "array-differ": "^1.0.0",
- "array-union": "^1.0.1",
- "arrify": "^1.0.0",
- "minimatch": "^3.0.0"
+ "bare-events": "^2.5.4",
+ "bare-path": "^3.0.0",
+ "bare-stream": "^2.6.4",
+ "bare-url": "^2.2.2",
+ "fast-fifo": "^1.3.2"
},
"engines": {
- "node": ">=0.10.0"
+ "bare": ">=1.16.0"
+ },
+ "peerDependencies": {
+ "bare-buffer": "*"
+ },
+ "peerDependenciesMeta": {
+ "bare-buffer": {
+ "optional": true
+ }
}
},
- "node_modules/maximatch/node_modules/brace-expansion": {
- "version": "1.1.11",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
- "dev": true,
- "dependencies": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
+ "node_modules/bare-os": {
+ "version": "3.9.1",
+ "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.9.1.tgz",
+ "integrity": "sha512-6M5XjcnsygQNPMCMPXSK379xrJFiZ/AEMNBmFEmQW8d/789VQATvriyi5r0HYTL9TkQ26rn3kgdTG3aisbrXkQ==",
+ "license": "Apache-2.0",
+ "optional": true,
+ "engines": {
+ "bare": ">=1.14.0"
}
},
- "node_modules/maximatch/node_modules/minimatch": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
- "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
- "dev": true,
+ "node_modules/bare-path": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-3.0.1.tgz",
+ "integrity": "sha512-ghj2DSK/2e99a1anTVPCV4m4YIYtrbXhfM7V3D7XZLOTsybnYyaJloymGqssQc8l/or0UoDyRtNQkmkEF/ysgQ==",
+ "license": "Apache-2.0",
+ "optional": true,
"dependencies": {
- "brace-expansion": "^1.1.7"
- },
- "engines": {
- "node": "*"
+ "bare-os": "^3.0.1"
}
},
- "node_modules/md5": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz",
- "integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==",
- "dev": true,
+ "node_modules/bare-stream": {
+ "version": "2.13.3",
+ "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.13.3.tgz",
+ "integrity": "sha512-Kc+brLqvEqGkjyfiwJmImAOqLZL7OsoLKuavx+hJjgVV3nLTOjloJyPMFxjUPerGGHrNH0fLU06jjykMLWrERQ==",
+ "license": "Apache-2.0",
+ "optional": true,
"dependencies": {
- "charenc": "0.0.2",
- "crypt": "0.0.2",
- "is-buffer": "~1.1.6"
+ "b4a": "^1.8.1",
+ "streamx": "^2.25.0",
+ "teex": "^1.0.1"
+ },
+ "peerDependencies": {
+ "bare-abort-controller": "*",
+ "bare-buffer": "*",
+ "bare-events": "*"
+ },
+ "peerDependenciesMeta": {
+ "bare-abort-controller": {
+ "optional": true
+ },
+ "bare-buffer": {
+ "optional": true
+ },
+ "bare-events": {
+ "optional": true
+ }
}
},
- "node_modules/md5.js": {
- "version": "1.3.5",
- "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz",
- "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==",
- "dev": true,
+ "node_modules/bare-url": {
+ "version": "2.4.5",
+ "resolved": "https://registry.npmjs.org/bare-url/-/bare-url-2.4.5.tgz",
+ "integrity": "sha512-K+y9xF1tN+CdPu4qWwr0QiK1Al07eFPGYK5M2pDXcmHdMdgC/tT/bpmMe1hrmRHaidKLkXrC+cRNYf3XVDUhSQ==",
+ "license": "Apache-2.0",
+ "optional": true,
"dependencies": {
- "hash-base": "^3.0.0",
- "inherits": "^2.0.1",
- "safe-buffer": "^5.1.2"
+ "bare-path": "^3.0.0"
}
},
- "node_modules/mdn-data": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz",
- "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==",
- "dev": true
- },
- "node_modules/media-typer": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
- "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
+ "node_modules/base64-js": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
+ "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
"dev": true,
- "peer": true,
- "engines": {
- "node": ">= 0.6"
- }
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT"
},
- "node_modules/merge-descriptors": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
- "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==",
+ "node_modules/base64-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/base64-stream/-/base64-stream-1.0.0.tgz",
+ "integrity": "sha512-BQQZftaO48FcE1Kof9CmXMFaAdqkcNorgc8CxesZv9nMbbTF1EFyQe89UOuh//QMmdtfUDXyO8rgUalemL5ODA==",
"dev": true,
+ "license": "MIT",
"peer": true
},
- "node_modules/merge-source-map": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.0.4.tgz",
- "integrity": "sha512-PGSmS0kfnTnMJCzJ16BLLCEe6oeYCamKFFdQKshi4BmM6FUwipjVOcBFGxqtQtirtAG4iZvHlqST9CpZKqlRjA==",
- "dev": true,
- "dependencies": {
- "source-map": "^0.5.6"
- }
- },
- "node_modules/merge-source-map/node_modules/source-map": {
- "version": "0.5.7",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
- "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/merge2": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
- "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+ "node_modules/baseline-browser-mapping": {
+ "version": "2.10.0",
+ "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.0.tgz",
+ "integrity": "sha512-lIyg0szRfYbiy67j9KN8IyeD7q7hcmqnJ1ddWmNt19ItGpNN64mnllmxUNFIOdOm6by97jlL6wfpTTJrmnjWAA==",
"dev": true,
+ "license": "Apache-2.0",
+ "bin": {
+ "baseline-browser-mapping": "dist/cli.cjs"
+ },
"engines": {
- "node": ">= 8"
+ "node": ">=6.0.0"
}
},
- "node_modules/method-override": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/method-override/-/method-override-3.0.0.tgz",
- "integrity": "sha512-IJ2NNN/mSl9w3kzWB92rcdHpz+HjkxhDJWNDBqSlas+zQdP8wBiJzITPg08M/k2uVvMow7Sk41atndNtt/PHSA==",
+ "node_modules/basic-auth": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz",
+ "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==",
"dev": true,
+ "license": "MIT",
"peer": true,
"dependencies": {
- "debug": "3.1.0",
- "methods": "~1.1.2",
- "parseurl": "~1.3.2",
- "vary": "~1.1.2"
+ "safe-buffer": "5.1.2"
},
"engines": {
- "node": ">= 0.10"
+ "node": ">= 0.8"
}
},
- "node_modules/method-override/node_modules/debug": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
- "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+ "node_modules/basic-ftp": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.3.1.tgz",
+ "integrity": "sha512-bopVNp6ugyA150DDuZfPFdt1KZ5a94ZDiwX4hMgZDzF+GttD80lEy8kj98kbyhLXnPvhtIo93mdnLIjpCAeeOw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/big-integer": {
+ "version": "1.6.52",
+ "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz",
+ "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==",
"dev": true,
- "peer": true,
- "dependencies": {
- "ms": "2.0.0"
+ "license": "Unlicense",
+ "engines": {
+ "node": ">=0.6"
}
},
- "node_modules/method-override/node_modules/ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "node_modules/birecord": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/birecord/-/birecord-0.1.1.tgz",
+ "integrity": "sha512-VUpsf/qykW0heRlC8LooCq28Kxn3mAqKohhDG/49rrsQ1dT1CXyj/pgXS+5BSRzFTR/3DyIBOqQOrGyZOh71Aw==",
"dev": true,
- "peer": true
+ "license": "(MIT OR Apache-2.0)"
},
- "node_modules/methods": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
- "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==",
+ "node_modules/bl": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz",
+ "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==",
"dev": true,
+ "license": "MIT",
"peer": true,
- "engines": {
- "node": ">= 0.6"
+ "dependencies": {
+ "buffer": "^5.5.0",
+ "inherits": "^2.0.4",
+ "readable-stream": "^3.4.0"
}
},
- "node_modules/micromatch": {
- "version": "3.1.10",
- "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
- "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
+ "node_modules/bl/node_modules/readable-stream": {
+ "version": "3.6.2",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
+ "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
"dev": true,
+ "license": "MIT",
+ "peer": true,
"dependencies": {
- "arr-diff": "^4.0.0",
- "array-unique": "^0.3.2",
- "braces": "^2.3.1",
- "define-property": "^2.0.2",
- "extend-shallow": "^3.0.2",
- "extglob": "^2.0.4",
- "fragment-cache": "^0.2.1",
- "kind-of": "^6.0.2",
- "nanomatch": "^1.2.9",
- "object.pick": "^1.3.0",
- "regex-not": "^1.0.0",
- "snapdragon": "^0.8.1",
- "to-regex": "^3.0.2"
+ "inherits": "^2.0.3",
+ "string_decoder": "^1.1.1",
+ "util-deprecate": "^1.0.1"
},
"engines": {
- "node": ">=0.10.0"
+ "node": ">= 6"
}
},
- "node_modules/micromatch/node_modules/braces": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
- "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
+ "node_modules/bluebird": {
+ "version": "3.7.2",
+ "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
+ "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==",
"dev": true,
- "dependencies": {
- "arr-flatten": "^1.1.0",
- "array-unique": "^0.3.2",
- "extend-shallow": "^2.0.1",
- "fill-range": "^4.0.0",
- "isobject": "^3.0.1",
- "repeat-element": "^1.1.2",
- "snapdragon": "^0.8.1",
- "snapdragon-node": "^2.0.1",
- "split-string": "^3.0.2",
- "to-regex": "^3.0.1"
- },
- "engines": {
- "node": ">=0.10.0"
- }
+ "license": "MIT"
},
- "node_modules/micromatch/node_modules/braces/node_modules/extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==",
+ "node_modules/body-parser": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.2.tgz",
+ "integrity": "sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==",
"dev": true,
+ "license": "MIT",
+ "peer": true,
"dependencies": {
- "is-extendable": "^0.1.0"
+ "bytes": "^3.1.2",
+ "content-type": "^1.0.5",
+ "debug": "^4.4.3",
+ "http-errors": "^2.0.0",
+ "iconv-lite": "^0.7.0",
+ "on-finished": "^2.4.1",
+ "qs": "^6.14.1",
+ "raw-body": "^3.0.1",
+ "type-is": "^2.0.1"
},
"engines": {
- "node": ">=0.10.0"
+ "node": ">=18"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
}
},
- "node_modules/micromatch/node_modules/fill-range": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
- "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==",
+ "node_modules/boolbase": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
+ "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==",
+ "license": "ISC"
+ },
+ "node_modules/boolean": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz",
+ "integrity": "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==",
+ "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.",
+ "dev": true,
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/bplist-creator": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/bplist-creator/-/bplist-creator-0.1.1.tgz",
+ "integrity": "sha512-Ese7052fdWrxp/vqSJkydgx/1MdBnNOCV2XVfbmdGWD2H6EYza+Q4pyYSuVSnCUD22hfI/BFI4jHaC3NLXLlJQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "extend-shallow": "^2.0.1",
- "is-number": "^3.0.0",
- "repeat-string": "^1.6.1",
- "to-regex-range": "^2.1.0"
- },
- "engines": {
- "node": ">=0.10.0"
+ "stream-buffers": "2.2.x"
}
},
- "node_modules/micromatch/node_modules/fill-range/node_modules/extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==",
+ "node_modules/bplist-parser": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.3.2.tgz",
+ "integrity": "sha512-apC2+fspHGI3mMKj+dGevkGo/tCqVB8jMb6i+OX+E29p0Iposz07fABkRIfVUPNd5A5VbuOz1bZbnmkKLYF+wQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "is-extendable": "^0.1.0"
+ "big-integer": "1.6.x"
},
"engines": {
- "node": ">=0.10.0"
+ "node": ">= 5.10.0"
}
},
- "node_modules/micromatch/node_modules/is-extendable": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
- "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==",
+ "node_modules/brace-expansion": {
+ "version": "5.0.6",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz",
+ "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==",
"dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^4.0.2"
+ },
"engines": {
- "node": ">=0.10.0"
+ "node": "18 || 20 || >=22"
}
},
- "node_modules/micromatch/node_modules/to-regex-range": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
- "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==",
+ "node_modules/browserslist": {
+ "version": "4.28.1",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz",
+ "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==",
"dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
"dependencies": {
- "is-number": "^3.0.0",
- "repeat-string": "^1.6.1"
+ "baseline-browser-mapping": "^2.9.0",
+ "caniuse-lite": "^1.0.30001759",
+ "electron-to-chromium": "^1.5.263",
+ "node-releases": "^2.0.27",
+ "update-browserslist-db": "^1.2.0"
+ },
+ "bin": {
+ "browserslist": "cli.js"
},
"engines": {
- "node": ">=0.10.0"
+ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
}
},
- "node_modules/miller-rabin": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz",
- "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==",
+ "node_modules/buffer": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
+ "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
"dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT",
+ "peer": true,
"dependencies": {
- "bn.js": "^4.0.0",
- "brorand": "^1.0.1"
- },
- "bin": {
- "miller-rabin": "bin/miller-rabin"
+ "base64-js": "^1.3.1",
+ "ieee754": "^1.1.13"
}
},
- "node_modules/miller-rabin/node_modules/bn.js": {
- "version": "4.12.0",
- "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
- "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==",
- "dev": true
- },
- "node_modules/mime": {
- "version": "2.6.0",
- "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz",
- "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==",
+ "node_modules/buffer-crc32": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-1.0.0.tgz",
+ "integrity": "sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==",
"dev": true,
- "bin": {
- "mime": "cli.js"
- },
+ "license": "MIT",
"engines": {
- "node": ">=4.0.0"
+ "node": ">=8.0.0"
}
},
- "node_modules/mime-db": {
- "version": "1.52.0",
- "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
- "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
+ "node_modules/buffer-from": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
+ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/builder-util": {
+ "version": "26.15.3",
+ "resolved": "https://registry.npmjs.org/builder-util/-/builder-util-26.15.3.tgz",
+ "integrity": "sha512-q2hn7Mbo2nFNkVekPiHFx6Nfo3hURmES3tfBn+k5Pqxl2RkmP3QGqZUhH/q9Pch/4G05NRhPjDlVj1O8q4Txvw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/debug": "^4.1.6",
+ "builder-util-runtime": "9.7.0",
+ "chalk": "^4.1.2",
+ "cross-spawn": "^7.0.6",
+ "debug": "^4.3.4",
+ "fs-extra": "^10.1.0",
+ "http-proxy-agent": "^7.0.0",
+ "https-proxy-agent": "^7.0.0",
+ "js-yaml": "^4.1.0",
+ "sanitize-filename": "^1.6.3",
+ "source-map-support": "^0.5.19",
+ "stat-mode": "^1.0.0",
+ "temp-file": "^3.4.0",
+ "tiny-async-pool": "1.3.0"
+ },
"engines": {
- "node": ">= 0.6"
+ "node": ">=14.0.0"
}
},
- "node_modules/mime-types": {
- "version": "2.1.35",
- "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
- "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+ "node_modules/builder-util-runtime": {
+ "version": "9.7.0",
+ "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.7.0.tgz",
+ "integrity": "sha512-g/kR520giAFYkSXTzcmF3kqQq7wi8F6N6SzeDgZrqTBN+VHdmgWOyTdD1yD7AATDId/yXLvuP34CxW46/BwCdw==",
+ "license": "MIT",
"dependencies": {
- "mime-db": "1.52.0"
+ "debug": "^4.3.4",
+ "sax": "^1.2.4"
},
"engines": {
- "node": ">= 0.6"
+ "node": ">=12.0.0"
}
},
- "node_modules/mimic-fn": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
- "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
+ "node_modules/builtin-modules": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-5.0.0.tgz",
+ "integrity": "sha512-bkXY9WsVpY7CvMhKSR6pZilZu9Ln5WDrKVBUXf2S443etkmEO4V58heTecXcUIsNsi4Rx8JUO4NfX1IcQl4deg==",
"dev": true,
- "peer": true,
+ "license": "MIT",
"engines": {
- "node": ">=6"
+ "node": ">=18.20"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/mimic-response": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz",
- "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==",
+ "node_modules/bytes": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
+ "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
"engines": {
- "node": ">=4"
+ "node": ">= 0.8"
}
},
- "node_modules/minimalistic-assert": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
- "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==",
- "dev": true
- },
- "node_modules/minimalistic-crypto-utils": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz",
- "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==",
- "dev": true
- },
- "node_modules/minimatch": {
- "version": "5.1.6",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz",
- "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
- "dependencies": {
- "brace-expansion": "^2.0.1"
- },
+ "node_modules/bytestreamjs": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/bytestreamjs/-/bytestreamjs-2.0.1.tgz",
+ "integrity": "sha512-U1Z/ob71V/bXfVABvNr/Kumf5VyeQRBEm6Txb0PQ6S7V5GpBM3w4Cbqz/xPDicR5tN0uvDifng8C+5qECeGwyQ==",
+ "dev": true,
+ "license": "BSD-3-Clause",
"engines": {
- "node": ">=10"
- }
- },
- "node_modules/minimist": {
- "version": "1.2.8",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
- "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "node": ">=6.0.0"
}
},
- "node_modules/minipass": {
- "version": "7.0.4",
- "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz",
- "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==",
+ "node_modules/cac": {
+ "version": "6.7.14",
+ "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz",
+ "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==",
"dev": true,
+ "license": "MIT",
"engines": {
- "node": ">=16 || 14 >=14.17"
+ "node": ">=8"
}
},
- "node_modules/minizlib": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz",
- "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==",
+ "node_modules/cacheable-lookup": {
+ "version": "5.0.4",
+ "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz",
+ "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==",
"dev": true,
- "dependencies": {
- "minipass": "^3.0.0",
- "yallist": "^4.0.0"
- },
+ "license": "MIT",
"engines": {
- "node": ">= 8"
+ "node": ">=10.6.0"
}
},
- "node_modules/minizlib/node_modules/minipass": {
- "version": "3.3.6",
- "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
- "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
+ "node_modules/cacheable-request": {
+ "version": "7.0.4",
+ "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz",
+ "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "yallist": "^4.0.0"
+ "clone-response": "^1.0.2",
+ "get-stream": "^5.1.0",
+ "http-cache-semantics": "^4.0.0",
+ "keyv": "^4.0.0",
+ "lowercase-keys": "^2.0.0",
+ "normalize-url": "^6.0.1",
+ "responselike": "^2.0.0"
},
"engines": {
"node": ">=8"
}
},
- "node_modules/minizlib/node_modules/yallist": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
- "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
- "dev": true
- },
- "node_modules/mitt": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz",
- "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==",
- "dev": true
- },
- "node_modules/mixin-deep": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz",
- "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==",
+ "node_modules/cacheable-request/node_modules/get-stream": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
+ "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "for-in": "^1.0.2",
- "is-extendable": "^1.0.1"
+ "pump": "^3.0.0"
},
"engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/mkdirp": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
- "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
- "bin": {
- "mkdirp": "bin/cmd.js"
+ "node": ">=8"
},
- "engines": {
- "node": ">=10"
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/mkdirp-classic": {
- "version": "0.5.3",
- "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz",
- "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==",
- "dev": true
- },
- "node_modules/mocha": {
- "version": "10.3.0",
- "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.3.0.tgz",
- "integrity": "sha512-uF2XJs+7xSLsrmIvn37i/wnc91nw7XjOQB8ccyx5aEgdnohr7n+rEiZP23WkCYHjilR6+EboEnbq/ZQDz4LSbg==",
- "dev": true,
- "dependencies": {
- "ansi-colors": "4.1.1",
- "browser-stdout": "1.3.1",
- "chokidar": "3.5.3",
- "debug": "4.3.4",
- "diff": "5.0.0",
- "escape-string-regexp": "4.0.0",
- "find-up": "5.0.0",
- "glob": "8.1.0",
- "he": "1.2.0",
- "js-yaml": "4.1.0",
- "log-symbols": "4.1.0",
- "minimatch": "5.0.1",
- "ms": "2.1.3",
- "serialize-javascript": "6.0.0",
- "strip-json-comments": "3.1.1",
- "supports-color": "8.1.1",
- "workerpool": "6.2.1",
- "yargs": "16.2.0",
- "yargs-parser": "20.2.4",
- "yargs-unparser": "2.0.0"
- },
- "bin": {
- "_mocha": "bin/_mocha",
- "mocha": "bin/mocha.js"
+ "node_modules/call-bind-apply-helpers": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
+ "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2"
},
"engines": {
- "node": ">= 14.0.0"
+ "node": ">= 0.4"
}
},
- "node_modules/mocha-junit-reporter": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/mocha-junit-reporter/-/mocha-junit-reporter-2.2.1.tgz",
- "integrity": "sha512-iDn2tlKHn8Vh8o4nCzcUVW4q7iXp7cC4EB78N0cDHIobLymyHNwe0XG8HEHHjc3hJlXm0Vy6zcrxaIhnI2fWmw==",
+ "node_modules/call-bound": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz",
+ "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==",
"dev": true,
+ "license": "MIT",
+ "peer": true,
"dependencies": {
- "debug": "^4.3.4",
- "md5": "^2.3.0",
- "mkdirp": "^3.0.0",
- "strip-ansi": "^6.0.1",
- "xml": "^1.0.1"
+ "call-bind-apply-helpers": "^1.0.2",
+ "get-intrinsic": "^1.3.0"
},
- "peerDependencies": {
- "mocha": ">=2.2.5"
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/mocha-junit-reporter/node_modules/mkdirp": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz",
- "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==",
+ "node_modules/caniuse-lite": {
+ "version": "1.0.30001772",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001772.tgz",
+ "integrity": "sha512-mIwLZICj+ntVTw4BT2zfp+yu/AqV6GMKfJVJMx3MwPxs+uk/uj2GLl2dH8LQbjiLDX66amCga5nKFyDgRR43kg==",
"dev": true,
- "bin": {
- "mkdirp": "dist/cjs/src/bin.js"
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "CC-BY-4.0"
+ },
+ "node_modules/chai": {
+ "version": "6.2.2",
+ "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz",
+ "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
},
"engines": {
"node": ">=10"
},
"funding": {
- "url": "https://github.com/sponsors/isaacs"
+ "url": "https://github.com/chalk/chalk?sponsor=1"
}
},
- "node_modules/mocha-multi-reporters": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/mocha-multi-reporters/-/mocha-multi-reporters-1.5.1.tgz",
- "integrity": "sha512-Yb4QJOaGLIcmB0VY7Wif5AjvLMUFAdV57D2TWEva1Y0kU/3LjKpeRVmlMIfuO1SVbauve459kgtIizADqxMWPg==",
- "dev": true,
+ "node_modules/chalk/node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "license": "MIT",
"dependencies": {
- "debug": "^4.1.1",
- "lodash": "^4.17.15"
+ "has-flag": "^4.0.0"
},
"engines": {
- "node": ">=6.0.0"
- },
- "peerDependencies": {
- "mocha": ">=3.1.2"
+ "node": ">=8"
}
},
- "node_modules/mocha/node_modules/cliui": {
- "version": "7.0.4",
- "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
- "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
+ "node_modules/change-case": {
+ "version": "5.4.4",
+ "resolved": "https://registry.npmjs.org/change-case/-/change-case-5.4.4.tgz",
+ "integrity": "sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w==",
"dev": true,
- "dependencies": {
- "string-width": "^4.2.0",
- "strip-ansi": "^6.0.0",
- "wrap-ansi": "^7.0.0"
+ "license": "MIT"
+ },
+ "node_modules/character-entities": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz",
+ "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
}
},
- "node_modules/mocha/node_modules/diff": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz",
- "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==",
- "dev": true,
- "engines": {
- "node": ">=0.3.1"
+ "node_modules/character-entities-legacy": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz",
+ "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
}
},
- "node_modules/mocha/node_modules/escape-string-regexp": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
- "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
- "dev": true,
- "engines": {
- "node": ">=10"
- },
+ "node_modules/character-reference-invalid": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz",
+ "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==",
+ "license": "MIT",
"funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
}
},
- "node_modules/mocha/node_modules/glob": {
- "version": "8.1.0",
- "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz",
- "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==",
- "dev": true,
+ "node_modules/cheerio": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.2.0.tgz",
+ "integrity": "sha512-WDrybc/gKFpTYQutKIK6UvfcuxijIZfMfXaYm8NMsPQxSYvf+13fXUJ4rztGGbJcBQ/GF55gvrZ0Bc0bj/mqvg==",
+ "license": "MIT",
"dependencies": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^5.0.1",
- "once": "^1.3.0"
+ "cheerio-select": "^2.1.0",
+ "dom-serializer": "^2.0.0",
+ "domhandler": "^5.0.3",
+ "domutils": "^3.2.2",
+ "encoding-sniffer": "^0.2.1",
+ "htmlparser2": "^10.1.0",
+ "parse5": "^7.3.0",
+ "parse5-htmlparser2-tree-adapter": "^7.1.0",
+ "parse5-parser-stream": "^7.1.2",
+ "undici": "^7.19.0",
+ "whatwg-mimetype": "^4.0.0"
},
"engines": {
- "node": ">=12"
+ "node": ">=20.18.1"
},
"funding": {
- "url": "https://github.com/sponsors/isaacs"
+ "url": "https://github.com/cheeriojs/cheerio?sponsor=1"
}
},
- "node_modules/mocha/node_modules/minimatch": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz",
- "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==",
- "dev": true,
+ "node_modules/cheerio-select": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz",
+ "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==",
+ "license": "BSD-2-Clause",
"dependencies": {
- "brace-expansion": "^2.0.1"
+ "boolbase": "^1.0.0",
+ "css-select": "^5.1.0",
+ "css-what": "^6.1.0",
+ "domelementtype": "^2.3.0",
+ "domhandler": "^5.0.3",
+ "domutils": "^3.0.1"
},
+ "funding": {
+ "url": "https://github.com/sponsors/fb55"
+ }
+ },
+ "node_modules/chownr": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz",
+ "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==",
+ "dev": true,
+ "license": "BlueOak-1.0.0",
"engines": {
- "node": ">=10"
+ "node": ">=18"
}
},
- "node_modules/mocha/node_modules/ms": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
- "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
- "dev": true
+ "node_modules/chromium-pickle-js": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz",
+ "integrity": "sha512-1R5Fho+jBq0DDydt+/vHWj5KJNJCKdARKOCwZUen84I5BreWoLqRLANH1U87eJy1tiASPtMnGqJJq0ZsLoRPOw==",
+ "dev": true,
+ "license": "MIT"
},
- "node_modules/mocha/node_modules/yargs": {
- "version": "16.2.0",
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
- "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
+ "node_modules/ci-info": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.4.0.tgz",
+ "integrity": "sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==",
"dev": true,
- "dependencies": {
- "cliui": "^7.0.2",
- "escalade": "^3.1.1",
- "get-caller-file": "^2.0.5",
- "require-directory": "^2.1.1",
- "string-width": "^4.2.0",
- "y18n": "^5.0.5",
- "yargs-parser": "^20.2.2"
- },
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/sibiraj-s"
+ }
+ ],
+ "license": "MIT",
"engines": {
- "node": ">=10"
+ "node": ">=8"
}
},
- "node_modules/mocha/node_modules/yargs-parser": {
- "version": "20.2.4",
- "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz",
- "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==",
+ "node_modules/cli-cursor": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz",
+ "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==",
"dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "restore-cursor": "^3.1.0"
+ },
"engines": {
- "node": ">=10"
+ "node": ">=8"
}
},
- "node_modules/moment": {
- "version": "2.30.1",
- "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz",
- "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==",
+ "node_modules/cli-spinners": {
+ "version": "2.9.2",
+ "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz",
+ "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
"engines": {
- "node": "*"
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/morgan": {
- "version": "1.10.0",
- "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.0.tgz",
- "integrity": "sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==",
+ "node_modules/cliui": {
+ "version": "9.0.1",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-9.0.1.tgz",
+ "integrity": "sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==",
"dev": true,
- "peer": true,
+ "license": "ISC",
"dependencies": {
- "basic-auth": "~2.0.1",
- "debug": "2.6.9",
- "depd": "~2.0.0",
- "on-finished": "~2.3.0",
- "on-headers": "~1.0.2"
+ "string-width": "^7.2.0",
+ "strip-ansi": "^7.1.0",
+ "wrap-ansi": "^9.0.0"
},
"engines": {
- "node": ">= 0.8.0"
+ "node": ">=20"
}
},
- "node_modules/morgan/node_modules/debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "node_modules/cliui/node_modules/ansi-regex": {
+ "version": "6.2.2",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz",
+ "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==",
"dev": true,
- "peer": true,
- "dependencies": {
- "ms": "2.0.0"
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
}
},
- "node_modules/morgan/node_modules/ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "node_modules/cliui/node_modules/emoji-regex": {
+ "version": "10.6.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz",
+ "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==",
"dev": true,
- "peer": true
+ "license": "MIT"
},
- "node_modules/morgan/node_modules/on-finished": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
- "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==",
+ "node_modules/cliui/node_modules/string-width": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz",
+ "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==",
"dev": true,
- "peer": true,
+ "license": "MIT",
"dependencies": {
- "ee-first": "1.1.1"
+ "emoji-regex": "^10.3.0",
+ "get-east-asian-width": "^1.0.0",
+ "strip-ansi": "^7.1.0"
},
"engines": {
- "node": ">= 0.8"
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
- },
- "node_modules/mv": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/mv/-/mv-2.1.1.tgz",
- "integrity": "sha512-at/ZndSy3xEGJ8i0ygALh8ru9qy7gWW1cmkaqBN29JmMlIvM//MEO9y1sk/avxuwnPcfhkejkLsuPxH81BrkSg==",
+ "node_modules/cliui/node_modules/strip-ansi": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz",
+ "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "mkdirp": "~0.5.1",
- "ncp": "~2.0.0",
- "rimraf": "~2.4.0"
+ "ansi-regex": "^6.0.1"
},
"engines": {
- "node": ">=0.8.0"
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/strip-ansi?sponsor=1"
}
},
- "node_modules/mv/node_modules/brace-expansion": {
- "version": "1.1.11",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "node_modules/clone": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
+ "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==",
"dev": true,
- "dependencies": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=0.8"
}
},
- "node_modules/mv/node_modules/glob": {
- "version": "6.0.4",
- "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz",
- "integrity": "sha512-MKZeRNyYZAVVVG1oZeLaWie1uweH40m9AZwIwxyPbTSX4hHrVYSzLg0Ro5Z5R7XKkIX+Cc6oD1rqeDJnwsB8/A==",
+ "node_modules/clone-response": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz",
+ "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "2 || 3",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
+ "mimic-response": "^1.0.0"
},
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/clsx": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz",
+ "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==",
+ "license": "MIT",
"engines": {
- "node": "*"
+ "node": ">=6"
}
},
- "node_modules/mv/node_modules/minimatch": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
- "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "node_modules/color": {
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/color/-/color-5.0.3.tgz",
+ "integrity": "sha512-ezmVcLR3xAVp8kYOm4GS45ZLLgIE6SPAFoduLr6hTDajwb3KZ2F46gulK3XpcwRFb5KKGCSezCBAY4Dw4HsyXA==",
"dev": true,
+ "license": "MIT",
+ "peer": true,
"dependencies": {
- "brace-expansion": "^1.1.7"
+ "color-convert": "^3.1.3",
+ "color-string": "^2.1.3"
},
"engines": {
- "node": "*"
+ "node": ">=18"
}
},
- "node_modules/mv/node_modules/mkdirp": {
- "version": "0.5.6",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz",
- "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
- "dev": true,
+ "node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "license": "MIT",
"dependencies": {
- "minimist": "^1.2.6"
+ "color-name": "~1.1.4"
},
- "bin": {
- "mkdirp": "bin/cmd.js"
+ "engines": {
+ "node": ">=7.0.0"
}
},
- "node_modules/mv/node_modules/rimraf": {
- "version": "2.4.5",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.4.5.tgz",
- "integrity": "sha512-J5xnxTyqaiw06JjMftq7L9ouA448dw/E7dKghkP9WpKNuwmARNNg+Gk8/u5ryb9N/Yo2+z3MCwuqFK/+qPOPfQ==",
+ "node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "license": "MIT"
+ },
+ "node_modules/color-string": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/color-string/-/color-string-2.1.4.tgz",
+ "integrity": "sha512-Bb6Cq8oq0IjDOe8wJmi4JeNn763Xs9cfrBcaylK1tPypWzyoy2G3l90v9k64kjphl/ZJjPIShFztenRomi8WTg==",
"dev": true,
+ "license": "MIT",
+ "peer": true,
"dependencies": {
- "glob": "^6.0.1"
+ "color-name": "^2.0.0"
},
- "bin": {
- "rimraf": "bin.js"
+ "engines": {
+ "node": ">=18"
}
},
- "node_modules/nan": {
- "version": "2.18.0",
- "resolved": "https://registry.npmjs.org/nan/-/nan-2.18.0.tgz",
- "integrity": "sha512-W7tfG7vMOGtD30sHoZSSc/JVYiyDPEyQVso/Zz+/uQd0B0L46gtC+pHha5FFMRpil6fm/AoEcRWyOVi4+E/f8w==",
+ "node_modules/color-string/node_modules/color-name": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-2.1.0.tgz",
+ "integrity": "sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg==",
"dev": true,
- "optional": true
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=12.20"
+ }
},
- "node_modules/nanomatch": {
- "version": "1.2.13",
- "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz",
- "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==",
+ "node_modules/color/node_modules/color-convert": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-3.1.3.tgz",
+ "integrity": "sha512-fasDH2ont2GqF5HpyO4w0+BcewlhHEZOFn9c1ckZdHpJ56Qb7MHhH/IcJZbBGgvdtwdwNbLvxiBEdg336iA9Sg==",
"dev": true,
+ "license": "MIT",
+ "peer": true,
"dependencies": {
- "arr-diff": "^4.0.0",
- "array-unique": "^0.3.2",
- "define-property": "^2.0.2",
- "extend-shallow": "^3.0.2",
- "fragment-cache": "^0.2.1",
- "is-windows": "^1.0.2",
- "kind-of": "^6.0.2",
- "object.pick": "^1.3.0",
- "regex-not": "^1.0.0",
- "snapdragon": "^0.8.1",
- "to-regex": "^3.0.1"
+ "color-name": "^2.0.0"
},
"engines": {
- "node": ">=0.10.0"
+ "node": ">=14.6"
}
},
- "node_modules/natural-compare": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
- "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
- "dev": true
- },
- "node_modules/ncp": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz",
- "integrity": "sha512-zIdGUrPRFTUELUvr3Gmc7KZ2Sw/h1PiVM0Af/oHB6zgnV1ikqSfRk+TOufi79aHYCW3NiOXmr1BP5nWbzojLaA==",
+ "node_modules/color/node_modules/color-name": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-2.1.0.tgz",
+ "integrity": "sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg==",
"dev": true,
- "bin": {
- "ncp": "bin/ncp"
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=12.20"
}
},
- "node_modules/needle": {
- "version": "3.3.1",
- "resolved": "https://registry.npmjs.org/needle/-/needle-3.3.1.tgz",
- "integrity": "sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q==",
+ "node_modules/combined-stream": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
"dev": true,
- "optional": true,
+ "license": "MIT",
"dependencies": {
- "iconv-lite": "^0.6.3",
- "sax": "^1.2.4"
- },
- "bin": {
- "needle": "bin/needle"
+ "delayed-stream": "~1.0.0"
},
"engines": {
- "node": ">= 4.4.x"
+ "node": ">= 0.8"
}
},
- "node_modules/needle/node_modules/iconv-lite": {
- "version": "0.6.3",
- "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
- "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
- "dev": true,
- "optional": true,
- "dependencies": {
- "safer-buffer": ">= 2.1.2 < 3.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
+ "node_modules/comma-separated-tokens": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz",
+ "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
}
},
- "node_modules/negotiator": {
- "version": "0.6.3",
- "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
- "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
+ "node_modules/commander": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz",
+ "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==",
"dev": true,
- "peer": true,
+ "license": "MIT",
"engines": {
- "node": ">= 0.6"
+ "node": ">= 6"
}
},
- "node_modules/netmask": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz",
- "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==",
+ "node_modules/comment-parser": {
+ "version": "1.4.7",
+ "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.7.tgz",
+ "integrity": "sha512-0h+uSNtQGW3D98eQt3jJ8L06Fves8hncB4V/PKdw/Qb8Hnk19VaKuTr55UNRYiSoVa7WwrFls+rh3ux9agmkeQ==",
"dev": true,
+ "license": "MIT",
"engines": {
- "node": ">= 0.4.0"
+ "node": ">= 12.0.0"
}
},
- "node_modules/nice-try": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz",
- "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==",
- "dev": true
- },
- "node_modules/nise": {
- "version": "5.1.5",
- "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.5.tgz",
- "integrity": "sha512-VJuPIfUFaXNRzETTQEEItTOP8Y171ijr+JLq42wHes3DiryR8vT+1TXQW/Rx8JNUhyYYWyIvjXTU6dOhJcs9Nw==",
+ "node_modules/compare-version": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/compare-version/-/compare-version-0.1.2.tgz",
+ "integrity": "sha512-pJDh5/4wrEnXX/VWRZvruAGHkzKdr46z11OlTPN+VrATlWWhSKewNCJ1futCO5C7eJB3nPMFZA1LeYtcFboZ2A==",
"dev": true,
- "dependencies": {
- "@sinonjs/commons": "^2.0.0",
- "@sinonjs/fake-timers": "^10.0.2",
- "@sinonjs/text-encoding": "^0.7.1",
- "just-extend": "^4.0.2",
- "path-to-regexp": "^1.7.0"
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "node_modules/nise/node_modules/@sinonjs/commons": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz",
- "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==",
+ "node_modules/compare-versions": {
+ "version": "6.1.1",
+ "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-6.1.1.tgz",
+ "integrity": "sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==",
"dev": true,
- "dependencies": {
- "type-detect": "4.0.8"
- }
+ "license": "MIT"
},
- "node_modules/nise/node_modules/@sinonjs/fake-timers": {
- "version": "10.3.0",
- "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz",
- "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==",
+ "node_modules/compress-commons": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-7.0.1.tgz",
+ "integrity": "sha512-g0S8KAD8qf4+V//pr3BfB1aBnARLXNz2Gx+jmHU0LEriUuoQUOPOulVquHKTJ8+EAIIO7fhseNDr9wK5Q9FKBQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@sinonjs/commons": "^3.0.0"
+ "crc-32": "^1.2.0",
+ "crc32-stream": "^7.0.1",
+ "is-stream": "^4.0.0",
+ "normalize-path": "^3.0.0",
+ "readable-stream": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=18"
}
},
- "node_modules/nise/node_modules/@sinonjs/fake-timers/node_modules/@sinonjs/commons": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz",
- "integrity": "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==",
+ "node_modules/compress-commons/node_modules/is-stream": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-4.0.1.tgz",
+ "integrity": "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==",
"dev": true,
- "dependencies": {
- "type-detect": "4.0.8"
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/nise/node_modules/isarray": {
+ "node_modules/compute-scroll-into-view": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-3.1.1.tgz",
+ "integrity": "sha512-VRhuHOLoKYOy4UbilLbUzbYg93XLjv2PncJC50EuTWPA3gaja1UjBsUP/D/9/juV3vQFr6XBEzn9KCAHdUvOHw==",
+ "license": "MIT"
+ },
+ "node_modules/concat-map": {
"version": "0.0.1",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
- "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==",
- "dev": true
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
+ "dev": true,
+ "license": "MIT"
},
- "node_modules/nise/node_modules/path-to-regexp": {
- "version": "1.8.0",
- "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz",
- "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==",
+ "node_modules/consola": {
+ "version": "3.4.2",
+ "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz",
+ "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==",
"dev": true,
- "dependencies": {
- "isarray": "0.0.1"
+ "license": "MIT",
+ "engines": {
+ "node": "^14.18.0 || >=16.10.0"
}
},
- "node_modules/node-addon-api": {
- "version": "1.7.2",
- "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-1.7.2.tgz",
- "integrity": "sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg==",
- "dev": true
+ "node_modules/console-control-strings": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
+ "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==",
+ "dev": true,
+ "license": "ISC",
+ "peer": true
},
- "node_modules/node-fetch": {
- "version": "2.7.0",
- "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz",
- "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==",
- "dependencies": {
- "whatwg-url": "^5.0.0"
- },
+ "node_modules/content-disposition": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.1.0.tgz",
+ "integrity": "sha512-5jRCH9Z/+DRP7rkvY83B+yGIGX96OYdJmzngqnw2SBSxqCFPd0w2km3s5iawpGX8krnwSGmF0FW5Nhr0Hfai3g==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
"engines": {
- "node": "4.x || >=6.0.0"
- },
- "peerDependencies": {
- "encoding": "^0.1.0"
+ "node": ">=18"
},
- "peerDependenciesMeta": {
- "encoding": {
- "optional": true
- }
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
}
},
- "node_modules/node-forge": {
- "version": "0.10.0",
- "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz",
- "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==",
+ "node_modules/content-type": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
+ "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
"dev": true,
+ "license": "MIT",
+ "peer": true,
"engines": {
- "node": ">= 6.0.0"
- }
- },
- "node_modules/node-libs-browser": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz",
- "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==",
- "dev": true,
- "dependencies": {
- "assert": "^1.1.1",
- "browserify-zlib": "^0.2.0",
- "buffer": "^4.3.0",
- "console-browserify": "^1.1.0",
- "constants-browserify": "^1.0.0",
- "crypto-browserify": "^3.11.0",
- "domain-browser": "^1.1.1",
- "events": "^3.0.0",
- "https-browserify": "^1.0.0",
- "os-browserify": "^0.3.0",
- "path-browserify": "0.0.1",
- "process": "^0.11.10",
- "punycode": "^1.2.4",
- "querystring-es3": "^0.2.0",
- "readable-stream": "^2.3.3",
- "stream-browserify": "^2.0.1",
- "stream-http": "^2.7.2",
- "string_decoder": "^1.0.0",
- "timers-browserify": "^2.0.4",
- "tty-browserify": "0.0.0",
- "url": "^0.11.0",
- "util": "^0.11.0",
- "vm-browserify": "^1.0.1"
+ "node": ">= 0.6"
}
},
- "node_modules/node-libs-browser/node_modules/buffer": {
- "version": "4.9.2",
- "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz",
- "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==",
+ "node_modules/convert-source-map": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
+ "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
"dev": true,
- "dependencies": {
- "base64-js": "^1.0.2",
- "ieee754": "^1.1.4",
- "isarray": "^1.0.0"
- }
- },
- "node_modules/node-libs-browser/node_modules/isarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
- "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
- "dev": true
+ "license": "MIT"
},
- "node_modules/node-libs-browser/node_modules/readable-stream": {
- "version": "2.3.8",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
- "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
+ "node_modules/cookie": {
+ "version": "0.7.2",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz",
+ "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==",
"dev": true,
- "dependencies": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.3",
- "isarray": "~1.0.0",
- "process-nextick-args": "~2.0.0",
- "safe-buffer": "~5.1.1",
- "string_decoder": "~1.1.1",
- "util-deprecate": "~1.0.1"
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">= 0.6"
}
},
- "node_modules/node-libs-browser/node_modules/safe-buffer": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
- "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
- "dev": true
- },
- "node_modules/node-libs-browser/node_modules/string_decoder": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
- "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "node_modules/cookie-signature": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz",
+ "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==",
"dev": true,
- "dependencies": {
- "safe-buffer": "~5.1.0"
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=6.6.0"
}
},
- "node_modules/node-releases": {
- "version": "2.0.14",
- "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz",
- "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==",
- "dev": true
- },
- "node_modules/normalize-package-data": {
- "version": "2.5.0",
- "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
- "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
+ "node_modules/core-js-compat": {
+ "version": "3.49.0",
+ "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.49.0.tgz",
+ "integrity": "sha512-VQXt1jr9cBz03b331DFDCCP90b3fanciLkgiOoy8SBHy06gNf+vQ1A3WFLqG7I8TipYIKeYK9wxd0tUrvHcOZA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "hosted-git-info": "^2.1.4",
- "resolve": "^1.10.0",
- "semver": "2 || 3 || 4 || 5",
- "validate-npm-package-license": "^3.0.1"
+ "browserslist": "^4.28.1"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/core-js"
}
},
- "node_modules/normalize-package-data/node_modules/hosted-git-info": {
- "version": "2.8.9",
- "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz",
- "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==",
- "dev": true
- },
- "node_modules/normalize-package-data/node_modules/semver": {
- "version": "5.7.2",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
- "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
+ "node_modules/core-util-is": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
+ "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==",
"dev": true,
- "bin": {
- "semver": "bin/semver"
- }
+ "license": "MIT"
},
- "node_modules/normalize-path": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
- "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+ "node_modules/crc-32": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz",
+ "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==",
"dev": true,
+ "license": "Apache-2.0",
+ "bin": {
+ "crc32": "bin/crc32.njs"
+ },
"engines": {
- "node": ">=0.10.0"
+ "node": ">=0.8"
}
},
- "node_modules/normalize-url": {
- "version": "4.5.1",
- "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz",
- "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==",
+ "node_modules/crc32-stream": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-7.0.1.tgz",
+ "integrity": "sha512-IBWsY8xznyQrcHn8h4bC8/4ErNke5elzgG8GcqF4RFPw6aHkWWRc7Tgw6upjaTX/CT/yQgqYENkxYsTYN+hW2g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "crc-32": "^1.2.0",
+ "readable-stream": "^4.0.0"
+ },
"engines": {
- "node": ">=8"
+ "node": ">=18"
}
},
- "node_modules/npm-conf": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/npm-conf/-/npm-conf-1.1.3.tgz",
- "integrity": "sha512-Yic4bZHJOt9RCFbRP3GgpqhScOY4HH3V2P8yBj6CeYq118Qr+BLXqT2JvpJ00mryLESpgOxf5XlFv4ZjXxLScw==",
+ "node_modules/cross-dirname": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/cross-dirname/-/cross-dirname-0.1.0.tgz",
+ "integrity": "sha512-+R08/oI0nl3vfPcqftZRpytksBXDzOUveBq/NBVx0sUp1axwzPQrKinNx5yd5sxPu8j1wIy8AfnVQ+5eFdha6Q==",
+ "dev": true,
+ "license": "MIT",
"optional": true,
+ "peer": true
+ },
+ "node_modules/cross-spawn": {
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
+ "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
+ "license": "MIT",
"dependencies": {
- "config-chain": "^1.1.11",
- "pify": "^3.0.0"
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
},
"engines": {
- "node": ">=4"
+ "node": ">= 8"
}
},
- "node_modules/npm-conf/node_modules/pify": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
- "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==",
- "optional": true,
- "engines": {
- "node": ">=4"
- }
+ "node_modules/cross-spawn/node_modules/isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+ "license": "ISC"
},
- "node_modules/npmlog": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-7.0.1.tgz",
- "integrity": "sha512-uJ0YFk/mCQpLBt+bxN88AKd+gyqZvZDbtiNxk6Waqcj2aPRyfVx8ITawkyQynxUagInjdYT1+qj4NfA5KJJUxg==",
- "dev": true,
+ "node_modules/cross-spawn/node_modules/which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "license": "ISC",
"dependencies": {
- "are-we-there-yet": "^4.0.0",
- "console-control-strings": "^1.1.0",
- "gauge": "^5.0.0",
- "set-blocking": "^2.0.0"
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
},
"engines": {
- "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ "node": ">= 8"
}
},
- "node_modules/nth-check": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz",
- "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==",
+ "node_modules/css-select": {
+ "version": "5.2.2",
+ "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz",
+ "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==",
+ "license": "BSD-2-Clause",
"dependencies": {
- "boolbase": "^1.0.0"
+ "boolbase": "^1.0.0",
+ "css-what": "^6.1.0",
+ "domhandler": "^5.0.2",
+ "domutils": "^3.0.1",
+ "nth-check": "^2.0.1"
},
"funding": {
- "url": "https://github.com/fb55/nth-check?sponsor=1"
+ "url": "https://github.com/sponsors/fb55"
}
},
- "node_modules/nwsapi": {
- "version": "2.2.7",
- "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.7.tgz",
- "integrity": "sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==",
- "dev": true
- },
- "node_modules/oauth-sign": {
- "version": "0.9.0",
- "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
- "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==",
- "dev": true,
+ "node_modules/css-what": {
+ "version": "6.2.2",
+ "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz",
+ "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==",
+ "license": "BSD-2-Clause",
"engines": {
- "node": "*"
+ "node": ">= 6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/fb55"
}
},
- "node_modules/object-assign": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
- "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
- "dev": true,
+ "node_modules/css.escape": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz",
+ "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==",
+ "license": "MIT"
+ },
+ "node_modules/csstype": {
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz",
+ "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==",
+ "license": "MIT"
+ },
+ "node_modules/data-uri-to-buffer": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz",
+ "integrity": "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==",
+ "license": "MIT",
"engines": {
- "node": ">=0.10.0"
+ "node": ">= 14"
}
},
- "node_modules/object-copy": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz",
- "integrity": "sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==",
- "dev": true,
+ "node_modules/dayjs": {
+ "version": "1.11.21",
+ "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.21.tgz",
+ "integrity": "sha512-98IT+HOahAisibz/yjKbzuOBwYcjJ7BCLPzARyHiyEBmRz4fatF+KPJszEHXsGYjUG234aH/cOjW1wwTbKUZlA==",
+ "license": "MIT"
+ },
+ "node_modules/debug": {
+ "version": "4.4.3",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
+ "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
+ "license": "MIT",
"dependencies": {
- "copy-descriptor": "^0.1.0",
- "define-property": "^0.2.5",
- "kind-of": "^3.0.3"
+ "ms": "^2.1.3"
},
"engines": {
- "node": ">=0.10.0"
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
}
},
- "node_modules/object-copy/node_modules/define-property": {
- "version": "0.2.5",
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
- "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==",
- "dev": true,
- "dependencies": {
- "is-descriptor": "^0.1.0"
- },
+ "node_modules/decamelize": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-6.0.1.tgz",
+ "integrity": "sha512-G7Cqgaelq68XHJNGlZ7lrNQyhZGsFqpwtGFexqUv4IQdjKoSYF7ipZ9UuTJZUSQXFj/XaoBLuEVIVqr8EJngEQ==",
+ "license": "MIT",
"engines": {
- "node": ">=0.10.0"
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/object-copy/node_modules/is-descriptor": {
- "version": "0.1.7",
- "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.7.tgz",
- "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==",
- "dev": true,
+ "node_modules/decode-named-character-reference": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.3.0.tgz",
+ "integrity": "sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==",
+ "license": "MIT",
"dependencies": {
- "is-accessor-descriptor": "^1.0.1",
- "is-data-descriptor": "^1.0.1"
+ "character-entities": "^2.0.0"
},
- "engines": {
- "node": ">= 0.4"
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
}
},
- "node_modules/object-copy/node_modules/kind-of": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
- "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==",
+ "node_modules/decompress-response": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz",
+ "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "is-buffer": "^1.1.5"
+ "mimic-response": "^3.1.0"
},
"engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/object-inspect": {
- "version": "1.13.1",
- "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz",
- "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==",
- "dev": true,
+ "node": ">=10"
+ },
"funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/object-keys": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
- "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
- "devOptional": true,
+ "node_modules/decompress-response/node_modules/mimic-response": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz",
+ "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==",
+ "dev": true,
+ "license": "MIT",
"engines": {
- "node": ">= 0.4"
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/object-visit": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz",
- "integrity": "sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==",
+ "node_modules/deep-is": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
+ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
"dev": true,
- "dependencies": {
- "isobject": "^3.0.0"
- },
+ "license": "MIT"
+ },
+ "node_modules/deepmerge-ts": {
+ "version": "7.1.5",
+ "resolved": "https://registry.npmjs.org/deepmerge-ts/-/deepmerge-ts-7.1.5.tgz",
+ "integrity": "sha512-HOJkrhaYsweh+W+e74Yn7YStZOilkoPb6fycpwNLKzSPtruFs48nYis0zy5yJz1+ktUhHxoRDJ27RQAWLIJVJw==",
+ "license": "BSD-3-Clause",
"engines": {
- "node": ">=0.10.0"
+ "node": ">=16.0.0"
}
},
- "node_modules/object.assign": {
- "version": "4.1.5",
- "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz",
- "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==",
+ "node_modules/defaults": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz",
+ "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==",
"dev": true,
+ "license": "MIT",
+ "peer": true,
"dependencies": {
- "call-bind": "^1.0.5",
- "define-properties": "^1.2.1",
- "has-symbols": "^1.0.3",
- "object-keys": "^1.1.1"
- },
- "engines": {
- "node": ">= 0.4"
+ "clone": "^1.0.2"
},
"funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/object.entries": {
- "version": "1.1.7",
- "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.7.tgz",
- "integrity": "sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==",
+ "node_modules/defer-to-connect": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz",
+ "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==",
"dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.2.0",
- "es-abstract": "^1.22.1"
- },
+ "license": "MIT",
"engines": {
- "node": ">= 0.4"
+ "node": ">=10"
}
},
- "node_modules/object.fromentries": {
- "version": "2.0.7",
- "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz",
- "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==",
+ "node_modules/define-data-property": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz",
+ "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==",
"dev": true,
+ "license": "MIT",
+ "optional": true,
"dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.2.0",
- "es-abstract": "^1.22.1"
+ "es-define-property": "^1.0.0",
+ "es-errors": "^1.3.0",
+ "gopd": "^1.0.1"
},
"engines": {
"node": ">= 0.4"
@@ -17017,4238 +9633,4889 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/object.getownpropertydescriptors": {
- "version": "2.1.7",
- "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.7.tgz",
- "integrity": "sha512-PrJz0C2xJ58FNn11XV2lr4Jt5Gzl94qpy9Lu0JlfEj14z88sqbSBJCBEzdlNUCzY2gburhbrwOZ5BHCmuNUy0g==",
+ "node_modules/define-properties": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz",
+ "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==",
"dev": true,
+ "license": "MIT",
+ "optional": true,
"dependencies": {
- "array.prototype.reduce": "^1.0.6",
- "call-bind": "^1.0.2",
- "define-properties": "^1.2.0",
- "es-abstract": "^1.22.1",
- "safe-array-concat": "^1.0.0"
+ "define-data-property": "^1.0.1",
+ "has-property-descriptors": "^1.0.0",
+ "object-keys": "^1.1.1"
},
"engines": {
- "node": ">= 0.8"
+ "node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/object.groupby": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.1.tgz",
- "integrity": "sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==",
- "dev": true,
+ "node_modules/degenerator": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz",
+ "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==",
+ "license": "MIT",
"dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.2.0",
- "es-abstract": "^1.22.1",
- "get-intrinsic": "^1.2.1"
+ "ast-types": "^0.13.4",
+ "escodegen": "^2.1.0",
+ "esprima": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 14"
}
},
- "node_modules/object.hasown": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.3.tgz",
- "integrity": "sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==",
+ "node_modules/delayed-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
"dev": true,
- "dependencies": {
- "define-properties": "^1.2.0",
- "es-abstract": "^1.22.1"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.4.0"
}
},
- "node_modules/object.pick": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
- "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==",
+ "node_modules/depd": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
+ "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
"dev": true,
- "dependencies": {
- "isobject": "^3.0.1"
- },
+ "license": "MIT",
+ "peer": true,
"engines": {
- "node": ">=0.10.0"
+ "node": ">= 0.8"
}
},
- "node_modules/object.values": {
- "version": "1.1.7",
- "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz",
- "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==",
+ "node_modules/detect-indent": {
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-7.0.2.tgz",
+ "integrity": "sha512-y+8xyqdGLL+6sh0tVeHcfP/QDd8gUgbasolJJpY7NgeQGSZ739bDtSiaiDgtoicy+mtYB81dKLxO9xRhCyIB3A==",
"dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.2.0",
- "es-abstract": "^1.22.1"
- },
+ "license": "MIT",
"engines": {
- "node": ">= 0.4"
+ "node": ">=12.20"
},
"funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/obuf": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz",
- "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==",
+ "node_modules/detect-libc": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz",
+ "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==",
"dev": true,
+ "license": "Apache-2.0",
"optional": true,
- "peer": true
+ "engines": {
+ "node": ">=8"
+ }
},
- "node_modules/on-finished": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
- "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
+ "node_modules/detect-node": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz",
+ "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==",
"dev": true,
- "dependencies": {
- "ee-first": "1.1.1"
- },
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/diff": {
+ "version": "9.0.0",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-9.0.0.tgz",
+ "integrity": "sha512-svtcdpS8CgJyqAjEQIXdb3OjhFVVYjzGAPO8WGCmRbrml64SPw/jJD4GoE98aR7r25A0XcgrK3F02yw9R/vhQw==",
+ "dev": true,
+ "license": "BSD-3-Clause",
"engines": {
- "node": ">= 0.8"
+ "node": ">=0.3.1"
}
},
- "node_modules/on-headers": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz",
- "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==",
+ "node_modules/dir-compare": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/dir-compare/-/dir-compare-4.2.0.tgz",
+ "integrity": "sha512-2xMCmOoMrdQIPHdsTawECdNPwlVFB9zGcz3kuhmBO6U3oU+UQjsue0i8ayLKpgBcm+hcXPMVSGUN9d+pvJ6+VQ==",
"dev": true,
- "peer": true,
- "engines": {
- "node": ">= 0.8"
+ "license": "MIT",
+ "dependencies": {
+ "minimatch": "^3.0.5",
+ "p-limit": "^3.1.0 "
}
},
- "node_modules/once": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
- "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+ "node_modules/dir-compare/node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/dir-compare/node_modules/brace-expansion": {
+ "version": "1.1.14",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz",
+ "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "wrappy": "1"
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
}
},
- "node_modules/one-time": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz",
- "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==",
+ "node_modules/dir-compare/node_modules/minimatch": {
+ "version": "3.1.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz",
+ "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==",
"dev": true,
- "peer": true,
+ "license": "ISC",
"dependencies": {
- "fn.name": "1.x.x"
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
}
},
- "node_modules/onetime": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
- "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
+ "node_modules/dir-compare/node_modules/p-limit": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+ "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
"dev": true,
- "peer": true,
+ "license": "MIT",
"dependencies": {
- "mimic-fn": "^2.1.0"
+ "yocto-queue": "^0.1.0"
},
"engines": {
- "node": ">=6"
+ "node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/opencv-bindings": {
- "version": "4.5.5",
- "resolved": "https://registry.npmjs.org/opencv-bindings/-/opencv-bindings-4.5.5.tgz",
- "integrity": "sha512-FdYE9uqnoPKbAkZFEOpIh6RTtJIz1lz+W27xPCo1Ov6+d0OOgg+Hm9OT2MIGIG8V1Dp3fWlLvi7SIjDOpqO2XA==",
- "dev": true
+ "node_modules/dir-compare/node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
+ "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
},
- "node_modules/opn": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz",
- "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==",
+ "node_modules/dmg-builder": {
+ "version": "26.15.3",
+ "resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-26.15.3.tgz",
+ "integrity": "sha512-O3zJUFUYHJKgzPqioHxfxzBzlSC1eXCSr79gMSBKBP5AgjjpmrydMsMLotEg9fAJF36vdUncb+4ndRNxoPdlSQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "is-wsl": "^1.1.0"
- },
- "engines": {
- "node": ">=4"
+ "app-builder-lib": "26.15.3",
+ "builder-util": "26.15.3",
+ "fs-extra": "^10.1.0",
+ "js-yaml": "^4.1.0"
}
},
- "node_modules/optionator": {
- "version": "0.9.3",
- "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz",
- "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==",
- "dev": true,
+ "node_modules/dom-serializer": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz",
+ "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==",
+ "license": "MIT",
"dependencies": {
- "@aashutoshrathi/word-wrap": "^1.2.3",
- "deep-is": "^0.1.3",
- "fast-levenshtein": "^2.0.6",
- "levn": "^0.4.1",
- "prelude-ls": "^1.2.1",
- "type-check": "^0.4.0"
+ "domelementtype": "^2.3.0",
+ "domhandler": "^5.0.2",
+ "entities": "^4.2.0"
},
- "engines": {
- "node": ">= 0.8.0"
+ "funding": {
+ "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1"
}
},
- "node_modules/ora": {
- "version": "5.4.1",
- "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz",
- "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==",
- "dev": true,
- "peer": true,
+ "node_modules/domelementtype": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz",
+ "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fb55"
+ }
+ ],
+ "license": "BSD-2-Clause"
+ },
+ "node_modules/domhandler": {
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz",
+ "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==",
+ "license": "BSD-2-Clause",
"dependencies": {
- "bl": "^4.1.0",
- "chalk": "^4.1.0",
- "cli-cursor": "^3.1.0",
- "cli-spinners": "^2.5.0",
- "is-interactive": "^1.0.0",
- "is-unicode-supported": "^0.1.0",
- "log-symbols": "^4.1.0",
- "strip-ansi": "^6.0.0",
- "wcwidth": "^1.0.1"
+ "domelementtype": "^2.3.0"
},
"engines": {
- "node": ">=10"
+ "node": ">= 4"
},
"funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "url": "https://github.com/fb55/domhandler?sponsor=1"
}
},
- "node_modules/ora/node_modules/ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "dev": true,
- "peer": true,
+ "node_modules/domutils": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz",
+ "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==",
+ "license": "BSD-2-Clause",
"dependencies": {
- "color-convert": "^2.0.1"
+ "dom-serializer": "^2.0.0",
+ "domelementtype": "^2.3.0",
+ "domhandler": "^5.0.3"
},
+ "funding": {
+ "url": "https://github.com/fb55/domutils?sponsor=1"
+ }
+ },
+ "node_modules/dotenv": {
+ "version": "16.6.1",
+ "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz",
+ "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==",
+ "dev": true,
+ "license": "BSD-2-Clause",
"engines": {
- "node": ">=8"
+ "node": ">=12"
},
"funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ "url": "https://dotenvx.com"
}
},
- "node_modules/ora/node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "node_modules/dotenv-expand": {
+ "version": "11.0.7",
+ "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-11.0.7.tgz",
+ "integrity": "sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA==",
"dev": true,
- "peer": true,
+ "license": "BSD-2-Clause",
"dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
+ "dotenv": "^16.4.5"
},
"engines": {
- "node": ">=10"
+ "node": ">=12"
},
"funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
+ "url": "https://dotenvx.com"
}
},
- "node_modules/ora/node_modules/color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "node_modules/dunder-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
+ "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
"dev": true,
- "peer": true,
+ "license": "MIT",
"dependencies": {
- "color-name": "~1.1.4"
+ "call-bind-apply-helpers": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "gopd": "^1.2.0"
},
"engines": {
- "node": ">=7.0.0"
+ "node": ">= 0.4"
}
},
- "node_modules/ora/node_modules/color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "node_modules/duplexer": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz",
+ "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==",
"dev": true,
- "peer": true
+ "license": "MIT"
},
- "node_modules/ora/node_modules/supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "node_modules/duplexer2": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz",
+ "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==",
"dev": true,
- "peer": true,
+ "license": "BSD-3-Clause",
"dependencies": {
- "has-flag": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
+ "readable-stream": "^2.0.2"
}
},
- "node_modules/os-browserify": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz",
- "integrity": "sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==",
- "dev": true
+ "node_modules/duplexer2/node_modules/isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
+ "dev": true,
+ "license": "MIT"
},
- "node_modules/p-cancelable": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz",
- "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==",
- "engines": {
- "node": ">=6"
+ "node_modules/duplexer2/node_modules/readable-stream": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
+ "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
}
},
- "node_modules/p-iteration": {
- "version": "1.1.8",
- "resolved": "https://registry.npmjs.org/p-iteration/-/p-iteration-1.1.8.tgz",
- "integrity": "sha512-IMFBSDIYcPNnW7uWYGrBqmvTiq7W0uB0fJn6shQZs7dlF3OvrHOre+JT9ikSZ7gZS3vWqclVgoQSvToJrns7uQ==",
- "engines": {
- "node": ">=8.0.0"
+ "node_modules/duplexer2/node_modules/string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "safe-buffer": "~5.1.0"
}
},
- "node_modules/p-limit": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
- "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
- "dev": true,
+ "node_modules/eastasianwidth": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
+ "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
+ "license": "MIT"
+ },
+ "node_modules/edge-paths": {
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/edge-paths/-/edge-paths-3.0.5.tgz",
+ "integrity": "sha512-sB7vSrDnFa4ezWQk9nZ/n0FdpdUuC6R1EOrlU3DL+bovcNFK28rqu2emmAUjujYEJTWIgQGqgVVWUZXMnc8iWg==",
+ "license": "MIT",
"dependencies": {
- "yocto-queue": "^0.1.0"
+ "@types/which": "^2.0.1",
+ "which": "^2.0.2"
},
"engines": {
- "node": ">=10"
+ "node": ">=14.0.0"
},
"funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "url": "https://github.com/sponsors/shirshak55"
}
},
- "node_modules/p-locate": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
- "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
- "dev": true,
+ "node_modules/edge-paths/node_modules/isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+ "license": "ISC"
+ },
+ "node_modules/edge-paths/node_modules/which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "license": "ISC",
"dependencies": {
- "p-limit": "^3.0.2"
+ "isexe": "^2.0.0"
},
- "engines": {
- "node": ">=10"
+ "bin": {
+ "node-which": "bin/node-which"
},
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "engines": {
+ "node": ">= 8"
}
},
- "node_modules/p-try": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
- "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
- "dev": true,
+ "node_modules/edgedriver": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/edgedriver/-/edgedriver-6.3.0.tgz",
+ "integrity": "sha512-ggEQL+oEyIcM4nP2QC3AtCQ04o4kDNefRM3hja0odvlPSnsaxiruMxEZ93v3gDCKWYW6BXUr51PPradb+3nffw==",
+ "hasInstallScript": true,
+ "license": "MIT",
+ "dependencies": {
+ "@wdio/logger": "^9.18.0",
+ "@zip.js/zip.js": "^2.8.11",
+ "decamelize": "^6.0.1",
+ "edge-paths": "^3.0.5",
+ "fast-xml-parser": "^5.3.3",
+ "http-proxy-agent": "^7.0.2",
+ "https-proxy-agent": "^7.0.6",
+ "which": "^6.0.0"
+ },
+ "bin": {
+ "edgedriver": "bin/edgedriver.js"
+ },
"engines": {
- "node": ">=6"
+ "node": ">=20.0.0"
}
},
- "node_modules/pac-proxy-agent": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.0.1.tgz",
- "integrity": "sha512-ASV8yU4LLKBAjqIPMbrgtaKIvxQri/yh2OpI+S6hVa9JRkUI3Y3NPFbfngDtY7oFtSMD3w31Xns89mDa3Feo5A==",
+ "node_modules/ee-first": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
+ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/ejs": {
+ "version": "3.1.10",
+ "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz",
+ "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==",
"dev": true,
+ "license": "Apache-2.0",
"dependencies": {
- "@tootallnate/quickjs-emscripten": "^0.23.0",
- "agent-base": "^7.0.2",
- "debug": "^4.3.4",
- "get-uri": "^6.0.1",
- "http-proxy-agent": "^7.0.0",
- "https-proxy-agent": "^7.0.2",
- "pac-resolver": "^7.0.0",
- "socks-proxy-agent": "^8.0.2"
+ "jake": "^10.8.5"
+ },
+ "bin": {
+ "ejs": "bin/cli.js"
},
"engines": {
- "node": ">= 14"
+ "node": ">=0.10.0"
}
},
- "node_modules/pac-proxy-agent/node_modules/agent-base": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz",
- "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==",
- "dev": true,
+ "node_modules/electron": {
+ "version": "41.8.0",
+ "resolved": "https://registry.npmjs.org/electron/-/electron-41.8.0.tgz",
+ "integrity": "sha512-mQRqdFxB6/EAyA9pPn00EC1KFytTijOQO52zBvl9HypWBvvibC3P4iSrT4CSVVksolOPKZZm8U4Cfjb5IHxZVA==",
+ "hasInstallScript": true,
+ "license": "MIT",
"dependencies": {
- "debug": "^4.3.4"
+ "@electron-internal/extract-zip": "^1.0.1",
+ "@electron/get": "^5.0.0",
+ "@types/node": "^24.9.0"
+ },
+ "bin": {
+ "electron": "cli.js"
},
"engines": {
- "node": ">= 14"
+ "node": ">= 22.12.0"
}
},
- "node_modules/pac-proxy-agent/node_modules/http-proxy-agent": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.0.tgz",
- "integrity": "sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==",
+ "node_modules/electron-builder": {
+ "version": "26.15.3",
+ "resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-26.15.3.tgz",
+ "integrity": "sha512-a1KM5heqS3gQCZzizXEI8RjJy3QVogULPdeSknt76uLDpBIW/HDGsMg/XgP0riP6PI9COsRvFITKKGDqA8fJxA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "agent-base": "^7.1.0",
- "debug": "^4.3.4"
+ "app-builder-lib": "26.15.3",
+ "builder-util": "26.15.3",
+ "builder-util-runtime": "9.7.0",
+ "chalk": "^4.1.2",
+ "ci-info": "^4.2.0",
+ "dmg-builder": "26.15.3",
+ "fs-extra": "^10.1.0",
+ "lazy-val": "^1.0.5",
+ "simple-update-notifier": "2.0.0",
+ "yargs": "^17.6.2"
+ },
+ "bin": {
+ "electron-builder": "cli.js",
+ "install-app-deps": "install-app-deps.js"
},
"engines": {
- "node": ">= 14"
+ "node": ">=14.0.0"
}
},
- "node_modules/pac-proxy-agent/node_modules/https-proxy-agent": {
- "version": "7.0.2",
- "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.2.tgz",
- "integrity": "sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==",
+ "node_modules/electron-builder-squirrel-windows": {
+ "version": "26.15.3",
+ "resolved": "https://registry.npmjs.org/electron-builder-squirrel-windows/-/electron-builder-squirrel-windows-26.15.3.tgz",
+ "integrity": "sha512-Jc19XPV9y9+2bAdZPkXuVNGNIEFBq9poHC61l8Kv6FdK7DRG3+Ic0rerC0DXOaeHNz8yW0fg/JnF8GQROOF5MA==",
"dev": true,
+ "license": "MIT",
+ "peer": true,
"dependencies": {
- "agent-base": "^7.0.2",
- "debug": "4"
+ "app-builder-lib": "26.15.3",
+ "builder-util": "26.15.3",
+ "electron-winstaller": "5.4.0"
+ }
+ },
+ "node_modules/electron-builder/node_modules/cliui": {
+ "version": "8.0.1",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
+ "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.1",
+ "wrap-ansi": "^7.0.0"
},
"engines": {
- "node": ">= 14"
+ "node": ">=12"
}
},
- "node_modules/pac-resolver": {
+ "node_modules/electron-builder/node_modules/wrap-ansi": {
"version": "7.0.0",
- "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.0.tgz",
- "integrity": "sha512-Fd9lT9vJbHYRACT8OhCbZBbxr6KRSawSovFpy8nDGshaK99S/EBhVIHp9+crhxrsZOuvLpgL1n23iyPg6Rl2hg==",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "degenerator": "^5.0.0",
- "ip": "^1.1.8",
- "netmask": "^2.0.2"
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
},
"engines": {
- "node": ">= 14"
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
}
},
- "node_modules/package-changed": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/package-changed/-/package-changed-3.0.0.tgz",
- "integrity": "sha512-HSRbrO+Ab5AuqqYGSevtKJ1Yt96jW1VKV7wrp8K4SKj5tyDp/7D96uPCQyCPiNtWTEH/7nA3hZ4z2slbc9yFxg==",
+ "node_modules/electron-builder/node_modules/yargs": {
+ "version": "17.7.2",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
+ "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
"dev": true,
- "peer": true,
+ "license": "MIT",
"dependencies": {
- "commander": "^6.2.0"
+ "cliui": "^8.0.1",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.3",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^21.1.1"
},
- "bin": {
- "package-changed": "bin/package-changed.js"
+ "engines": {
+ "node": ">=12"
}
},
- "node_modules/package-changed/node_modules/commander": {
- "version": "6.2.1",
- "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz",
- "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==",
+ "node_modules/electron-builder/node_modules/yargs-parser": {
+ "version": "21.1.1",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
+ "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
"dev": true,
- "peer": true,
+ "license": "ISC",
"engines": {
- "node": ">= 6"
+ "node": ">=12"
}
},
- "node_modules/pako": {
- "version": "1.0.11",
- "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz",
- "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==",
- "dev": true
- },
- "node_modules/parcel-bundler": {
- "version": "1.12.5",
- "resolved": "https://registry.npmjs.org/parcel-bundler/-/parcel-bundler-1.12.5.tgz",
- "integrity": "sha512-hpku8mW67U6PXQIenW6NBbphBOMb8XzW6B9r093DUhYj5GN2FUB/CXCiz5hKoPYUsusZ35BpProH8AUF9bh5IQ==",
- "deprecated": "Parcel v1 is no longer maintained. Please migrate to v2, which is published under the 'parcel' package. See https://v2.parceljs.org/getting-started/migration for details.",
- "dev": true,
- "hasInstallScript": true,
+ "node_modules/electron-debug": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/electron-debug/-/electron-debug-4.1.0.tgz",
+ "integrity": "sha512-rdbvmotqbaNcSuinPe1tzB5zK+JKal+4LSDbguBcqTLARNqWrGoRS/TkR1gGH4+63boYH3HUaf9r9ECAxgIe9g==",
+ "license": "MIT",
"dependencies": {
- "@babel/code-frame": "^7.0.0",
- "@babel/core": "^7.4.4",
- "@babel/generator": "^7.4.4",
- "@babel/parser": "^7.4.4",
- "@babel/plugin-transform-flow-strip-types": "^7.4.4",
- "@babel/plugin-transform-modules-commonjs": "^7.4.4",
- "@babel/plugin-transform-react-jsx": "^7.0.0",
- "@babel/preset-env": "^7.4.4",
- "@babel/runtime": "^7.4.4",
- "@babel/template": "^7.4.4",
- "@babel/traverse": "^7.4.4",
- "@babel/types": "^7.4.4",
- "@iarna/toml": "^2.2.0",
- "@parcel/fs": "^1.11.0",
- "@parcel/logger": "^1.11.1",
- "@parcel/utils": "^1.11.0",
- "@parcel/watcher": "^1.12.1",
- "@parcel/workers": "^1.11.0",
- "ansi-to-html": "^0.6.4",
- "babylon-walk": "^1.0.2",
- "browserslist": "^4.1.0",
- "chalk": "^2.1.0",
- "clone": "^2.1.1",
- "command-exists": "^1.2.6",
- "commander": "^2.11.0",
- "core-js": "^2.6.5",
- "cross-spawn": "^6.0.4",
- "css-modules-loader-core": "^1.1.0",
- "cssnano": "^4.0.0",
- "deasync": "^0.1.14",
- "dotenv": "^5.0.0",
- "dotenv-expand": "^5.1.0",
- "envinfo": "^7.3.1",
- "fast-glob": "^2.2.2",
- "filesize": "^3.6.0",
- "get-port": "^3.2.0",
- "htmlnano": "^0.2.2",
- "is-glob": "^4.0.0",
- "is-url": "^1.2.2",
- "js-yaml": "^3.10.0",
- "json5": "^1.0.1",
- "micromatch": "^3.0.4",
- "mkdirp": "^0.5.1",
- "node-forge": "^0.10.0",
- "node-libs-browser": "^2.0.0",
- "opn": "^5.1.0",
- "postcss": "^7.0.11",
- "postcss-value-parser": "^3.3.1",
- "posthtml": "^0.11.2",
- "posthtml-parser": "^0.4.0",
- "posthtml-render": "^1.1.3",
- "resolve": "^1.4.0",
- "semver": "^5.4.1",
- "serialize-to-js": "^3.0.0",
- "serve-static": "^1.12.4",
- "source-map": "0.6.1",
- "terser": "^3.7.3",
- "v8-compile-cache": "^2.0.0",
- "ws": "^5.1.1"
+ "electron-is-dev": "^3.0.1",
+ "electron-localshortcut": "^3.2.1"
},
- "bin": {
- "parcel": "bin/cli.js"
+ "engines": {
+ "node": ">=18"
},
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/electron-is-accelerator": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/electron-is-accelerator/-/electron-is-accelerator-0.1.2.tgz",
+ "integrity": "sha512-fLGSAjXZtdn1sbtZxx52+krefmtNuVwnJCV2gNiVt735/ARUboMl8jnNC9fZEqQdlAv2ZrETfmBUsoQci5evJA==",
+ "license": "MIT"
+ },
+ "node_modules/electron-is-dev": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/electron-is-dev/-/electron-is-dev-3.0.1.tgz",
+ "integrity": "sha512-8TjjAh8Ec51hUi3o4TaU0mD3GMTOESi866oRNavj9A3IQJ7pmv+MJVmdZBFGw4GFT36X7bkqnuDNYvkQgvyI8Q==",
+ "license": "MIT",
"engines": {
- "node": ">= 6.0.0"
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/parcel-bundler/node_modules/argparse": {
- "version": "1.0.10",
- "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
- "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
- "dev": true,
+ "node_modules/electron-localshortcut": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/electron-localshortcut/-/electron-localshortcut-3.2.1.tgz",
+ "integrity": "sha512-DWvhKv36GsdXKnaFFhEiK8kZZA+24/yFLgtTwJJHc7AFgDjNRIBJZ/jq62Y/dWv9E4ypYwrVWN2bVrCYw1uv7Q==",
+ "license": "MIT",
"dependencies": {
- "sprintf-js": "~1.0.2"
+ "debug": "^4.0.1",
+ "electron-is-accelerator": "^0.1.0",
+ "keyboardevent-from-electron-accelerator": "^2.0.0",
+ "keyboardevents-areequal": "^0.2.1"
}
},
- "node_modules/parcel-bundler/node_modules/commander": {
- "version": "2.20.3",
- "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
- "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
- "dev": true
- },
- "node_modules/parcel-bundler/node_modules/cross-spawn": {
- "version": "6.0.5",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
- "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
+ "node_modules/electron-publish": {
+ "version": "26.15.3",
+ "resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-26.15.3.tgz",
+ "integrity": "sha512-g/2bn8YTavY4cuS5F+jOS7zmZbXXBV8KZ8yHKfJjFPoKtzBqrpCdNPxBd3tqdBwP7BVd0lGzf7Bk2s0KesWZ4Q==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "nice-try": "^1.0.4",
- "path-key": "^2.0.1",
- "semver": "^5.5.0",
- "shebang-command": "^1.2.0",
- "which": "^1.2.9"
- },
- "engines": {
- "node": ">=4.8"
+ "@types/fs-extra": "^9.0.11",
+ "aws4": "^1.13.2",
+ "builder-util": "26.15.3",
+ "builder-util-runtime": "9.7.0",
+ "chalk": "^4.1.2",
+ "form-data": "^4.0.5",
+ "fs-extra": "^10.1.0",
+ "lazy-val": "^1.0.5",
+ "mime": "^2.5.2"
}
},
- "node_modules/parcel-bundler/node_modules/esprima": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
- "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
- "dev": true,
- "bin": {
- "esparse": "bin/esparse.js",
- "esvalidate": "bin/esvalidate.js"
+ "node_modules/electron-settings": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/electron-settings/-/electron-settings-4.0.4.tgz",
+ "integrity": "sha512-yR6ByH3hHqDgbcQ9y5foA2Pr2fSMIggFDMsHe71z1Og6myw7vxMlrkIzenmmrmZHeFLlvQyt7+gTZCH8BywHBw==",
+ "license": "MIT",
+ "dependencies": {
+ "lodash": "^4.17.21",
+ "mkdirp": "^1.0.4",
+ "write-file-atomic": "^3.0.3"
},
- "engines": {
- "node": ">=4"
+ "peerDependencies": {
+ "electron": ">= 2"
}
},
- "node_modules/parcel-bundler/node_modules/isexe": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
- "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
- "dev": true
- },
- "node_modules/parcel-bundler/node_modules/js-yaml": {
- "version": "3.14.1",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
- "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
+ "node_modules/electron-to-chromium": {
+ "version": "1.5.302",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.302.tgz",
+ "integrity": "sha512-sM6HAN2LyK82IyPBpznDRqlTQAtuSaO+ShzFiWTvoMJLHyZ+Y39r8VMfHzwbU8MVBzQ4Wdn85+wlZl2TLGIlwg==",
"dev": true,
+ "license": "ISC"
+ },
+ "node_modules/electron-updater": {
+ "version": "6.8.9",
+ "resolved": "https://registry.npmjs.org/electron-updater/-/electron-updater-6.8.9.tgz",
+ "integrity": "sha512-ZhVxM9iGONUpZGI1FxdMRgJjUFXi7AYGVa5PwKlO1tV1/4zDxQmfKpXOHVztKrd6L9rLcFjERvi1Mf2vxyTkig==",
+ "license": "MIT",
"dependencies": {
- "argparse": "^1.0.7",
- "esprima": "^4.0.0"
- },
- "bin": {
- "js-yaml": "bin/js-yaml.js"
+ "builder-util-runtime": "9.7.0",
+ "fs-extra": "^10.1.0",
+ "js-yaml": "^4.1.0",
+ "lazy-val": "^1.0.5",
+ "lodash.escaperegexp": "^4.1.2",
+ "lodash.isequal": "^4.5.0",
+ "semver": "~7.7.3",
+ "tiny-typed-emitter": "^2.1.0"
}
},
- "node_modules/parcel-bundler/node_modules/json5": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
- "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
+ "node_modules/electron-vite": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/electron-vite/-/electron-vite-5.0.0.tgz",
+ "integrity": "sha512-OHp/vjdlubNlhNkPkL/+3JD34ii5ov7M0GpuXEVdQeqdQ3ulvVR7Dg/rNBLfS5XPIFwgoBLDf9sjjrL+CuDyRQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "minimist": "^1.2.0"
+ "@babel/core": "^7.28.4",
+ "@babel/plugin-transform-arrow-functions": "^7.27.1",
+ "cac": "^6.7.14",
+ "esbuild": "^0.25.11",
+ "magic-string": "^0.30.19",
+ "picocolors": "^1.1.1"
},
"bin": {
- "json5": "lib/cli.js"
+ "electron-vite": "bin/electron-vite.js"
+ },
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ },
+ "peerDependencies": {
+ "@swc/core": "^1.0.0",
+ "vite": "^5.0.0 || ^6.0.0 || ^7.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@swc/core": {
+ "optional": true
+ }
}
},
- "node_modules/parcel-bundler/node_modules/mkdirp": {
- "version": "0.5.6",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz",
- "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
+ "node_modules/electron-winstaller": {
+ "version": "5.4.0",
+ "resolved": "https://registry.npmjs.org/electron-winstaller/-/electron-winstaller-5.4.0.tgz",
+ "integrity": "sha512-bO3y10YikuUwUuDUQRM4KfwNkKhnpVO7IPdbsrejwN9/AABJzzTQ4GeHwyzNSrVO+tEH3/Np255a3sVZpZDjvg==",
"dev": true,
+ "hasInstallScript": true,
+ "license": "MIT",
+ "peer": true,
"dependencies": {
- "minimist": "^1.2.6"
+ "@electron/asar": "^3.2.1",
+ "debug": "^4.1.1",
+ "fs-extra": "^7.0.1",
+ "lodash": "^4.17.21",
+ "temp": "^0.9.0"
},
- "bin": {
- "mkdirp": "bin/cmd.js"
+ "engines": {
+ "node": ">=8.0.0"
+ },
+ "optionalDependencies": {
+ "@electron/windows-sign": "^1.1.2"
}
},
- "node_modules/parcel-bundler/node_modules/path-key": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
- "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==",
+ "node_modules/electron-winstaller/node_modules/fs-extra": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz",
+ "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==",
"dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "graceful-fs": "^4.1.2",
+ "jsonfile": "^4.0.0",
+ "universalify": "^0.1.0"
+ },
"engines": {
- "node": ">=4"
+ "node": ">=6 <7 || >=8"
}
},
- "node_modules/parcel-bundler/node_modules/semver": {
- "version": "5.7.2",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
- "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
- "dev": true,
- "bin": {
- "semver": "bin/semver"
- }
+ "node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "license": "MIT"
},
- "node_modules/parcel-bundler/node_modules/sprintf-js": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
- "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==",
- "dev": true
+ "node_modules/enabled": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz",
+ "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
},
- "node_modules/parcel-bundler/node_modules/which": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
- "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
+ "node_modules/encodeurl": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",
+ "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==",
"dev": true,
- "dependencies": {
- "isexe": "^2.0.0"
- },
- "bin": {
- "which": "bin/which"
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">= 0.8"
}
},
- "node_modules/parcel-plugin-asset-copier": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/parcel-plugin-asset-copier/-/parcel-plugin-asset-copier-1.1.1.tgz",
- "integrity": "sha512-PO045Wjj9zXh9JK2ASdcmgEBbK0cfM068NkSzXHjWrkbq0nKFZlrCk7dJvCYPW6TDpdR43jQTIF7kDjQ0gsKtQ==",
- "dev": true,
+ "node_modules/encoding-sniffer": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/encoding-sniffer/-/encoding-sniffer-0.2.1.tgz",
+ "integrity": "sha512-5gvq20T6vfpekVtqrYQsSCFZ1wEg5+wW0/QaZMWkFr6BqD3NfKs0rLCx4rrVlSWJeZb5NBJgVLswK/w2MWU+Gw==",
+ "license": "MIT",
"dependencies": {
- "recursive-copy": "2.0.14"
+ "iconv-lite": "^0.6.3",
+ "whatwg-encoding": "^3.1.1"
},
- "engines": {
- "parcel": "1.x"
+ "funding": {
+ "url": "https://github.com/fb55/encoding-sniffer?sponsor=1"
}
},
- "node_modules/parent-module": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
- "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
- "dev": true,
+ "node_modules/encoding-sniffer/node_modules/iconv-lite": {
+ "version": "0.6.3",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
+ "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
+ "license": "MIT",
"dependencies": {
- "callsites": "^3.0.0"
+ "safer-buffer": ">= 2.1.2 < 3.0.0"
},
"engines": {
- "node": ">=6"
+ "node": ">=0.10.0"
}
},
- "node_modules/parse-asn1": {
- "version": "5.1.6",
- "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz",
- "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==",
- "dev": true,
+ "node_modules/end-of-stream": {
+ "version": "1.4.5",
+ "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz",
+ "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==",
+ "license": "MIT",
"dependencies": {
- "asn1.js": "^5.2.0",
- "browserify-aes": "^1.0.0",
- "evp_bytestokey": "^1.0.0",
- "pbkdf2": "^3.0.3",
- "safe-buffer": "^5.1.1"
+ "once": "^1.4.0"
}
},
- "node_modules/parse-json": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz",
- "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==",
+ "node_modules/enhanced-resolve": {
+ "version": "5.19.0",
+ "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.19.0.tgz",
+ "integrity": "sha512-phv3E1Xl4tQOShqSte26C7Fl84EwUdZsyOuSSk9qtAGyyQs2s3jJzComh+Abf4g187lUUAvH+H26omrqia2aGg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "error-ex": "^1.3.1",
- "json-parse-better-errors": "^1.0.1"
+ "graceful-fs": "^4.2.4",
+ "tapable": "^2.3.0"
},
"engines": {
- "node": ">=4"
+ "node": ">=10.13.0"
}
},
- "node_modules/parse-listing": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/parse-listing/-/parse-listing-1.1.3.tgz",
- "integrity": "sha512-a1p1i+9Qyc8pJNwdrSvW1g5TPxRH0sywVi6OzVvYHRo6xwF9bDWBxtH0KkxeOOvhUE8vAMtiSfsYQFOuK901eA==",
- "dev": true,
+ "node_modules/entities": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
+ "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
+ "license": "BSD-2-Clause",
"engines": {
- "node": ">=0.6.21"
+ "node": ">=0.12"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
}
},
- "node_modules/parse-node-version": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz",
- "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==",
+ "node_modules/env-paths": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz",
+ "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==",
"dev": true,
+ "license": "MIT",
"engines": {
- "node": ">= 0.10"
- }
- },
- "node_modules/parse5": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz",
- "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw=="
- },
- "node_modules/parse5-htmlparser2-tree-adapter": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz",
- "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==",
- "dependencies": {
- "parse5": "^6.0.1"
+ "node": ">=6"
}
},
- "node_modules/parseurl": {
- "version": "1.3.3",
- "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
- "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
+ "node_modules/err-code": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz",
+ "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==",
"dev": true,
- "engines": {
- "node": ">= 0.8"
- }
+ "license": "MIT"
},
- "node_modules/pascalcase": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
- "integrity": "sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==",
+ "node_modules/es-define-property": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
+ "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
"dev": true,
+ "license": "MIT",
"engines": {
- "node": ">=0.10.0"
+ "node": ">= 0.4"
}
},
- "node_modules/path-browserify": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz",
- "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==",
- "dev": true
- },
- "node_modules/path-dirname": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz",
- "integrity": "sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q==",
- "dev": true
- },
- "node_modules/path-exists": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
- "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+ "node_modules/es-errors": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
+ "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
"dev": true,
+ "license": "MIT",
"engines": {
- "node": ">=8"
+ "node": ">= 0.4"
}
},
- "node_modules/path-is-absolute": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
- "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
+ "node_modules/es-module-lexer": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.0.0.tgz",
+ "integrity": "sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/es-object-atoms": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
+ "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
"dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0"
+ },
"engines": {
- "node": ">=0.10.0"
+ "node": ">= 0.4"
}
},
- "node_modules/path-key": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
- "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "node_modules/es-set-tostringtag": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz",
+ "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==",
"dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.6",
+ "has-tostringtag": "^1.0.2",
+ "hasown": "^2.0.2"
+ },
"engines": {
- "node": ">=8"
+ "node": ">= 0.4"
}
},
- "node_modules/path-parse": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
- "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
- "dev": true
+ "node_modules/es6-error": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz",
+ "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true
},
- "node_modules/path-scurry": {
- "version": "1.10.1",
- "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz",
- "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==",
+ "node_modules/esbuild": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz",
+ "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==",
"dev": true,
- "dependencies": {
- "lru-cache": "^9.1.1 || ^10.0.0",
- "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0"
+ "hasInstallScript": true,
+ "license": "MIT",
+ "bin": {
+ "esbuild": "bin/esbuild"
},
"engines": {
- "node": ">=16 || 14 >=14.17"
+ "node": ">=18"
},
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
+ "optionalDependencies": {
+ "@esbuild/aix-ppc64": "0.25.12",
+ "@esbuild/android-arm": "0.25.12",
+ "@esbuild/android-arm64": "0.25.12",
+ "@esbuild/android-x64": "0.25.12",
+ "@esbuild/darwin-arm64": "0.25.12",
+ "@esbuild/darwin-x64": "0.25.12",
+ "@esbuild/freebsd-arm64": "0.25.12",
+ "@esbuild/freebsd-x64": "0.25.12",
+ "@esbuild/linux-arm": "0.25.12",
+ "@esbuild/linux-arm64": "0.25.12",
+ "@esbuild/linux-ia32": "0.25.12",
+ "@esbuild/linux-loong64": "0.25.12",
+ "@esbuild/linux-mips64el": "0.25.12",
+ "@esbuild/linux-ppc64": "0.25.12",
+ "@esbuild/linux-riscv64": "0.25.12",
+ "@esbuild/linux-s390x": "0.25.12",
+ "@esbuild/linux-x64": "0.25.12",
+ "@esbuild/netbsd-arm64": "0.25.12",
+ "@esbuild/netbsd-x64": "0.25.12",
+ "@esbuild/openbsd-arm64": "0.25.12",
+ "@esbuild/openbsd-x64": "0.25.12",
+ "@esbuild/openharmony-arm64": "0.25.12",
+ "@esbuild/sunos-x64": "0.25.12",
+ "@esbuild/win32-arm64": "0.25.12",
+ "@esbuild/win32-ia32": "0.25.12",
+ "@esbuild/win32-x64": "0.25.12"
}
},
- "node_modules/path-scurry/node_modules/lru-cache": {
- "version": "10.1.0",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.1.0.tgz",
- "integrity": "sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==",
- "dev": true,
+ "node_modules/escalade": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
+ "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
+ "license": "MIT",
"engines": {
- "node": "14 || >=16.14"
+ "node": ">=6"
}
},
- "node_modules/path-to-regexp": {
- "version": "6.2.1",
- "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.1.tgz",
- "integrity": "sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==",
+ "node_modules/escape-html": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
+ "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==",
"dev": true,
+ "license": "MIT",
"peer": true
},
- "node_modules/path-type": {
+ "node_modules/escape-string-regexp": {
"version": "4.0.0",
- "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
- "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
"dev": true,
+ "license": "MIT",
"engines": {
- "node": ">=8"
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/pathval": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz",
- "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==",
- "dev": true,
+ "node_modules/escodegen": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz",
+ "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "esprima": "^4.0.1",
+ "estraverse": "^5.2.0",
+ "esutils": "^2.0.2"
+ },
+ "bin": {
+ "escodegen": "bin/escodegen.js",
+ "esgenerate": "bin/esgenerate.js"
+ },
"engines": {
- "node": "*"
+ "node": ">=6.0"
+ },
+ "optionalDependencies": {
+ "source-map": "~0.6.1"
}
},
- "node_modules/pbkdf2": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz",
- "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==",
+ "node_modules/eslint": {
+ "version": "10.5.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.5.0.tgz",
+ "integrity": "sha512-1y+7C+vi12bUK1IpZeaV3gsH9fHLBmPvYmPx42pvT/E9yG0IC8g3PUZZgp0+JLJl7ZDK0flc2gc+Aw9dpCvIsQ==",
"dev": true,
+ "license": "MIT",
+ "workspaces": [
+ "packages/*"
+ ],
"dependencies": {
- "create-hash": "^1.1.2",
- "create-hmac": "^1.1.4",
- "ripemd160": "^2.0.1",
- "safe-buffer": "^5.0.1",
- "sha.js": "^2.4.8"
+ "@eslint-community/eslint-utils": "^4.8.0",
+ "@eslint-community/regexpp": "^4.12.2",
+ "@eslint/config-array": "^0.23.5",
+ "@eslint/config-helpers": "^0.6.0",
+ "@eslint/core": "^1.2.1",
+ "@eslint/plugin-kit": "^0.7.2",
+ "@humanfs/node": "^0.16.6",
+ "@humanwhocodes/module-importer": "^1.0.1",
+ "@humanwhocodes/retry": "^0.4.2",
+ "@types/estree": "^1.0.6",
+ "ajv": "^6.14.0",
+ "cross-spawn": "^7.0.6",
+ "debug": "^4.3.2",
+ "escape-string-regexp": "^4.0.0",
+ "eslint-scope": "^9.1.2",
+ "eslint-visitor-keys": "^5.0.1",
+ "espree": "^11.2.0",
+ "esquery": "^1.7.0",
+ "esutils": "^2.0.2",
+ "fast-deep-equal": "^3.1.3",
+ "file-entry-cache": "^8.0.0",
+ "find-up": "^5.0.0",
+ "glob-parent": "^6.0.2",
+ "ignore": "^5.2.0",
+ "imurmurhash": "^0.1.4",
+ "is-glob": "^4.0.0",
+ "json-stable-stringify-without-jsonify": "^1.0.1",
+ "minimatch": "^10.2.4",
+ "natural-compare": "^1.4.0",
+ "optionator": "^0.9.3"
+ },
+ "bin": {
+ "eslint": "bin/eslint.js"
},
"engines": {
- "node": ">=0.12"
+ "node": "^20.19.0 || ^22.13.0 || >=24"
+ },
+ "funding": {
+ "url": "https://eslint.org/donate"
+ },
+ "peerDependencies": {
+ "jiti": "*"
+ },
+ "peerDependenciesMeta": {
+ "jiti": {
+ "optional": true
+ }
}
},
- "node_modules/pend": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz",
- "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg=="
- },
- "node_modules/performance-now": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
- "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==",
- "dev": true
- },
- "node_modules/physical-cpu-count": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/physical-cpu-count/-/physical-cpu-count-2.0.0.tgz",
- "integrity": "sha512-rxJOljMuWtYlvREBmd6TZYanfcPhNUKtGDZBjBBS8WG1dpN2iwPsRJZgQqN/OtJuiQckdRFOfzogqJClTrsi7g==",
- "dev": true
- },
- "node_modules/picocolors": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
- "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
- "dev": true
- },
- "node_modules/picomatch": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
- "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "node_modules/eslint-compat-utils": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.5.1.tgz",
+ "integrity": "sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==",
"dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "semver": "^7.5.4"
+ },
"engines": {
- "node": ">=8.6"
+ "node": ">=12"
},
- "funding": {
- "url": "https://github.com/sponsors/jonschlinkert"
+ "peerDependencies": {
+ "eslint": ">=6.0.0"
}
},
- "node_modules/pify": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
- "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
+ "node_modules/eslint-config-prettier": {
+ "version": "10.1.8",
+ "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.1.8.tgz",
+ "integrity": "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==",
"dev": true,
- "engines": {
- "node": ">=6"
+ "license": "MIT",
+ "bin": {
+ "eslint-config-prettier": "bin/cli.js"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint-config-prettier"
+ },
+ "peerDependencies": {
+ "eslint": ">=7.0.0"
}
},
- "node_modules/pirates": {
- "version": "4.0.6",
- "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz",
- "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==",
+ "node_modules/eslint-import-context": {
+ "version": "0.1.9",
+ "resolved": "https://registry.npmjs.org/eslint-import-context/-/eslint-import-context-0.1.9.tgz",
+ "integrity": "sha512-K9Hb+yRaGAGUbwjhFNHvSmmkZs9+zbuoe3kFQ4V1wYjrepUFYM2dZAfNtjbbj3qsPfUfsA68Bx/ICWQMi+C8Eg==",
"dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "get-tsconfig": "^4.10.1",
+ "stable-hash-x": "^0.2.0"
+ },
"engines": {
- "node": ">= 6"
+ "node": "^12.20.0 || ^14.18.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint-import-context"
+ },
+ "peerDependencies": {
+ "unrs-resolver": "^1.0.0"
+ },
+ "peerDependenciesMeta": {
+ "unrs-resolver": {
+ "optional": true
+ }
}
},
- "node_modules/pkg-dir": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-5.0.0.tgz",
- "integrity": "sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==",
+ "node_modules/eslint-plugin-es-x": {
+ "version": "7.8.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-7.8.0.tgz",
+ "integrity": "sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ==",
"dev": true,
+ "funding": [
+ "https://github.com/sponsors/ota-meshi",
+ "https://opencollective.com/eslint"
+ ],
+ "license": "MIT",
"dependencies": {
- "find-up": "^5.0.0"
+ "@eslint-community/eslint-utils": "^4.1.2",
+ "@eslint-community/regexpp": "^4.11.0",
+ "eslint-compat-utils": "^0.5.1"
},
"engines": {
- "node": ">=10"
+ "node": "^14.18.0 || >=16.0.0"
+ },
+ "peerDependencies": {
+ "eslint": ">=8"
}
},
- "node_modules/plist": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz",
- "integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==",
+ "node_modules/eslint-plugin-import-x": {
+ "version": "4.16.2",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-import-x/-/eslint-plugin-import-x-4.16.2.tgz",
+ "integrity": "sha512-rM9K8UBHcWKpzQzStn1YRN2T5NvdeIfSVoKu/lKF41znQXHAUcBbYXe5wd6GNjZjTrP7viQ49n1D83x/2gYgIw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@xmldom/xmldom": "^0.8.8",
- "base64-js": "^1.5.1",
- "xmlbuilder": "^15.1.1"
+ "@package-json/types": "^0.0.12",
+ "@typescript-eslint/types": "^8.56.0",
+ "comment-parser": "^1.4.1",
+ "debug": "^4.4.1",
+ "eslint-import-context": "^0.1.9",
+ "is-glob": "^4.0.3",
+ "minimatch": "^9.0.3 || ^10.1.2",
+ "semver": "^7.7.2",
+ "stable-hash-x": "^0.2.0",
+ "unrs-resolver": "^1.9.2"
},
"engines": {
- "node": ">=10.4.0"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint-plugin-import-x"
+ },
+ "peerDependencies": {
+ "@typescript-eslint/utils": "^8.56.0",
+ "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
+ "eslint-import-resolver-node": "*"
+ },
+ "peerDependenciesMeta": {
+ "@typescript-eslint/utils": {
+ "optional": true
+ },
+ "eslint-import-resolver-node": {
+ "optional": true
+ }
}
},
- "node_modules/pluralize": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz",
- "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==",
+ "node_modules/eslint-plugin-jsdoc": {
+ "version": "63.0.2",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-63.0.2.tgz",
+ "integrity": "sha512-0TchoK1uS4VxHSo3P4CyWQ31Lm+6zsT+xkHMC5KbFKwgOf8YrXPf1Bl8EP7kpgw1wfe/Ui5jz5mSX7ou8WAVuw==",
"dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@es-joy/jsdoccomment": "~0.87.0",
+ "@es-joy/resolve.exports": "1.2.0",
+ "are-docs-informative": "^0.0.2",
+ "comment-parser": "1.4.7",
+ "debug": "^4.4.3",
+ "escape-string-regexp": "^4.0.0",
+ "espree": "^11.2.0",
+ "esquery": "^1.7.0",
+ "html-entities": "^2.6.0",
+ "object-deep-merge": "^2.0.1",
+ "parse-imports-exports": "^0.2.4",
+ "semver": "^7.8.2",
+ "spdx-expression-parse": "^4.0.0",
+ "to-valid-identifier": "^1.0.0"
+ },
"engines": {
- "node": ">=4"
+ "node": "^22.13.0 || >=24"
+ },
+ "peerDependencies": {
+ "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0"
}
},
- "node_modules/pn": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz",
- "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==",
- "dev": true
- },
- "node_modules/posix-character-classes": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
- "integrity": "sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==",
+ "node_modules/eslint-plugin-jsdoc/node_modules/eslint-visitor-keys": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz",
+ "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==",
"dev": true,
+ "license": "Apache-2.0",
"engines": {
- "node": ">=0.10.0"
+ "node": "^20.19.0 || ^22.13.0 || >=24"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
}
},
- "node_modules/postcss": {
- "version": "7.0.39",
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
- "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
+ "node_modules/eslint-plugin-jsdoc/node_modules/espree": {
+ "version": "11.2.0",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-11.2.0.tgz",
+ "integrity": "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==",
"dev": true,
+ "license": "BSD-2-Clause",
"dependencies": {
- "picocolors": "^0.2.1",
- "source-map": "^0.6.1"
+ "acorn": "^8.16.0",
+ "acorn-jsx": "^5.3.2",
+ "eslint-visitor-keys": "^5.0.1"
},
"engines": {
- "node": ">=6.0.0"
+ "node": "^20.19.0 || ^22.13.0 || >=24"
},
"funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/postcss/"
+ "url": "https://opencollective.com/eslint"
}
},
- "node_modules/postcss-calc": {
- "version": "7.0.5",
- "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.5.tgz",
- "integrity": "sha512-1tKHutbGtLtEZF6PT4JSihCHfIVldU72mZ8SdZHIYriIZ9fh9k9aWSppaT8rHsyI3dX+KSR+W+Ix9BMY3AODrg==",
+ "node_modules/eslint-plugin-jsdoc/node_modules/semver": {
+ "version": "7.8.5",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz",
+ "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==",
"dev": true,
- "dependencies": {
- "postcss": "^7.0.27",
- "postcss-selector-parser": "^6.0.2",
- "postcss-value-parser": "^4.0.2"
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
}
},
- "node_modules/postcss-calc/node_modules/postcss-value-parser": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
- "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
- "dev": true
- },
- "node_modules/postcss-colormin": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-4.0.3.tgz",
- "integrity": "sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==",
+ "node_modules/eslint-plugin-jsdoc/node_modules/spdx-expression-parse": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-4.0.0.tgz",
+ "integrity": "sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "browserslist": "^4.0.0",
- "color": "^3.0.0",
- "has": "^1.0.0",
- "postcss": "^7.0.0",
- "postcss-value-parser": "^3.0.0"
- },
- "engines": {
- "node": ">=6.9.0"
+ "spdx-exceptions": "^2.1.0",
+ "spdx-license-ids": "^3.0.0"
}
},
- "node_modules/postcss-convert-values": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz",
- "integrity": "sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==",
+ "node_modules/eslint-plugin-mocha": {
+ "version": "11.3.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-11.3.0.tgz",
+ "integrity": "sha512-anENwrIwmdvunmmssjMn5a4nTd+mYMkqBlwjksxOECcIThLNhefWJIiTWY7pY/arMQFjNwHQjVOZb6pQ9PrLjg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "postcss": "^7.0.0",
- "postcss-value-parser": "^3.0.0"
+ "@eslint-community/eslint-utils": "^4.4.1",
+ "globals": "^15.14.0"
},
- "engines": {
- "node": ">=6.9.0"
+ "peerDependencies": {
+ "eslint": ">=9.0.0"
}
},
- "node_modules/postcss-discard-comments": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz",
- "integrity": "sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==",
+ "node_modules/eslint-plugin-mocha/node_modules/globals": {
+ "version": "15.15.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz",
+ "integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==",
"dev": true,
- "dependencies": {
- "postcss": "^7.0.0"
- },
+ "license": "MIT",
"engines": {
- "node": ">=6.9.0"
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/postcss-discard-duplicates": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz",
- "integrity": "sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==",
+ "node_modules/eslint-plugin-n": {
+ "version": "18.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-18.1.0.tgz",
+ "integrity": "sha512-hkUm9EtnFV2h2fE16jNVUfCVUqvPzI7fGLsFdun5lFt/pbmf2kCgDx6ymi9rx+NCUSggBmurJCZOfG20JBs/kg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "postcss": "^7.0.0"
+ "@eslint-community/eslint-utils": "^4.5.0",
+ "enhanced-resolve": "^5.17.1",
+ "eslint-plugin-es-x": "^7.8.0",
+ "get-tsconfig": "^4.8.1",
+ "globals": "^15.11.0",
+ "globrex": "^0.1.2",
+ "ignore": "^5.3.2",
+ "semver": "^7.6.3"
},
"engines": {
- "node": ">=6.9.0"
+ "node": "^20.19.0 || ^22.13.0 || >=24"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ },
+ "peerDependencies": {
+ "eslint": ">=8.57.1",
+ "ts-declaration-location": "^1.0.6",
+ "typescript": ">=5.0.0"
+ },
+ "peerDependenciesMeta": {
+ "ts-declaration-location": {
+ "optional": true
+ },
+ "typescript": {
+ "optional": true
+ }
}
},
- "node_modules/postcss-discard-empty": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz",
- "integrity": "sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==",
+ "node_modules/eslint-plugin-n/node_modules/globals": {
+ "version": "15.15.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz",
+ "integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==",
"dev": true,
- "dependencies": {
- "postcss": "^7.0.0"
- },
+ "license": "MIT",
"engines": {
- "node": ">=6.9.0"
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/postcss-discard-overridden": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz",
- "integrity": "sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==",
+ "node_modules/eslint-plugin-perfectionist": {
+ "version": "5.9.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-perfectionist/-/eslint-plugin-perfectionist-5.9.0.tgz",
+ "integrity": "sha512-8TWzg02zmnBdZwCkWLi8jhzqXI+fE7Z/RwV8SL6xD45tJ8Bp3wGuYL2XtQgfe/Wd0eBqOUX+s6ey73IyszvKTA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "postcss": "^7.0.0"
+ "@typescript-eslint/utils": "^8.58.2",
+ "natural-orderby": "^5.0.0"
},
"engines": {
- "node": ">=6.9.0"
+ "node": "^20.0.0 || >=22.0.0"
+ },
+ "peerDependencies": {
+ "eslint": "^8.45.0 || ^9.0.0 || ^10.0.0"
}
},
- "node_modules/postcss-merge-longhand": {
- "version": "4.0.11",
- "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz",
- "integrity": "sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==",
+ "node_modules/eslint-plugin-promise": {
+ "version": "7.3.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-7.3.0.tgz",
+ "integrity": "sha512-6uGiOR0INuujr6PEQmeSSP7GbIMJ/ebEXXiEzb/nOj68LknH5Pxzb/AbZivmr6VE6TkTE8rTjRK9zhKpK6HsRA==",
"dev": true,
+ "license": "ISC",
"dependencies": {
- "css-color-names": "0.0.4",
- "postcss": "^7.0.0",
- "postcss-value-parser": "^3.0.0",
- "stylehacks": "^4.0.0"
+ "@eslint-community/eslint-utils": "^4.4.0"
},
"engines": {
- "node": ">=6.9.0"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0"
}
},
- "node_modules/postcss-merge-rules": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz",
- "integrity": "sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==",
+ "node_modules/eslint-plugin-react-dom": {
+ "version": "5.9.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react-dom/-/eslint-plugin-react-dom-5.9.1.tgz",
+ "integrity": "sha512-e0NpfKZOOvdTkYQEDJT7qLKoTX4jAjH8/qcCuOrp8zqX1LMKPrKgPe8DXGyXG5T+Bt4b81/ZQ/s3S2zkJLFuNg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "browserslist": "^4.0.0",
- "caniuse-api": "^3.0.0",
- "cssnano-util-same-parent": "^4.0.0",
- "postcss": "^7.0.0",
- "postcss-selector-parser": "^3.0.0",
- "vendors": "^1.0.0"
+ "@eslint-react/ast": "5.9.1",
+ "@eslint-react/eslint": "5.9.1",
+ "@eslint-react/jsx": "5.9.1",
+ "@eslint-react/shared": "5.9.1",
+ "@typescript-eslint/types": "^8.61.1",
+ "@typescript-eslint/utils": "^8.61.1",
+ "compare-versions": "^6.1.1"
},
"engines": {
- "node": ">=6.9.0"
+ "node": ">=22.0.0"
+ },
+ "peerDependencies": {
+ "eslint": "*",
+ "typescript": "*"
}
},
- "node_modules/postcss-merge-rules/node_modules/postcss-selector-parser": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz",
- "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==",
+ "node_modules/eslint-plugin-react-dom/node_modules/@typescript-eslint/project-service": {
+ "version": "8.61.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.61.1.tgz",
+ "integrity": "sha512-PrC4JYGmR241lYnfhmKGTXkFqv8+ymbTFgSAY0fVXpY82/QkMw5TZPl+vGzuDDU2QYJk9fIDOBTntF+yDv9LEA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "dot-prop": "^5.2.0",
- "indexes-of": "^1.0.1",
- "uniq": "^1.0.1"
+ "@typescript-eslint/tsconfig-utils": "^8.61.1",
+ "@typescript-eslint/types": "^8.61.1",
+ "debug": "^4.4.3"
},
"engines": {
- "node": ">=8"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4 <6.1.0"
}
},
- "node_modules/postcss-minify-font-values": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz",
- "integrity": "sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==",
+ "node_modules/eslint-plugin-react-dom/node_modules/@typescript-eslint/scope-manager": {
+ "version": "8.61.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.61.1.tgz",
+ "integrity": "sha512-L2bdIeoQS8FlKAvONAr20w6OcLXeB+qiDKbAooS9A0Ben+iSIkBef0FxqwKWYqt5sa0i4KJtxVyVmhMylKzF5w==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "postcss": "^7.0.0",
- "postcss-value-parser": "^3.0.0"
+ "@typescript-eslint/types": "8.61.1",
+ "@typescript-eslint/visitor-keys": "8.61.1"
},
"engines": {
- "node": ">=6.9.0"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
}
},
- "node_modules/postcss-minify-gradients": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz",
- "integrity": "sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==",
+ "node_modules/eslint-plugin-react-dom/node_modules/@typescript-eslint/tsconfig-utils": {
+ "version": "8.61.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.61.1.tgz",
+ "integrity": "sha512-UN/H4di+OO7EWx2ovME+8t31YO+KVnK0RRKEHR3kOt21/Ay8BOq3M1OMvWs5vNiqcFCYGYoxK3MXPZzmMUE+yg==",
"dev": true,
- "dependencies": {
- "cssnano-util-get-arguments": "^4.0.0",
- "is-color-stop": "^1.0.0",
- "postcss": "^7.0.0",
- "postcss-value-parser": "^3.0.0"
- },
+ "license": "MIT",
"engines": {
- "node": ">=6.9.0"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4 <6.1.0"
}
},
- "node_modules/postcss-minify-params": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz",
- "integrity": "sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==",
+ "node_modules/eslint-plugin-react-dom/node_modules/@typescript-eslint/types": {
+ "version": "8.61.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.61.1.tgz",
+ "integrity": "sha512-G+CRlPqLv7Bz1IZVs03x5K59F1veqL0EJUROAdGhKsEq8qOiRiZbI+HUojPq5l0fEGOKModD9br6lObhB8zkoA==",
"dev": true,
- "dependencies": {
- "alphanum-sort": "^1.0.0",
- "browserslist": "^4.0.0",
- "cssnano-util-get-arguments": "^4.0.0",
- "postcss": "^7.0.0",
- "postcss-value-parser": "^3.0.0",
- "uniqs": "^2.0.0"
- },
+ "license": "MIT",
"engines": {
- "node": ">=6.9.0"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
}
},
- "node_modules/postcss-minify-selectors": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz",
- "integrity": "sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==",
+ "node_modules/eslint-plugin-react-dom/node_modules/@typescript-eslint/typescript-estree": {
+ "version": "8.61.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.61.1.tgz",
+ "integrity": "sha512-u+oQD3BqYWPc8YV9Zab4vaJElJuwOLPRc10Jm1o/qS+6Qwen14HCWwx0Seo4LnSn2wxea2Ik8DxPt2/FHmuhrg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "alphanum-sort": "^1.0.0",
- "has": "^1.0.0",
- "postcss": "^7.0.0",
- "postcss-selector-parser": "^3.0.0"
+ "@typescript-eslint/project-service": "8.61.1",
+ "@typescript-eslint/tsconfig-utils": "8.61.1",
+ "@typescript-eslint/types": "8.61.1",
+ "@typescript-eslint/visitor-keys": "8.61.1",
+ "debug": "^4.4.3",
+ "minimatch": "^10.2.2",
+ "semver": "^7.7.3",
+ "tinyglobby": "^0.2.15",
+ "ts-api-utils": "^2.5.0"
},
"engines": {
- "node": ">=6.9.0"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4 <6.1.0"
}
},
- "node_modules/postcss-minify-selectors/node_modules/postcss-selector-parser": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz",
- "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==",
+ "node_modules/eslint-plugin-react-dom/node_modules/@typescript-eslint/utils": {
+ "version": "8.61.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.61.1.tgz",
+ "integrity": "sha512-1+P/3Dj6jvtybE1q0HQ6yBt/gq+oKJyLdEv4HdnqasaEXRSYCAsD59mXEVQnM/ULNdQxbX77tdG4jPRjIS6knA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "dot-prop": "^5.2.0",
- "indexes-of": "^1.0.1",
- "uniq": "^1.0.1"
+ "@eslint-community/eslint-utils": "^4.9.1",
+ "@typescript-eslint/scope-manager": "8.61.1",
+ "@typescript-eslint/types": "8.61.1",
+ "@typescript-eslint/typescript-estree": "8.61.1"
},
"engines": {
- "node": ">=8"
- }
- },
- "node_modules/postcss-modules": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/postcss-modules/-/postcss-modules-3.2.2.tgz",
- "integrity": "sha512-JQ8IAqHELxC0N6tyCg2UF40pACY5oiL6UpiqqcIFRWqgDYO8B0jnxzoQ0EOpPrWXvcpu6BSbQU/3vSiq7w8Nhw==",
- "dev": true,
- "dependencies": {
- "generic-names": "^2.0.1",
- "icss-replace-symbols": "^1.1.0",
- "lodash.camelcase": "^4.3.0",
- "postcss": "^7.0.32",
- "postcss-modules-extract-imports": "^2.0.0",
- "postcss-modules-local-by-default": "^3.0.2",
- "postcss-modules-scope": "^2.2.0",
- "postcss-modules-values": "^3.0.0",
- "string-hash": "^1.1.1"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
+ "typescript": ">=4.8.4 <6.1.0"
}
},
- "node_modules/postcss-modules-extract-imports": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.1.0.tgz",
- "integrity": "sha512-zF9+UIEvtpeqMGxhpeT9XaIevQSrBBCz9fi7SwfkmjVacsSj8DY5eFVgn+wY8I9vvdDDwK5xC8Myq4UkoLFIkA==",
+ "node_modules/eslint-plugin-react-dom/node_modules/@typescript-eslint/visitor-keys": {
+ "version": "8.61.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.61.1.tgz",
+ "integrity": "sha512-6fJ9MHWtK14C1DSkiMlHUSOmrVebL7150xZJBlJiL62jjhIA4JmOq6flwBgDxIdBKKdoiZRel+dfPD5MLfny3w==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "postcss": "^6.0.1"
+ "@typescript-eslint/types": "8.61.1",
+ "eslint-visitor-keys": "^5.0.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
}
},
- "node_modules/postcss-modules-extract-imports/node_modules/has-flag": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
- "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
+ "node_modules/eslint-plugin-react-dom/node_modules/eslint-visitor-keys": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz",
+ "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==",
"dev": true,
+ "license": "Apache-2.0",
"engines": {
- "node": ">=4"
+ "node": "^20.19.0 || ^22.13.0 || >=24"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
}
},
- "node_modules/postcss-modules-extract-imports/node_modules/postcss": {
- "version": "6.0.23",
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz",
- "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==",
+ "node_modules/eslint-plugin-react-dom/node_modules/minimatch": {
+ "version": "10.2.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz",
+ "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==",
"dev": true,
+ "license": "BlueOak-1.0.0",
"dependencies": {
- "chalk": "^2.4.1",
- "source-map": "^0.6.1",
- "supports-color": "^5.4.0"
+ "brace-expansion": "^5.0.5"
},
"engines": {
- "node": ">=4.0.0"
+ "node": "18 || 20 || >=22"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
}
},
- "node_modules/postcss-modules-extract-imports/node_modules/supports-color": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
- "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "node_modules/eslint-plugin-react-hooks": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.1.1.tgz",
+ "integrity": "sha512-f2I7Gw6JbvCexzIInuSbZpfdQ44D7iqdWX01FKLvrPgqxoE7oMj8clOfto8U6vYiz4yd5oKu39rRSVOe1zRu0g==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "has-flag": "^3.0.0"
+ "@babel/core": "^7.24.4",
+ "@babel/parser": "^7.24.4",
+ "hermes-parser": "^0.25.1",
+ "zod": "^3.25.0 || ^4.0.0",
+ "zod-validation-error": "^3.5.0 || ^4.0.0"
},
"engines": {
- "node": ">=4"
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 || ^10.0.0"
}
},
- "node_modules/postcss-modules-local-by-default": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz",
- "integrity": "sha512-X4cquUPIaAd86raVrBwO8fwRfkIdbwFu7CTfEOjiZQHVQwlHRSkTgH5NLDmMm5+1hQO8u6dZ+TOOJDbay1hYpA==",
+ "node_modules/eslint-plugin-react-jsx": {
+ "version": "5.9.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react-jsx/-/eslint-plugin-react-jsx-5.9.1.tgz",
+ "integrity": "sha512-zzhCRbuXFiGMhvCrjpcwKsob0Gos8o7d28EnhGw28YapHXx1KYt0fzUDuWDoRZ2bhYhlDHzeU+l+jEgemPpaaw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "css-selector-tokenizer": "^0.7.0",
- "postcss": "^6.0.1"
- }
- },
- "node_modules/postcss-modules-local-by-default/node_modules/has-flag": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
- "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
- "dev": true,
+ "@eslint-react/ast": "5.9.1",
+ "@eslint-react/core": "5.9.1",
+ "@eslint-react/eslint": "5.9.1",
+ "@eslint-react/jsx": "5.9.1",
+ "@eslint-react/shared": "5.9.1",
+ "@typescript-eslint/types": "^8.61.1",
+ "@typescript-eslint/utils": "^8.61.1"
+ },
"engines": {
- "node": ">=4"
+ "node": ">=22.0.0"
+ },
+ "peerDependencies": {
+ "eslint": "*",
+ "typescript": "*"
}
},
- "node_modules/postcss-modules-local-by-default/node_modules/postcss": {
- "version": "6.0.23",
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz",
- "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==",
+ "node_modules/eslint-plugin-react-jsx/node_modules/@typescript-eslint/project-service": {
+ "version": "8.61.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.61.1.tgz",
+ "integrity": "sha512-PrC4JYGmR241lYnfhmKGTXkFqv8+ymbTFgSAY0fVXpY82/QkMw5TZPl+vGzuDDU2QYJk9fIDOBTntF+yDv9LEA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "chalk": "^2.4.1",
- "source-map": "^0.6.1",
- "supports-color": "^5.4.0"
+ "@typescript-eslint/tsconfig-utils": "^8.61.1",
+ "@typescript-eslint/types": "^8.61.1",
+ "debug": "^4.4.3"
},
"engines": {
- "node": ">=4.0.0"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4 <6.1.0"
}
},
- "node_modules/postcss-modules-local-by-default/node_modules/supports-color": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
- "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "node_modules/eslint-plugin-react-jsx/node_modules/@typescript-eslint/scope-manager": {
+ "version": "8.61.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.61.1.tgz",
+ "integrity": "sha512-L2bdIeoQS8FlKAvONAr20w6OcLXeB+qiDKbAooS9A0Ben+iSIkBef0FxqwKWYqt5sa0i4KJtxVyVmhMylKzF5w==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "has-flag": "^3.0.0"
+ "@typescript-eslint/types": "8.61.1",
+ "@typescript-eslint/visitor-keys": "8.61.1"
},
"engines": {
- "node": ">=4"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
}
},
- "node_modules/postcss-modules-scope": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz",
- "integrity": "sha512-LTYwnA4C1He1BKZXIx1CYiHixdSe9LWYVKadq9lK5aCCMkoOkFyZ7aigt+srfjlRplJY3gIol6KUNefdMQJdlw==",
+ "node_modules/eslint-plugin-react-jsx/node_modules/@typescript-eslint/tsconfig-utils": {
+ "version": "8.61.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.61.1.tgz",
+ "integrity": "sha512-UN/H4di+OO7EWx2ovME+8t31YO+KVnK0RRKEHR3kOt21/Ay8BOq3M1OMvWs5vNiqcFCYGYoxK3MXPZzmMUE+yg==",
"dev": true,
- "dependencies": {
- "css-selector-tokenizer": "^0.7.0",
- "postcss": "^6.0.1"
+ "license": "MIT",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4 <6.1.0"
}
},
- "node_modules/postcss-modules-scope/node_modules/has-flag": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
- "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
+ "node_modules/eslint-plugin-react-jsx/node_modules/@typescript-eslint/types": {
+ "version": "8.61.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.61.1.tgz",
+ "integrity": "sha512-G+CRlPqLv7Bz1IZVs03x5K59F1veqL0EJUROAdGhKsEq8qOiRiZbI+HUojPq5l0fEGOKModD9br6lObhB8zkoA==",
"dev": true,
+ "license": "MIT",
"engines": {
- "node": ">=4"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
}
},
- "node_modules/postcss-modules-scope/node_modules/postcss": {
- "version": "6.0.23",
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz",
- "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==",
+ "node_modules/eslint-plugin-react-jsx/node_modules/@typescript-eslint/typescript-estree": {
+ "version": "8.61.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.61.1.tgz",
+ "integrity": "sha512-u+oQD3BqYWPc8YV9Zab4vaJElJuwOLPRc10Jm1o/qS+6Qwen14HCWwx0Seo4LnSn2wxea2Ik8DxPt2/FHmuhrg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "chalk": "^2.4.1",
- "source-map": "^0.6.1",
- "supports-color": "^5.4.0"
+ "@typescript-eslint/project-service": "8.61.1",
+ "@typescript-eslint/tsconfig-utils": "8.61.1",
+ "@typescript-eslint/types": "8.61.1",
+ "@typescript-eslint/visitor-keys": "8.61.1",
+ "debug": "^4.4.3",
+ "minimatch": "^10.2.2",
+ "semver": "^7.7.3",
+ "tinyglobby": "^0.2.15",
+ "ts-api-utils": "^2.5.0"
},
"engines": {
- "node": ">=4.0.0"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4 <6.1.0"
}
},
- "node_modules/postcss-modules-scope/node_modules/supports-color": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
- "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "node_modules/eslint-plugin-react-jsx/node_modules/@typescript-eslint/utils": {
+ "version": "8.61.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.61.1.tgz",
+ "integrity": "sha512-1+P/3Dj6jvtybE1q0HQ6yBt/gq+oKJyLdEv4HdnqasaEXRSYCAsD59mXEVQnM/ULNdQxbX77tdG4jPRjIS6knA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "has-flag": "^3.0.0"
+ "@eslint-community/eslint-utils": "^4.9.1",
+ "@typescript-eslint/scope-manager": "8.61.1",
+ "@typescript-eslint/types": "8.61.1",
+ "@typescript-eslint/typescript-estree": "8.61.1"
},
"engines": {
- "node": ">=4"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
+ "typescript": ">=4.8.4 <6.1.0"
}
},
- "node_modules/postcss-modules-values": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz",
- "integrity": "sha512-i7IFaR9hlQ6/0UgFuqM6YWaCfA1Ej8WMg8A5DggnH1UGKJvTV/ugqq/KaULixzzOi3T/tF6ClBXcHGCzdd5unA==",
+ "node_modules/eslint-plugin-react-jsx/node_modules/@typescript-eslint/visitor-keys": {
+ "version": "8.61.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.61.1.tgz",
+ "integrity": "sha512-6fJ9MHWtK14C1DSkiMlHUSOmrVebL7150xZJBlJiL62jjhIA4JmOq6flwBgDxIdBKKdoiZRel+dfPD5MLfny3w==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "icss-replace-symbols": "^1.1.0",
- "postcss": "^6.0.1"
+ "@typescript-eslint/types": "8.61.1",
+ "eslint-visitor-keys": "^5.0.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
}
},
- "node_modules/postcss-modules-values/node_modules/has-flag": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
- "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
+ "node_modules/eslint-plugin-react-jsx/node_modules/eslint-visitor-keys": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz",
+ "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==",
"dev": true,
+ "license": "Apache-2.0",
"engines": {
- "node": ">=4"
+ "node": "^20.19.0 || ^22.13.0 || >=24"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
}
},
- "node_modules/postcss-modules-values/node_modules/postcss": {
- "version": "6.0.23",
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz",
- "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==",
+ "node_modules/eslint-plugin-react-jsx/node_modules/minimatch": {
+ "version": "10.2.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz",
+ "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==",
"dev": true,
+ "license": "BlueOak-1.0.0",
"dependencies": {
- "chalk": "^2.4.1",
- "source-map": "^0.6.1",
- "supports-color": "^5.4.0"
+ "brace-expansion": "^5.0.5"
},
"engines": {
- "node": ">=4.0.0"
+ "node": "18 || 20 || >=22"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
}
},
- "node_modules/postcss-modules-values/node_modules/supports-color": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
- "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "node_modules/eslint-plugin-react-naming-convention": {
+ "version": "5.9.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react-naming-convention/-/eslint-plugin-react-naming-convention-5.9.1.tgz",
+ "integrity": "sha512-Ce1oAL4Et3RB+3akTSiFIZIYCexyG+oYrGYGKps0dky5iaRy8MUskh4EXcq4yI109IkBCVt52gtybmR3Te0lrQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "has-flag": "^3.0.0"
+ "@eslint-react/ast": "5.9.1",
+ "@eslint-react/core": "5.9.1",
+ "@eslint-react/eslint": "5.9.1",
+ "@eslint-react/var": "5.9.1",
+ "@typescript-eslint/types": "^8.61.1",
+ "@typescript-eslint/utils": "^8.61.1",
+ "ts-pattern": "^5.9.0"
},
"engines": {
- "node": ">=4"
+ "node": ">=22.0.0"
+ },
+ "peerDependencies": {
+ "eslint": "*",
+ "typescript": "*"
}
},
- "node_modules/postcss-modules/node_modules/postcss-modules-extract-imports": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz",
- "integrity": "sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==",
+ "node_modules/eslint-plugin-react-naming-convention/node_modules/@typescript-eslint/project-service": {
+ "version": "8.61.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.61.1.tgz",
+ "integrity": "sha512-PrC4JYGmR241lYnfhmKGTXkFqv8+ymbTFgSAY0fVXpY82/QkMw5TZPl+vGzuDDU2QYJk9fIDOBTntF+yDv9LEA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "postcss": "^7.0.5"
+ "@typescript-eslint/tsconfig-utils": "^8.61.1",
+ "@typescript-eslint/types": "^8.61.1",
+ "debug": "^4.4.3"
},
"engines": {
- "node": ">= 6"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4 <6.1.0"
}
},
- "node_modules/postcss-modules/node_modules/postcss-modules-local-by-default": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.3.tgz",
- "integrity": "sha512-e3xDq+LotiGesympRlKNgaJ0PCzoUIdpH0dj47iWAui/kyTgh3CiAr1qP54uodmJhl6p9rN6BoNcdEDVJx9RDw==",
+ "node_modules/eslint-plugin-react-naming-convention/node_modules/@typescript-eslint/scope-manager": {
+ "version": "8.61.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.61.1.tgz",
+ "integrity": "sha512-L2bdIeoQS8FlKAvONAr20w6OcLXeB+qiDKbAooS9A0Ben+iSIkBef0FxqwKWYqt5sa0i4KJtxVyVmhMylKzF5w==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "icss-utils": "^4.1.1",
- "postcss": "^7.0.32",
- "postcss-selector-parser": "^6.0.2",
- "postcss-value-parser": "^4.1.0"
+ "@typescript-eslint/types": "8.61.1",
+ "@typescript-eslint/visitor-keys": "8.61.1"
},
"engines": {
- "node": ">= 6"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
}
},
- "node_modules/postcss-modules/node_modules/postcss-modules-scope": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz",
- "integrity": "sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ==",
+ "node_modules/eslint-plugin-react-naming-convention/node_modules/@typescript-eslint/tsconfig-utils": {
+ "version": "8.61.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.61.1.tgz",
+ "integrity": "sha512-UN/H4di+OO7EWx2ovME+8t31YO+KVnK0RRKEHR3kOt21/Ay8BOq3M1OMvWs5vNiqcFCYGYoxK3MXPZzmMUE+yg==",
"dev": true,
- "dependencies": {
- "postcss": "^7.0.6",
- "postcss-selector-parser": "^6.0.0"
- },
+ "license": "MIT",
"engines": {
- "node": ">= 6"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4 <6.1.0"
}
},
- "node_modules/postcss-modules/node_modules/postcss-modules-values": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz",
- "integrity": "sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg==",
+ "node_modules/eslint-plugin-react-naming-convention/node_modules/@typescript-eslint/types": {
+ "version": "8.61.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.61.1.tgz",
+ "integrity": "sha512-G+CRlPqLv7Bz1IZVs03x5K59F1veqL0EJUROAdGhKsEq8qOiRiZbI+HUojPq5l0fEGOKModD9br6lObhB8zkoA==",
"dev": true,
- "dependencies": {
- "icss-utils": "^4.0.0",
- "postcss": "^7.0.6"
+ "license": "MIT",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
}
},
- "node_modules/postcss-modules/node_modules/postcss-value-parser": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
- "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
- "dev": true
- },
- "node_modules/postcss-normalize-charset": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz",
- "integrity": "sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==",
+ "node_modules/eslint-plugin-react-naming-convention/node_modules/@typescript-eslint/typescript-estree": {
+ "version": "8.61.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.61.1.tgz",
+ "integrity": "sha512-u+oQD3BqYWPc8YV9Zab4vaJElJuwOLPRc10Jm1o/qS+6Qwen14HCWwx0Seo4LnSn2wxea2Ik8DxPt2/FHmuhrg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "postcss": "^7.0.0"
+ "@typescript-eslint/project-service": "8.61.1",
+ "@typescript-eslint/tsconfig-utils": "8.61.1",
+ "@typescript-eslint/types": "8.61.1",
+ "@typescript-eslint/visitor-keys": "8.61.1",
+ "debug": "^4.4.3",
+ "minimatch": "^10.2.2",
+ "semver": "^7.7.3",
+ "tinyglobby": "^0.2.15",
+ "ts-api-utils": "^2.5.0"
},
"engines": {
- "node": ">=6.9.0"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4 <6.1.0"
}
},
- "node_modules/postcss-normalize-display-values": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz",
- "integrity": "sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==",
+ "node_modules/eslint-plugin-react-naming-convention/node_modules/@typescript-eslint/utils": {
+ "version": "8.61.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.61.1.tgz",
+ "integrity": "sha512-1+P/3Dj6jvtybE1q0HQ6yBt/gq+oKJyLdEv4HdnqasaEXRSYCAsD59mXEVQnM/ULNdQxbX77tdG4jPRjIS6knA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "cssnano-util-get-match": "^4.0.0",
- "postcss": "^7.0.0",
- "postcss-value-parser": "^3.0.0"
+ "@eslint-community/eslint-utils": "^4.9.1",
+ "@typescript-eslint/scope-manager": "8.61.1",
+ "@typescript-eslint/types": "8.61.1",
+ "@typescript-eslint/typescript-estree": "8.61.1"
},
"engines": {
- "node": ">=6.9.0"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
+ "typescript": ">=4.8.4 <6.1.0"
}
},
- "node_modules/postcss-normalize-positions": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz",
- "integrity": "sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==",
+ "node_modules/eslint-plugin-react-naming-convention/node_modules/@typescript-eslint/visitor-keys": {
+ "version": "8.61.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.61.1.tgz",
+ "integrity": "sha512-6fJ9MHWtK14C1DSkiMlHUSOmrVebL7150xZJBlJiL62jjhIA4JmOq6flwBgDxIdBKKdoiZRel+dfPD5MLfny3w==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "cssnano-util-get-arguments": "^4.0.0",
- "has": "^1.0.0",
- "postcss": "^7.0.0",
- "postcss-value-parser": "^3.0.0"
+ "@typescript-eslint/types": "8.61.1",
+ "eslint-visitor-keys": "^5.0.0"
},
"engines": {
- "node": ">=6.9.0"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
}
},
- "node_modules/postcss-normalize-repeat-style": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz",
- "integrity": "sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==",
+ "node_modules/eslint-plugin-react-naming-convention/node_modules/eslint-visitor-keys": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz",
+ "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==",
"dev": true,
- "dependencies": {
- "cssnano-util-get-arguments": "^4.0.0",
- "cssnano-util-get-match": "^4.0.0",
- "postcss": "^7.0.0",
- "postcss-value-parser": "^3.0.0"
- },
+ "license": "Apache-2.0",
"engines": {
- "node": ">=6.9.0"
+ "node": "^20.19.0 || ^22.13.0 || >=24"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
}
},
- "node_modules/postcss-normalize-string": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz",
- "integrity": "sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==",
+ "node_modules/eslint-plugin-react-naming-convention/node_modules/minimatch": {
+ "version": "10.2.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz",
+ "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==",
"dev": true,
+ "license": "BlueOak-1.0.0",
"dependencies": {
- "has": "^1.0.0",
- "postcss": "^7.0.0",
- "postcss-value-parser": "^3.0.0"
+ "brace-expansion": "^5.0.5"
},
"engines": {
- "node": ">=6.9.0"
+ "node": "18 || 20 || >=22"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
}
},
- "node_modules/postcss-normalize-timing-functions": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz",
- "integrity": "sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==",
+ "node_modules/eslint-plugin-react-rsc": {
+ "version": "5.9.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react-rsc/-/eslint-plugin-react-rsc-5.9.1.tgz",
+ "integrity": "sha512-+XNAuJeGZ6ld1jknOPOeJ8gdTINZeQjw2sbBP213+QdTmwJqZLV+CrwaAN63O+8D+EIGtdnSkfpYDBcm3jiSGg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "cssnano-util-get-match": "^4.0.0",
- "postcss": "^7.0.0",
- "postcss-value-parser": "^3.0.0"
+ "@eslint-react/ast": "5.9.1",
+ "@eslint-react/core": "5.9.1",
+ "@eslint-react/eslint": "5.9.1",
+ "@eslint-react/shared": "5.9.1",
+ "@eslint-react/var": "5.9.1",
+ "@typescript-eslint/types": "^8.61.1",
+ "@typescript-eslint/utils": "^8.61.1"
},
"engines": {
- "node": ">=6.9.0"
+ "node": ">=22.0.0"
+ },
+ "peerDependencies": {
+ "eslint": "*",
+ "typescript": "*"
}
},
- "node_modules/postcss-normalize-unicode": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz",
- "integrity": "sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==",
+ "node_modules/eslint-plugin-react-rsc/node_modules/@typescript-eslint/project-service": {
+ "version": "8.61.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.61.1.tgz",
+ "integrity": "sha512-PrC4JYGmR241lYnfhmKGTXkFqv8+ymbTFgSAY0fVXpY82/QkMw5TZPl+vGzuDDU2QYJk9fIDOBTntF+yDv9LEA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "browserslist": "^4.0.0",
- "postcss": "^7.0.0",
- "postcss-value-parser": "^3.0.0"
+ "@typescript-eslint/tsconfig-utils": "^8.61.1",
+ "@typescript-eslint/types": "^8.61.1",
+ "debug": "^4.4.3"
},
"engines": {
- "node": ">=6.9.0"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4 <6.1.0"
}
},
- "node_modules/postcss-normalize-url": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz",
- "integrity": "sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==",
+ "node_modules/eslint-plugin-react-rsc/node_modules/@typescript-eslint/scope-manager": {
+ "version": "8.61.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.61.1.tgz",
+ "integrity": "sha512-L2bdIeoQS8FlKAvONAr20w6OcLXeB+qiDKbAooS9A0Ben+iSIkBef0FxqwKWYqt5sa0i4KJtxVyVmhMylKzF5w==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "is-absolute-url": "^2.0.0",
- "normalize-url": "^3.0.0",
- "postcss": "^7.0.0",
- "postcss-value-parser": "^3.0.0"
+ "@typescript-eslint/types": "8.61.1",
+ "@typescript-eslint/visitor-keys": "8.61.1"
},
"engines": {
- "node": ">=6.9.0"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
}
},
- "node_modules/postcss-normalize-url/node_modules/normalize-url": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz",
- "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==",
+ "node_modules/eslint-plugin-react-rsc/node_modules/@typescript-eslint/tsconfig-utils": {
+ "version": "8.61.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.61.1.tgz",
+ "integrity": "sha512-UN/H4di+OO7EWx2ovME+8t31YO+KVnK0RRKEHR3kOt21/Ay8BOq3M1OMvWs5vNiqcFCYGYoxK3MXPZzmMUE+yg==",
"dev": true,
+ "license": "MIT",
"engines": {
- "node": ">=6"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4 <6.1.0"
}
},
- "node_modules/postcss-normalize-whitespace": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz",
- "integrity": "sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==",
+ "node_modules/eslint-plugin-react-rsc/node_modules/@typescript-eslint/types": {
+ "version": "8.61.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.61.1.tgz",
+ "integrity": "sha512-G+CRlPqLv7Bz1IZVs03x5K59F1veqL0EJUROAdGhKsEq8qOiRiZbI+HUojPq5l0fEGOKModD9br6lObhB8zkoA==",
"dev": true,
- "dependencies": {
- "postcss": "^7.0.0",
- "postcss-value-parser": "^3.0.0"
- },
+ "license": "MIT",
"engines": {
- "node": ">=6.9.0"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
}
},
- "node_modules/postcss-ordered-values": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz",
- "integrity": "sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==",
+ "node_modules/eslint-plugin-react-rsc/node_modules/@typescript-eslint/typescript-estree": {
+ "version": "8.61.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.61.1.tgz",
+ "integrity": "sha512-u+oQD3BqYWPc8YV9Zab4vaJElJuwOLPRc10Jm1o/qS+6Qwen14HCWwx0Seo4LnSn2wxea2Ik8DxPt2/FHmuhrg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "cssnano-util-get-arguments": "^4.0.0",
- "postcss": "^7.0.0",
- "postcss-value-parser": "^3.0.0"
+ "@typescript-eslint/project-service": "8.61.1",
+ "@typescript-eslint/tsconfig-utils": "8.61.1",
+ "@typescript-eslint/types": "8.61.1",
+ "@typescript-eslint/visitor-keys": "8.61.1",
+ "debug": "^4.4.3",
+ "minimatch": "^10.2.2",
+ "semver": "^7.7.3",
+ "tinyglobby": "^0.2.15",
+ "ts-api-utils": "^2.5.0"
},
"engines": {
- "node": ">=6.9.0"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4 <6.1.0"
}
},
- "node_modules/postcss-reduce-initial": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz",
- "integrity": "sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==",
+ "node_modules/eslint-plugin-react-rsc/node_modules/@typescript-eslint/utils": {
+ "version": "8.61.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.61.1.tgz",
+ "integrity": "sha512-1+P/3Dj6jvtybE1q0HQ6yBt/gq+oKJyLdEv4HdnqasaEXRSYCAsD59mXEVQnM/ULNdQxbX77tdG4jPRjIS6knA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "browserslist": "^4.0.0",
- "caniuse-api": "^3.0.0",
- "has": "^1.0.0",
- "postcss": "^7.0.0"
+ "@eslint-community/eslint-utils": "^4.9.1",
+ "@typescript-eslint/scope-manager": "8.61.1",
+ "@typescript-eslint/types": "8.61.1",
+ "@typescript-eslint/typescript-estree": "8.61.1"
},
"engines": {
- "node": ">=6.9.0"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
+ "typescript": ">=4.8.4 <6.1.0"
}
},
- "node_modules/postcss-reduce-transforms": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz",
- "integrity": "sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==",
+ "node_modules/eslint-plugin-react-rsc/node_modules/@typescript-eslint/visitor-keys": {
+ "version": "8.61.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.61.1.tgz",
+ "integrity": "sha512-6fJ9MHWtK14C1DSkiMlHUSOmrVebL7150xZJBlJiL62jjhIA4JmOq6flwBgDxIdBKKdoiZRel+dfPD5MLfny3w==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "cssnano-util-get-match": "^4.0.0",
- "has": "^1.0.0",
- "postcss": "^7.0.0",
- "postcss-value-parser": "^3.0.0"
+ "@typescript-eslint/types": "8.61.1",
+ "eslint-visitor-keys": "^5.0.0"
},
"engines": {
- "node": ">=6.9.0"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/eslint-plugin-react-rsc/node_modules/eslint-visitor-keys": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz",
+ "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^20.19.0 || ^22.13.0 || >=24"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
}
},
- "node_modules/postcss-selector-parser": {
- "version": "6.0.13",
- "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz",
- "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==",
+ "node_modules/eslint-plugin-react-rsc/node_modules/minimatch": {
+ "version": "10.2.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz",
+ "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==",
"dev": true,
+ "license": "BlueOak-1.0.0",
"dependencies": {
- "cssesc": "^3.0.0",
- "util-deprecate": "^1.0.2"
+ "brace-expansion": "^5.0.5"
},
"engines": {
- "node": ">=4"
+ "node": "18 || 20 || >=22"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
}
},
- "node_modules/postcss-svgo": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.3.tgz",
- "integrity": "sha512-NoRbrcMWTtUghzuKSoIm6XV+sJdvZ7GZSc3wdBN0W19FTtp2ko8NqLsgoh/m9CzNhU3KLPvQmjIwtaNFkaFTvw==",
+ "node_modules/eslint-plugin-react-web-api": {
+ "version": "5.9.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react-web-api/-/eslint-plugin-react-web-api-5.9.1.tgz",
+ "integrity": "sha512-D9M6wKT1fPxAy70YebHbfU+gzYv8k9RUtODXjUJYLjxrXoq2Z7o5kjB1yAZ1vi31EzbLJ+UYzGKi4hw98iwPjg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "postcss": "^7.0.0",
- "postcss-value-parser": "^3.0.0",
- "svgo": "^1.0.0"
+ "@eslint-react/ast": "5.9.1",
+ "@eslint-react/core": "5.9.1",
+ "@eslint-react/eslint": "5.9.1",
+ "@eslint-react/shared": "5.9.1",
+ "@eslint-react/var": "5.9.1",
+ "@typescript-eslint/types": "^8.61.1",
+ "@typescript-eslint/utils": "^8.61.1",
+ "birecord": "^0.1.1",
+ "ts-pattern": "^5.9.0"
},
"engines": {
- "node": ">=6.9.0"
+ "node": ">=22.0.0"
+ },
+ "peerDependencies": {
+ "eslint": "*",
+ "typescript": "*"
}
},
- "node_modules/postcss-unique-selectors": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz",
- "integrity": "sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==",
+ "node_modules/eslint-plugin-react-web-api/node_modules/@typescript-eslint/project-service": {
+ "version": "8.61.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.61.1.tgz",
+ "integrity": "sha512-PrC4JYGmR241lYnfhmKGTXkFqv8+ymbTFgSAY0fVXpY82/QkMw5TZPl+vGzuDDU2QYJk9fIDOBTntF+yDv9LEA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "alphanum-sort": "^1.0.0",
- "postcss": "^7.0.0",
- "uniqs": "^2.0.0"
+ "@typescript-eslint/tsconfig-utils": "^8.61.1",
+ "@typescript-eslint/types": "^8.61.1",
+ "debug": "^4.4.3"
},
"engines": {
- "node": ">=6.9.0"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4 <6.1.0"
}
},
- "node_modules/postcss-value-parser": {
- "version": "3.3.1",
- "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
- "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
- "dev": true
- },
- "node_modules/posthtml": {
- "version": "0.11.6",
- "resolved": "https://registry.npmjs.org/posthtml/-/posthtml-0.11.6.tgz",
- "integrity": "sha512-C2hrAPzmRdpuL3iH0TDdQ6XCc9M7Dcc3zEW5BLerY65G4tWWszwv6nG/ksi6ul5i2mx22ubdljgktXCtNkydkw==",
+ "node_modules/eslint-plugin-react-web-api/node_modules/@typescript-eslint/scope-manager": {
+ "version": "8.61.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.61.1.tgz",
+ "integrity": "sha512-L2bdIeoQS8FlKAvONAr20w6OcLXeB+qiDKbAooS9A0Ben+iSIkBef0FxqwKWYqt5sa0i4KJtxVyVmhMylKzF5w==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "posthtml-parser": "^0.4.1",
- "posthtml-render": "^1.1.5"
+ "@typescript-eslint/types": "8.61.1",
+ "@typescript-eslint/visitor-keys": "8.61.1"
},
"engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/posthtml-parser": {
- "version": "0.4.2",
- "resolved": "https://registry.npmjs.org/posthtml-parser/-/posthtml-parser-0.4.2.tgz",
- "integrity": "sha512-BUIorsYJTvS9UhXxPTzupIztOMVNPa/HtAm9KHni9z6qEfiJ1bpOBL5DfUOL9XAc3XkLIEzBzpph+Zbm4AdRAg==",
- "dev": true,
- "dependencies": {
- "htmlparser2": "^3.9.2"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
}
},
- "node_modules/posthtml-parser/node_modules/dom-serializer": {
- "version": "0.2.2",
- "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz",
- "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==",
+ "node_modules/eslint-plugin-react-web-api/node_modules/@typescript-eslint/tsconfig-utils": {
+ "version": "8.61.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.61.1.tgz",
+ "integrity": "sha512-UN/H4di+OO7EWx2ovME+8t31YO+KVnK0RRKEHR3kOt21/Ay8BOq3M1OMvWs5vNiqcFCYGYoxK3MXPZzmMUE+yg==",
"dev": true,
- "dependencies": {
- "domelementtype": "^2.0.1",
- "entities": "^2.0.0"
+ "license": "MIT",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4 <6.1.0"
}
},
- "node_modules/posthtml-parser/node_modules/dom-serializer/node_modules/domelementtype": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz",
- "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/fb55"
- }
- ]
- },
- "node_modules/posthtml-parser/node_modules/dom-serializer/node_modules/entities": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz",
- "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==",
+ "node_modules/eslint-plugin-react-web-api/node_modules/@typescript-eslint/types": {
+ "version": "8.61.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.61.1.tgz",
+ "integrity": "sha512-G+CRlPqLv7Bz1IZVs03x5K59F1veqL0EJUROAdGhKsEq8qOiRiZbI+HUojPq5l0fEGOKModD9br6lObhB8zkoA==",
"dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
"funding": {
- "url": "https://github.com/fb55/entities?sponsor=1"
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
}
},
- "node_modules/posthtml-parser/node_modules/domelementtype": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz",
- "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==",
- "dev": true
- },
- "node_modules/posthtml-parser/node_modules/domhandler": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz",
- "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==",
+ "node_modules/eslint-plugin-react-web-api/node_modules/@typescript-eslint/typescript-estree": {
+ "version": "8.61.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.61.1.tgz",
+ "integrity": "sha512-u+oQD3BqYWPc8YV9Zab4vaJElJuwOLPRc10Jm1o/qS+6Qwen14HCWwx0Seo4LnSn2wxea2Ik8DxPt2/FHmuhrg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "domelementtype": "1"
+ "@typescript-eslint/project-service": "8.61.1",
+ "@typescript-eslint/tsconfig-utils": "8.61.1",
+ "@typescript-eslint/types": "8.61.1",
+ "@typescript-eslint/visitor-keys": "8.61.1",
+ "debug": "^4.4.3",
+ "minimatch": "^10.2.2",
+ "semver": "^7.7.3",
+ "tinyglobby": "^0.2.15",
+ "ts-api-utils": "^2.5.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4 <6.1.0"
}
},
- "node_modules/posthtml-parser/node_modules/domutils": {
- "version": "1.7.0",
- "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz",
- "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==",
+ "node_modules/eslint-plugin-react-web-api/node_modules/@typescript-eslint/utils": {
+ "version": "8.61.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.61.1.tgz",
+ "integrity": "sha512-1+P/3Dj6jvtybE1q0HQ6yBt/gq+oKJyLdEv4HdnqasaEXRSYCAsD59mXEVQnM/ULNdQxbX77tdG4jPRjIS6knA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "dom-serializer": "0",
- "domelementtype": "1"
+ "@eslint-community/eslint-utils": "^4.9.1",
+ "@typescript-eslint/scope-manager": "8.61.1",
+ "@typescript-eslint/types": "8.61.1",
+ "@typescript-eslint/typescript-estree": "8.61.1"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
+ "typescript": ">=4.8.4 <6.1.0"
}
},
- "node_modules/posthtml-parser/node_modules/entities": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz",
- "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==",
- "dev": true
- },
- "node_modules/posthtml-parser/node_modules/htmlparser2": {
- "version": "3.10.1",
- "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz",
- "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==",
+ "node_modules/eslint-plugin-react-web-api/node_modules/@typescript-eslint/visitor-keys": {
+ "version": "8.61.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.61.1.tgz",
+ "integrity": "sha512-6fJ9MHWtK14C1DSkiMlHUSOmrVebL7150xZJBlJiL62jjhIA4JmOq6flwBgDxIdBKKdoiZRel+dfPD5MLfny3w==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "domelementtype": "^1.3.1",
- "domhandler": "^2.3.0",
- "domutils": "^1.5.1",
- "entities": "^1.1.1",
- "inherits": "^2.0.1",
- "readable-stream": "^3.1.1"
- }
- },
- "node_modules/posthtml-render": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/posthtml-render/-/posthtml-render-1.4.0.tgz",
- "integrity": "sha512-W1779iVHGfq0Fvh2PROhCe2QhB8mEErgqzo1wpIt36tCgChafP+hbXIhLDOM8ePJrZcFs0vkNEtdibEWVqChqw==",
- "dev": true,
+ "@typescript-eslint/types": "8.61.1",
+ "eslint-visitor-keys": "^5.0.0"
+ },
"engines": {
- "node": ">=10"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
}
},
- "node_modules/prelude-ls": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
- "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
+ "node_modules/eslint-plugin-react-web-api/node_modules/eslint-visitor-keys": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz",
+ "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==",
"dev": true,
+ "license": "Apache-2.0",
"engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/prepend-http": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz",
- "integrity": "sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==",
- "engines": {
- "node": ">=4"
+ "node": "^20.19.0 || ^22.13.0 || >=24"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
}
},
- "node_modules/prettier": {
- "version": "3.2.5",
- "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz",
- "integrity": "sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==",
+ "node_modules/eslint-plugin-react-web-api/node_modules/minimatch": {
+ "version": "10.2.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz",
+ "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==",
"dev": true,
- "bin": {
- "prettier": "bin/prettier.cjs"
+ "license": "BlueOak-1.0.0",
+ "dependencies": {
+ "brace-expansion": "^5.0.5"
},
"engines": {
- "node": ">=14"
+ "node": "18 || 20 || >=22"
},
"funding": {
- "url": "https://github.com/prettier/prettier?sponsor=1"
- }
- },
- "node_modules/process": {
- "version": "0.11.10",
- "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
- "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==",
- "engines": {
- "node": ">= 0.6.0"
+ "url": "https://github.com/sponsors/isaacs"
}
},
- "node_modules/process-nextick-args": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
- "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
- },
- "node_modules/progress": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
- "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
+ "node_modules/eslint-plugin-react-x": {
+ "version": "5.9.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react-x/-/eslint-plugin-react-x-5.9.1.tgz",
+ "integrity": "sha512-0GwMpLdYx3HWMbDd1vqNr9VImkq34x/lQaLch2qDQmPOmi1DULL3yndl347wFhH4SbE6OUoJV2z0KCA72qnv5g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@eslint-react/ast": "5.9.1",
+ "@eslint-react/core": "5.9.1",
+ "@eslint-react/eslint": "5.9.1",
+ "@eslint-react/jsx": "5.9.1",
+ "@eslint-react/shared": "5.9.1",
+ "@eslint-react/var": "5.9.1",
+ "@typescript-eslint/scope-manager": "^8.61.1",
+ "@typescript-eslint/type-utils": "^8.61.1",
+ "@typescript-eslint/types": "^8.61.1",
+ "@typescript-eslint/typescript-estree": "^8.61.1",
+ "@typescript-eslint/utils": "^8.61.1",
+ "compare-versions": "^6.1.1",
+ "string-ts": "^2.3.1",
+ "ts-api-utils": "^2.5.0",
+ "ts-pattern": "^5.9.0"
+ },
"engines": {
- "node": ">=0.4.0"
+ "node": ">=22.0.0"
+ },
+ "peerDependencies": {
+ "eslint": "*",
+ "typescript": "*"
}
},
- "node_modules/promise": {
- "version": "7.3.1",
- "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz",
- "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==",
+ "node_modules/eslint-plugin-react-x/node_modules/@typescript-eslint/project-service": {
+ "version": "8.61.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.61.1.tgz",
+ "integrity": "sha512-PrC4JYGmR241lYnfhmKGTXkFqv8+ymbTFgSAY0fVXpY82/QkMw5TZPl+vGzuDDU2QYJk9fIDOBTntF+yDv9LEA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "asap": "~2.0.3"
+ "@typescript-eslint/tsconfig-utils": "^8.61.1",
+ "@typescript-eslint/types": "^8.61.1",
+ "debug": "^4.4.3"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4 <6.1.0"
}
},
- "node_modules/promise-retry": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz",
- "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==",
+ "node_modules/eslint-plugin-react-x/node_modules/@typescript-eslint/scope-manager": {
+ "version": "8.61.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.61.1.tgz",
+ "integrity": "sha512-L2bdIeoQS8FlKAvONAr20w6OcLXeB+qiDKbAooS9A0Ben+iSIkBef0FxqwKWYqt5sa0i4KJtxVyVmhMylKzF5w==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "err-code": "^2.0.2",
- "retry": "^0.12.0"
+ "@typescript-eslint/types": "8.61.1",
+ "@typescript-eslint/visitor-keys": "8.61.1"
},
"engines": {
- "node": ">=10"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
}
},
- "node_modules/prop-types": {
- "version": "15.8.1",
- "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",
- "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==",
+ "node_modules/eslint-plugin-react-x/node_modules/@typescript-eslint/tsconfig-utils": {
+ "version": "8.61.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.61.1.tgz",
+ "integrity": "sha512-UN/H4di+OO7EWx2ovME+8t31YO+KVnK0RRKEHR3kOt21/Ay8BOq3M1OMvWs5vNiqcFCYGYoxK3MXPZzmMUE+yg==",
"dev": true,
- "dependencies": {
- "loose-envify": "^1.4.0",
- "object-assign": "^4.1.1",
- "react-is": "^16.13.1"
+ "license": "MIT",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4 <6.1.0"
}
},
- "node_modules/proto-list": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz",
- "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==",
- "optional": true
- },
- "node_modules/proxy-addr": {
- "version": "2.0.7",
- "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
- "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
+ "node_modules/eslint-plugin-react-x/node_modules/@typescript-eslint/type-utils": {
+ "version": "8.61.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.61.1.tgz",
+ "integrity": "sha512-GYRicKmVK0C4fsKgaACaknOUAq9Oa2kwsjnpFhFcS/5p4Ht5IP9OVLbgIgcK4SRk92nVHFluurg1lumD9dBcLw==",
"dev": true,
- "peer": true,
+ "license": "MIT",
"dependencies": {
- "forwarded": "0.2.0",
- "ipaddr.js": "1.9.1"
+ "@typescript-eslint/types": "8.61.1",
+ "@typescript-eslint/typescript-estree": "8.61.1",
+ "@typescript-eslint/utils": "8.61.1",
+ "debug": "^4.4.3",
+ "ts-api-utils": "^2.5.0"
},
"engines": {
- "node": ">= 0.10"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
+ "typescript": ">=4.8.4 <6.1.0"
}
},
- "node_modules/proxy-agent": {
- "version": "6.3.1",
- "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.3.1.tgz",
- "integrity": "sha512-Rb5RVBy1iyqOtNl15Cw/llpeLH8bsb37gM1FUfKQ+Wck6xHlbAhWGUFiTRHtkjqGTA5pSHz6+0hrPW/oECihPQ==",
+ "node_modules/eslint-plugin-react-x/node_modules/@typescript-eslint/types": {
+ "version": "8.61.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.61.1.tgz",
+ "integrity": "sha512-G+CRlPqLv7Bz1IZVs03x5K59F1veqL0EJUROAdGhKsEq8qOiRiZbI+HUojPq5l0fEGOKModD9br6lObhB8zkoA==",
"dev": true,
- "dependencies": {
- "agent-base": "^7.0.2",
- "debug": "^4.3.4",
- "http-proxy-agent": "^7.0.0",
- "https-proxy-agent": "^7.0.2",
- "lru-cache": "^7.14.1",
- "pac-proxy-agent": "^7.0.1",
- "proxy-from-env": "^1.1.0",
- "socks-proxy-agent": "^8.0.2"
- },
+ "license": "MIT",
"engines": {
- "node": ">= 14"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
}
},
- "node_modules/proxy-agent/node_modules/agent-base": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz",
- "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==",
+ "node_modules/eslint-plugin-react-x/node_modules/@typescript-eslint/typescript-estree": {
+ "version": "8.61.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.61.1.tgz",
+ "integrity": "sha512-u+oQD3BqYWPc8YV9Zab4vaJElJuwOLPRc10Jm1o/qS+6Qwen14HCWwx0Seo4LnSn2wxea2Ik8DxPt2/FHmuhrg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "debug": "^4.3.4"
+ "@typescript-eslint/project-service": "8.61.1",
+ "@typescript-eslint/tsconfig-utils": "8.61.1",
+ "@typescript-eslint/types": "8.61.1",
+ "@typescript-eslint/visitor-keys": "8.61.1",
+ "debug": "^4.4.3",
+ "minimatch": "^10.2.2",
+ "semver": "^7.7.3",
+ "tinyglobby": "^0.2.15",
+ "ts-api-utils": "^2.5.0"
},
"engines": {
- "node": ">= 14"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4 <6.1.0"
}
},
- "node_modules/proxy-agent/node_modules/http-proxy-agent": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.0.tgz",
- "integrity": "sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==",
+ "node_modules/eslint-plugin-react-x/node_modules/@typescript-eslint/utils": {
+ "version": "8.61.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.61.1.tgz",
+ "integrity": "sha512-1+P/3Dj6jvtybE1q0HQ6yBt/gq+oKJyLdEv4HdnqasaEXRSYCAsD59mXEVQnM/ULNdQxbX77tdG4jPRjIS6knA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "agent-base": "^7.1.0",
- "debug": "^4.3.4"
+ "@eslint-community/eslint-utils": "^4.9.1",
+ "@typescript-eslint/scope-manager": "8.61.1",
+ "@typescript-eslint/types": "8.61.1",
+ "@typescript-eslint/typescript-estree": "8.61.1"
},
"engines": {
- "node": ">= 14"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
+ "typescript": ">=4.8.4 <6.1.0"
}
},
- "node_modules/proxy-agent/node_modules/https-proxy-agent": {
- "version": "7.0.2",
- "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.2.tgz",
- "integrity": "sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==",
+ "node_modules/eslint-plugin-react-x/node_modules/@typescript-eslint/visitor-keys": {
+ "version": "8.61.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.61.1.tgz",
+ "integrity": "sha512-6fJ9MHWtK14C1DSkiMlHUSOmrVebL7150xZJBlJiL62jjhIA4JmOq6flwBgDxIdBKKdoiZRel+dfPD5MLfny3w==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "agent-base": "^7.0.2",
- "debug": "4"
+ "@typescript-eslint/types": "8.61.1",
+ "eslint-visitor-keys": "^5.0.0"
},
"engines": {
- "node": ">= 14"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
}
},
- "node_modules/proxy-agent/node_modules/lru-cache": {
- "version": "7.18.3",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz",
- "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==",
+ "node_modules/eslint-plugin-react-x/node_modules/eslint-visitor-keys": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz",
+ "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==",
"dev": true,
+ "license": "Apache-2.0",
"engines": {
- "node": ">=12"
+ "node": "^20.19.0 || ^22.13.0 || >=24"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
}
},
- "node_modules/proxy-from-env": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
- "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="
- },
- "node_modules/prr": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz",
- "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==",
- "dev": true
- },
- "node_modules/pseudomap": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
- "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==",
- "dev": true
- },
- "node_modules/psl": {
- "version": "1.9.0",
- "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz",
- "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==",
- "dev": true
- },
- "node_modules/public-encrypt": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz",
- "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==",
+ "node_modules/eslint-plugin-react-x/node_modules/minimatch": {
+ "version": "10.2.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz",
+ "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==",
"dev": true,
+ "license": "BlueOak-1.0.0",
"dependencies": {
- "bn.js": "^4.1.0",
- "browserify-rsa": "^4.0.0",
- "create-hash": "^1.1.0",
- "parse-asn1": "^5.0.0",
- "randombytes": "^2.0.1",
- "safe-buffer": "^5.1.2"
+ "brace-expansion": "^5.0.5"
+ },
+ "engines": {
+ "node": "18 || 20 || >=22"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
}
},
- "node_modules/public-encrypt/node_modules/bn.js": {
- "version": "4.12.0",
- "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz",
- "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==",
- "dev": true
- },
- "node_modules/pump": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
- "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
- "dependencies": {
- "end-of-stream": "^1.1.0",
- "once": "^1.3.1"
+ "node_modules/eslint-plugin-simple-import-sort": {
+ "version": "13.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-simple-import-sort/-/eslint-plugin-simple-import-sort-13.0.0.tgz",
+ "integrity": "sha512-McAc+/Nlvcg4byY/CABGH8kqnefWBj8s3JA2okEtz8ixbECQgU46p0HkTUKa4YS7wvgGceimlc34p1nXqbWqtA==",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "eslint": ">=5.0.0"
}
},
- "node_modules/punycode": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
- "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==",
- "dev": true
- },
- "node_modules/puppeteer": {
- "version": "21.6.1",
- "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-21.6.1.tgz",
- "integrity": "sha512-O+pbc61oj8ln6m8EJKncrsQFmytgRyFYERtk190PeLbJn5JKpmmynn2p1PiFrlhCitAQXLJ0MOy7F0TeyCRqBg==",
+ "node_modules/eslint-plugin-unicorn": {
+ "version": "65.0.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-65.0.1.tgz",
+ "integrity": "sha512-daCrQrgxOoOz2uMPWB3Y3vvv/5q+ncwICI8IjoebiwtW87CaY4tAN5EEiRXTYVnf7qi1v1BGBdHOSnZLV0rx6A==",
"dev": true,
- "hasInstallScript": true,
+ "license": "MIT",
"dependencies": {
- "@puppeteer/browsers": "1.9.0",
- "cosmiconfig": "8.3.6",
- "puppeteer-core": "21.6.1"
- },
- "bin": {
- "puppeteer": "lib/esm/puppeteer/node/cli.js"
+ "@babel/helper-validator-identifier": "^7.28.5",
+ "@eslint-community/eslint-utils": "^4.9.1",
+ "change-case": "^5.4.4",
+ "ci-info": "^4.4.0",
+ "core-js-compat": "^3.49.0",
+ "detect-indent": "^7.0.2",
+ "find-up-simple": "^1.0.1",
+ "globals": "^17.4.0",
+ "indent-string": "^5.0.0",
+ "is-builtin-module": "^5.0.0",
+ "jsesc": "^3.1.0",
+ "pluralize": "^8.0.0",
+ "regjsparser": "^0.13.0",
+ "semver": "^7.7.4",
+ "strip-indent": "^4.1.1"
},
"engines": {
- "node": ">=16.13.2"
+ "node": "^20.10.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/eslint-plugin-unicorn?sponsor=1"
+ },
+ "peerDependencies": {
+ "eslint": ">=9.38.0"
}
},
- "node_modules/puppeteer-core": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-5.5.0.tgz",
- "integrity": "sha512-tlA+1n+ziW/Db03hVV+bAecDKse8ihFRXYiEypBe9IlLRvOCzYFG6qrCMBYK34HO/Q/Ecjc+tvkHRAfLVH+NgQ==",
+ "node_modules/eslint-scope": {
+ "version": "9.1.2",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-9.1.2.tgz",
+ "integrity": "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==",
"dev": true,
+ "license": "BSD-2-Clause",
"dependencies": {
- "debug": "^4.1.0",
- "devtools-protocol": "0.0.818844",
- "extract-zip": "^2.0.0",
- "https-proxy-agent": "^4.0.0",
- "node-fetch": "^2.6.1",
- "pkg-dir": "^4.2.0",
- "progress": "^2.0.1",
- "proxy-from-env": "^1.0.0",
- "rimraf": "^3.0.2",
- "tar-fs": "^2.0.0",
- "unbzip2-stream": "^1.3.3",
- "ws": "^7.2.3"
+ "@types/esrecurse": "^4.3.1",
+ "@types/estree": "^1.0.8",
+ "esrecurse": "^4.3.0",
+ "estraverse": "^5.2.0"
},
"engines": {
- "node": ">=10.18.1"
+ "node": "^20.19.0 || ^22.13.0 || >=24"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
}
},
- "node_modules/puppeteer-core/node_modules/agent-base": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-5.1.1.tgz",
- "integrity": "sha512-TMeqbNl2fMW0nMjTEPOwe3J/PRFP4vqeoNuQMG0HlMrtm5QxKqdvAkZ1pRBQ/ulIyDD5Yq0nJ7YbdD8ey0TO3g==",
+ "node_modules/eslint-visitor-keys": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz",
+ "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==",
"dev": true,
+ "license": "Apache-2.0",
"engines": {
- "node": ">= 6.0.0"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
}
},
- "node_modules/puppeteer-core/node_modules/brace-expansion": {
- "version": "1.1.11",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "node_modules/eslint/node_modules/ajv": {
+ "version": "6.15.0",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz",
+ "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
}
},
- "node_modules/puppeteer-core/node_modules/chownr": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz",
- "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==",
- "dev": true
- },
- "node_modules/puppeteer-core/node_modules/extract-zip": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz",
- "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==",
+ "node_modules/eslint/node_modules/eslint-visitor-keys": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz",
+ "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==",
"dev": true,
- "dependencies": {
- "debug": "^4.1.1",
- "get-stream": "^5.1.0",
- "yauzl": "^2.10.0"
- },
- "bin": {
- "extract-zip": "cli.js"
- },
+ "license": "Apache-2.0",
"engines": {
- "node": ">= 10.17.0"
+ "node": "^20.19.0 || ^22.13.0 || >=24"
},
- "optionalDependencies": {
- "@types/yauzl": "^2.9.1"
+ "funding": {
+ "url": "https://opencollective.com/eslint"
}
},
- "node_modules/puppeteer-core/node_modules/find-up": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
- "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+ "node_modules/eslint/node_modules/espree": {
+ "version": "11.2.0",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-11.2.0.tgz",
+ "integrity": "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==",
"dev": true,
+ "license": "BSD-2-Clause",
"dependencies": {
- "locate-path": "^5.0.0",
- "path-exists": "^4.0.0"
+ "acorn": "^8.16.0",
+ "acorn-jsx": "^5.3.2",
+ "eslint-visitor-keys": "^5.0.1"
},
"engines": {
- "node": ">=8"
+ "node": "^20.19.0 || ^22.13.0 || >=24"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
}
},
- "node_modules/puppeteer-core/node_modules/get-stream": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
- "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
+ "node_modules/eslint/node_modules/json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
"dev": true,
+ "license": "MIT"
+ },
+ "node_modules/eslint/node_modules/minimatch": {
+ "version": "10.2.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz",
+ "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==",
+ "dev": true,
+ "license": "BlueOak-1.0.0",
"dependencies": {
- "pump": "^3.0.0"
+ "brace-expansion": "^5.0.5"
},
"engines": {
- "node": ">=8"
+ "node": "18 || 20 || >=22"
},
"funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "url": "https://github.com/sponsors/isaacs"
}
},
- "node_modules/puppeteer-core/node_modules/glob": {
- "version": "7.2.3",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
- "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "node_modules/espree": {
+ "version": "10.4.0",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz",
+ "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==",
"dev": true,
+ "license": "BSD-2-Clause",
"dependencies": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.1.1",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
+ "acorn": "^8.15.0",
+ "acorn-jsx": "^5.3.2",
+ "eslint-visitor-keys": "^4.2.1"
},
"engines": {
- "node": "*"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
"funding": {
- "url": "https://github.com/sponsors/isaacs"
+ "url": "https://opencollective.com/eslint"
}
},
- "node_modules/puppeteer-core/node_modules/https-proxy-agent": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-4.0.0.tgz",
- "integrity": "sha512-zoDhWrkR3of1l9QAL8/scJZyLu8j/gBkcwcaQOZh7Gyh/+uJQzGVETdgT30akuwkpL8HTRfssqI3BZuV18teDg==",
- "dev": true,
- "dependencies": {
- "agent-base": "5",
- "debug": "4"
+ "node_modules/esprima": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+ "license": "BSD-2-Clause",
+ "bin": {
+ "esparse": "bin/esparse.js",
+ "esvalidate": "bin/esvalidate.js"
},
"engines": {
- "node": ">= 6.0.0"
+ "node": ">=4"
}
},
- "node_modules/puppeteer-core/node_modules/locate-path": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
- "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+ "node_modules/esquery": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz",
+ "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==",
"dev": true,
+ "license": "BSD-3-Clause",
"dependencies": {
- "p-locate": "^4.1.0"
+ "estraverse": "^5.1.0"
},
"engines": {
- "node": ">=8"
+ "node": ">=0.10"
}
},
- "node_modules/puppeteer-core/node_modules/minimatch": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
- "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "node_modules/esrecurse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+ "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
"dev": true,
+ "license": "BSD-2-Clause",
"dependencies": {
- "brace-expansion": "^1.1.7"
+ "estraverse": "^5.2.0"
},
"engines": {
- "node": "*"
+ "node": ">=4.0"
}
},
- "node_modules/puppeteer-core/node_modules/p-limit": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
- "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+ "node_modules/estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/estree-walker": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz",
+ "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "p-try": "^2.0.0"
- },
+ "@types/estree": "^1.0.0"
+ }
+ },
+ "node_modules/esutils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+ "license": "BSD-2-Clause",
"engines": {
- "node": ">=6"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "node": ">=0.10.0"
}
},
- "node_modules/puppeteer-core/node_modules/p-locate": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
- "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+ "node_modules/etag": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
+ "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
"dev": true,
- "dependencies": {
- "p-limit": "^2.2.0"
- },
+ "license": "MIT",
+ "peer": true,
"engines": {
- "node": ">=8"
+ "node": ">= 0.6"
}
},
- "node_modules/puppeteer-core/node_modules/pkg-dir": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
- "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
+ "node_modules/event-target-shim": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz",
+ "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==",
"dev": true,
- "dependencies": {
- "find-up": "^4.0.0"
- },
+ "license": "MIT",
"engines": {
- "node": ">=8"
+ "node": ">=6"
}
},
- "node_modules/puppeteer-core/node_modules/rimraf": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
- "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+ "node_modules/events": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
+ "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==",
"dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.8.x"
+ }
+ },
+ "node_modules/events-universal": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/events-universal/-/events-universal-1.0.1.tgz",
+ "integrity": "sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==",
+ "license": "Apache-2.0",
"dependencies": {
- "glob": "^7.1.3"
- },
- "bin": {
- "rimraf": "bin.js"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
+ "bare-events": "^2.7.0"
}
},
- "node_modules/puppeteer-core/node_modules/tar-fs": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz",
- "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==",
+ "node_modules/expect-type": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.3.0.tgz",
+ "integrity": "sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==",
"dev": true,
- "dependencies": {
- "chownr": "^1.1.1",
- "mkdirp-classic": "^0.5.2",
- "pump": "^3.0.0",
- "tar-stream": "^2.1.4"
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=12.0.0"
}
},
- "node_modules/puppeteer-core/node_modules/tar-stream": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz",
- "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==",
+ "node_modules/exponential-backoff": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.3.tgz",
+ "integrity": "sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==",
+ "dev": true,
+ "license": "Apache-2.0"
+ },
+ "node_modules/express": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz",
+ "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==",
"dev": true,
+ "license": "MIT",
+ "peer": true,
"dependencies": {
- "bl": "^4.0.3",
- "end-of-stream": "^1.4.1",
- "fs-constants": "^1.0.0",
- "inherits": "^2.0.3",
- "readable-stream": "^3.1.1"
+ "accepts": "^2.0.0",
+ "body-parser": "^2.2.1",
+ "content-disposition": "^1.0.0",
+ "content-type": "^1.0.5",
+ "cookie": "^0.7.1",
+ "cookie-signature": "^1.2.1",
+ "debug": "^4.4.0",
+ "depd": "^2.0.0",
+ "encodeurl": "^2.0.0",
+ "escape-html": "^1.0.3",
+ "etag": "^1.8.1",
+ "finalhandler": "^2.1.0",
+ "fresh": "^2.0.0",
+ "http-errors": "^2.0.0",
+ "merge-descriptors": "^2.0.0",
+ "mime-types": "^3.0.0",
+ "on-finished": "^2.4.1",
+ "once": "^1.4.0",
+ "parseurl": "^1.3.3",
+ "proxy-addr": "^2.0.7",
+ "qs": "^6.14.0",
+ "range-parser": "^1.2.1",
+ "router": "^2.2.0",
+ "send": "^1.1.0",
+ "serve-static": "^2.2.0",
+ "statuses": "^2.0.1",
+ "type-is": "^2.0.1",
+ "vary": "^1.1.2"
},
"engines": {
- "node": ">=6"
+ "node": ">= 18"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
}
},
- "node_modules/puppeteer-core/node_modules/ws": {
- "version": "7.5.9",
- "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz",
- "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==",
- "dev": true,
- "engines": {
- "node": ">=8.3.0"
+ "node_modules/extract-zip": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz",
+ "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==",
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "debug": "^4.1.1",
+ "get-stream": "^5.1.0",
+ "yauzl": "^2.10.0"
},
- "peerDependencies": {
- "bufferutil": "^4.0.1",
- "utf-8-validate": "^5.0.2"
+ "bin": {
+ "extract-zip": "cli.js"
},
- "peerDependenciesMeta": {
- "bufferutil": {
- "optional": true
- },
- "utf-8-validate": {
- "optional": true
- }
+ "engines": {
+ "node": ">= 10.17.0"
+ },
+ "optionalDependencies": {
+ "@types/yauzl": "^2.9.1"
}
},
- "node_modules/puppeteer/node_modules/cosmiconfig": {
- "version": "8.3.6",
- "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz",
- "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==",
- "dev": true,
+ "node_modules/extract-zip/node_modules/get-stream": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
+ "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
+ "license": "MIT",
"dependencies": {
- "import-fresh": "^3.3.0",
- "js-yaml": "^4.1.0",
- "parse-json": "^5.2.0",
- "path-type": "^4.0.0"
+ "pump": "^3.0.0"
},
"engines": {
- "node": ">=14"
+ "node": ">=8"
},
"funding": {
- "url": "https://github.com/sponsors/d-fischer"
- },
- "peerDependencies": {
- "typescript": ">=4.9.5"
- },
- "peerDependenciesMeta": {
- "typescript": {
- "optional": true
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/fast-fifo": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz",
+ "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==",
+ "license": "MIT"
+ },
+ "node_modules/fast-json-stable-stringify": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/fast-uri": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.2.tgz",
+ "integrity": "sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fastify"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/fastify"
+ }
+ ],
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/fast-xml-builder": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/fast-xml-builder/-/fast-xml-builder-1.2.0.tgz",
+ "integrity": "sha512-00aAWieqff+ZJhsXA4g1g7M8k+7AYoMUUHF+/zFb5U6Uv/P0Vl4QZo84/IcufzYalLuEj9928bXN9PbbFzMF0Q==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/NaturalIntelligence"
}
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "path-expression-matcher": "^1.5.0",
+ "xml-naming": "^0.1.0"
}
},
- "node_modules/puppeteer/node_modules/devtools-protocol": {
- "version": "0.0.1203626",
- "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1203626.tgz",
- "integrity": "sha512-nEzHZteIUZfGCZtTiS1fRpC8UZmsfD1SiyPvaUNvS13dvKf666OAm8YTi0+Ca3n1nLEyu49Cy4+dPWpaHFJk9g==",
- "dev": true
- },
- "node_modules/puppeteer/node_modules/parse-json": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
- "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
- "dev": true,
+ "node_modules/fast-xml-parser": {
+ "version": "5.9.2",
+ "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.9.2.tgz",
+ "integrity": "sha512-DYPkXnVSJHAGAkSBeVYhEo/seIpz2SLr9OQcX7m6lXaX3gvoB+DCKzFdZIEhZGI3I1DUhObBAUOT/v2xfoXz/w==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/NaturalIntelligence"
+ }
+ ],
+ "license": "MIT",
"dependencies": {
- "@babel/code-frame": "^7.0.0",
- "error-ex": "^1.3.1",
- "json-parse-even-better-errors": "^2.3.0",
- "lines-and-columns": "^1.1.6"
- },
- "engines": {
- "node": ">=8"
+ "@nodable/entities": "^2.2.0",
+ "fast-xml-builder": "^1.2.0",
+ "is-unsafe": "^1.0.1",
+ "path-expression-matcher": "^1.5.0",
+ "strnum": "^2.4.0",
+ "xml-naming": "^0.1.0"
},
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "bin": {
+ "fxparser": "src/cli/cli.js"
}
},
- "node_modules/puppeteer/node_modules/puppeteer-core": {
- "version": "21.6.1",
- "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-21.6.1.tgz",
- "integrity": "sha512-0chaaK/RL9S1U3bsyR4fUeUfoj51vNnjWvXgG6DcsyMjwYNpLcAThv187i1rZCo7QhJP0wZN8plQkjNyrq2h+A==",
+ "node_modules/fastest-levenshtein": {
+ "version": "1.0.16",
+ "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz",
+ "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==",
"dev": true,
- "dependencies": {
- "@puppeteer/browsers": "1.9.0",
- "chromium-bidi": "0.5.1",
- "cross-fetch": "4.0.0",
- "debug": "4.3.4",
- "devtools-protocol": "0.0.1203626",
- "ws": "8.15.1"
- },
+ "license": "MIT",
+ "peer": true,
"engines": {
- "node": ">=16.13.2"
+ "node": ">= 4.9.1"
+ }
+ },
+ "node_modules/fd-slicer": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz",
+ "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==",
+ "license": "MIT",
+ "dependencies": {
+ "pend": "~1.2.0"
}
},
- "node_modules/puppeteer/node_modules/ws": {
- "version": "8.15.1",
- "resolved": "https://registry.npmjs.org/ws/-/ws-8.15.1.tgz",
- "integrity": "sha512-W5OZiCjXEmk0yZ66ZN82beM5Sz7l7coYxpRkzS+p9PP+ToQry8szKh+61eNktr7EA9DOwvFGhfC605jDHbP6QQ==",
+ "node_modules/fdir": {
+ "version": "6.5.0",
+ "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
+ "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
"dev": true,
+ "license": "MIT",
"engines": {
- "node": ">=10.0.0"
+ "node": ">=12.0.0"
},
"peerDependencies": {
- "bufferutil": "^4.0.1",
- "utf-8-validate": ">=5.0.2"
+ "picomatch": "^3 || ^4"
},
"peerDependenciesMeta": {
- "bufferutil": {
- "optional": true
- },
- "utf-8-validate": {
+ "picomatch": {
"optional": true
}
}
},
- "node_modules/purgecss": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/purgecss/-/purgecss-2.3.0.tgz",
- "integrity": "sha512-BE5CROfVGsx2XIhxGuZAT7rTH9lLeQx/6M0P7DTXQH4IUc3BBzs9JUzt4yzGf3JrH9enkeq6YJBe9CTtkm1WmQ==",
+ "node_modules/fecha": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz",
+ "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/file-entry-cache": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz",
+ "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "commander": "^5.0.0",
- "glob": "^7.0.0",
- "postcss": "7.0.32",
- "postcss-selector-parser": "^6.0.2"
+ "flat-cache": "^4.0.0"
},
- "bin": {
- "purgecss": "bin/purgecss"
+ "engines": {
+ "node": ">=16.0.0"
}
},
- "node_modules/purgecss/node_modules/brace-expansion": {
- "version": "1.1.11",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "node_modules/filelist": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz",
+ "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==",
"dev": true,
+ "license": "Apache-2.0",
"dependencies": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
+ "minimatch": "^5.0.1"
}
},
- "node_modules/purgecss/node_modules/glob": {
- "version": "7.2.3",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
- "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "node_modules/filelist/node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
"dev": true,
- "dependencies": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.1.1",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
- },
- "engines": {
- "node": "*"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
+ "license": "MIT"
},
- "node_modules/purgecss/node_modules/has-flag": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
- "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
+ "node_modules/filelist/node_modules/brace-expansion": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz",
+ "integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==",
"dev": true,
- "engines": {
- "node": ">=4"
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0"
}
},
- "node_modules/purgecss/node_modules/minimatch": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
- "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "node_modules/filelist/node_modules/minimatch": {
+ "version": "5.1.9",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz",
+ "integrity": "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==",
"dev": true,
+ "license": "ISC",
"dependencies": {
- "brace-expansion": "^1.1.7"
+ "brace-expansion": "^2.0.1"
},
"engines": {
- "node": "*"
+ "node": ">=10"
}
},
- "node_modules/purgecss/node_modules/postcss": {
- "version": "7.0.32",
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz",
- "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==",
+ "node_modules/finalhandler": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz",
+ "integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==",
"dev": true,
+ "license": "MIT",
+ "peer": true,
"dependencies": {
- "chalk": "^2.4.2",
- "source-map": "^0.6.1",
- "supports-color": "^6.1.0"
+ "debug": "^4.4.0",
+ "encodeurl": "^2.0.0",
+ "escape-html": "^1.0.3",
+ "on-finished": "^2.4.1",
+ "parseurl": "^1.3.3",
+ "statuses": "^2.0.1"
},
"engines": {
- "node": ">=6.0.0"
+ "node": ">= 18.0.0"
},
"funding": {
- "type": "tidelift",
- "url": "https://tidelift.com/funding/github/npm/postcss"
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
}
},
- "node_modules/purgecss/node_modules/supports-color": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
- "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+ "node_modules/find-up": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
+ "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "has-flag": "^3.0.0"
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
},
"engines": {
- "node": ">=6"
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/q": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz",
- "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==",
+ "node_modules/find-up-simple": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/find-up-simple/-/find-up-simple-1.0.1.tgz",
+ "integrity": "sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ==",
"dev": true,
+ "license": "MIT",
"engines": {
- "node": ">=0.6.0",
- "teleport": ">=0.2.0"
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/qs": {
- "version": "6.11.0",
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz",
- "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
+ "node_modules/flat-cache": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz",
+ "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==",
"dev": true,
- "peer": true,
+ "license": "MIT",
"dependencies": {
- "side-channel": "^1.0.4"
+ "flatted": "^3.2.9",
+ "keyv": "^4.5.4"
},
"engines": {
- "node": ">=0.6"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "node": ">=16"
}
},
- "node_modules/querystring-es3": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz",
- "integrity": "sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==",
+ "node_modules/flatted": {
+ "version": "3.4.2",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz",
+ "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==",
"dev": true,
- "engines": {
- "node": ">=0.4.x"
- }
+ "license": "ISC"
},
- "node_modules/queue-microtask": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
- "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
+ "node_modules/fn.name": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz",
+ "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/follow-redirects": {
+ "version": "1.16.0",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz",
+ "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==",
"dev": true,
"funding": [
{
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
+ "type": "individual",
+ "url": "https://github.com/sponsors/RubenVerborgh"
}
- ]
- },
- "node_modules/queue-tick": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz",
- "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==",
- "dev": true
- },
- "node_modules/quick-lru": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz",
- "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==",
+ ],
+ "license": "MIT",
"engines": {
- "node": ">=10"
+ "node": ">=4.0"
},
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "peerDependenciesMeta": {
+ "debug": {
+ "optional": true
+ }
}
},
- "node_modules/quote-stream": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/quote-stream/-/quote-stream-1.0.2.tgz",
- "integrity": "sha512-kKr2uQ2AokadPjvTyKJQad9xELbZwYzWlNfI3Uz2j/ib5u6H9lDP7fUUR//rMycd0gv4Z5P1qXMfXR8YpIxrjQ==",
- "dev": true,
+ "node_modules/foreground-child": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz",
+ "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==",
+ "license": "ISC",
"dependencies": {
- "buffer-equal": "0.0.1",
- "minimist": "^1.1.3",
- "through2": "^2.0.0"
+ "cross-spawn": "^7.0.6",
+ "signal-exit": "^4.0.1"
},
- "bin": {
- "quote-stream": "bin/cmd.js"
- }
- },
- "node_modules/quote-stream/node_modules/buffer-equal": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-0.0.1.tgz",
- "integrity": "sha512-RgSV6InVQ9ODPdLWJ5UAqBqJBOg370Nz6ZQtRzpt6nUjc8v0St97uJ4PYC6NztqIScrAXafKM3mZPMygSe1ggA==",
- "dev": true,
"engines": {
- "node": ">=0.4.0"
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
}
},
- "node_modules/rambda": {
- "version": "7.5.0",
- "resolved": "https://registry.npmjs.org/rambda/-/rambda-7.5.0.tgz",
- "integrity": "sha512-y/M9weqWAH4iopRd7EHDEQQvpFPHj1AA3oHozE9tfITHUtTR7Z9PSlIRRG2l1GuW7sefC1cXFfIcF+cgnShdBA==",
- "dev": true
- },
- "node_modules/randombytes": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
- "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
- "dev": true,
- "dependencies": {
- "safe-buffer": "^5.1.0"
+ "node_modules/foreground-child/node_modules/signal-exit": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
+ "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
}
},
- "node_modules/randomfill": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz",
- "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==",
+ "node_modules/form-data": {
+ "version": "4.0.5",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz",
+ "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "randombytes": "^2.0.5",
- "safe-buffer": "^5.1.0"
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.8",
+ "es-set-tostringtag": "^2.1.0",
+ "hasown": "^2.0.2",
+ "mime-types": "^2.1.12"
+ },
+ "engines": {
+ "node": ">= 6"
}
},
- "node_modules/range-parser": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
- "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
+ "node_modules/form-data/node_modules/mime-db": {
+ "version": "1.52.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">= 0.6"
}
},
- "node_modules/raw-body": {
- "version": "2.5.2",
- "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz",
- "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==",
+ "node_modules/form-data/node_modules/mime-types": {
+ "version": "2.1.35",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
"dev": true,
- "peer": true,
+ "license": "MIT",
"dependencies": {
- "bytes": "3.1.2",
- "http-errors": "2.0.0",
- "iconv-lite": "0.4.24",
- "unpipe": "1.0.0"
+ "mime-db": "1.52.0"
},
"engines": {
- "node": ">= 0.8"
- }
- },
- "node_modules/rc-align": {
- "version": "4.0.15",
- "resolved": "https://registry.npmjs.org/rc-align/-/rc-align-4.0.15.tgz",
- "integrity": "sha512-wqJtVH60pka/nOX7/IspElA8gjPNQKIx/ZqJ6heATCkXpe1Zg4cPVrMD2vC96wjsFFL8WsmhPbx9tdMo1qqlIA==",
- "dependencies": {
- "@babel/runtime": "^7.10.1",
- "classnames": "2.x",
- "dom-align": "^1.7.0",
- "rc-util": "^5.26.0",
- "resize-observer-polyfill": "^1.5.1"
- },
- "peerDependencies": {
- "react": ">=16.9.0",
- "react-dom": ">=16.9.0"
- }
- },
- "node_modules/rc-cascader": {
- "version": "3.7.3",
- "resolved": "https://registry.npmjs.org/rc-cascader/-/rc-cascader-3.7.3.tgz",
- "integrity": "sha512-KBpT+kzhxDW+hxPiNk4zaKa99+Lie2/8nnI11XF+FIOPl4Bj9VlFZi61GrnWzhLGA7VEN+dTxAkNOjkySDa0dA==",
- "dependencies": {
- "@babel/runtime": "^7.12.5",
- "array-tree-filter": "^2.1.0",
- "classnames": "^2.3.1",
- "rc-select": "~14.1.0",
- "rc-tree": "~5.7.0",
- "rc-util": "^5.6.1"
- },
- "peerDependencies": {
- "react": ">=16.9.0",
- "react-dom": ">=16.9.0"
+ "node": ">= 0.6"
}
},
- "node_modules/rc-checkbox": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/rc-checkbox/-/rc-checkbox-3.0.1.tgz",
- "integrity": "sha512-k7nxDWxYF+jDI0ZcCvuvj71xONmWRVe5+1MKcERRR9MRyP3tZ69b+yUCSXXh+sik4/Hc9P5wHr2nnUoGS2zBjA==",
- "dependencies": {
- "@babel/runtime": "^7.10.1",
- "classnames": "^2.3.2",
- "rc-util": "^5.25.2"
- },
- "peerDependencies": {
- "react": ">=16.9.0",
- "react-dom": ">=16.9.0"
+ "node_modules/forwarded": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
+ "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">= 0.6"
}
},
- "node_modules/rc-collapse": {
- "version": "3.4.2",
- "resolved": "https://registry.npmjs.org/rc-collapse/-/rc-collapse-3.4.2.tgz",
- "integrity": "sha512-jpTwLgJzkhAgp2Wpi3xmbTbbYExg6fkptL67Uu5LCRVEj6wqmy0DHTjjeynsjOLsppHGHu41t1ELntZ0lEvS/Q==",
- "dependencies": {
- "@babel/runtime": "^7.10.1",
- "classnames": "2.x",
- "rc-motion": "^2.3.4",
- "rc-util": "^5.2.1",
- "shallowequal": "^1.1.0"
- },
- "peerDependencies": {
- "react": ">=16.9.0",
- "react-dom": ">=16.9.0"
+ "node_modules/fresh": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz",
+ "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">= 0.8"
}
},
- "node_modules/rc-dialog": {
- "version": "9.0.2",
- "resolved": "https://registry.npmjs.org/rc-dialog/-/rc-dialog-9.0.2.tgz",
- "integrity": "sha512-s3U+24xWUuB6Bn2Lk/Qt6rufy+uT+QvWkiFhNBcO9APLxcFFczWamaq7x9h8SCuhfc1nHcW4y8NbMsnAjNnWyg==",
+ "node_modules/fs-extra": {
+ "version": "10.1.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz",
+ "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==",
+ "license": "MIT",
"dependencies": {
- "@babel/runtime": "^7.10.1",
- "@rc-component/portal": "^1.0.0-8",
- "classnames": "^2.2.6",
- "rc-motion": "^2.3.0",
- "rc-util": "^5.21.0"
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
},
- "peerDependencies": {
- "react": ">=16.9.0",
- "react-dom": ">=16.9.0"
+ "engines": {
+ "node": ">=12"
}
},
- "node_modules/rc-drawer": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/rc-drawer/-/rc-drawer-6.3.0.tgz",
- "integrity": "sha512-uBZVb3xTAR+dBV53d/bUhTctCw3pwcwJoM7g5aX+7vgwt2zzVzoJ6aqFjYJpBlZ9zp0dVYN8fV+hykFE7c4lig==",
+ "node_modules/fs-extra/node_modules/jsonfile": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz",
+ "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==",
+ "license": "MIT",
"dependencies": {
- "@babel/runtime": "^7.10.1",
- "@rc-component/portal": "^1.1.1",
- "classnames": "^2.2.6",
- "rc-motion": "^2.6.1",
- "rc-util": "^5.21.2"
+ "universalify": "^2.0.0"
},
- "peerDependencies": {
- "react": ">=16.9.0",
- "react-dom": ">=16.9.0"
+ "optionalDependencies": {
+ "graceful-fs": "^4.1.6"
}
},
- "node_modules/rc-dropdown": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/rc-dropdown/-/rc-dropdown-4.0.1.tgz",
- "integrity": "sha512-OdpXuOcme1rm45cR0Jzgfl1otzmU4vuBVb+etXM8vcaULGokAKVpKlw8p6xzspG7jGd/XxShvq+N3VNEfk/l5g==",
- "dependencies": {
- "@babel/runtime": "^7.18.3",
- "classnames": "^2.2.6",
- "rc-trigger": "^5.3.1",
- "rc-util": "^5.17.0"
- },
- "peerDependencies": {
- "react": ">=16.11.0",
- "react-dom": ">=16.11.0"
+ "node_modules/fs-extra/node_modules/universalify": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
+ "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 10.0.0"
}
},
- "node_modules/rc-field-form": {
- "version": "1.38.2",
- "resolved": "https://registry.npmjs.org/rc-field-form/-/rc-field-form-1.38.2.tgz",
- "integrity": "sha512-O83Oi1qPyEv31Sg+Jwvsj6pXc8uQI2BtIAkURr5lvEYHVggXJhdU/nynK8wY1gbw0qR48k731sN5ON4egRCROA==",
- "dependencies": {
- "@babel/runtime": "^7.18.0",
- "async-validator": "^4.1.0",
- "rc-util": "^5.32.2"
- },
+ "node_modules/fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/fsevents": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
"engines": {
- "node": ">=8.x"
- },
- "peerDependencies": {
- "react": ">=16.9.0",
- "react-dom": ">=16.9.0"
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
}
},
- "node_modules/rc-image": {
- "version": "5.13.0",
- "resolved": "https://registry.npmjs.org/rc-image/-/rc-image-5.13.0.tgz",
- "integrity": "sha512-iZTOmw5eWo2+gcrJMMcnd7SsxVHl3w5xlyCgsULUdJhJbnuI8i/AL0tVOsE7aLn9VfOh1qgDT3mC2G75/c7mqg==",
+ "node_modules/ftp-response-parser": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/ftp-response-parser/-/ftp-response-parser-1.0.1.tgz",
+ "integrity": "sha512-++Ahlo2hs/IC7UVQzjcSAfeUpCwTTzs4uvG5XfGnsinIFkWUYF4xWwPd5qZuK8MJrmUIxFMuHcfqaosCDjvIWw==",
+ "dev": true,
"dependencies": {
- "@babel/runtime": "^7.11.2",
- "@rc-component/portal": "^1.0.2",
- "classnames": "^2.2.6",
- "rc-dialog": "~9.0.0",
- "rc-motion": "^2.6.2",
- "rc-util": "^5.0.6"
+ "readable-stream": "^1.0.31"
},
- "peerDependencies": {
- "react": ">=16.9.0",
- "react-dom": ">=16.9.0"
+ "engines": {
+ "node": ">=0.8.0"
}
},
- "node_modules/rc-input": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/rc-input/-/rc-input-0.1.4.tgz",
- "integrity": "sha512-FqDdNz+fV2dKNgfXzcSLKvC+jEs1709t7nD+WdfjrdSaOcefpgc7BUJYadc3usaING+b7ediMTfKxuJBsEFbXA==",
+ "node_modules/ftp-response-parser/node_modules/readable-stream": {
+ "version": "1.1.14",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
+ "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/runtime": "^7.11.1",
- "classnames": "^2.2.1",
- "rc-util": "^5.18.1"
- },
- "peerDependencies": {
- "react": ">=16.0.0",
- "react-dom": ">=16.0.0"
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.1",
+ "isarray": "0.0.1",
+ "string_decoder": "~0.10.x"
}
},
- "node_modules/rc-input-number": {
- "version": "7.3.11",
- "resolved": "https://registry.npmjs.org/rc-input-number/-/rc-input-number-7.3.11.tgz",
- "integrity": "sha512-aMWPEjFeles6PQnMqP5eWpxzsvHm9rh1jQOWXExUEIxhX62Fyl/ptifLHOn17+waDG1T/YUb6flfJbvwRhHrbA==",
- "dependencies": {
- "@babel/runtime": "^7.10.1",
- "classnames": "^2.2.5",
- "rc-util": "^5.23.0"
- },
- "peerDependencies": {
- "react": ">=16.9.0",
- "react-dom": ">=16.9.0"
- }
+ "node_modules/ftp-response-parser/node_modules/string_decoder": {
+ "version": "0.10.31",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+ "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==",
+ "dev": true,
+ "license": "MIT"
},
- "node_modules/rc-mentions": {
- "version": "1.13.1",
- "resolved": "https://registry.npmjs.org/rc-mentions/-/rc-mentions-1.13.1.tgz",
- "integrity": "sha512-FCkaWw6JQygtOz0+Vxz/M/NWqrWHB9LwqlY2RtcuFqWJNFK9njijOOzTSsBGANliGufVUzx/xuPHmZPBV0+Hgw==",
- "dependencies": {
- "@babel/runtime": "^7.10.1",
- "classnames": "^2.2.6",
- "rc-menu": "~9.8.0",
- "rc-textarea": "^0.4.0",
- "rc-trigger": "^5.0.4",
- "rc-util": "^5.22.5"
- },
- "peerDependencies": {
- "react": ">=16.9.0",
- "react-dom": ">=16.9.0"
+ "node_modules/function-bind": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/rc-menu": {
- "version": "9.8.4",
- "resolved": "https://registry.npmjs.org/rc-menu/-/rc-menu-9.8.4.tgz",
- "integrity": "sha512-lmw2j8I2fhdIzHmC9ajfImfckt0WDb2KVJJBBRIsxPEw2kGkEfjLMUoB1NgiNT/Q5cC8PdjGOGQjHJIJMwyNMw==",
+ "node_modules/geckodriver": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/geckodriver/-/geckodriver-6.1.0.tgz",
+ "integrity": "sha512-ZRXLa4ZaYTTgUO4Eefw+RsQCleugU2QLb1ME7qTYxxuRj51yAhfnXaItXNs5/vUzfIaDHuZ+YnSF005hfp07nQ==",
+ "hasInstallScript": true,
+ "license": "MIT",
"dependencies": {
- "@babel/runtime": "^7.10.1",
- "classnames": "2.x",
- "rc-motion": "^2.4.3",
- "rc-overflow": "^1.2.8",
- "rc-trigger": "^5.1.2",
- "rc-util": "^5.27.0"
+ "@wdio/logger": "^9.18.0",
+ "@zip.js/zip.js": "^2.8.11",
+ "decamelize": "^6.0.1",
+ "http-proxy-agent": "^7.0.2",
+ "https-proxy-agent": "^7.0.6",
+ "modern-tar": "^0.7.2"
},
- "peerDependencies": {
- "react": ">=16.9.0",
- "react-dom": ">=16.9.0"
- }
- },
- "node_modules/rc-motion": {
- "version": "2.9.0",
- "resolved": "https://registry.npmjs.org/rc-motion/-/rc-motion-2.9.0.tgz",
- "integrity": "sha512-XIU2+xLkdIr1/h6ohPZXyPBMvOmuyFZQ/T0xnawz+Rh+gh4FINcnZmMT5UTIj6hgI0VLDjTaPeRd+smJeSPqiQ==",
- "dependencies": {
- "@babel/runtime": "^7.11.1",
- "classnames": "^2.2.1",
- "rc-util": "^5.21.0"
+ "bin": {
+ "geckodriver": "bin/geckodriver.js"
},
- "peerDependencies": {
- "react": ">=16.9.0",
- "react-dom": ">=16.9.0"
+ "engines": {
+ "node": ">=20.0.0"
}
},
- "node_modules/rc-notification": {
- "version": "4.6.1",
- "resolved": "https://registry.npmjs.org/rc-notification/-/rc-notification-4.6.1.tgz",
- "integrity": "sha512-NSmFYwrrdY3+un1GvDAJQw62Xi9LNMSsoQyo95tuaYrcad5Bn9gJUL8AREufRxSQAQnr64u3LtP3EUyLYT6bhw==",
- "dependencies": {
- "@babel/runtime": "^7.10.1",
- "classnames": "2.x",
- "rc-motion": "^2.2.0",
- "rc-util": "^5.20.1"
- },
+ "node_modules/gensync": {
+ "version": "1.0.0-beta.2",
+ "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
+ "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
+ "dev": true,
+ "license": "MIT",
"engines": {
- "node": ">=8.x"
- },
- "peerDependencies": {
- "react": ">=16.9.0",
- "react-dom": ">=16.9.0"
+ "node": ">=6.9.0"
}
},
- "node_modules/rc-overflow": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/rc-overflow/-/rc-overflow-1.3.2.tgz",
- "integrity": "sha512-nsUm78jkYAoPygDAcGZeC2VwIg/IBGSodtOY3pMof4W3M9qRJgqaDYm03ZayHlde3I6ipliAxbN0RUcGf5KOzw==",
- "dependencies": {
- "@babel/runtime": "^7.11.1",
- "classnames": "^2.2.1",
- "rc-resize-observer": "^1.0.0",
- "rc-util": "^5.37.0"
- },
- "peerDependencies": {
- "react": ">=16.9.0",
- "react-dom": ">=16.9.0"
+ "node_modules/get-caller-file": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+ "license": "ISC",
+ "engines": {
+ "node": "6.* || 8.* || >= 10.*"
}
},
- "node_modules/rc-pagination": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/rc-pagination/-/rc-pagination-3.2.0.tgz",
- "integrity": "sha512-5tIXjB670WwwcAJzAqp2J+cOBS9W3cH/WU1EiYwXljuZ4vtZXKlY2Idq8FZrnYBz8KhN3vwPo9CoV/SJS6SL1w==",
- "dependencies": {
- "@babel/runtime": "^7.10.1",
- "classnames": "^2.2.1"
+ "node_modules/get-east-asian-width": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.5.0.tgz",
+ "integrity": "sha512-CQ+bEO+Tva/qlmw24dCejulK5pMzVnUOFOijVogd3KQs07HnRIgp8TGipvCCRT06xeYEbpbgwaCxglFyiuIcmA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
},
- "peerDependencies": {
- "react": ">=16.9.0",
- "react-dom": ">=16.9.0"
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/rc-picker": {
- "version": "2.7.6",
- "resolved": "https://registry.npmjs.org/rc-picker/-/rc-picker-2.7.6.tgz",
- "integrity": "sha512-H9if/BUJUZBOhPfWcPeT15JUI3/ntrG9muzERrXDkSoWmDj4yzmBvumozpxYrHwjcKnjyDGAke68d+whWwvhHA==",
+ "node_modules/get-intrinsic": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
+ "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/runtime": "^7.10.1",
- "classnames": "^2.2.1",
- "date-fns": "2.x",
- "dayjs": "1.x",
- "moment": "^2.24.0",
- "rc-trigger": "^5.0.4",
- "rc-util": "^5.37.0",
- "shallowequal": "^1.1.0"
+ "call-bind-apply-helpers": "^1.0.2",
+ "es-define-property": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.1.1",
+ "function-bind": "^1.1.2",
+ "get-proto": "^1.0.1",
+ "gopd": "^1.2.0",
+ "has-symbols": "^1.1.0",
+ "hasown": "^2.0.2",
+ "math-intrinsics": "^1.1.0"
},
"engines": {
- "node": ">=8.x"
+ "node": ">= 0.4"
},
- "peerDependencies": {
- "react": ">=16.9.0",
- "react-dom": ">=16.9.0"
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/rc-progress": {
- "version": "3.4.2",
- "resolved": "https://registry.npmjs.org/rc-progress/-/rc-progress-3.4.2.tgz",
- "integrity": "sha512-iAGhwWU+tsayP+Jkl9T4+6rHeQTG9kDz8JAHZk4XtQOcYN5fj9H34NXNEdRdZx94VUDHMqCb1yOIvi8eJRh67w==",
- "dependencies": {
- "@babel/runtime": "^7.10.1",
- "classnames": "^2.2.6",
- "rc-util": "^5.16.1"
+ "node_modules/get-port": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/get-port/-/get-port-7.2.0.tgz",
+ "integrity": "sha512-afP4W205ONCuMoPBqcR6PSXnzX35KTcJygfJfcp+QY+uwm3p20p1YczWXhlICIzGMCxYBQcySEcOgsJcrkyobg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=16"
},
- "peerDependencies": {
- "react": ">=16.9.0",
- "react-dom": ">=16.9.0"
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/rc-rate": {
- "version": "2.9.3",
- "resolved": "https://registry.npmjs.org/rc-rate/-/rc-rate-2.9.3.tgz",
- "integrity": "sha512-2THssUSnRhtqIouQIIXqsZGzRczvp4WsH4WvGuhiwm+LG2fVpDUJliP9O1zeDOZvYfBE/Bup4SgHun/eCkbjgQ==",
+ "node_modules/get-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
+ "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/runtime": "^7.10.1",
- "classnames": "^2.2.5",
- "rc-util": "^5.0.1"
+ "dunder-proto": "^1.0.1",
+ "es-object-atoms": "^1.0.0"
},
"engines": {
- "node": ">=8.x"
- },
- "peerDependencies": {
- "react": ">=16.9.0",
- "react-dom": ">=16.9.0"
+ "node": ">= 0.4"
}
},
- "node_modules/rc-resize-observer": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/rc-resize-observer/-/rc-resize-observer-1.4.0.tgz",
- "integrity": "sha512-PnMVyRid9JLxFavTjeDXEXo65HCRqbmLBw9xX9gfC4BZiSzbLXKzW3jPz+J0P71pLbD5tBMTT+mkstV5gD0c9Q==",
+ "node_modules/get-stream": {
+ "version": "9.0.1",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-9.0.1.tgz",
+ "integrity": "sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
"dependencies": {
- "@babel/runtime": "^7.20.7",
- "classnames": "^2.2.1",
- "rc-util": "^5.38.0",
- "resize-observer-polyfill": "^1.5.1"
+ "@sec-ant/readable-stream": "^0.4.1",
+ "is-stream": "^4.0.1"
},
- "peerDependencies": {
- "react": ">=16.9.0",
- "react-dom": ">=16.9.0"
- }
- },
- "node_modules/rc-segmented": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/rc-segmented/-/rc-segmented-2.1.2.tgz",
- "integrity": "sha512-qGo1bCr83ESXpXVOCXjFe1QJlCAQXyi9KCiy8eX3rIMYlTeJr/ftySIaTnYsitL18SvWf5ZEHsfqIWoX0EMfFQ==",
- "dependencies": {
- "@babel/runtime": "^7.11.1",
- "classnames": "^2.2.1",
- "rc-motion": "^2.4.4",
- "rc-util": "^5.17.0"
+ "engines": {
+ "node": ">=18"
},
- "peerDependencies": {
- "react": ">=16.0.0",
- "react-dom": ">=16.0.0"
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/rc-select": {
- "version": "14.1.18",
- "resolved": "https://registry.npmjs.org/rc-select/-/rc-select-14.1.18.tgz",
- "integrity": "sha512-4JgY3oG2Yz68ECMUSCON7mtxuJvCSj+LJpHEg/AONaaVBxIIrmI/ZTuMJkyojall/X50YdBe5oMKqHHPNiPzEg==",
- "dependencies": {
- "@babel/runtime": "^7.10.1",
- "classnames": "2.x",
- "rc-motion": "^2.0.1",
- "rc-overflow": "^1.0.0",
- "rc-trigger": "^5.0.4",
- "rc-util": "^5.16.1",
- "rc-virtual-list": "^3.2.0"
- },
+ "node_modules/get-stream/node_modules/is-stream": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-4.0.1.tgz",
+ "integrity": "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
"engines": {
- "node": ">=8.x"
+ "node": ">=18"
},
- "peerDependencies": {
- "react": "*",
- "react-dom": "*"
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/rc-slider": {
- "version": "10.0.1",
- "resolved": "https://registry.npmjs.org/rc-slider/-/rc-slider-10.0.1.tgz",
- "integrity": "sha512-igTKF3zBet7oS/3yNiIlmU8KnZ45npmrmHlUUio8PNbIhzMcsh+oE/r2UD42Y6YD2D/s+kzCQkzQrPD6RY435Q==",
+ "node_modules/get-tsconfig": {
+ "version": "4.13.6",
+ "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.6.tgz",
+ "integrity": "sha512-shZT/QMiSHc/YBLxxOkMtgSid5HFoauqCE3/exfsEcwg1WkeqjG+V40yBbBrsD+jW2HDXcs28xOfcbm2jI8Ddw==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/runtime": "^7.10.1",
- "classnames": "^2.2.5",
- "rc-util": "^5.18.1",
- "shallowequal": "^1.1.0"
- },
- "engines": {
- "node": ">=8.x"
+ "resolve-pkg-maps": "^1.0.0"
},
- "peerDependencies": {
- "react": ">=16.9.0",
- "react-dom": ">=16.9.0"
+ "funding": {
+ "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1"
}
},
- "node_modules/rc-steps": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/rc-steps/-/rc-steps-5.0.0.tgz",
- "integrity": "sha512-9TgRvnVYirdhbV0C3syJFj9EhCRqoJAsxt4i1rED5o8/ZcSv5TLIYyo4H8MCjLPvbe2R+oBAm/IYBEtC+OS1Rw==",
+ "node_modules/get-uri": {
+ "version": "6.0.5",
+ "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.5.tgz",
+ "integrity": "sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg==",
+ "license": "MIT",
"dependencies": {
- "@babel/runtime": "^7.16.7",
- "classnames": "^2.2.3",
- "rc-util": "^5.16.1"
+ "basic-ftp": "^5.0.2",
+ "data-uri-to-buffer": "^6.0.2",
+ "debug": "^4.3.4"
},
"engines": {
- "node": ">=8.x"
- },
- "peerDependencies": {
- "react": ">=16.9.0",
- "react-dom": ">=16.9.0"
+ "node": ">= 14"
}
},
- "node_modules/rc-switch": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/rc-switch/-/rc-switch-3.2.2.tgz",
- "integrity": "sha512-+gUJClsZZzvAHGy1vZfnwySxj+MjLlGRyXKXScrtCTcmiYNPzxDFOxdQ/3pK1Kt/0POvwJ/6ALOR8gwdXGhs+A==",
+ "node_modules/glob": {
+ "version": "13.0.6",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz",
+ "integrity": "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==",
+ "dev": true,
+ "license": "BlueOak-1.0.0",
"dependencies": {
- "@babel/runtime": "^7.10.1",
- "classnames": "^2.2.1",
- "rc-util": "^5.0.1"
+ "minimatch": "^10.2.2",
+ "minipass": "^7.1.3",
+ "path-scurry": "^2.0.2"
},
- "peerDependencies": {
- "react": ">=16.9.0",
- "react-dom": ">=16.9.0"
+ "engines": {
+ "node": "18 || 20 || >=22"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
}
},
- "node_modules/rc-table": {
- "version": "7.26.0",
- "resolved": "https://registry.npmjs.org/rc-table/-/rc-table-7.26.0.tgz",
- "integrity": "sha512-0cD8e6S+DTGAt5nBZQIPFYEaIukn17sfa5uFL98faHlH/whZzD8ii3dbFL4wmUDEL4BLybhYop+QUfZJ4CPvNQ==",
+ "node_modules/glob-parent": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
+ "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
+ "dev": true,
+ "license": "ISC",
"dependencies": {
- "@babel/runtime": "^7.10.1",
- "classnames": "^2.2.5",
- "rc-resize-observer": "^1.1.0",
- "rc-util": "^5.22.5",
- "shallowequal": "^1.1.0"
+ "is-glob": "^4.0.3"
},
"engines": {
- "node": ">=8.x"
- },
- "peerDependencies": {
- "react": ">=16.9.0",
- "react-dom": ">=16.9.0"
+ "node": ">=10.13.0"
}
},
- "node_modules/rc-tabs": {
- "version": "12.5.10",
- "resolved": "https://registry.npmjs.org/rc-tabs/-/rc-tabs-12.5.10.tgz",
- "integrity": "sha512-Ay0l0jtd4eXepFH9vWBvinBjqOpqzcsJTerBGwJy435P2S90Uu38q8U/mvc1sxUEVOXX5ZCFbxcWPnfG3dH+tQ==",
+ "node_modules/glob/node_modules/minimatch": {
+ "version": "10.2.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz",
+ "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==",
+ "dev": true,
+ "license": "BlueOak-1.0.0",
"dependencies": {
- "@babel/runtime": "^7.11.2",
- "classnames": "2.x",
- "rc-dropdown": "~4.0.0",
- "rc-menu": "~9.8.0",
- "rc-motion": "^2.6.2",
- "rc-resize-observer": "^1.0.0",
- "rc-util": "^5.16.0"
+ "brace-expansion": "^5.0.5"
},
"engines": {
- "node": ">=8.x"
+ "node": "18 || 20 || >=22"
},
- "peerDependencies": {
- "react": ">=16.9.0",
- "react-dom": ">=16.9.0"
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
}
},
- "node_modules/rc-textarea": {
- "version": "0.4.7",
- "resolved": "https://registry.npmjs.org/rc-textarea/-/rc-textarea-0.4.7.tgz",
- "integrity": "sha512-IQPd1CDI3mnMlkFyzt2O4gQ2lxUsnBAeJEoZGJnkkXgORNqyM9qovdrCj9NzcRfpHgLdzaEbU3AmobNFGUznwQ==",
+ "node_modules/global-agent": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-3.0.0.tgz",
+ "integrity": "sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "optional": true,
"dependencies": {
- "@babel/runtime": "^7.10.1",
- "classnames": "^2.2.1",
- "rc-resize-observer": "^1.0.0",
- "rc-util": "^5.24.4",
- "shallowequal": "^1.1.0"
+ "boolean": "^3.0.1",
+ "es6-error": "^4.1.1",
+ "matcher": "^3.0.0",
+ "roarr": "^2.15.3",
+ "semver": "^7.3.2",
+ "serialize-error": "^7.0.1"
},
- "peerDependencies": {
- "react": ">=16.9.0",
- "react-dom": ">=16.9.0"
+ "engines": {
+ "node": ">=10.0"
}
},
- "node_modules/rc-tooltip": {
- "version": "5.2.2",
- "resolved": "https://registry.npmjs.org/rc-tooltip/-/rc-tooltip-5.2.2.tgz",
- "integrity": "sha512-jtQzU/18S6EI3lhSGoDYhPqNpWajMtS5VV/ld1LwyfrDByQpYmw/LW6U7oFXXLukjfDHQ7Ju705A82PRNFWYhg==",
- "dependencies": {
- "@babel/runtime": "^7.11.2",
- "classnames": "^2.3.1",
- "rc-trigger": "^5.0.0"
+ "node_modules/globals": {
+ "version": "17.6.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-17.6.0.tgz",
+ "integrity": "sha512-sepffkT8stwnIYbsMBpoCHJuJM5l98FUF2AnE07hfvE0m/qp3R586hw4jF4uadbhvg1ooIdzuu7CsfD2jzCaNA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
},
- "peerDependencies": {
- "react": ">=16.9.0",
- "react-dom": ">=16.9.0"
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/rc-tree": {
- "version": "5.7.12",
- "resolved": "https://registry.npmjs.org/rc-tree/-/rc-tree-5.7.12.tgz",
- "integrity": "sha512-LXA5nY2hG5koIAlHW5sgXgLpOMz+bFRbnZZ+cCg0tQs4Wv1AmY7EDi1SK7iFXhslYockbqUerQan82jljoaItg==",
+ "node_modules/globalthis": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz",
+ "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
"dependencies": {
- "@babel/runtime": "^7.10.1",
- "classnames": "2.x",
- "rc-motion": "^2.0.1",
- "rc-util": "^5.16.1",
- "rc-virtual-list": "^3.5.1"
+ "define-properties": "^1.2.1",
+ "gopd": "^1.0.1"
},
"engines": {
- "node": ">=10.x"
+ "node": ">= 0.4"
},
- "peerDependencies": {
- "react": "*",
- "react-dom": "*"
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/rc-tree-select": {
- "version": "5.5.5",
- "resolved": "https://registry.npmjs.org/rc-tree-select/-/rc-tree-select-5.5.5.tgz",
- "integrity": "sha512-k2av7jF6tW9bIO4mQhaVdV4kJ1c54oxV3/hHVU+oD251Gb5JN+m1RbJFTMf1o0rAFqkvto33rxMdpafaGKQRJw==",
- "dependencies": {
- "@babel/runtime": "^7.10.1",
- "classnames": "2.x",
- "rc-select": "~14.1.0",
- "rc-tree": "~5.7.0",
- "rc-util": "^5.16.1"
+ "node_modules/globrex": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz",
+ "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/gopd": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
+ "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
},
- "peerDependencies": {
- "react": "*",
- "react-dom": "*"
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/rc-trigger": {
- "version": "5.3.4",
- "resolved": "https://registry.npmjs.org/rc-trigger/-/rc-trigger-5.3.4.tgz",
- "integrity": "sha512-mQv+vas0TwKcjAO2izNPkqR4j86OemLRmvL2nOzdP9OWNWA1ivoTt5hzFqYNW9zACwmTezRiN8bttrC7cZzYSw==",
+ "node_modules/got": {
+ "version": "11.8.6",
+ "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz",
+ "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/runtime": "^7.18.3",
- "classnames": "^2.2.6",
- "rc-align": "^4.0.0",
- "rc-motion": "^2.0.0",
- "rc-util": "^5.19.2"
+ "@sindresorhus/is": "^4.0.0",
+ "@szmarczak/http-timer": "^4.0.5",
+ "@types/cacheable-request": "^6.0.1",
+ "@types/responselike": "^1.0.0",
+ "cacheable-lookup": "^5.0.3",
+ "cacheable-request": "^7.0.2",
+ "decompress-response": "^6.0.0",
+ "http2-wrapper": "^1.0.0-beta.5.2",
+ "lowercase-keys": "^2.0.0",
+ "p-cancelable": "^2.0.0",
+ "responselike": "^2.0.0"
},
"engines": {
- "node": ">=8.x"
+ "node": ">=10.19.0"
},
- "peerDependencies": {
- "react": ">=16.9.0",
- "react-dom": ">=16.9.0"
+ "funding": {
+ "url": "https://github.com/sindresorhus/got?sponsor=1"
}
},
- "node_modules/rc-upload": {
- "version": "4.3.5",
- "resolved": "https://registry.npmjs.org/rc-upload/-/rc-upload-4.3.5.tgz",
- "integrity": "sha512-EHlKJbhkgFSQHliTj9v/2K5aEuFwfUQgZARzD7AmAPOneZEPiCNF3n6PEWIuqz9h7oq6FuXgdR67sC5BWFxJbA==",
- "dependencies": {
- "@babel/runtime": "^7.18.3",
- "classnames": "^2.2.5",
- "rc-util": "^5.2.0"
- },
- "peerDependencies": {
- "react": ">=16.9.0",
- "react-dom": ">=16.9.0"
+ "node_modules/graceful-fs": {
+ "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==",
+ "license": "ISC"
+ },
+ "node_modules/handle-thing": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz",
+ "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "peer": true
+ },
+ "node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
}
},
- "node_modules/rc-util": {
- "version": "5.38.1",
- "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.38.1.tgz",
- "integrity": "sha512-e4ZMs7q9XqwTuhIK7zBIVFltUtMSjphuPPQXHoHlzRzNdOwUxDejo0Zls5HYaJfRKNURcsS/ceKVULlhjBrxng==",
+ "node_modules/has-property-descriptors": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
+ "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
"dependencies": {
- "@babel/runtime": "^7.18.3",
- "react-is": "^18.2.0"
+ "es-define-property": "^1.0.0"
},
- "peerDependencies": {
- "react": ">=16.9.0",
- "react-dom": ">=16.9.0"
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/rc-util/node_modules/react-is": {
- "version": "18.2.0",
- "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz",
- "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w=="
+ "node_modules/has-symbols": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
+ "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
},
- "node_modules/rc-virtual-list": {
- "version": "3.11.3",
- "resolved": "https://registry.npmjs.org/rc-virtual-list/-/rc-virtual-list-3.11.3.tgz",
- "integrity": "sha512-tu5UtrMk/AXonHwHxUogdXAWynaXsrx1i6dsgg+lOo/KJSF8oBAcprh1z5J3xgnPJD5hXxTL58F8s8onokdt0Q==",
+ "node_modules/has-tostringtag": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
+ "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "@babel/runtime": "^7.20.0",
- "classnames": "^2.2.6",
- "rc-resize-observer": "^1.0.0",
- "rc-util": "^5.36.0"
+ "has-symbols": "^1.0.3"
},
"engines": {
- "node": ">=8.x"
+ "node": ">= 0.4"
},
- "peerDependencies": {
- "react": "*",
- "react-dom": "*"
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/react": {
- "version": "18.2.0",
- "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz",
- "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==",
+ "node_modules/hasown": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz",
+ "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "loose-envify": "^1.1.0"
+ "function-bind": "^1.1.2"
},
"engines": {
- "node": ">=0.10.0"
+ "node": ">= 0.4"
}
},
- "node_modules/react-dom": {
- "version": "18.2.0",
- "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz",
- "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==",
+ "node_modules/hast-util-parse-selector": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz",
+ "integrity": "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==",
+ "license": "MIT",
"dependencies": {
- "loose-envify": "^1.1.0",
- "scheduler": "^0.23.0"
+ "@types/hast": "^3.0.0"
},
- "peerDependencies": {
- "react": "^18.2.0"
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
}
},
- "node_modules/react-i18next": {
- "version": "14.0.5",
- "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-14.0.5.tgz",
- "integrity": "sha512-5+bQSeEtgJrMBABBL5lO7jPdSNAbeAZ+MlFWDw//7FnVacuVu3l9EeWFzBQvZsKy+cihkbThWOAThEdH8YjGEw==",
+ "node_modules/hastscript": {
+ "version": "9.0.1",
+ "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-9.0.1.tgz",
+ "integrity": "sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==",
+ "license": "MIT",
"dependencies": {
- "@babel/runtime": "^7.23.9",
- "html-parse-stringify": "^3.0.1"
- },
- "peerDependencies": {
- "i18next": ">= 23.2.3",
- "react": ">= 16.8.0"
+ "@types/hast": "^3.0.0",
+ "comma-separated-tokens": "^2.0.0",
+ "hast-util-parse-selector": "^4.0.0",
+ "property-information": "^7.0.0",
+ "space-separated-tokens": "^2.0.0"
},
- "peerDependenciesMeta": {
- "react-dom": {
- "optional": true
- },
- "react-native": {
- "optional": true
- }
- }
- },
- "node_modules/react-icons": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-5.0.1.tgz",
- "integrity": "sha512-WqLZJ4bLzlhmsvme6iFdgO8gfZP17rfjYEJ2m9RsZjZ+cc4k1hTzknEz63YS1MeT50kVzoa1Nz36f4BEx+Wigw==",
- "peerDependencies": {
- "react": "*"
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
}
},
- "node_modules/react-is": {
- "version": "16.13.1",
- "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
- "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==",
- "dev": true
+ "node_modules/hermes-estree": {
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.25.1.tgz",
+ "integrity": "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==",
+ "dev": true,
+ "license": "MIT"
},
- "node_modules/react-redux": {
- "version": "9.1.0",
- "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.1.0.tgz",
- "integrity": "sha512-6qoDzIO+gbrza8h3hjMA9aq4nwVFCKFtY2iLxCtVT38Swyy2C/dJCGBXHeHLtx6qlg/8qzc2MrhOeduf5K32wQ==",
+ "node_modules/hermes-parser": {
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.25.1.tgz",
+ "integrity": "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "@types/use-sync-external-store": "^0.0.3",
- "use-sync-external-store": "^1.0.0"
- },
- "peerDependencies": {
- "@types/react": "^18.2.25",
- "react": "^18.0",
- "react-native": ">=0.69",
- "redux": "^5.0.0"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- },
- "react-native": {
- "optional": true
- },
- "redux": {
- "optional": true
- }
+ "hermes-estree": "0.25.1"
}
},
- "node_modules/react-router": {
- "version": "6.22.1",
- "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.22.1.tgz",
- "integrity": "sha512-0pdoRGwLtemnJqn1K0XHUbnKiX0S4X8CgvVVmHGOWmofESj31msHo/1YiqcJWK7Wxfq2a4uvvtS01KAQyWK/CQ==",
+ "node_modules/hosted-git-info": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz",
+ "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==",
+ "dev": true,
+ "license": "ISC",
"dependencies": {
- "@remix-run/router": "1.15.1"
+ "lru-cache": "^6.0.0"
},
"engines": {
- "node": ">=14.0.0"
- },
- "peerDependencies": {
- "react": ">=16.8"
+ "node": ">=10"
}
},
- "node_modules/react-router-dom": {
- "version": "6.22.1",
- "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.22.1.tgz",
- "integrity": "sha512-iwMyyyrbL7zkKY7MRjOVRy+TMnS/OPusaFVxM2P11x9dzSzGmLsebkCvYirGq0DWB9K9hOspHYYtDz33gE5Duw==",
+ "node_modules/hosted-git-info/node_modules/lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "dev": true,
+ "license": "ISC",
"dependencies": {
- "@remix-run/router": "1.15.1",
- "react-router": "6.22.1"
+ "yallist": "^4.0.0"
},
"engines": {
- "node": ">=14.0.0"
- },
- "peerDependencies": {
- "react": ">=16.8",
- "react-dom": ">=16.8"
+ "node": ">=10"
}
},
- "node_modules/read-config-file": {
- "version": "6.3.2",
- "resolved": "https://registry.npmjs.org/read-config-file/-/read-config-file-6.3.2.tgz",
- "integrity": "sha512-M80lpCjnE6Wt6zb98DoW8WHR09nzMSpu8XHtPkiTHrJ5Az9CybfeQhTJ8D7saeBHpGhLPIVyA8lcL6ZmdKwY6Q==",
+ "node_modules/hosted-git-info/node_modules/yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/hpack.js": {
+ "version": "2.1.6",
+ "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz",
+ "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==",
"dev": true,
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
- "config-file-ts": "^0.2.4",
- "dotenv": "^9.0.2",
- "dotenv-expand": "^5.1.0",
- "js-yaml": "^4.1.0",
- "json5": "^2.2.0",
- "lazy-val": "^1.0.4"
- },
- "engines": {
- "node": ">=12.0.0"
+ "inherits": "^2.0.1",
+ "obuf": "^1.0.0",
+ "readable-stream": "^2.0.1",
+ "wbuf": "^1.1.0"
}
},
- "node_modules/read-config-file/node_modules/dotenv": {
- "version": "9.0.2",
- "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-9.0.2.tgz",
- "integrity": "sha512-I9OvvrHp4pIARv4+x9iuewrWycX6CcZtoAu1XrzPxc5UygMJXJZYmBsynku8IkrJwgypE5DGNjDPmPRhDCptUg==",
+ "node_modules/hpack.js/node_modules/isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
"dev": true,
- "engines": {
- "node": ">=10"
- }
+ "license": "MIT",
+ "optional": true,
+ "peer": true
},
- "node_modules/read-pkg": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz",
- "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==",
+ "node_modules/hpack.js/node_modules/readable-stream": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
+ "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
"dev": true,
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
- "@types/normalize-package-data": "^2.4.0",
- "normalize-package-data": "^2.5.0",
- "parse-json": "^5.0.0",
- "type-fest": "^0.6.0"
- },
- "engines": {
- "node": ">=8"
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
}
},
- "node_modules/read-pkg/node_modules/parse-json": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
- "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
+ "node_modules/hpack.js/node_modules/string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
"dev": true,
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
- "@babel/code-frame": "^7.0.0",
- "error-ex": "^1.3.1",
- "json-parse-even-better-errors": "^2.3.0",
- "lines-and-columns": "^1.1.6"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "safe-buffer": "~5.1.0"
}
},
- "node_modules/read-pkg/node_modules/type-fest": {
- "version": "0.6.0",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz",
- "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==",
+ "node_modules/html-entities": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.6.0.tgz",
+ "integrity": "sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==",
"dev": true,
- "engines": {
- "node": ">=8"
- }
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/mdevils"
+ },
+ {
+ "type": "patreon",
+ "url": "https://patreon.com/mdevils"
+ }
+ ],
+ "license": "MIT"
},
- "node_modules/readable-stream": {
- "version": "3.6.2",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
- "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
- "dev": true,
+ "node_modules/html-parse-stringify": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/html-parse-stringify/-/html-parse-stringify-3.0.1.tgz",
+ "integrity": "sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg==",
+ "license": "MIT",
"dependencies": {
- "inherits": "^2.0.3",
- "string_decoder": "^1.1.1",
- "util-deprecate": "^1.0.1"
- },
- "engines": {
- "node": ">= 6"
+ "void-elements": "3.1.0"
}
},
- "node_modules/readdir-glob": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz",
- "integrity": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==",
- "dev": true,
+ "node_modules/htmlparser2": {
+ "version": "10.1.0",
+ "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-10.1.0.tgz",
+ "integrity": "sha512-VTZkM9GWRAtEpveh7MSF6SjjrpNVNNVJfFup7xTY3UpFtm67foy9HDVXneLtFVt4pMz5kZtgNcvCniNFb1hlEQ==",
+ "funding": [
+ "https://github.com/fb55/htmlparser2?sponsor=1",
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fb55"
+ }
+ ],
+ "license": "MIT",
"dependencies": {
- "minimatch": "^5.1.0"
+ "domelementtype": "^2.3.0",
+ "domhandler": "^5.0.3",
+ "domutils": "^3.2.2",
+ "entities": "^7.0.1"
}
},
- "node_modules/readdirp": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
- "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
- "dev": true,
- "dependencies": {
- "picomatch": "^2.2.1"
- },
+ "node_modules/htmlparser2/node_modules/entities": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz",
+ "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==",
+ "license": "BSD-2-Clause",
"engines": {
- "node": ">=8.10.0"
+ "node": ">=0.12"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
}
},
- "node_modules/recursive-copy": {
- "version": "2.0.14",
- "resolved": "https://registry.npmjs.org/recursive-copy/-/recursive-copy-2.0.14.tgz",
- "integrity": "sha512-K8WNY8f8naTpfbA+RaXmkaQuD1IeW9EgNEfyGxSqqTQukpVtoOKros9jUqbpEsSw59YOmpd8nCBgtqJZy5nvog==",
+ "node_modules/http-cache-semantics": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz",
+ "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==",
"dev": true,
- "dependencies": {
- "errno": "^0.1.2",
- "graceful-fs": "^4.1.4",
- "junk": "^1.0.1",
- "maximatch": "^0.1.0",
- "mkdirp": "^0.5.1",
- "pify": "^2.3.0",
- "promise": "^7.0.1",
- "rimraf": "^2.7.1",
- "slash": "^1.0.0"
- }
+ "license": "BSD-2-Clause"
},
- "node_modules/recursive-copy/node_modules/brace-expansion": {
- "version": "1.1.11",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "node_modules/http-deceiver": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz",
+ "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==",
"dev": true,
- "dependencies": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
- }
+ "license": "MIT",
+ "optional": true,
+ "peer": true
},
- "node_modules/recursive-copy/node_modules/glob": {
- "version": "7.2.3",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
- "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "node_modules/http-errors": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz",
+ "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==",
"dev": true,
+ "license": "MIT",
+ "peer": true,
"dependencies": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.1.1",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
+ "depd": "~2.0.0",
+ "inherits": "~2.0.4",
+ "setprototypeof": "~1.2.0",
+ "statuses": "~2.0.2",
+ "toidentifier": "~1.0.1"
},
"engines": {
- "node": "*"
+ "node": ">= 0.8"
},
"funding": {
- "url": "https://github.com/sponsors/isaacs"
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
}
},
- "node_modules/recursive-copy/node_modules/minimatch": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
- "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
- "dev": true,
+ "node_modules/http-proxy-agent": {
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz",
+ "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==",
+ "license": "MIT",
"dependencies": {
- "brace-expansion": "^1.1.7"
+ "agent-base": "^7.1.0",
+ "debug": "^4.3.4"
},
"engines": {
- "node": "*"
- }
- },
- "node_modules/recursive-copy/node_modules/mkdirp": {
- "version": "0.5.6",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz",
- "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
- "dev": true,
- "dependencies": {
- "minimist": "^1.2.6"
- },
- "bin": {
- "mkdirp": "bin/cmd.js"
+ "node": ">= 14"
}
},
- "node_modules/recursive-copy/node_modules/pify": {
+ "node_modules/http-status-codes": {
"version": "2.3.0",
- "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
- "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
+ "resolved": "https://registry.npmjs.org/http-status-codes/-/http-status-codes-2.3.0.tgz",
+ "integrity": "sha512-RJ8XvFvpPM/Dmc5SV+dC4y5PCeOhT3x1Hq0NU3rjGeg5a/CqlhZ7uudknPwZFz4aeAXDcbAyaeP7GAo9lvngtA==",
"dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
+ "license": "MIT",
+ "peer": true
},
- "node_modules/recursive-copy/node_modules/rimraf": {
- "version": "2.7.1",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
- "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
+ "node_modules/http2-wrapper": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz",
+ "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "glob": "^7.1.3"
+ "quick-lru": "^5.1.1",
+ "resolve-alpn": "^1.0.0"
},
- "bin": {
- "rimraf": "bin.js"
+ "engines": {
+ "node": ">=10.19.0"
}
},
- "node_modules/redux": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz",
- "integrity": "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w=="
- },
- "node_modules/redux-logger": {
- "version": "3.0.6",
- "resolved": "https://registry.npmjs.org/redux-logger/-/redux-logger-3.0.6.tgz",
- "integrity": "sha512-JoCIok7bg/XpqA1JqCqXFypuqBbQzGQySrhFzewB7ThcnysTO30l4VCst86AuB9T9tuT03MAA56Jw2PNhRSNCg==",
- "dev": true,
+ "node_modules/https-proxy-agent": {
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz",
+ "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==",
+ "license": "MIT",
"dependencies": {
- "deep-diff": "^0.3.5"
+ "agent-base": "^7.1.2",
+ "debug": "4"
+ },
+ "engines": {
+ "node": ">= 14"
}
},
- "node_modules/redux-thunk": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-3.1.0.tgz",
- "integrity": "sha512-NW2r5T6ksUKXCabzhL9z+h206HQw/NJkcLm1GPImRQ8IzfXwRGqjVhKJGauHirT0DAuyy6hjdnMZaRoAcy0Klw==",
+ "node_modules/i18next": {
+ "version": "26.3.1",
+ "resolved": "https://registry.npmjs.org/i18next/-/i18next-26.3.1.tgz",
+ "integrity": "sha512-txQqd5EULsqEh9OJqRH15aCaOuy/nLJyhw5EHCSKLKJE1aBbb3Zve2+uQIxgWhPm1QqUQoWyQBm2kfmmIrzkcQ==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://www.locize.com/i18next"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.locize.com"
+ }
+ ],
+ "license": "MIT",
"peerDependencies": {
- "redux": "^5.0.0"
+ "typescript": "^5 || ^6"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
}
},
- "node_modules/reflect.getprototypeof": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.4.tgz",
- "integrity": "sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw==",
+ "node_modules/i18next-fs-backend": {
+ "version": "2.6.6",
+ "resolved": "https://registry.npmjs.org/i18next-fs-backend/-/i18next-fs-backend-2.6.6.tgz",
+ "integrity": "sha512-mYGu6Nt8RIp3X/U8Y+Gej1wo5xmYWmGKLqBGMCC2OCAou5rW5epeHgHmVcw20mJs9Z9+DAPHIxQPNCgFyPRMeg==",
+ "license": "MIT"
+ },
+ "node_modules/i18next-http-backend": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/i18next-http-backend/-/i18next-http-backend-4.0.0.tgz",
+ "integrity": "sha512-EgSjO3Q1G6f2Q5oy7u9mmxuesE0oSfzAD97NFBjC8EmkK4guBSYLljM0Fng3DarMWIIkU70jfo4+mUzmyVISTA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/iconv-lite": {
+ "version": "0.7.2",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz",
+ "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==",
"dev": true,
+ "license": "MIT",
+ "peer": true,
"dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.2.0",
- "es-abstract": "^1.22.1",
- "get-intrinsic": "^1.2.1",
- "globalthis": "^1.0.3",
- "which-builtin-type": "^1.1.3"
+ "safer-buffer": ">= 2.1.2 < 3.0.0"
},
"engines": {
- "node": ">= 0.4"
+ "node": ">=0.10.0"
},
"funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
}
},
- "node_modules/regenerate": {
- "version": "1.4.2",
- "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz",
- "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==",
- "dev": true
+ "node_modules/ieee754": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
+ "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "BSD-3-Clause"
},
- "node_modules/regenerate-unicode-properties": {
- "version": "10.1.1",
- "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz",
- "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==",
+ "node_modules/ignore": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
+ "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
"dev": true,
- "dependencies": {
- "regenerate": "^1.4.2"
- },
+ "license": "MIT",
"engines": {
- "node": ">=4"
+ "node": ">= 4"
}
},
- "node_modules/regenerator-runtime": {
- "version": "0.14.1",
- "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz",
- "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw=="
- },
- "node_modules/regenerator-transform": {
- "version": "0.15.2",
- "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz",
- "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==",
+ "node_modules/immediate": {
+ "version": "3.0.6",
+ "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz",
+ "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==",
"dev": true,
- "dependencies": {
- "@babel/runtime": "^7.8.4"
+ "license": "MIT"
+ },
+ "node_modules/immer": {
+ "version": "11.1.4",
+ "resolved": "https://registry.npmjs.org/immer/-/immer-11.1.4.tgz",
+ "integrity": "sha512-XREFCPo6ksxVzP4E0ekD5aMdf8WMwmdNaz6vuvxgI40UaEiu6q3p8X52aU6GdyvLY3XXX/8R7JOTXStz/nBbRw==",
+ "license": "MIT",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/immer"
}
},
- "node_modules/regex-not": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz",
- "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==",
- "dev": true,
- "dependencies": {
- "extend-shallow": "^3.0.2",
- "safe-regex": "^1.1.0"
- },
+ "node_modules/import-meta-resolve": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.2.0.tgz",
+ "integrity": "sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
+ "license": "MIT",
"engines": {
- "node": ">=0.10.0"
+ "node": ">=0.8.19"
}
},
- "node_modules/regexp.prototype.flags": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz",
- "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==",
+ "node_modules/indent-string": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz",
+ "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==",
"dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.2.0",
- "set-function-name": "^2.0.0"
- },
+ "license": "MIT",
"engines": {
- "node": ">= 0.4"
+ "node": ">=12"
},
"funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/regexpu-core": {
- "version": "5.3.2",
- "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz",
- "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==",
+ "node_modules/index-to-position": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/index-to-position/-/index-to-position-1.2.0.tgz",
+ "integrity": "sha512-Yg7+ztRkqslMAS2iFaU+Oa4KTSidr63OsFGlOrJoW981kIYO3CGCS3wA95P1mUi/IVSJkn0D479KTJpVpvFNuw==",
"dev": true,
- "dependencies": {
- "@babel/regjsgen": "^0.8.0",
- "regenerate": "^1.4.2",
- "regenerate-unicode-properties": "^10.1.0",
- "regjsparser": "^0.9.1",
- "unicode-match-property-ecmascript": "^2.0.0",
- "unicode-match-property-value-ecmascript": "^2.1.0"
- },
+ "license": "MIT",
+ "peer": true,
"engines": {
- "node": ">=4"
- }
- },
- "node_modules/regjsparser": {
- "version": "0.9.1",
- "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz",
- "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==",
- "dev": true,
- "dependencies": {
- "jsesc": "~0.5.0"
+ "node": ">=18"
},
- "bin": {
- "regjsparser": "bin/parser"
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/regjsparser/node_modules/jsesc": {
- "version": "0.5.0",
- "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
- "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==",
+ "node_modules/inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
+ "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.",
"dev": true,
- "bin": {
- "jsesc": "bin/jsesc"
+ "license": "ISC",
+ "dependencies": {
+ "once": "^1.3.0",
+ "wrappy": "1"
}
},
- "node_modules/relateurl": {
- "version": "0.2.7",
- "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz",
- "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==",
+ "node_modules/inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
"dev": true,
- "engines": {
- "node": ">= 0.10"
- }
- },
- "node_modules/remove-trailing-separator": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz",
- "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==",
- "dev": true
+ "license": "ISC"
},
- "node_modules/repeat-element": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz",
- "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==",
- "dev": true,
+ "node_modules/ip-address": {
+ "version": "10.2.0",
+ "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.2.0.tgz",
+ "integrity": "sha512-/+S6j4E9AHvW9SWMSEY9Xfy66O5PWvVEJ08O0y5JGyEKQpojb0K0GKpz/v5HJ/G0vi3D2sjGK78119oXZeE0qA==",
+ "license": "MIT",
"engines": {
- "node": ">=0.10.0"
+ "node": ">= 12"
}
},
- "node_modules/repeat-string": {
- "version": "1.6.1",
- "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
- "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==",
+ "node_modules/ipaddr.js": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
+ "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
"dev": true,
+ "license": "MIT",
+ "peer": true,
"engines": {
- "node": ">=0.10"
+ "node": ">= 0.10"
}
},
- "node_modules/request": {
- "version": "2.88.2",
- "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz",
- "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==",
- "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142",
- "dev": true,
- "dependencies": {
- "aws-sign2": "~0.7.0",
- "aws4": "^1.8.0",
- "caseless": "~0.12.0",
- "combined-stream": "~1.0.6",
- "extend": "~3.0.2",
- "forever-agent": "~0.6.1",
- "form-data": "~2.3.2",
- "har-validator": "~5.1.3",
- "http-signature": "~1.2.0",
- "is-typedarray": "~1.0.0",
- "isstream": "~0.1.2",
- "json-stringify-safe": "~5.0.1",
- "mime-types": "~2.1.19",
- "oauth-sign": "~0.9.0",
- "performance-now": "^2.1.0",
- "qs": "~6.5.2",
- "safe-buffer": "^5.1.2",
- "tough-cookie": "~2.5.0",
- "tunnel-agent": "^0.6.0",
- "uuid": "^3.3.2"
- },
- "engines": {
- "node": ">= 6"
+ "node_modules/is-alphabetical": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz",
+ "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
}
},
- "node_modules/request-promise-core": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz",
- "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==",
- "dev": true,
+ "node_modules/is-alphanumerical": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz",
+ "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==",
+ "license": "MIT",
"dependencies": {
- "lodash": "^4.17.19"
- },
- "engines": {
- "node": ">=0.10.0"
+ "is-alphabetical": "^2.0.0",
+ "is-decimal": "^2.0.0"
},
- "peerDependencies": {
- "request": "^2.34"
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
}
},
- "node_modules/request-promise-native": {
- "version": "1.0.9",
- "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz",
- "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==",
- "deprecated": "request-promise-native has been deprecated because it extends the now deprecated request package, see https://github.com/request/request/issues/3142",
+ "node_modules/is-builtin-module": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-5.0.0.tgz",
+ "integrity": "sha512-f4RqJKBUe5rQkJ2eJEJBXSticB3hGbN9j0yxxMQFqIW89Jp9WYFtzfTcRlstDKVUTRzSOTLKRfO9vIztenwtxA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "request-promise-core": "1.1.4",
- "stealthy-require": "^1.1.1",
- "tough-cookie": "^2.3.3"
+ "builtin-modules": "^5.0.0"
},
"engines": {
- "node": ">=0.12.0"
+ "node": ">=18.20"
},
- "peerDependencies": {
- "request": "^2.34"
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/request/node_modules/form-data": {
- "version": "2.3.3",
- "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
- "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
+ "node_modules/is-bun-module": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-bun-module/-/is-bun-module-2.0.0.tgz",
+ "integrity": "sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "asynckit": "^0.4.0",
- "combined-stream": "^1.0.6",
- "mime-types": "^2.1.12"
- },
- "engines": {
- "node": ">= 0.12"
- }
- },
- "node_modules/request/node_modules/qs": {
- "version": "6.5.3",
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz",
- "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==",
- "dev": true,
- "engines": {
- "node": ">=0.6"
+ "semver": "^7.7.1"
}
},
- "node_modules/request/node_modules/uuid": {
- "version": "3.4.0",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
- "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==",
- "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.",
- "dev": true,
- "bin": {
- "uuid": "bin/uuid"
+ "node_modules/is-decimal": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz",
+ "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
}
},
- "node_modules/require-directory": {
+ "node_modules/is-extglob": {
"version": "2.1.1",
- "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
- "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=0.10.0"
}
},
- "node_modules/require-from-string": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
- "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
- "dev": true,
- "peer": true,
+ "node_modules/is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "license": "MIT",
"engines": {
- "node": ">=0.10.0"
+ "node": ">=8"
}
},
- "node_modules/reselect": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/reselect/-/reselect-5.0.1.tgz",
- "integrity": "sha512-D72j2ubjgHpvuCiORWkOUxndHJrxDaSolheiz5CO+roz8ka97/4msh2E8F5qay4GawR5vzBt5MkbDHT+Rdy/Wg=="
- },
- "node_modules/resize-observer-polyfill": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz",
- "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg=="
- },
- "node_modules/resolve": {
- "version": "1.22.8",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz",
- "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==",
+ "node_modules/is-glob": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "is-core-module": "^2.13.0",
- "path-parse": "^1.0.7",
- "supports-preserve-symlinks-flag": "^1.0.0"
- },
- "bin": {
- "resolve": "bin/resolve"
+ "is-extglob": "^2.1.1"
},
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "node_modules/resolve-alpn": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz",
- "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g=="
+ "node_modules/is-hexadecimal": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz",
+ "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
},
- "node_modules/resolve-from": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
- "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
+ "node_modules/is-interactive": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz",
+ "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==",
"dev": true,
+ "license": "MIT",
+ "peer": true,
"engines": {
"node": ">=8"
}
},
- "node_modules/resolve-url": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
- "integrity": "sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==",
- "deprecated": "https://github.com/lydell/resolve-url#deprecated",
- "dev": true
- },
- "node_modules/responselike": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz",
- "integrity": "sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==",
- "dependencies": {
- "lowercase-keys": "^1.0.0"
- }
+ "node_modules/is-mobile": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/is-mobile/-/is-mobile-5.0.0.tgz",
+ "integrity": "sha512-Tz/yndySvLAEXh+Uk8liFCxOwVH6YutuR74utvOcu7I9Di+DwM0mtdPVZNaVvvBUM2OXxne/NhOs1zAO7riusQ==",
+ "license": "MIT"
},
- "node_modules/resq": {
- "version": "1.11.0",
- "resolved": "https://registry.npmjs.org/resq/-/resq-1.11.0.tgz",
- "integrity": "sha512-G10EBz+zAAy3zUd/CDoBbXRL6ia9kOo3xRHrMDsHljI0GDkhYlyjwoCx5+3eCC4swi1uCoZQhskuJkj7Gp57Bw==",
+ "node_modules/is-promise": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz",
+ "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==",
"dev": true,
- "dependencies": {
- "fast-deep-equal": "^2.0.1"
- }
+ "license": "MIT",
+ "peer": true
},
- "node_modules/resq/node_modules/fast-deep-equal": {
+ "node_modules/is-stream": {
"version": "2.0.1",
- "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz",
- "integrity": "sha512-bCK/2Z4zLidyB4ReuIsvALH6w31YfAQDmXMqMx6FyfHqvBxtjC0eRumeSu4Bs3XtXwpyIywtSTrVT99BxY1f9w==",
- "dev": true
- },
- "node_modules/restore-cursor": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz",
- "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
+ "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
"dev": true,
+ "license": "MIT",
"peer": true,
- "dependencies": {
- "onetime": "^5.1.0",
- "signal-exit": "^3.0.2"
- },
"engines": {
"node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/restore-cursor/node_modules/signal-exit": {
- "version": "3.0.7",
- "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
- "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
- "dev": true,
- "peer": true
+ "node_modules/is-typedarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
+ "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==",
+ "license": "MIT"
},
- "node_modules/ret": {
- "version": "0.1.15",
- "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
- "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==",
+ "node_modules/is-unicode-supported": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz",
+ "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==",
"dev": true,
+ "license": "MIT",
+ "peer": true,
"engines": {
- "node": ">=0.12"
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/retry": {
- "version": "0.12.0",
- "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz",
- "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==",
+ "node_modules/is-unsafe": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-unsafe/-/is-unsafe-1.0.1.tgz",
+ "integrity": "sha512-CLK2+VdgERgD96EYm5lUQssZYlRg2tkZnbsxZoacmSiRxiFJ4Nk4SzjCl+Ur+v3kXIY9dTIdb3IH22y1mZ56LA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/NaturalIntelligence"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/isbinaryfile": {
+ "version": "5.0.7",
+ "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-5.0.7.tgz",
+ "integrity": "sha512-gnWD14Jh3FzS3CPhF0AxNOJ8CxqeblPTADzI38r0wt8ZyQl5edpy75myt08EG2oKvpyiqSqsx+Wkz9vtkbTqYQ==",
"dev": true,
+ "license": "MIT",
"engines": {
- "node": ">= 4"
+ "node": ">= 18.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/gjtorikian/"
}
},
- "node_modules/reusify": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
- "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
+ "node_modules/isexe": {
+ "version": "3.1.5",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.5.tgz",
+ "integrity": "sha512-6B3tLtFqtQS4ekarvLVMZ+X+VlvQekbe4taUkf/rhVO3d/h0M2rfARm/pXLcPEsjjMsFgrFgSrhQIxcSVrBz8w==",
"dev": true,
+ "license": "BlueOak-1.0.0",
"engines": {
- "iojs": ">=1.0.0",
- "node": ">=0.10.0"
+ "node": ">=18"
}
},
- "node_modules/rgb-regex": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz",
- "integrity": "sha512-gDK5mkALDFER2YLqH6imYvK6g02gpNGM4ILDZ472EwWfXZnC2ZEpoB2ECXTyOVUKuk/bPJZMzwQPBYICzP+D3w==",
- "dev": true
- },
- "node_modules/rgb2hex": {
- "version": "0.2.3",
- "resolved": "https://registry.npmjs.org/rgb2hex/-/rgb2hex-0.2.3.tgz",
- "integrity": "sha512-clEe0m1xv+Tva1B/TOepuIcvLAxP0U+sCDfgt1SX1HmI2Ahr5/Cd/nzJM1e78NKVtWdoo0s33YehpFA8UfIShQ==",
- "dev": true
- },
- "node_modules/rgba-regex": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz",
- "integrity": "sha512-zgn5OjNQXLUTdq8m17KdaicF6w89TZs8ZU8y0AYENIU6wG8GG6LLm0yLSiPY8DmaYmHdgRW8rnApjoT0fQRfMg==",
- "dev": true
- },
- "node_modules/rimraf": {
- "version": "5.0.5",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.5.tgz",
- "integrity": "sha512-CqDakW+hMe/Bz202FPEymy68P+G50RfMQK+Qo5YUqc9SPipvbGjCGKd0RSKEelbsfQuw3g5NZDSrlZZAJurH1A==",
- "dev": true,
+ "node_modules/jackspeak": {
+ "version": "3.4.3",
+ "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz",
+ "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==",
+ "license": "BlueOak-1.0.0",
"dependencies": {
- "glob": "^10.3.7"
- },
- "bin": {
- "rimraf": "dist/esm/bin.mjs"
- },
- "engines": {
- "node": ">=14"
+ "@isaacs/cliui": "^8.0.2"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
+ },
+ "optionalDependencies": {
+ "@pkgjs/parseargs": "^0.11.0"
}
},
- "node_modules/ripemd160": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz",
- "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==",
+ "node_modules/jake": {
+ "version": "10.9.4",
+ "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.4.tgz",
+ "integrity": "sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==",
"dev": true,
+ "license": "Apache-2.0",
"dependencies": {
- "hash-base": "^3.0.0",
- "inherits": "^2.0.1"
- }
- },
- "node_modules/roarr": {
- "version": "2.15.4",
- "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz",
- "integrity": "sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==",
- "optional": true,
- "dependencies": {
- "boolean": "^3.0.1",
- "detect-node": "^2.0.4",
- "globalthis": "^1.0.1",
- "json-stringify-safe": "^5.0.1",
- "semver-compare": "^1.0.0",
- "sprintf-js": "^1.1.2"
+ "async": "^3.2.6",
+ "filelist": "^1.0.4",
+ "picocolors": "^1.1.1"
+ },
+ "bin": {
+ "jake": "bin/cli.js"
},
"engines": {
- "node": ">=8.0"
+ "node": ">=10"
+ }
+ },
+ "node_modules/jiti": {
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz",
+ "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==",
+ "license": "MIT",
+ "bin": {
+ "jiti": "lib/jiti-cli.mjs"
}
},
- "node_modules/run-parallel": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
- "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
+ "node_modules/js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
"dev": true,
+ "license": "MIT"
+ },
+ "node_modules/js-yaml": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.2.0.tgz",
+ "integrity": "sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw==",
"funding": [
{
"type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
+ "url": "https://github.com/sponsors/puzrin"
},
{
- "type": "consulting",
- "url": "https://feross.org/support"
+ "type": "github",
+ "url": "https://github.com/sponsors/nodeca"
}
],
+ "license": "MIT",
"dependencies": {
- "queue-microtask": "^1.2.2"
+ "argparse": "^2.0.1"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
}
},
- "node_modules/rxjs": {
- "version": "7.8.1",
- "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz",
- "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==",
+ "node_modules/jsdoc-type-pratt-parser": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-7.2.0.tgz",
+ "integrity": "sha512-dh140MMgjyg3JhJZY/+iEzW+NO5xR2gpbDFKHqotCmexElVntw7GjWjt511+C/Ef02RU5TKYrJo/Xlzk+OLaTw==",
"dev": true,
- "dependencies": {
- "tslib": "^2.1.0"
+ "license": "MIT",
+ "engines": {
+ "node": ">=20.0.0"
}
},
- "node_modules/safe-array-concat": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.1.tgz",
- "integrity": "sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==",
+ "node_modules/jsesc": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz",
+ "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==",
"dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "get-intrinsic": "^1.2.1",
- "has-symbols": "^1.0.3",
- "isarray": "^2.0.5"
+ "license": "MIT",
+ "bin": {
+ "jsesc": "bin/jsesc"
},
"engines": {
- "node": ">=0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "node": ">=6"
}
},
- "node_modules/safe-buffer": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
- "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+ "node_modules/jsftp": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/jsftp/-/jsftp-2.1.3.tgz",
+ "integrity": "sha512-r79EVB8jaNAZbq8hvanL8e8JGu2ZNr2bXdHC4ZdQhRImpSPpnWwm5DYVzQ5QxJmtGtKhNNuvqGgbNaFl604fEQ==",
"dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ]
+ "license": "MIT",
+ "dependencies": {
+ "debug": "^3.1.0",
+ "ftp-response-parser": "^1.0.1",
+ "once": "^1.4.0",
+ "parse-listing": "^1.1.3",
+ "stream-combiner": "^0.2.2",
+ "unorm": "^1.4.1"
+ },
+ "engines": {
+ "node": ">=6"
+ }
},
- "node_modules/safe-regex": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
- "integrity": "sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==",
+ "node_modules/jsftp/node_modules/debug": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "ret": "~0.1.10"
+ "ms": "^2.1.1"
}
},
- "node_modules/safe-regex-test": {
+ "node_modules/json-buffer": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
+ "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/json-schema": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz",
+ "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==",
+ "dev": true,
+ "license": "(AFL-2.1 OR BSD-3-Clause)"
+ },
+ "node_modules/json-schema-traverse": {
"version": "1.0.0",
- "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz",
- "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/json-stable-stringify-without-jsonify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/json-stringify-safe": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
+ "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==",
"dev": true,
+ "license": "ISC",
+ "optional": true
+ },
+ "node_modules/json2mq": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/json2mq/-/json2mq-0.2.0.tgz",
+ "integrity": "sha512-SzoRg7ux5DWTII9J2qkrZrqV1gt+rTaoufMxEzXbS26Uid0NwaJd123HcoB80TgubEppxxIGdNxCx50fEoEWQA==",
+ "license": "MIT",
"dependencies": {
- "call-bind": "^1.0.2",
- "get-intrinsic": "^1.1.3",
- "is-regex": "^1.1.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "string-convert": "^0.2.0"
}
},
- "node_modules/safe-stable-stringify": {
- "version": "2.4.3",
- "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz",
- "integrity": "sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==",
+ "node_modules/json5": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
+ "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
"dev": true,
- "peer": true,
+ "license": "MIT",
+ "bin": {
+ "json5": "lib/cli.js"
+ },
"engines": {
- "node": ">=10"
+ "node": ">=6"
}
},
- "node_modules/safer-buffer": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
- "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
- "dev": true
+ "node_modules/jsonfile": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+ "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==",
+ "dev": true,
+ "license": "MIT",
+ "optionalDependencies": {
+ "graceful-fs": "^4.1.6"
+ }
},
- "node_modules/sanitize-filename": {
- "version": "1.6.3",
- "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.3.tgz",
- "integrity": "sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==",
+ "node_modules/jszip": {
+ "version": "3.10.1",
+ "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz",
+ "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==",
"dev": true,
+ "license": "(MIT OR GPL-3.0-or-later)",
"dependencies": {
- "truncate-utf8-bytes": "^1.0.0"
+ "lie": "~3.3.0",
+ "pako": "~1.0.2",
+ "readable-stream": "~2.3.6",
+ "setimmediate": "^1.0.5"
}
},
- "node_modules/sax": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/sax/-/sax-1.3.0.tgz",
- "integrity": "sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA=="
+ "node_modules/jszip/node_modules/isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
+ "dev": true,
+ "license": "MIT"
},
- "node_modules/saxes": {
- "version": "3.1.11",
- "resolved": "https://registry.npmjs.org/saxes/-/saxes-3.1.11.tgz",
- "integrity": "sha512-Ydydq3zC+WYDJK1+gRxRapLIED9PWeSuuS41wqyoRmzvhhh9nc+QQrVMKJYzJFULazeGhzSV0QleN2wD3boh2g==",
+ "node_modules/jszip/node_modules/readable-stream": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
+ "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "xmlchars": "^2.1.1"
- },
- "engines": {
- "node": ">=8"
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
}
},
- "node_modules/scheduler": {
- "version": "0.23.0",
- "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz",
- "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==",
+ "node_modules/jszip/node_modules/string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "loose-envify": "^1.1.0"
+ "safe-buffer": "~5.1.0"
}
},
- "node_modules/scroll-into-view-if-needed": {
- "version": "2.2.31",
- "resolved": "https://registry.npmjs.org/scroll-into-view-if-needed/-/scroll-into-view-if-needed-2.2.31.tgz",
- "integrity": "sha512-dGCXy99wZQivjmjIqihaBQNjryrz5rueJY7eHfTdyWEiR4ttYpsajb14rn9s5d4DY4EcY6+4+U/maARBXJedkA==",
+ "node_modules/keyboardevent-from-electron-accelerator": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/keyboardevent-from-electron-accelerator/-/keyboardevent-from-electron-accelerator-2.0.0.tgz",
+ "integrity": "sha512-iQcmNA0M4ETMNi0kG/q0h/43wZk7rMeKYrXP7sqKIJbHkTU8Koowgzv+ieR/vWJbOwxx5nDC3UnudZ0aLSu4VA==",
+ "license": "MIT"
+ },
+ "node_modules/keyboardevents-areequal": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/keyboardevents-areequal/-/keyboardevents-areequal-0.2.2.tgz",
+ "integrity": "sha512-Nv+Kr33T0mEjxR500q+I6IWisOQ0lK1GGOncV0kWE6n4KFmpcu7RUX5/2B0EUtX51Cb0HjZ9VJsSY3u4cBa0kw==",
+ "license": "MIT"
+ },
+ "node_modules/keyv": {
+ "version": "4.5.4",
+ "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
+ "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "compute-scroll-into-view": "^1.0.20"
+ "json-buffer": "3.0.1"
}
},
- "node_modules/select-hose": {
+ "node_modules/klaw": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/klaw/-/klaw-4.1.0.tgz",
+ "integrity": "sha512-1zGZ9MF9H22UnkpVeuaGKOjfA2t6WrfdrJmGjy16ykcjnKQDmHVX+KI477rpbGevz/5FD4MC3xf1oxylBgcaQw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=14.14.0"
+ }
+ },
+ "node_modules/kleur": {
+ "version": "4.1.5",
+ "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz",
+ "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/kuler": {
"version": "2.0.0",
- "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz",
- "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==",
+ "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz",
+ "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==",
"dev": true,
- "optional": true,
+ "license": "MIT",
"peer": true
},
- "node_modules/semver": {
- "version": "7.6.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz",
- "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==",
- "dependencies": {
- "lru-cache": "^6.0.0"
+ "node_modules/ky": {
+ "version": "1.14.3",
+ "resolved": "https://registry.npmjs.org/ky/-/ky-1.14.3.tgz",
+ "integrity": "sha512-9zy9lkjac+TR1c2tG+mkNSVlyOpInnWdSMiue4F+kq8TwJSgv6o8jhLRg8Ho6SnZ9wOYUq/yozts9qQCfk7bIw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
},
- "bin": {
- "semver": "bin/semver.js"
+ "funding": {
+ "url": "https://github.com/sindresorhus/ky?sponsor=1"
+ }
+ },
+ "node_modules/lazy-val": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/lazy-val/-/lazy-val-1.0.5.tgz",
+ "integrity": "sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q==",
+ "license": "MIT"
+ },
+ "node_modules/lazystream": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz",
+ "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "readable-stream": "^2.0.5"
},
"engines": {
- "node": ">=10"
+ "node": ">= 0.6.3"
}
},
- "node_modules/semver-compare": {
+ "node_modules/lazystream/node_modules/isarray": {
"version": "1.0.0",
- "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz",
- "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==",
- "optional": true
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/lazystream/node_modules/readable-stream": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
+ "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ }
},
- "node_modules/semver/node_modules/lru-cache": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
- "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "node_modules/lazystream/node_modules/string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "yallist": "^4.0.0"
- },
- "engines": {
- "node": ">=10"
+ "safe-buffer": "~5.1.0"
}
},
- "node_modules/semver/node_modules/yallist": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
- "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
- },
- "node_modules/send": {
- "version": "0.18.0",
- "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz",
- "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==",
+ "node_modules/levn": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
+ "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "debug": "2.6.9",
- "depd": "2.0.0",
- "destroy": "1.2.0",
- "encodeurl": "~1.0.2",
- "escape-html": "~1.0.3",
- "etag": "~1.8.1",
- "fresh": "0.5.2",
- "http-errors": "2.0.0",
- "mime": "1.6.0",
- "ms": "2.1.3",
- "on-finished": "2.4.1",
- "range-parser": "~1.2.1",
- "statuses": "2.0.1"
+ "prelude-ls": "^1.2.1",
+ "type-check": "~0.4.0"
},
"engines": {
"node": ">= 0.8.0"
}
},
- "node_modules/send/node_modules/debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "node_modules/lie": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz",
+ "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "ms": "2.0.0"
+ "immediate": "~3.0.5"
}
},
- "node_modules/send/node_modules/debug/node_modules/ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
- "dev": true
- },
- "node_modules/send/node_modules/mime": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
- "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
+ "node_modules/lilconfig": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz",
+ "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==",
"dev": true,
- "bin": {
- "mime": "cli.js"
- },
+ "license": "MIT",
"engines": {
- "node": ">=4"
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antonk52"
}
},
- "node_modules/send/node_modules/ms": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
- "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
- "dev": true
- },
- "node_modules/serialize-error": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz",
- "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==",
- "optional": true,
+ "node_modules/locate-app": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/locate-app/-/locate-app-2.5.0.tgz",
+ "integrity": "sha512-xIqbzPMBYArJRmPGUZD9CzV9wOqmVtQnaAn3wrj3s6WYW0bQvPI7x+sPYUGmDTYMHefVK//zc6HEYZ1qnxIK+Q==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://buymeacoffee.com/hejny"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/hejny/locate-app/blob/main/README.md#%EF%B8%8F-contributing"
+ }
+ ],
+ "license": "Apache-2.0",
"dependencies": {
- "type-fest": "^0.13.1"
- },
+ "@promptbook/utils": "0.69.5",
+ "type-fest": "4.26.0",
+ "userhome": "1.0.1"
+ }
+ },
+ "node_modules/locate-app/node_modules/type-fest": {
+ "version": "4.26.0",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.26.0.tgz",
+ "integrity": "sha512-OduNjVJsFbifKb57UqZ2EMP1i4u64Xwow3NYXUtBbD4vIwJdQd4+xl8YDou1dlm4DVrtwT/7Ky8z8WyCULVfxw==",
+ "license": "(MIT OR CC0-1.0)",
"engines": {
- "node": ">=10"
+ "node": ">=16"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/serialize-error/node_modules/type-fest": {
- "version": "0.13.1",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz",
- "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==",
- "optional": true,
+ "node_modules/locate-path": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
+ "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
"engines": {
"node": ">=10"
},
@@ -21256,882 +14523,833 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/serialize-javascript": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz",
- "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==",
+ "node_modules/lockfile": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/lockfile/-/lockfile-1.0.4.tgz",
+ "integrity": "sha512-cvbTwETRfsFh4nHsL1eGWapU1XFi5Ot9E85sWAwia7Y7EgB7vfqcZhTKZ+l7hCGxSPoushMv5GKhT5PdLv03WA==",
"dev": true,
+ "license": "ISC",
"dependencies": {
- "randombytes": "^2.1.0"
+ "signal-exit": "^3.0.2"
}
},
- "node_modules/serialize-to-js": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/serialize-to-js/-/serialize-to-js-3.1.2.tgz",
- "integrity": "sha512-owllqNuDDEimQat7EPG0tH7JjO090xKNzUtYz6X+Sk2BXDnOCilDdNLwjWeFywG9xkJul1ULvtUQa9O4pUaY0w==",
+ "node_modules/lodash": {
+ "version": "4.18.1",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz",
+ "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==",
+ "license": "MIT"
+ },
+ "node_modules/lodash.escaperegexp": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz",
+ "integrity": "sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==",
+ "license": "MIT"
+ },
+ "node_modules/lodash.isequal": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz",
+ "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==",
+ "deprecated": "This package is deprecated. Use require('node:util').isDeepStrictEqual instead.",
+ "license": "MIT"
+ },
+ "node_modules/log-symbols": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-7.0.1.tgz",
+ "integrity": "sha512-ja1E3yCr9i/0hmBVaM0bfwDjnGy8I/s6PP4DFp+yP+a+mrHO4Rm7DtmnqROTUkHIkqffC84YY7AeqX6oFk0WFg==",
"dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "is-unicode-supported": "^2.0.0",
+ "yoctocolors": "^2.1.1"
+ },
"engines": {
- "node": ">=4.0.0"
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/serve-favicon": {
- "version": "2.5.0",
- "resolved": "https://registry.npmjs.org/serve-favicon/-/serve-favicon-2.5.0.tgz",
- "integrity": "sha512-FMW2RvqNr03x+C0WxTyu6sOv21oOjkq5j8tjquWccwa6ScNyGFOGJVpuS1NmTVGBAHS07xnSKotgf2ehQmf9iA==",
+ "node_modules/logform": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/logform/-/logform-2.7.0.tgz",
+ "integrity": "sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==",
"dev": true,
+ "license": "MIT",
"peer": true,
"dependencies": {
- "etag": "~1.8.1",
- "fresh": "0.5.2",
- "ms": "2.1.1",
- "parseurl": "~1.3.2",
- "safe-buffer": "5.1.1"
+ "@colors/colors": "1.6.0",
+ "@types/triple-beam": "^1.3.2",
+ "fecha": "^4.2.0",
+ "ms": "^2.1.1",
+ "safe-stable-stringify": "^2.3.1",
+ "triple-beam": "^1.3.0"
},
"engines": {
- "node": ">= 0.8.0"
+ "node": ">= 12.0.0"
}
},
- "node_modules/serve-favicon/node_modules/ms": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
- "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
- "dev": true,
- "peer": true
+ "node_modules/loglevel": {
+ "version": "1.9.2",
+ "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.9.2.tgz",
+ "integrity": "sha512-HgMmCqIJSAKqo68l0rS2AanEWfkxaZ5wNiEFb5ggm08lDs9Xl2KxBlX3PTcaD2chBM1gXAYf491/M2Rv8Jwayg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6.0"
+ },
+ "funding": {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/loglevel"
+ }
},
- "node_modules/serve-favicon/node_modules/safe-buffer": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz",
- "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==",
- "dev": true,
- "peer": true
+ "node_modules/loglevel-plugin-prefix": {
+ "version": "0.8.4",
+ "resolved": "https://registry.npmjs.org/loglevel-plugin-prefix/-/loglevel-plugin-prefix-0.8.4.tgz",
+ "integrity": "sha512-WpG9CcFAOjz/FtNht+QJeGpvVl/cdR6P0z6OcXSkr8wFJOsV2GRj2j10JLfjuA4aYkcKCNIEqRGCyTife9R8/g==",
+ "license": "MIT"
},
- "node_modules/serve-static": {
- "version": "1.15.0",
- "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz",
- "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==",
+ "node_modules/lowercase-keys": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz",
+ "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==",
"dev": true,
- "dependencies": {
- "encodeurl": "~1.0.2",
- "escape-html": "~1.0.3",
- "parseurl": "~1.3.3",
- "send": "0.18.0"
- },
+ "license": "MIT",
"engines": {
- "node": ">= 0.8.0"
+ "node": ">=8"
}
},
- "node_modules/set-blocking": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
- "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==",
- "dev": true
- },
- "node_modules/set-function-length": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz",
- "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==",
+ "node_modules/lru-cache": {
+ "version": "11.5.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.0.tgz",
+ "integrity": "sha512-5YgH9UJd7wVb9hIouI2adWpgqrrICkt070Dnj8EUY1+B4B2P9eRLPAkAAo6NICA7CEhOIeBHl46u9zSNpNu7zA==",
"dev": true,
- "dependencies": {
- "define-data-property": "^1.1.1",
- "get-intrinsic": "^1.2.1",
- "gopd": "^1.0.1",
- "has-property-descriptors": "^1.0.0"
- },
+ "license": "BlueOak-1.0.0",
"engines": {
- "node": ">= 0.4"
+ "node": "20 || >=22"
}
},
- "node_modules/set-function-name": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz",
- "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==",
+ "node_modules/magic-string": {
+ "version": "0.30.21",
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz",
+ "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "define-data-property": "^1.0.1",
- "functions-have-names": "^1.2.3",
- "has-property-descriptors": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
+ "@jridgewell/sourcemap-codec": "^1.5.5"
}
},
- "node_modules/set-value": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz",
- "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==",
+ "node_modules/matcher": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz",
+ "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==",
"dev": true,
+ "license": "MIT",
+ "optional": true,
"dependencies": {
- "extend-shallow": "^2.0.1",
- "is-extendable": "^0.1.1",
- "is-plain-object": "^2.0.3",
- "split-string": "^3.0.1"
+ "escape-string-regexp": "^4.0.0"
},
"engines": {
- "node": ">=0.10.0"
+ "node": ">=10"
}
},
- "node_modules/set-value/node_modules/extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==",
+ "node_modules/math-intrinsics": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
+ "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
"dev": true,
- "dependencies": {
- "is-extendable": "^0.1.0"
- },
+ "license": "MIT",
"engines": {
- "node": ">=0.10.0"
+ "node": ">= 0.4"
}
},
- "node_modules/set-value/node_modules/is-extendable": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
- "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==",
+ "node_modules/media-typer": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz",
+ "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==",
"dev": true,
+ "license": "MIT",
+ "peer": true,
"engines": {
- "node": ">=0.10.0"
+ "node": ">= 0.8"
}
},
- "node_modules/setimmediate": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz",
- "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==",
- "dev": true
- },
- "node_modules/setprototypeof": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
- "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
- "dev": true
- },
- "node_modules/sha.js": {
- "version": "2.4.11",
- "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz",
- "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==",
+ "node_modules/merge-descriptors": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz",
+ "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==",
"dev": true,
- "dependencies": {
- "inherits": "^2.0.1",
- "safe-buffer": "^5.0.1"
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=18"
},
- "bin": {
- "sha.js": "bin.js"
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/shallow-clone": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz",
- "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==",
+ "node_modules/method-override": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/method-override/-/method-override-3.0.0.tgz",
+ "integrity": "sha512-IJ2NNN/mSl9w3kzWB92rcdHpz+HjkxhDJWNDBqSlas+zQdP8wBiJzITPg08M/k2uVvMow7Sk41atndNtt/PHSA==",
"dev": true,
+ "license": "MIT",
+ "peer": true,
"dependencies": {
- "kind-of": "^6.0.2"
+ "debug": "3.1.0",
+ "methods": "~1.1.2",
+ "parseurl": "~1.3.2",
+ "vary": "~1.1.2"
},
"engines": {
- "node": ">=8"
+ "node": ">= 0.10"
}
},
- "node_modules/shallow-copy": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/shallow-copy/-/shallow-copy-0.0.1.tgz",
- "integrity": "sha512-b6i4ZpVuUxB9h5gfCxPiusKYkqTMOjEbBs4wMaFbkfia4yFv92UKZ6Df8WXcKbn08JNL/abvg3FnMAOfakDvUw==",
- "dev": true
- },
- "node_modules/shallowequal": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz",
- "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ=="
- },
- "node_modules/sharp": {
- "version": "0.33.2",
- "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.33.2.tgz",
- "integrity": "sha512-WlYOPyyPDiiM07j/UO+E720ju6gtNtHjEGg5vovUk1Lgxyjm2LFO+37Nt/UI3MMh2l6hxTWQWi7qk3cXJTutcQ==",
+ "node_modules/method-override/node_modules/debug": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+ "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
"dev": true,
- "hasInstallScript": true,
- "optional": true,
+ "license": "MIT",
+ "peer": true,
"dependencies": {
- "color": "^4.2.3",
- "detect-libc": "^2.0.2",
- "semver": "^7.5.4"
- },
- "engines": {
- "libvips": ">=8.15.1",
- "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/libvips"
- },
- "optionalDependencies": {
- "@img/sharp-darwin-arm64": "0.33.2",
- "@img/sharp-darwin-x64": "0.33.2",
- "@img/sharp-libvips-darwin-arm64": "1.0.1",
- "@img/sharp-libvips-darwin-x64": "1.0.1",
- "@img/sharp-libvips-linux-arm": "1.0.1",
- "@img/sharp-libvips-linux-arm64": "1.0.1",
- "@img/sharp-libvips-linux-s390x": "1.0.1",
- "@img/sharp-libvips-linux-x64": "1.0.1",
- "@img/sharp-libvips-linuxmusl-arm64": "1.0.1",
- "@img/sharp-libvips-linuxmusl-x64": "1.0.1",
- "@img/sharp-linux-arm": "0.33.2",
- "@img/sharp-linux-arm64": "0.33.2",
- "@img/sharp-linux-s390x": "0.33.2",
- "@img/sharp-linux-x64": "0.33.2",
- "@img/sharp-linuxmusl-arm64": "0.33.2",
- "@img/sharp-linuxmusl-x64": "0.33.2",
- "@img/sharp-wasm32": "0.33.2",
- "@img/sharp-win32-ia32": "0.33.2",
- "@img/sharp-win32-x64": "0.33.2"
- }
- },
- "node_modules/sharp/node_modules/color": {
- "version": "4.2.3",
- "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz",
- "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==",
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/method-override/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/methods": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
+ "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==",
"dev": true,
- "optional": true,
- "dependencies": {
- "color-convert": "^2.0.1",
- "color-string": "^1.9.0"
- },
+ "license": "MIT",
+ "peer": true,
"engines": {
- "node": ">=12.5.0"
+ "node": ">= 0.6"
}
},
- "node_modules/sharp/node_modules/color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "node_modules/mime": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz",
+ "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==",
"dev": true,
- "optional": true,
- "dependencies": {
- "color-name": "~1.1.4"
+ "license": "MIT",
+ "bin": {
+ "mime": "cli.js"
},
"engines": {
- "node": ">=7.0.0"
+ "node": ">=4.0.0"
}
},
- "node_modules/sharp/node_modules/color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "node_modules/mime-db": {
+ "version": "1.54.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz",
+ "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==",
"dev": true,
- "optional": true
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">= 0.6"
+ }
},
- "node_modules/shebang-command": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
- "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==",
+ "node_modules/mime-types": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz",
+ "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==",
"dev": true,
+ "license": "MIT",
+ "peer": true,
"dependencies": {
- "shebang-regex": "^1.0.0"
+ "mime-db": "^1.54.0"
},
"engines": {
- "node": ">=0.10.0"
+ "node": ">=18"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
}
},
- "node_modules/shebang-regex": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
- "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==",
+ "node_modules/mimic-fn": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
+ "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
"dev": true,
+ "license": "MIT",
+ "peer": true,
"engines": {
- "node": ">=0.10.0"
+ "node": ">=6"
}
},
- "node_modules/shell-quote": {
- "version": "1.8.1",
- "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz",
- "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==",
+ "node_modules/mimic-response": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz",
+ "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==",
"dev": true,
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
}
},
- "node_modules/side-channel": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
- "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
+ "node_modules/minimalistic-assert": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
+ "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==",
"dev": true,
+ "license": "ISC",
+ "optional": true,
+ "peer": true
+ },
+ "node_modules/minimatch": {
+ "version": "9.0.9",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz",
+ "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==",
+ "license": "ISC",
"dependencies": {
- "call-bind": "^1.0.0",
- "get-intrinsic": "^1.0.2",
- "object-inspect": "^1.9.0"
+ "brace-expansion": "^2.0.2"
},
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/signal-exit": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
- "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
- "dev": true,
"engines": {
- "node": ">=14"
+ "node": ">=16 || 14 >=14.17"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
}
},
- "node_modules/simple-swizzle": {
- "version": "0.2.2",
- "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz",
- "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==",
- "dev": true,
+ "node_modules/minimatch/node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "license": "MIT"
+ },
+ "node_modules/minimatch/node_modules/brace-expansion": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz",
+ "integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==",
+ "license": "MIT",
"dependencies": {
- "is-arrayish": "^0.3.1"
+ "balanced-match": "^1.0.0"
}
},
- "node_modules/simple-swizzle/node_modules/is-arrayish": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz",
- "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==",
- "dev": true
- },
- "node_modules/simple-update-notifier": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz",
- "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==",
+ "node_modules/minimist": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
+ "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
"dev": true,
- "dependencies": {
- "semver": "^7.5.3"
- },
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/minipass": {
+ "version": "7.1.3",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz",
+ "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==",
+ "license": "BlueOak-1.0.0",
"engines": {
- "node": ">=10"
+ "node": ">=16 || 14 >=14.17"
}
},
- "node_modules/sinon": {
- "version": "17.0.1",
- "resolved": "https://registry.npmjs.org/sinon/-/sinon-17.0.1.tgz",
- "integrity": "sha512-wmwE19Lie0MLT+ZYNpDymasPHUKTaZHUH/pKEubRXIzySv9Atnlw+BUMGCzWgV7b7wO+Hw6f1TEOr0IUnmU8/g==",
+ "node_modules/minizlib": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz",
+ "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@sinonjs/commons": "^3.0.0",
- "@sinonjs/fake-timers": "^11.2.2",
- "@sinonjs/samsam": "^8.0.0",
- "diff": "^5.1.0",
- "nise": "^5.1.5",
- "supports-color": "^7.2.0"
+ "minipass": "^7.1.2"
},
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/sinon"
+ "engines": {
+ "node": ">= 18"
}
},
- "node_modules/sinon/node_modules/supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
- "dev": true,
- "dependencies": {
- "has-flag": "^4.0.0"
+ "node_modules/mitt": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz",
+ "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==",
+ "license": "MIT"
+ },
+ "node_modules/mkdirp": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
+ "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
+ "license": "MIT",
+ "bin": {
+ "mkdirp": "bin/cmd.js"
},
"engines": {
- "node": ">=8"
+ "node": ">=10"
}
},
- "node_modules/slash": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz",
- "integrity": "sha512-3TYDR7xWt4dIqV2JauJr+EJeW356RXijHeUlO+8djJ+uBXPn8/2dpzBc8yQhh583sVvc9CvFAeQVgijsH+PNNg==",
- "dev": true,
+ "node_modules/modern-tar": {
+ "version": "0.7.6",
+ "resolved": "https://registry.npmjs.org/modern-tar/-/modern-tar-0.7.6.tgz",
+ "integrity": "sha512-sweCIVXzx1aIGTCdzcMlSZt1h8k5Tmk08VNAuRk3IU28XamGiOH5ypi11g6De2CH7PhYqSSnGy2A/EFhbWnVKg==",
+ "license": "MIT",
"engines": {
- "node": ">=0.10.0"
+ "node": ">=18.0.0"
}
},
- "node_modules/slice-ansi": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz",
- "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==",
+ "node_modules/morgan": {
+ "version": "1.10.1",
+ "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.1.tgz",
+ "integrity": "sha512-223dMRJtI/l25dJKWpgij2cMtywuG/WiUKXdvwfbhGKBhy1puASqXwFzmWZ7+K73vUPoR7SS2Qz2cI/g9MKw0A==",
"dev": true,
- "optional": true,
+ "license": "MIT",
+ "peer": true,
"dependencies": {
- "ansi-styles": "^4.0.0",
- "astral-regex": "^2.0.0",
- "is-fullwidth-code-point": "^3.0.0"
+ "basic-auth": "~2.0.1",
+ "debug": "2.6.9",
+ "depd": "~2.0.0",
+ "on-finished": "~2.3.0",
+ "on-headers": "~1.1.0"
},
"engines": {
- "node": ">=8"
+ "node": ">= 0.8.0"
}
},
- "node_modules/slice-ansi/node_modules/ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "node_modules/morgan/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
"dev": true,
- "optional": true,
+ "license": "MIT",
+ "peer": true,
"dependencies": {
- "color-convert": "^2.0.1"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ "ms": "2.0.0"
}
},
- "node_modules/slice-ansi/node_modules/color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "node_modules/morgan/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
"dev": true,
- "optional": true,
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/morgan/node_modules/on-finished": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
+ "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
"dependencies": {
- "color-name": "~1.1.4"
+ "ee-first": "1.1.1"
},
"engines": {
- "node": ">=7.0.0"
+ "node": ">= 0.8"
}
},
- "node_modules/slice-ansi/node_modules/color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "dev": true,
- "optional": true
+ "node_modules/ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+ "license": "MIT"
},
- "node_modules/smart-buffer": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz",
- "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==",
+ "node_modules/nanoid": {
+ "version": "3.3.11",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz",
+ "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==",
"dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "bin": {
+ "nanoid": "bin/nanoid.cjs"
+ },
"engines": {
- "node": ">= 6.0.0",
- "npm": ">= 3.0.0"
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
}
},
- "node_modules/snapdragon": {
- "version": "0.8.2",
- "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",
- "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==",
+ "node_modules/napi-postinstall": {
+ "version": "0.3.4",
+ "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.3.4.tgz",
+ "integrity": "sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==",
"dev": true,
- "dependencies": {
- "base": "^0.11.1",
- "debug": "^2.2.0",
- "define-property": "^0.2.5",
- "extend-shallow": "^2.0.1",
- "map-cache": "^0.2.2",
- "source-map": "^0.5.6",
- "source-map-resolve": "^0.5.0",
- "use": "^3.1.0"
+ "license": "MIT",
+ "bin": {
+ "napi-postinstall": "lib/cli.js"
},
"engines": {
- "node": ">=0.10.0"
+ "node": "^12.20.0 || ^14.18.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/napi-postinstall"
}
},
- "node_modules/snapdragon-node": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz",
- "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==",
+ "node_modules/natural-compare": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
"dev": true,
- "dependencies": {
- "define-property": "^1.0.0",
- "isobject": "^3.0.0",
- "snapdragon-util": "^3.0.1"
- },
- "engines": {
- "node": ">=0.10.0"
- }
+ "license": "MIT"
},
- "node_modules/snapdragon-node/node_modules/define-property": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
- "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==",
+ "node_modules/natural-orderby": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/natural-orderby/-/natural-orderby-5.0.0.tgz",
+ "integrity": "sha512-kKHJhxwpR/Okycz4HhQKKlhWe4ASEfPgkSWNmKFHd7+ezuQlxkA5cM3+XkBPvm1gmHen3w53qsYAv+8GwRrBlg==",
"dev": true,
- "dependencies": {
- "is-descriptor": "^1.0.0"
- },
+ "license": "MIT",
"engines": {
- "node": ">=0.10.0"
+ "node": ">=18"
}
},
- "node_modules/snapdragon-util": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz",
- "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==",
+ "node_modules/ncp": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz",
+ "integrity": "sha512-zIdGUrPRFTUELUvr3Gmc7KZ2Sw/h1PiVM0Af/oHB6zgnV1ikqSfRk+TOufi79aHYCW3NiOXmr1BP5nWbzojLaA==",
"dev": true,
- "dependencies": {
- "kind-of": "^3.2.0"
- },
- "engines": {
- "node": ">=0.10.0"
+ "license": "MIT",
+ "peer": true,
+ "bin": {
+ "ncp": "bin/ncp"
}
},
- "node_modules/snapdragon-util/node_modules/kind-of": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
- "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==",
+ "node_modules/negotiator": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz",
+ "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==",
"dev": true,
- "dependencies": {
- "is-buffer": "^1.1.5"
- },
+ "license": "MIT",
+ "peer": true,
"engines": {
- "node": ">=0.10.0"
+ "node": ">= 0.6"
}
},
- "node_modules/snapdragon/node_modules/debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "dev": true,
- "dependencies": {
- "ms": "2.0.0"
+ "node_modules/netmask": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.1.1.tgz",
+ "integrity": "sha512-eonl3sLUha+S1GzTPxychyhnUzKyeQkZ7jLjKrBagJgPla13F+uQ71HgpFefyHgqrjEbCPkDArxYsjY8/+gLKA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4.0"
}
},
- "node_modules/snapdragon/node_modules/define-property": {
- "version": "0.2.5",
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
- "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==",
+ "node_modules/node-abi": {
+ "version": "4.31.0",
+ "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-4.31.0.tgz",
+ "integrity": "sha512-Erq5w/t3syw3s4sDsUaX4QttIdBPsGKTT1DTRsCkTonGggczhlDKm/wDX3o+HPJpQ41EjXCbcmXf0tgr5YZJXw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "is-descriptor": "^0.1.0"
+ "semver": "^7.6.3"
},
"engines": {
- "node": ">=0.10.0"
+ "node": ">=22.12.0"
}
},
- "node_modules/snapdragon/node_modules/extend-shallow": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
- "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==",
+ "node_modules/node-api-version": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/node-api-version/-/node-api-version-0.2.1.tgz",
+ "integrity": "sha512-2xP/IGGMmmSQpI1+O/k72jF/ykvZ89JeuKX3TLJAYPDVLUalrshrLHkeVcCCZqG/eEa635cr8IBYzgnDvM2O8Q==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "is-extendable": "^0.1.0"
- },
- "engines": {
- "node": ">=0.10.0"
+ "semver": "^7.3.5"
}
},
- "node_modules/snapdragon/node_modules/is-descriptor": {
- "version": "0.1.7",
- "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.7.tgz",
- "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==",
+ "node_modules/node-gyp": {
+ "version": "12.4.0",
+ "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-12.4.0.tgz",
+ "integrity": "sha512-OMcPNvqTCFUnNaBlmdgq+lfNqY7gTiSmNRDjY3uAXRyudeKZEZxu3CLtjMQrx4zZxCX2b/mpNqTtwuCJgXhHkw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "is-accessor-descriptor": "^1.0.1",
- "is-data-descriptor": "^1.0.1"
+ "env-paths": "^2.2.0",
+ "exponential-backoff": "^3.1.1",
+ "graceful-fs": "^4.2.6",
+ "nopt": "^9.0.0",
+ "proc-log": "^6.0.0",
+ "semver": "^7.3.5",
+ "tar": "^7.5.4",
+ "tinyglobby": "^0.2.12",
+ "undici": "^6.25.0",
+ "which": "^6.0.0"
+ },
+ "bin": {
+ "node-gyp": "bin/node-gyp.js"
},
"engines": {
- "node": ">= 0.4"
+ "node": "^20.17.0 || >=22.9.0"
}
},
- "node_modules/snapdragon/node_modules/is-extendable": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
- "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==",
+ "node_modules/node-gyp/node_modules/undici": {
+ "version": "6.27.0",
+ "resolved": "https://registry.npmjs.org/undici/-/undici-6.27.0.tgz",
+ "integrity": "sha512-YmfV3YnEDzXRC5lZ2jWtWWHKGUm1zIt8AhesR1tens+HTNv+YZlN/dp6G727LOvMJ8xjP9Be7Y2Sdr96LDm+pg==",
"dev": true,
+ "license": "MIT",
"engines": {
- "node": ">=0.10.0"
+ "node": ">=18.17"
}
},
- "node_modules/snapdragon/node_modules/ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
- "dev": true
+ "node_modules/node-int64": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz",
+ "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==",
+ "dev": true,
+ "license": "MIT"
},
- "node_modules/snapdragon/node_modules/source-map": {
- "version": "0.5.7",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
- "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==",
+ "node_modules/node-releases": {
+ "version": "2.0.27",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz",
+ "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==",
"dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
+ "license": "MIT"
},
- "node_modules/socks": {
- "version": "2.7.1",
- "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz",
- "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==",
+ "node_modules/nopt": {
+ "version": "9.0.0",
+ "resolved": "https://registry.npmjs.org/nopt/-/nopt-9.0.0.tgz",
+ "integrity": "sha512-Zhq3a+yFKrYwSBluL4H9XP3m3y5uvQkB/09CwDruCiRmR/UJYnn9W4R48ry0uGC70aeTPKLynBtscP9efFFcPw==",
"dev": true,
+ "license": "ISC",
"dependencies": {
- "ip": "^2.0.0",
- "smart-buffer": "^4.2.0"
+ "abbrev": "^4.0.0"
+ },
+ "bin": {
+ "nopt": "bin/nopt.js"
},
"engines": {
- "node": ">= 10.13.0",
- "npm": ">= 3.0.0"
+ "node": "^20.17.0 || >=22.9.0"
}
},
- "node_modules/socks-proxy-agent": {
- "version": "8.0.2",
- "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.2.tgz",
- "integrity": "sha512-8zuqoLv1aP/66PHF5TqwJ7Czm3Yv32urJQHrVyhD7mmA6d61Zv8cIXQYPTWwmg6qlupnPvs/QKDmfa4P/qct2g==",
+ "node_modules/normalize-package-data": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-8.0.0.tgz",
+ "integrity": "sha512-RWk+PI433eESQ7ounYxIp67CYuVsS1uYSonX3kA6ps/3LWfjVQa/ptEg6Y3T6uAMq1mWpX9PQ+qx+QaHpsc7gQ==",
"dev": true,
+ "license": "BSD-2-Clause",
"dependencies": {
- "agent-base": "^7.0.2",
- "debug": "^4.3.4",
- "socks": "^2.7.1"
+ "hosted-git-info": "^9.0.0",
+ "semver": "^7.3.5",
+ "validate-npm-package-license": "^3.0.4"
},
"engines": {
- "node": ">= 14"
+ "node": "^20.17.0 || >=22.9.0"
}
},
- "node_modules/socks-proxy-agent/node_modules/agent-base": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz",
- "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==",
+ "node_modules/normalize-package-data/node_modules/hosted-git-info": {
+ "version": "9.0.2",
+ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-9.0.2.tgz",
+ "integrity": "sha512-M422h7o/BR3rmCQ8UHi7cyyMqKltdP9Uo+J2fXK+RSAY+wTcKOIRyhTuKv4qn+DJf3g+PL890AzId5KZpX+CBg==",
"dev": true,
+ "license": "ISC",
"dependencies": {
- "debug": "^4.3.4"
+ "lru-cache": "^11.1.0"
},
"engines": {
- "node": ">= 14"
+ "node": "^20.17.0 || >=22.9.0"
}
},
- "node_modules/socks/node_modules/ip": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz",
- "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==",
- "dev": true
- },
- "node_modules/source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "node_modules/normalize-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=0.10.0"
}
},
- "node_modules/source-map-resolve": {
- "version": "0.5.3",
- "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz",
- "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==",
- "deprecated": "See https://github.com/lydell/source-map-resolve#deprecated",
- "dev": true,
- "dependencies": {
- "atob": "^2.1.2",
- "decode-uri-component": "^0.2.0",
- "resolve-url": "^0.2.1",
- "source-map-url": "^0.4.0",
- "urix": "^0.1.0"
- }
- },
- "node_modules/source-map-support": {
- "version": "0.5.21",
- "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
- "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
+ "node_modules/normalize-url": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz",
+ "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==",
"dev": true,
- "dependencies": {
- "buffer-from": "^1.0.0",
- "source-map": "^0.6.0"
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/source-map-url": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz",
- "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==",
- "deprecated": "See https://github.com/lydell/source-map-url#deprecated",
- "dev": true
- },
- "node_modules/spawn-command": {
- "version": "0.0.2",
- "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2.tgz",
- "integrity": "sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ==",
- "dev": true
- },
- "node_modules/spdx-correct": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz",
- "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==",
- "dev": true,
+ "node_modules/nth-check": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz",
+ "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==",
+ "license": "BSD-2-Clause",
"dependencies": {
- "spdx-expression-parse": "^3.0.0",
- "spdx-license-ids": "^3.0.0"
+ "boolbase": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/nth-check?sponsor=1"
}
},
- "node_modules/spdx-exceptions": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz",
- "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==",
- "dev": true
- },
- "node_modules/spdx-expression-parse": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
- "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
+ "node_modules/object-deep-merge": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/object-deep-merge/-/object-deep-merge-2.0.1.tgz",
+ "integrity": "sha512-aKttDKcU3pyZqKcCkDhsMn70WmZFG2JGDQLP9EcLyTSIFQRCPWLAmBZRLJnrVUrhPG1jETEEbfdgbNtJf1LyMg==",
"dev": true,
- "dependencies": {
- "spdx-exceptions": "^2.1.0",
- "spdx-license-ids": "^3.0.0"
- }
- },
- "node_modules/spdx-license-ids": {
- "version": "3.0.16",
- "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz",
- "integrity": "sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==",
- "dev": true
+ "license": "MIT"
},
- "node_modules/spdy": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz",
- "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==",
+ "node_modules/object-inspect": {
+ "version": "1.13.4",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz",
+ "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==",
"dev": true,
- "optional": true,
+ "license": "MIT",
"peer": true,
- "dependencies": {
- "debug": "^4.1.0",
- "handle-thing": "^2.0.0",
- "http-deceiver": "^1.2.7",
- "select-hose": "^2.0.0",
- "spdy-transport": "^3.0.0"
- },
"engines": {
- "node": ">=6.0.0"
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/spdy-transport": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz",
- "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==",
+ "node_modules/object-keys": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
+ "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
"dev": true,
+ "license": "MIT",
"optional": true,
- "peer": true,
- "dependencies": {
- "debug": "^4.1.0",
- "detect-node": "^2.0.4",
- "hpack.js": "^2.1.6",
- "obuf": "^1.1.2",
- "readable-stream": "^3.0.6",
- "wbuf": "^1.7.3"
+ "engines": {
+ "node": ">= 0.4"
}
},
- "node_modules/spectron": {
- "version": "15.0.0",
- "resolved": "https://registry.npmjs.org/spectron/-/spectron-15.0.0.tgz",
- "integrity": "sha512-eErHqymkEVb6H+LPZQoDYvWEv93o3nhxL7HXXdmC61ncV0jBckh8x3Qt6j+As2c1n0C/hKG9A2H1NnwGwD6agg==",
+ "node_modules/obuf": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz",
+ "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==",
"dev": true,
- "hasInstallScript": true,
- "dependencies": {
- "@electron/remote": "^1.1.0",
- "dev-null": "^0.1.1",
- "electron-chromedriver": "^13.0.0",
- "got": "^11.8.0",
- "split": "^1.0.1",
- "webdriverio": "^6.9.1"
- },
- "engines": {
- "node": ">=12.20.0"
- }
+ "license": "MIT",
+ "optional": true,
+ "peer": true
},
- "node_modules/spectron/node_modules/@sindresorhus/is": {
- "version": "4.6.0",
- "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz",
- "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==",
+ "node_modules/obug": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.1.tgz",
+ "integrity": "sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==",
"dev": true,
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sindresorhus/is?sponsor=1"
- }
+ "funding": [
+ "https://github.com/sponsors/sxzz",
+ "https://opencollective.com/debug"
+ ],
+ "license": "MIT"
},
- "node_modules/spectron/node_modules/@szmarczak/http-timer": {
- "version": "4.0.6",
- "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz",
- "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==",
+ "node_modules/on-finished": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
+ "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
"dev": true,
+ "license": "MIT",
+ "peer": true,
"dependencies": {
- "defer-to-connect": "^2.0.0"
+ "ee-first": "1.1.1"
},
"engines": {
- "node": ">=10"
+ "node": ">= 0.8"
}
},
- "node_modules/spectron/node_modules/cacheable-request": {
- "version": "7.0.4",
- "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz",
- "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==",
+ "node_modules/on-headers": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz",
+ "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==",
"dev": true,
- "dependencies": {
- "clone-response": "^1.0.2",
- "get-stream": "^5.1.0",
- "http-cache-semantics": "^4.0.0",
- "keyv": "^4.0.0",
- "lowercase-keys": "^2.0.0",
- "normalize-url": "^6.0.1",
- "responselike": "^2.0.0"
- },
+ "license": "MIT",
+ "peer": true,
"engines": {
- "node": ">=8"
+ "node": ">= 0.8"
}
},
- "node_modules/spectron/node_modules/decompress-response": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz",
- "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==",
- "dev": true,
+ "node_modules/once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+ "license": "ISC",
"dependencies": {
- "mimic-response": "^3.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "wrappy": "1"
}
},
- "node_modules/spectron/node_modules/defer-to-connect": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz",
- "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==",
+ "node_modules/one-time": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz",
+ "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==",
"dev": true,
- "engines": {
- "node": ">=10"
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "fn.name": "1.x.x"
}
},
- "node_modules/spectron/node_modules/get-stream": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
- "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
+ "node_modules/onetime": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
+ "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
"dev": true,
+ "license": "MIT",
+ "peer": true,
"dependencies": {
- "pump": "^3.0.0"
+ "mimic-fn": "^2.1.0"
},
"engines": {
- "node": ">=8"
+ "node": ">=6"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/spectron/node_modules/got": {
- "version": "11.8.6",
- "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz",
- "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==",
+ "node_modules/optionator": {
+ "version": "0.9.4",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz",
+ "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@sindresorhus/is": "^4.0.0",
- "@szmarczak/http-timer": "^4.0.5",
- "@types/cacheable-request": "^6.0.1",
- "@types/responselike": "^1.0.0",
- "cacheable-lookup": "^5.0.3",
- "cacheable-request": "^7.0.2",
- "decompress-response": "^6.0.0",
- "http2-wrapper": "^1.0.0-beta.5.2",
- "lowercase-keys": "^2.0.0",
- "p-cancelable": "^2.0.0",
- "responselike": "^2.0.0"
- },
- "engines": {
- "node": ">=10.19.0"
+ "deep-is": "^0.1.3",
+ "fast-levenshtein": "^2.0.6",
+ "levn": "^0.4.1",
+ "prelude-ls": "^1.2.1",
+ "type-check": "^0.4.0",
+ "word-wrap": "^1.2.5"
},
- "funding": {
- "url": "https://github.com/sindresorhus/got?sponsor=1"
+ "engines": {
+ "node": ">= 0.8.0"
}
},
- "node_modules/spectron/node_modules/lowercase-keys": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz",
- "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==",
+ "node_modules/ora": {
+ "version": "5.4.1",
+ "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz",
+ "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==",
"dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "bl": "^4.1.0",
+ "chalk": "^4.1.0",
+ "cli-cursor": "^3.1.0",
+ "cli-spinners": "^2.5.0",
+ "is-interactive": "^1.0.0",
+ "is-unicode-supported": "^0.1.0",
+ "log-symbols": "^4.1.0",
+ "strip-ansi": "^6.0.0",
+ "wcwidth": "^1.0.1"
+ },
"engines": {
- "node": ">=8"
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/spectron/node_modules/mimic-response": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz",
- "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==",
+ "node_modules/ora/node_modules/is-unicode-supported": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz",
+ "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==",
"dev": true,
+ "license": "MIT",
+ "peer": true,
"engines": {
"node": ">=10"
},
@@ -22139,11 +15357,17 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/spectron/node_modules/normalize-url": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz",
- "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==",
+ "node_modules/ora/node_modules/log-symbols": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz",
+ "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==",
"dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "chalk": "^4.1.0",
+ "is-unicode-supported": "^0.1.0"
+ },
"engines": {
"node": ">=10"
},
@@ -22151,62 +15375,70 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/spectron/node_modules/p-cancelable": {
+ "node_modules/p-cancelable": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz",
"integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=8"
}
},
- "node_modules/spectron/node_modules/responselike": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz",
- "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==",
+ "node_modules/p-limit": {
+ "version": "7.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-7.3.0.tgz",
+ "integrity": "sha512-7cIXg/Z0M5WZRblrsOla88S4wAK+zOQQWeBYfV3qJuJXMr+LnbYjaadrFaS0JILfEDPVqHyKnZ1Z/1d6J9VVUw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "lowercase-keys": "^2.0.0"
+ "yocto-queue": "^1.2.1"
+ },
+ "engines": {
+ "node": ">=20"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/split": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz",
- "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==",
+ "node_modules/p-locate": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
+ "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "through": "2"
+ "p-limit": "^3.0.2"
},
"engines": {
- "node": "*"
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/split-string": {
+ "node_modules/p-locate/node_modules/p-limit": {
"version": "3.1.0",
- "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz",
- "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+ "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "extend-shallow": "^3.0.0"
+ "yocto-queue": "^0.1.0"
},
"engines": {
- "node": ">=0.10.0"
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/sprintf-js": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz",
- "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==",
- "optional": true
- },
- "node_modules/srcset": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/srcset/-/srcset-3.0.1.tgz",
- "integrity": "sha512-MM8wDGg5BQJEj94tDrZDrX9wrC439/Eoeg3sgmVLPMjHgrAFeXAKk3tmFlCbKw5k+yOEhPXRpPlRcisQmqWVSQ==",
+ "node_modules/p-locate/node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
+ "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=10"
},
@@ -22214,1426 +15446,1658 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/sshpk": {
- "version": "1.18.0",
- "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz",
- "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==",
- "dev": true,
+ "node_modules/pac-proxy-agent": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.2.0.tgz",
+ "integrity": "sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA==",
+ "license": "MIT",
"dependencies": {
- "asn1": "~0.2.3",
- "assert-plus": "^1.0.0",
- "bcrypt-pbkdf": "^1.0.0",
- "dashdash": "^1.12.0",
- "ecc-jsbn": "~0.1.1",
- "getpass": "^0.1.1",
- "jsbn": "~0.1.0",
- "safer-buffer": "^2.0.2",
- "tweetnacl": "~0.14.0"
- },
- "bin": {
- "sshpk-conv": "bin/sshpk-conv",
- "sshpk-sign": "bin/sshpk-sign",
- "sshpk-verify": "bin/sshpk-verify"
+ "@tootallnate/quickjs-emscripten": "^0.23.0",
+ "agent-base": "^7.1.2",
+ "debug": "^4.3.4",
+ "get-uri": "^6.0.1",
+ "http-proxy-agent": "^7.0.0",
+ "https-proxy-agent": "^7.0.6",
+ "pac-resolver": "^7.0.1",
+ "socks-proxy-agent": "^8.0.5"
},
"engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/stable": {
- "version": "0.1.8",
- "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz",
- "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==",
- "deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility",
- "dev": true
- },
- "node_modules/stack-trace": {
- "version": "0.0.10",
- "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz",
- "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==",
- "dev": true,
- "peer": true,
- "engines": {
- "node": "*"
- }
- },
- "node_modules/stat-mode": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/stat-mode/-/stat-mode-1.0.0.tgz",
- "integrity": "sha512-jH9EhtKIjuXZ2cWxmXS8ZP80XyC3iasQxMDV8jzhNJpfDb7VbQLVW4Wvsxz9QZvzV+G4YoSfBUVKDOyxLzi/sg==",
- "dev": true,
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/static-eval": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/static-eval/-/static-eval-2.1.0.tgz",
- "integrity": "sha512-agtxZ/kWSsCkI5E4QifRwsaPs0P0JmZV6dkLz6ILYfFYQGn+5plctanRN+IC8dJRiFkyXHrwEE3W9Wmx67uDbw==",
- "dev": true,
- "dependencies": {
- "escodegen": "^1.11.1"
+ "node": ">= 14"
}
},
- "node_modules/static-eval/node_modules/escodegen": {
- "version": "1.14.3",
- "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz",
- "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==",
- "dev": true,
+ "node_modules/pac-resolver": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz",
+ "integrity": "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==",
+ "license": "MIT",
"dependencies": {
- "esprima": "^4.0.1",
- "estraverse": "^4.2.0",
- "esutils": "^2.0.2",
- "optionator": "^0.8.1"
- },
- "bin": {
- "escodegen": "bin/escodegen.js",
- "esgenerate": "bin/esgenerate.js"
+ "degenerator": "^5.0.0",
+ "netmask": "^2.0.2"
},
"engines": {
- "node": ">=4.0"
- },
- "optionalDependencies": {
- "source-map": "~0.6.1"
+ "node": ">= 14"
}
},
- "node_modules/static-eval/node_modules/esprima": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
- "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+ "node_modules/package-changed": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/package-changed/-/package-changed-3.0.0.tgz",
+ "integrity": "sha512-HSRbrO+Ab5AuqqYGSevtKJ1Yt96jW1VKV7wrp8K4SKj5tyDp/7D96uPCQyCPiNtWTEH/7nA3hZ4z2slbc9yFxg==",
"dev": true,
- "bin": {
- "esparse": "bin/esparse.js",
- "esvalidate": "bin/esvalidate.js"
+ "license": "ISC",
+ "peer": true,
+ "dependencies": {
+ "commander": "^6.2.0"
},
- "engines": {
- "node": ">=4"
+ "bin": {
+ "package-changed": "bin/package-changed.js"
}
},
- "node_modules/static-eval/node_modules/estraverse": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
- "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
+ "node_modules/package-changed/node_modules/commander": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz",
+ "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==",
"dev": true,
+ "license": "MIT",
+ "peer": true,
"engines": {
- "node": ">=4.0"
+ "node": ">= 6"
}
},
- "node_modules/static-eval/node_modules/levn": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
- "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==",
+ "node_modules/package-directory": {
+ "version": "8.2.0",
+ "resolved": "https://registry.npmjs.org/package-directory/-/package-directory-8.2.0.tgz",
+ "integrity": "sha512-qJSu5Mo6tHmRxCy2KCYYKYgcfBdUpy9dwReaZD/xwf608AUk/MoRtIOWzgDtUeGeC7n/55yC3MI1Q+MbSoektw==",
"dev": true,
+ "license": "MIT",
+ "peer": true,
"dependencies": {
- "prelude-ls": "~1.1.2",
- "type-check": "~0.3.2"
+ "find-up-simple": "^1.0.0"
},
"engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/static-eval/node_modules/optionator": {
- "version": "0.8.3",
- "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz",
- "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==",
- "dev": true,
- "dependencies": {
- "deep-is": "~0.1.3",
- "fast-levenshtein": "~2.0.6",
- "levn": "~0.3.0",
- "prelude-ls": "~1.1.2",
- "type-check": "~0.3.2",
- "word-wrap": "~1.2.3"
+ "node": ">=18"
},
- "engines": {
- "node": ">= 0.8.0"
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/static-eval/node_modules/prelude-ls": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
- "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==",
- "dev": true,
- "engines": {
- "node": ">= 0.8.0"
- }
+ "node_modules/package-json-from-dist": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz",
+ "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==",
+ "license": "BlueOak-1.0.0"
},
- "node_modules/static-eval/node_modules/type-check": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
- "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==",
+ "node_modules/pako": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz",
+ "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==",
"dev": true,
- "dependencies": {
- "prelude-ls": "~1.1.2"
- },
- "engines": {
- "node": ">= 0.8.0"
- }
+ "license": "(MIT AND Zlib)"
},
- "node_modules/static-extend": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
- "integrity": "sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==",
- "dev": true,
+ "node_modules/parse-entities": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz",
+ "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==",
+ "license": "MIT",
"dependencies": {
- "define-property": "^0.2.5",
- "object-copy": "^0.1.0"
+ "@types/unist": "^2.0.0",
+ "character-entities-legacy": "^3.0.0",
+ "character-reference-invalid": "^2.0.0",
+ "decode-named-character-reference": "^1.0.0",
+ "is-alphanumerical": "^2.0.0",
+ "is-decimal": "^2.0.0",
+ "is-hexadecimal": "^2.0.0"
},
- "engines": {
- "node": ">=0.10.0"
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
}
},
- "node_modules/static-extend/node_modules/define-property": {
- "version": "0.2.5",
- "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
- "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==",
+ "node_modules/parse-entities/node_modules/@types/unist": {
+ "version": "2.0.11",
+ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz",
+ "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==",
+ "license": "MIT"
+ },
+ "node_modules/parse-imports-exports": {
+ "version": "0.2.4",
+ "resolved": "https://registry.npmjs.org/parse-imports-exports/-/parse-imports-exports-0.2.4.tgz",
+ "integrity": "sha512-4s6vd6dx1AotCx/RCI2m7t7GCh5bDRUtGNvRfHSP2wbBQdMi67pPe7mtzmgwcaQ8VKK/6IB7Glfyu3qdZJPybQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "is-descriptor": "^0.1.0"
- },
- "engines": {
- "node": ">=0.10.0"
+ "parse-statements": "1.0.11"
}
},
- "node_modules/static-extend/node_modules/is-descriptor": {
- "version": "0.1.7",
- "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.7.tgz",
- "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==",
+ "node_modules/parse-json": {
+ "version": "8.3.0",
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-8.3.0.tgz",
+ "integrity": "sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ==",
"dev": true,
+ "license": "MIT",
+ "peer": true,
"dependencies": {
- "is-accessor-descriptor": "^1.0.1",
- "is-data-descriptor": "^1.0.1"
+ "@babel/code-frame": "^7.26.2",
+ "index-to-position": "^1.1.0",
+ "type-fest": "^4.39.1"
},
"engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/static-module": {
- "version": "2.2.5",
- "resolved": "https://registry.npmjs.org/static-module/-/static-module-2.2.5.tgz",
- "integrity": "sha512-D8vv82E/Kpmz3TXHKG8PPsCPg+RAX6cbCOyvjM6x04qZtQ47EtJFVwRsdov3n5d6/6ynrOY9XB4JkaZwB2xoRQ==",
- "dev": true,
- "dependencies": {
- "concat-stream": "~1.6.0",
- "convert-source-map": "^1.5.1",
- "duplexer2": "~0.1.4",
- "escodegen": "~1.9.0",
- "falafel": "^2.1.0",
- "has": "^1.0.1",
- "magic-string": "^0.22.4",
- "merge-source-map": "1.0.4",
- "object-inspect": "~1.4.0",
- "quote-stream": "~1.0.2",
- "readable-stream": "~2.3.3",
- "shallow-copy": "~0.0.1",
- "static-eval": "^2.0.0",
- "through2": "~2.0.3"
- }
- },
- "node_modules/static-module/node_modules/convert-source-map": {
- "version": "1.9.0",
- "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz",
- "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==",
- "dev": true
- },
- "node_modules/static-module/node_modules/isarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
- "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
- "dev": true
- },
- "node_modules/static-module/node_modules/object-inspect": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.4.1.tgz",
- "integrity": "sha512-wqdhLpfCUbEsoEwl3FXwGyv8ief1k/1aUdIPCqVnupM6e8l63BEJdiF/0swtn04/8p05tG/T0FrpTlfwvljOdw==",
- "dev": true
- },
- "node_modules/static-module/node_modules/readable-stream": {
- "version": "2.3.8",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
- "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
- "dev": true,
- "dependencies": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.3",
- "isarray": "~1.0.0",
- "process-nextick-args": "~2.0.0",
- "safe-buffer": "~5.1.1",
- "string_decoder": "~1.1.1",
- "util-deprecate": "~1.0.1"
- }
- },
- "node_modules/static-module/node_modules/safe-buffer": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
- "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
- "dev": true
- },
- "node_modules/static-module/node_modules/string_decoder": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
- "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
- "dev": true,
- "dependencies": {
- "safe-buffer": "~5.1.0"
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/statuses": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
- "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
+ "node_modules/parse-json/node_modules/type-fest": {
+ "version": "4.41.0",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz",
+ "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==",
"dev": true,
+ "license": "(MIT OR CC0-1.0)",
+ "peer": true,
"engines": {
- "node": ">= 0.8"
+ "node": ">=16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/stealthy-require": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz",
- "integrity": "sha512-ZnWpYnYugiOVEY5GkcuJK1io5V8QmNYChG62gSit9pQVGErXtrKuPC55ITaVSukmMta5qpMU7vqLt2Lnni4f/g==",
+ "node_modules/parse-listing": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/parse-listing/-/parse-listing-1.1.3.tgz",
+ "integrity": "sha512-a1p1i+9Qyc8pJNwdrSvW1g5TPxRH0sywVi6OzVvYHRo6xwF9bDWBxtH0KkxeOOvhUE8vAMtiSfsYQFOuK901eA==",
"dev": true,
"engines": {
- "node": ">=0.10.0"
+ "node": ">=0.6.21"
}
},
- "node_modules/stream-browserify": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz",
- "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==",
+ "node_modules/parse-statements": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/parse-statements/-/parse-statements-1.0.11.tgz",
+ "integrity": "sha512-HlsyYdMBnbPQ9Jr/VgJ1YF4scnldvJpJxCVx6KgqPL4dxppsWrJHCIIxQXMJrqGnsRkNPATbeMJ8Yxu7JMsYcA==",
"dev": true,
+ "license": "MIT"
+ },
+ "node_modules/parse5": {
+ "version": "7.3.0",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz",
+ "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==",
+ "license": "MIT",
"dependencies": {
- "inherits": "~2.0.1",
- "readable-stream": "^2.0.2"
+ "entities": "^6.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/inikulin/parse5?sponsor=1"
}
},
- "node_modules/stream-browserify/node_modules/isarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
- "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
- "dev": true
- },
- "node_modules/stream-browserify/node_modules/readable-stream": {
- "version": "2.3.8",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
- "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
- "dev": true,
+ "node_modules/parse5-htmlparser2-tree-adapter": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.1.0.tgz",
+ "integrity": "sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==",
+ "license": "MIT",
"dependencies": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.3",
- "isarray": "~1.0.0",
- "process-nextick-args": "~2.0.0",
- "safe-buffer": "~5.1.1",
- "string_decoder": "~1.1.1",
- "util-deprecate": "~1.0.1"
+ "domhandler": "^5.0.3",
+ "parse5": "^7.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/inikulin/parse5?sponsor=1"
}
},
- "node_modules/stream-browserify/node_modules/safe-buffer": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
- "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
- "dev": true
- },
- "node_modules/stream-browserify/node_modules/string_decoder": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
- "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
- "dev": true,
+ "node_modules/parse5-parser-stream": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/parse5-parser-stream/-/parse5-parser-stream-7.1.2.tgz",
+ "integrity": "sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==",
+ "license": "MIT",
"dependencies": {
- "safe-buffer": "~5.1.0"
+ "parse5": "^7.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/inikulin/parse5?sponsor=1"
}
},
- "node_modules/stream-buffers": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-2.2.0.tgz",
- "integrity": "sha512-uyQK/mx5QjHun80FLJTfaWE7JtwfRMKBLkMne6udYOmvH0CawotVa7TfgYHzAnpphn4+TweIx1QKMnRIbipmUg==",
- "dev": true,
+ "node_modules/parse5/node_modules/entities": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz",
+ "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==",
+ "license": "BSD-2-Clause",
"engines": {
- "node": ">= 0.10.0"
+ "node": ">=0.12"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
}
},
- "node_modules/stream-combiner": {
- "version": "0.2.2",
- "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.2.2.tgz",
- "integrity": "sha512-6yHMqgLYDzQDcAkL+tjJDC5nSNuNIx0vZtRZeiPh7Saef7VHX9H5Ijn9l2VIol2zaNYlYEX6KyuT/237A58qEQ==",
+ "node_modules/parseurl": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
+ "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
"dev": true,
- "dependencies": {
- "duplexer": "~0.1.1",
- "through": "~2.3.4"
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">= 0.8"
}
},
- "node_modules/stream-http": {
- "version": "2.8.3",
- "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz",
- "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==",
+ "node_modules/path-exists": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
"dev": true,
- "dependencies": {
- "builtin-status-codes": "^3.0.0",
- "inherits": "^2.0.1",
- "readable-stream": "^2.3.6",
- "to-arraybuffer": "^1.0.0",
- "xtend": "^4.0.0"
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
}
},
- "node_modules/stream-http/node_modules/isarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
- "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
- "dev": true
+ "node_modules/path-expression-matcher": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/path-expression-matcher/-/path-expression-matcher-1.5.0.tgz",
+ "integrity": "sha512-cbrerZV+6rvdQrrD+iGMcZFEiiSrbv9Tfdkvnusy6y0x0GKBXREFg/Y65GhIfm0tnLntThhzCnfKwp1WRjeCyQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/NaturalIntelligence"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=14.0.0"
+ }
},
- "node_modules/stream-http/node_modules/readable-stream": {
- "version": "2.3.8",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
- "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
+ "node_modules/path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
"dev": true,
- "dependencies": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.3",
- "isarray": "~1.0.0",
- "process-nextick-args": "~2.0.0",
- "safe-buffer": "~5.1.1",
- "string_decoder": "~1.1.1",
- "util-deprecate": "~1.0.1"
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "node_modules/stream-http/node_modules/safe-buffer": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
- "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
- "dev": true
+ "node_modules/path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
},
- "node_modules/stream-http/node_modules/string_decoder": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
- "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "node_modules/path-scurry": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.2.tgz",
+ "integrity": "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==",
"dev": true,
+ "license": "BlueOak-1.0.0",
"dependencies": {
- "safe-buffer": "~5.1.0"
+ "lru-cache": "^11.0.0",
+ "minipass": "^7.1.2"
+ },
+ "engines": {
+ "node": "18 || 20 || >=22"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
}
},
- "node_modules/streamx": {
- "version": "2.15.6",
- "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.15.6.tgz",
- "integrity": "sha512-q+vQL4AAz+FdfT137VF69Cc/APqUbxy+MDOImRrMvchJpigHj9GksgDU2LYbO9rx7RX6osWgxJB2WxhYv4SZAw==",
+ "node_modules/path-to-regexp": {
+ "version": "8.4.2",
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.4.2.tgz",
+ "integrity": "sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA==",
"dev": true,
- "dependencies": {
- "fast-fifo": "^1.1.0",
- "queue-tick": "^1.0.1"
+ "license": "MIT",
+ "peer": true,
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
}
},
- "node_modules/string_decoder": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
- "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
+ "node_modules/pathe": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz",
+ "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==",
"dev": true,
- "dependencies": {
- "safe-buffer": "~5.2.0"
+ "license": "MIT"
+ },
+ "node_modules/pe-library": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/pe-library/-/pe-library-0.4.1.tgz",
+ "integrity": "sha512-eRWB5LBz7PpDu4PUlwT0PhnQfTQJlDDdPa35urV4Osrm0t0AqQFGn+UIkU3klZvwJ8KPO3VbBFsXquA6p6kqZw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12",
+ "npm": ">=6"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/jet2jet"
}
},
- "node_modules/string-convert": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/string-convert/-/string-convert-0.2.1.tgz",
- "integrity": "sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A=="
+ "node_modules/pend": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz",
+ "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==",
+ "license": "MIT"
},
- "node_modules/string-hash": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/string-hash/-/string-hash-1.1.3.tgz",
- "integrity": "sha512-kJUvRUFK49aub+a7T1nNE66EJbZBMnBgoC1UbCZ5n6bsZKBRga4KgBRTMn/pFkeCZSYtNeSyMxPDM0AXWELk2A==",
- "dev": true
+ "node_modules/picocolors": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
+ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
+ "dev": true,
+ "license": "ISC"
},
- "node_modules/string-width": {
- "version": "4.2.3",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
- "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "node_modules/picomatch": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz",
+ "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==",
"dev": true,
- "dependencies": {
- "emoji-regex": "^8.0.0",
- "is-fullwidth-code-point": "^3.0.0",
- "strip-ansi": "^6.0.1"
- },
+ "license": "MIT",
"engines": {
- "node": ">=8"
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
}
},
- "node_modules/string-width-cjs": {
- "name": "string-width",
- "version": "4.2.3",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
- "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "node_modules/pkijs": {
+ "version": "3.4.0",
+ "resolved": "https://registry.npmjs.org/pkijs/-/pkijs-3.4.0.tgz",
+ "integrity": "sha512-emEcLuomt2j03vxD54giVB4SxTjnsqkU692xZOZXHDVoYyypEm+b3jpiTcc+Cf+myooc+/Ly0z01jqeNHVgJGw==",
"dev": true,
+ "license": "BSD-3-Clause",
"dependencies": {
- "emoji-regex": "^8.0.0",
- "is-fullwidth-code-point": "^3.0.0",
- "strip-ansi": "^6.0.1"
+ "@noble/hashes": "1.4.0",
+ "asn1js": "^3.0.6",
+ "bytestreamjs": "^2.0.1",
+ "pvtsutils": "^1.3.6",
+ "pvutils": "^1.1.3",
+ "tslib": "^2.8.1"
},
"engines": {
- "node": ">=8"
+ "node": ">=16.0.0"
}
},
- "node_modules/string.prototype.matchall": {
- "version": "4.0.10",
- "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz",
- "integrity": "sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==",
+ "node_modules/pkijs/node_modules/@noble/hashes": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz",
+ "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==",
"dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.2.0",
- "es-abstract": "^1.22.1",
- "get-intrinsic": "^1.2.1",
- "has-symbols": "^1.0.3",
- "internal-slot": "^1.0.5",
- "regexp.prototype.flags": "^1.5.0",
- "set-function-name": "^2.0.0",
- "side-channel": "^1.0.4"
+ "license": "MIT",
+ "engines": {
+ "node": ">= 16"
},
"funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "url": "https://paulmillr.com/funding/"
}
},
- "node_modules/string.prototype.trim": {
- "version": "1.2.8",
- "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz",
- "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==",
+ "node_modules/plist": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz",
+ "integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.2.0",
- "es-abstract": "^1.22.1"
+ "@xmldom/xmldom": "^0.8.8",
+ "base64-js": "^1.5.1",
+ "xmlbuilder": "^15.1.1"
},
"engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "node": ">=10.4.0"
}
},
- "node_modules/string.prototype.trimend": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz",
- "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==",
+ "node_modules/plist/node_modules/@xmldom/xmldom": {
+ "version": "0.8.13",
+ "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.13.tgz",
+ "integrity": "sha512-KRYzxepc14G/CEpEGc3Yn+JKaAeT63smlDr+vjB8jRfgTBBI9wRj/nkQEO+ucV8p8I9bfKLWp37uHgFrbntPvw==",
"dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.2.0",
- "es-abstract": "^1.22.1"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "license": "MIT",
+ "engines": {
+ "node": ">=10.0.0"
}
},
- "node_modules/string.prototype.trimstart": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz",
- "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==",
+ "node_modules/pluralize": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz",
+ "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==",
"dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.2.0",
- "es-abstract": "^1.22.1"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
}
},
- "node_modules/strip-ansi": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
- "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "node_modules/postcss": {
+ "version": "8.5.10",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.10.tgz",
+ "integrity": "sha512-pMMHxBOZKFU6HgAZ4eyGnwXF/EvPGGqUr0MnZ5+99485wwW41kW91A4LOGxSHhgugZmSChL5AlElNdwlNgcnLQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
"dependencies": {
- "ansi-regex": "^5.0.1"
+ "nanoid": "^3.3.11",
+ "picocolors": "^1.1.1",
+ "source-map-js": "^1.2.1"
},
"engines": {
- "node": ">=8"
+ "node": "^10 || ^12 || >=14"
}
},
- "node_modules/strip-ansi-cjs": {
- "name": "strip-ansi",
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
- "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "node_modules/postject": {
+ "version": "1.0.0-alpha.6",
+ "resolved": "https://registry.npmjs.org/postject/-/postject-1.0.0-alpha.6.tgz",
+ "integrity": "sha512-b9Eb8h2eVqNE8edvKdwqkrY6O7kAwmI8kcnBv1NScolYJbo59XUF0noFq+lxbC1yN20bmC0WBEbDC5H/7ASb0A==",
"dev": true,
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
- "ansi-regex": "^5.0.1"
+ "commander": "^9.4.0"
+ },
+ "bin": {
+ "postject": "dist/cli.js"
},
"engines": {
- "node": ">=8"
+ "node": ">=14.0.0"
}
},
- "node_modules/strip-bom": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
- "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==",
+ "node_modules/postject/node_modules/commander": {
+ "version": "9.5.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz",
+ "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
+ "engines": {
+ "node": "^12.20.0 || >=14"
+ }
+ },
+ "node_modules/prelude-ls": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
+ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
"dev": true,
+ "license": "MIT",
"engines": {
- "node": ">=4"
+ "node": ">= 0.8.0"
}
},
- "node_modules/strip-json-comments": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
- "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+ "node_modules/prettier": {
+ "version": "3.8.4",
+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.4.tgz",
+ "integrity": "sha512-N2MylSdi48+5N/6S5j+maeHbUSIzzZ5uOcX5Hm4QpV8Dkb1HFjfAKTKX6yNPJQD9AhcT3ifHNB66tWTTJDi11Q==",
"dev": true,
+ "license": "MIT",
+ "bin": {
+ "prettier": "bin/prettier.cjs"
+ },
"engines": {
- "node": ">=8"
+ "node": ">=14"
},
"funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "url": "https://github.com/prettier/prettier?sponsor=1"
}
},
- "node_modules/stylehacks": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.3.tgz",
- "integrity": "sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==",
+ "node_modules/proc-log": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-6.1.0.tgz",
+ "integrity": "sha512-iG+GYldRf2BQ0UDUAd6JQ/RwzaQy6mXmsk/IzlYyal4A4SNFw54MeH4/tLkF4I5WoWG9SQwuqWzS99jaFQHBuQ==",
"dev": true,
- "dependencies": {
- "browserslist": "^4.0.0",
- "postcss": "^7.0.0",
- "postcss-selector-parser": "^3.0.0"
- },
+ "license": "ISC",
"engines": {
- "node": ">=6.9.0"
+ "node": "^20.17.0 || >=22.9.0"
}
},
- "node_modules/stylehacks/node_modules/postcss-selector-parser": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz",
- "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==",
+ "node_modules/process": {
+ "version": "0.11.10",
+ "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
+ "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==",
"dev": true,
- "dependencies": {
- "dot-prop": "^5.2.0",
- "indexes-of": "^1.0.1",
- "uniq": "^1.0.1"
- },
+ "license": "MIT",
"engines": {
- "node": ">=8"
+ "node": ">= 0.6.0"
}
},
- "node_modules/sumchecker": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-3.0.1.tgz",
- "integrity": "sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==",
- "dependencies": {
- "debug": "^4.1.0"
- },
+ "node_modules/process-nextick-args": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
+ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/progress": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
+ "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
+ "license": "MIT",
"engines": {
- "node": ">= 8.0"
+ "node": ">=0.4.0"
}
},
- "node_modules/supports-color": {
- "version": "8.1.1",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
- "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
+ "node_modules/promise-retry": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz",
+ "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "has-flag": "^4.0.0"
+ "err-code": "^2.0.2",
+ "retry": "^0.12.0"
},
"engines": {
"node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/supports-color?sponsor=1"
}
},
- "node_modules/supports-preserve-symlinks-flag": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
- "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
+ "node_modules/proper-lockfile": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/proper-lockfile/-/proper-lockfile-4.1.2.tgz",
+ "integrity": "sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==",
"dev": true,
- "engines": {
- "node": ">= 0.4"
- },
+ "license": "MIT",
+ "dependencies": {
+ "graceful-fs": "^4.2.4",
+ "retry": "^0.12.0",
+ "signal-exit": "^3.0.2"
+ }
+ },
+ "node_modules/property-information": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz",
+ "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==",
+ "license": "MIT",
"funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
}
},
- "node_modules/svgo": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz",
- "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==",
- "deprecated": "This SVGO version is no longer supported. Upgrade to v2.x.x.",
- "dev": true,
- "dependencies": {
- "chalk": "^2.4.1",
- "coa": "^2.0.2",
- "css-select": "^2.0.0",
- "css-select-base-adapter": "^0.1.1",
- "css-tree": "1.0.0-alpha.37",
- "csso": "^4.0.2",
- "js-yaml": "^3.13.1",
- "mkdirp": "~0.5.1",
- "object.values": "^1.1.0",
- "sax": "~1.2.4",
- "stable": "^0.1.8",
- "unquote": "~1.1.1",
- "util.promisify": "~1.0.0"
- },
- "bin": {
- "svgo": "bin/svgo"
+ "node_modules/proxy-addr": {
+ "version": "2.0.7",
+ "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
+ "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "forwarded": "0.2.0",
+ "ipaddr.js": "1.9.1"
},
"engines": {
- "node": ">=4.0.0"
+ "node": ">= 0.10"
}
},
- "node_modules/svgo/node_modules/argparse": {
- "version": "1.0.10",
- "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
- "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
- "dev": true,
+ "node_modules/proxy-agent": {
+ "version": "6.5.0",
+ "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.5.0.tgz",
+ "integrity": "sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A==",
+ "license": "MIT",
"dependencies": {
- "sprintf-js": "~1.0.2"
+ "agent-base": "^7.1.2",
+ "debug": "^4.3.4",
+ "http-proxy-agent": "^7.0.1",
+ "https-proxy-agent": "^7.0.6",
+ "lru-cache": "^7.14.1",
+ "pac-proxy-agent": "^7.1.0",
+ "proxy-from-env": "^1.1.0",
+ "socks-proxy-agent": "^8.0.5"
+ },
+ "engines": {
+ "node": ">= 14"
}
},
- "node_modules/svgo/node_modules/css-select": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz",
- "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==",
- "dev": true,
+ "node_modules/proxy-agent/node_modules/lru-cache": {
+ "version": "7.18.3",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz",
+ "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/proxy-from-env": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
+ "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==",
+ "license": "MIT"
+ },
+ "node_modules/pump": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz",
+ "integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==",
+ "license": "MIT",
"dependencies": {
- "boolbase": "^1.0.0",
- "css-what": "^3.2.1",
- "domutils": "^1.7.0",
- "nth-check": "^1.0.2"
+ "end-of-stream": "^1.1.0",
+ "once": "^1.3.1"
}
},
- "node_modules/svgo/node_modules/css-what": {
- "version": "3.4.2",
- "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz",
- "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==",
+ "node_modules/punycode": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
+ "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
"dev": true,
+ "license": "MIT",
"engines": {
- "node": ">= 6"
- },
- "funding": {
- "url": "https://github.com/sponsors/fb55"
+ "node": ">=6"
}
},
- "node_modules/svgo/node_modules/dom-serializer": {
- "version": "0.2.2",
- "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz",
- "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==",
+ "node_modules/pvtsutils": {
+ "version": "1.3.6",
+ "resolved": "https://registry.npmjs.org/pvtsutils/-/pvtsutils-1.3.6.tgz",
+ "integrity": "sha512-PLgQXQ6H2FWCaeRak8vvk1GW462lMxB5s3Jm673N82zI4vqtVUPuZdffdZbPDFRoU8kAhItWFtPCWiPpp4/EDg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "domelementtype": "^2.0.1",
- "entities": "^2.0.0"
+ "tslib": "^2.8.1"
}
},
- "node_modules/svgo/node_modules/domutils": {
- "version": "1.7.0",
- "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz",
- "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==",
+ "node_modules/pvutils": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/pvutils/-/pvutils-1.1.5.tgz",
+ "integrity": "sha512-KTqnxsgGiQ6ZAzZCVlJH5eOjSnvlyEgx1m8bkRJfOhmGRqfo5KLvmAlACQkrjEtOQ4B7wF9TdSLIs9O90MX9xA==",
"dev": true,
- "dependencies": {
- "dom-serializer": "0",
- "domelementtype": "1"
+ "license": "MIT",
+ "engines": {
+ "node": ">=16.0.0"
}
},
- "node_modules/svgo/node_modules/domutils/node_modules/domelementtype": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz",
- "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==",
- "dev": true
- },
- "node_modules/svgo/node_modules/esprima": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
- "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+ "node_modules/qs": {
+ "version": "6.15.2",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.2.tgz",
+ "integrity": "sha512-Rzq0KEyX/w/tEybncDgdkZrJgVUsUMk3xjh3t5bv3S1HTAtg+uOYt72+ZfwiQwKdysThkTBdL/rTi6HDmX9Ddw==",
"dev": true,
- "bin": {
- "esparse": "bin/esparse.js",
- "esvalidate": "bin/esvalidate.js"
+ "license": "BSD-3-Clause",
+ "peer": true,
+ "dependencies": {
+ "side-channel": "^1.1.0"
},
"engines": {
- "node": ">=4"
+ "node": ">=0.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/svgo/node_modules/js-yaml": {
- "version": "3.14.1",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
- "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
+ "node_modules/quick-lru": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz",
+ "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==",
"dev": true,
- "dependencies": {
- "argparse": "^1.0.7",
- "esprima": "^4.0.0"
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
},
- "bin": {
- "js-yaml": "bin/js-yaml.js"
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/svgo/node_modules/mkdirp": {
- "version": "0.5.6",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz",
- "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
+ "node_modules/range-parser": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
+ "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
"dev": true,
- "dependencies": {
- "minimist": "^1.2.6"
- },
- "bin": {
- "mkdirp": "bin/cmd.js"
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">= 0.6"
}
},
- "node_modules/svgo/node_modules/nth-check": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz",
- "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==",
+ "node_modules/raw-body": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz",
+ "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==",
"dev": true,
+ "license": "MIT",
+ "peer": true,
"dependencies": {
- "boolbase": "~1.0.0"
+ "bytes": "~3.1.2",
+ "http-errors": "~2.0.1",
+ "iconv-lite": "~0.7.0",
+ "unpipe": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.10"
}
},
- "node_modules/svgo/node_modules/sax": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
- "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==",
- "dev": true
- },
- "node_modules/svgo/node_modules/sprintf-js": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
- "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==",
- "dev": true
+ "node_modules/react": {
+ "version": "19.2.7",
+ "resolved": "https://registry.npmjs.org/react/-/react-19.2.7.tgz",
+ "integrity": "sha512-HNe9WslTbXmFK8o8cmwgAeJFSBvt1bPdHCVKtaaV+WlAN36mpT4hcRpwbf3fY56ar2oIXzsBpOAiIRHAdY0OlQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
},
- "node_modules/symbol-tree": {
- "version": "3.2.4",
- "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz",
- "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==",
- "dev": true
+ "node_modules/react-dom": {
+ "version": "19.2.7",
+ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.7.tgz",
+ "integrity": "sha512-t0BRVXvbiE/o20Hfw669rLbMCDWtYZLvmJigy2f0MxsXF+71pxhR3xOkspmsO8h3ZlNzyibAmtCa3l4lYKk6gQ==",
+ "license": "MIT",
+ "dependencies": {
+ "scheduler": "^0.27.0"
+ },
+ "peerDependencies": {
+ "react": "^19.2.7"
+ }
},
- "node_modules/tar": {
- "version": "6.2.0",
- "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz",
- "integrity": "sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==",
- "dev": true,
+ "node_modules/react-i18next": {
+ "version": "17.0.8",
+ "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-17.0.8.tgz",
+ "integrity": "sha512-0ooKbGLU8JXhe1zwpQUWIeXSgLPOfwJmgheWRIUpcoA0CpyabpGhayjdG+/eA5esC1AQ8h2jWpXjJfzQzeDOCw==",
+ "license": "MIT",
"dependencies": {
- "chownr": "^2.0.0",
- "fs-minipass": "^2.0.0",
- "minipass": "^5.0.0",
- "minizlib": "^2.1.1",
- "mkdirp": "^1.0.3",
- "yallist": "^4.0.0"
+ "@babel/runtime": "^7.29.2",
+ "html-parse-stringify": "^3.0.1",
+ "use-sync-external-store": "^1.6.0"
},
- "engines": {
- "node": ">=10"
+ "peerDependencies": {
+ "i18next": ">= 26.2.0",
+ "react": ">= 16.8.0",
+ "typescript": "^5 || ^6"
+ },
+ "peerDependenciesMeta": {
+ "react-dom": {
+ "optional": true
+ },
+ "react-native": {
+ "optional": true
+ },
+ "typescript": {
+ "optional": true
+ }
}
},
- "node_modules/tar-fs": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.4.tgz",
- "integrity": "sha512-5AFQU8b9qLfZCX9zp2duONhPmZv0hGYiBPJsyUdqMjzq/mqVpy/rEUSeHk1+YitmxugaptgBh5oDGU3VsAJq4w==",
- "dev": true,
+ "node_modules/react-is": {
+ "version": "18.3.1",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz",
+ "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==",
+ "license": "MIT"
+ },
+ "node_modules/react-redux": {
+ "version": "9.3.0",
+ "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.3.0.tgz",
+ "integrity": "sha512-KQopgqFo/p/fgmAs5qz6p5RWaNAzq40WAu7fJIXnQpYxFPbJYtsJPWvGeF2rOBaY/kEuV77AVsX8TsQzKm+A/g==",
+ "license": "MIT",
"dependencies": {
- "mkdirp-classic": "^0.5.2",
- "pump": "^3.0.0",
- "tar-stream": "^3.1.5"
+ "@types/use-sync-external-store": "^0.0.6",
+ "use-sync-external-store": "^1.4.0"
+ },
+ "peerDependencies": {
+ "@types/react": "^18.2.25 || ^19",
+ "react": "^18.0 || ^19",
+ "redux": "^5.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "redux": {
+ "optional": true
+ }
}
},
- "node_modules/tar-stream": {
- "version": "3.1.6",
- "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.6.tgz",
- "integrity": "sha512-B/UyjYwPpMBv+PaFSWAmtYjwdrlEaZQEhMIBFNC5oEG8lpiW8XjcSdmEaClj28ArfKScKHs2nshz3k2le6crsg==",
- "dev": true,
+ "node_modules/react-refractor": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/react-refractor/-/react-refractor-4.0.0.tgz",
+ "integrity": "sha512-2VMRH3HA/Nu+tMFzyQwdBK0my0BIZy1pkWHhjuSrplMyf8ZLx/Gw7tUXV0t2JbEsbSNHbEc9TbHhq3sUx2seVA==",
+ "license": "MIT",
"dependencies": {
- "b4a": "^1.6.4",
- "fast-fifo": "^1.2.0",
- "streamx": "^2.15.0"
+ "refractor": "^5.0.0",
+ "unist-util-filter": "^5.0.1",
+ "unist-util-visit-parents": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=20.0.0"
+ },
+ "peerDependencies": {
+ "react": ">=18.0.0"
}
},
- "node_modules/tar/node_modules/minipass": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz",
- "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==",
+ "node_modules/react-refresh": {
+ "version": "0.18.0",
+ "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.18.0.tgz",
+ "integrity": "sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw==",
"dev": true,
+ "license": "MIT",
"engines": {
- "node": ">=8"
+ "node": ">=0.10.0"
}
},
- "node_modules/tar/node_modules/yallist": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
- "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
- "dev": true
- },
- "node_modules/teen_process": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/teen_process/-/teen_process-2.1.1.tgz",
- "integrity": "sha512-PIX+PyH6h52uJeGpXfjLdIBRim5pPkJTkO/PPeLCa5NlofqlasTjcvNUUYo6XurnxSTl0o17sBzIrVoXNuqwGg==",
- "dev": true,
+ "node_modules/react-router": {
+ "version": "7.18.0",
+ "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.18.0.tgz",
+ "integrity": "sha512-pTTGt8J+ji1NOmYnjzT+bAJy/1zD+Jp4ziO6cL7T3ZLvXKtusO7BpFqlRXitqpcPVqllsIXFHRMt+2/k3Xn6HQ==",
+ "license": "MIT",
"dependencies": {
- "bluebird": "^3.7.2",
- "lodash": "^4.17.21",
- "shell-quote": "^1.8.1",
- "source-map-support": "^0.x"
+ "cookie": "^1.0.1",
+ "set-cookie-parser": "^2.6.0"
},
"engines": {
- "node": "^16.13.0 || >=18.0.0",
- "npm": ">=8"
+ "node": ">=20.0.0"
+ },
+ "peerDependencies": {
+ "react": ">=18",
+ "react-dom": ">=18"
+ },
+ "peerDependenciesMeta": {
+ "react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/react-router/node_modules/cookie": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz",
+ "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
}
},
- "node_modules/temp-file": {
- "version": "3.4.0",
- "resolved": "https://registry.npmjs.org/temp-file/-/temp-file-3.4.0.tgz",
- "integrity": "sha512-C5tjlC/HCtVUOi3KWVokd4vHVViOmGjtLwIh4MuzPo/nMYTV/p1urt3RnMz2IWXDdKEGJH3k5+KPxtqRsUYGtg==",
+ "node_modules/read-binary-file-arch": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/read-binary-file-arch/-/read-binary-file-arch-1.0.6.tgz",
+ "integrity": "sha512-BNg9EN3DD3GsDXX7Aa8O4p92sryjkmzYYgmgTAc6CA4uGLEDzFfxOxugu21akOxpcXHiEgsYkC6nPsQvLLLmEg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "async-exit-hook": "^2.0.1",
- "fs-extra": "^10.0.0"
+ "debug": "^4.3.4"
+ },
+ "bin": {
+ "read-binary-file-arch": "cli.js"
}
},
- "node_modules/temp-file/node_modules/fs-extra": {
+ "node_modules/read-pkg": {
"version": "10.1.0",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz",
- "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==",
+ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-10.1.0.tgz",
+ "integrity": "sha512-I8g2lArQiP78ll51UeMZojewtYgIRCKCWqZEgOO8c/uefTI+XDXvCSXu3+YNUaTNvZzobrL5+SqHjBrByRRTdg==",
"dev": true,
+ "license": "MIT",
+ "peer": true,
"dependencies": {
- "graceful-fs": "^4.2.0",
- "jsonfile": "^6.0.1",
- "universalify": "^2.0.0"
+ "@types/normalize-package-data": "^2.4.4",
+ "normalize-package-data": "^8.0.0",
+ "parse-json": "^8.3.0",
+ "type-fest": "^5.4.4",
+ "unicorn-magic": "^0.4.0"
},
"engines": {
- "node": ">=12"
+ "node": ">=20"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/temp-file/node_modules/jsonfile": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
- "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
+ "node_modules/readable-stream": {
+ "version": "4.7.0",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz",
+ "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "universalify": "^2.0.0"
+ "abort-controller": "^3.0.0",
+ "buffer": "^6.0.3",
+ "events": "^3.3.0",
+ "process": "^0.11.10",
+ "string_decoder": "^1.3.0"
},
- "optionalDependencies": {
- "graceful-fs": "^4.1.6"
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
}
},
- "node_modules/temp-file/node_modules/universalify": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
- "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
+ "node_modules/readable-stream/node_modules/buffer": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz",
+ "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==",
"dev": true,
- "engines": {
- "node": ">= 10.0.0"
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "base64-js": "^1.3.1",
+ "ieee754": "^1.2.1"
}
},
- "node_modules/terser": {
- "version": "3.17.0",
- "resolved": "https://registry.npmjs.org/terser/-/terser-3.17.0.tgz",
- "integrity": "sha512-/FQzzPJmCpjAH9Xvk2paiWrFq+5M6aVOf+2KRbwhByISDX/EujxsK+BAvrhb6H+2rtrLCHK9N01wO014vrIwVQ==",
+ "node_modules/readdir-glob": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-3.0.0.tgz",
+ "integrity": "sha512-AhNB2KgKeVJr16nK9LLZbJNWnYoT23ZrumNKFDebHBdkC8KHSqWo871JAUhoWC/RtjEVdqNMFpM6qrwRbaUqpw==",
"dev": true,
+ "license": "Apache-2.0",
"dependencies": {
- "commander": "^2.19.0",
- "source-map": "~0.6.1",
- "source-map-support": "~0.5.10"
- },
- "bin": {
- "terser": "bin/uglifyjs"
+ "minimatch": "^10.2.2"
},
"engines": {
- "node": ">=6.0.0"
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/yqnn"
}
},
- "node_modules/terser/node_modules/commander": {
- "version": "2.20.3",
- "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
- "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
- "dev": true
- },
- "node_modules/text-hex": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz",
- "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==",
+ "node_modules/readdir-glob/node_modules/minimatch": {
+ "version": "10.2.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz",
+ "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==",
"dev": true,
- "peer": true
- },
- "node_modules/text-table": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
- "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==",
- "dev": true
- },
- "node_modules/throttle-debounce": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-5.0.0.tgz",
- "integrity": "sha512-2iQTSgkkc1Zyk0MeVrt/3BvuOXYPl/R8Z0U2xxo9rjwNciaHDG3R+Lm6dh4EeUci49DanvBnuqI6jshoQQRGEg==",
+ "license": "BlueOak-1.0.0",
+ "dependencies": {
+ "brace-expansion": "^5.0.5"
+ },
"engines": {
- "node": ">=12.22"
+ "node": "18 || 20 || >=22"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
}
},
- "node_modules/through": {
- "version": "2.3.8",
- "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
- "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==",
- "dev": true
+ "node_modules/redux": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz",
+ "integrity": "sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==",
+ "license": "MIT"
},
- "node_modules/through2": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
- "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==",
- "dev": true,
- "dependencies": {
- "readable-stream": "~2.3.6",
- "xtend": "~4.0.1"
+ "node_modules/redux-thunk": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-3.1.0.tgz",
+ "integrity": "sha512-NW2r5T6ksUKXCabzhL9z+h206HQw/NJkcLm1GPImRQ8IzfXwRGqjVhKJGauHirT0DAuyy6hjdnMZaRoAcy0Klw==",
+ "license": "MIT",
+ "peerDependencies": {
+ "redux": "^5.0.0"
}
},
- "node_modules/through2/node_modules/isarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
- "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
- "dev": true
+ "node_modules/refractor": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/refractor/-/refractor-5.0.0.tgz",
+ "integrity": "sha512-QXOrHQF5jOpjjLfiNk5GFnWhRXvxjUVnlFxkeDmewR5sXkr3iM46Zo+CnRR8B+MDVqkULW4EcLVcRBNOPXHosw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "@types/prismjs": "^1.0.0",
+ "hastscript": "^9.0.0",
+ "parse-entities": "^4.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
},
- "node_modules/through2/node_modules/readable-stream": {
- "version": "2.3.8",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
- "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
+ "node_modules/regjsparser": {
+ "version": "0.13.0",
+ "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.13.0.tgz",
+ "integrity": "sha512-NZQZdC5wOE/H3UT28fVGL+ikOZcEzfMGk/c3iN9UGxzWHMa1op7274oyiUVrAG4B2EuFhus8SvkaYnhvW92p9Q==",
"dev": true,
+ "license": "BSD-2-Clause",
"dependencies": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.3",
- "isarray": "~1.0.0",
- "process-nextick-args": "~2.0.0",
- "safe-buffer": "~5.1.1",
- "string_decoder": "~1.1.1",
- "util-deprecate": "~1.0.1"
+ "jsesc": "~3.1.0"
+ },
+ "bin": {
+ "regjsparser": "bin/parser"
}
},
- "node_modules/through2/node_modules/safe-buffer": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
- "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
- "dev": true
+ "node_modules/require-directory": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+ "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
},
- "node_modules/through2/node_modules/string_decoder": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
- "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "node_modules/require-from-string": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
+ "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
"dev": true,
- "dependencies": {
- "safe-buffer": "~5.1.0"
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "node_modules/timers-browserify": {
- "version": "2.0.12",
- "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz",
- "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==",
+ "node_modules/resedit": {
+ "version": "1.7.2",
+ "resolved": "https://registry.npmjs.org/resedit/-/resedit-1.7.2.tgz",
+ "integrity": "sha512-vHjcY2MlAITJhC0eRD/Vv8Vlgmu9Sd3LX9zZvtGzU5ZImdTN3+d6e/4mnTyV8vEbyf1sgNIrWxhWlrys52OkEA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "setimmediate": "^1.0.4"
+ "pe-library": "^0.4.1"
},
"engines": {
- "node": ">=0.6.0"
+ "node": ">=12",
+ "npm": ">=6"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/jet2jet"
}
},
- "node_modules/timsort": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz",
- "integrity": "sha512-qsdtZH+vMoCARQtyod4imc2nIJwg9Cc7lPRrw9CzF8ZKR0khdr8+2nX80PBhET3tcyTtJDxAffGh2rXH4tyU8A==",
- "dev": true
+ "node_modules/reselect": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/reselect/-/reselect-5.1.1.tgz",
+ "integrity": "sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w==",
+ "license": "MIT"
},
- "node_modules/tiny-inflate": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/tiny-inflate/-/tiny-inflate-1.0.3.tgz",
- "integrity": "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==",
- "dev": true
+ "node_modules/reserved-identifiers": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/reserved-identifiers/-/reserved-identifiers-1.2.0.tgz",
+ "integrity": "sha512-yE7KUfFvaBFzGPs5H3Ops1RevfUEsDc5Iz65rOwWg4lE8HJSYtle77uul3+573457oHvBKuHYDl/xqUkKpEEdw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
},
- "node_modules/tiny-typed-emitter": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/tiny-typed-emitter/-/tiny-typed-emitter-2.1.0.tgz",
- "integrity": "sha512-qVtvMxeXbVej0cQWKqVSSAHmKZEHAvxdF8HEUBFWts8h+xEo5m/lEiPakuyZ3BnCBjOD8i24kzNOiOLLgsSxhA=="
+ "node_modules/resolve-alpn": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz",
+ "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==",
+ "dev": true,
+ "license": "MIT"
},
- "node_modules/tmp": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz",
- "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==",
+ "node_modules/resolve-from": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
+ "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
"dev": true,
- "dependencies": {
- "rimraf": "^3.0.0"
- },
+ "license": "MIT",
+ "peer": true,
"engines": {
- "node": ">=8.17.0"
+ "node": ">=8"
}
},
- "node_modules/tmp-promise": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/tmp-promise/-/tmp-promise-3.0.3.tgz",
- "integrity": "sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==",
+ "node_modules/resolve-pkg-maps": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz",
+ "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==",
"dev": true,
- "dependencies": {
- "tmp": "^0.2.0"
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1"
}
},
- "node_modules/tmp/node_modules/brace-expansion": {
- "version": "1.1.11",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "node_modules/responselike": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz",
+ "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
+ "lowercase-keys": "^2.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/tmp/node_modules/glob": {
- "version": "7.2.3",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
- "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "node_modules/restore-cursor": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz",
+ "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==",
"dev": true,
+ "license": "MIT",
+ "peer": true,
"dependencies": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.1.1",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
+ "onetime": "^5.1.0",
+ "signal-exit": "^3.0.2"
},
"engines": {
- "node": "*"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
+ "node": ">=8"
}
},
- "node_modules/tmp/node_modules/minimatch": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
- "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "node_modules/ret": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/ret/-/ret-0.5.0.tgz",
+ "integrity": "sha512-I1XxrZSQ+oErkRR4jYbAyEEu2I0avBvvMM5JN+6EBprOGRCs63ENqZ3vjavq8fBw2+62G5LF5XelKwuJpcvcxw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/retry": {
+ "version": "0.12.0",
+ "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz",
+ "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==",
"dev": true,
- "dependencies": {
- "brace-expansion": "^1.1.7"
- },
+ "license": "MIT",
"engines": {
- "node": "*"
+ "node": ">= 4"
}
},
- "node_modules/tmp/node_modules/rimraf": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
- "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+ "node_modules/rimraf": {
+ "version": "6.1.3",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-6.1.3.tgz",
+ "integrity": "sha512-LKg+Cr2ZF61fkcaK1UdkH2yEBBKnYjTyWzTJT6KNPcSPaiT7HSdhtMXQuN5wkTX0Xu72KQ1l8S42rlmexS2hSA==",
"dev": true,
+ "license": "BlueOak-1.0.0",
"dependencies": {
- "glob": "^7.1.3"
+ "glob": "^13.0.3",
+ "package-json-from-dist": "^1.0.1"
},
"bin": {
- "rimraf": "bin.js"
+ "rimraf": "dist/esm/bin.mjs"
+ },
+ "engines": {
+ "node": "20 || >=22"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
}
},
- "node_modules/to-arraybuffer": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz",
- "integrity": "sha512-okFlQcoGTi4LQBG/PgSYblw9VOyptsz2KJZqc6qtgGdes8VktzUQkj4BI2blit072iS8VODNcMA+tvnS9dnuMA==",
- "dev": true
- },
- "node_modules/to-fast-properties": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
- "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==",
+ "node_modules/roarr": {
+ "version": "2.15.4",
+ "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz",
+ "integrity": "sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==",
"dev": true,
+ "license": "BSD-3-Clause",
+ "optional": true,
+ "dependencies": {
+ "boolean": "^3.0.1",
+ "detect-node": "^2.0.4",
+ "globalthis": "^1.0.1",
+ "json-stringify-safe": "^5.0.1",
+ "semver-compare": "^1.0.0",
+ "sprintf-js": "^1.1.2"
+ },
"engines": {
- "node": ">=4"
+ "node": ">=8.0"
}
},
- "node_modules/to-object-path": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
- "integrity": "sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==",
+ "node_modules/rollup": {
+ "version": "4.59.0",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.59.0.tgz",
+ "integrity": "sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "kind-of": "^3.0.2"
+ "@types/estree": "1.0.8"
+ },
+ "bin": {
+ "rollup": "dist/bin/rollup"
},
"engines": {
- "node": ">=0.10.0"
+ "node": ">=18.0.0",
+ "npm": ">=8.0.0"
+ },
+ "optionalDependencies": {
+ "@rollup/rollup-android-arm-eabi": "4.59.0",
+ "@rollup/rollup-android-arm64": "4.59.0",
+ "@rollup/rollup-darwin-arm64": "4.59.0",
+ "@rollup/rollup-darwin-x64": "4.59.0",
+ "@rollup/rollup-freebsd-arm64": "4.59.0",
+ "@rollup/rollup-freebsd-x64": "4.59.0",
+ "@rollup/rollup-linux-arm-gnueabihf": "4.59.0",
+ "@rollup/rollup-linux-arm-musleabihf": "4.59.0",
+ "@rollup/rollup-linux-arm64-gnu": "4.59.0",
+ "@rollup/rollup-linux-arm64-musl": "4.59.0",
+ "@rollup/rollup-linux-loong64-gnu": "4.59.0",
+ "@rollup/rollup-linux-loong64-musl": "4.59.0",
+ "@rollup/rollup-linux-ppc64-gnu": "4.59.0",
+ "@rollup/rollup-linux-ppc64-musl": "4.59.0",
+ "@rollup/rollup-linux-riscv64-gnu": "4.59.0",
+ "@rollup/rollup-linux-riscv64-musl": "4.59.0",
+ "@rollup/rollup-linux-s390x-gnu": "4.59.0",
+ "@rollup/rollup-linux-x64-gnu": "4.59.0",
+ "@rollup/rollup-linux-x64-musl": "4.59.0",
+ "@rollup/rollup-openbsd-x64": "4.59.0",
+ "@rollup/rollup-openharmony-arm64": "4.59.0",
+ "@rollup/rollup-win32-arm64-msvc": "4.59.0",
+ "@rollup/rollup-win32-ia32-msvc": "4.59.0",
+ "@rollup/rollup-win32-x64-gnu": "4.59.0",
+ "@rollup/rollup-win32-x64-msvc": "4.59.0",
+ "fsevents": "~2.3.2"
}
},
- "node_modules/to-object-path/node_modules/kind-of": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
- "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==",
+ "node_modules/router": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz",
+ "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==",
"dev": true,
+ "license": "MIT",
+ "peer": true,
"dependencies": {
- "is-buffer": "^1.1.5"
+ "debug": "^4.4.0",
+ "depd": "^2.0.0",
+ "is-promise": "^4.0.0",
+ "parseurl": "^1.3.3",
+ "path-to-regexp": "^8.0.0"
},
"engines": {
- "node": ">=0.10.0"
+ "node": ">= 18"
}
},
- "node_modules/to-readable-stream": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz",
- "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==",
+ "node_modules/safaridriver": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/safaridriver/-/safaridriver-1.0.1.tgz",
+ "integrity": "sha512-jkg4434cYgtrIF2AeY/X0Wmd2W73cK5qIEFE3hDrrQenJH/2SDJIXGvPAigfvQTcE9+H31zkiNHbUqcihEiMRA==",
+ "license": "MIT",
"engines": {
- "node": ">=6"
+ "node": ">=18.0.0"
}
},
- "node_modules/to-regex": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz",
- "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==",
+ "node_modules/safe-buffer": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
"dev": true,
- "dependencies": {
- "define-property": "^2.0.2",
- "extend-shallow": "^3.0.2",
- "regex-not": "^1.0.2",
- "safe-regex": "^1.1.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
+ "license": "MIT"
},
- "node_modules/to-regex-range": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
- "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
- "dev": true,
+ "node_modules/safe-regex2": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/safe-regex2/-/safe-regex2-5.0.0.tgz",
+ "integrity": "sha512-YwJwe5a51WlK7KbOJREPdjNrpViQBI3p4T50lfwPuDhZnE3XGVTlGvi+aolc5+RvxDD6bnUmjVsU9n1eboLUYw==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fastify"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/fastify"
+ }
+ ],
+ "license": "MIT",
"dependencies": {
- "is-number": "^7.0.0"
- },
- "engines": {
- "node": ">=8.0"
+ "ret": "~0.5.0"
}
},
- "node_modules/to-regex-range/node_modules/is-number": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
- "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "node_modules/safe-stable-stringify": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz",
+ "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==",
"dev": true,
+ "license": "MIT",
+ "peer": true,
"engines": {
- "node": ">=0.12.0"
+ "node": ">=10"
}
},
- "node_modules/toggle-selection": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz",
- "integrity": "sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ=="
+ "node_modules/safer-buffer": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
+ "license": "MIT"
},
- "node_modules/toidentifier": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
- "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
- "dev": true,
+ "node_modules/sanitize-filename": {
+ "version": "1.6.4",
+ "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.4.tgz",
+ "integrity": "sha512-9ZyI08PsvdQl2r/bBIGubpVdR3RR9sY6RDiWFPreA21C/EFlQhmgo20UZlNjZMMZNubusLhAQozkA0Od5J21Eg==",
+ "license": "WTFPL OR ISC",
+ "dependencies": {
+ "truncate-utf8-bytes": "^1.0.0"
+ }
+ },
+ "node_modules/sax": {
+ "version": "1.4.4",
+ "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.4.tgz",
+ "integrity": "sha512-1n3r/tGXO6b6VXMdFT54SHzT9ytu9yr7TaELowdYpMqY/Ao7EnlQGmAQ1+RatX7Tkkdm6hONI2owqNx2aZj5Sw==",
+ "license": "BlueOak-1.0.0",
"engines": {
- "node": ">=0.6"
+ "node": ">=11.0.0"
}
},
- "node_modules/tough-cookie": {
- "version": "2.5.0",
- "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
- "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
- "dev": true,
+ "node_modules/scheduler": {
+ "version": "0.27.0",
+ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz",
+ "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==",
+ "license": "MIT"
+ },
+ "node_modules/scroll-into-view-if-needed": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/scroll-into-view-if-needed/-/scroll-into-view-if-needed-3.1.0.tgz",
+ "integrity": "sha512-49oNpRjWRvnU8NyGVmUaYG4jtTkNonFZI86MmGRDqBphEK2EXT9gdEUoQPZhuBM8yWHxCWbobltqYO5M4XrUvQ==",
+ "license": "MIT",
"dependencies": {
- "psl": "^1.1.28",
- "punycode": "^2.1.1"
- },
- "engines": {
- "node": ">=0.8"
+ "compute-scroll-into-view": "^3.0.2"
}
},
- "node_modules/tough-cookie/node_modules/punycode": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
- "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
+ "node_modules/select-hose": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz",
+ "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==",
"dev": true,
+ "license": "MIT",
+ "optional": true,
+ "peer": true
+ },
+ "node_modules/semver": {
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
+ "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==",
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
"engines": {
- "node": ">=6"
+ "node": ">=10"
}
},
- "node_modules/tr46": {
- "version": "0.0.3",
- "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
- "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="
- },
- "node_modules/tree-kill": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz",
- "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==",
+ "node_modules/semver-compare": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz",
+ "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==",
"dev": true,
- "bin": {
- "tree-kill": "cli.js"
- }
+ "license": "MIT",
+ "optional": true
},
- "node_modules/triple-beam": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz",
- "integrity": "sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==",
+ "node_modules/send": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/send/-/send-1.2.1.tgz",
+ "integrity": "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==",
"dev": true,
+ "license": "MIT",
"peer": true,
+ "dependencies": {
+ "debug": "^4.4.3",
+ "encodeurl": "^2.0.0",
+ "escape-html": "^1.0.3",
+ "etag": "^1.8.1",
+ "fresh": "^2.0.0",
+ "http-errors": "^2.0.1",
+ "mime-types": "^3.0.2",
+ "ms": "^2.1.3",
+ "on-finished": "^2.4.1",
+ "range-parser": "^1.2.1",
+ "statuses": "^2.0.2"
+ },
"engines": {
- "node": ">= 14.0.0"
+ "node": ">= 18"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
}
},
- "node_modules/truncate-utf8-bytes": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz",
- "integrity": "sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==",
+ "node_modules/serialize-error": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz",
+ "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==",
"dev": true,
+ "license": "MIT",
+ "optional": true,
"dependencies": {
- "utf8-byte-length": "^1.0.1"
+ "type-fest": "^0.13.1"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/ts-node": {
- "version": "9.1.1",
- "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-9.1.1.tgz",
- "integrity": "sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg==",
+ "node_modules/serialize-error/node_modules/type-fest": {
+ "version": "0.13.1",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz",
+ "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==",
"dev": true,
- "dependencies": {
- "arg": "^4.1.0",
- "create-require": "^1.1.0",
- "diff": "^4.0.1",
- "make-error": "^1.1.1",
- "source-map-support": "^0.5.17",
- "yn": "3.1.1"
- },
- "bin": {
- "ts-node": "dist/bin.js",
- "ts-node-script": "dist/bin-script.js",
- "ts-node-transpile-only": "dist/bin-transpile.js",
- "ts-script": "dist/bin-script-deprecated.js"
- },
+ "license": "(MIT OR CC0-1.0)",
+ "optional": true,
"engines": {
- "node": ">=10.0.0"
+ "node": ">=10"
},
- "peerDependencies": {
- "typescript": ">=2.7"
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/ts-node/node_modules/diff": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
- "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
+ "node_modules/serve-favicon": {
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/serve-favicon/-/serve-favicon-2.5.1.tgz",
+ "integrity": "sha512-JndLBslCLA/ebr7rS3d+/EKkzTsTi1jI2T9l+vHfAaGJ7A7NhtDpSZ0lx81HCNWnnE0yHncG+SSnVf9IMxOwXQ==",
"dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "etag": "~1.8.1",
+ "fresh": "~0.5.2",
+ "ms": "~2.1.3",
+ "parseurl": "~1.3.2",
+ "safe-buffer": "~5.2.1"
+ },
"engines": {
- "node": ">=0.3.1"
+ "node": ">= 0.8.0"
}
},
- "node_modules/tsconfig-paths": {
- "version": "3.15.0",
- "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz",
- "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==",
+ "node_modules/serve-favicon/node_modules/fresh": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
+ "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
"dev": true,
- "dependencies": {
- "@types/json5": "^0.0.29",
- "json5": "^1.0.2",
- "minimist": "^1.2.6",
- "strip-bom": "^3.0.0"
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">= 0.6"
}
},
- "node_modules/tsconfig-paths/node_modules/json5": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
- "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
+ "node_modules/serve-favicon/node_modules/safe-buffer": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT",
+ "peer": true
+ },
+ "node_modules/serve-static": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.1.tgz",
+ "integrity": "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==",
"dev": true,
+ "license": "MIT",
+ "peer": true,
"dependencies": {
- "minimist": "^1.2.0"
+ "encodeurl": "^2.0.0",
+ "escape-html": "^1.0.3",
+ "parseurl": "^1.3.3",
+ "send": "^1.2.0"
},
- "bin": {
- "json5": "lib/cli.js"
+ "engines": {
+ "node": ">= 18"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
}
},
- "node_modules/tslib": {
- "version": "2.6.2",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz",
- "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q=="
+ "node_modules/set-blocking": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
+ "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==",
+ "dev": true,
+ "license": "ISC",
+ "peer": true
},
- "node_modules/tty-browserify": {
- "version": "0.0.0",
- "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz",
- "integrity": "sha512-JVa5ijo+j/sOoHGjw0sxw734b1LhBkQ3bvUGNdxnVXDCX81Yx7TFgnZygxrIIWn23hbfTaMYLwRmAxFyDuFmIw==",
- "dev": true
+ "node_modules/set-cookie-parser": {
+ "version": "2.7.2",
+ "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.2.tgz",
+ "integrity": "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==",
+ "license": "MIT"
},
- "node_modules/tunnel": {
- "version": "0.0.6",
- "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz",
- "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==",
- "optional": true,
- "engines": {
- "node": ">=0.6.11 <=0.7.0 || >=0.7.3"
- }
+ "node_modules/setimmediate": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz",
+ "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==",
+ "dev": true,
+ "license": "MIT"
},
- "node_modules/tunnel-agent": {
- "version": "0.6.0",
- "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
- "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==",
+ "node_modules/setprototypeof": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
+ "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
+ "dev": true,
+ "license": "ISC",
+ "peer": true
+ },
+ "node_modules/sharp": {
+ "version": "0.34.5",
+ "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz",
+ "integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==",
"dev": true,
+ "hasInstallScript": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "peer": true,
"dependencies": {
- "safe-buffer": "^5.0.1"
+ "@img/colour": "^1.0.0",
+ "detect-libc": "^2.1.2",
+ "semver": "^7.7.3"
},
"engines": {
- "node": "*"
+ "node": "^18.17.0 || ^20.3.0 || >=21.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/libvips"
+ },
+ "optionalDependencies": {
+ "@img/sharp-darwin-arm64": "0.34.5",
+ "@img/sharp-darwin-x64": "0.34.5",
+ "@img/sharp-libvips-darwin-arm64": "1.2.4",
+ "@img/sharp-libvips-darwin-x64": "1.2.4",
+ "@img/sharp-libvips-linux-arm": "1.2.4",
+ "@img/sharp-libvips-linux-arm64": "1.2.4",
+ "@img/sharp-libvips-linux-ppc64": "1.2.4",
+ "@img/sharp-libvips-linux-riscv64": "1.2.4",
+ "@img/sharp-libvips-linux-s390x": "1.2.4",
+ "@img/sharp-libvips-linux-x64": "1.2.4",
+ "@img/sharp-libvips-linuxmusl-arm64": "1.2.4",
+ "@img/sharp-libvips-linuxmusl-x64": "1.2.4",
+ "@img/sharp-linux-arm": "0.34.5",
+ "@img/sharp-linux-arm64": "0.34.5",
+ "@img/sharp-linux-ppc64": "0.34.5",
+ "@img/sharp-linux-riscv64": "0.34.5",
+ "@img/sharp-linux-s390x": "0.34.5",
+ "@img/sharp-linux-x64": "0.34.5",
+ "@img/sharp-linuxmusl-arm64": "0.34.5",
+ "@img/sharp-linuxmusl-x64": "0.34.5",
+ "@img/sharp-wasm32": "0.34.5",
+ "@img/sharp-win32-arm64": "0.34.5",
+ "@img/sharp-win32-ia32": "0.34.5",
+ "@img/sharp-win32-x64": "0.34.5"
}
},
- "node_modules/tweetnacl": {
- "version": "0.14.5",
- "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
- "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==",
- "dev": true
- },
- "node_modules/type-check": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
- "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
- "dev": true,
+ "node_modules/shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "license": "MIT",
"dependencies": {
- "prelude-ls": "^1.2.1"
+ "shebang-regex": "^3.0.0"
},
"engines": {
- "node": ">= 0.8.0"
+ "node": ">=8"
}
},
- "node_modules/type-detect": {
- "version": "4.0.8",
- "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
- "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==",
- "dev": true,
+ "node_modules/shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "license": "MIT",
"engines": {
- "node": ">=4"
+ "node": ">=8"
}
},
- "node_modules/type-fest": {
- "version": "4.10.1",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.10.1.tgz",
- "integrity": "sha512-7ZnJYTp6uc04uYRISWtiX3DSKB/fxNQT0B5o1OUeCqiQiwF+JC9+rJiZIDrPrNCLLuTqyQmh4VdQqh/ZOkv9MQ==",
+ "node_modules/shell-quote": {
+ "version": "1.8.4",
+ "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.4.tgz",
+ "integrity": "sha512-VsC6n6vz1ihYYyZZwX7YZSF5l5x36ca17OC+a69h94YqB7X6XLwf+5MOgynYir2SLFUbl8gIYvBo8K8RoNQ6bQ==",
"dev": true,
+ "license": "MIT",
"engines": {
- "node": ">=16"
+ "node": ">= 0.4"
},
"funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/type-is": {
- "version": "1.6.18",
- "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
- "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
+ "node_modules/side-channel": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz",
+ "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==",
"dev": true,
+ "license": "MIT",
"peer": true,
"dependencies": {
- "media-typer": "0.3.0",
- "mime-types": "~2.1.24"
+ "es-errors": "^1.3.0",
+ "object-inspect": "^1.13.3",
+ "side-channel-list": "^1.0.0",
+ "side-channel-map": "^1.0.1",
+ "side-channel-weakmap": "^1.0.2"
},
"engines": {
- "node": ">= 0.6"
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/typed-array-buffer": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz",
- "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==",
+ "node_modules/side-channel-list": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz",
+ "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==",
"dev": true,
+ "license": "MIT",
+ "peer": true,
"dependencies": {
- "call-bind": "^1.0.2",
- "get-intrinsic": "^1.2.1",
- "is-typed-array": "^1.1.10"
+ "es-errors": "^1.3.0",
+ "object-inspect": "^1.13.4"
},
"engines": {
"node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/typed-array-byte-length": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz",
- "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==",
+ "node_modules/side-channel-map": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz",
+ "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==",
"dev": true,
+ "license": "MIT",
+ "peer": true,
"dependencies": {
- "call-bind": "^1.0.2",
- "for-each": "^0.3.3",
- "has-proto": "^1.0.1",
- "is-typed-array": "^1.1.10"
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.5",
+ "object-inspect": "^1.13.3"
},
"engines": {
"node": ">= 0.4"
@@ -23642,17 +17106,19 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/typed-array-byte-offset": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz",
- "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==",
+ "node_modules/side-channel-weakmap": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz",
+ "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==",
"dev": true,
+ "license": "MIT",
+ "peer": true,
"dependencies": {
- "available-typed-arrays": "^1.0.5",
- "call-bind": "^1.0.2",
- "for-each": "^0.3.3",
- "has-proto": "^1.0.1",
- "is-typed-array": "^1.1.10"
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.5",
+ "object-inspect": "^1.13.3",
+ "side-channel-map": "^1.0.1"
},
"engines": {
"node": ">= 0.4"
@@ -23661,1698 +17127,2231 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/typed-array-length": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz",
- "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==",
+ "node_modules/siginfo": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz",
+ "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/signal-exit": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
+ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
+ "license": "ISC"
+ },
+ "node_modules/simple-update-notifier": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz",
+ "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "call-bind": "^1.0.2",
- "for-each": "^0.3.3",
- "is-typed-array": "^1.1.9"
+ "semver": "^7.5.3"
},
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "engines": {
+ "node": ">=10"
}
},
- "node_modules/typedarray": {
- "version": "0.0.6",
- "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
- "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA=="
+ "node_modules/smart-buffer": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz",
+ "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 6.0.0",
+ "npm": ">= 3.0.0"
+ }
},
- "node_modules/typedarray-to-buffer": {
- "version": "3.1.5",
- "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz",
- "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==",
+ "node_modules/socks": {
+ "version": "2.8.9",
+ "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.9.tgz",
+ "integrity": "sha512-LJhUYUvItdQ0LkJTmPeaEObWXAqFyfmP85x0tch/ez9cahmhlBBLbIqDFnvBnUJGagb0JbIQrkBs1wJ+yRYpEw==",
+ "license": "MIT",
"dependencies": {
- "is-typedarray": "^1.0.0"
+ "ip-address": "^10.1.1",
+ "smart-buffer": "^4.2.0"
+ },
+ "engines": {
+ "node": ">= 10.0.0",
+ "npm": ">= 3.0.0"
}
},
- "node_modules/typescript": {
- "version": "5.2.2",
- "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz",
- "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==",
- "dev": true,
- "bin": {
- "tsc": "bin/tsc",
- "tsserver": "bin/tsserver"
+ "node_modules/socks-proxy-agent": {
+ "version": "8.0.5",
+ "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz",
+ "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==",
+ "license": "MIT",
+ "dependencies": {
+ "agent-base": "^7.1.2",
+ "debug": "^4.3.4",
+ "socks": "^2.8.3"
},
"engines": {
- "node": ">=14.17"
+ "node": ">= 14"
+ }
+ },
+ "node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "devOptional": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/source-map-js": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
+ "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "node_modules/ua-parser-js": {
- "version": "0.7.37",
- "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.37.tgz",
- "integrity": "sha512-xV8kqRKM+jhMvcHWUKthV9fNebIzrNy//2O9ZwWcfiBFR5f25XVZPLlEajk/sf3Ra15V92isyQqnIEXRDaZWEA==",
+ "node_modules/source-map-support": {
+ "version": "0.5.21",
+ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
+ "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
"dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "buffer-from": "^1.0.0",
+ "source-map": "^0.6.0"
+ }
+ },
+ "node_modules/space-separated-tokens": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz",
+ "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/spacetrim": {
+ "version": "0.11.59",
+ "resolved": "https://registry.npmjs.org/spacetrim/-/spacetrim-0.11.59.tgz",
+ "integrity": "sha512-lLYsktklSRKprreOm7NXReW8YiX2VBjbgmXYEziOoGf/qsJqAEACaDvoTtUOycwjpaSh+bT8eu0KrJn7UNxiCg==",
"funding": [
{
- "type": "opencollective",
- "url": "https://opencollective.com/ua-parser-js"
- },
- {
- "type": "paypal",
- "url": "https://paypal.me/faisalman"
+ "type": "individual",
+ "url": "https://buymeacoffee.com/hejny"
},
{
"type": "github",
- "url": "https://github.com/sponsors/faisalman"
+ "url": "https://github.com/hejny/spacetrim/blob/main/README.md#%EF%B8%8F-contributing"
}
],
- "engines": {
- "node": "*"
- }
+ "license": "Apache-2.0"
},
- "node_modules/unbox-primitive": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz",
- "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==",
+ "node_modules/spdx-correct": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz",
+ "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==",
"dev": true,
+ "license": "Apache-2.0",
"dependencies": {
- "call-bind": "^1.0.2",
- "has-bigints": "^1.0.2",
- "has-symbols": "^1.0.3",
- "which-boxed-primitive": "^1.0.2"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "spdx-expression-parse": "^3.0.0",
+ "spdx-license-ids": "^3.0.0"
}
},
- "node_modules/unbzip2-stream": {
- "version": "1.4.3",
- "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz",
- "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==",
+ "node_modules/spdx-exceptions": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz",
+ "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==",
+ "dev": true,
+ "license": "CC-BY-3.0"
+ },
+ "node_modules/spdx-expression-parse": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
+ "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "buffer": "^5.2.1",
- "through": "^2.3.8"
+ "spdx-exceptions": "^2.1.0",
+ "spdx-license-ids": "^3.0.0"
}
},
- "node_modules/uncss": {
- "version": "0.17.3",
- "resolved": "https://registry.npmjs.org/uncss/-/uncss-0.17.3.tgz",
- "integrity": "sha512-ksdDWl81YWvF/X14fOSw4iu8tESDHFIeyKIeDrK6GEVTQvqJc1WlOEXqostNwOCi3qAj++4EaLsdAgPmUbEyog==",
+ "node_modules/spdx-license-ids": {
+ "version": "3.0.23",
+ "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.23.tgz",
+ "integrity": "sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw==",
+ "dev": true,
+ "license": "CC0-1.0"
+ },
+ "node_modules/spdy": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz",
+ "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==",
"dev": true,
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
- "commander": "^2.20.0",
- "glob": "^7.1.4",
- "is-absolute-url": "^3.0.1",
- "is-html": "^1.1.0",
- "jsdom": "^14.1.0",
- "lodash": "^4.17.15",
- "postcss": "^7.0.17",
- "postcss-selector-parser": "6.0.2",
- "request": "^2.88.0"
- },
- "bin": {
- "uncss": "bin/uncss"
+ "debug": "^4.1.0",
+ "handle-thing": "^2.0.0",
+ "http-deceiver": "^1.2.7",
+ "select-hose": "^2.0.0",
+ "spdy-transport": "^3.0.0"
},
"engines": {
- "node": ">=6.0"
+ "node": ">=6.0.0"
}
},
- "node_modules/uncss/node_modules/brace-expansion": {
- "version": "1.1.11",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "node_modules/spdy-transport": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz",
+ "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==",
"dev": true,
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
+ "debug": "^4.1.0",
+ "detect-node": "^2.0.4",
+ "hpack.js": "^2.1.6",
+ "obuf": "^1.1.2",
+ "readable-stream": "^3.0.6",
+ "wbuf": "^1.7.3"
}
},
- "node_modules/uncss/node_modules/commander": {
- "version": "2.20.3",
- "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
- "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
- "dev": true
- },
- "node_modules/uncss/node_modules/glob": {
- "version": "7.2.3",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
- "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "node_modules/spdy-transport/node_modules/readable-stream": {
+ "version": "3.6.2",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
+ "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
"dev": true,
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
"dependencies": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.1.1",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
+ "inherits": "^2.0.3",
+ "string_decoder": "^1.1.1",
+ "util-deprecate": "^1.0.1"
},
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/split2": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz",
+ "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==",
+ "license": "ISC",
+ "engines": {
+ "node": ">= 10.x"
+ }
+ },
+ "node_modules/sprintf-js": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz",
+ "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "optional": true
+ },
+ "node_modules/stable-hash-x": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/stable-hash-x/-/stable-hash-x-0.2.0.tgz",
+ "integrity": "sha512-o3yWv49B/o4QZk5ZcsALc6t0+eCelPc44zZsLtCQnZPDwFpDYSWcDnrv2TtMmMbQ7uKo3J0HTURCqckw23czNQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
+ "node_modules/stack-trace": {
+ "version": "0.0.10",
+ "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz",
+ "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
"engines": {
"node": "*"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
}
},
- "node_modules/uncss/node_modules/is-absolute-url": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz",
- "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==",
- "dev": true,
- "engines": {
- "node": ">=8"
+ "node_modules/stackback": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz",
+ "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/stat-mode": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/stat-mode/-/stat-mode-1.0.0.tgz",
+ "integrity": "sha512-jH9EhtKIjuXZ2cWxmXS8ZP80XyC3iasQxMDV8jzhNJpfDb7VbQLVW4Wvsxz9QZvzV+G4YoSfBUVKDOyxLzi/sg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/statuses": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz",
+ "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/std-env": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/std-env/-/std-env-4.0.0.tgz",
+ "integrity": "sha512-zUMPtQ/HBY3/50VbpkupYHbRroTRZJPRLvreamgErJVys0ceuzMkD44J/QjqhHjOzK42GQ3QZIeFG1OYfOtKqQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/stream-buffers": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-2.2.0.tgz",
+ "integrity": "sha512-uyQK/mx5QjHun80FLJTfaWE7JtwfRMKBLkMne6udYOmvH0CawotVa7TfgYHzAnpphn4+TweIx1QKMnRIbipmUg==",
+ "dev": true,
+ "license": "Unlicense",
+ "engines": {
+ "node": ">= 0.10.0"
+ }
+ },
+ "node_modules/stream-combiner": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.2.2.tgz",
+ "integrity": "sha512-6yHMqgLYDzQDcAkL+tjJDC5nSNuNIx0vZtRZeiPh7Saef7VHX9H5Ijn9l2VIol2zaNYlYEX6KyuT/237A58qEQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "duplexer": "~0.1.1",
+ "through": "~2.3.4"
+ }
+ },
+ "node_modules/streamx": {
+ "version": "2.25.0",
+ "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.25.0.tgz",
+ "integrity": "sha512-0nQuG6jf1w+wddNEEXCF4nTg3LtufWINB5eFEN+5TNZW7KWJp6x87+JFL43vaAUPyCfH1wID+mNVyW6OHtFamg==",
+ "license": "MIT",
+ "dependencies": {
+ "events-universal": "^1.0.0",
+ "fast-fifo": "^1.3.2",
+ "text-decoder": "^1.1.0"
}
},
- "node_modules/uncss/node_modules/minimatch": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
- "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "node_modules/string_decoder": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
+ "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "brace-expansion": "^1.1.7"
- },
- "engines": {
- "node": "*"
+ "safe-buffer": "~5.2.0"
}
},
- "node_modules/uncss/node_modules/postcss-selector-parser": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz",
- "integrity": "sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg==",
+ "node_modules/string_decoder/node_modules/safe-buffer": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/string-convert": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/string-convert/-/string-convert-0.2.1.tgz",
+ "integrity": "sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A==",
+ "license": "MIT"
+ },
+ "node_modules/string-ts": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/string-ts/-/string-ts-2.3.1.tgz",
+ "integrity": "sha512-xSJq+BS52SaFFAVxuStmx6n5aYZU571uYUnUrPXkPFCfdHyZMMlbP2v2Wx5sNBnAVzq/2+0+mcBLBa3Xa5ubYw==",
"dev": true,
+ "license": "MIT"
+ },
+ "node_modules/string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "license": "MIT",
"dependencies": {
- "cssesc": "^3.0.0",
- "indexes-of": "^1.0.1",
- "uniq": "^1.0.1"
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
},
"engines": {
- "node": ">=4"
+ "node": ">=8"
}
},
- "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=="
- },
- "node_modules/unicode-canonical-property-names-ecmascript": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz",
- "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==",
- "dev": true,
+ "node_modules/string-width-cjs": {
+ "name": "string-width",
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "license": "MIT",
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
"engines": {
- "node": ">=4"
+ "node": ">=8"
}
},
- "node_modules/unicode-match-property-ecmascript": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz",
- "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==",
- "dev": true,
+ "node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "license": "MIT",
"dependencies": {
- "unicode-canonical-property-names-ecmascript": "^2.0.0",
- "unicode-property-aliases-ecmascript": "^2.0.0"
+ "ansi-regex": "^5.0.1"
},
"engines": {
- "node": ">=4"
+ "node": ">=8"
}
},
- "node_modules/unicode-match-property-value-ecmascript": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz",
- "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==",
- "dev": true,
+ "node_modules/strip-ansi-cjs": {
+ "name": "strip-ansi",
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
"engines": {
- "node": ">=4"
+ "node": ">=8"
}
},
- "node_modules/unicode-property-aliases-ecmascript": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz",
- "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==",
+ "node_modules/strip-indent": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-4.1.1.tgz",
+ "integrity": "sha512-SlyRoSkdh1dYP0PzclLE7r0M9sgbFKKMFXpFRUMNuKhQSbC6VQIGzq3E0qsfvGJaUFJPGv6Ws1NZ/haTAjfbMA==",
"dev": true,
+ "license": "MIT",
"engines": {
- "node": ">=4"
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/unicode-trie": {
- "version": "0.3.1",
- "resolved": "https://registry.npmjs.org/unicode-trie/-/unicode-trie-0.3.1.tgz",
- "integrity": "sha512-WgVuO0M2jDl7hVfbPgXv2LUrD81HM0bQj/bvLGiw6fJ4Zo8nNFnDrA0/hU2Te/wz6pjxCm5cxJwtLjo2eyV51Q==",
- "dev": true,
+ "node_modules/strnum": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.4.1.tgz",
+ "integrity": "sha512-M9eUSMT2dCB2cTNPG7UYj6KuK7RJR2SN2+yCV/fTW3xzTCS6EaGZ5pSMgDIjB7r8zSfTGk+dvvn9rTjpVS9Mwg==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/NaturalIntelligence"
+ }
+ ],
+ "license": "MIT",
"dependencies": {
- "pako": "^0.2.5",
- "tiny-inflate": "^1.0.0"
+ "anynum": "^1.0.1"
}
},
- "node_modules/unicode-trie/node_modules/pako": {
- "version": "0.2.9",
- "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz",
- "integrity": "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==",
- "dev": true
+ "node_modules/stylis": {
+ "version": "4.3.6",
+ "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.6.tgz",
+ "integrity": "sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==",
+ "license": "MIT"
},
- "node_modules/union-value": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz",
- "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==",
- "dev": true,
+ "node_modules/sumchecker": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-3.0.1.tgz",
+ "integrity": "sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==",
+ "license": "Apache-2.0",
"dependencies": {
- "arr-union": "^3.1.0",
- "get-value": "^2.0.6",
- "is-extendable": "^0.1.1",
- "set-value": "^2.0.1"
+ "debug": "^4.1.0"
},
"engines": {
- "node": ">=0.10.0"
+ "node": ">= 8.0"
}
},
- "node_modules/union-value/node_modules/is-extendable": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
- "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==",
+ "node_modules/supports-color": {
+ "version": "10.2.2",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-10.2.2.tgz",
+ "integrity": "sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g==",
"dev": true,
+ "license": "MIT",
+ "peer": true,
"engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/uniq": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz",
- "integrity": "sha512-Gw+zz50YNKPDKXs+9d+aKAjVwpjNwqzvNpLigIruT4HA9lMZNdMqs9x07kKHB/L9WRzqp4+DlTU5s4wG2esdoA==",
- "dev": true
- },
- "node_modules/uniqs": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz",
- "integrity": "sha512-mZdDpf3vBV5Efh29kMw5tXoup/buMgxLzOt/XKFKcVmi+15ManNQWr6HfZ2aiZTYlYixbdNJ0KFmIZIv52tHSQ==",
- "dev": true
- },
- "node_modules/universalify": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
- "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
- "engines": {
- "node": ">= 4.0.0"
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
}
},
- "node_modules/unorm": {
- "version": "1.6.0",
- "resolved": "https://registry.npmjs.org/unorm/-/unorm-1.6.0.tgz",
- "integrity": "sha512-b2/KCUlYZUeA7JFUuRJZPUtr4gZvBh7tavtv4fvk4+KV9pfGiR6CQAQAWl49ZpR3ts2dk4FYkP7EIgDJoiOLDA==",
+ "node_modules/tagged-tag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/tagged-tag/-/tagged-tag-1.0.0.tgz",
+ "integrity": "sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==",
"dev": true,
+ "license": "MIT",
"engines": {
- "node": ">= 0.4.0"
+ "node": ">=20"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/unpipe": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
- "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
+ "node_modules/tapable": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz",
+ "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==",
"dev": true,
- "peer": true,
+ "license": "MIT",
"engines": {
- "node": ">= 0.8"
+ "node": ">=6"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
}
},
- "node_modules/unquote": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz",
- "integrity": "sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg==",
- "dev": true
- },
- "node_modules/unset-value": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz",
- "integrity": "sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==",
+ "node_modules/tar": {
+ "version": "7.5.16",
+ "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.16.tgz",
+ "integrity": "sha512-56adEpPMouktRlBLXiaYFFzZ/3+JXa8P9n7WbR+ibIjtviN55mEaOkiysCnPnWm+7kkui1Dn8J9l+g6zV8731w==",
"dev": true,
+ "license": "BlueOak-1.0.0",
"dependencies": {
- "has-value": "^0.3.1",
- "isobject": "^3.0.0"
+ "@isaacs/fs-minipass": "^4.0.0",
+ "chownr": "^3.0.0",
+ "minipass": "^7.1.2",
+ "minizlib": "^3.1.0",
+ "yallist": "^5.0.0"
},
"engines": {
- "node": ">=0.10.0"
+ "node": ">=18"
}
},
- "node_modules/unset-value/node_modules/has-value": {
- "version": "0.3.1",
- "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz",
- "integrity": "sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==",
- "dev": true,
+ "node_modules/tar-fs": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.1.2.tgz",
+ "integrity": "sha512-QGxxTxxyleAdyM3kpFs14ymbYmNFrfY+pHj7Z8FgtbZ7w2//VAgLMac7sT6nRpIHjppXO2AwwEOg0bPFVRcmXw==",
+ "license": "MIT",
"dependencies": {
- "get-value": "^2.0.3",
- "has-values": "^0.1.4",
- "isobject": "^2.0.0"
+ "pump": "^3.0.0",
+ "tar-stream": "^3.1.5"
},
- "engines": {
- "node": ">=0.10.0"
+ "optionalDependencies": {
+ "bare-fs": "^4.0.1",
+ "bare-path": "^3.0.0"
}
},
- "node_modules/unset-value/node_modules/has-value/node_modules/isobject": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
- "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==",
- "dev": true,
+ "node_modules/tar-stream": {
+ "version": "3.1.7",
+ "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz",
+ "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==",
+ "license": "MIT",
"dependencies": {
- "isarray": "1.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
+ "b4a": "^1.6.4",
+ "fast-fifo": "^1.2.0",
+ "streamx": "^2.15.0"
}
},
- "node_modules/unset-value/node_modules/has-values": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz",
- "integrity": "sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==",
+ "node_modules/teen_process": {
+ "version": "4.1.3",
+ "resolved": "https://registry.npmjs.org/teen_process/-/teen_process-4.1.3.tgz",
+ "integrity": "sha512-8W7Xp7WtJ5ZXjv0iHMsCgPPKzUt6ACfG/rDWX0tMIlMJaYcTYsPw3ZQQ9+hG7YsY+gm+DUATiyah3AraJ9JYpg==",
"dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "shell-quote": "^1.8.1"
+ },
"engines": {
- "node": ">=0.10.0"
+ "node": "^20.19.0 || ^22.12.0 || >=24.0.0",
+ "npm": ">=10"
}
},
- "node_modules/unset-value/node_modules/isarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
- "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
- "dev": true
- },
- "node_modules/upath": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz",
- "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==",
- "dev": true,
- "engines": {
- "node": ">=4",
- "yarn": "*"
+ "node_modules/teex": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/teex/-/teex-1.0.1.tgz",
+ "integrity": "sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg==",
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "streamx": "^2.12.5"
}
},
- "node_modules/update-browserslist-db": {
- "version": "1.0.13",
- "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz",
- "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==",
+ "node_modules/temp": {
+ "version": "0.9.4",
+ "resolved": "https://registry.npmjs.org/temp/-/temp-0.9.4.tgz",
+ "integrity": "sha512-yYrrsWnrXMcdsnu/7YMYAofM1ktpL5By7vZhf15CrXijWWrEYZks5AXBudalfSWJLlnen/QUJUB5aoB0kqZUGA==",
"dev": true,
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/browserslist"
- },
- {
- "type": "tidelift",
- "url": "https://tidelift.com/funding/github/npm/browserslist"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
+ "license": "MIT",
+ "peer": true,
"dependencies": {
- "escalade": "^3.1.1",
- "picocolors": "^1.0.0"
- },
- "bin": {
- "update-browserslist-db": "cli.js"
+ "mkdirp": "^0.5.1",
+ "rimraf": "~2.6.2"
},
- "peerDependencies": {
- "browserslist": ">= 4.21.0"
+ "engines": {
+ "node": ">=6.0.0"
}
},
- "node_modules/update-browserslist-db/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
- },
- "node_modules/uri-js": {
- "version": "4.4.1",
- "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
- "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+ "node_modules/temp-file": {
+ "version": "3.4.0",
+ "resolved": "https://registry.npmjs.org/temp-file/-/temp-file-3.4.0.tgz",
+ "integrity": "sha512-C5tjlC/HCtVUOi3KWVokd4vHVViOmGjtLwIh4MuzPo/nMYTV/p1urt3RnMz2IWXDdKEGJH3k5+KPxtqRsUYGtg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "punycode": "^2.1.0"
+ "async-exit-hook": "^2.0.1",
+ "fs-extra": "^10.0.0"
}
},
- "node_modules/uri-js/node_modules/punycode": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
- "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
+ "node_modules/temp/node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
"dev": true,
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/urix": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz",
- "integrity": "sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==",
- "deprecated": "Please see https://github.com/lydell/urix#deprecated",
- "dev": true
+ "license": "MIT",
+ "peer": true
},
- "node_modules/url": {
- "version": "0.11.3",
- "resolved": "https://registry.npmjs.org/url/-/url-0.11.3.tgz",
- "integrity": "sha512-6hxOLGfZASQK/cijlZnZJTq8OXAkt/3YGfQX45vvMYXpZoo8NdWZcY73K108Jf759lS1Bv/8wXnHDTSz17dSRw==",
+ "node_modules/temp/node_modules/brace-expansion": {
+ "version": "1.1.15",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz",
+ "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==",
"dev": true,
+ "license": "MIT",
+ "peer": true,
"dependencies": {
- "punycode": "^1.4.1",
- "qs": "^6.11.2"
- }
- },
- "node_modules/url-parse-lax": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz",
- "integrity": "sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ==",
- "dependencies": {
- "prepend-http": "^2.0.0"
- },
- "engines": {
- "node": ">=4"
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
}
},
- "node_modules/url/node_modules/qs": {
- "version": "6.11.2",
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz",
- "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==",
+ "node_modules/temp/node_modules/glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me",
"dev": true,
+ "license": "ISC",
+ "peer": true,
"dependencies": {
- "side-channel": "^1.0.4"
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.1.1",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
},
"engines": {
- "node": ">=0.6"
+ "node": "*"
},
"funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "url": "https://github.com/sponsors/isaacs"
}
},
- "node_modules/urlpattern-polyfill": {
- "version": "9.0.0",
- "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-9.0.0.tgz",
- "integrity": "sha512-WHN8KDQblxd32odxeIgo83rdVDE2bvdkb86it7bMhYZwWKJz0+O0RK/eZiHYnM+zgt/U7hAHOlCQGfjjvSkw2g==",
- "dev": true
- },
- "node_modules/use": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz",
- "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==",
+ "node_modules/temp/node_modules/minimatch": {
+ "version": "3.1.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz",
+ "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==",
"dev": true,
+ "license": "ISC",
+ "peer": true,
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
"engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/use-sync-external-store": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz",
- "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==",
- "peerDependencies": {
- "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
+ "node": "*"
}
},
- "node_modules/utf8-byte-length": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz",
- "integrity": "sha512-4+wkEYLBbWxqTahEsWrhxepcoVOJ+1z5PGIjPZxRkytcdSUaNjIjBM7Xn8E+pdSuV7SzvWovBFA54FO0JSoqhA==",
- "dev": true
- },
- "node_modules/util": {
- "version": "0.11.1",
- "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz",
- "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==",
+ "node_modules/temp/node_modules/mkdirp": {
+ "version": "0.5.6",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz",
+ "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
"dev": true,
+ "license": "MIT",
+ "peer": true,
"dependencies": {
- "inherits": "2.0.3"
+ "minimist": "^1.2.6"
+ },
+ "bin": {
+ "mkdirp": "bin/cmd.js"
}
},
- "node_modules/util-deprecate": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
- "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="
- },
- "node_modules/util.promisify": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz",
- "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==",
+ "node_modules/temp/node_modules/rimraf": {
+ "version": "2.6.3",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz",
+ "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==",
+ "deprecated": "Rimraf versions prior to v4 are no longer supported",
"dev": true,
+ "license": "ISC",
+ "peer": true,
"dependencies": {
- "define-properties": "^1.1.3",
- "es-abstract": "^1.17.2",
- "has-symbols": "^1.0.1",
- "object.getownpropertydescriptors": "^2.1.0"
+ "glob": "^7.1.3"
},
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "bin": {
+ "rimraf": "bin.js"
}
},
- "node_modules/util/node_modules/inherits": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
- "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==",
- "dev": true
+ "node_modules/text-decoder": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.7.tgz",
+ "integrity": "sha512-vlLytXkeP4xvEq2otHeJfSQIRyWxo/oZGEbXrtEEF9Hnmrdly59sUbzZ/QgyWuLYHctCHxFF4tRQZNQ9k60ExQ==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "b4a": "^1.6.4"
+ }
},
- "node_modules/utils-merge": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
- "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==",
+ "node_modules/text-hex": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz",
+ "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==",
"dev": true,
- "peer": true,
- "engines": {
- "node": ">= 0.4.0"
- }
+ "license": "MIT",
+ "peer": true
},
- "node_modules/uuid": {
- "version": "9.0.1",
- "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz",
- "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==",
- "funding": [
- "https://github.com/sponsors/broofa",
- "https://github.com/sponsors/ctavan"
- ],
- "bin": {
- "uuid": "dist/bin/uuid"
+ "node_modules/throttle-debounce": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-5.0.2.tgz",
+ "integrity": "sha512-B71/4oyj61iNH0KeCamLuE2rmKuTO5byTOSVwECM5FA7TiAiAW+UqTKZ9ERueC4qvgSttUhdmq1mXC3kJqGX7A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.22"
}
},
- "node_modules/v8-compile-cache": {
- "version": "2.4.0",
- "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.4.0.tgz",
- "integrity": "sha512-ocyWc3bAHBB/guyqJQVI5o4BZkPhznPYUG2ea80Gond/BgNWpap8TOmLSeeQG7bnh2KMISxskdADG59j7zruhw==",
- "dev": true
+ "node_modules/through": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
+ "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==",
+ "dev": true,
+ "license": "MIT"
},
- "node_modules/validate-npm-package-license": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
- "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
+ "node_modules/tiny-async-pool": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/tiny-async-pool/-/tiny-async-pool-1.3.0.tgz",
+ "integrity": "sha512-01EAw5EDrcVrdgyCLgoSPvqznC0sVxDSVeiOz09FUpjh71G79VCqneOr+xvt7T1r76CF6ZZfPjHorN2+d+3mqA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "spdx-correct": "^3.0.0",
- "spdx-expression-parse": "^3.0.0"
+ "semver": "^5.5.0"
}
},
- "node_modules/validate.js": {
- "version": "0.13.1",
- "resolved": "https://registry.npmjs.org/validate.js/-/validate.js-0.13.1.tgz",
- "integrity": "sha512-PnFM3xiZ+kYmLyTiMgTYmU7ZHkjBZz2/+F0DaALc/uUtVzdCt1wAosvYJ5hFQi/hz8O4zb52FQhHZRC+uVkJ+g==",
+ "node_modules/tiny-async-pool/node_modules/semver": {
+ "version": "5.7.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
+ "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
"dev": true,
- "peer": true
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver"
+ }
},
- "node_modules/vary": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
- "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
+ "node_modules/tiny-typed-emitter": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/tiny-typed-emitter/-/tiny-typed-emitter-2.1.0.tgz",
+ "integrity": "sha512-qVtvMxeXbVej0cQWKqVSSAHmKZEHAvxdF8HEUBFWts8h+xEo5m/lEiPakuyZ3BnCBjOD8i24kzNOiOLLgsSxhA==",
+ "license": "MIT"
+ },
+ "node_modules/tinybench": {
+ "version": "2.9.0",
+ "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz",
+ "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==",
"dev": true,
- "peer": true,
- "engines": {
- "node": ">= 0.8"
- }
+ "license": "MIT"
},
- "node_modules/vendors": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.4.tgz",
- "integrity": "sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==",
+ "node_modules/tinyexec": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz",
+ "integrity": "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==",
"dev": true,
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
}
},
- "node_modules/verror": {
- "version": "1.10.1",
- "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.1.tgz",
- "integrity": "sha512-veufcmxri4e3XSrT0xwfUR7kguIkaxBeosDg00yDWhk49wdwkSUrvvsm7nc75e1PUyvIeZj6nS8VQRYz2/S4Xg==",
+ "node_modules/tinyglobby": {
+ "version": "0.2.15",
+ "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz",
+ "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==",
"dev": true,
- "optional": true,
+ "license": "MIT",
"dependencies": {
- "assert-plus": "^1.0.0",
- "core-util-is": "1.0.2",
- "extsprintf": "^1.2.0"
+ "fdir": "^6.5.0",
+ "picomatch": "^4.0.3"
},
"engines": {
- "node": ">=0.6.0"
+ "node": ">=12.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/SuperchupuDev"
}
},
- "node_modules/vlq": {
- "version": "0.2.3",
- "resolved": "https://registry.npmjs.org/vlq/-/vlq-0.2.3.tgz",
- "integrity": "sha512-DRibZL6DsNhIgYQ+wNdWDL2SL3bKPlVrRiBqV5yuMm++op8W4kGFtaQfCs4KEJn0wBZcHVHJ3eoywX8983k1ow==",
- "dev": true
- },
- "node_modules/vm-browserify": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz",
- "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==",
- "dev": true
- },
- "node_modules/void-elements": {
+ "node_modules/tinyrainbow": {
"version": "3.1.0",
- "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz",
- "integrity": "sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==",
+ "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.1.0.tgz",
+ "integrity": "sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==",
+ "dev": true,
+ "license": "MIT",
"engines": {
- "node": ">=0.10.0"
+ "node": ">=14.0.0"
}
},
- "node_modules/w3c-hr-time": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz",
- "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==",
- "deprecated": "Use your platform's native performance.now() and performance.timeOrigin.",
+ "node_modules/tmp": {
+ "version": "0.2.7",
+ "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.7.tgz",
+ "integrity": "sha512-e0votIpp4Uo2AJYSzVHV6xCcawuiez3DzqDAbrTc3YxBkplN6e+dM13ZeIcZnDg/QpSuU2zfZ3rzwY8ukEnaXw==",
"dev": true,
- "dependencies": {
- "browser-process-hrtime": "^1.0.0"
+ "license": "MIT",
+ "engines": {
+ "node": ">=14.14"
}
},
- "node_modules/w3c-xmlserializer": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-1.1.2.tgz",
- "integrity": "sha512-p10l/ayESzrBMYWRID6xbuCKh2Fp77+sA0doRuGn4tTIMrrZVeqfpKjXHY+oDh3K4nLdPgNwMTVP6Vp4pvqbNg==",
+ "node_modules/tmp-promise": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/tmp-promise/-/tmp-promise-3.0.3.tgz",
+ "integrity": "sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "domexception": "^1.0.1",
- "webidl-conversions": "^4.0.2",
- "xml-name-validator": "^3.0.0"
+ "tmp": "^0.2.0"
}
},
- "node_modules/wbuf": {
- "version": "1.7.3",
- "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz",
- "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==",
+ "node_modules/to-valid-identifier": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/to-valid-identifier/-/to-valid-identifier-1.0.0.tgz",
+ "integrity": "sha512-41wJyvKep3yT2tyPqX/4blcfybknGB4D+oETKLs7Q76UiPqRpUJK3hr1nxelyYO0PHKVzJwlu0aCeEAsGI6rpw==",
"dev": true,
- "optional": true,
- "peer": true,
+ "license": "MIT",
"dependencies": {
- "minimalistic-assert": "^1.0.0"
+ "@sindresorhus/base62": "^1.0.0",
+ "reserved-identifiers": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=20"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/wcwidth": {
+ "node_modules/toidentifier": {
"version": "1.0.1",
- "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz",
- "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==",
+ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
+ "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
"dev": true,
- "dependencies": {
- "defaults": "^1.0.3"
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=0.6"
}
},
- "node_modules/web2driver": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/web2driver/-/web2driver-3.0.4.tgz",
- "integrity": "sha512-2jqJzH+1vmgfWBs9tmREsLlBAhWQUpMtKQJUdRNq4OXmmTWrdf8iyh21ifdalhL/5mNpdQ28QkFujoc4lCA5XQ==",
- "dependencies": {
- "@wdio/logger": "^7.7.0",
- "@wdio/protocols": "^7.7.4",
- "lodash": "^4.17.11",
- "process": "^0.11.10",
- "webdriver": "^7.16.14"
+ "node_modules/triple-beam": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz",
+ "integrity": "sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">= 14.0.0"
}
},
- "node_modules/webdriver": {
- "version": "7.33.0",
- "resolved": "https://registry.npmjs.org/webdriver/-/webdriver-7.33.0.tgz",
- "integrity": "sha512-cyMRAVUHgQhEBHojOeNet2e8GkfyvvjpioNCPcF6qUtT+URdagr8Mh0t4Fs+Jr0tpuMqFnw70xZexAcV/6I/jg==",
+ "node_modules/truncate-utf8-bytes": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz",
+ "integrity": "sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==",
+ "license": "WTFPL",
"dependencies": {
- "@types/node": "^18.0.0",
- "@wdio/config": "7.33.0",
- "@wdio/logger": "7.26.0",
- "@wdio/protocols": "7.27.0",
- "@wdio/types": "7.33.0",
- "@wdio/utils": "7.33.0",
- "got": "^11.0.2",
- "ky": "0.30.0",
- "lodash.merge": "^4.6.1"
- },
- "engines": {
- "node": ">=12.0.0"
+ "utf8-byte-length": "^1.0.1"
}
},
- "node_modules/webdriver/node_modules/@sindresorhus/is": {
- "version": "4.6.0",
- "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz",
- "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==",
+ "node_modules/ts-api-utils": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz",
+ "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==",
+ "dev": true,
+ "license": "MIT",
"engines": {
- "node": ">=10"
+ "node": ">=18.12"
},
- "funding": {
- "url": "https://github.com/sindresorhus/is?sponsor=1"
+ "peerDependencies": {
+ "typescript": ">=4.8.4"
}
},
- "node_modules/webdriver/node_modules/@szmarczak/http-timer": {
- "version": "4.0.6",
- "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz",
- "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==",
+ "node_modules/ts-pattern": {
+ "version": "5.9.0",
+ "resolved": "https://registry.npmjs.org/ts-pattern/-/ts-pattern-5.9.0.tgz",
+ "integrity": "sha512-6s5V71mX8qBUmlgbrfL33xDUwO0fq48rxAu2LBE11WBeGdpCPOsXksQbZJHvHwhrd3QjUusd3mAOM5Gg0mFBLg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/tslib": {
+ "version": "2.8.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+ "license": "0BSD"
+ },
+ "node_modules/type-check": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
+ "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "defer-to-connect": "^2.0.0"
+ "prelude-ls": "^1.2.1"
},
"engines": {
- "node": ">=10"
+ "node": ">= 0.8.0"
}
},
- "node_modules/webdriver/node_modules/@types/node": {
- "version": "18.19.3",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.3.tgz",
- "integrity": "sha512-k5fggr14DwAytoA/t8rPrIz++lXK7/DqckthCmoZOKNsEbJkId4Z//BqgApXBUGrGddrigYa1oqheo/7YmW4rg==",
+ "node_modules/type-fest": {
+ "version": "5.6.0",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-5.6.0.tgz",
+ "integrity": "sha512-8ZiHFm91orbSAe2PSAiSVBVko18pbhbiB3U9GglSzF/zCGkR+rxpHx6sEMCUm4kxY4LjDIUGgCfUMtwfZfjfUA==",
+ "dev": true,
+ "license": "(MIT OR CC0-1.0)",
+ "peer": true,
"dependencies": {
- "undici-types": "~5.26.4"
+ "tagged-tag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=20"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/webdriver/node_modules/@wdio/types": {
- "version": "7.33.0",
- "resolved": "https://registry.npmjs.org/@wdio/types/-/types-7.33.0.tgz",
- "integrity": "sha512-tNcuN5Kl+i5CffaeTYV1omzAo4rVjiI1m9raIA8ph6iVteWdCzYv2/ImpGgFiBPb7Mf6VokU3+q9Slh5Jitaww==",
+ "node_modules/type-is": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.1.0.tgz",
+ "integrity": "sha512-faYHw0anBbc/kWF3zFTEnxSFOAGUX9GFbOBthvDdLsIlEoWOFOtS0zgCiQYwIskL9iGXZL3kAXD8OoZ4GmMATA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
"dependencies": {
- "@types/node": "^18.0.0",
- "got": "^11.8.1"
+ "content-type": "^2.0.0",
+ "media-typer": "^1.1.0",
+ "mime-types": "^3.0.0"
},
"engines": {
- "node": ">=12.0.0"
+ "node": ">= 18"
},
- "peerDependencies": {
- "typescript": "^4.6.2"
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
+ }
+ },
+ "node_modules/type-is/node_modules/content-type": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/content-type/-/content-type-2.0.0.tgz",
+ "integrity": "sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=18"
},
- "peerDependenciesMeta": {
- "typescript": {
- "optional": true
- }
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
}
},
- "node_modules/webdriver/node_modules/cacheable-request": {
- "version": "7.0.4",
- "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz",
- "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==",
+ "node_modules/typedarray-to-buffer": {
+ "version": "3.1.5",
+ "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz",
+ "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==",
+ "license": "MIT",
"dependencies": {
- "clone-response": "^1.0.2",
- "get-stream": "^5.1.0",
- "http-cache-semantics": "^4.0.0",
- "keyv": "^4.0.0",
- "lowercase-keys": "^2.0.0",
- "normalize-url": "^6.0.1",
- "responselike": "^2.0.0"
+ "is-typedarray": "^1.0.0"
+ }
+ },
+ "node_modules/typescript": {
+ "version": "5.9.3",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz",
+ "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
+ "devOptional": true,
+ "license": "Apache-2.0",
+ "peer": true,
+ "bin": {
+ "tsc": "bin/tsc",
+ "tsserver": "bin/tsserver"
},
"engines": {
- "node": ">=8"
+ "node": ">=14.17"
}
},
- "node_modules/webdriver/node_modules/decompress-response": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz",
- "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==",
+ "node_modules/typescript-eslint": {
+ "version": "8.61.0",
+ "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.61.0.tgz",
+ "integrity": "sha512-8y31Rd0eGTrDKqhy6vT0HtzhN+YLjQizwX3aA3hPXP/ynSfnrBXcQY5IzsP9/DM7+klX4IUncZZjkchP0z+rUw==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "mimic-response": "^3.1.0"
+ "@typescript-eslint/eslint-plugin": "8.61.0",
+ "@typescript-eslint/parser": "8.61.0",
+ "@typescript-eslint/typescript-estree": "8.61.0",
+ "@typescript-eslint/utils": "8.61.0"
},
"engines": {
- "node": ">=10"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
"funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
+ "typescript": ">=4.8.4 <6.1.0"
}
},
- "node_modules/webdriver/node_modules/defer-to-connect": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz",
- "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==",
+ "node_modules/undici": {
+ "version": "7.28.0",
+ "resolved": "https://registry.npmjs.org/undici/-/undici-7.28.0.tgz",
+ "integrity": "sha512-cRZYrTDwWznlnRiPjggAGxZXanty6M8RV1ff8Wm4LWXBp7/IG8v5DnOm74DtUBp9OONpK75YlPnIjQqX0dBDtA==",
+ "license": "MIT",
"engines": {
- "node": ">=10"
+ "node": ">=20.18.1"
}
},
- "node_modules/webdriver/node_modules/get-stream": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
- "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
- "dependencies": {
- "pump": "^3.0.0"
- },
+ "node_modules/undici-types": {
+ "version": "7.16.0",
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz",
+ "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==",
+ "license": "MIT"
+ },
+ "node_modules/unicorn-magic": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.4.0.tgz",
+ "integrity": "sha512-wH590V9VNgYH9g3lH9wWjTrUoKsjLF6sGLjhR4sH1LWpLmCOH0Zf7PukhDA8BiS7KHe4oPNkcTHqYkj7SOGUOw==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
"engines": {
- "node": ">=8"
+ "node": ">=20"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/webdriver/node_modules/got": {
- "version": "11.8.6",
- "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz",
- "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==",
+ "node_modules/unist-util-filter": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/unist-util-filter/-/unist-util-filter-5.0.1.tgz",
+ "integrity": "sha512-pHx7D4Zt6+TsfwylH9+lYhBhzyhEnCXs/lbq/Hstxno5z4gVdyc2WEW0asfjGKPyG4pEKrnBv5hdkO6+aRnQJw==",
+ "license": "MIT",
"dependencies": {
- "@sindresorhus/is": "^4.0.0",
- "@szmarczak/http-timer": "^4.0.5",
- "@types/cacheable-request": "^6.0.1",
- "@types/responselike": "^1.0.0",
- "cacheable-lookup": "^5.0.3",
- "cacheable-request": "^7.0.2",
- "decompress-response": "^6.0.0",
- "http2-wrapper": "^1.0.0-beta.5.2",
- "lowercase-keys": "^2.0.0",
- "p-cancelable": "^2.0.0",
- "responselike": "^2.0.0"
- },
- "engines": {
- "node": ">=10.19.0"
+ "@types/unist": "^3.0.0",
+ "unist-util-is": "^6.0.0",
+ "unist-util-visit-parents": "^6.0.0"
+ }
+ },
+ "node_modules/unist-util-is": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.1.tgz",
+ "integrity": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0"
},
"funding": {
- "url": "https://github.com/sindresorhus/got?sponsor=1"
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
}
},
- "node_modules/webdriver/node_modules/lowercase-keys": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz",
- "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==",
- "engines": {
- "node": ">=8"
+ "node_modules/unist-util-visit-parents": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz",
+ "integrity": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^3.0.0",
+ "unist-util-is": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
}
},
- "node_modules/webdriver/node_modules/mimic-response": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz",
- "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==",
+ "node_modules/universalify": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
+ "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
+ "dev": true,
+ "license": "MIT",
"engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "node": ">= 4.0.0"
}
},
- "node_modules/webdriver/node_modules/normalize-url": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz",
- "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==",
+ "node_modules/unorm": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/unorm/-/unorm-1.6.0.tgz",
+ "integrity": "sha512-b2/KCUlYZUeA7JFUuRJZPUtr4gZvBh7tavtv4fvk4+KV9pfGiR6CQAQAWl49ZpR3ts2dk4FYkP7EIgDJoiOLDA==",
+ "dev": true,
+ "license": "MIT or GPL-2.0",
"engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "node": ">= 0.4.0"
}
},
- "node_modules/webdriver/node_modules/p-cancelable": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz",
- "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==",
+ "node_modules/unpipe": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
+ "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
"engines": {
- "node": ">=8"
+ "node": ">= 0.8"
}
},
- "node_modules/webdriver/node_modules/responselike": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz",
- "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==",
+ "node_modules/unrs-resolver": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.11.1.tgz",
+ "integrity": "sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "MIT",
"dependencies": {
- "lowercase-keys": "^2.0.0"
+ "napi-postinstall": "^0.3.0"
},
"funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "url": "https://opencollective.com/unrs-resolver"
+ },
+ "optionalDependencies": {
+ "@unrs/resolver-binding-android-arm-eabi": "1.11.1",
+ "@unrs/resolver-binding-android-arm64": "1.11.1",
+ "@unrs/resolver-binding-darwin-arm64": "1.11.1",
+ "@unrs/resolver-binding-darwin-x64": "1.11.1",
+ "@unrs/resolver-binding-freebsd-x64": "1.11.1",
+ "@unrs/resolver-binding-linux-arm-gnueabihf": "1.11.1",
+ "@unrs/resolver-binding-linux-arm-musleabihf": "1.11.1",
+ "@unrs/resolver-binding-linux-arm64-gnu": "1.11.1",
+ "@unrs/resolver-binding-linux-arm64-musl": "1.11.1",
+ "@unrs/resolver-binding-linux-ppc64-gnu": "1.11.1",
+ "@unrs/resolver-binding-linux-riscv64-gnu": "1.11.1",
+ "@unrs/resolver-binding-linux-riscv64-musl": "1.11.1",
+ "@unrs/resolver-binding-linux-s390x-gnu": "1.11.1",
+ "@unrs/resolver-binding-linux-x64-gnu": "1.11.1",
+ "@unrs/resolver-binding-linux-x64-musl": "1.11.1",
+ "@unrs/resolver-binding-wasm32-wasi": "1.11.1",
+ "@unrs/resolver-binding-win32-arm64-msvc": "1.11.1",
+ "@unrs/resolver-binding-win32-ia32-msvc": "1.11.1",
+ "@unrs/resolver-binding-win32-x64-msvc": "1.11.1"
+ }
+ },
+ "node_modules/unzipper": {
+ "version": "0.12.3",
+ "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.12.3.tgz",
+ "integrity": "sha512-PZ8hTS+AqcGxsaQntl3IRBw65QrBI6lxzqDEL7IAo/XCEqRTKGfOX56Vea5TH9SZczRVxuzk1re04z/YjuYCJA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "bluebird": "~3.7.2",
+ "duplexer2": "~0.1.4",
+ "fs-extra": "^11.2.0",
+ "graceful-fs": "^4.2.2",
+ "node-int64": "^0.4.0"
}
},
- "node_modules/webdriver/node_modules/typescript": {
- "version": "4.9.5",
- "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz",
- "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==",
- "optional": true,
- "peer": true,
- "bin": {
- "tsc": "bin/tsc",
- "tsserver": "bin/tsserver"
+ "node_modules/unzipper/node_modules/fs-extra": {
+ "version": "11.3.5",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.5.tgz",
+ "integrity": "sha512-eKpRKAovdpZtR1WopLHxlBWvAgPny3c4gX1G5Jhwmmw4XJj0ifSD5qB5TOo8hmA0wlRKDAOAhEE1yVPgs6Fgcg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
},
"engines": {
- "node": ">=4.2.0"
+ "node": ">=14.14"
}
},
- "node_modules/webdriverio": {
- "version": "6.12.1",
- "resolved": "https://registry.npmjs.org/webdriverio/-/webdriverio-6.12.1.tgz",
- "integrity": "sha512-Nx7ge0vTWHVIRUbZCT+IuMwB5Q0Q5nLlYdgnmmJviUKLuc3XtaEBkYPTbhHWHgSBXsPZMIc023vZKNkn+6iyeQ==",
+ "node_modules/unzipper/node_modules/jsonfile": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz",
+ "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@types/puppeteer-core": "^5.4.0",
- "@wdio/config": "6.12.1",
- "@wdio/logger": "6.10.10",
- "@wdio/repl": "6.11.0",
- "@wdio/utils": "6.11.0",
- "archiver": "^5.0.0",
- "atob": "^2.1.2",
- "css-shorthand-properties": "^1.1.1",
- "css-value": "^0.0.1",
- "devtools": "6.12.1",
- "fs-extra": "^9.0.1",
- "get-port": "^5.1.1",
- "grapheme-splitter": "^1.0.2",
- "lodash.clonedeep": "^4.5.0",
- "lodash.isobject": "^3.0.2",
- "lodash.isplainobject": "^4.0.6",
- "lodash.zip": "^4.2.0",
- "minimatch": "^3.0.4",
- "puppeteer-core": "^5.1.0",
- "resq": "^1.9.1",
- "rgb2hex": "0.2.3",
- "serialize-error": "^8.0.0",
- "webdriver": "6.12.1"
+ "universalify": "^2.0.0"
},
- "engines": {
- "node": ">=10.0.0"
+ "optionalDependencies": {
+ "graceful-fs": "^4.1.6"
}
},
- "node_modules/webdriverio/node_modules/@sindresorhus/is": {
- "version": "4.6.0",
- "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz",
- "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==",
+ "node_modules/unzipper/node_modules/universalify": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
+ "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
"dev": true,
+ "license": "MIT",
"engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sindresorhus/is?sponsor=1"
+ "node": ">= 10.0.0"
}
},
- "node_modules/webdriverio/node_modules/@szmarczak/http-timer": {
- "version": "4.0.6",
- "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz",
- "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==",
+ "node_modules/update-browserslist-db": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz",
+ "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==",
"dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
"dependencies": {
- "defer-to-connect": "^2.0.0"
+ "escalade": "^3.2.0",
+ "picocolors": "^1.1.1"
+ },
+ "bin": {
+ "update-browserslist-db": "cli.js"
},
+ "peerDependencies": {
+ "browserslist": ">= 4.21.0"
+ }
+ },
+ "node_modules/uri-js": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "punycode": "^2.1.0"
+ }
+ },
+ "node_modules/use-sync-external-store": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz",
+ "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==",
+ "license": "MIT",
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
+ }
+ },
+ "node_modules/userhome": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/userhome/-/userhome-1.0.1.tgz",
+ "integrity": "sha512-5cnLm4gseXjAclKowC4IjByaGsjtAoV6PrOQOljplNB54ReUYJP8HdAFq2muHinSDAh09PPX/uXDPfdxRHvuSA==",
+ "license": "MIT",
"engines": {
- "node": ">=10"
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/utf8-byte-length": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.5.tgz",
+ "integrity": "sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA==",
+ "license": "(WTFPL OR MIT)"
+ },
+ "node_modules/util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/uuid": {
+ "version": "14.0.0",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-14.0.0.tgz",
+ "integrity": "sha512-Qo+uWgilfSmAhXCMav1uYFynlQO7fMFiMVZsQqZRMIXp0O7rR7qjkj+cPvBHLgBqi960QCoo/PH2/6ZtVqKvrg==",
+ "dev": true,
+ "funding": [
+ "https://github.com/sponsors/broofa",
+ "https://github.com/sponsors/ctavan"
+ ],
+ "license": "MIT",
+ "bin": {
+ "uuid": "dist-node/bin/uuid"
}
},
- "node_modules/webdriverio/node_modules/@wdio/config": {
- "version": "6.12.1",
- "resolved": "https://registry.npmjs.org/@wdio/config/-/config-6.12.1.tgz",
- "integrity": "sha512-V5hTIW5FNlZ1W33smHF4Rd5BKjGW2KeYhyXDQfXHjqLCeRiirZ9fABCo9plaVQDnwWSUMWYaAaIAifV82/oJCQ==",
+ "node_modules/validate-npm-package-license": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
+ "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
"dev": true,
+ "license": "Apache-2.0",
"dependencies": {
- "@wdio/logger": "6.10.10",
- "deepmerge": "^4.0.0",
- "glob": "^7.1.2"
- },
+ "spdx-correct": "^3.0.0",
+ "spdx-expression-parse": "^3.0.0"
+ }
+ },
+ "node_modules/vary": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
+ "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
"engines": {
- "node": ">=10.0.0"
+ "node": ">= 0.8"
}
},
- "node_modules/webdriverio/node_modules/@wdio/logger": {
- "version": "6.10.10",
- "resolved": "https://registry.npmjs.org/@wdio/logger/-/logger-6.10.10.tgz",
- "integrity": "sha512-2nh0hJz9HeZE0VIEMI+oPgjr/Q37ohrR9iqsl7f7GW5ik+PnKYCT9Eab5mR1GNMG60askwbskgGC1S9ygtvrSw==",
+ "node_modules/vite": {
+ "version": "7.3.5",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.5.tgz",
+ "integrity": "sha512-KuOaNhcnGFN2zIPGA7wRmzF+lJA1sea7rHq17aiJ++9lzY1WWG6Jpwqwe1KNbRVPIqHmr8GLYx7jbrQcN/7/ww==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "chalk": "^4.0.0",
- "loglevel": "^1.6.0",
- "loglevel-plugin-prefix": "^0.8.4",
- "strip-ansi": "^6.0.0"
+ "esbuild": "^0.27.0",
+ "fdir": "^6.5.0",
+ "picomatch": "^4.0.3",
+ "postcss": "^8.5.6",
+ "rollup": "^4.43.0",
+ "tinyglobby": "^0.2.15"
+ },
+ "bin": {
+ "vite": "bin/vite.js"
},
"engines": {
- "node": ">=10.0.0"
+ "node": "^20.19.0 || >=22.12.0"
+ },
+ "funding": {
+ "url": "https://github.com/vitejs/vite?sponsor=1"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.3"
+ },
+ "peerDependencies": {
+ "@types/node": "^20.19.0 || >=22.12.0",
+ "jiti": ">=1.21.0",
+ "less": "^4.0.0",
+ "lightningcss": "^1.21.0",
+ "sass": "^1.70.0",
+ "sass-embedded": "^1.70.0",
+ "stylus": ">=0.54.8",
+ "sugarss": "^5.0.0",
+ "terser": "^5.16.0",
+ "tsx": "^4.8.1",
+ "yaml": "^2.4.2"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ },
+ "jiti": {
+ "optional": true
+ },
+ "less": {
+ "optional": true
+ },
+ "lightningcss": {
+ "optional": true
+ },
+ "sass": {
+ "optional": true
+ },
+ "sass-embedded": {
+ "optional": true
+ },
+ "stylus": {
+ "optional": true
+ },
+ "sugarss": {
+ "optional": true
+ },
+ "terser": {
+ "optional": true
+ },
+ "tsx": {
+ "optional": true
+ },
+ "yaml": {
+ "optional": true
+ }
}
},
- "node_modules/webdriverio/node_modules/@wdio/protocols": {
- "version": "6.12.0",
- "resolved": "https://registry.npmjs.org/@wdio/protocols/-/protocols-6.12.0.tgz",
- "integrity": "sha512-UhTBZxClCsM3VjaiDp4DoSCnsa7D1QNmI2kqEBfIpyNkT3GcZhJb7L+nL0fTkzCwi7+/uLastb3/aOwH99gt0A==",
+ "node_modules/vite-plugin-electron-renderer": {
+ "version": "0.14.7",
+ "resolved": "https://registry.npmjs.org/vite-plugin-electron-renderer/-/vite-plugin-electron-renderer-0.14.7.tgz",
+ "integrity": "sha512-hHBMKuZ24MB2SIxG7U7ix+DDEnvxou7Bgy/TdhYxNz3S5N3Yh7Hjvj9blfMeGEJ0oaZJn7y5z0V/RyDmJ5OuCA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/vite/node_modules/@esbuild/aix-ppc64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.7.tgz",
+ "integrity": "sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==",
+ "cpu": [
+ "ppc64"
+ ],
"dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "aix"
+ ],
"engines": {
- "node": ">=10.0.0"
+ "node": ">=18"
}
},
- "node_modules/webdriverio/node_modules/@wdio/utils": {
- "version": "6.11.0",
- "resolved": "https://registry.npmjs.org/@wdio/utils/-/utils-6.11.0.tgz",
- "integrity": "sha512-vf0sOQzd28WbI26d6/ORrQ4XKWTzSlWLm9W/K/eJO0NASKPEzR+E+Q2kaa+MJ4FKXUpjbt+Lxfo+C26TzBk7tg==",
+ "node_modules/vite/node_modules/@esbuild/android-arm": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.7.tgz",
+ "integrity": "sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==",
+ "cpu": [
+ "arm"
+ ],
"dev": true,
- "dependencies": {
- "@wdio/logger": "6.10.10"
- },
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
"engines": {
- "node": ">=10.0.0"
+ "node": ">=18"
}
},
- "node_modules/webdriverio/node_modules/ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "node_modules/vite/node_modules/@esbuild/android-arm64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.7.tgz",
+ "integrity": "sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==",
+ "cpu": [
+ "arm64"
+ ],
"dev": true,
- "dependencies": {
- "color-convert": "^2.0.1"
- },
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
"engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ "node": ">=18"
}
},
- "node_modules/webdriverio/node_modules/archiver": {
- "version": "5.3.2",
- "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.3.2.tgz",
- "integrity": "sha512-+25nxyyznAXF7Nef3y0EbBeqmGZgeN/BxHX29Rs39djAfaFalmQ89SE6CWyDCHzGL0yt/ycBtNOmGTW0FyGWNw==",
+ "node_modules/vite/node_modules/@esbuild/android-x64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.7.tgz",
+ "integrity": "sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==",
+ "cpu": [
+ "x64"
+ ],
"dev": true,
- "dependencies": {
- "archiver-utils": "^2.1.0",
- "async": "^3.2.4",
- "buffer-crc32": "^0.2.1",
- "readable-stream": "^3.6.0",
- "readdir-glob": "^1.1.2",
- "tar-stream": "^2.2.0",
- "zip-stream": "^4.1.0"
- },
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
"engines": {
- "node": ">= 10"
+ "node": ">=18"
}
},
- "node_modules/webdriverio/node_modules/archiver-utils": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-2.1.0.tgz",
- "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==",
+ "node_modules/vite/node_modules/@esbuild/darwin-arm64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.7.tgz",
+ "integrity": "sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==",
+ "cpu": [
+ "arm64"
+ ],
"dev": true,
- "dependencies": {
- "glob": "^7.1.4",
- "graceful-fs": "^4.2.0",
- "lazystream": "^1.0.0",
- "lodash.defaults": "^4.2.0",
- "lodash.difference": "^4.5.0",
- "lodash.flatten": "^4.4.0",
- "lodash.isplainobject": "^4.0.6",
- "lodash.union": "^4.6.0",
- "normalize-path": "^3.0.0",
- "readable-stream": "^2.0.0"
- },
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
"engines": {
- "node": ">= 6"
+ "node": ">=18"
}
},
- "node_modules/webdriverio/node_modules/archiver-utils/node_modules/readable-stream": {
- "version": "2.3.8",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
- "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
+ "node_modules/vite/node_modules/@esbuild/darwin-x64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.7.tgz",
+ "integrity": "sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==",
+ "cpu": [
+ "x64"
+ ],
"dev": true,
- "dependencies": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.3",
- "isarray": "~1.0.0",
- "process-nextick-args": "~2.0.0",
- "safe-buffer": "~5.1.1",
- "string_decoder": "~1.1.1",
- "util-deprecate": "~1.0.1"
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=18"
}
},
- "node_modules/webdriverio/node_modules/brace-expansion": {
- "version": "1.1.11",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "node_modules/vite/node_modules/@esbuild/freebsd-arm64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.7.tgz",
+ "integrity": "sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==",
+ "cpu": [
+ "arm64"
+ ],
"dev": true,
- "dependencies": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=18"
}
},
- "node_modules/webdriverio/node_modules/cacheable-request": {
- "version": "7.0.4",
- "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz",
- "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==",
+ "node_modules/vite/node_modules/@esbuild/freebsd-x64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.7.tgz",
+ "integrity": "sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==",
+ "cpu": [
+ "x64"
+ ],
"dev": true,
- "dependencies": {
- "clone-response": "^1.0.2",
- "get-stream": "^5.1.0",
- "http-cache-semantics": "^4.0.0",
- "keyv": "^4.0.0",
- "lowercase-keys": "^2.0.0",
- "normalize-url": "^6.0.1",
- "responselike": "^2.0.0"
- },
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
"engines": {
- "node": ">=8"
+ "node": ">=18"
}
},
- "node_modules/webdriverio/node_modules/chalk": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
- "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "node_modules/vite/node_modules/@esbuild/linux-arm": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.7.tgz",
+ "integrity": "sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==",
+ "cpu": [
+ "arm"
+ ],
"dev": true,
- "dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
"engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
+ "node": ">=18"
}
},
- "node_modules/webdriverio/node_modules/color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "node_modules/vite/node_modules/@esbuild/linux-arm64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.7.tgz",
+ "integrity": "sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==",
+ "cpu": [
+ "arm64"
+ ],
"dev": true,
- "dependencies": {
- "color-name": "~1.1.4"
- },
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
"engines": {
- "node": ">=7.0.0"
+ "node": ">=18"
}
},
- "node_modules/webdriverio/node_modules/color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "dev": true
- },
- "node_modules/webdriverio/node_modules/compress-commons": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.2.tgz",
- "integrity": "sha512-D3uMHtGc/fcO1Gt1/L7i1e33VOvD4A9hfQLP+6ewd+BvG/gQ84Yh4oftEhAdjSMgBgwGL+jsppT7JYNpo6MHHg==",
+ "node_modules/vite/node_modules/@esbuild/linux-ia32": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.7.tgz",
+ "integrity": "sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==",
+ "cpu": [
+ "ia32"
+ ],
"dev": true,
- "dependencies": {
- "buffer-crc32": "^0.2.13",
- "crc32-stream": "^4.0.2",
- "normalize-path": "^3.0.0",
- "readable-stream": "^3.6.0"
- },
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
"engines": {
- "node": ">= 10"
+ "node": ">=18"
}
},
- "node_modules/webdriverio/node_modules/crc32-stream": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-4.0.3.tgz",
- "integrity": "sha512-NT7w2JVU7DFroFdYkeq8cywxrgjPHWkdX1wjpRQXPX5Asews3tA+Ght6lddQO5Mkumffp3X7GEqku3epj2toIw==",
+ "node_modules/vite/node_modules/@esbuild/linux-loong64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.7.tgz",
+ "integrity": "sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==",
+ "cpu": [
+ "loong64"
+ ],
"dev": true,
- "dependencies": {
- "crc-32": "^1.2.0",
- "readable-stream": "^3.4.0"
- },
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
"engines": {
- "node": ">= 10"
+ "node": ">=18"
}
},
- "node_modules/webdriverio/node_modules/decompress-response": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz",
- "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==",
+ "node_modules/vite/node_modules/@esbuild/linux-mips64el": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.7.tgz",
+ "integrity": "sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==",
+ "cpu": [
+ "mips64el"
+ ],
"dev": true,
- "dependencies": {
- "mimic-response": "^3.1.0"
- },
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
"engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "node": ">=18"
}
},
- "node_modules/webdriverio/node_modules/defer-to-connect": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz",
- "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==",
+ "node_modules/vite/node_modules/@esbuild/linux-ppc64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.7.tgz",
+ "integrity": "sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==",
+ "cpu": [
+ "ppc64"
+ ],
"dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
"engines": {
- "node": ">=10"
+ "node": ">=18"
}
},
- "node_modules/webdriverio/node_modules/fs-extra": {
- "version": "9.1.0",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
- "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
+ "node_modules/vite/node_modules/@esbuild/linux-riscv64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.7.tgz",
+ "integrity": "sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==",
+ "cpu": [
+ "riscv64"
+ ],
"dev": true,
- "dependencies": {
- "at-least-node": "^1.0.0",
- "graceful-fs": "^4.2.0",
- "jsonfile": "^6.0.1",
- "universalify": "^2.0.0"
- },
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
"engines": {
- "node": ">=10"
+ "node": ">=18"
}
},
- "node_modules/webdriverio/node_modules/get-port": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/get-port/-/get-port-5.1.1.tgz",
- "integrity": "sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==",
+ "node_modules/vite/node_modules/@esbuild/linux-s390x": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.7.tgz",
+ "integrity": "sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==",
+ "cpu": [
+ "s390x"
+ ],
"dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
"engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "node": ">=18"
}
},
- "node_modules/webdriverio/node_modules/get-stream": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
- "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
+ "node_modules/vite/node_modules/@esbuild/linux-x64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.7.tgz",
+ "integrity": "sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==",
+ "cpu": [
+ "x64"
+ ],
"dev": true,
- "dependencies": {
- "pump": "^3.0.0"
- },
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
"engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "node": ">=18"
}
},
- "node_modules/webdriverio/node_modules/glob": {
- "version": "7.2.3",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
- "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "node_modules/vite/node_modules/@esbuild/netbsd-arm64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.7.tgz",
+ "integrity": "sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==",
+ "cpu": [
+ "arm64"
+ ],
"dev": true,
- "dependencies": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.1.1",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
- },
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
"engines": {
- "node": "*"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
+ "node": ">=18"
}
},
- "node_modules/webdriverio/node_modules/got": {
- "version": "11.8.6",
- "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz",
- "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==",
+ "node_modules/vite/node_modules/@esbuild/netbsd-x64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.7.tgz",
+ "integrity": "sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==",
+ "cpu": [
+ "x64"
+ ],
"dev": true,
- "dependencies": {
- "@sindresorhus/is": "^4.0.0",
- "@szmarczak/http-timer": "^4.0.5",
- "@types/cacheable-request": "^6.0.1",
- "@types/responselike": "^1.0.0",
- "cacheable-lookup": "^5.0.3",
- "cacheable-request": "^7.0.2",
- "decompress-response": "^6.0.0",
- "http2-wrapper": "^1.0.0-beta.5.2",
- "lowercase-keys": "^2.0.0",
- "p-cancelable": "^2.0.0",
- "responselike": "^2.0.0"
- },
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
"engines": {
- "node": ">=10.19.0"
- },
- "funding": {
- "url": "https://github.com/sindresorhus/got?sponsor=1"
+ "node": ">=18"
}
},
- "node_modules/webdriverio/node_modules/isarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
- "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
- "dev": true
- },
- "node_modules/webdriverio/node_modules/jsonfile": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
- "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
+ "node_modules/vite/node_modules/@esbuild/openbsd-arm64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.7.tgz",
+ "integrity": "sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==",
+ "cpu": [
+ "arm64"
+ ],
"dev": true,
- "dependencies": {
- "universalify": "^2.0.0"
- },
- "optionalDependencies": {
- "graceful-fs": "^4.1.6"
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=18"
}
},
- "node_modules/webdriverio/node_modules/lowercase-keys": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz",
- "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==",
+ "node_modules/vite/node_modules/@esbuild/openbsd-x64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.7.tgz",
+ "integrity": "sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==",
+ "cpu": [
+ "x64"
+ ],
"dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
"engines": {
- "node": ">=8"
+ "node": ">=18"
}
},
- "node_modules/webdriverio/node_modules/mimic-response": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz",
- "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==",
+ "node_modules/vite/node_modules/@esbuild/openharmony-arm64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.7.tgz",
+ "integrity": "sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==",
+ "cpu": [
+ "arm64"
+ ],
"dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openharmony"
+ ],
"engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "node": ">=18"
}
},
- "node_modules/webdriverio/node_modules/minimatch": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
- "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "node_modules/vite/node_modules/@esbuild/sunos-x64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.7.tgz",
+ "integrity": "sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==",
+ "cpu": [
+ "x64"
+ ],
"dev": true,
- "dependencies": {
- "brace-expansion": "^1.1.7"
- },
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "sunos"
+ ],
"engines": {
- "node": "*"
+ "node": ">=18"
}
},
- "node_modules/webdriverio/node_modules/normalize-url": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz",
- "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==",
+ "node_modules/vite/node_modules/@esbuild/win32-arm64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.7.tgz",
+ "integrity": "sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==",
+ "cpu": [
+ "arm64"
+ ],
"dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
"engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "node": ">=18"
}
},
- "node_modules/webdriverio/node_modules/p-cancelable": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz",
- "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==",
+ "node_modules/vite/node_modules/@esbuild/win32-ia32": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.7.tgz",
+ "integrity": "sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==",
+ "cpu": [
+ "ia32"
+ ],
"dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
"engines": {
- "node": ">=8"
+ "node": ">=18"
}
},
- "node_modules/webdriverio/node_modules/responselike": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz",
- "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==",
+ "node_modules/vite/node_modules/@esbuild/win32-x64": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.7.tgz",
+ "integrity": "sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==",
+ "cpu": [
+ "x64"
+ ],
"dev": true,
- "dependencies": {
- "lowercase-keys": "^2.0.0"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
}
},
- "node_modules/webdriverio/node_modules/safe-buffer": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
- "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
- "dev": true
- },
- "node_modules/webdriverio/node_modules/serialize-error": {
- "version": "8.1.0",
- "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-8.1.0.tgz",
- "integrity": "sha512-3NnuWfM6vBYoy5gZFvHiYsVbafvI9vZv/+jlIigFn4oP4zjNPK3LhcY0xSCgeb1a5L8jO71Mit9LlNoi2UfDDQ==",
+ "node_modules/vite/node_modules/esbuild": {
+ "version": "0.27.7",
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.7.tgz",
+ "integrity": "sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==",
"dev": true,
- "dependencies": {
- "type-fest": "^0.20.2"
+ "hasInstallScript": true,
+ "license": "MIT",
+ "bin": {
+ "esbuild": "bin/esbuild"
},
"engines": {
- "node": ">=10"
+ "node": ">=18"
+ },
+ "optionalDependencies": {
+ "@esbuild/aix-ppc64": "0.27.7",
+ "@esbuild/android-arm": "0.27.7",
+ "@esbuild/android-arm64": "0.27.7",
+ "@esbuild/android-x64": "0.27.7",
+ "@esbuild/darwin-arm64": "0.27.7",
+ "@esbuild/darwin-x64": "0.27.7",
+ "@esbuild/freebsd-arm64": "0.27.7",
+ "@esbuild/freebsd-x64": "0.27.7",
+ "@esbuild/linux-arm": "0.27.7",
+ "@esbuild/linux-arm64": "0.27.7",
+ "@esbuild/linux-ia32": "0.27.7",
+ "@esbuild/linux-loong64": "0.27.7",
+ "@esbuild/linux-mips64el": "0.27.7",
+ "@esbuild/linux-ppc64": "0.27.7",
+ "@esbuild/linux-riscv64": "0.27.7",
+ "@esbuild/linux-s390x": "0.27.7",
+ "@esbuild/linux-x64": "0.27.7",
+ "@esbuild/netbsd-arm64": "0.27.7",
+ "@esbuild/netbsd-x64": "0.27.7",
+ "@esbuild/openbsd-arm64": "0.27.7",
+ "@esbuild/openbsd-x64": "0.27.7",
+ "@esbuild/openharmony-arm64": "0.27.7",
+ "@esbuild/sunos-x64": "0.27.7",
+ "@esbuild/win32-arm64": "0.27.7",
+ "@esbuild/win32-ia32": "0.27.7",
+ "@esbuild/win32-x64": "0.27.7"
+ }
+ },
+ "node_modules/vitest": {
+ "version": "4.1.9",
+ "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.9.tgz",
+ "integrity": "sha512-nE3/LEyc0z87uHYLZebqCUOaJr2hdtuPp7BQ4BosVFnfltxgAvMG08NyrSGlPpOUWvR27c5flSmYFTNr78L9GQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@vitest/expect": "4.1.9",
+ "@vitest/mocker": "4.1.9",
+ "@vitest/pretty-format": "4.1.9",
+ "@vitest/runner": "4.1.9",
+ "@vitest/snapshot": "4.1.9",
+ "@vitest/spy": "4.1.9",
+ "@vitest/utils": "4.1.9",
+ "es-module-lexer": "^2.0.0",
+ "expect-type": "^1.3.0",
+ "magic-string": "^0.30.21",
+ "obug": "^2.1.1",
+ "pathe": "^2.0.3",
+ "picomatch": "^4.0.3",
+ "std-env": "^4.0.0-rc.1",
+ "tinybench": "^2.9.0",
+ "tinyexec": "^1.0.2",
+ "tinyglobby": "^0.2.15",
+ "tinyrainbow": "^3.1.0",
+ "vite": "^6.0.0 || ^7.0.0 || ^8.0.0",
+ "why-is-node-running": "^2.3.0"
+ },
+ "bin": {
+ "vitest": "vitest.mjs"
+ },
+ "engines": {
+ "node": "^20.0.0 || ^22.0.0 || >=24.0.0"
},
"funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "url": "https://opencollective.com/vitest"
+ },
+ "peerDependencies": {
+ "@edge-runtime/vm": "*",
+ "@opentelemetry/api": "^1.9.0",
+ "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0",
+ "@vitest/browser-playwright": "4.1.9",
+ "@vitest/browser-preview": "4.1.9",
+ "@vitest/browser-webdriverio": "4.1.9",
+ "@vitest/coverage-istanbul": "4.1.9",
+ "@vitest/coverage-v8": "4.1.9",
+ "@vitest/ui": "4.1.9",
+ "happy-dom": "*",
+ "jsdom": "*",
+ "vite": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@edge-runtime/vm": {
+ "optional": true
+ },
+ "@opentelemetry/api": {
+ "optional": true
+ },
+ "@types/node": {
+ "optional": true
+ },
+ "@vitest/browser-playwright": {
+ "optional": true
+ },
+ "@vitest/browser-preview": {
+ "optional": true
+ },
+ "@vitest/browser-webdriverio": {
+ "optional": true
+ },
+ "@vitest/coverage-istanbul": {
+ "optional": true
+ },
+ "@vitest/coverage-v8": {
+ "optional": true
+ },
+ "@vitest/ui": {
+ "optional": true
+ },
+ "happy-dom": {
+ "optional": true
+ },
+ "jsdom": {
+ "optional": true
+ },
+ "vite": {
+ "optional": false
+ }
}
},
- "node_modules/webdriverio/node_modules/string_decoder": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
- "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
- "dev": true,
- "dependencies": {
- "safe-buffer": "~5.1.0"
+ "node_modules/void-elements": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz",
+ "integrity": "sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "node_modules/webdriverio/node_modules/supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
- "dev": true,
+ "node_modules/wait-port": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/wait-port/-/wait-port-1.1.0.tgz",
+ "integrity": "sha512-3e04qkoN3LxTMLakdqeWth8nih8usyg+sf1Bgdf9wwUkp05iuK1eSY/QpLvscT/+F/gA89+LpUmmgBtesbqI2Q==",
+ "license": "MIT",
"dependencies": {
- "has-flag": "^4.0.0"
+ "chalk": "^4.1.2",
+ "commander": "^9.3.0",
+ "debug": "^4.3.4"
+ },
+ "bin": {
+ "wait-port": "bin/wait-port.js"
},
"engines": {
- "node": ">=8"
+ "node": ">=10"
}
},
- "node_modules/webdriverio/node_modules/tar-stream": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz",
- "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==",
- "dev": true,
- "dependencies": {
- "bl": "^4.0.3",
- "end-of-stream": "^1.4.1",
- "fs-constants": "^1.0.0",
- "inherits": "^2.0.3",
- "readable-stream": "^3.1.1"
- },
+ "node_modules/wait-port/node_modules/commander": {
+ "version": "9.5.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz",
+ "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==",
+ "license": "MIT",
"engines": {
- "node": ">=6"
+ "node": "^12.20.0 || >=14"
}
},
- "node_modules/webdriverio/node_modules/type-fest": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
- "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
+ "node_modules/wbuf": {
+ "version": "1.7.3",
+ "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz",
+ "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==",
"dev": true,
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "minimalistic-assert": "^1.0.0"
}
},
- "node_modules/webdriverio/node_modules/universalify": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
- "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
+ "node_modules/wcwidth": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz",
+ "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==",
"dev": true,
- "engines": {
- "node": ">= 10.0.0"
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "defaults": "^1.0.3"
}
},
- "node_modules/webdriverio/node_modules/webdriver": {
- "version": "6.12.1",
- "resolved": "https://registry.npmjs.org/webdriver/-/webdriver-6.12.1.tgz",
- "integrity": "sha512-3rZgAj9o2XHp16FDTzvUYaHelPMSPbO1TpLIMUT06DfdZjNYIzZiItpIb/NbQDTPmNhzd9cuGmdI56WFBGY2BA==",
+ "node_modules/webcrypto-core": {
+ "version": "1.9.2",
+ "resolved": "https://registry.npmjs.org/webcrypto-core/-/webcrypto-core-1.9.2.tgz",
+ "integrity": "sha512-gsXecm82UQNlTBURJGuqOWy1Ww08S3kZUcr3aOJS02Pk0xLtkfeUAVC0u0xhgdonFme80edSJUIJyuvL/7250Q==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@wdio/config": "6.12.1",
- "@wdio/logger": "6.10.10",
- "@wdio/protocols": "6.12.0",
- "@wdio/utils": "6.11.0",
- "got": "^11.0.2",
- "lodash.merge": "^4.6.1"
- },
- "engines": {
- "node": ">=10.0.0"
+ "@peculiar/asn1-schema": "^2.7.0",
+ "@peculiar/json-schema": "^1.1.12",
+ "@peculiar/utils": "^2.0.2",
+ "asn1js": "^3.0.10",
+ "tslib": "^2.8.1"
}
},
- "node_modules/webdriverio/node_modules/zip-stream": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-4.1.1.tgz",
- "integrity": "sha512-9qv4rlDiopXg4E69k+vMHjNN63YFMe9sZMrdlvKnCjlCRWeCBswPPMPUfx+ipsAWq1LXHe70RcbaHdJJpS6hyQ==",
- "dev": true,
+ "node_modules/webdriver": {
+ "version": "9.29.0",
+ "resolved": "https://registry.npmjs.org/webdriver/-/webdriver-9.29.0.tgz",
+ "integrity": "sha512-RzD+aleJeVqG4aGhp4QGQNriaBYnBV0pyC+v1AAZKoxBK+nb0W5iVWTwkTFGGMDdJGWR7s+M8Ozm6lXihpCBww==",
+ "license": "MIT",
"dependencies": {
- "archiver-utils": "^3.0.4",
- "compress-commons": "^4.1.2",
- "readable-stream": "^3.6.0"
+ "@types/node": "^20.1.0",
+ "@types/ws": "^8.5.3",
+ "@wdio/config": "9.29.0",
+ "@wdio/logger": "9.18.0",
+ "@wdio/protocols": "9.29.0",
+ "@wdio/types": "9.29.0",
+ "@wdio/utils": "9.29.0",
+ "deepmerge-ts": "^7.0.3",
+ "https-proxy-agent": "^7.0.6",
+ "undici": "^6.21.3",
+ "ws": "^8.8.0"
},
"engines": {
- "node": ">= 10"
+ "node": ">=18.20.0"
}
},
- "node_modules/webdriverio/node_modules/zip-stream/node_modules/archiver-utils": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-3.0.4.tgz",
- "integrity": "sha512-KVgf4XQVrTjhyWmx6cte4RxonPLR9onExufI1jhvw/MQ4BB6IsZD5gT8Lq+u/+pRkWna/6JoHpiQioaqFP5Rzw==",
- "dev": true,
+ "node_modules/webdriver/node_modules/@types/node": {
+ "version": "20.19.43",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.43.tgz",
+ "integrity": "sha512-6oYBAi5ikg4Pl+kGsoYtawUMBT2zZMCvPNF7pVLnHZfd1zf38DRiWn/gT01RYCdUqkv7Fhr+C9ot4/tb+2sVvA==",
+ "license": "MIT",
"dependencies": {
- "glob": "^7.2.3",
- "graceful-fs": "^4.2.0",
- "lazystream": "^1.0.0",
- "lodash.defaults": "^4.2.0",
- "lodash.difference": "^4.5.0",
- "lodash.flatten": "^4.4.0",
- "lodash.isplainobject": "^4.0.6",
- "lodash.union": "^4.6.0",
- "normalize-path": "^3.0.0",
- "readable-stream": "^3.6.0"
- },
+ "undici-types": "~6.21.0"
+ }
+ },
+ "node_modules/webdriver/node_modules/undici": {
+ "version": "6.27.0",
+ "resolved": "https://registry.npmjs.org/undici/-/undici-6.27.0.tgz",
+ "integrity": "sha512-YmfV3YnEDzXRC5lZ2jWtWWHKGUm1zIt8AhesR1tens+HTNv+YZlN/dp6G727LOvMJ8xjP9Be7Y2Sdr96LDm+pg==",
+ "license": "MIT",
"engines": {
- "node": ">= 10"
+ "node": ">=18.17"
}
},
- "node_modules/webidl-conversions": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz",
- "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==",
- "dev": true
+ "node_modules/webdriver/node_modules/undici-types": {
+ "version": "6.21.0",
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz",
+ "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==",
+ "license": "MIT"
},
"node_modules/whatwg-encoding": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz",
- "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==",
- "dev": true,
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz",
+ "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==",
+ "deprecated": "Use @exodus/bytes instead for a more spec-conformant and faster implementation",
+ "license": "MIT",
"dependencies": {
- "iconv-lite": "0.4.24"
+ "iconv-lite": "0.6.3"
+ },
+ "engines": {
+ "node": ">=18"
}
},
- "node_modules/whatwg-mimetype": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz",
- "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==",
- "dev": true
- },
- "node_modules/whatwg-url": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
- "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
+ "node_modules/whatwg-encoding/node_modules/iconv-lite": {
+ "version": "0.6.3",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
+ "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
+ "license": "MIT",
"dependencies": {
- "tr46": "~0.0.3",
- "webidl-conversions": "^3.0.0"
+ "safer-buffer": ">= 2.1.2 < 3.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
}
},
- "node_modules/whatwg-url/node_modules/webidl-conversions": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
- "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="
- },
- "node_modules/which": {
+ "node_modules/whatwg-mimetype": {
"version": "4.0.0",
- "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz",
- "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==",
- "dev": true,
+ "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz",
+ "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/which": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/which/-/which-6.0.1.tgz",
+ "integrity": "sha512-oGLe46MIrCRqX7ytPUf66EAYvdeMIZYn3WaocqqKZAxrBpkqHfL/qvTyJ/bTk5+AqHCjXmrv3CEWgy368zhRUg==",
+ "license": "ISC",
"dependencies": {
- "isexe": "^3.1.1"
+ "isexe": "^4.0.0"
},
"bin": {
"node-which": "bin/which.js"
},
"engines": {
- "node": "^16.13.0 || >=18.0.0"
- }
- },
- "node_modules/which-boxed-primitive": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz",
- "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==",
- "dev": true,
- "dependencies": {
- "is-bigint": "^1.0.1",
- "is-boolean-object": "^1.1.0",
- "is-number-object": "^1.0.4",
- "is-string": "^1.0.5",
- "is-symbol": "^1.0.3"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "node": "^20.17.0 || >=22.9.0"
}
},
- "node_modules/which-builtin-type": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.3.tgz",
- "integrity": "sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==",
- "dev": true,
- "dependencies": {
- "function.prototype.name": "^1.1.5",
- "has-tostringtag": "^1.0.0",
- "is-async-function": "^2.0.0",
- "is-date-object": "^1.0.5",
- "is-finalizationregistry": "^1.0.2",
- "is-generator-function": "^1.0.10",
- "is-regex": "^1.1.4",
- "is-weakref": "^1.0.2",
- "isarray": "^2.0.5",
- "which-boxed-primitive": "^1.0.2",
- "which-collection": "^1.0.1",
- "which-typed-array": "^1.1.9"
- },
+ "node_modules/which/node_modules/isexe": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-4.0.0.tgz",
+ "integrity": "sha512-FFUtZMpoZ8RqHS3XeXEmHWLA4thH+ZxCv2lOiPIn1Xc7CxrqhWzNSDzD+/chS/zbYezmiwWLdQC09JdQKmthOw==",
+ "license": "BlueOak-1.0.0",
"engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "node": ">=20"
}
},
- "node_modules/which-collection": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz",
- "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==",
+ "node_modules/why-is-node-running": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz",
+ "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "is-map": "^2.0.1",
- "is-set": "^2.0.1",
- "is-weakmap": "^2.0.1",
- "is-weakset": "^2.0.1"
+ "siginfo": "^2.0.0",
+ "stackback": "0.0.2"
},
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/which-typed-array": {
- "version": "1.1.13",
- "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.13.tgz",
- "integrity": "sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==",
- "dev": true,
- "dependencies": {
- "available-typed-arrays": "^1.0.5",
- "call-bind": "^1.0.4",
- "for-each": "^0.3.3",
- "gopd": "^1.0.1",
- "has-tostringtag": "^1.0.0"
+ "bin": {
+ "why-is-node-running": "cli.js"
},
"engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/wide-align": {
- "version": "1.1.5",
- "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz",
- "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==",
- "dev": true,
- "dependencies": {
- "string-width": "^1.0.2 || 2 || 3 || 4"
+ "node": ">=8"
}
},
"node_modules/winston": {
- "version": "3.11.0",
- "resolved": "https://registry.npmjs.org/winston/-/winston-3.11.0.tgz",
- "integrity": "sha512-L3yR6/MzZAOl0DsysUXHVjOwv8mKZ71TrA/41EIduGpOOV5LQVodqN+QdQ6BS6PJ/RdIshZhq84P/fStEZkk7g==",
+ "version": "3.19.0",
+ "resolved": "https://registry.npmjs.org/winston/-/winston-3.19.0.tgz",
+ "integrity": "sha512-LZNJgPzfKR+/J3cHkxcpHKpKKvGfDZVPS4hfJCc4cCG0CgYzvlD6yE/S3CIL/Yt91ak327YCpiF/0MyeZHEHKA==",
"dev": true,
+ "license": "MIT",
"peer": true,
"dependencies": {
"@colors/colors": "^1.6.0",
- "@dabh/diagnostics": "^2.0.2",
+ "@dabh/diagnostics": "^2.0.8",
"async": "^3.2.3",
"is-stream": "^2.0.0",
- "logform": "^2.4.0",
+ "logform": "^2.7.0",
"one-time": "^1.0.0",
"readable-stream": "^3.4.0",
"safe-stable-stringify": "^2.3.1",
"stack-trace": "0.0.x",
"triple-beam": "^1.3.0",
- "winston-transport": "^4.5.0"
+ "winston-transport": "^4.9.0"
},
"engines": {
"node": ">= 12.0.0"
}
},
"node_modules/winston-transport": {
- "version": "4.6.0",
- "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.6.0.tgz",
- "integrity": "sha512-wbBA9PbPAHxKiygo7ub7BYRiKxms0tpfU2ljtWzb3SjRjv5yl6Ozuy/TkXf00HTAt+Uylo3gSkNwzc4ME0wiIg==",
+ "version": "4.9.0",
+ "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.9.0.tgz",
+ "integrity": "sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==",
"dev": true,
+ "license": "MIT",
"peer": true,
"dependencies": {
- "logform": "^2.3.2",
- "readable-stream": "^3.6.0",
+ "logform": "^2.7.0",
+ "readable-stream": "^3.6.2",
"triple-beam": "^1.3.0"
},
"engines": {
"node": ">= 12.0.0"
}
},
+ "node_modules/winston-transport/node_modules/readable-stream": {
+ "version": "3.6.2",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
+ "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "inherits": "^2.0.3",
+ "string_decoder": "^1.1.1",
+ "util-deprecate": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/winston/node_modules/readable-stream": {
+ "version": "3.6.2",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
+ "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "dependencies": {
+ "inherits": "^2.0.3",
+ "string_decoder": "^1.1.1",
+ "util-deprecate": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
"node_modules/word-wrap": {
"version": "1.2.5",
"resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz",
"integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=0.10.0"
}
},
- "node_modules/workerpool": {
- "version": "6.2.1",
- "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz",
- "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==",
- "dev": true
- },
"node_modules/wrap-ansi": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
- "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "version": "9.0.2",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz",
+ "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "ansi-styles": "^4.0.0",
- "string-width": "^4.1.0",
- "strip-ansi": "^6.0.0"
+ "ansi-styles": "^6.2.1",
+ "string-width": "^7.0.0",
+ "strip-ansi": "^7.1.0"
},
"engines": {
- "node": ">=10"
+ "node": ">=18"
},
"funding": {
"url": "https://github.com/chalk/wrap-ansi?sponsor=1"
@@ -25363,7 +19362,7 @@
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
"integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
- "dev": true,
+ "license": "MIT",
"dependencies": {
"ansi-styles": "^4.0.0",
"string-width": "^4.1.0",
@@ -25376,81 +19375,84 @@
"url": "https://github.com/chalk/wrap-ansi?sponsor=1"
}
},
- "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "node_modules/wrap-ansi/node_modules/ansi-regex": {
+ "version": "6.2.2",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz",
+ "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==",
"dev": true,
- "dependencies": {
- "color-convert": "^2.0.1"
- },
+ "license": "MIT",
"engines": {
- "node": ">=8"
+ "node": ">=12"
},
"funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
}
},
- "node_modules/wrap-ansi-cjs/node_modules/color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "node_modules/wrap-ansi/node_modules/ansi-styles": {
+ "version": "6.2.3",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz",
+ "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==",
"dev": true,
- "dependencies": {
- "color-name": "~1.1.4"
- },
+ "license": "MIT",
"engines": {
- "node": ">=7.0.0"
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
- "node_modules/wrap-ansi-cjs/node_modules/color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "dev": true
+ "node_modules/wrap-ansi/node_modules/emoji-regex": {
+ "version": "10.6.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz",
+ "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==",
+ "dev": true,
+ "license": "MIT"
},
- "node_modules/wrap-ansi/node_modules/ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "node_modules/wrap-ansi/node_modules/string-width": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz",
+ "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "color-convert": "^2.0.1"
+ "emoji-regex": "^10.3.0",
+ "get-east-asian-width": "^1.0.0",
+ "strip-ansi": "^7.1.0"
},
"engines": {
- "node": ">=8"
+ "node": ">=18"
},
"funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/wrap-ansi/node_modules/color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "node_modules/wrap-ansi/node_modules/strip-ansi": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz",
+ "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "color-name": "~1.1.4"
+ "ansi-regex": "^6.0.1"
},
"engines": {
- "node": ">=7.0.0"
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/strip-ansi?sponsor=1"
}
},
- "node_modules/wrap-ansi/node_modules/color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "dev": true
- },
"node_modules/wrappy": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
- "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="
+ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
+ "license": "ISC"
},
"node_modules/write-file-atomic": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz",
"integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==",
+ "license": "ISC",
"dependencies": {
"imurmurhash": "^0.1.4",
"is-typedarray": "^1.0.0",
@@ -25458,172 +19460,260 @@
"typedarray-to-buffer": "^3.1.5"
}
},
- "node_modules/write-file-atomic/node_modules/signal-exit": {
- "version": "3.0.7",
- "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
- "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="
- },
"node_modules/ws": {
- "version": "5.2.3",
- "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.3.tgz",
- "integrity": "sha512-jZArVERrMsKUatIdnLzqvcfydI85dvd/Fp1u/VOpfdDWQ4c9qWXe+VIeAbQ5FrDwciAkr+lzofXLz3Kuf26AOA==",
- "dev": true,
- "dependencies": {
- "async-limiter": "~1.0.0"
+ "version": "8.21.0",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.0.tgz",
+ "integrity": "sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10.0.0"
+ },
+ "peerDependencies": {
+ "bufferutil": "^4.0.1",
+ "utf-8-validate": ">=5.0.2"
+ },
+ "peerDependenciesMeta": {
+ "bufferutil": {
+ "optional": true
+ },
+ "utf-8-validate": {
+ "optional": true
+ }
}
},
- "node_modules/xml": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz",
- "integrity": "sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw==",
- "dev": true
- },
- "node_modules/xml-name-validator": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz",
- "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==",
- "dev": true
+ "node_modules/xml-naming": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/xml-naming/-/xml-naming-0.1.0.tgz",
+ "integrity": "sha512-k8KO9hrMyNk6tUWqUfkTEZbezRRpONVOzUTnc97VnCvyj6Tf9lyUR9EDAIeiVLv56jsMcoXEwjW8Kv5yPY52lw==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/NaturalIntelligence"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=16.0.0"
+ }
},
"node_modules/xmlbuilder": {
"version": "15.1.1",
"resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz",
"integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=8.0"
}
},
- "node_modules/xmlchars": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz",
- "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==",
- "dev": true
- },
"node_modules/xpath": {
"version": "0.0.34",
"resolved": "https://registry.npmjs.org/xpath/-/xpath-0.0.34.tgz",
"integrity": "sha512-FxF6+rkr1rNSQrhUNYrAFJpRXNzlDoMxeXN5qI84939ylEv3qqPFKa85Oxr6tDaJKqwW6KKyo2v26TSv3k6LeA==",
+ "license": "MIT",
"engines": {
"node": ">=0.6.0"
}
},
- "node_modules/xtend": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
- "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
- "dev": true,
- "engines": {
- "node": ">=0.4"
- }
- },
"node_modules/y18n": {
"version": "5.0.8",
"resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
"integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
- "dev": true,
+ "license": "ISC",
"engines": {
"node": ">=10"
}
},
"node_modules/yallist": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
- "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
- "dev": true
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz",
+ "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==",
+ "dev": true,
+ "license": "BlueOak-1.0.0",
+ "engines": {
+ "node": ">=18"
+ }
},
"node_modules/yaml": {
- "version": "2.3.4",
- "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz",
- "integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==",
+ "version": "2.9.0",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.0.tgz",
+ "integrity": "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==",
"dev": true,
+ "license": "ISC",
+ "bin": {
+ "yaml": "bin.mjs"
+ },
"engines": {
- "node": ">= 14"
+ "node": ">= 14.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/eemeli"
}
},
"node_modules/yargs": {
- "version": "17.7.2",
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
- "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
+ "version": "18.0.0",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-18.0.0.tgz",
+ "integrity": "sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "cliui": "^8.0.1",
+ "cliui": "^9.0.1",
"escalade": "^3.1.1",
"get-caller-file": "^2.0.5",
- "require-directory": "^2.1.1",
- "string-width": "^4.2.3",
+ "string-width": "^7.2.0",
"y18n": "^5.0.5",
- "yargs-parser": "^21.1.1"
+ "yargs-parser": "^22.0.0"
},
"engines": {
- "node": ">=12"
+ "node": "^20.19.0 || ^22.12.0 || >=23"
}
},
"node_modules/yargs-parser": {
- "version": "21.1.1",
- "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
- "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
+ "version": "22.0.0",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz",
+ "integrity": "sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": "^20.19.0 || ^22.12.0 || >=23"
+ }
+ },
+ "node_modules/yargs/node_modules/ansi-regex": {
+ "version": "6.2.2",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz",
+ "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
}
},
- "node_modules/yargs-unparser": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz",
- "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==",
+ "node_modules/yargs/node_modules/emoji-regex": {
+ "version": "10.6.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz",
+ "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/yargs/node_modules/string-width": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz",
+ "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "camelcase": "^6.0.0",
- "decamelize": "^4.0.0",
- "flat": "^5.0.2",
- "is-plain-obj": "^2.1.0"
+ "emoji-regex": "^10.3.0",
+ "get-east-asian-width": "^1.0.0",
+ "strip-ansi": "^7.1.0"
},
"engines": {
- "node": ">=10"
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/yargs/node_modules/strip-ansi": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz",
+ "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/strip-ansi?sponsor=1"
}
},
"node_modules/yauzl": {
"version": "2.10.0",
"resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz",
"integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==",
+ "license": "MIT",
"dependencies": {
"buffer-crc32": "~0.2.3",
"fd-slicer": "~1.1.0"
}
},
- "node_modules/yn": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz",
- "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==",
- "dev": true,
+ "node_modules/yauzl/node_modules/buffer-crc32": {
+ "version": "0.2.13",
+ "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
+ "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==",
+ "license": "MIT",
"engines": {
- "node": ">=6"
+ "node": "*"
}
},
"node_modules/yocto-queue": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
- "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.2.tgz",
+ "integrity": "sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==",
"dev": true,
+ "license": "MIT",
"engines": {
- "node": ">=10"
+ "node": ">=12.20"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/yoctocolors": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/yoctocolors/-/yoctocolors-2.1.2.tgz",
+ "integrity": "sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==",
+ "dev": true,
+ "license": "MIT",
+ "peer": true,
+ "engines": {
+ "node": ">=18"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/zip-stream": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-5.0.1.tgz",
- "integrity": "sha512-UfZ0oa0C8LI58wJ+moL46BDIMgCQbnsb+2PoiJYtonhBsMh2bq1eRBVkvjfVsqbEHd9/EgKPUuL9saSSsec8OA==",
+ "version": "7.0.5",
+ "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-7.0.5.tgz",
+ "integrity": "sha512-dSvYKdvLsAHCDqPOhIwk/q5CvuWtTB3Dgpoe0uVEFjTzIOAmsQpprX25InCvrvJsirEbu1OHyy67n/kAj1Sw/w==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "archiver-utils": "^4.0.1",
- "compress-commons": "^5.0.1",
- "readable-stream": "^3.6.0"
+ "compress-commons": "^7.0.0",
+ "normalize-path": "^3.0.0",
+ "readable-stream": "^4.0.0"
},
"engines": {
- "node": ">= 12.0.0"
+ "node": ">=18"
+ }
+ },
+ "node_modules/zod": {
+ "version": "4.4.3",
+ "resolved": "https://registry.npmjs.org/zod/-/zod-4.4.3.tgz",
+ "integrity": "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/colinhacks"
+ }
+ },
+ "node_modules/zod-validation-error": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-4.0.2.tgz",
+ "integrity": "sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18.0.0"
+ },
+ "peerDependencies": {
+ "zod": "^3.25.0 || ^4.0.0"
}
}
}
diff --git a/package.json b/package.json
index 25f919e562..175d94ed7e 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "appium-inspector",
- "version": "2024.2.2",
+ "version": "2026.5.1",
"description": "An app inspector for use with an Appium server",
"repository": {
"type": "git",
@@ -17,232 +17,108 @@
"keywords": [
"appium"
],
- "assetsPath": "assets",
"homepage": "https://github.com/appium/appium-inspector",
- "main": "dist/main.js",
+ "main": "./dist/main/main.js",
+ "type": "module",
"scripts": {
+ "lint": "eslint . --fix",
+ "prettier": "prettier . -w",
"test": "npm run test:lint && npm run test:unit && npm run test:integration",
"test:lint": "eslint .",
- "test:lint:fix": "eslint . --fix",
"test:format": "prettier . -c",
- "test:format:fix": "prettier . -w",
- "test:unit": "cross-env BUILD_BROWSER=1 E2E_TIMEOUT=600000 NODE_ENV=test RUNNING_IN_SPECTRON=true mocha --reporter mocha-multi-reporters --reporter-options configFile=./test/mochareporters.json ./test/unit",
- "test:integration": "cross-env BUILD_BROWSER=1 E2E_TIMEOUT=600000 NODE_ENV=test RUNNING_IN_SPECTRON=true mocha --reporter mocha-multi-reporters --reporter-options configFile=./test/mochareporters.json ./test/integration",
- "e2e": "cross-env E2E_TIMEOUT=600000 NODE_ENV=test RUNNING_IN_SPECTRON=true mocha --reporter mocha-multi-reporters --reporter-options configFile=./test/mochareporters.json ./test/e2e",
- "build": "npm run build:prod:main && npm run build:prod:renderer && npm run build:prod:browser",
- "build:main": "parcel build --target node --public-url . --out-dir ./dist --out-file main.js ./app/main.js",
- "build:renderer": "parcel build --no-content-hash --out-dir ./dist --target electron --public-url . ./app/renderer/*.html",
- "build:browser": "cross-env PUBLIC_URL=. npm run build:browser:url",
- "build:browser:url": "cross-env parcel build --no-minify --out-dir ./dist-browser --target browser --public-url $PUBLIC_URL ./app/renderer/index.html",
- "watch:main": "parcel watch --target node --public-url . --out-dir ./dist --out-file main.js ./app/main.js",
- "watch:renderer": "parcel watch --out-dir ./dist --target electron --public-url . ./app/renderer/*.html",
- "watch:browser": "cross-env BUILD_BROWSER=1 NODE_ENV=development parcel serve --target browser ./app/renderer/index.html",
- "build:prod:main": "cross-env NODE_ENV=production npm run build:main",
- "build:prod:renderer": "cross-env NODE_ENV=production npm run build:renderer",
- "build:prod:browser": "cross-env BUILD_BROWSER=1 NODE_ENV=production npm run build:browser",
- "build:dev:main": "cross-env NODE_ENV=development npm run build:main",
- "build:dev:renderer": "cross-env NODE_ENV=development npm run build:renderer",
- "start": "cross-env RUNNING_LOCALLY=true electron ./",
- "start:dev": "cross-env RUNNING_LOCALLY=true FORCE_NO_WRONG_FOLDER=true NODE_ENV=development electron --inspect ./",
- "dev": "npm run build:dev:main && npm run build:dev:renderer && cross-env NODE_ENV=development concurrently --kill-others npm:start:dev npm:watch:main npm:watch:renderer",
- "clean": "npm run clean:electron && npm run clean:browser && npm run clean:npm",
- "clean:electron": "rimraf dist/ && rimraf .cache",
- "clean:browser": "rimraf dist-browser/ && rimraf .cache",
+ "test:unit": "vitest run unit",
+ "test:integration": "vitest run integration",
+ "test:e2e": "echo 'Currently not functional - TODO: fixme'",
+ "dev:browser": "vite",
+ "dev:electron": "electron-vite -w",
+ "build": "npm run build:browser && npm run build:electron && npm run build:plugin",
+ "build:browser": "vite build",
+ "build:browser:url": "vite build --base $PUBLIC_URL",
+ "build:plugin": "vite build --base /inspector --outDir ../../plugins/dist-browser",
+ "build:electron": "electron-vite build",
+ "preview:browser": "npm run build:browser && vite preview",
+ "preview:plugin": "npm run build:plugin && vite preview --base /inspector --outDir ../../plugins/dist-browser",
+ "preview:electron": "electron-vite preview",
+ "pack:electron": "electron-builder build --publish never",
+ "clean": "npm run clean:electron && npm run clean:browser && npm run clean:npm && npm run clean:plugin",
+ "clean:electron": "rimraf dist/ && rimraf node_modules/.vite/ && rimraf node_modules/.vite-electron-renderer/",
+ "clean:browser": "rimraf dist-browser/ && rimraf node_modules/.vite/",
+ "clean:plugin": "rimraf plugins/dist-browser",
"clean:npm": "rimraf package-lock.json && rimraf node_modules && npm install",
"build:docs": "appium-docs build",
"dev:docs": "appium-docs build --serve",
+ "plugin:sync:version": "node ./scripts/sync-plugin.mjs",
"publish:docs": "appium-docs build --deploy --push -b docs-site -m 'docs: build docs for appium-inspector@%s' --alias latest",
"install-docs-deps": "appium-docs init --no-mkdocs",
+ "version": "npm run plugin:sync:version && git add plugins/package.json",
"postversion": "git pull --tags && git push && git push --tags",
- "crowdin-sync": "node ./ci-jobs/crowdin-sync-translations.mjs",
- "crowdin-update": "node ./ci-jobs/crowdin-update-resources.mjs"
+ "crowdin-sync": "node ./scripts/crowdin-sync-translations.mjs",
+ "crowdin-update": "node ./scripts/crowdin-update-resources.mjs"
},
"prettier": {
"bracketSpacing": false,
"printWidth": 100,
"singleQuote": true
},
- "build": {
- "productName": "Appium Inspector",
- "appId": "io.appium.inspector",
- "asar": true,
- "directories": {
- "output": "release"
- },
- "fileAssociations": [
- {
- "ext": "appiumsession",
- "name": "Appium",
- "role": "Editor",
- "icon": "./build/icon.ico"
- }
- ],
- "mac": {
- "category": "public.app-category.developer-tools",
- "target": [
- {
- "target": "dmg",
- "arch": "universal"
- },
- {
- "target": "zip",
- "arch": "universal"
- }
- ]
- },
- "dmg": {
- "artifactName": "${productName}-mac-${version}.${ext}",
- "contents": [
- {
- "x": 410,
- "y": 150,
- "type": "link",
- "path": "/Applications"
- },
- {
- "x": 130,
- "y": 150,
- "type": "file"
- }
- ]
- },
- "files": [
- "dist/",
- "node_modules/**/*",
- "main.js",
- "main.js.map",
- "package.json"
- ],
- "win": {
- "artifactName": "${productName}-windows-${version}-${arch}.${ext}",
- "target": [
- "nsis",
- "zip"
- ],
- "icon": "build/icon.ico"
- },
- "nsisWeb": {
- "oneClick": false
- },
- "nsis": {
- "oneClick": false
- },
- "linux": {
- "artifactName": "${productName}-linux-${version}.${ext}",
- "target": [
- "AppImage"
- ],
- "category": "Development"
- },
- "publish": {
- "provider": "github",
- "owner": "appium",
- "vPrefixedTagName": true
- }
- },
"bin": {
"electron": "./node_modules/.bin/electron"
},
- "//dependencies": {
- "antd": "V5: significant rewrite required",
- "bluebird": "Deprecated: recommended to replace with native promises",
- "cheerio": "1.0.0-rc.11: errors with export namespace",
- "electron-settings": "V5: need to rewrite to IPC while keeping browser version working",
- "htmlparser2": "8.0.0: errors with export namespace",
- "uuid": "Obsolete: can be replaced with crypto.randomUUID in Electron 14+"
- },
"dependencies": {
- "@reduxjs/toolkit": "2.2.1",
- "@xmldom/xmldom": "0.8.10",
- "antd": "4.24.15",
- "axios": "1.6.7",
- "bluebird": "3.7.2",
- "cheerio": "1.0.0-rc.10",
- "electron-log": "4.4.8",
- "electron-settings": "4.0.2",
- "electron-updater": "6.1.8",
- "highlight.js": "11.9.0",
- "htmlparser2": "7.2.0",
- "i18next": "23.10.0",
- "i18next-chained-backend": "4.6.2",
- "i18next-fs-backend": "2.3.1",
- "i18next-http-backend": "2.5.0",
- "i18next-localstorage-backend": "4.2.0",
- "lodash": "4.17.21",
- "moment": "2.30.1",
- "react": "18.2.0",
- "react-dom": "18.2.0",
- "react-i18next": "14.0.5",
- "react-icons": "5.0.1",
- "react-redux": "9.1.0",
- "react-router-dom": "6.22.1",
- "semver": "7.6.0",
- "uuid": "9.0.1",
- "web2driver": "3.0.4",
+ "@ant-design/icons": "6.2.5",
+ "@reduxjs/toolkit": "2.12.0",
+ "@tabler/icons-react": "3.44.0",
+ "@wdio/protocols": "9.29.0",
+ "@xmldom/xmldom": "0.9.10",
+ "antd": "6.4.4",
+ "cheerio": "1.2.0",
+ "css.escape": "1.5.1",
+ "dayjs": "1.11.21",
+ "electron-debug": "4.1.0",
+ "electron-settings": "4.0.4",
+ "electron-updater": "6.8.9",
+ "i18next": "26.3.1",
+ "i18next-fs-backend": "2.6.6",
+ "i18next-http-backend": "4.0.0",
+ "ky": "1.14.3",
+ "lodash": "4.18.1",
+ "react": "19.2.7",
+ "react-dom": "19.2.7",
+ "react-i18next": "17.0.8",
+ "react-redux": "9.3.0",
+ "react-refractor": "4.0.0",
+ "react-router": "7.18.0",
+ "sanitize-filename": "1.6.4",
+ "webdriver": "9.29.0",
"xpath": "0.0.34"
},
- "//devDependencies": {
- "chai-as-promised": "Abandoned",
- "cross-env": "Maintenance mode",
- "devtron": "Abandoned",
- "electron": "V14: breaks electron-settings",
- "mocha-multi-reporters": "Appears to be abandoned",
- "node-libs-browser": "Deprecated",
- "parcel-bundler": "V2: significant rewrite required",
- "postcss-modules": "V4: requires updating to Parcel v2",
- "redux-logger": "Appears to be abandoned",
- "spectron": "Deprecated. Newer V16 also requires Electron 14"
- },
"devDependencies": {
- "@appium/docutils": "1.0.4",
- "@appium/eslint-config-appium": "8.0.5",
- "@appium/fake-driver": "5.5.1",
- "@appium/support": "4.2.2",
- "@babel/core": "7.23.9",
- "@babel/eslint-parser": "7.23.10",
- "@babel/eslint-plugin": "7.23.5",
- "@babel/plugin-proposal-class-properties": "7.18.6",
- "@babel/plugin-transform-runtime": "7.23.9",
- "@babel/preset-env": "7.23.9",
- "@babel/preset-react": "7.23.3",
- "@babel/register": "7.23.7",
- "asyncbox": "3.0.0",
- "chai": "4.4.1",
- "chai-as-promised": "7.1.1",
- "check-engines": "1.6.0",
- "concurrently": "8.2.2",
- "cross-env": "7.0.3",
- "devtron": "1.4.0",
- "electron": "13.6.9",
- "electron-builder": "24.12.0",
- "electron-debug": "3.2.0",
- "electron-extension-installer": "1.2.0",
- "eslint": "8.57.0",
- "eslint-plugin-import": "2.29.1",
- "eslint-plugin-mocha": "10.3.0",
- "eslint-plugin-promise": "6.1.1",
- "eslint-plugin-react": "7.33.2",
- "eslint-plugin-react-native": "4.1.0",
- "less": "4.2.0",
- "mocha": "10.3.0",
- "mocha-junit-reporter": "2.2.1",
- "mocha-multi-reporters": "1.5.1",
- "node-libs-browser": "2.2.1",
- "parcel-bundler": "1.12.5",
- "parcel-plugin-asset-copier": "1.1.1",
- "postcss-modules": "3.2.2",
- "prettier": "3.2.5",
- "redux-logger": "3.0.6",
- "rimraf": "5.0.5",
- "sinon": "17.0.1",
- "spectron": "15.0.0"
- },
- "devEngines": {
- "node": ">=18.x",
- "npm": ">=8.x"
+ "@appium/docutils": "2.5.1",
+ "@appium/eslint-config-appium-ts": "3.2.3",
+ "@appium/fake-driver": "6.2.1",
+ "@appium/support": "7.2.5",
+ "@eslint-react/eslint-plugin": "5.9.1",
+ "@tomjs/electron-devtools-installer": "4.0.1",
+ "@types/lodash": "4.17.24",
+ "@types/react": "19.2.17",
+ "@types/react-dom": "19.2.3",
+ "@vitejs/plugin-react": "5.2.0",
+ "asyncbox": "6.3.0",
+ "babel-plugin-react-compiler": "1.0.0",
+ "electron": "41.8.0",
+ "electron-builder": "26.15.3",
+ "electron-vite": "5.0.0",
+ "eslint": "10.5.0",
+ "eslint-plugin-react-hooks": "7.1.1",
+ "eslint-plugin-simple-import-sort": "13.0.0",
+ "globals": "17.6.0",
+ "prettier": "3.8.4",
+ "rimraf": "6.1.3",
+ "vite": "7.3.5",
+ "vite-plugin-electron-renderer": "0.14.7",
+ "vitest": "4.1.9"
},
"engines": {
- "node": ">=18.x",
- "npm": ">=8.x"
+ "node": "^20.19.0 || ^22.12.0 || >=24.0.0",
+ "npm": ">=10.x"
}
}
diff --git a/plugins/README.md b/plugins/README.md
new file mode 100644
index 0000000000..c5de339e3e
--- /dev/null
+++ b/plugins/README.md
@@ -0,0 +1,25 @@
+# Appium Inspector Plugin
+
+[](https://npmjs.org/package/appium-inspector-plugin)
+[](https://npmjs.org/package/appium-inspector-plugin)
+
+A plugin that integrates the [Appium Inspector](https://github.com/appium/appium-inspector) directly
+into your Appium server installation, providing a web-based interface for inspecting and interacting
+with your application under test.
+
+## Features
+
+- Web-based Appium Inspector interface, accessible via the Appium server's `/inspector` endpoint
+- Full feature parity with standalone Appium Inspector
+
+## Installation
+
+Refer to the [Plugin Installation documentation](https://appium.github.io/appium-inspector/latest/quickstart/installation/#appium-plugin).
+
+## Development
+
+Refer to the [Contributing documentation](https://appium.github.io/appium-inspector/latest/contributing/).
+
+## License
+
+[Apache-2.0](https://github.com/appium/appium-inspector/blob/main/LICENSE)
diff --git a/plugins/index.mjs b/plugins/index.mjs
new file mode 100644
index 0000000000..6492131803
--- /dev/null
+++ b/plugins/index.mjs
@@ -0,0 +1,44 @@
+import path from 'node:path';
+import {fileURLToPath} from 'node:url';
+
+import {BasePlugin} from '@appium/base-plugin';
+const PLUGIN_ROOT_PATH = '/inspector';
+const INDEX_HTML = 'index.html';
+const ROOT_DIR = path.resolve(path.dirname(fileURLToPath(import.meta.url)), 'dist-browser');
+
+/**
+ * Appium Inspector Plugin class
+ * @extends {BasePlugin}
+ */
+export class AppiumInspectorPlugin extends BasePlugin {
+ /**
+ * Creates an instance of AppiumInspectorPlugin
+ * @param {string} name - The name of the plugin
+ * @param {Record} cliArgs - Command line arguments
+ */
+ constructor(name, cliArgs) {
+ super(name, cliArgs);
+ }
+
+ /**
+ * Handles inspector page requests
+ * @param {import('express').Request} req - Express request object
+ * @param {import('express').Response} res - Express response object
+ * @returns {Promise}
+ */
+ static async openInspector(req, res) {
+ const reqPath =
+ req.path === PLUGIN_ROOT_PATH ? INDEX_HTML : req.path.substring(PLUGIN_ROOT_PATH.length);
+ res.sendFile(reqPath, {root: ROOT_DIR});
+ }
+
+ /**
+ * Updates the Express server configuration
+ * @param {import('express').Application} expressApp - Express application instance
+ * @returns {Promise}
+ */
+ static async updateServer(expressApp) {
+ // Handle both /inspector and /inspector/* paths
+ expressApp.all(['/inspector', '/inspector/*all'], AppiumInspectorPlugin.openInspector);
+ }
+}
diff --git a/plugins/package.json b/plugins/package.json
new file mode 100644
index 0000000000..4733eb519e
--- /dev/null
+++ b/plugins/package.json
@@ -0,0 +1,50 @@
+{
+ "name": "appium-inspector-plugin",
+ "version": "2026.5.1",
+ "description": "An app inspector for use with an Appium server",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/appium/appium-inspector.git"
+ },
+ "author": {
+ "name": "Appium Developers",
+ "url": "https://github.com/appium"
+ },
+ "license": "Apache-2.0",
+ "bugs": {
+ "url": "https://github.com/appium/appium-inspector/issues"
+ },
+ "keywords": [
+ "appium"
+ ],
+ "homepage": "https://github.com/appium/appium-inspector",
+ "main": "index.mjs",
+ "type": "module",
+ "exports": {
+ ".": {
+ "import": "./index.mjs"
+ },
+ "./package.json": "./package.json"
+ },
+ "peerDependencies": {
+ "appium": "^3.0.0-beta.0"
+ },
+ "files": [
+ "index.mjs",
+ "package.json",
+ "dist-browser",
+ "README.md"
+ ],
+ "dependencies": {
+ "@appium/base-plugin": "3.3.2"
+ },
+ "devDependencies": {},
+ "engines": {
+ "node": "^20.19.0 || ^22.12.0 || >=24.0.0",
+ "npm": ">=10.x"
+ },
+ "appium": {
+ "pluginName": "inspector",
+ "mainClass": "AppiumInspectorPlugin"
+ }
+}
diff --git a/renovate.json b/renovate.json
index 9781e2ae8c..eb96a280f2 100644
--- a/renovate.json
+++ b/renovate.json
@@ -1,22 +1,27 @@
{
- "extends": ["config:base", ":semanticCommitTypeAll(chore)", ":pinAllExceptPeerDependencies"],
+ "$schema": "https://docs.renovatebot.com/renovate-schema.json",
+ "extends": ["github>appium/appium//renovate/default"],
"labels": ["dependencies"],
"packageRules": [
{
"matchUpdateTypes": ["minor", "patch", "pin", "digest"],
- "matchDepTypes": ["dependencies", "devDependencies"],
+ "matchCurrentVersion": "!/^0/",
"automerge": true
},
{
- "matchPackageNames": [],
- "matchUpdateTypes": ["major"],
- "enabled": false
+ "matchPackageNames": ["antd", "@ant-design/icons"],
+ "groupName": "antd-related packages"
+ },
+ {
+ "matchPackageNames": ["appium", "@appium/**", "!@appium/base-plugin"],
+ "groupName": "Appium-related packages"
+ },
+ {
+ "matchPackageNames": ["@appium/base-plugin"],
+ "skipArtifactsUpdate": true
}
],
- "baseBranches": ["main"],
- "ignorePaths": ["assets", "build", "release", "sample-session-files"],
"semanticCommits": "enabled",
- "schedule": ["after 10pm and before 5:00am"],
- "timezone": "America/Vancouver",
- "transitiveRemediation": true
+ "schedule": ["after 10pm", "before 5:00am"],
+ "timezone": "America/Vancouver"
}
diff --git a/sample-session-files/corrupted.appiumsession b/sample-session-files/corrupted.appiumsession
deleted file mode 100644
index 96bdf3062e..0000000000
--- a/sample-session-files/corrupted.appiumsession
+++ /dev/null
@@ -1,7 +0,0 @@
-This is not valid JSON!
-{
-
- asdfasdfafsd
-}
-{
- 1121212121
diff --git a/sample-session-files/fake.appiumsession b/sample-session-files/fake.appiumsession
deleted file mode 100644
index 2e74f12f72..0000000000
--- a/sample-session-files/fake.appiumsession
+++ /dev/null
@@ -1,57 +0,0 @@
-{
- "version": "1.0",
- "caps": [
- {
- "type": "text",
- "name": "appium:deviceName",
- "value": "fake"
- },
- {
- "type": "text",
- "name": "appium:platformVersion",
- "value": "1.2"
- },
- {
- "type": "text",
- "name": "appium:automationName",
- "value": "fake"
- },
- {
- "type": "text",
- "name": "appium:app",
- "value": "/appium-inspector/test/sample-session-files/fake-app.xml"
- },
- {
- "type": "text",
- "name": "platformName",
- "value": "fake"
- },
- {
- "type": "text",
- "name": "fakeCapability",
- "value": "Fake 1:21"
- }
- ],
- "server": {
- "local": {},
- "remote": {},
- "sauce": {
- "dataCenter": "us-west-1"
- },
- "headspin": {},
- "browserstack": {},
- "lambdatest": {},
- "advanced": {},
- "bitbar": {},
- "kobiton": {},
- "perfecto": {},
- "pcloudy": {},
- "testingbot": {},
- "experitest": {},
- "roboticmobi": {}
- },
- "serverType": "remote",
- "visibleProviders": [
- "remote"
- ]
-}
diff --git a/sample-session-files/sample.appiumsession b/sample-session-files/sample.appiumsession
deleted file mode 100644
index daa7d3aa58..0000000000
--- a/sample-session-files/sample.appiumsession
+++ /dev/null
@@ -1,52 +0,0 @@
-{
- "version": "1.0",
- "caps": [
- {
- "type": "text",
- "name": "fake-capability",
- "value": "Fake capability to prove that loading extension worked"
- },
- {
- "type": "text",
- "name": "appium:app",
- "value": "storage:filename=SauceLabs-Demo-App.ipa"
- },
- {
- "type": "text",
- "name": "platformName",
- "value": "iOS"
- },
- {
- "type": "text",
- "name": "appium:deviceName",
- "value": "iPhone.*"
- },
- {
- "type": "text",
- "name": "appium:platformVersion",
- "value": "15.2"
- }
- ],
- "server": {
- "local": {},
- "remote": {},
- "sauce": {
- "dataCenter": "us-west-1"
- },
- "headspin": {},
- "browserstack": {},
- "lambdatest": {},
- "advanced": {},
- "bitbar": {},
- "kobiton": {},
- "perfecto": {},
- "pcloudy": {},
- "testingbot": {},
- "experitest": {},
- "roboticmobi": {}
- },
- "serverType": "sauce",
- "visibleProviders": [
- "sauce"
- ]
-}
diff --git a/ci-jobs/crowdin-common.mjs b/scripts/crowdin-common.mjs
similarity index 64%
rename from ci-jobs/crowdin-common.mjs
rename to scripts/crowdin-common.mjs
index 1d4683ab7a..bbe5c434a4 100644
--- a/ci-jobs/crowdin-common.mjs
+++ b/scripts/crowdin-common.mjs
@@ -1,7 +1,8 @@
+import path from 'node:path';
+
import {logger} from '@appium/support';
-import axios from 'axios';
+import ky from 'ky';
import _ from 'lodash';
-import path from 'node:path';
export const log = logger.getLogger('CROWDIN');
@@ -11,7 +12,7 @@ const API_TOKEN = process.env.CROWDIN_TOKEN;
if (!PROJECT_ID || !API_TOKEN) {
throw new Error(`Both CROWDIN_PROJECT_ID and CROWDIN_TOKEN environment variables must be set`);
}
-export const RESOURCES_ROOT = path.resolve('assets', 'locales');
+export const RESOURCES_ROOT = path.resolve('app', 'common', 'public', 'locales');
export const ORIGINAL_LANGUAGE = 'en';
const USER_AGENT = 'Appium Inspector CI';
const API_ROOT = 'https://api.crowdin.com/api/v2';
@@ -22,20 +23,19 @@ export async function performApiRequest(suffix = '', opts = {}) {
? `${API_ROOT}/projects/${PROJECT_ID}${suffix}`
: `${API_ROOT}${suffix}`;
log.debug(`Sending ${method} request to ${url}`);
+ let formattedPayload = payload;
if (_.isPlainObject(payload)) {
- log.debug(`Request payload: ${JSON.stringify(payload)}`);
+ formattedPayload = JSON.stringify(payload);
+ log.debug(`Request payload: ${formattedPayload}`);
}
- return (
- await axios({
- method,
- headers: {
- Authorization: `Bearer ${API_TOKEN}`,
- 'Content-Type': 'application/json',
- 'User-Agent': USER_AGENT,
- ...(headers || {}),
- },
- url,
- data: payload,
- })
- ).data;
+ return await ky(url, {
+ method,
+ headers: {
+ Authorization: `Bearer ${API_TOKEN}`,
+ 'Content-Type': 'application/json',
+ 'User-Agent': USER_AGENT,
+ ...(headers || {}),
+ },
+ body: formattedPayload,
+ }).json();
}
diff --git a/ci-jobs/crowdin-sync-translations.mjs b/scripts/crowdin-sync-translations.mjs
similarity index 96%
rename from ci-jobs/crowdin-sync-translations.mjs
rename to scripts/crowdin-sync-translations.mjs
index 4d86a90c87..464c1ddd12 100644
--- a/ci-jobs/crowdin-sync-translations.mjs
+++ b/scripts/crowdin-sync-translations.mjs
@@ -1,8 +1,9 @@
+import path from 'node:path';
+
import {fs, net, tempDir, zip} from '@appium/support';
import {waitForCondition} from 'asyncbox';
-import path from 'node:path';
-import {ORIGINAL_LANGUAGE, RESOURCES_ROOT, log, performApiRequest} from './crowdin-common.mjs';
+import {log, ORIGINAL_LANGUAGE, performApiRequest, RESOURCES_ROOT} from './crowdin-common.mjs';
const BUILD_TIMEOUT_MS = 1000 * 60 * 10;
const BUILD_STATUS = {
diff --git a/ci-jobs/crowdin-update-resources.mjs b/scripts/crowdin-update-resources.mjs
similarity index 82%
rename from ci-jobs/crowdin-update-resources.mjs
rename to scripts/crowdin-update-resources.mjs
index 6efce7faea..957dfc1b41 100644
--- a/ci-jobs/crowdin-update-resources.mjs
+++ b/scripts/crowdin-update-resources.mjs
@@ -1,8 +1,7 @@
-import B from 'bluebird';
import {createReadStream} from 'node:fs';
import path from 'node:path';
-import {ORIGINAL_LANGUAGE, RESOURCES_ROOT, log, performApiRequest} from './crowdin-common.mjs';
+import {log, ORIGINAL_LANGUAGE, performApiRequest, RESOURCES_ROOT} from './crowdin-common.mjs';
const RESOURCE_NAME = 'translation.json';
const RESOURCE_PATH = path.resolve(RESOURCES_ROOT, ORIGINAL_LANGUAGE, RESOURCE_NAME);
@@ -17,7 +16,7 @@ async function uploadToStorage() {
payload: createReadStream(RESOURCE_PATH),
isProjectSpecific: false,
});
- log.info(`'${RESOURCE_NAME}' has been succesfully uploaded to Crowdin`);
+ log.info(`'${RESOURCE_NAME}' has been successfully uploaded to Crowdin`);
return storageData.id;
}
@@ -42,7 +41,7 @@ async function updateFile(fileId, storageId) {
}
async function main() {
- const [storageId, fileId] = await B.all([uploadToStorage(), getFileId()]);
+ const [storageId, fileId] = await Promise.all([uploadToStorage(), getFileId()]);
await updateFile(fileId, storageId);
log.info('All done');
}
diff --git a/scripts/sync-plugin.mjs b/scripts/sync-plugin.mjs
new file mode 100644
index 0000000000..9417570e81
--- /dev/null
+++ b/scripts/sync-plugin.mjs
@@ -0,0 +1,48 @@
+import fs from 'node:fs/promises';
+import path from 'node:path';
+import {fileURLToPath} from 'node:url';
+
+const PROJECT_ROOT = path.dirname(fileURLToPath(import.meta.url));
+const ROOT_PKG_JSON_PATH = path.resolve(PROJECT_ROOT, '..', 'package.json');
+const PLUGIN_PKG_JSON_PATH = path.resolve(PROJECT_ROOT, '..', 'plugins', 'package.json');
+
+const SYNC_PACKAGE_KEYS = [
+ // To update ever version release
+ 'version',
+
+ // These basic information should be the same with the top package.json
+ 'engines',
+ 'license',
+ 'repository',
+ 'author',
+ 'bugs',
+ 'homepage',
+];
+
+/**
+ * Return JSON parsed contents from the given path.
+ * @param {string} path
+ * @returns {object}
+ */
+async function readJsonContent(jsonPath) {
+ return JSON.parse(await fs.readFile(jsonPath, 'utf8'));
+}
+
+async function main() {
+ const [rootJsonContent, pluginJsonContent] = await Promise.all(
+ [ROOT_PKG_JSON_PATH, PLUGIN_PKG_JSON_PATH].map(readJsonContent),
+ );
+
+ for (const key of SYNC_PACKAGE_KEYS) {
+ pluginJsonContent[key] = rootJsonContent[key];
+ }
+
+ // The new line in the last is to avoid prettier error.
+ await fs.writeFile(
+ PLUGIN_PKG_JSON_PATH,
+ `${JSON.stringify(pluginJsonContent, null, 2)}\n`,
+ 'utf8',
+ );
+}
+
+(async () => await main())();
diff --git a/test/e2e/inspector-e2e.test.js b/test/e2e/inspector-e2e.test.js
index d82c1c2888..5e05fcac2e 100644
--- a/test/e2e/inspector-e2e.test.js
+++ b/test/e2e/inspector-e2e.test.js
@@ -1,23 +1,17 @@
+import path from 'node:path';
+
import {startServer as startAppiumFakeDriverServer} from '@appium/fake-driver';
import {retryInterval} from 'asyncbox';
-import chai from 'chai';
-import chaiAsPromised from 'chai-as-promised';
-import path from 'path';
-
-import InspectorPage from './pages/inspector-page-object';
+import {expect} from 'vitest';
-chai.should();
-chai.use(chaiAsPromised);
+import InspectorPage from './pages/inspector-page-object.js';
const FAKE_DRIVER_PORT = 12121;
-const FAKE_DRIVER_PATH = path.dirname(require.resolve('@appium/fake-driver/package.json'));
-const TEST_APP = path.resolve(FAKE_DRIVER_PATH, 'test', 'fixtures', 'app.xml');
-
const DEFAULT_CAPS = {
platformName: 'Fake',
'appium:deviceName': 'Fake',
- 'appium:app': TEST_APP,
+ 'appium:app': path.resolve(__dirname, '..', 'fixtures', 'fake-app.xml'),
};
let client;
@@ -56,43 +50,43 @@ describe('inspector window', function () {
});
it('shows content in "Selected Element" pane when clicking on an item in the Source inspector', async function () {
- await (await client.$(inspector.selectedElementBody))
- .getHTML()
- .should.eventually.contain('Select an element');
+ expect(await (await client.$(inspector.selectedElementBody)).getHTML()).toContain(
+ 'Select an element',
+ );
await (await client.$(inspector.sourceTreeNode)).waitForExist({timeout: 3000});
await (await client.$(inspector.sourceTreeNode)).click();
await (await client.$(inspector.tapSelectedElementButton)).waitForExist({timeout: 3000});
await (await client.$(inspector.tapSelectedElementButton)).waitForEnabled({timeout: 4000});
- await (await client.$(inspector.selectedElementBody))
- .getHTML()
- .should.eventually.contain('btnTapElement');
+ expect(await (await client.$(inspector.selectedElementBody)).getHTML()).toContain(
+ 'btnTapElement',
+ );
await (await client.$(inspector.tapSelectedElementButton)).click();
});
it('shows a loading indicator in screenshot after clicking "Refresh" and then indicator goes away when refresh is complete', async function () {
await inspector.reload();
const spinDots = await client.$$(inspector.screenshotLoadingIndicator);
- spinDots.length.should.equal(1);
+ expect(spinDots).toHaveLength(1);
await retryInterval(15, 1000, async function () {
const spinDots = await client.$$(inspector.screenshotLoadingIndicator);
- spinDots.length.should.equal(0);
+ expect(spinDots).toHaveLength(0);
});
});
it('shows a new pane when click "Start Recording" button and then the pane disappears when clicking "Pause"', async function () {
// Check that there's no recorded actions pane
let recordedPanes = await client.$$(inspector.recordedActionsPane);
- recordedPanes.length.should.equal(0);
+ expect(recordedPanes).toHaveLength(0);
// Start a recording and check that there is a recorded actions pane
await inspector.startRecording();
await (await client.$(inspector.recordedActionsPane)).waitForExist({timeout: 2000});
recordedPanes = await client.$$(inspector.recordedActionsPane);
- recordedPanes.length.should.equal(1);
+ expect(recordedPanes).toHaveLength(1);
// Pause the recording and check that the recorded actions pane is gone again
await inspector.pauseRecording();
recordedPanes = await client.$$(inspector.recordedActionsPane);
- recordedPanes.length.should.equal(0);
+ expect(recordedPanes).toHaveLength(0);
});
});
diff --git a/test/e2e/pages/inspector-page-object.js b/test/e2e/pages/inspector-page-object.js
index aecb300aa8..b0734edf9d 100644
--- a/test/e2e/pages/inspector-page-object.js
+++ b/test/e2e/pages/inspector-page-object.js
@@ -1,8 +1,8 @@
import {retryInterval} from 'asyncbox';
import _ from 'lodash';
-import BasePage from './base-page-object';
-import {setValueReact} from './utils';
+import BasePage from './base-page-object.js';
+import {setValueReact} from './utils.js';
export default class InspectorPage extends BasePage {
constructor(client) {
@@ -60,7 +60,7 @@ export default class InspectorPage extends BasePage {
await retryInterval(5, 500, async () => {
await (await this.client.$('.ant-notification-notice-close')).click();
});
- } catch (ign) {}
+ } catch {}
}
async startRecording() {
diff --git a/test/e2e/pre-e2e.test.js b/test/e2e/pre-e2e.test.js
index 90c7e03c76..92201df3ba 100644
--- a/test/e2e/pre-e2e.test.js
+++ b/test/e2e/pre-e2e.test.js
@@ -1,91 +1,89 @@
+import os from 'node:os';
+import {join} from 'node:path';
+
import {fs, logger} from '@appium/support';
import {retryInterval} from 'asyncbox';
-import chai from 'chai';
-import chaiAsPromised from 'chai-as-promised';
-import os from 'os';
-import path from 'path';
-import {Application} from 'spectron';
+import {expect} from 'vitest';
const platform = os.platform();
const appName = 'inspector';
const log = logger.getLogger('E2E Test');
-chai.should();
-chai.use(chaiAsPromised);
-
-before(async function () {
- let appPath;
- let args = [];
- if (process.env.SPECTRON_TEST_PROD_BINARIES) {
- if (platform === 'linux') {
- appPath = path.join(
- __dirname,
- '..',
- '..',
- appName,
- 'release',
- 'linux-unpacked',
- 'appium-desktop',
- );
- } else if (platform === 'darwin') {
- appPath = path.join(
- __dirname,
- '..',
- '..',
- appName,
- 'release',
- 'mac',
- 'Appium.app',
- 'Contents',
- 'MacOS',
- 'Appium',
- );
- } else if (platform === 'win32') {
- appPath = path.join(
- __dirname,
- '..',
- '..',
- appName,
- 'release',
- 'win-ia32-unpacked',
- 'Appium.exe',
- );
+describe('E2E tests', function () {
+ before(async function () {
+ let appPath;
+ // let args = [];
+ if (process.env.SPECTRON_TEST_PROD_BINARIES) {
+ if (platform === 'linux') {
+ appPath = join(
+ __dirname,
+ '..',
+ '..',
+ appName,
+ 'release',
+ 'linux-unpacked',
+ 'appium-desktop',
+ );
+ } else if (platform === 'darwin') {
+ appPath = join(
+ __dirname,
+ '..',
+ '..',
+ appName,
+ 'release',
+ 'mac',
+ 'Appium.app',
+ 'Contents',
+ 'MacOS',
+ 'Appium',
+ );
+ } else if (platform === 'win32') {
+ appPath = join(
+ __dirname,
+ '..',
+ '..',
+ appName,
+ 'release',
+ 'win-ia32-unpacked',
+ 'Appium.exe',
+ );
+ }
+ } else {
+ appPath = require(join(__dirname, '..', '..', 'node_modules', 'electron'));
+ // args = [join(__dirname, '..', '..')];
}
- } else {
- appPath = require(path.join(__dirname, '..', '..', 'node_modules', 'electron'));
- args = [path.join(__dirname, '..', '..')];
- }
- this.timeout(process.env.E2E_TIMEOUT || 60 * 1000);
- log.info(`Running Appium from: ${appPath}`);
- log.info(`Checking that "${appPath}" exists`);
- const applicationExists = await fs.exists(appPath);
- if (!applicationExists) {
- log.error(`Could not run tests. "${appPath}" does not exist.`);
- process.exit(1);
- }
- log.info(`App exists. Creating Spectron Application instance`);
- this.app = new Application({
- path: appPath,
- env: {
- FORCE_NO_WRONG_FOLDER: true,
- },
- args,
- });
- log.info(`Spectron Application instance created. Starting app`);
- await this.app.start();
- const client = this.app.client;
- log.info(`App started; waiting for splash page to go away`);
- await retryInterval(20, 1000, async function () {
- const handles = await client.getWindowHandles();
- await client.switchToWindow(handles[0]);
- (await client.getUrl()).should.include('index.html');
+ this.timeout(process.env.E2E_TIMEOUT || 60 * 1000);
+ log.info(`Running Appium from: ${appPath}`);
+ log.info(`Checking that "${appPath}" exists`);
+ const applicationExists = await fs.exists(appPath);
+ if (!applicationExists) {
+ log.error(`Could not run tests. "${appPath}" does not exist.`);
+ process.exit(1);
+ }
+ log.info(`App exists. Creating application instance`);
+ // this.app = new Application({
+ // path: appPath,
+ // env: {
+ // FORCE_NO_WRONG_FOLDER: true,
+ // },
+ // args,
+ // });
+ log.info(`Application instance created. Starting app`);
+ await this.app.start();
+ const client = this.app.client;
+ log.info(`App started; waiting for splash page to go away`);
+ await retryInterval(20, 1000, async function () {
+ const handles = await client.getWindowHandles();
+ await client.switchToWindow(handles[0]);
+ expect(await client.getUrl()).toContain('index.html');
+ });
+ log.info(`App ready for automation`);
});
- log.info(`App ready for automation`);
-});
-after(function () {
- if (this.app && this.app.isRunning()) {
- return this.app.stop();
- }
+ after(function () {
+ if (this.app && this.app.isRunning()) {
+ return this.app.stop();
+ }
+ });
});
diff --git a/sample-session-files/fake-app.xml b/test/fixtures/fake-app.xml
similarity index 97%
rename from sample-session-files/fake-app.xml
rename to test/fixtures/fake-app.xml
index 98023d4c32..285926dd95 100644
--- a/sample-session-files/fake-app.xml
+++ b/test/fixtures/fake-app.xml
@@ -10,7 +10,7 @@
Hello
-