diff --git a/.github/workflows/build_test.yml b/.github/workflows/build_test.yml index 7f1ddc6d..bc8e4409 100644 --- a/.github/workflows/build_test.yml +++ b/.github/workflows/build_test.yml @@ -13,6 +13,11 @@ on: BRANCH_NAME: description: 'Specify branch name or PR (e.g. PR-41)' required: false + PERFORM_RELEASE: + description: '[Release] perform release' + required: false + default: 'false' + type: boolean jobs: @@ -39,6 +44,7 @@ jobs: uses: zowe-actions/zlux-builds/zen/publish@v2.x/main with: os: ubuntu + perform-release: ${{ github.event.inputs.PERFORM_RELEASE }} build-window: @@ -64,6 +70,7 @@ jobs: uses: zowe-actions/zlux-builds/zen/publish@v2.x/main with: os: windows + perform-release: ${{ github.event.inputs.PERFORM_RELEASE }} build-macos: runs-on: macos-latest @@ -78,15 +85,53 @@ jobs: node-version: 18 - name: '[Prep 3] Checkout' uses: actions/checkout@v3 - - name: '[prep 4] Install' + - name: '[Prep 4] Install Python 3.12 for npm appdmg' + uses: actions/setup-python@v5 + with: + python-version: '3.12' + - name: '[prep 5] Install' run: | python3 -m pip install setuptools npm install - - name: '[prep 5] Package' + - name: '[prep 6] Package' run: | npm run make - - name: '[prep 6] Publish' + - name: '[prep 7] Publish' uses: zowe-actions/zlux-builds/zen/publish@v2.x/main with: os: macos + perform-release: ${{ github.event.inputs.PERFORM_RELEASE }} + + post-build: + runs-on: ubuntu-latest + needs: + - build-ubuntu + - build-window + - build-macos + if: ${{ success() && github.event.inputs.PERFORM_RELEASE == 'true' }} + steps: + - name: 'Checkout' + uses: actions/checkout@v3 + + - name: 'Set tag value' + run: | + COMMIT_HASH=$(git rev-parse --verify HEAD) + CURRENT_TIME=$(date +%s%3N) + if [ -z ${{ github.event.pull_request.number }} ] + then + CURRENT_BRANCH=${GITHUB_REF#refs/heads/} + else + CURRENT_BRANCH=PR-${{ github.event.pull_request.number }} + fi + P_VERSION=$(cat package.json | grep -o '"version": *"[^"]*"' | sed 's/"version": "\(.*\)"/\1/') + + - name: '[Release 1] Release (if necessary)' + if: ${{ success() && github.event.inputs.PERFORM_RELEASE == 'true' }} + uses: zowe-actions/shared-actions/release@main + + - name: '[Release 2] Bump Zen Version (if necessary)' + if: ${{ success() && github.event.inputs.PERFORM_RELEASE == 'true' }} + uses: zowe-actions/zlux-builds/zen/bump-version@v2.x/main + env: + GITHUB_TOKEN: ${{ secrets.ZOWE_ROBOT_TOKEN }} \ No newline at end of file diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml deleted file mode 100644 index ee6a9a17..00000000 --- a/.github/workflows/release.yml +++ /dev/null @@ -1,51 +0,0 @@ -name: Release zen draft -on: - workflow_run: - workflows: ["Build zen"] - branches: [v2.x/main] - types: - - completed - workflow_dispatch: - inputs: - BUMP_TYPE: - description: 'When version bumping, set patch, minor, or major. Need this xor RELEASE_TAG.' - required: false - RELEASE_TAG: - description: 'Disable bumping by specifying a semver pattern (without v). Need this xor BUMP_TYPE' - required: false - RUN_ID: - description: 'Specify run id of asset to associate with release.' - required: true - -permissions: - contents: write - -jobs: - build: - runs-on: ubuntu-latest - steps: - - name: '[Setup] default env' - if: ${{ inputs.BUMP_TYPE == '' && inputs.RELEASE_TAG == '' }} - run: | - echo "BUMP_TYPE=minor" >> $GITHUB_ENV - - name: '[Setup] input env' - if: ${{ inputs.BUMP_TYPE }} - run: | - echo "BUMP_TYPE=${{ inputs.BUMP_TYPE }}" >> $GITHUB_ENV - - name: Checkout - uses: actions/checkout@v3 - - name: '[Create tag]' - id: tag_version - uses: mathieudutour/github-tag-action@v6.1 - with: - github_token: ${{ github.token }} - default_bump: ${{ env.BUMP_TYPE }} - custom_tag: ${{ inputs.RELEASE_NUMBER }} - - name: '[Create release]' - uses: softprops/action-gh-release@v1 - with: - tag_name: ${{ steps.tag_version.outputs.new_tag }} - name: Release ${{ steps.tag_version.outputs.new_tag }} - draft: true - prerelease: false - token: ${{ github.token }} diff --git a/Developer.md b/Developer.md index ee0b8817..4b1676c1 100644 --- a/Developer.md +++ b/Developer.md @@ -1,4 +1,4 @@ -# ZEN - Zowe Enterprise Necessity +# ZEN - Zowe Server Install Wizard ### Introduction diff --git a/README.md b/README.md index c4345f66..e3b5cdc8 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ -# ZEN - Zowe Enterprise Necessity +# ZEN - Zowe Server Install Wizard -Zowe Enterprise Necessity is an Electron-based tool that provides a simpler UI to install and configure Zowe +Zowe Server Install Wizard is an Electron-based tool that provides a simpler UI to install and configure Zowe The application is in the development stage and has limited functionality so far. It is able to connect to the mainframe using the [zos-node-accessor](https://github.com/IBM/zos-node-accessor) module, perform some basic environment validations, download the Zowe convenience build, and run `zwe install` command by submitting JES jobs. [Here](https://github.com/zowe/zen/issues/1) is a brief description with screenshots. @@ -10,7 +10,7 @@ Node version 18.12 or higher is required. ### Developing -Note: `npm run start` may succeed without errors, but `npm run make` will not. It is always advised to run `npm run make` after writing new code, or using the build automation to view errors +Note: `npm run start` may succeed without errors, but `npm run make` may not. It is always advised to run `npm run make` after writing new code, or using the build automation to view errors Run `npm install` to install dependencies diff --git a/package-lock.json b/package-lock.json index 7a84d3e2..5c50ff45 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { - "name": "zowe-enterprise-necessity", - "version": "1.0.0", + "name": "zowe-install-wizard", + "version": "1.0.1", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "zowe-enterprise-necessity", - "version": "1.0.0", + "name": "zowe-install-wizard", + "version": "1.0.1", "license": "EPL 2.0", "dependencies": { "@emotion/react": "^11.10.6", @@ -22,10 +22,10 @@ "@types/flat": "^5.0.2", "ajv": "^8.12.0", "ajv-formats": "^2.1.1", + "electron-log": "^5.1.5", "electron-squirrel-startup": "^1.0.0", "electron-store": "^8.1.0", "flat": "^5.0.2", - "jimp": "^0.22.10", "js-yaml": "^4.1.0", "react": "^18.2.0", "react-dom": "^18.2.0", @@ -35,13 +35,13 @@ "zos-node-accessor": "^1.0.16" }, "devDependencies": { - "@electron-forge/cli": "^6.0.5", - "@electron-forge/maker-deb": "^6.0.5", - "@electron-forge/maker-dmg": "^6.0.5", - "@electron-forge/maker-rpm": "^6.0.5", - "@electron-forge/maker-squirrel": "^6.0.5", - "@electron-forge/maker-zip": "^6.0.5", - "@electron-forge/plugin-webpack": "^6.0.5", + "@electron-forge/cli": "^6.4.0", + "@electron-forge/maker-deb": "^6.4.0", + "@electron-forge/maker-dmg": "^6.4.0", + "@electron-forge/maker-rpm": "^6.4.0", + "@electron-forge/maker-squirrel": "^6.4.0", + "@electron-forge/maker-zip": "^6.4.0", + "@electron-forge/plugin-webpack": "^6.4.0", "@playwright/test": "^1.38.0", "@types/flat": "^5.0.2", "@types/js-yaml": "^4.0.5", @@ -50,9 +50,9 @@ "@types/react-router-dom": "^5.3.3", "@typescript-eslint/eslint-plugin": "^5.52.0", "@typescript-eslint/parser": "^5.52.0", - "@vercel/webpack-asset-relocator-loader": "^1.7.3", + "@vercel/webpack-asset-relocator-loader": "1.7.3", "css-loader": "^6.7.3", - "electron": "22.0.0", + "electron": "^26.0.0", "electron-playwright-helpers": "^1.6.0", "eslint": "^8.34.0", "eslint-plugin-header": "^3.1.1", @@ -70,51 +70,113 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", + "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", + "dependencies": { + "@babel/highlight": "^7.24.7", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/generator": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.7.tgz", + "integrity": "sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA==", + "dependencies": { + "@babel/types": "^7.24.7", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.7.tgz", + "integrity": "sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==", + "dependencies": { + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.24.7.tgz", + "integrity": "sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==", + "dependencies": { + "@babel/template": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.7.tgz", + "integrity": "sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==", "dependencies": { - "@babel/highlight": "^7.18.6" + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", - "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz", + "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==", + "dependencies": { + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz", + "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==", "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", - "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.7.tgz", + "integrity": "sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", + "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", + "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", "dependencies": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" + "@babel/helper-validator-identifier": "^7.24.7", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" @@ -184,24 +246,68 @@ "node": ">=4" } }, + "node_modules/@babel/parser": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.7.tgz", + "integrity": "sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw==", + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/@babel/runtime": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.0.tgz", - "integrity": "sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.7.tgz", + "integrity": "sha512-UwgBRMjJP+xv857DCngvqXI3Iq6J4v0wXmwc6sapg+zyhbwmQX67LUEFrkK5tbyJ30jGuG3ZvWpBiB9LCy1kWw==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.7.tgz", + "integrity": "sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==", + "dependencies": { + "@babel/code-frame": "^7.24.7", + "@babel/parser": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.7.tgz", + "integrity": "sha512-yb65Ed5S/QAcewNPh0nZczy9JdYXkkAbIsEo+P7BE7yO3txAY30Y/oPa3QkQ5It3xVG2kpKMg9MsdxZaO31uKA==", "dependencies": { - "regenerator-runtime": "^0.13.11" + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.24.7", + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-function-name": "^7.24.7", + "@babel/helper-hoist-variables": "^7.24.7", + "@babel/helper-split-export-declaration": "^7.24.7", + "@babel/parser": "^7.24.7", + "@babel/types": "^7.24.7", + "debug": "^4.3.1", + "globals": "^11.1.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/types": { - "version": "7.21.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.2.tgz", - "integrity": "sha512-3wRZSs7jiFaB8AjxiiD+VqN5DTG2iRvJGQ+qYFrs/654lg6kGTQWIOFjlBo5RaXuAZjBmP3+OQH4dmhqiiyYxw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.7.tgz", + "integrity": "sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==", "dependencies": { - "@babel/helper-string-parser": "^7.19.4", - "@babel/helper-validator-identifier": "^7.19.1", + "@babel/helper-string-parser": "^7.24.7", + "@babel/helper-validator-identifier": "^7.24.7", "to-fast-properties": "^2.0.0" }, "engines": { @@ -235,29 +341,6 @@ "resolved": "https://registry.npmjs.org/@date-io/core/-/core-1.3.13.tgz", "integrity": "sha512-AlEKV7TxjeK+jxWVKcCFrfYAk8spX9aCyiToFIiLPtfQbsjmRGLIhb5VZgptQcJdHtLXo7+m0DuurwFgUToQuA==" }, - "node_modules/@date-io/date-fns": { - "version": "2.16.0", - "resolved": "https://registry.npmjs.org/@date-io/date-fns/-/date-fns-2.16.0.tgz", - "integrity": "sha512-bfm5FJjucqlrnQcXDVU5RD+nlGmL3iWgkHTq3uAZWVIuBu6dDmGa3m8a6zo2VQQpu8ambq9H22UyUpn7590joA==", - "peer": true, - "dependencies": { - "@date-io/core": "^2.16.0" - }, - "peerDependencies": { - "date-fns": "^2.0.0" - }, - "peerDependenciesMeta": { - "date-fns": { - "optional": true - } - } - }, - "node_modules/@date-io/date-fns/node_modules/@date-io/core": { - "version": "2.16.0", - "resolved": "https://registry.npmjs.org/@date-io/core/-/core-2.16.0.tgz", - "integrity": "sha512-DYmSzkr+jToahwWrsiRA2/pzMEtz9Bq1euJwoOuYwuwIYXnZFtHajY2E6a1VNVDc9jP8YUXK1BvnZH9mmT19Zg==", - "peer": true - }, "node_modules/@date-io/dayjs": { "version": "1.3.13", "resolved": "https://registry.npmjs.org/@date-io/dayjs/-/dayjs-1.3.13.tgz", @@ -269,56 +352,10 @@ "dayjs": "^1.8.17" } }, - "node_modules/@date-io/luxon": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/@date-io/luxon/-/luxon-2.16.1.tgz", - "integrity": "sha512-aeYp5K9PSHV28946pC+9UKUi/xMMYoaGelrpDibZSgHu2VWHXrr7zWLEr+pMPThSs5vt8Ei365PO+84pCm37WQ==", - "peer": true, - "dependencies": { - "@date-io/core": "^2.16.0" - }, - "peerDependencies": { - "luxon": "^1.21.3 || ^2.x || ^3.x" - }, - "peerDependenciesMeta": { - "luxon": { - "optional": true - } - } - }, - "node_modules/@date-io/luxon/node_modules/@date-io/core": { - "version": "2.16.0", - "resolved": "https://registry.npmjs.org/@date-io/core/-/core-2.16.0.tgz", - "integrity": "sha512-DYmSzkr+jToahwWrsiRA2/pzMEtz9Bq1euJwoOuYwuwIYXnZFtHajY2E6a1VNVDc9jP8YUXK1BvnZH9mmT19Zg==", - "peer": true - }, - "node_modules/@date-io/moment": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/@date-io/moment/-/moment-2.16.1.tgz", - "integrity": "sha512-JkxldQxUqZBfZtsaCcCMkm/dmytdyq5pS1RxshCQ4fHhsvP5A7gSqPD22QbVXMcJydi3d3v1Y8BQdUKEuGACZQ==", - "peer": true, - "dependencies": { - "@date-io/core": "^2.16.0" - }, - "peerDependencies": { - "moment": "^2.24.0" - }, - "peerDependenciesMeta": { - "moment": { - "optional": true - } - } - }, - "node_modules/@date-io/moment/node_modules/@date-io/core": { - "version": "2.16.0", - "resolved": "https://registry.npmjs.org/@date-io/core/-/core-2.16.0.tgz", - "integrity": "sha512-DYmSzkr+jToahwWrsiRA2/pzMEtz9Bq1euJwoOuYwuwIYXnZFtHajY2E6a1VNVDc9jP8YUXK1BvnZH9mmT19Zg==", - "peer": true - }, "node_modules/@electron-forge/cli": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/@electron-forge/cli/-/cli-6.0.5.tgz", - "integrity": "sha512-3xD4XKyV634cQCR8HobpVnb4LqVdTHDs+KwsU9zgjaBIJMBapCS3ZzpXYbxzPekTaVwu39ojMUg990JVYBhs2A==", + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/@electron-forge/cli/-/cli-6.4.2.tgz", + "integrity": "sha512-bM6YVTV0uUEpIL1jkpARlSm4Li26XZn+avC/lyTdpPqnd65T/oXZNkrAD+2Jb0RlgplOaM21qWm7ybtvKDGDyA==", "dev": true, "funding": [ { @@ -331,8 +368,8 @@ } ], "dependencies": { - "@electron-forge/core": "6.0.5", - "@electron-forge/shared-types": "6.0.5", + "@electron-forge/core": "6.4.2", + "@electron-forge/shared-types": "6.4.2", "@electron/get": "^2.0.0", "chalk": "^4.0.0", "commander": "^4.1.1", @@ -350,19 +387,10 @@ "node": ">= 14.17.5" } }, - "node_modules/@electron-forge/cli/node_modules/commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, "node_modules/@electron-forge/core": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/@electron-forge/core/-/core-6.0.5.tgz", - "integrity": "sha512-lMtm3x2ZFEBOU7/JTIo2oI5dXm2hKqpdc4opHA7iOxja5YYDDvnqKt+tACJSCdnCOxYLS+0OSoaz/DJ8SNyStw==", + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/@electron-forge/core/-/core-6.4.2.tgz", + "integrity": "sha512-VtrFZ1Q7NG1ov0jJO/tUvUiYdWZ0Y31xw762is/jfpRPD6V/soOpwJJAoWoPK9TZVkTm2pkS8S5LikCMbNCLxw==", "dev": true, "funding": [ { @@ -375,20 +403,22 @@ } ], "dependencies": { - "@electron-forge/core-utils": "6.0.5", - "@electron-forge/maker-base": "6.0.5", - "@electron-forge/plugin-base": "6.0.5", - "@electron-forge/publisher-base": "6.0.5", - "@electron-forge/shared-types": "6.0.5", - "@electron-forge/template-base": "6.0.5", - "@electron-forge/template-webpack": "6.0.5", - "@electron-forge/template-webpack-typescript": "6.0.5", + "@electron-forge/core-utils": "6.4.2", + "@electron-forge/maker-base": "6.4.2", + "@electron-forge/plugin-base": "6.4.2", + "@electron-forge/publisher-base": "6.4.2", + "@electron-forge/shared-types": "6.4.2", + "@electron-forge/template-base": "6.4.2", + "@electron-forge/template-vite": "6.4.2", + "@electron-forge/template-vite-typescript": "6.4.2", + "@electron-forge/template-webpack": "6.4.2", + "@electron-forge/template-webpack-typescript": "6.4.2", "@electron/get": "^2.0.0", "@electron/rebuild": "^3.2.10", "@malept/cross-spawn-promise": "^2.0.0", "chalk": "^4.0.0", "debug": "^4.3.1", - "electron-packager": "^17.1.1", + "electron-packager": "^17.1.2", "fast-glob": "^3.2.7", "filenamify": "^4.1.0", "find-up": "^5.0.0", @@ -413,12 +443,12 @@ } }, "node_modules/@electron-forge/core-utils": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/@electron-forge/core-utils/-/core-utils-6.0.5.tgz", - "integrity": "sha512-KCxTQOGRGITUwdxMu63xFn4SkuBE6Fvn188MjZHyztAHimiKBWdNGBrBHgjR2WyYTziT8y6JXcAntAW5d+jYHQ==", + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/@electron-forge/core-utils/-/core-utils-6.4.2.tgz", + "integrity": "sha512-CjB3aakmRsXAMMDYc8PxNTMf4FdI29y4PErfv7eCXlL5oo3JW0VSKZIV7R8/Po0S0got85q2kmhZgCKuxL1BNA==", "dev": true, "dependencies": { - "@electron-forge/shared-types": "6.0.5", + "@electron-forge/shared-types": "6.4.2", "@electron/rebuild": "^3.2.10", "@malept/cross-spawn-promise": "^2.0.0", "chalk": "^4.0.0", @@ -434,12 +464,12 @@ } }, "node_modules/@electron-forge/maker-base": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/@electron-forge/maker-base/-/maker-base-6.0.5.tgz", - "integrity": "sha512-m3xS/Gd2XlYUjXO4o8bxZEcwN9AulMDjuIzq68FRH5VB1vuESJKtVZjSa331IjaA+0aRXbSCa108FLy8g5Qlaw==", + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/@electron-forge/maker-base/-/maker-base-6.4.2.tgz", + "integrity": "sha512-zW3GH+LqDK9nxQmQEFkJPR8RqiX0lVk6a4mXll3ngujN1fPevO4ivUAWmaEVeC1dH/hXbN7s9m0S6a37MigftQ==", "dev": true, "dependencies": { - "@electron-forge/shared-types": "6.0.5", + "@electron-forge/shared-types": "6.4.2", "fs-extra": "^10.0.0", "which": "^2.0.2" }, @@ -448,19 +478,19 @@ } }, "node_modules/@electron-forge/maker-deb": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/@electron-forge/maker-deb/-/maker-deb-6.0.5.tgz", - "integrity": "sha512-uaDxBeLhJcrySnPGPEZbGwJG7qeiBE05+rdkPpsfHzsTBYca1abQ2Ll66R5EmOrosIZv60OUt1eGyxOrWlo1+w==", + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/@electron-forge/maker-deb/-/maker-deb-6.4.2.tgz", + "integrity": "sha512-tlV8ffivgBP94vtYXgAeXgzeKCaRyLuWH9LT8PQW1QrYbAFpCMmuwk/zFaJkyMklImCWmDFTPYMEqdEJGd7Npg==", "dev": true, "dependencies": { - "@electron-forge/maker-base": "6.0.5", - "@electron-forge/shared-types": "6.0.5" + "@electron-forge/maker-base": "6.4.2", + "@electron-forge/shared-types": "6.4.2" }, "engines": { "node": ">= 14.17.5" }, "optionalDependencies": { - "electron-installer-debian": "^3.0.0" + "electron-installer-debian": "^3.2.0" } }, "node_modules/@electron-forge/maker-dmg": { @@ -480,42 +510,14 @@ "electron-installer-dmg": "^4.0.0" } }, - "node_modules/@electron-forge/maker-dmg/node_modules/@electron-forge/maker-base": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/@electron-forge/maker-base/-/maker-base-6.4.2.tgz", - "integrity": "sha512-zW3GH+LqDK9nxQmQEFkJPR8RqiX0lVk6a4mXll3ngujN1fPevO4ivUAWmaEVeC1dH/hXbN7s9m0S6a37MigftQ==", - "dev": true, - "dependencies": { - "@electron-forge/shared-types": "6.4.2", - "fs-extra": "^10.0.0", - "which": "^2.0.2" - }, - "engines": { - "node": ">= 14.17.5" - } - }, - "node_modules/@electron-forge/maker-dmg/node_modules/@electron-forge/shared-types": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/@electron-forge/shared-types/-/shared-types-6.4.2.tgz", - "integrity": "sha512-DKOUMsdTXZIq8XiqY0Hi3C+dam/JKUnvfBjwcUeyZqPdgEE1qry8xZmmjorXuLrRf1Jq8rhxYGQInSK4af0QYw==", - "dev": true, - "dependencies": { - "@electron/rebuild": "^3.2.10", - "electron-packager": "^17.1.2", - "listr2": "^5.0.3" - }, - "engines": { - "node": ">= 14.17.5" - } - }, "node_modules/@electron-forge/maker-rpm": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/@electron-forge/maker-rpm/-/maker-rpm-6.0.5.tgz", - "integrity": "sha512-qwrTMo8kBf6fsPi6S22qCvD5F2OeJ8F4c0vuHi9YCUoPVjU3wBsvxi+lJclkdTqgzRWidfZ1vsbltcOSZb+2fw==", + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/@electron-forge/maker-rpm/-/maker-rpm-6.4.2.tgz", + "integrity": "sha512-+hfbY5pYbAer0y07OtOzVgVBHoTRmemqqZ//T0mKJpyK2ThHKGTvyW8FFlr5jlQs5LoDCM2WHKE8oGtRhivsMg==", "dev": true, "dependencies": { - "@electron-forge/maker-base": "6.0.5", - "@electron-forge/shared-types": "6.0.5" + "@electron-forge/maker-base": "6.4.2", + "@electron-forge/shared-types": "6.4.2" }, "engines": { "node": ">= 14.17.5" @@ -525,13 +527,13 @@ } }, "node_modules/@electron-forge/maker-squirrel": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/@electron-forge/maker-squirrel/-/maker-squirrel-6.0.5.tgz", - "integrity": "sha512-moP4OIytJlqxx3J7UCWrOv04tepjQIzK9RdzK4m9jfjPAxZtRObesFGXr/jLO18NHXk7fDcbYLf3sTIfaPU6jg==", + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/@electron-forge/maker-squirrel/-/maker-squirrel-6.4.2.tgz", + "integrity": "sha512-ukK3RcFaBrQXUzR52PsHxfwDq5XKSnj6A1kkXiyHWqgj+HIU97prBScBb5JRtasPvYN+nDdQO2vlInsLaqcx9Q==", "dev": true, "dependencies": { - "@electron-forge/maker-base": "6.0.5", - "@electron-forge/shared-types": "6.0.5", + "@electron-forge/maker-base": "6.4.2", + "@electron-forge/shared-types": "6.4.2", "fs-extra": "^10.0.0" }, "engines": { @@ -542,46 +544,47 @@ } }, "node_modules/@electron-forge/maker-zip": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/@electron-forge/maker-zip/-/maker-zip-6.0.5.tgz", - "integrity": "sha512-Yg256nGQUWT35EZyRIALpgtdM8WSvgZc0O4aA6Wy0S6ektaxyM2a+tO2ug/Vl+RgYA6oIeAADfkU2RxLiGnhbA==", + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/@electron-forge/maker-zip/-/maker-zip-6.4.2.tgz", + "integrity": "sha512-k2nfhhnxcYbUS7rCKCisuqEalxtH9l73+lrtfL0aQZiE/BLbDXyNckDIDOPvX0tBEg62nVzUdJonZwOhZVvAMw==", "dev": true, "dependencies": { - "@electron-forge/maker-base": "6.0.5", - "@electron-forge/shared-types": "6.0.5", + "@electron-forge/maker-base": "6.4.2", + "@electron-forge/shared-types": "6.4.2", "cross-zip": "^4.0.0", - "fs-extra": "^10.0.0" + "fs-extra": "^10.0.0", + "got": "^11.8.5" }, "engines": { "node": ">= 14.17.5" } }, "node_modules/@electron-forge/plugin-base": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/@electron-forge/plugin-base/-/plugin-base-6.0.5.tgz", - "integrity": "sha512-Q2ywNq6Qzb9K1W59qzbJvI+NZaDPrHz7iq9W8UfyHoEDYLJsD368PzHtNaQFJx+ofZNgsSpukXoL9mGvN1lVbA==", + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/@electron-forge/plugin-base/-/plugin-base-6.4.2.tgz", + "integrity": "sha512-g6AAtQ7fZ94djBmwcnWasQ8xgaNVNjgaQ00GLK0NkmQ7n0PNbsnlMDuw9vdfTiL6WaLg5nxNSYc9bFJP/rtyeA==", "dev": true, "dependencies": { - "@electron-forge/shared-types": "6.0.5" + "@electron-forge/shared-types": "6.4.2" }, "engines": { "node": ">= 14.17.5" } }, "node_modules/@electron-forge/plugin-webpack": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/@electron-forge/plugin-webpack/-/plugin-webpack-6.0.5.tgz", - "integrity": "sha512-L2H8tZA24VHPqYQRgO0/t6GJw6SMfj45hZfOMEqm2Xq2x2or9zi1ZMXzEEaZZJR6V0AWct002bwCJ+NNuiuTkQ==", + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/@electron-forge/plugin-webpack/-/plugin-webpack-6.4.2.tgz", + "integrity": "sha512-o+iQajtCCnYEPaJy0IkYI0noGqHoCDGMydki9sNU+CoUfDYBCNDkUXLTpoVkL6GmKTINT8kvOFgsFfPF9fhXlg==", "dev": true, "dependencies": { - "@electron-forge/core-utils": "6.0.5", - "@electron-forge/plugin-base": "6.0.5", - "@electron-forge/shared-types": "6.0.5", - "@electron-forge/web-multi-logger": "6.0.5", + "@electron-forge/core-utils": "6.4.2", + "@electron-forge/plugin-base": "6.4.2", + "@electron-forge/shared-types": "6.4.2", + "@electron-forge/web-multi-logger": "6.4.2", "chalk": "^4.0.0", "debug": "^4.3.1", "fs-extra": "^10.0.0", - "html-webpack-plugin": "^5.3.1", + "html-webpack-plugin": "^5.5.3", "webpack": "^5.69.1", "webpack-dev-server": "^4.0.0", "webpack-merge": "^5.7.3" @@ -591,25 +594,25 @@ } }, "node_modules/@electron-forge/publisher-base": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/@electron-forge/publisher-base/-/publisher-base-6.0.5.tgz", - "integrity": "sha512-gwOaMC3RKPO1mq3dqP9ko8kJptO41XU+I+pM66W/wvCNIQzisFCqrsx3d8A9RWsMJug0I1xNsYdBt99j1/2haA==", + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/@electron-forge/publisher-base/-/publisher-base-6.4.2.tgz", + "integrity": "sha512-Tnf9O8MFzdT1gsb5EDDaQUoslt7gUuUywtsr+lT/fpBlBQbei2fvioTwvZ1Q1cmsKnld7XhRh6unfgdWLTZzgw==", "dev": true, "dependencies": { - "@electron-forge/shared-types": "6.0.5" + "@electron-forge/shared-types": "6.4.2" }, "engines": { "node": ">= 14.17.5" } }, "node_modules/@electron-forge/shared-types": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/@electron-forge/shared-types/-/shared-types-6.0.5.tgz", - "integrity": "sha512-FrJI11afw/Cxk0JwgWyKg9aPoHOdmMi4JHTY6pnmi95MjarQ1d0SIqKJUzX7q2lXPUAxqPKA2Wmykg6F2CThlg==", + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/@electron-forge/shared-types/-/shared-types-6.4.2.tgz", + "integrity": "sha512-DKOUMsdTXZIq8XiqY0Hi3C+dam/JKUnvfBjwcUeyZqPdgEE1qry8xZmmjorXuLrRf1Jq8rhxYGQInSK4af0QYw==", "dev": true, "dependencies": { "@electron/rebuild": "^3.2.10", - "electron-packager": "^17.1.1", + "electron-packager": "^17.1.2", "listr2": "^5.0.3" }, "engines": { @@ -617,12 +620,12 @@ } }, "node_modules/@electron-forge/template-base": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/@electron-forge/template-base/-/template-base-6.0.5.tgz", - "integrity": "sha512-/3nOKPltnL8nVdZS2EpnKx1VMBqgLjW8TLRt8vtc+WdHtCVJBiU1Pt0JxTYDM3Raq/CclWGqVFb1svqorAon7Q==", + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/@electron-forge/template-base/-/template-base-6.4.2.tgz", + "integrity": "sha512-vsQh+64Fr2Vxg6k8DAahWq4MAdB2F2qTig+LgIJENv8ksbzC1YIq05SBAS/g2674cdr7WdwyukMy2rgxe3rhnQ==", "dev": true, "dependencies": { - "@electron-forge/shared-types": "6.0.5", + "@electron-forge/shared-types": "6.4.2", "@malept/cross-spawn-promise": "^2.0.0", "debug": "^4.3.1", "fs-extra": "^10.0.0", @@ -632,14 +635,42 @@ "node": ">= 14.17.5" } }, + "node_modules/@electron-forge/template-vite": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/@electron-forge/template-vite/-/template-vite-6.4.2.tgz", + "integrity": "sha512-NX7jHRblBmIqufMbqWgpI/VnpgF/qMSTq9ZPmDSXamBhid336MC6+DoWzDpXceQZEp0m/jpMLR04ynr8O4jGlg==", + "dev": true, + "dependencies": { + "@electron-forge/shared-types": "6.4.2", + "@electron-forge/template-base": "6.4.2", + "fs-extra": "^10.0.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + } + }, + "node_modules/@electron-forge/template-vite-typescript": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/@electron-forge/template-vite-typescript/-/template-vite-typescript-6.4.2.tgz", + "integrity": "sha512-h3pn6onvC/nLglmJuelYU82Qzrh0l6MqvbBGoT39bbDoRLIqmlhWTWppHgDJVXAGrSoH+9BEpptipeBQWirFwg==", + "dev": true, + "dependencies": { + "@electron-forge/shared-types": "6.4.2", + "@electron-forge/template-base": "6.4.2", + "fs-extra": "^10.0.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + } + }, "node_modules/@electron-forge/template-webpack": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/@electron-forge/template-webpack/-/template-webpack-6.0.5.tgz", - "integrity": "sha512-fDINYYCJ3D8rMYgS5tTHhgC8d73pRpQKtyBCQFC9KkfdNMYJr9MPZeep5pYQqrOMjSgBpgaYSBL9Unsa5I1F2g==", + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/@electron-forge/template-webpack/-/template-webpack-6.4.2.tgz", + "integrity": "sha512-9QYr/td4cmnGOj8UF25W6An/eI+JXj9T/b+KFybL3cQ87H1yrQOn2T84Bm5/JaB4SPdIu4FdKRjqwR7C7R0g2w==", "dev": true, "dependencies": { - "@electron-forge/shared-types": "6.0.5", - "@electron-forge/template-base": "6.0.5", + "@electron-forge/shared-types": "6.4.2", + "@electron-forge/template-base": "6.4.2", "fs-extra": "^10.0.0" }, "engines": { @@ -647,13 +678,13 @@ } }, "node_modules/@electron-forge/template-webpack-typescript": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/@electron-forge/template-webpack-typescript/-/template-webpack-typescript-6.0.5.tgz", - "integrity": "sha512-YjKVszYRT4S3Sw3AOEpJokU7KPpmr0HWuO14+WHMO0FhQ1gaTMfPoz6QRHg0F1Ulz73mm6b3MLb9ID5igZv7Mw==", + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/@electron-forge/template-webpack-typescript/-/template-webpack-typescript-6.4.2.tgz", + "integrity": "sha512-MPAZQ4v6piCED7NT1LTVQf61o6Eg/laNoKbhbrFBSH1i20OUwbtV2MLj6Op292ynI9+1qdHKmFgctr6qPTCAQw==", "dev": true, "dependencies": { - "@electron-forge/shared-types": "6.0.5", - "@electron-forge/template-base": "6.0.5", + "@electron-forge/shared-types": "6.4.2", + "@electron-forge/template-base": "6.4.2", "fs-extra": "^10.0.0" }, "engines": { @@ -661,9 +692,9 @@ } }, "node_modules/@electron-forge/web-multi-logger": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/@electron-forge/web-multi-logger/-/web-multi-logger-6.0.5.tgz", - "integrity": "sha512-Y4jbaLaoUjQbokQl6G8aTi1s8NdQ9MG74cr1dKOnRernk8C0pq8QoXBPAhPfkrmcLHzF3gpCrZeCIQ+/sDKviw==", + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/@electron-forge/web-multi-logger/-/web-multi-logger-6.4.2.tgz", + "integrity": "sha512-acZwr5+4l5G6baaqUwU9tuJ/njhJLUu9LgTvjedknIipg22EwLqwhjdXuTpWb9gidXDjdAjSRFzEEyVZCCooFA==", "dev": true, "dependencies": { "express": "^4.17.1", @@ -677,12 +708,11 @@ } }, "node_modules/@electron/asar": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/@electron/asar/-/asar-3.2.4.tgz", - "integrity": "sha512-lykfY3TJRRWFeTxccEKdf1I6BLl2Plw81H0bbp4Fc5iEc67foDCa5pjJQULVgo0wF+Dli75f3xVcdb/67FFZ/g==", + "version": "3.2.10", + "resolved": "https://registry.npmjs.org/@electron/asar/-/asar-3.2.10.tgz", + "integrity": "sha512-mvBSwIBUeiRscrCeJE1LwctAriBj65eUDm0Pc11iE5gRwzkmsdbS7FnZ1XUWjpSeQWL1L5g12Fc/SchPM9DUOw==", "dev": true, "dependencies": { - "chromium-pickle-js": "^0.2.0", "commander": "^5.0.0", "glob": "^7.1.6", "minimatch": "^3.0.4" @@ -694,10 +724,19 @@ "node": ">=10.12.0" } }, + "node_modules/@electron/asar/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/@electron/get": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@electron/get/-/get-2.0.2.tgz", - "integrity": "sha512-eFZVFoRXb3GFGd7Ak7W4+6jBl9wBtiZ4AaYOse97ej6mKj5tkyO0dUnUChs1IhJZtx1BENo4/p4WUTXpi6vT+g==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@electron/get/-/get-2.0.3.tgz", + "integrity": "sha512-Qkzpg2s9GnVV2I2BjRksUi43U5e6+zaQMcjoJy0C+C5oxaKl+fmckGDQFtRpZpZV0NQekuZZ+tGz7EA9TVnQtQ==", "dev": true, "dependencies": { "debug": "^4.1.1", @@ -739,9 +778,9 @@ } }, "node_modules/@electron/get/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "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" @@ -757,9 +796,9 @@ } }, "node_modules/@electron/notarize": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@electron/notarize/-/notarize-1.2.3.tgz", - "integrity": "sha512-9oRzT56rKh5bspk3KpAVF8lPKHYQrBnRwcgiOeR0hdilVEQmszDaAu0IPCPrwwzJN0ugNs0rRboTreHMt/6mBQ==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@electron/notarize/-/notarize-1.2.4.tgz", + "integrity": "sha512-W5GQhJEosFNafewnS28d3bpQ37/s91CDWqxVchHfmv2dQSTWpOzNlUVQwYzC1ay5bChRV/A9BTL68yj0Pa+TSg==", "dev": true, "dependencies": { "debug": "^4.1.1", @@ -785,9 +824,9 @@ } }, "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==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@electron/osx-sign/-/osx-sign-1.3.0.tgz", + "integrity": "sha512-TEXhxlYSDRr9JWK5nWdOv5MtuUdaZ412uxIIEQ0hLt80o0HYWtQJBlW5QmrQDMtebzATaOjKG9UfCzLyA90zWQ==", "dev": true, "dependencies": { "compare-version": "^0.1.2", @@ -806,9 +845,9 @@ } }, "node_modules/@electron/rebuild": { - "version": "3.2.10", - "resolved": "https://registry.npmjs.org/@electron/rebuild/-/rebuild-3.2.10.tgz", - "integrity": "sha512-SUBM6Mwi3yZaDFQjZzfGKpYTtOp9m60glounwX6tfGeVc/ZOl4jbquktUcyy7gYSLDWFLtKkftkY2xgMJZLQgg==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@electron/rebuild/-/rebuild-3.6.0.tgz", + "integrity": "sha512-zF4x3QupRU3uNGaP5X1wjpmcjfw1H87kyqZ00Tc3HvriV+4gmOGuvQjGNkrJuXdsApssdNyVwLsy+TaeTGGcVw==", "dev": true, "dependencies": { "@malept/cross-spawn-promise": "^2.0.0", @@ -817,26 +856,26 @@ "detect-libc": "^2.0.1", "fs-extra": "^10.0.0", "got": "^11.7.0", - "lzma-native": "^8.0.5", - "node-abi": "^3.0.0", - "node-api-version": "^0.1.4", + "node-abi": "^3.45.0", + "node-api-version": "^0.2.0", "node-gyp": "^9.0.0", "ora": "^5.1.0", + "read-binary-file-arch": "^1.0.6", "semver": "^7.3.5", "tar": "^6.0.5", "yargs": "^17.0.1" }, "bin": { - "electron-rebuild": "lib/src/cli.js" + "electron-rebuild": "lib/cli.js" }, "engines": { "node": ">=12.13.0" } }, "node_modules/@electron/universal": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/@electron/universal/-/universal-1.3.4.tgz", - "integrity": "sha512-BdhBgm2ZBnYyYRLRgOjM5VHkyFItsbggJ0MHycOjKWdFGYwK97ZFXH54dTvUWEfha81vfvwr5On6XBjt99uDcg==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@electron/universal/-/universal-1.5.1.tgz", + "integrity": "sha512-kbgXxyEauPJiQQUNG2VgUeyfQNFk6hBF11ISN2PNI6agUgPl55pv4eQmaqHzTAzchBvqZ2tQuRVaPStGf0mxGw==", "dev": true, "dependencies": { "@electron/asar": "^3.2.1", @@ -888,74 +927,101 @@ "node": ">=10" } }, + "node_modules/@electron/windows-sign": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@electron/windows-sign/-/windows-sign-1.1.2.tgz", + "integrity": "sha512-eXEiZjDtxW3QORCWfRUarANPRTlH9B6At4jqBZJ0NzokSGutXQUVLPA6WmGpIhDW6w2yCMdHW1EJd1HrXtU5sg==", + "dev": true, + "optional": true, + "dependencies": { + "cross-dirname": "^0.1.0", + "debug": "^4.3.4", + "fs-extra": "^11.1.1", + "minimist": "^1.2.8", + "postject": "^1.0.0-alpha.6" + }, + "bin": { + "electron-windows-sign": "bin/electron-windows-sign.js" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/@electron/windows-sign/node_modules/fs-extra": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "dev": true, + "optional": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, "node_modules/@emotion/babel-plugin": { - "version": "11.10.6", - "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.10.6.tgz", - "integrity": "sha512-p2dAqtVrkhSa7xz1u/m9eHYdLi+en8NowrmXeF/dKtJpU8lCWli8RUAati7NcSl0afsBott48pdnANuD0wh9QQ==", + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz", + "integrity": "sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==", "dependencies": { "@babel/helper-module-imports": "^7.16.7", "@babel/runtime": "^7.18.3", - "@emotion/hash": "^0.9.0", - "@emotion/memoize": "^0.8.0", - "@emotion/serialize": "^1.1.1", + "@emotion/hash": "^0.9.1", + "@emotion/memoize": "^0.8.1", + "@emotion/serialize": "^1.1.2", "babel-plugin-macros": "^3.1.0", "convert-source-map": "^1.5.0", "escape-string-regexp": "^4.0.0", "find-root": "^1.1.0", "source-map": "^0.5.7", - "stylis": "4.1.3" - } - }, - "node_modules/@emotion/babel-plugin/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==", - "engines": { - "node": ">=0.10.0" + "stylis": "4.2.0" } }, "node_modules/@emotion/cache": { - "version": "11.10.5", - "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.10.5.tgz", - "integrity": "sha512-dGYHWyzTdmK+f2+EnIGBpkz1lKc4Zbj2KHd4cX3Wi8/OWr5pKslNjc3yABKH4adRGCvSX4VDC0i04mrrq0aiRA==", + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.11.0.tgz", + "integrity": "sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==", "dependencies": { - "@emotion/memoize": "^0.8.0", - "@emotion/sheet": "^1.2.1", - "@emotion/utils": "^1.2.0", - "@emotion/weak-memoize": "^0.3.0", - "stylis": "4.1.3" + "@emotion/memoize": "^0.8.1", + "@emotion/sheet": "^1.2.2", + "@emotion/utils": "^1.2.1", + "@emotion/weak-memoize": "^0.3.1", + "stylis": "4.2.0" } }, "node_modules/@emotion/hash": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.0.tgz", - "integrity": "sha512-14FtKiHhy2QoPIzdTcvh//8OyBlknNs2nXRwIhG904opCby3l+9Xaf/wuPvICBF0rc1ZCNBd3nKe9cd2mecVkQ==" + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.1.tgz", + "integrity": "sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==" }, "node_modules/@emotion/is-prop-valid": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.0.tgz", - "integrity": "sha512-3aDpDprjM0AwaxGE09bOPkNxHpBd+kA6jty3RnaEXdweX1DF1U3VQpPYb0g1IStAuK7SVQ1cy+bNBBKp4W3Fjg==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.2.tgz", + "integrity": "sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw==", "dependencies": { - "@emotion/memoize": "^0.8.0" + "@emotion/memoize": "^0.8.1" } }, "node_modules/@emotion/memoize": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.0.tgz", - "integrity": "sha512-G/YwXTkv7Den9mXDO7AhLWkE3q+I92B+VqAE+dYG4NGPaHZGvt3G8Q0p9vmE+sq7rTGphUbAvmQ9YpbfMQGGlA==" + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", + "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" }, "node_modules/@emotion/react": { - "version": "11.10.6", - "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.10.6.tgz", - "integrity": "sha512-6HT8jBmcSkfzO7mc+N1L9uwvOnlcGoix8Zn7srt+9ga0MjREo6lRpuVX0kzo6Jp6oTqDhREOFsygN6Ew4fEQbw==", + "version": "11.11.4", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.11.4.tgz", + "integrity": "sha512-t8AjMlF0gHpvvxk5mAtCqR4vmxiGHCeJBaQO6gncUSdklELOgtwjerNY2yuJNfwnc6vi16U/+uMF+afIawJ9iw==", "dependencies": { "@babel/runtime": "^7.18.3", - "@emotion/babel-plugin": "^11.10.6", - "@emotion/cache": "^11.10.5", - "@emotion/serialize": "^1.1.1", - "@emotion/use-insertion-effect-with-fallbacks": "^1.0.0", - "@emotion/utils": "^1.2.0", - "@emotion/weak-memoize": "^0.3.0", + "@emotion/babel-plugin": "^11.11.0", + "@emotion/cache": "^11.11.0", + "@emotion/serialize": "^1.1.3", + "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", + "@emotion/utils": "^1.2.1", + "@emotion/weak-memoize": "^0.3.1", "hoist-non-react-statics": "^3.3.1" }, "peerDependencies": { @@ -968,33 +1034,33 @@ } }, "node_modules/@emotion/serialize": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.1.tgz", - "integrity": "sha512-Zl/0LFggN7+L1liljxXdsVSVlg6E/Z/olVWpfxUTxOAmi8NU7YoeWeLfi1RmnB2TATHoaWwIBRoL+FvAJiTUQA==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.4.tgz", + "integrity": "sha512-RIN04MBT8g+FnDwgvIUi8czvr1LU1alUMI05LekWB5DGyTm8cCBMCRpq3GqaiyEDRptEXOyXnvZ58GZYu4kBxQ==", "dependencies": { - "@emotion/hash": "^0.9.0", - "@emotion/memoize": "^0.8.0", - "@emotion/unitless": "^0.8.0", - "@emotion/utils": "^1.2.0", + "@emotion/hash": "^0.9.1", + "@emotion/memoize": "^0.8.1", + "@emotion/unitless": "^0.8.1", + "@emotion/utils": "^1.2.1", "csstype": "^3.0.2" } }, "node_modules/@emotion/sheet": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.1.tgz", - "integrity": "sha512-zxRBwl93sHMsOj4zs+OslQKg/uhF38MB+OMKoCrVuS0nyTkqnau+BM3WGEoOptg9Oz45T/aIGs1qbVAsEFo3nA==" + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.2.tgz", + "integrity": "sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==" }, "node_modules/@emotion/styled": { - "version": "11.10.6", - "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.10.6.tgz", - "integrity": "sha512-OXtBzOmDSJo5Q0AFemHCfl+bUueT8BIcPSxu0EGTpGk6DmI5dnhSzQANm1e1ze0YZL7TDyAyy6s/b/zmGOS3Og==", + "version": "11.11.5", + "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.11.5.tgz", + "integrity": "sha512-/ZjjnaNKvuMPxcIiUkf/9SHoG4Q196DRl1w82hQ3WCsjo1IUR8uaGWrC6a87CrYAW0Kb/pK7hk8BnLgLRi9KoQ==", "dependencies": { "@babel/runtime": "^7.18.3", - "@emotion/babel-plugin": "^11.10.6", - "@emotion/is-prop-valid": "^1.2.0", - "@emotion/serialize": "^1.1.1", - "@emotion/use-insertion-effect-with-fallbacks": "^1.0.0", - "@emotion/utils": "^1.2.0" + "@emotion/babel-plugin": "^11.11.0", + "@emotion/is-prop-valid": "^1.2.2", + "@emotion/serialize": "^1.1.4", + "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", + "@emotion/utils": "^1.2.1" }, "peerDependencies": { "@emotion/react": "^11.0.0-rc.0", @@ -1007,37 +1073,61 @@ } }, "node_modules/@emotion/unitless": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.0.tgz", - "integrity": "sha512-VINS5vEYAscRl2ZUDiT3uMPlrFQupiKgHz5AA4bCH1miKBg4qtwkim1qPmJj/4WG6TreYMY111rEFsjupcOKHw==" + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz", + "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==" }, "node_modules/@emotion/use-insertion-effect-with-fallbacks": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.0.tgz", - "integrity": "sha512-1eEgUGmkaljiBnRMTdksDV1W4kUnmwgp7X9G8B++9GYwl1lUdqSndSriIrTJ0N7LQaoauY9JJ2yhiOYK5+NI4A==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz", + "integrity": "sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==", "peerDependencies": { "react": ">=16.8.0" } }, "node_modules/@emotion/utils": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.0.tgz", - "integrity": "sha512-sn3WH53Kzpw8oQ5mgMmIzzyAaH2ZqFEbozVVBSYp538E06OSE6ytOp7pRAjNQR+Q/orwqdQYJSe2m3hCOeznkw==" + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.1.tgz", + "integrity": "sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==" }, "node_modules/@emotion/weak-memoize": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.0.tgz", - "integrity": "sha512-AHPmaAx+RYfZz0eYu6Gviiagpmiyw98ySSlQvCUhVGDRtDFe4DBS0x1bSjdF3gqUDYOczB+yYvBTtEylYSdRhg==" + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz", + "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==" + }, + "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==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.1.tgz", + "integrity": "sha512-Zm2NGpWELsQAD1xsJzGQpYfvICSsFkEpU0jxBjfdC6uNEWXcHnfs9hScFWtXVDVl+rBQJGrl4g1vcKIejpH9dA==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } }, "node_modules/@eslint/eslintrc": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.4.1.tgz", - "integrity": "sha512-XXrH9Uarn0stsyldqDYq8r++mROmWRI1xKMXa640Bb//SY1+ECYX6VzT6Lcx5frD0V30XieqJ0oX9I2Xj5aoMA==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "dev": true, "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.4.0", + "espree": "^9.6.0", "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", @@ -1068,50 +1158,120 @@ "url": "https://github.com/sponsors/epoberezkin" } }, + "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==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "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/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/js": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", + "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@floating-ui/core": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.2.tgz", + "integrity": "sha512-+2XpQV9LLZeanU4ZevzRnGFg2neDeKHgFLjP6YLW+tly0IvrhqT4u8enLGjLH3qeh85g19xY5rsAusfwTdn5lg==", + "dependencies": { + "@floating-ui/utils": "^0.2.0" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.6.5", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.5.tgz", + "integrity": "sha512-Nsdud2X65Dz+1RHjAIP0t8z5e2ff/IRbei6BqFrl1urT8sDVzM1HMQ+R0XcU5ceRfyO3I6ayeqIfh+6Wb8LGTw==", + "dependencies": { + "@floating-ui/core": "^1.0.0", + "@floating-ui/utils": "^0.2.0" + } + }, + "node_modules/@floating-ui/react-dom": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.0.tgz", + "integrity": "sha512-lNzj5EQmEKn5FFKc04+zasr09h/uX8RtJRNj5gUXsSQIXHVWTVh+hVAg1vOMCexkX8EgvemMvIFpQfkosnVNyA==", + "dependencies": { + "@floating-ui/dom": "^1.0.0" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.2.tgz", + "integrity": "sha512-J4yDIIthosAsRZ5CPYP/jQvUAQtlZTTD/4suA08/FEnlxqW3sKS9iAhgsa9VYLZ6vDHn/ixJgIqRQPotoBjxIw==" + }, "node_modules/@fortawesome/fontawesome-common-types": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.4.2.tgz", - "integrity": "sha512-1DgP7f+XQIJbLFCTX1V2QnxVmpLdKdzzo2k8EmvDOePfchaIGQ9eCHj2up3/jNEbZuBqel5OxiaOJf37TWauRA==", + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.5.2.tgz", + "integrity": "sha512-gBxPg3aVO6J0kpfHNILc+NMhXnqHumFxOmjYCFfOiLZfwhnnfhtsdA2hfJlDnj+8PjAs6kKQPenOTKj3Rf7zHw==", "hasInstallScript": true, "engines": { "node": ">=6" } }, "node_modules/@fortawesome/fontawesome-svg-core": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.4.2.tgz", - "integrity": "sha512-gjYDSKv3TrM2sLTOKBc5rH9ckje8Wrwgx1CxAPbN5N3Fm4prfi7NsJVWd1jklp7i5uSCVwhZS5qlhMXqLrpAIg==", + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.5.2.tgz", + "integrity": "sha512-5CdaCBGl8Rh9ohNdxeeTMxIj8oc3KNBgIeLMvJosBMdslK/UnEB8rzyDRrbKdL1kDweqBPo4GT9wvnakHWucZw==", "hasInstallScript": true, "peer": true, "dependencies": { - "@fortawesome/fontawesome-common-types": "6.4.2" + "@fortawesome/fontawesome-common-types": "6.5.2" }, "engines": { "node": ">=6" } }, "node_modules/@fortawesome/free-solid-svg-icons": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.4.2.tgz", - "integrity": "sha512-sYwXurXUEQS32fZz9hVCUUv/xu49PEJEyUOsA51l6PU/qVgfbTb2glsTEaJngVVT8VqBATRIdh7XVgV1JF1LkA==", + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.5.2.tgz", + "integrity": "sha512-QWFZYXFE7O1Gr1dTIp+D6UcFUF0qElOnZptpi7PBUMylJh+vFmIedVe1Ir6RM1t2tEQLLSV1k7bR4o92M+uqlw==", "hasInstallScript": true, "dependencies": { - "@fortawesome/fontawesome-common-types": "6.4.2" + "@fortawesome/fontawesome-common-types": "6.5.2" }, "engines": { "node": ">=6" } }, "node_modules/@fortawesome/react-fontawesome": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@fortawesome/react-fontawesome/-/react-fontawesome-0.2.0.tgz", - "integrity": "sha512-uHg75Rb/XORTtVt7OS9WoK8uM276Ufi7gCzshVWkUJbHhh3svsUUeqXerrM96Wm7fRiDzfKRwSoahhMIkGAYHw==", + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@fortawesome/react-fontawesome/-/react-fontawesome-0.2.2.tgz", + "integrity": "sha512-EnkrprPNqI6SXJl//m29hpaNzOp1bruISWaOiRtkMi/xSvHJlzc2j2JAYS7egxt/EbjSNV/k6Xy0AQI6vB2+1g==", "dependencies": { "prop-types": "^15.8.1" }, @@ -1127,13 +1287,13 @@ "dev": true }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.8", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", - "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", "dev": true, "dependencies": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", "minimatch": "^3.0.5" }, "engines": { @@ -1154,507 +1314,111 @@ } }, "node_modules/@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", "dev": true }, - "node_modules/@jimp/bmp": { - "version": "0.22.10", - "resolved": "https://registry.npmjs.org/@jimp/bmp/-/bmp-0.22.10.tgz", - "integrity": "sha512-1UXRl1Nw1KptZ1r0ANqtXOst9vGH51dq7keVKQzyyTO2lz4dOaezS9StuSTNh+RmiHg/SVPaFRpPfB0S/ln4Kg==", - "dependencies": { - "@jimp/utils": "^0.22.10", - "bmp-js": "^0.1.0" - }, - "peerDependencies": { - "@jimp/custom": ">=0.3.5" - } - }, - "node_modules/@jimp/core": { - "version": "0.22.10", - "resolved": "https://registry.npmjs.org/@jimp/core/-/core-0.22.10.tgz", - "integrity": "sha512-ZKyrehVy6wu1PnBXIUpn/fXmyMRQiVSbvHDubgXz4bfTOao3GiOurKHjByutQIgozuAN6ZHWiSge1dKA+dex3w==", - "dependencies": { - "@jimp/utils": "^0.22.10", - "any-base": "^1.1.0", - "buffer": "^5.2.0", - "exif-parser": "^0.1.12", - "file-type": "^16.5.4", - "isomorphic-fetch": "^3.0.0", - "pixelmatch": "^4.0.2", - "tinycolor2": "^1.6.0" - } - }, - "node_modules/@jimp/custom": { - "version": "0.22.10", - "resolved": "https://registry.npmjs.org/@jimp/custom/-/custom-0.22.10.tgz", - "integrity": "sha512-sPZkUYe1hu0iIgNisjizxPJqq2vaaKvkCkPoXq2U6UV3ZA1si/WVdrg25da3IcGIEV+83AoHgM8TvqlLgrCJsg==", - "dependencies": { - "@jimp/core": "^0.22.10" - } - }, - "node_modules/@jimp/gif": { - "version": "0.22.10", - "resolved": "https://registry.npmjs.org/@jimp/gif/-/gif-0.22.10.tgz", - "integrity": "sha512-yEX2dSpamvkSx1PPDWGnKeWDrBz0vrCKjVG/cn4Zr68MRRT75tbZIeOrBa+RiUpY3ho5ix7d36LkYvt3qfUIhQ==", - "dependencies": { - "@jimp/utils": "^0.22.10", - "gifwrap": "^0.10.1", - "omggif": "^1.0.9" - }, - "peerDependencies": { - "@jimp/custom": ">=0.3.5" - } - }, - "node_modules/@jimp/jpeg": { - "version": "0.22.10", - "resolved": "https://registry.npmjs.org/@jimp/jpeg/-/jpeg-0.22.10.tgz", - "integrity": "sha512-6bu98pAcVN4DY2oiDLC4TOgieX/lZrLd1tombWZOFCN5PBmqaHQxm7IUmT+Wj4faEvh8QSHgVLSA+2JQQRJWVA==", - "dependencies": { - "@jimp/utils": "^0.22.10", - "jpeg-js": "^0.4.4" - }, - "peerDependencies": { - "@jimp/custom": ">=0.3.5" - } - }, - "node_modules/@jimp/plugin-blit": { - "version": "0.22.10", - "resolved": "https://registry.npmjs.org/@jimp/plugin-blit/-/plugin-blit-0.22.10.tgz", - "integrity": "sha512-6EI8Sl+mxYHEIy6Yteh6eknD+EZguKpNdr3sCKxNezmLR0+vK99vHcllo6uGSjXXiwtwS67Xqxn8SsoatL+UJQ==", - "dependencies": { - "@jimp/utils": "^0.22.10" - }, - "peerDependencies": { - "@jimp/custom": ">=0.3.5" - } - }, - "node_modules/@jimp/plugin-blur": { - "version": "0.22.10", - "resolved": "https://registry.npmjs.org/@jimp/plugin-blur/-/plugin-blur-0.22.10.tgz", - "integrity": "sha512-4XRTWuPVdMXJeclJMisXPGizeHtTryVaVV5HnuQXpKqIZtzXReCCpNGH8q/i0kBQOQMXhGWS3mpqOEwtpPePKw==", - "dependencies": { - "@jimp/utils": "^0.22.10" - }, - "peerDependencies": { - "@jimp/custom": ">=0.3.5" - } - }, - "node_modules/@jimp/plugin-circle": { - "version": "0.22.10", - "resolved": "https://registry.npmjs.org/@jimp/plugin-circle/-/plugin-circle-0.22.10.tgz", - "integrity": "sha512-mhcwTO1ywRxiCgtLGge6tDDIDPlX6qkI3CY+BjgGG/XhVHccCddXgOGLdlf+5OuKIEF2Nqs0V01LQEQIJFTmEw==", - "dependencies": { - "@jimp/utils": "^0.22.10" - }, - "peerDependencies": { - "@jimp/custom": ">=0.3.5" - } - }, - "node_modules/@jimp/plugin-color": { - "version": "0.22.10", - "resolved": "https://registry.npmjs.org/@jimp/plugin-color/-/plugin-color-0.22.10.tgz", - "integrity": "sha512-e4t3L7Kedd96E0x1XjsTM6NcgulKUU66HdFTao7Tc9FYJRFSlttARZ/C6LEryGDm/i69R6bJEpo7BkNz0YL55Q==", - "dependencies": { - "@jimp/utils": "^0.22.10", - "tinycolor2": "^1.6.0" - }, - "peerDependencies": { - "@jimp/custom": ">=0.3.5" - } - }, - "node_modules/@jimp/plugin-contain": { - "version": "0.22.10", - "resolved": "https://registry.npmjs.org/@jimp/plugin-contain/-/plugin-contain-0.22.10.tgz", - "integrity": "sha512-eP8KrzctuEoqibQAxi9WhbnoRosydhiwg+IYya3dKuKDBTrD9UHt+ERlPQ/lTNWHzV/l4S1ntV3r9s9saJgsXA==", - "dependencies": { - "@jimp/utils": "^0.22.10" - }, - "peerDependencies": { - "@jimp/custom": ">=0.3.5", - "@jimp/plugin-blit": ">=0.3.5", - "@jimp/plugin-resize": ">=0.3.5", - "@jimp/plugin-scale": ">=0.3.5" - } - }, - "node_modules/@jimp/plugin-cover": { - "version": "0.22.10", - "resolved": "https://registry.npmjs.org/@jimp/plugin-cover/-/plugin-cover-0.22.10.tgz", - "integrity": "sha512-kJCwL5T1igfa0InCfkE7bBeqg26m46aoRt10ug+rvm11P6RrvRMGrgINFyIKB+mnB7CiyBN/MOula1CvLhSInQ==", - "dependencies": { - "@jimp/utils": "^0.22.10" - }, - "peerDependencies": { - "@jimp/custom": ">=0.3.5", - "@jimp/plugin-crop": ">=0.3.5", - "@jimp/plugin-resize": ">=0.3.5", - "@jimp/plugin-scale": ">=0.3.5" - } - }, - "node_modules/@jimp/plugin-crop": { - "version": "0.22.10", - "resolved": "https://registry.npmjs.org/@jimp/plugin-crop/-/plugin-crop-0.22.10.tgz", - "integrity": "sha512-BOZ+YGaZlhU7c5ye65RxikicXH0Ki0It6/XHISvipR5WZrfjLjL2Ke20G+AGnwBQc76gKenVcMXVUCnEjtZV+Q==", - "dependencies": { - "@jimp/utils": "^0.22.10" - }, - "peerDependencies": { - "@jimp/custom": ">=0.3.5" - } - }, - "node_modules/@jimp/plugin-displace": { - "version": "0.22.10", - "resolved": "https://registry.npmjs.org/@jimp/plugin-displace/-/plugin-displace-0.22.10.tgz", - "integrity": "sha512-llNiWWMTKISDXt5+cXI0GaFmZWAjlT+4fFLYf4eXquuL/9wZoQsEBhv2GdGd48mkiS8jZq1Nnb2Q4ehEPTvrzw==", - "dependencies": { - "@jimp/utils": "^0.22.10" - }, - "peerDependencies": { - "@jimp/custom": ">=0.3.5" - } - }, - "node_modules/@jimp/plugin-dither": { - "version": "0.22.10", - "resolved": "https://registry.npmjs.org/@jimp/plugin-dither/-/plugin-dither-0.22.10.tgz", - "integrity": "sha512-05WLmeV5M+P/0FS+bWf13hMew2X0oa8w9AtmevL2UyA/5GqiyvP2Xm5WfGQ8oFiiMvpnL6RFomJQOZtWca0C2w==", - "dependencies": { - "@jimp/utils": "^0.22.10" - }, - "peerDependencies": { - "@jimp/custom": ">=0.3.5" - } - }, - "node_modules/@jimp/plugin-fisheye": { - "version": "0.22.10", - "resolved": "https://registry.npmjs.org/@jimp/plugin-fisheye/-/plugin-fisheye-0.22.10.tgz", - "integrity": "sha512-InjiXvc7Gkzrx8VWtU97kDqV7ENnhHGPULymJWeZaF2aicud9Fpk4iCtd/DcZIrk7Cbe60A8RwNXN00HXIbSCg==", - "dependencies": { - "@jimp/utils": "^0.22.10" - }, - "peerDependencies": { - "@jimp/custom": ">=0.3.5" - } - }, - "node_modules/@jimp/plugin-flip": { - "version": "0.22.10", - "resolved": "https://registry.npmjs.org/@jimp/plugin-flip/-/plugin-flip-0.22.10.tgz", - "integrity": "sha512-42GkGtTHWnhnwTMPVK/kXObZbkYIpQWfuIfy5EMEMk6zRj05zpv4vsjkKWfuemweZINwfvD7wDJF7FVFNNcZZg==", - "dependencies": { - "@jimp/utils": "^0.22.10" - }, - "peerDependencies": { - "@jimp/custom": ">=0.3.5", - "@jimp/plugin-rotate": ">=0.3.5" - } - }, - "node_modules/@jimp/plugin-gaussian": { - "version": "0.22.10", - "resolved": "https://registry.npmjs.org/@jimp/plugin-gaussian/-/plugin-gaussian-0.22.10.tgz", - "integrity": "sha512-ykrG/6lTp9Q5YA8jS5XzwMHtRxb9HOFMgtmnrUZ8kU+BK8REecfy9Ic5BUEOjCYvS1a/xLsnrZQU07iiYxBxFg==", - "dependencies": { - "@jimp/utils": "^0.22.10" - }, - "peerDependencies": { - "@jimp/custom": ">=0.3.5" - } - }, - "node_modules/@jimp/plugin-invert": { - "version": "0.22.10", - "resolved": "https://registry.npmjs.org/@jimp/plugin-invert/-/plugin-invert-0.22.10.tgz", - "integrity": "sha512-d8j9BlUJYs/c994t4azUWSWmQq4LLPG4ecm8m6SSNqap+S/HlVQGqjYhJEBbY9EXkOTYB9vBL9bqwSM1Rr6paA==", - "dependencies": { - "@jimp/utils": "^0.22.10" - }, - "peerDependencies": { - "@jimp/custom": ">=0.3.5" - } - }, - "node_modules/@jimp/plugin-mask": { - "version": "0.22.10", - "resolved": "https://registry.npmjs.org/@jimp/plugin-mask/-/plugin-mask-0.22.10.tgz", - "integrity": "sha512-yRBs1230XZkz24uFTdTcSlZ0HXZpIWzM3iFQN56MzZ7USgdVZjPPDCQ8I9RpqfZ36nDflQkUO0wV7ucsi4ogow==", - "dependencies": { - "@jimp/utils": "^0.22.10" - }, - "peerDependencies": { - "@jimp/custom": ">=0.3.5" - } - }, - "node_modules/@jimp/plugin-normalize": { - "version": "0.22.10", - "resolved": "https://registry.npmjs.org/@jimp/plugin-normalize/-/plugin-normalize-0.22.10.tgz", - "integrity": "sha512-Wk9GX6eJMchX/ZAazVa70Fagu+OXMvHiPY+HrcEwcclL+p1wo8xAHEsf9iKno7Ja4EU9lLhbBRY5hYJyiKMEkg==", - "dependencies": { - "@jimp/utils": "^0.22.10" - }, - "peerDependencies": { - "@jimp/custom": ">=0.3.5" - } - }, - "node_modules/@jimp/plugin-print": { - "version": "0.22.10", - "resolved": "https://registry.npmjs.org/@jimp/plugin-print/-/plugin-print-0.22.10.tgz", - "integrity": "sha512-1U3VloIR+beE1kWPdGEJMiE2h1Do29iv3w8sBbvPyRP4qXxRFcDpmCGtctsrKmb1krlBFlj8ubyAY90xL+5n9w==", - "dependencies": { - "@jimp/utils": "^0.22.10", - "load-bmfont": "^1.4.1" - }, - "peerDependencies": { - "@jimp/custom": ">=0.3.5", - "@jimp/plugin-blit": ">=0.3.5" - } - }, - "node_modules/@jimp/plugin-resize": { - "version": "0.22.10", - "resolved": "https://registry.npmjs.org/@jimp/plugin-resize/-/plugin-resize-0.22.10.tgz", - "integrity": "sha512-ixomxVcnAONXDgaq0opvAx4UAOiEhOA/tipuhFFOvPKFd4yf1BAnEviB5maB0SBHHkJXPUSzDp/73xVTMGSe7g==", - "dependencies": { - "@jimp/utils": "^0.22.10" - }, - "peerDependencies": { - "@jimp/custom": ">=0.3.5" - } - }, - "node_modules/@jimp/plugin-rotate": { - "version": "0.22.10", - "resolved": "https://registry.npmjs.org/@jimp/plugin-rotate/-/plugin-rotate-0.22.10.tgz", - "integrity": "sha512-eeFX8dnRyf3LAdsdXWKWuN18hLRg8zy1cP0cP9rHzQVWRK7ck/QsLxK1vHq7MADGwQalNaNTJ9SQxH6c8mz6jw==", - "dependencies": { - "@jimp/utils": "^0.22.10" - }, - "peerDependencies": { - "@jimp/custom": ">=0.3.5", - "@jimp/plugin-blit": ">=0.3.5", - "@jimp/plugin-crop": ">=0.3.5", - "@jimp/plugin-resize": ">=0.3.5" - } - }, - "node_modules/@jimp/plugin-scale": { - "version": "0.22.10", - "resolved": "https://registry.npmjs.org/@jimp/plugin-scale/-/plugin-scale-0.22.10.tgz", - "integrity": "sha512-TG/H0oUN69C9ArBCZg4PmuoixFVKIiru8282KzSB/Tp1I0xwX0XLTv3dJ5pobPlIgPcB+TmD4xAIdkCT4rtWxg==", - "dependencies": { - "@jimp/utils": "^0.22.10" - }, - "peerDependencies": { - "@jimp/custom": ">=0.3.5", - "@jimp/plugin-resize": ">=0.3.5" - } - }, - "node_modules/@jimp/plugin-shadow": { - "version": "0.22.10", - "resolved": "https://registry.npmjs.org/@jimp/plugin-shadow/-/plugin-shadow-0.22.10.tgz", - "integrity": "sha512-TN9xm6fI7XfxbMUQqFPZjv59Xdpf0tSiAQdINB4g6pJMWiVANR/74OtDONoy3KKpenu5Y38s+FkrtID/KcQAhw==", - "dependencies": { - "@jimp/utils": "^0.22.10" - }, - "peerDependencies": { - "@jimp/custom": ">=0.3.5", - "@jimp/plugin-blur": ">=0.3.5", - "@jimp/plugin-resize": ">=0.3.5" - } - }, - "node_modules/@jimp/plugin-threshold": { - "version": "0.22.10", - "resolved": "https://registry.npmjs.org/@jimp/plugin-threshold/-/plugin-threshold-0.22.10.tgz", - "integrity": "sha512-DA2lSnU0TgIRbAgmXaxroYw3Ad6J2DOFEoJp0NleSm2h3GWbZEE5yW9U2B6hD3iqn4AenG4E2b2WzHXZyzSutw==", - "dependencies": { - "@jimp/utils": "^0.22.10" - }, - "peerDependencies": { - "@jimp/custom": ">=0.3.5", - "@jimp/plugin-color": ">=0.8.0", - "@jimp/plugin-resize": ">=0.8.0" - } - }, - "node_modules/@jimp/plugins": { - "version": "0.22.10", - "resolved": "https://registry.npmjs.org/@jimp/plugins/-/plugins-0.22.10.tgz", - "integrity": "sha512-KDMZyM6pmvS8freB+UBLko1TO/k4D7URS/nphCozuH+P7i3UMe7NdckXKJ8u+WD6sqN0YFYvBehpkpnUiw/91w==", - "dependencies": { - "@jimp/plugin-blit": "^0.22.10", - "@jimp/plugin-blur": "^0.22.10", - "@jimp/plugin-circle": "^0.22.10", - "@jimp/plugin-color": "^0.22.10", - "@jimp/plugin-contain": "^0.22.10", - "@jimp/plugin-cover": "^0.22.10", - "@jimp/plugin-crop": "^0.22.10", - "@jimp/plugin-displace": "^0.22.10", - "@jimp/plugin-dither": "^0.22.10", - "@jimp/plugin-fisheye": "^0.22.10", - "@jimp/plugin-flip": "^0.22.10", - "@jimp/plugin-gaussian": "^0.22.10", - "@jimp/plugin-invert": "^0.22.10", - "@jimp/plugin-mask": "^0.22.10", - "@jimp/plugin-normalize": "^0.22.10", - "@jimp/plugin-print": "^0.22.10", - "@jimp/plugin-resize": "^0.22.10", - "@jimp/plugin-rotate": "^0.22.10", - "@jimp/plugin-scale": "^0.22.10", - "@jimp/plugin-shadow": "^0.22.10", - "@jimp/plugin-threshold": "^0.22.10", - "timm": "^1.6.1" - }, - "peerDependencies": { - "@jimp/custom": ">=0.3.5" - } - }, - "node_modules/@jimp/png": { - "version": "0.22.10", - "resolved": "https://registry.npmjs.org/@jimp/png/-/png-0.22.10.tgz", - "integrity": "sha512-RYinU7tZToeeR2g2qAMn42AU+8OUHjXPKZZ9RkmoL4bguA1xyZWaSdr22/FBkmnHhOERRlr02KPDN1OTOYHLDQ==", - "dependencies": { - "@jimp/utils": "^0.22.10", - "pngjs": "^6.0.0" - }, - "peerDependencies": { - "@jimp/custom": ">=0.3.5" - } - }, - "node_modules/@jimp/tiff": { - "version": "0.22.10", - "resolved": "https://registry.npmjs.org/@jimp/tiff/-/tiff-0.22.10.tgz", - "integrity": "sha512-OaivlSYzpNTHyH/h7pEtl3A7F7TbsgytZs52GLX/xITW92ffgDgT6PkldIrMrET6ERh/hdijNQiew7IoEEr2og==", - "dependencies": { - "utif2": "^4.0.1" - }, - "peerDependencies": { - "@jimp/custom": ">=0.3.5" - } - }, - "node_modules/@jimp/types": { - "version": "0.22.10", - "resolved": "https://registry.npmjs.org/@jimp/types/-/types-0.22.10.tgz", - "integrity": "sha512-u/r+XYzbCx4zZukDmxx8S0er3Yq3iDPI6+31WKX0N18i2qPPJYcn8qwIFurfupRumGvJ8SlGLCgt/T+Y8zzUIw==", - "dependencies": { - "@jimp/bmp": "^0.22.10", - "@jimp/gif": "^0.22.10", - "@jimp/jpeg": "^0.22.10", - "@jimp/png": "^0.22.10", - "@jimp/tiff": "^0.22.10", - "timm": "^1.6.1" - }, - "peerDependencies": { - "@jimp/custom": ">=0.3.5" - } - }, - "node_modules/@jimp/utils": { - "version": "0.22.10", - "resolved": "https://registry.npmjs.org/@jimp/utils/-/utils-0.22.10.tgz", - "integrity": "sha512-ztlOK9Mm2iLG2AMoabzM4i3WZ/FtshcgsJCbZCRUs/DKoeS2tySRJTnQZ1b7Roq0M4Ce+FUAxnCAcBV0q7PH9w==", - "dependencies": { - "regenerator-runtime": "^0.13.3" - } - }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "dev": true, + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", "dependencies": { - "@jridgewell/set-array": "^1.0.1", + "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "dev": true, + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "engines": { "node": ">=6.0.0" } }, "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==", - "dev": true, + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/source-map": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", - "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", "dev": true, "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.17", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", - "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", - "dev": true, + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dependencies": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, "node_modules/@jsonforms/core": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@jsonforms/core/-/core-3.0.0.tgz", - "integrity": "sha512-DcUGLNaeAE411oA8d5dPuPEF2/nDmALAfQRsaA3GPAre2D76kJXyBb8TFMjLMRJCVIR0q5LsiRRdmLnuPVHKqA==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@jsonforms/core/-/core-3.3.0.tgz", + "integrity": "sha512-p88vnW5VbeQ9dPe36DHhqzKEd5puM7njWp5yu5FCB2O7kjSc0do4OqjgUDVl3vBblsi0OsTQqxaLZ8uUVVbcRQ==", "dependencies": { "@types/json-schema": "^7.0.3", "ajv": "^8.6.1", "ajv-formats": "^2.1.0", - "lodash": "^4.17.15" + "lodash": "^4.17.21" } }, "node_modules/@jsonforms/material-renderers": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@jsonforms/material-renderers/-/material-renderers-3.0.0.tgz", - "integrity": "sha512-M0MgnB473vIAuuPMaUjNa3tBVEv/aTN59DK/Pm0TJrR+6UJgOJsBXfE6I/uQcpFaDbE5o91vK1fbRHHQ47BLZQ==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@jsonforms/material-renderers/-/material-renderers-3.3.0.tgz", + "integrity": "sha512-qyvPR7LVmvB6uiFjAGyv/MB9COOFwUc2PfRJfA1qpPx/aDBM03sCvWyw/M3XFHjyOJUxoMBVTbSz2t2gpCMnug==", "dependencies": { "@date-io/dayjs": "1.3.13", - "dayjs": "1.10.6" + "dayjs": "1.10.7", + "lodash": "^4.17.21" }, "peerDependencies": { "@emotion/react": "^11.4.1", "@emotion/styled": "^11.3.0", - "@jsonforms/core": "3.0.0", - "@jsonforms/react": "3.0.0", - "@mui/icons-material": "^5.0.0", - "@mui/material": "^5.0.0", - "@mui/x-date-pickers": "^5.0.0-beta.5" + "@jsonforms/core": "3.3.0", + "@jsonforms/react": "3.3.0", + "@mui/icons-material": "^5.11.16", + "@mui/material": "^5.13.0", + "@mui/x-date-pickers": "^6.0.0", + "react": "^16.12.0 || ^17.0.0 || ^18.0.0" } }, - "node_modules/@jsonforms/material-renderers/node_modules/dayjs": { - "version": "1.10.6", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.10.6.tgz", - "integrity": "sha512-AztC/IOW4L1Q41A86phW5Thhcrco3xuAA+YX/BLpLWWjRcTj5TOt/QImBLmCKlrF7u7k47arTnOyL6GnbG8Hvw==" - }, "node_modules/@jsonforms/react": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@jsonforms/react/-/react-3.0.0.tgz", - "integrity": "sha512-Fj/L6hjk9uYSEBQrV7Vyj3ocTYGFelSupAJYmlys/37BPgifzPc+cBQj5bMKzx6pfO8YbmI+Sr3HDs2eNA/LkA==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@jsonforms/react/-/react-3.3.0.tgz", + "integrity": "sha512-+iuNYHlsZ3uc8MuvxsmmiWRvDoMaHcNSRLUcGUNwWKLEOmQj0jj75oBNkI9h36oXB3/9VtXzXqw0VYHqmoWYYA==", "dependencies": { - "lodash": "^4.17.15" + "lodash": "^4.17.21" }, "peerDependencies": { - "@jsonforms/core": "3.0.0", + "@jsonforms/core": "3.3.0", "react": "^16.12.0 || ^17.0.0 || ^18.0.0" } }, "node_modules/@leichtgewicht/ip-codec": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", - "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", + "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==", "dev": true }, "node_modules/@malept/cross-spawn-promise": { @@ -1680,25 +1444,24 @@ } }, "node_modules/@mui/base": { - "version": "5.0.0-alpha.119", - "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-alpha.119.tgz", - "integrity": "sha512-XA5zhlYfXi67u613eIF0xRmktkatx6ERy3h+PwrMN5IcWFbgiL1guz8VpdXON+GWb8+G7B8t5oqTFIaCqaSAeA==", - "dependencies": { - "@babel/runtime": "^7.21.0", - "@emotion/is-prop-valid": "^1.2.0", - "@mui/types": "^7.2.3", - "@mui/utils": "^5.11.11", - "@popperjs/core": "^2.11.6", - "clsx": "^1.2.1", - "prop-types": "^15.8.1", - "react-is": "^18.2.0" + "version": "5.0.0-beta.40", + "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.40.tgz", + "integrity": "sha512-I/lGHztkCzvwlXpjD2+SNmvNQvB4227xBXhISPjEaJUXGImOQ9f3D2Yj/T3KasSI/h0MLWy74X0J6clhPmsRbQ==", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@floating-ui/react-dom": "^2.0.8", + "@mui/types": "^7.2.14", + "@mui/utils": "^5.15.14", + "@popperjs/core": "^2.11.8", + "clsx": "^2.1.0", + "prop-types": "^15.8.1" }, "engines": { "node": ">=12.0.0" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/mui" + "url": "https://opencollective.com/mui-org" }, "peerDependencies": { "@types/react": "^17.0.0 || ^18.0.0", @@ -1712,27 +1475,27 @@ } }, "node_modules/@mui/core-downloads-tracker": { - "version": "5.11.11", - "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.11.11.tgz", - "integrity": "sha512-0YK0K9GfW1ysw9z4ztWAjLW+bktf+nExMyn2+EQe1Ijb0kF2kz1kIOmb4+di0/PsXG70uCuw4DhEIdNd+JQkRA==", + "version": "5.15.19", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.15.19.tgz", + "integrity": "sha512-tCHSi/Tomez9ERynFhZRvFO6n9ATyrPs+2N80DMDzp6xDVirbBjEwhPcE+x7Lj+nwYw0SqFkOxyvMP0irnm55w==", "funding": { "type": "opencollective", - "url": "https://opencollective.com/mui" + "url": "https://opencollective.com/mui-org" } }, "node_modules/@mui/icons-material": { - "version": "5.11.11", - "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.11.11.tgz", - "integrity": "sha512-Eell3ADmQVE8HOpt/LZ3zIma8JSvPh3XgnhwZLT0k5HRqZcd6F/QDHc7xsWtgz09t+UEFvOYJXjtrwKmLdwwpw==", + "version": "5.15.19", + "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.15.19.tgz", + "integrity": "sha512-RsEiRxA5azN9b8gI7JRqekkgvxQUlitoBOtZglflb8cUDyP12/cP4gRwhb44Ea1/zwwGGjAj66ZJpGHhKfibNA==", "dependencies": { - "@babel/runtime": "^7.21.0" + "@babel/runtime": "^7.23.9" }, "engines": { "node": ">=12.0.0" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/mui" + "url": "https://opencollective.com/mui-org" }, "peerDependencies": { "@mui/material": "^5.0.0", @@ -1746,19 +1509,19 @@ } }, "node_modules/@mui/material": { - "version": "5.11.11", - "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.11.11.tgz", - "integrity": "sha512-sSe0dmKjB1IGOYt32Pcha+cXV3IIrX5L5mFAF9LDRssp/x53bluhgLLbkc8eTiJvueVvo6HAyze6EkFEYLQRXQ==", - "dependencies": { - "@babel/runtime": "^7.21.0", - "@mui/base": "5.0.0-alpha.119", - "@mui/core-downloads-tracker": "^5.11.11", - "@mui/system": "^5.11.11", - "@mui/types": "^7.2.3", - "@mui/utils": "^5.11.11", - "@types/react-transition-group": "^4.4.5", - "clsx": "^1.2.1", - "csstype": "^3.1.1", + "version": "5.15.19", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.15.19.tgz", + "integrity": "sha512-lp5xQBbcRuxNtjpWU0BWZgIrv2XLUz4RJ0RqFXBdESIsKoGCQZ6P3wwU5ZPuj5TjssNiKv9AlM+vHopRxZhvVQ==", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@mui/base": "5.0.0-beta.40", + "@mui/core-downloads-tracker": "^5.15.19", + "@mui/system": "^5.15.15", + "@mui/types": "^7.2.14", + "@mui/utils": "^5.15.14", + "@types/react-transition-group": "^4.4.10", + "clsx": "^2.1.0", + "csstype": "^3.1.3", "prop-types": "^15.8.1", "react-is": "^18.2.0", "react-transition-group": "^4.4.5" @@ -1768,7 +1531,7 @@ }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/mui" + "url": "https://opencollective.com/mui-org" }, "peerDependencies": { "@emotion/react": "^11.5.0", @@ -1790,12 +1553,12 @@ } }, "node_modules/@mui/private-theming": { - "version": "5.11.11", - "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.11.11.tgz", - "integrity": "sha512-yLgTkjNC1mpye2SOUkc+zQQczUpg8NvQAETvxwXTMzNgJK1pv4htL7IvBM5vmCKG7IHAB3hX26W2u6i7bxwF3A==", + "version": "5.15.14", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.15.14.tgz", + "integrity": "sha512-UH0EiZckOWcxiXLX3Jbb0K7rC8mxTr9L9l6QhOZxYc4r8FHUkefltV9VDGLrzCaWh30SQiJvAEd7djX3XXY6Xw==", "dependencies": { - "@babel/runtime": "^7.21.0", - "@mui/utils": "^5.11.11", + "@babel/runtime": "^7.23.9", + "@mui/utils": "^5.15.14", "prop-types": "^15.8.1" }, "engines": { @@ -1803,7 +1566,7 @@ }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/mui" + "url": "https://opencollective.com/mui-org" }, "peerDependencies": { "@types/react": "^17.0.0 || ^18.0.0", @@ -1816,13 +1579,13 @@ } }, "node_modules/@mui/styled-engine": { - "version": "5.11.11", - "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.11.11.tgz", - "integrity": "sha512-wV0UgW4lN5FkDBXefN8eTYeuE9sjyQdg5h94vtwZCUamGQEzmCOtir4AakgmbWMy0x8OLjdEUESn9wnf5J9MOg==", + "version": "5.15.14", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.15.14.tgz", + "integrity": "sha512-RILkuVD8gY6PvjZjqnWhz8fu68dVkqhM5+jYWfB5yhlSQKg+2rHkmEwm75XIeAqI3qwOndK6zELK5H6Zxn4NHw==", "dependencies": { - "@babel/runtime": "^7.21.0", - "@emotion/cache": "^11.10.5", - "csstype": "^3.1.1", + "@babel/runtime": "^7.23.9", + "@emotion/cache": "^11.11.0", + "csstype": "^3.1.3", "prop-types": "^15.8.1" }, "engines": { @@ -1830,7 +1593,7 @@ }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/mui" + "url": "https://opencollective.com/mui-org" }, "peerDependencies": { "@emotion/react": "^11.4.1", @@ -1847,17 +1610,17 @@ } }, "node_modules/@mui/system": { - "version": "5.11.11", - "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.11.11.tgz", - "integrity": "sha512-a9gaOAJBjpzypDfhbGZQ8HzdcxdxsKkFvbp1aAWZhFHBPdehEkARNh7mj851VfEhD/GdffYt85PFKFKdUta5Eg==", - "dependencies": { - "@babel/runtime": "^7.21.0", - "@mui/private-theming": "^5.11.11", - "@mui/styled-engine": "^5.11.11", - "@mui/types": "^7.2.3", - "@mui/utils": "^5.11.11", - "clsx": "^1.2.1", - "csstype": "^3.1.1", + "version": "5.15.15", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.15.15.tgz", + "integrity": "sha512-aulox6N1dnu5PABsfxVGOZffDVmlxPOVgj56HrUnJE8MCSh8lOvvkd47cebIVQQYAjpwieXQXiDPj5pwM40jTQ==", + "dependencies": { + "@babel/runtime": "^7.23.9", + "@mui/private-theming": "^5.15.14", + "@mui/styled-engine": "^5.15.14", + "@mui/types": "^7.2.14", + "@mui/utils": "^5.15.14", + "clsx": "^2.1.0", + "csstype": "^3.1.3", "prop-types": "^15.8.1" }, "engines": { @@ -1865,7 +1628,7 @@ }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/mui" + "url": "https://opencollective.com/mui-org" }, "peerDependencies": { "@emotion/react": "^11.5.0", @@ -1886,11 +1649,11 @@ } }, "node_modules/@mui/types": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.3.tgz", - "integrity": "sha512-tZ+CQggbe9Ol7e/Fs5RcKwg/woU+o8DCtOnccX6KmbBc7YrfqMYEYuaIcXHuhpT880QwNkZZ3wQwvtlDFA2yOw==", + "version": "7.2.14", + "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.14.tgz", + "integrity": "sha512-MZsBZ4q4HfzBsywtXgM1Ksj6HDThtiwmOKUXH1pKYISI9gAVXCNHNpo7TlGoGrBaYWZTdNoirIN7JsQcQUjmQQ==", "peerDependencies": { - "@types/react": "*" + "@types/react": "^17.0.0 || ^18.0.0" }, "peerDependenciesMeta": { "@types/react": { @@ -1899,13 +1662,12 @@ } }, "node_modules/@mui/utils": { - "version": "5.11.11", - "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.11.11.tgz", - "integrity": "sha512-neMM5rrEXYQrOrlxUfns/TGgX4viS8K2zb9pbQh11/oUUYFlGI32Tn+PHePQx7n6Fy/0zq6WxdBFC9VpnJ5JrQ==", + "version": "5.15.14", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.15.14.tgz", + "integrity": "sha512-0lF/7Hh/ezDv5X7Pry6enMsbYyGKjADzvHyo3Qrc/SSlTsQ1VkbDMbH0m2t3OR5iIVLwMoxwM7yGd+6FCMtTFA==", "dependencies": { - "@babel/runtime": "^7.21.0", - "@types/prop-types": "^15.7.5", - "@types/react-is": "^16.7.1 || ^17.0.0", + "@babel/runtime": "^7.23.9", + "@types/prop-types": "^15.7.11", "prop-types": "^15.8.1", "react-is": "^18.2.0" }, @@ -1914,33 +1676,34 @@ }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/mui" + "url": "https://opencollective.com/mui-org" }, "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0", "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } } }, "node_modules/@mui/x-date-pickers": { - "version": "5.0.20", - "resolved": "https://registry.npmjs.org/@mui/x-date-pickers/-/x-date-pickers-5.0.20.tgz", - "integrity": "sha512-ERukSeHIoNLbI1C2XRhF9wRhqfsr+Q4B1SAw2ZlU7CWgcG8UBOxgqRKDEOVAIoSWL+DWT6GRuQjOKvj6UXZceA==", + "version": "6.20.0", + "resolved": "https://registry.npmjs.org/@mui/x-date-pickers/-/x-date-pickers-6.20.0.tgz", + "integrity": "sha512-q/x3rNmPYMXnx75+3s9pQb1YDtws9y5bwxpxeB3EW88oCp33eS7bvJpeuoCA1LzW/PpVfIRhi5RCyAvrEeTL7Q==", "peer": true, "dependencies": { - "@babel/runtime": "^7.18.9", - "@date-io/core": "^2.15.0", - "@date-io/date-fns": "^2.15.0", - "@date-io/dayjs": "^2.15.0", - "@date-io/luxon": "^2.15.0", - "@date-io/moment": "^2.15.0", - "@mui/utils": "^5.10.3", - "@types/react-transition-group": "^4.4.5", - "clsx": "^1.2.1", - "prop-types": "^15.7.2", - "react-transition-group": "^4.4.5", - "rifm": "^0.12.1" + "@babel/runtime": "^7.23.2", + "@mui/base": "^5.0.0-beta.22", + "@mui/utils": "^5.14.16", + "@types/react-transition-group": "^4.4.8", + "clsx": "^2.0.0", + "prop-types": "^15.8.1", + "react-transition-group": "^4.4.5" }, "engines": { - "node": ">=12.0.0" + "node": ">=14.0.0" }, "funding": { "type": "opencollective", @@ -1949,14 +1712,17 @@ "peerDependencies": { "@emotion/react": "^11.9.0", "@emotion/styled": "^11.8.1", - "@mui/material": "^5.4.1", - "@mui/system": "^5.4.1", - "date-fns": "^2.25.0", + "@mui/material": "^5.8.6", + "@mui/system": "^5.8.0", + "date-fns": "^2.25.0 || ^3.2.0", + "date-fns-jalali": "^2.13.0-0", "dayjs": "^1.10.7", - "luxon": "^1.28.0 || ^2.0.0 || ^3.0.0", - "moment": "^2.29.1", - "react": "^17.0.2 || ^18.0.0", - "react-dom": "^17.0.2 || ^18.0.0" + "luxon": "^3.0.2", + "moment": "^2.29.4", + "moment-hijri": "^2.1.2", + "moment-jalaali": "^0.7.4 || ^0.8.0 || ^0.9.0 || ^0.10.0", + "react": "^17.0.0 || ^18.0.0", + "react-dom": "^17.0.0 || ^18.0.0" }, "peerDependenciesMeta": { "@emotion/react": { @@ -1968,6 +1734,9 @@ "date-fns": { "optional": true }, + "date-fns-jalali": { + "optional": true + }, "dayjs": { "optional": true }, @@ -1976,28 +1745,11 @@ }, "moment": { "optional": true - } - } - }, - "node_modules/@mui/x-date-pickers/node_modules/@date-io/core": { - "version": "2.16.0", - "resolved": "https://registry.npmjs.org/@date-io/core/-/core-2.16.0.tgz", - "integrity": "sha512-DYmSzkr+jToahwWrsiRA2/pzMEtz9Bq1euJwoOuYwuwIYXnZFtHajY2E6a1VNVDc9jP8YUXK1BvnZH9mmT19Zg==", - "peer": true - }, - "node_modules/@mui/x-date-pickers/node_modules/@date-io/dayjs": { - "version": "2.16.0", - "resolved": "https://registry.npmjs.org/@date-io/dayjs/-/dayjs-2.16.0.tgz", - "integrity": "sha512-y5qKyX2j/HG3zMvIxTobYZRGnd1FUW2olZLS0vTj7bEkBQkjd2RO7/FEwDY03Z1geVGlXKnzIATEVBVaGzV4Iw==", - "peer": true, - "dependencies": { - "@date-io/core": "^2.16.0" - }, - "peerDependencies": { - "dayjs": "^1.8.17" - }, - "peerDependenciesMeta": { - "dayjs": { + }, + "moment-hijri": { + "optional": true + }, + "moment-jalaali": { "optional": true } } @@ -2065,12 +1817,12 @@ } }, "node_modules/@playwright/test": { - "version": "1.38.0", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.38.0.tgz", - "integrity": "sha512-xis/RXXsLxwThKnlIXouxmIvvT3zvQj1JE39GsNieMUrMpb3/GySHDh2j8itCG22qKVD4MYLBp7xB73cUW/UUw==", + "version": "1.44.1", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.44.1.tgz", + "integrity": "sha512-1hZ4TNvD5z9VuhNJ/walIjvMVvYkZKf71axoF/uiAqpntQJXpG64dlXhoDXE3OczPuTuvjf/M5KWFg5VAVUS3Q==", "dev": true, "dependencies": { - "playwright": "1.38.0" + "playwright": "1.44.1" }, "bin": { "playwright": "cli.js" @@ -2080,23 +1832,23 @@ } }, "node_modules/@popperjs/core": { - "version": "2.11.6", - "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.6.tgz", - "integrity": "sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw==", + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", "funding": { "type": "opencollective", "url": "https://opencollective.com/popperjs" } }, "node_modules/@reduxjs/toolkit": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-1.9.3.tgz", - "integrity": "sha512-GU2TNBQVofL09VGmuSioNPQIu6Ml0YLf4EJhgj0AvBadRlCGzUWet8372LjvO4fqKZF2vH1xU0htAa7BrK9pZg==", + "version": "1.9.7", + "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-1.9.7.tgz", + "integrity": "sha512-t7v8ZPxhhKgOKtU+uyJT13lu4vL7az5aFi4IdoDs/eS548edn2M8Ik9h8fxgvMjGoAUVFSt6ZC1P5cWmQ014QQ==", "dependencies": { - "immer": "^9.0.16", - "redux": "^4.2.0", + "immer": "^9.0.21", + "redux": "^4.2.1", "redux-thunk": "^2.4.2", - "reselect": "^4.1.7" + "reselect": "^4.1.8" }, "peerDependencies": { "react": "^16.9.0 || ^17.0.0 || ^18", @@ -2112,11 +1864,11 @@ } }, "node_modules/@remix-run/router": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.3.2.tgz", - "integrity": "sha512-t54ONhl/h75X94SWsHGQ4G/ZrCEguKSRQr7DrjTciJXW0YU1QhlwYeycvK5JgkzlxmvrK7wq1NB/PLtHxoiDcA==", + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.16.1.tgz", + "integrity": "sha512-es2g3dq6Nb07iFxGk5GuHN20RwBZOsuDQN7izWIisUcv9r+d2C5jQxqmgkdebXgReWfiyUabcki6Fg77mSNrig==", "engines": { - "node": ">=14" + "node": ">=14.0.0" } }, "node_modules/@sindresorhus/is": { @@ -2143,11 +1895,6 @@ "node": ">=10" } }, - "node_modules/@tokenizer/token": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", - "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==" - }, "node_modules/@tootallnate/once": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", @@ -2158,9 +1905,9 @@ } }, "node_modules/@tsconfig/node10": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", - "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", + "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", "dev": true }, "node_modules/@tsconfig/node12": { @@ -2176,15 +1923,15 @@ "dev": true }, "node_modules/@tsconfig/node16": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", - "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", "dev": true }, "node_modules/@types/body-parser": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", - "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", + "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, "dependencies": { "@types/connect": "*", @@ -2192,9 +1939,9 @@ } }, "node_modules/@types/bonjour": { - "version": "3.5.10", - "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz", - "integrity": "sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==", + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz", + "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", "dev": true, "dependencies": { "@types/node": "*" @@ -2213,18 +1960,18 @@ } }, "node_modules/@types/connect": { - "version": "3.4.35", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", - "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", "dev": true, "dependencies": { "@types/node": "*" } }, "node_modules/@types/connect-history-api-fallback": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz", - "integrity": "sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==", + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz", + "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==", "dev": true, "dependencies": { "@types/express-serve-static-core": "*", @@ -2232,9 +1979,9 @@ } }, "node_modules/@types/eslint": { - "version": "8.21.1", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.21.1.tgz", - "integrity": "sha512-rc9K8ZpVjNcLs8Fp0dkozd5Pt2Apk1glO4Vgz8ix1u6yFByxfqo5Yavpy65o+93TAe24jr7v+eSBtFLvOQtCRQ==", + "version": "8.56.10", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.10.tgz", + "integrity": "sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ==", "dev": true, "dependencies": { "@types/estree": "*", @@ -2242,9 +1989,9 @@ } }, "node_modules/@types/eslint-scope": { - "version": "3.7.4", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", - "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", "dev": true, "dependencies": { "@types/eslint": "*", @@ -2252,15 +1999,15 @@ } }, "node_modules/@types/estree": { - "version": "0.0.51", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", - "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", "dev": true }, "node_modules/@types/express": { - "version": "4.17.17", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz", - "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==", + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", + "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", "dev": true, "dependencies": { "@types/body-parser": "*", @@ -2270,20 +2017,21 @@ } }, "node_modules/@types/express-serve-static-core": { - "version": "4.17.33", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.33.tgz", - "integrity": "sha512-TPBqmR/HRYI3eC2E5hmiivIzv+bidAfXofM+sbonAGvyDhySGw9/PQZFt2BLOrjUUR++4eJVpx6KnLQK1Fk9tA==", + "version": "4.19.3", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.3.tgz", + "integrity": "sha512-KOzM7MhcBFlmnlr/fzISFF5vGWVSvN6fTd4T+ExOt08bA/dA5kpSzY52nMsI1KDFmUREpJelPYyuslLRSjjgCg==", "dev": true, "dependencies": { "@types/node": "*", "@types/qs": "*", - "@types/range-parser": "*" + "@types/range-parser": "*", + "@types/send": "*" } }, "node_modules/@types/flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@types/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-3zsplnP2djeps5P9OyarTxwRpMLoe5Ash8aL9iprw0JxB+FAHjY+ifn4yZUuW4/9hqtnmor6uvjSRzJhiVbrEQ==", + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/@types/flat/-/flat-5.0.5.tgz", + "integrity": "sha512-nPLljZQKSnac53KDUDzuzdRfGI0TDb5qPrb+SrQyN3MtdQrOnGsKniHN1iYZsJEBIVQve94Y6gNz22sgISZq+Q==", "dev": true }, "node_modules/@types/fs-extra": { @@ -2314,9 +2062,9 @@ "dev": true }, "node_modules/@types/hoist-non-react-statics": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz", - "integrity": "sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA==", + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.5.tgz", + "integrity": "sha512-SbcrWzkKBw2cdwRTwQAswfpB9g9LJWfjtUeW/jvNwbhC8cpmmNYVePa+ncbUe0rGTQ7G3Ff6mYUN2VMfLVr+Sg==", "dependencies": { "@types/react": "*", "hoist-non-react-statics": "^3.3.0" @@ -2329,30 +2077,36 @@ "dev": true }, "node_modules/@types/http-cache-semantics": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", - "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==", + "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==", + "dev": true + }, + "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/http-proxy": { - "version": "1.17.9", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.9.tgz", - "integrity": "sha512-QsbSjA/fSk7xB+UXlCT3wHBy5ai9wOcNDWwZAtud+jXhwOM3l+EYZh8Lng4+/6n8uar0J7xILzqftJdJ/Wdfkw==", + "version": "1.17.14", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.14.tgz", + "integrity": "sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w==", "dev": true, "dependencies": { "@types/node": "*" } }, "node_modules/@types/js-yaml": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.6.tgz", - "integrity": "sha512-ACTuifTSIIbyksx2HTon3aFtCKWcID7/h3XEmRpDYdMCXxPbl+m9GteOJeaAkiAta/NJaSFuA7ahZ0NkwajDSw==", + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.9.tgz", + "integrity": "sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==", "dev": true }, "node_modules/@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==" + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==" }, "node_modules/@types/json5": { "version": "0.0.29", @@ -2370,9 +2124,9 @@ } }, "node_modules/@types/mime": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz", - "integrity": "sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==", + "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": { @@ -2383,60 +2137,63 @@ "optional": true }, "node_modules/@types/node": { - "version": "18.13.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.13.0.tgz", - "integrity": "sha512-gC3TazRzGoOnoKAhUx+Q0t8S9Tzs74z7m0ipwGpSqQrleP14hKxP4/JUeEQcD3W1/aIpnWl8pHowI7WokuZpXg==", - "dev": true + "version": "20.14.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.2.tgz", + "integrity": "sha512-xyu6WAMVwv6AKFLB+e/7ySZVr/0zLCzOa7rSpq6jNwpqOrUbcACDWC+53d4n2QHOnDou0fbIsg8wZu/sxrnI4Q==", + "dev": true, + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/node-forge": { + "version": "1.3.11", + "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz", + "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } }, "node_modules/@types/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", + "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==" }, "node_modules/@types/prop-types": { - "version": "15.7.5", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", - "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==" + "version": "15.7.12", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz", + "integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==" }, "node_modules/@types/qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", + "version": "6.9.15", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.15.tgz", + "integrity": "sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==", "dev": true }, "node_modules/@types/range-parser": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", - "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", + "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/react": { - "version": "18.0.28", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.28.tgz", - "integrity": "sha512-RD0ivG1kEztNBdoAK7lekI9M+azSnitIn85h4iOiaLjaTrMjzslhaqCGaI4IyCJ1RljWiLCEu4jyrLLgqxBTew==", + "version": "18.3.3", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.3.tgz", + "integrity": "sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==", "dependencies": { "@types/prop-types": "*", - "@types/scheduler": "*", "csstype": "^3.0.2" } }, "node_modules/@types/react-dom": { - "version": "18.0.11", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.0.11.tgz", - "integrity": "sha512-O38bPbI2CWtgw/OoQoY+BRelw7uysmXbWvw3nLWO21H1HSh+GOlqPuXshJfjmpNlKiiSDG9cc1JZAaMmVdcTlw==", + "version": "18.3.0", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.0.tgz", + "integrity": "sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==", "devOptional": true, "dependencies": { "@types/react": "*" } }, - "node_modules/@types/react-is": { - "version": "17.0.3", - "resolved": "https://registry.npmjs.org/@types/react-is/-/react-is-17.0.3.tgz", - "integrity": "sha512-aBTIWg1emtu95bLTLx0cpkxwGW3ueZv71nE2YFBpL8k/z5czEW8yYpOo8Dp+UUAFAtKwNaOsh/ioSeQnWlZcfw==", - "dependencies": { - "@types/react": "*" - } - }, "node_modules/@types/react-router": { "version": "5.1.20", "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.20.tgz", @@ -2459,17 +2216,17 @@ } }, "node_modules/@types/react-transition-group": { - "version": "4.4.5", - "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.5.tgz", - "integrity": "sha512-juKD/eiSM3/xZYzjuzH6ZwpP+/lejltmiS3QEzV/vmb/Q8+HfDmxu+Baga8UEMGBqV88Nbg4l2hY/K2DkyaLLA==", + "version": "4.4.10", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.10.tgz", + "integrity": "sha512-hT/+s0VQs2ojCX823m60m5f0sL5idt9SO6Tj6Dg+rdphGPIeJbJ6CxvBYkgkGKrYeDjvIpKTR38UzmtHJOGW3Q==", "dependencies": { "@types/react": "*" } }, "node_modules/@types/responselike": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", - "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", + "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, "dependencies": { "@types/node": "*" @@ -2481,40 +2238,46 @@ "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", "dev": true }, - "node_modules/@types/scheduler": { - "version": "0.16.2", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", - "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==" - }, "node_modules/@types/semver": { - "version": "7.3.13", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", - "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", + "version": "7.5.8", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", + "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", "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, + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, "node_modules/@types/serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==", + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz", + "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==", "dev": true, "dependencies": { "@types/express": "*" } }, "node_modules/@types/serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg==", + "version": "1.15.7", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", + "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", "dev": true, "dependencies": { - "@types/mime": "*", - "@types/node": "*" + "@types/http-errors": "*", + "@types/node": "*", + "@types/send": "*" } }, "node_modules/@types/sockjs": { - "version": "0.3.33", - "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz", - "integrity": "sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==", + "version": "0.3.36", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", + "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", "dev": true, "dependencies": { "@types/node": "*" @@ -2526,18 +2289,18 @@ "integrity": "sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA==" }, "node_modules/@types/ws": { - "version": "8.5.4", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.4.tgz", - "integrity": "sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg==", + "version": "8.5.10", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.10.tgz", + "integrity": "sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==", "dev": true, "dependencies": { "@types/node": "*" } }, "node_modules/@types/yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==", + "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": { @@ -2545,19 +2308,19 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.52.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.52.0.tgz", - "integrity": "sha512-lHazYdvYVsBokwCdKOppvYJKaJ4S41CgKBcPvyd0xjZNbvQdhn/pnJlGtQksQ/NhInzdaeaSarlBjDXHuclEbg==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", + "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.52.0", - "@typescript-eslint/type-utils": "5.52.0", - "@typescript-eslint/utils": "5.52.0", + "@eslint-community/regexpp": "^4.4.0", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/type-utils": "5.62.0", + "@typescript-eslint/utils": "5.62.0", "debug": "^4.3.4", - "grapheme-splitter": "^1.0.4", + "graphemer": "^1.4.0", "ignore": "^5.2.0", "natural-compare-lite": "^1.4.0", - "regexpp": "^3.2.0", "semver": "^7.3.7", "tsutils": "^3.21.0" }, @@ -2579,14 +2342,14 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "5.52.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.52.0.tgz", - "integrity": "sha512-e2KiLQOZRo4Y0D/b+3y08i3jsekoSkOYStROYmPUnGMEoA0h+k2qOH5H6tcjIc68WDvGwH+PaOrP1XRzLJ6QlA==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", + "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.52.0", - "@typescript-eslint/types": "5.52.0", - "@typescript-eslint/typescript-estree": "5.52.0", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", "debug": "^4.3.4" }, "engines": { @@ -2606,13 +2369,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "5.52.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.52.0.tgz", - "integrity": "sha512-AR7sxxfBKiNV0FWBSARxM8DmNxrwgnYMPwmpkC1Pl1n+eT8/I2NAUPuwDy/FmDcC6F8pBfmOcaxcxRHspgOBMw==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", + "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.52.0", - "@typescript-eslint/visitor-keys": "5.52.0" + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -2623,13 +2386,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.52.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.52.0.tgz", - "integrity": "sha512-tEKuUHfDOv852QGlpPtB3lHOoig5pyFQN/cUiZtpw99D93nEBjexRLre5sQZlkMoHry/lZr8qDAt2oAHLKA6Jw==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz", + "integrity": "sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "5.52.0", - "@typescript-eslint/utils": "5.52.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "@typescript-eslint/utils": "5.62.0", "debug": "^4.3.4", "tsutils": "^3.21.0" }, @@ -2650,9 +2413,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "5.52.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.52.0.tgz", - "integrity": "sha512-oV7XU4CHYfBhk78fS7tkum+/Dpgsfi91IIDy7fjCyq2k6KB63M6gMC0YIvy+iABzmXThCRI6xpCEyVObBdWSDQ==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", + "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -2663,13 +2426,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.52.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.52.0.tgz", - "integrity": "sha512-WeWnjanyEwt6+fVrSR0MYgEpUAuROxuAH516WPjUblIrClzYJj0kBbjdnbQXLpgAN8qbEuGywiQsXUVDiAoEuQ==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", + "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.52.0", - "@typescript-eslint/visitor-keys": "5.52.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -2690,18 +2453,18 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "5.52.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.52.0.tgz", - "integrity": "sha512-As3lChhrbwWQLNk2HC8Ree96hldKIqk98EYvypd3It8Q1f8d5zWyIoaZEp2va5667M4ZyE7X8UUR+azXrFl+NA==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", + "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", "dev": true, "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.52.0", - "@typescript-eslint/types": "5.52.0", - "@typescript-eslint/typescript-estree": "5.52.0", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0", "semver": "^7.3.7" }, "engines": { @@ -2716,12 +2479,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.52.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.52.0.tgz", - "integrity": "sha512-qMwpw6SU5VHCPr99y274xhbm+PRViK/NATY6qzt+Et7+mThGuFSl/ompj2/hrBlRP/kq+BFdgagnOSgw9TB0eA==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", + "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.52.0", + "@typescript-eslint/types": "5.62.0", "eslint-visitor-keys": "^3.3.0" }, "engines": { @@ -2732,6 +2495,12 @@ "url": "https://opencollective.com/typescript-eslint" } }, + "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/@vercel/webpack-asset-relocator-loader": { "version": "1.7.3", "resolved": "https://registry.npmjs.org/@vercel/webpack-asset-relocator-loader/-/webpack-asset-relocator-loader-1.7.3.tgz", @@ -2742,151 +2511,160 @@ } }, "node_modules/@webassemblyjs/ast": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", - "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", + "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", "dev": true, "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1" + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" } }, "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", - "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", "dev": true }, "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", - "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", "dev": true }, "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", - "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", + "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==", "dev": true }, "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", - "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", "dev": true, "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", - "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", "dev": true }, "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", - "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", + "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1" + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.12.1" } }, "node_modules/@webassemblyjs/ieee754": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", - "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", "dev": true, "dependencies": { "@xtuc/ieee754": "^1.2.0" } }, "node_modules/@webassemblyjs/leb128": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", - "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", "dev": true, "dependencies": { "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/utf8": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", - "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", "dev": true }, "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", - "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz", + "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/helper-wasm-section": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-opt": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "@webassemblyjs/wast-printer": "1.11.1" + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-opt": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1", + "@webassemblyjs/wast-printer": "1.12.1" } }, "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", - "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz", + "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" } }, "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", - "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz", + "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1" + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1" } }, "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", - "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz", + "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" } }, "node_modules/@webassemblyjs/wast-printer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", - "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz", + "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/ast": "1.12.1", "@xtuc/long": "4.2.2" } }, + "node_modules/@xmldom/xmldom": { + "version": "0.8.10", + "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.10.tgz", + "integrity": "sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==", + "dev": true, + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/@xtuc/ieee754": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", @@ -2919,9 +2697,9 @@ } }, "node_modules/acorn": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", - "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -2931,9 +2709,9 @@ } }, "node_modules/acorn-import-assertions": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", - "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", "dev": true, "peerDependencies": { "acorn": "^8" @@ -2949,9 +2727,9 @@ } }, "node_modules/acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", + "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", "dev": true, "engines": { "node": ">=0.4.0" @@ -2970,28 +2748,17 @@ } }, "node_modules/agentkeepalive": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.2.1.tgz", - "integrity": "sha512-Zn4cw2NEqd+9fiSVWMscnjyQ1a8Yfoc5oBajLeo5w+YBHgDUcEBY2hS4YpTz6iN5f/2zQiktcuM6tS8x1p9dpA==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz", + "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==", "dev": true, "dependencies": { - "debug": "^4.1.0", - "depd": "^1.1.2", "humanize-ms": "^1.2.1" }, "engines": { "node": ">= 8.0.0" } }, - "node_modules/agentkeepalive/node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/aggregate-error": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", @@ -3006,14 +2773,14 @@ } }, "node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.16.0.tgz", + "integrity": "sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw==", "dependencies": { - "fast-deep-equal": "^3.1.1", + "fast-deep-equal": "^3.1.3", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "uri-js": "^4.4.1" }, "funding": { "type": "github", @@ -3036,6 +2803,18 @@ } } }, + "node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, "node_modules/ansi-escapes": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", @@ -3077,201 +2856,68 @@ }, "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==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/any-base": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/any-base/-/any-base-1.1.0.tgz", - "integrity": "sha512-uMgjozySS8adZZYePpaWs8cxB9/kdzmpX6SgJZ+wbz1K5eYk5QMYDVJaZKhxyIHUdnnJkfR7SVgStgH7LkGUyg==" - }, - "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/appdmg": { - "version": "0.6.6", - "resolved": "https://registry.npmjs.org/appdmg/-/appdmg-0.6.6.tgz", - "integrity": "sha512-GRmFKlCG+PWbcYF4LUNonTYmy0GjguDy6Jh9WP8mpd0T6j80XIJyXBiWlD0U+MLNhqV9Nhx49Gl9GpVToulpLg==", - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "dependencies": { - "async": "^1.4.2", - "ds-store": "^0.1.5", - "execa": "^1.0.0", - "fs-temp": "^1.0.0", - "fs-xattr": "^0.3.0", - "image-size": "^0.7.4", - "is-my-json-valid": "^2.20.0", - "minimist": "^1.1.3", - "parse-color": "^1.0.0", - "path-exists": "^4.0.0", - "repeat-string": "^1.5.4" - }, - "bin": { - "appdmg": "bin/appdmg.js" - }, - "engines": { - "node": ">=8.5" - } - }, - "node_modules/appdmg/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==", - "dev": true, - "optional": true, - "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" - } - }, - "node_modules/appdmg/node_modules/execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "dev": true, - "optional": true, - "dependencies": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/appdmg/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==", - "dev": true, - "optional": true, - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/appdmg/node_modules/is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/appdmg/node_modules/npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", - "dev": true, - "optional": true, - "dependencies": { - "path-key": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/appdmg/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==", - "dev": true, - "optional": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/appdmg/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, - "optional": true, - "bin": { - "semver": "bin/semver" + "engines": { + "node": ">=8" } }, - "node_modules/appdmg/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/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, - "optional": true, "dependencies": { - "shebang-regex": "^1.0.0" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/appdmg/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/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, - "optional": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 8" } }, - "node_modules/appdmg/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "node_modules/appdmg": { + "version": "0.6.6", + "resolved": "https://registry.npmjs.org/appdmg/-/appdmg-0.6.6.tgz", + "integrity": "sha512-GRmFKlCG+PWbcYF4LUNonTYmy0GjguDy6Jh9WP8mpd0T6j80XIJyXBiWlD0U+MLNhqV9Nhx49Gl9GpVToulpLg==", "dev": true, "optional": true, + "os": [ + "darwin" + ], "dependencies": { - "isexe": "^2.0.0" + "async": "^1.4.2", + "ds-store": "^0.1.5", + "execa": "^1.0.0", + "fs-temp": "^1.0.0", + "fs-xattr": "^0.3.0", + "image-size": "^0.7.4", + "is-my-json-valid": "^2.20.0", + "minimist": "^1.1.3", + "parse-color": "^1.0.0", + "path-exists": "^4.0.0", + "repeat-string": "^1.5.4" }, "bin": { - "which": "bin/which" + "appdmg": "bin/appdmg.js" + }, + "engines": { + "node": ">=8.5" } }, "node_modules/aproba": { @@ -3284,6 +2930,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", + "deprecated": "This package is no longer supported.", "dev": true, "dependencies": { "delegates": "^1.0.0", @@ -3304,6 +2951,22 @@ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", @@ -3311,15 +2974,16 @@ "dev": true }, "node_modules/array-includes": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", - "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", + "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "get-intrinsic": "^1.1.3", + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", "is-string": "^1.0.7" }, "engines": { @@ -3338,15 +3002,35 @@ "node": ">=8" } }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", + "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/array.prototype.flat": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", - "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", + "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.1.4", - "es-abstract": "^1.20.4", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", "es-shim-unscopables": "^1.0.0" }, "engines": { @@ -3357,14 +3041,14 @@ } }, "node_modules/array.prototype.flatmap": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", - "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", + "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.1.4", - "es-abstract": "^1.20.4", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", "es-shim-unscopables": "^1.0.0" }, "engines": { @@ -3374,6 +3058,28 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", + "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.2.1", + "get-intrinsic": "^1.2.3", + "is-array-buffer": "^3.0.4", + "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/asar": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/asar/-/asar-3.2.0.tgz", @@ -3397,6 +3103,16 @@ "@types/glob": "^7.1.1" } }, + "node_modules/asar/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, + "optional": true, + "engines": { + "node": ">= 6" + } + }, "node_modules/astral-regex": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", @@ -3440,10 +3156,13 @@ } }, "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==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", "dev": true, + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, "engines": { "node": ">= 0.4" }, @@ -3485,6 +3204,7 @@ "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", @@ -3516,12 +3236,15 @@ } }, "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==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", "dev": true, "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/bl": { @@ -3541,19 +3264,14 @@ "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", "dev": true }, - "node_modules/bmp-js": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/bmp-js/-/bmp-js-0.1.0.tgz", - "integrity": "sha512-vHdS19CnY3hwiNdkaqk93DvjVLfbEcI8mys4UjuWrlX1haDmroo8o4xCzh4wD6DGV6HxRCyauwhHRqMTfERtjw==" - }, "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==", + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", + "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", "dev": true, "dependencies": { "bytes": "3.1.2", - "content-type": "~1.0.4", + "content-type": "~1.0.5", "debug": "2.6.9", "depd": "2.0.0", "destroy": "1.2.0", @@ -3561,7 +3279,7 @@ "iconv-lite": "0.4.24", "on-finished": "2.4.1", "qs": "6.11.0", - "raw-body": "2.5.1", + "raw-body": "2.5.2", "type-is": "~1.6.18", "unpipe": "1.0.0" }, @@ -3586,23 +3304,15 @@ "dev": true }, "node_modules/bonjour-service": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.1.0.tgz", - "integrity": "sha512-LVRinRB3k1/K0XzZ2p58COnWvkQknIY6sf0zF2rpErvcJXpMBttEPQSxK+HEXSS9VmpZlDoDnQWv8ftJT20B0Q==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.2.1.tgz", + "integrity": "sha512-oSzCS2zV14bh2kji6vNe7vrpJYCHGvcZnlffFQ1MEoX/WOeQ/teD8SYWKR942OI3INjq8OMNJlbPK5LLLUxFDw==", "dev": true, "dependencies": { - "array-flatten": "^2.1.2", - "dns-equal": "^1.0.0", "fast-deep-equal": "^3.1.3", "multicast-dns": "^7.2.5" } }, - "node_modules/bonjour-service/node_modules/array-flatten": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", - "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", - "dev": true - }, "node_modules/boolbase": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", @@ -3637,21 +3347,21 @@ } }, "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, "dependencies": { - "fill-range": "^7.0.1" + "fill-range": "^7.1.1" }, "engines": { "node": ">=8" } }, "node_modules/browserslist": { - "version": "4.21.5", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", - "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", + "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", "dev": true, "funding": [ { @@ -3661,13 +3371,17 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "dependencies": { - "caniuse-lite": "^1.0.30001449", - "electron-to-chromium": "^1.4.284", - "node-releases": "^2.0.8", - "update-browserslist-db": "^1.0.10" + "caniuse-lite": "^1.0.30001587", + "electron-to-chromium": "^1.4.668", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.13" }, "bin": { "browserslist": "cli.js" @@ -3680,6 +3394,7 @@ "version": "5.7.1", "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, "funding": [ { "type": "github", @@ -3777,6 +3492,7 @@ "version": "8.1.0", "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "dependencies": { "fs.realpath": "^1.0.0", @@ -3814,9 +3530,9 @@ } }, "node_modules/cacheable-request": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz", - "integrity": "sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==", + "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, "dependencies": { "clone-response": "^1.0.2", @@ -3831,14 +3547,35 @@ "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==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", "dev": true, "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -3862,20 +3599,10 @@ "tslib": "^2.0.3" } }, - "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "optional": true, - "engines": { - "node": ">=6" - } - }, "node_modules/caniuse-lite": { - "version": "1.0.30001452", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001452.tgz", - "integrity": "sha512-Lkp0vFjMkBB3GTpLR8zk4NwW5EdRdnitwYJHDOOKIU85x4ckYCPQ+9WlVvSVClHxVReefkUMtWZH2l9KGlD51w==", + "version": "1.0.30001628", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001628.tgz", + "integrity": "sha512-S3BnR4Kh26TBxbi5t5kpbcUlLJb9lhtDXISDPwOfI+JoC+ik0QksvkZtUVyikw3hjnkgkMPSJ8oIM9yMm9vflA==", "dev": true, "funding": [ { @@ -3885,6 +3612,10 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ] }, @@ -3905,16 +3636,10 @@ } }, "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -3927,6 +3652,9 @@ "engines": { "node": ">= 8.10.0" }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, "optionalDependencies": { "fsevents": "~2.3.2" } @@ -3953,9 +3681,9 @@ } }, "node_modules/chrome-trace-event": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", - "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", + "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", "dev": true, "engines": { "node": ">=6.0" @@ -3965,12 +3693,13 @@ "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 + "dev": true, + "optional": true }, "node_modules/clean-css": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.2.tgz", - "integrity": "sha512-JVJbM+f3d3Q704rF4bqQ5UUyTtuJ0JRKNbTKVEeujCCBoMdkEi+V+e8oktO9qGQNSvHrFTM6JZRXrUvGR1czww==", + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz", + "integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==", "dev": true, "dependencies": { "source-map": "~0.6.0" @@ -3979,6 +3708,15 @@ "node": ">= 10.0" } }, + "node_modules/clean-css/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/clean-stack": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", @@ -4001,9 +3739,9 @@ } }, "node_modules/cli-spinners": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.7.0.tgz", - "integrity": "sha512-qu3pN8Y3qHNgE2AFweciB1IfMnmZ/fsNTEE+NOFjmGB2F/7rLhnhzppvpCnN4FovtP26k8lHyy9ptEbNwWFLzw==", + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", "dev": true, "engines": { "node": ">=6" @@ -4078,9 +3816,9 @@ } }, "node_modules/clsx": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", - "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", "engines": { "node": ">=6" } @@ -4113,15 +3851,15 @@ } }, "node_modules/colorette": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", - "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", "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==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", "dev": true, "engines": { "node": ">= 6" @@ -4267,9 +4005,9 @@ "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" }, "node_modules/cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", "dev": true, "engines": { "node": ">= 0.6" @@ -4315,6 +4053,13 @@ "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", "dev": true }, + "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, + "optional": true + }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -4376,9 +4121,9 @@ } }, "node_modules/cross-zip": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cross-zip/-/cross-zip-4.0.0.tgz", - "integrity": "sha512-MEzGfZo0rqE10O/B+AEcCSJLZsrWuRUvmqJTqHNqBtALhaJc3E3ixLGLJNTRzEA2K34wbmOHC4fwYs9sVsdcCA==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cross-zip/-/cross-zip-4.0.1.tgz", + "integrity": "sha512-n63i0lZ0rvQ6FXiGQ+/JFCKAUyPFhLQYJIqKaa+tSJtfKeULF/IDNDAbdnSIxgS4NTuw2b0+lj8LzfITuq+ZxQ==", "dev": true, "funding": [ { @@ -4399,19 +4144,19 @@ } }, "node_modules/css-loader": { - "version": "6.7.3", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.7.3.tgz", - "integrity": "sha512-qhOH1KlBMnZP8FzRO6YCH9UHXQhVMcEGLyNdb7Hv2cpcmJbW0YrddO+tG1ab5nT41KpHIYGsbeHqxB9xPu1pKQ==", + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.11.0.tgz", + "integrity": "sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==", "dev": true, "dependencies": { "icss-utils": "^5.1.0", - "postcss": "^8.4.19", - "postcss-modules-extract-imports": "^3.0.0", - "postcss-modules-local-by-default": "^4.0.0", - "postcss-modules-scope": "^3.0.0", + "postcss": "^8.4.33", + "postcss-modules-extract-imports": "^3.1.0", + "postcss-modules-local-by-default": "^4.0.5", + "postcss-modules-scope": "^3.2.0", "postcss-modules-values": "^4.0.0", "postcss-value-parser": "^4.2.0", - "semver": "^7.3.8" + "semver": "^7.5.4" }, "engines": { "node": ">= 12.13.0" @@ -4421,7 +4166,16 @@ "url": "https://opencollective.com/webpack" }, "peerDependencies": { + "@rspack/core": "0.x || 1.x", "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } } }, "node_modules/css-select": { @@ -4465,43 +4219,84 @@ } }, "node_modules/csstype": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz", - "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==" + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" }, - "node_modules/dayjs": { - "version": "1.11.7", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.7.tgz", - "integrity": "sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ==", - "peer": true + "node_modules/data-view-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", + "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "node_modules/debounce-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/debounce-fn/-/debounce-fn-4.0.0.tgz", - "integrity": "sha512-8pYCQiL9Xdcg0UPSD3d+0KMlOjp+KGU5EPwYddgzQ7DATsg4fuUDjQtsYLmWjnk2obnNHgV3vE2Y4jejSOJVBQ==", + "node_modules/data-view-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", + "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", + "dev": true, "dependencies": { - "mimic-fn": "^3.0.0" + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" }, "engines": { - "node": ">=10" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/debounce-fn/node_modules/mimic-fn": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-3.1.0.tgz", - "integrity": "sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==", + "node_modules/data-view-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", + "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/dayjs": { + "version": "1.10.7", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.10.7.tgz", + "integrity": "sha512-P6twpd70BcPK34K26uJ1KT3wlhpuOAPoMwJzpsIWUxHZ7wpmbdZL/hQqBDfz7hGurYSa5PhzdhDHtt319hL3ig==" + }, + "node_modules/debounce-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/debounce-fn/-/debounce-fn-4.0.0.tgz", + "integrity": "sha512-8pYCQiL9Xdcg0UPSD3d+0KMlOjp+KGU5EPwYddgzQ7DATsg4fuUDjQtsYLmWjnk2obnNHgV3vE2Y4jejSOJVBQ==", + "dependencies": { + "mimic-fn": "^3.0.0" + }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", + "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", "dependencies": { "ms": "2.1.2" }, @@ -4514,16 +4309,6 @@ } } }, - "node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/decompress-response": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", @@ -4558,9 +4343,9 @@ "dev": true }, "node_modules/deepmerge": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.0.tgz", - "integrity": "sha512-z2wJZXrmeHdvYJp/Ux55wIjqo81G5Bp4c+oELTW+7ar6SogWHajt5a9gO3s3IDaGSAXjDk0vlQKN3rms8ab3og==", + "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==", "dev": true, "engines": { "node": ">=0.10.0" @@ -4578,6 +4363,65 @@ "node": ">= 10" } }, + "node_modules/default-gateway/node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/default-gateway/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/default-gateway/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==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-gateway/node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/defaults": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", @@ -4599,6 +4443,23 @@ "node": ">=10" } }, + "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, + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/define-lazy-prop": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", @@ -4609,11 +4470,12 @@ } }, "node_modules/define-properties": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", - "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dev": true, "dependencies": { + "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" }, @@ -4650,9 +4512,9 @@ } }, "node_modules/detect-libc": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", - "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", + "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", "dev": true, "engines": { "node": ">=8" @@ -4695,16 +4557,10 @@ "node": ">=8" } }, - "node_modules/dns-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", - "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==", - "dev": true - }, "node_modules/dns-packet": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.4.0.tgz", - "integrity": "sha512-EgqGeaBB8hLiHLZtp/IbaDQTL8pZ0+IvwzSHA6d7VyMDM+B9hgddEMa9xjK5oYnw0ci0JQ6g2XCD7/f6cafU6g==", + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", + "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", "dev": true, "dependencies": { "@leichtgewicht/ip-codec": "^2.0.1" @@ -4757,11 +4613,6 @@ "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" } }, - "node_modules/dom-walk": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz", - "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==" - }, "node_modules/domelementtype": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", @@ -4846,14 +4697,14 @@ "dev": true }, "node_modules/electron": { - "version": "22.0.0", - "resolved": "https://registry.npmjs.org/electron/-/electron-22.0.0.tgz", - "integrity": "sha512-cgRc4wjyM+81A0E8UGv1HNJjL1HBI5cWNh/DUIjzYvoUuiEM0SS0hAH/zaFQ18xOz2ced6Yih8SybpOiOYJhdg==", + "version": "26.6.10", + "resolved": "https://registry.npmjs.org/electron/-/electron-26.6.10.tgz", + "integrity": "sha512-pV2SD0RXzAiNRb/2yZrsVmVkBOMrf+DVsPulIgRjlL0+My9BL5spFuhHVMQO9yHl9tFpWtuRpQv0ofM/i9P8xg==", "dev": true, "hasInstallScript": true, "dependencies": { "@electron/get": "^2.0.0", - "@types/node": "^16.11.26", + "@types/node": "^18.11.18", "extract-zip": "^2.0.1" }, "bin": { @@ -4930,9 +4781,9 @@ } }, "node_modules/electron-installer-debian": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/electron-installer-debian/-/electron-installer-debian-3.1.0.tgz", - "integrity": "sha512-k6KChvx0Fw8XTlCqwwbBfh19yGQaKjGdbugokmr1IpzINOm4QFyACKMTHAYFHW5LCBUZQShZD96hwxUZ+8Kx+w==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/electron-installer-debian/-/electron-installer-debian-3.2.0.tgz", + "integrity": "sha512-58ZrlJ1HQY80VucsEIG9tQ//HrTlG6sfofA3nRGr6TmkX661uJyu4cMPPh6kXW+aHdq/7+q25KyQhDrXvRL7jw==", "dev": true, "optional": true, "os": [ @@ -4947,7 +4798,7 @@ "get-folder-size": "^2.0.1", "lodash": "^4.17.4", "word-wrap": "^1.2.3", - "yargs": "^15.0.1" + "yargs": "^16.0.2" }, "bin": { "electron-installer-debian": "src/cli.js" @@ -4980,29 +4831,15 @@ } }, "node_modules/electron-installer-debian/node_modules/cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", "dev": true, "optional": true, "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "node_modules/electron-installer-debian/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==", - "dev": true, - "optional": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" + "wrap-ansi": "^7.0.0" } }, "node_modules/electron-installer-debian/node_modules/fs-extra": { @@ -5021,105 +4858,33 @@ "node": ">=10" } }, - "node_modules/electron-installer-debian/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==", - "dev": true, - "optional": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/electron-installer-debian/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, - "optional": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/electron-installer-debian/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==", - "dev": true, - "optional": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/electron-installer-debian/node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "optional": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/electron-installer-debian/node_modules/y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true, - "optional": true - }, "node_modules/electron-installer-debian/node_modules/yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", "dev": true, "optional": true, "dependencies": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" }, "engines": { - "node": ">=8" + "node": ">=10" } }, "node_modules/electron-installer-debian/node_modules/yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", "dev": true, "optional": true, - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - }, "engines": { - "node": ">=6" + "node": ">=10" } }, "node_modules/electron-installer-dmg": { @@ -5143,9 +4908,9 @@ } }, "node_modules/electron-installer-redhat": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/electron-installer-redhat/-/electron-installer-redhat-3.3.0.tgz", - "integrity": "sha512-hXIXB3uQXmXZy/v3MpbwWN4Of28ALpPt9ZyUDNEoSe0w7QZceL9IqI2K6Q6imiBJCLRC0hmT94WhlKj1RyGOWg==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/electron-installer-redhat/-/electron-installer-redhat-3.4.0.tgz", + "integrity": "sha512-gEISr3U32Sgtj+fjxUAlSDo3wyGGq6OBx7rF5UdpIgbnpUvMN4W5uYb0ThpnAZ42VEJh/3aODQXHbFS4f5J3Iw==", "dev": true, "optional": true, "os": [ @@ -5248,10 +5013,19 @@ "node": ">=10" } }, + "node_modules/electron-log": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/electron-log/-/electron-log-5.1.5.tgz", + "integrity": "sha512-vuq10faUAxRbILgQx7yHoMObKZDEfj7hMSZrJPsVrDNeCpV/HN11dU7QuY4UDUe055pzBxhSCB3m0+6D3Aktjw==", + "engines": { + "node": ">= 14" + } + }, "node_modules/electron-packager": { "version": "17.1.2", "resolved": "https://registry.npmjs.org/electron-packager/-/electron-packager-17.1.2.tgz", "integrity": "sha512-XofXdikjYI7MVBcnXeoOvRR+yFFFHOLs3J7PF5KYQweigtgLshcH4W660PsvHr4lYZ03JBpLyEcUB8DzHZ+BNw==", + "deprecated": "Please use @electron/packager moving forward. There is no API change, just a package name change", "dev": true, "dependencies": { "@electron/asar": "^3.2.1", @@ -5285,9 +5059,9 @@ } }, "node_modules/electron-packager/node_modules/fs-extra": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz", - "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==", + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", "dev": true, "dependencies": { "graceful-fs": "^4.2.0", @@ -5299,18 +5073,18 @@ } }, "node_modules/electron-playwright-helpers": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/electron-playwright-helpers/-/electron-playwright-helpers-1.6.0.tgz", - "integrity": "sha512-0csyp77xRAi8m5g1ApcYdTMJ8n0+Geyb4huyMAsIYTInk4wsuUTHmIy2gMfgF3I130ogfpX6ZfEGeffS93FaUA==", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/electron-playwright-helpers/-/electron-playwright-helpers-1.7.1.tgz", + "integrity": "sha512-S9mo7LfpERgub2WIuYVPpib4XKFeAqBP+mxYf5Bv7E0B5GUB+LUbSj6Fpu39h18Ar635Nf9nQYTmypjuvaYJng==", "dev": true, "dependencies": { "@electron/asar": "^3.2.4" } }, "node_modules/electron-squirrel-startup": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/electron-squirrel-startup/-/electron-squirrel-startup-1.0.0.tgz", - "integrity": "sha512-Oce8mvgGdFmwr+DsAcXBmFK8jFfN6yaFAP9IvyhTfupM3nFkBku/7VS/mdtJteWumImkC6P+BKGsxScoDDkv9Q==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/electron-squirrel-startup/-/electron-squirrel-startup-1.0.1.tgz", + "integrity": "sha512-sTfFIHGku+7PsHLJ7v0dRcZNkALrV+YEozINTW8X1nM//e5O3L+rfYuvSW00lmGHnYmUjARZulD8F2V8ISI9RA==", "dependencies": { "debug": "^2.2.0" } @@ -5329,9 +5103,9 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, "node_modules/electron-store": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/electron-store/-/electron-store-8.1.0.tgz", - "integrity": "sha512-2clHg/juMjOH0GT9cQ6qtmIvK183B39ZXR0bUoPwKwYHJsEF3quqyDzMFUAu+0OP8ijmN2CbPRAelhNbWUbzwA==", + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/electron-store/-/electron-store-8.2.0.tgz", + "integrity": "sha512-ukLL5Bevdil6oieAOXz3CMy+OgaItMiVBg701MNlG6W5RaC0AHN7rvlqTCmeb6O7jP0Qa1KKYTE0xV0xbhF4Hw==", "dependencies": { "conf": "^10.2.0", "type-fest": "^2.17.0" @@ -5340,27 +5114,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/electron-store/node_modules/type-fest": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", - "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/electron-to-chromium": { - "version": "1.4.297", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.297.tgz", - "integrity": "sha512-dTXLXBdzfDYnZYq+bLer21HrFsEkzlR2OSIOsR+qroDmhmQU3i4T4KdY0Lcp83ZId3HnWTpPAEfhaJtVxmS/dQ==", + "version": "1.4.790", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.790.tgz", + "integrity": "sha512-eVGeQxpaBYbomDBa/Mehrs28MdvCXfJmEFzaMFsv8jH/MJDLIylJN81eTJ5kvx7B7p18OiPK0BkC06lydEy63A==", "dev": true }, "node_modules/electron-winstaller": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/electron-winstaller/-/electron-winstaller-5.1.0.tgz", - "integrity": "sha512-4wlZzkUm5cJNiOtp5wL804+QpygdKTKkrZJXA3sSDEI2XnCVPv0kxmxUvVw4KHBwbNS+Yox89agEr+VkR7kxww==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/electron-winstaller/-/electron-winstaller-5.3.1.tgz", + "integrity": "sha512-oM8BW3a8NEqG0XW+Vx3xywhk0DyDV4T0jT0zZfWt0IczNT3jHAAvQWBorF8osQDplSsCyXXyxrsrQ8cY0Slb/A==", "dev": true, "hasInstallScript": true, "optional": true, @@ -5368,11 +5131,14 @@ "@electron/asar": "^3.2.1", "debug": "^4.1.1", "fs-extra": "^7.0.1", - "lodash.template": "^4.2.2", + "lodash": "^4.17.21", "temp": "^0.9.0" }, "engines": { "node": ">=8.0.0" + }, + "optionalDependencies": { + "@electron/windows-sign": "^1.1.2" } }, "node_modules/electron-winstaller/node_modules/fs-extra": { @@ -5411,10 +5177,13 @@ } }, "node_modules/electron/node_modules/@types/node": { - "version": "16.18.12", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.12.tgz", - "integrity": "sha512-vzLe5NaNMjIE3mcddFVGlAXN1LEWueUsMsOJWaT6wWMJGyljHAWHznqfnKUQWGzu7TLPrGvWdNAsvQYW+C0xtw==", - "dev": true + "version": "18.19.34", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.34.tgz", + "integrity": "sha512-eXF4pfBNV5DAMKGbI02NnDtWrQ40hAN558/2vvS4gMpMIxaf6JmD7YjnZbq0Q9TDSSkKBamime8ewRoomHdt4g==", + "dev": true, + "dependencies": { + "undici-types": "~5.26.4" + } }, "node_modules/emoji-regex": { "version": "8.0.0", @@ -5451,6 +5220,7 @@ "version": "0.1.13", "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "dev": true, "optional": true, "dependencies": { "iconv-lite": "^0.6.2" @@ -5460,6 +5230,7 @@ "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" @@ -5478,9 +5249,9 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.12.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz", - "integrity": "sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ==", + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.0.tgz", + "integrity": "sha512-dwDPwZL0dmye8Txp2gzFmA6sxALaSvdRDjPH0viLcKrtlOL3tw62nWWweVD1SdILDTJrbrL6tdWVN58Wo6U3eA==", "dev": true, "dependencies": { "graceful-fs": "^4.2.4", @@ -5522,44 +5293,57 @@ } }, "node_modules/es-abstract": { - "version": "1.21.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.1.tgz", - "integrity": "sha512-QudMsPOz86xYz/1dG1OuGBKOELjCh99IIWHLzy5znUB6j8xG2yMA7bfTV86VSqKF+Y/H08vQPR+9jyXpuC6hfg==", - "dev": true, - "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "es-set-tostringtag": "^2.0.1", + "version": "1.23.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", + "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.3", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "data-view-buffer": "^1.0.1", + "data-view-byte-length": "^1.0.1", + "data-view-byte-offset": "^1.0.0", + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-set-tostringtag": "^2.0.3", "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.1.3", - "get-symbol-description": "^1.0.0", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.4", + "get-symbol-description": "^1.0.2", "globalthis": "^1.0.3", "gopd": "^1.0.1", - "has": "^1.0.3", - "has-property-descriptors": "^1.0.0", - "has-proto": "^1.0.1", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", "has-symbols": "^1.0.3", - "internal-slot": "^1.0.4", - "is-array-buffer": "^3.0.1", + "hasown": "^2.0.2", + "internal-slot": "^1.0.7", + "is-array-buffer": "^3.0.4", "is-callable": "^1.2.7", - "is-negative-zero": "^2.0.2", + "is-data-view": "^1.0.1", + "is-negative-zero": "^2.0.3", "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", + "is-shared-array-buffer": "^1.0.3", "is-string": "^1.0.7", - "is-typed-array": "^1.1.10", + "is-typed-array": "^1.1.13", "is-weakref": "^1.0.2", - "object-inspect": "^1.12.2", + "object-inspect": "^1.13.1", "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.4.3", - "safe-regex-test": "^1.0.0", - "string.prototype.trimend": "^1.0.6", - "string.prototype.trimstart": "^1.0.6", - "typed-array-length": "^1.0.4", + "object.assign": "^4.1.5", + "regexp.prototype.flags": "^1.5.2", + "safe-array-concat": "^1.1.2", + "safe-regex-test": "^1.0.3", + "string.prototype.trim": "^1.2.9", + "string.prototype.trimend": "^1.0.8", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.2", + "typed-array-byte-length": "^1.0.1", + "typed-array-byte-offset": "^1.0.2", + "typed-array-length": "^1.0.6", "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.9" + "which-typed-array": "^1.1.15" }, "engines": { "node": ">= 0.4" @@ -5568,33 +5352,66 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "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, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/es-module-lexer": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", - "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.3.tgz", + "integrity": "sha512-i1gCgmR9dCl6Vil6UKPI/trA69s08g/syhiDK9TG0Nf1RJjjFI+AzoWW7sPufzkgYAn861skuCwJa0pIIHYxvg==", "dev": true }, + "node_modules/es-object-atoms": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", + "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/es-set-tostringtag": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", - "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", "dev": true, "dependencies": { - "get-intrinsic": "^1.1.3", - "has": "^1.0.3", - "has-tostringtag": "^1.0.0" + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" }, "engines": { "node": ">= 0.4" } }, "node_modules/es-shim-unscopables": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", - "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "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": { - "has": "^1.0.3" + "hasown": "^2.0.0" } }, "node_modules/es-to-primitive": { @@ -5622,9 +5439,9 @@ "optional": true }, "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", "dev": true, "engines": { "node": ">=6" @@ -5648,49 +5465,48 @@ } }, "node_modules/eslint": { - "version": "8.34.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.34.0.tgz", - "integrity": "sha512-1Z8iFsucw+7kSqXNZVslXS8Ioa4u2KM7GPwuKtkTFAqZ/cHMcEaR+1+Br0wLlot49cNxIiZk5wp8EAbPcYZxTg==", + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", + "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", "dev": true, "dependencies": { - "@eslint/eslintrc": "^1.4.1", - "@humanwhocodes/config-array": "^0.11.8", + "@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", - "ajv": "^6.10.0", + "@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.1.1", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.4.0", - "esquery": "^1.4.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", - "grapheme-splitter": "^1.0.4", + "graphemer": "^1.4.0", "ignore": "^5.2.0", - "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "is-path-inside": "^3.0.3", - "js-sdsl": "^4.1.4", "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.1", - "regexpp": "^3.2.0", + "optionator": "^0.9.3", "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", "text-table": "^0.2.0" }, "bin": { @@ -5704,14 +5520,14 @@ } }, "node_modules/eslint-import-resolver-node": { - "version": "0.3.7", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz", - "integrity": "sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==", + "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.11.0", - "resolve": "^1.22.1" + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" } }, "node_modules/eslint-import-resolver-node/node_modules/debug": { @@ -5724,9 +5540,9 @@ } }, "node_modules/eslint-module-utils": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz", - "integrity": "sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==", + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz", + "integrity": "sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==", "dev": true, "dependencies": { "debug": "^3.2.7" @@ -5759,26 +5575,28 @@ } }, "node_modules/eslint-plugin-import": { - "version": "2.27.5", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz", - "integrity": "sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==", + "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.6", - "array.prototype.flat": "^1.3.1", - "array.prototype.flatmap": "^1.3.1", + "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.7", - "eslint-module-utils": "^2.7.4", - "has": "^1.0.3", - "is-core-module": "^2.11.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.values": "^1.1.6", - "resolve": "^1.22.1", - "semver": "^6.3.0", - "tsconfig-paths": "^3.14.1" + "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" @@ -5809,9 +5627,9 @@ } }, "node_modules/eslint-plugin-import/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "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" @@ -5830,40 +5648,16 @@ "node": ">=8.0.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-utils/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-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "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/ajv": { @@ -5883,9 +5677,9 @@ } }, "node_modules/eslint/node_modules/eslint-scope": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "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", @@ -5893,6 +5687,9 @@ }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/eslint/node_modules/estraverse": { @@ -5904,21 +5701,48 @@ "node": ">=4.0" } }, + "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/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/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/espree": { - "version": "9.4.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.1.tgz", - "integrity": "sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==", + "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.8.0", + "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.3.0" + "eslint-visitor-keys": "^3.4.1" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -5928,9 +5752,9 @@ } }, "node_modules/esquery": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", - "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "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" @@ -6012,44 +5836,89 @@ } }, "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", "dev": true, "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" }, "engines": { - "node": ">=10" + "node": ">=6" + } + }, + "node_modules/execa/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==", + "dev": true, + "dependencies": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" + "engines": { + "node": ">=4.8" } }, - "node_modules/execa/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==", + "node_modules/execa/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==", "dev": true, "engines": { - "node": ">=10" + "node": ">=4" + } + }, + "node_modules/execa/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/execa/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==", + "dev": true, + "dependencies": { + "shebang-regex": "^1.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/execa/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==", + "dev": true, + "engines": { + "node": ">=0.10.0" } }, - "node_modules/exif-parser": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/exif-parser/-/exif-parser-0.1.12.tgz", - "integrity": "sha512-c2bQfLNbMzLPmzQuOr8fy0csy84WmwnER81W88DzTp9CYNPJ6yzOj2EZAh9pywYpqHnshVLHQJ8WzldAyfY+Iw==" + "node_modules/execa/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/expand-tilde": { "version": "2.0.2", @@ -6063,18 +5932,24 @@ "node": ">=0.10.0" } }, + "node_modules/exponential-backoff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", + "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==", + "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==", + "version": "4.19.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", + "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", "dev": true, "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.20.1", + "body-parser": "1.20.2", "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.5.0", + "cookie": "0.6.0", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "2.0.0", @@ -6155,15 +6030,30 @@ "@types/yauzl": "^2.9.1" } }, + "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==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "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==" }, "node_modules/fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", @@ -6201,9 +6091,9 @@ "dev": true }, "node_modules/fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", "dev": true, "dependencies": { "reusify": "^1.0.4" @@ -6262,22 +6152,6 @@ "webpack": "^4.0.0 || ^5.0.0" } }, - "node_modules/file-type": { - "version": "16.5.4", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-16.5.4.tgz", - "integrity": "sha512-/yFHK0aGjFEgDJjEKP0pWCplsPFPhwyfwevf/pVxiN0tmE4L9LmwWxWukdJSHdoCli4VgQLehjJtwQBnqmsKcw==", - "dependencies": { - "readable-web-to-node-stream": "^3.0.0", - "strtok3": "^6.2.4", - "token-types": "^4.1.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/file-type?sponsor=1" - } - }, "node_modules/filename-reserved-regex": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz", @@ -6305,9 +6179,9 @@ } }, "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==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, "dependencies": { "to-regex-range": "^5.0.1" @@ -6379,12 +6253,13 @@ } }, "node_modules/flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "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.1.0", + "flatted": "^3.2.9", + "keyv": "^4.5.3", "rimraf": "^3.0.2" }, "engines": { @@ -6392,9 +6267,9 @@ } }, "node_modules/flatted": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", "dev": true }, "node_modules/flora-colossus": { @@ -6421,9 +6296,9 @@ } }, "node_modules/follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", "dev": true, "funding": [ { @@ -6528,9 +6403,9 @@ } }, "node_modules/fs-monkey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", - "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.6.tgz", + "integrity": "sha512-b1FMfwetIKymC0eioW7mTywihSQE4oLzQn1dB6rZB5fx/3NpNEdAWeCSMB+60/AeT0TCXsxzAlcYVEFCTAksWg==", "dev": true }, "node_modules/fs-temp": { @@ -6564,9 +6439,9 @@ "dev": true }, "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "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, @@ -6611,20 +6486,23 @@ "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" }, "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/function.prototype.name": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", - "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "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.1.3", - "es-abstract": "^1.19.0", - "functions-have-names": "^1.2.2" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" }, "engines": { "node": ">= 0.4" @@ -6660,6 +6538,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/gar/-/gar-1.0.4.tgz", "integrity": "sha512-w4n9cPWyP7aHxKxYHFQMegj7WIAsL/YX/C4Bs5Rr8s1H9M1rNtRWRsw+ovYMkXDQ5S4ZbYHsHAPmevPjPgw44w==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", "dev": true, "optional": true }, @@ -6667,6 +6546,7 @@ "version": "4.0.4", "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", + "deprecated": "This package is no longer supported.", "dev": true, "dependencies": { "aproba": "^1.0.3 || ^2.0.0", @@ -6735,14 +6615,19 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", - "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", "dev": true, "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -6779,28 +6664,26 @@ "dev": true }, "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==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", "dev": true, "dependencies": { "pump": "^3.0.0" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=6" } }, "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==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", + "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" + "call-bind": "^1.0.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4" }, "engines": { "node": ">= 0.4" @@ -6809,19 +6692,11 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/gifwrap": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/gifwrap/-/gifwrap-0.10.1.tgz", - "integrity": "sha512-2760b1vpJHNmLzZ/ubTtNnEx5WApN/PYWJvXvgS+tL1egTTthayFYIQQNi136FLEDcN/IyEY2EcGpIITD6eYUw==", - "dependencies": { - "image-q": "^4.0.0", - "omggif": "^1.0.10" - } - }, "node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "dependencies": { "fs.realpath": "^1.0.0", @@ -6856,15 +6731,6 @@ "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", "dev": true }, - "node_modules/global": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz", - "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==", - "dependencies": { - "min-document": "^2.19.0", - "process": "^0.11.10" - } - }, "node_modules/global-agent": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-3.0.0.tgz", @@ -6926,27 +6792,21 @@ } }, "node_modules/globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "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==", + "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, "dependencies": { - "define-properties": "^1.1.3" + "define-properties": "^1.2.1", + "gopd": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -7013,15 +6873,15 @@ } }, "node_modules/graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "dev": true }, - "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==", + "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": { @@ -7030,17 +6890,6 @@ "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", "dev": true }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, "node_modules/has-bigints": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", @@ -7060,21 +6909,21 @@ } }, "node_modules/has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "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, "dependencies": { - "get-intrinsic": "^1.1.1" + "es-define-property": "^1.0.0" }, "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==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", "dev": true, "engines": { "node": ">= 0.4" @@ -7096,12 +6945,12 @@ } }, "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==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "dev": true, "dependencies": { - "has-symbols": "^1.0.2" + "has-symbols": "^1.0.3" }, "engines": { "node": ">= 0.4" @@ -7116,6 +6965,17 @@ "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", "dev": true }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "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", @@ -7168,10 +7028,16 @@ "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 + }, "node_modules/hpack.js/node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "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", @@ -7198,11 +7064,21 @@ "safe-buffer": "~5.1.0" } }, - "node_modules/html-entities": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz", - "integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==", - "dev": true + "node_modules/html-entities": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.5.2.tgz", + "integrity": "sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/mdevils" + }, + { + "type": "patreon", + "url": "https://patreon.com/mdevils" + } + ] }, "node_modules/html-minifier-terser": { "version": "6.1.0", @@ -7235,9 +7111,9 @@ } }, "node_modules/html-webpack-plugin": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.5.0.tgz", - "integrity": "sha512-sy88PC2cRTVxvETRgUHFrL4No3UxvcH8G1NepGhqaTT+GXN2kTamqasot0inS5hXeg1cMbFDt27zzo9p35lZVw==", + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.0.tgz", + "integrity": "sha512-iwaY4wzbe48AfKLZ/Cc8k0L+FKG6oSNRaZ8x5A/T/IVDGyXcbHncM9TdDa93wn0FsSm82FhTKW7f3vS61thXAw==", "dev": true, "dependencies": { "@types/html-minifier-terser": "^6.0.0", @@ -7254,7 +7130,16 @@ "url": "https://opencollective.com/html-webpack-plugin" }, "peerDependencies": { + "@rspack/core": "0.x || 1.x", "webpack": "^5.20.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } } }, "node_modules/htmlparser2": { @@ -7434,6 +7319,7 @@ "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", @@ -7450,27 +7336,14 @@ ] }, "node_modules/ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", "dev": true, "engines": { "node": ">= 4" } }, - "node_modules/image-q": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/image-q/-/image-q-4.0.0.tgz", - "integrity": "sha512-PfJGVgIfKQJuq3s0tTDOKtztksibuUEbJQIYT3by6wctQo+Rdlh7ef4evJ5NCdxY4CfMbvFkocEwbl4BF8RlJw==", - "dependencies": { - "@types/node": "16.9.1" - } - }, - "node_modules/image-q/node_modules/@types/node": { - "version": "16.9.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.9.1.tgz", - "integrity": "sha512-QpLcX9ZSsq3YYUUnD3nFDY8H7wctAhQj/TFKL8Ya8v5fMm3CFXxo8zStsLAl780ltoYoo1WvKUVGBQK+1ifr7g==" - }, "node_modules/image-size": { "version": "0.7.5", "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.7.5.tgz", @@ -7485,9 +7358,9 @@ } }, "node_modules/immer": { - "version": "9.0.19", - "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.19.tgz", - "integrity": "sha512-eY+Y0qcsB4TZKwgQzLaE/lqYMlKhv5J9dyd2RhhtGhNo2njPXDqU9XPfcNfa3MIDsdtZt5KlkIsirlo4dHsWdQ==", + "version": "9.0.21", + "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz", + "integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==", "funding": { "type": "opencollective", "url": "https://opencollective.com/immer" @@ -7546,6 +7419,7 @@ "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, "dependencies": { "once": "^1.3.0", @@ -7564,13 +7438,13 @@ "dev": true }, "node_modules/internal-slot": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", - "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", "dev": true, "dependencies": { - "get-intrinsic": "^1.2.0", - "has": "^1.0.3", + "es-errors": "^1.3.0", + "hasown": "^2.0.0", "side-channel": "^1.0.4" }, "engines": { @@ -7586,11 +7460,18 @@ "node": ">=10.13.0" } }, - "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/ip-address": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", + "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", + "dev": true, + "dependencies": { + "jsbn": "1.1.0", + "sprintf-js": "^1.1.3" + }, + "engines": { + "node": ">= 12" + } }, "node_modules/ipaddr.js": { "version": "1.9.1", @@ -7602,14 +7483,16 @@ } }, "node_modules/is-array-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.1.tgz", - "integrity": "sha512-ASfLknmY8Xa2XtB4wmbz13Wu202baeA18cJBCeCy0wXUHZF0IPyVEXqKEcd+t2fNSLLL1vC6k7lxZEojNbISXQ==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "is-typed-array": "^1.1.10" + "get-intrinsic": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -7673,11 +7556,26 @@ } }, "node_modules/is-core-module": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", - "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-view": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", + "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", + "dev": true, "dependencies": { - "has": "^1.0.3" + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -7731,11 +7629,6 @@ "node": ">=8" } }, - "node_modules/is-function": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.2.tgz", - "integrity": "sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==" - }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -7785,9 +7678,9 @@ } }, "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==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", "dev": true, "engines": { "node": ">= 0.4" @@ -7885,27 +7778,27 @@ } }, "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==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2" + "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "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==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", "dev": true, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.10.0" } }, "node_modules/is-string": { @@ -7939,16 +7832,12 @@ } }, "node_modules/is-typed-array": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", - "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", "dev": true, "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" + "which-typed-array": "^1.1.14" }, "engines": { "node": ">= 0.4" @@ -8003,9 +7892,9 @@ } }, "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "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/isbinaryfile": { @@ -8035,15 +7924,6 @@ "node": ">=0.10.0" } }, - "node_modules/isomorphic-fetch": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-3.0.0.tgz", - "integrity": "sha512-qvUtwJ3j6qwsF3jLxkZ72qCgjMysPzDfeV240JHiGZsANBYd+EEuu35v7dfrJ9Up0Ak07D7GGSkGhCHTqg/5wA==", - "dependencies": { - "node-fetch": "^2.6.1", - "whatwg-fetch": "^3.4.1" - } - }, "node_modules/jest-worker": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", @@ -8073,32 +7953,6 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/jimp": { - "version": "0.22.10", - "resolved": "https://registry.npmjs.org/jimp/-/jimp-0.22.10.tgz", - "integrity": "sha512-lCaHIJAgTOsplyJzC1w/laxSxrbSsEBw4byKwXgUdMmh+ayPsnidTblenQm+IvhIs44Gcuvlb6pd2LQ0wcKaKg==", - "dependencies": { - "@jimp/custom": "^0.22.10", - "@jimp/plugins": "^0.22.10", - "@jimp/types": "^0.22.10", - "regenerator-runtime": "^0.13.3" - } - }, - "node_modules/jpeg-js": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.4.4.tgz", - "integrity": "sha512-WZzeDOEtTOBK4Mdsar0IqEU5sMr3vSV2RqkAIzUEV2BHnUfKGyswWFPFwK5EeDo93K3FohSHbLAjj0s1Wzd+dg==" - }, - "node_modules/js-sdsl": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.3.0.tgz", - "integrity": "sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ==", - "dev": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/js-sdsl" - } - }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -8115,6 +7969,23 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/jsbn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", + "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", + "dev": true + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/json-buffer": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", @@ -8193,9 +8064,9 @@ } }, "node_modules/keyv": { - "version": "4.5.2", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.2.tgz", - "integrity": "sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==", + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "dev": true, "dependencies": { "json-buffer": "3.0.1" @@ -8210,6 +8081,16 @@ "node": ">=0.10.0" } }, + "node_modules/launch-editor": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.6.1.tgz", + "integrity": "sha512-eB/uXmFVpY4zezmGp5XtU21kwo7GBbKB+EQ+UZeWtGb9yAM5xt/Evk+lYH3eRNAtId+ej4u7TYPFZ07w4s7rRw==", + "dev": true, + "dependencies": { + "picocolors": "^1.0.0", + "shell-quote": "^1.8.1" + } + }, "node_modules/levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -8229,9 +8110,9 @@ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" }, "node_modules/listr2": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-5.0.7.tgz", - "integrity": "sha512-MD+qXHPmtivrHIDRwPYdfNkrzqDiuaKU/rfBcec3WMyMF3xylQj3jMq344OtvQxz7zaCFViRAeqlr2AFhPvXHw==", + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-5.0.8.tgz", + "integrity": "sha512-mC73LitKHj9w6v30nLNGPetZIlfpUniNSsxxrbaPcWOjDb92SHPzJPi/t+v1YC/lxKz/AJ9egOjww0qUuFxBpA==", "dev": true, "dependencies": { "cli-truncate": "^2.1.0", @@ -8255,29 +8136,6 @@ } } }, - "node_modules/load-bmfont": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/load-bmfont/-/load-bmfont-1.4.1.tgz", - "integrity": "sha512-8UyQoYmdRDy81Brz6aLAUhfZLwr5zV0L3taTQ4hju7m6biuwiWiJXjPhBJxbUQJA8PrkvJ/7Enqmwk2sM14soA==", - "dependencies": { - "buffer-equal": "0.0.1", - "mime": "^1.3.4", - "parse-bmfont-ascii": "^1.0.3", - "parse-bmfont-binary": "^1.0.5", - "parse-bmfont-xml": "^1.1.4", - "phin": "^2.9.1", - "xhr": "^2.0.1", - "xtend": "^4.0.0" - } - }, - "node_modules/load-bmfont/node_modules/buffer-equal": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-0.0.1.tgz", - "integrity": "sha512-RgSV6InVQ9ODPdLWJ5UAqBqJBOg370Nz6ZQtRzpt6nUjc8v0St97uJ4PYC6NztqIScrAXafKM3mZPMygSe1ggA==", - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/load-json-file": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", @@ -8348,13 +8206,6 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, - "node_modules/lodash._reinterpolate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", - "integrity": "sha512-xYHt68QRoYGjeeM/XOE1uJtvXQAgvszfBhjV4yvsQH0u2i9I6cI6c6/eG4Hh3UAOVn0y/xAXwmTzEay49Q//HA==", - "dev": true, - "optional": true - }, "node_modules/lodash.get": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", @@ -8367,27 +8218,6 @@ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, - "node_modules/lodash.template": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", - "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", - "dev": true, - "optional": true, - "dependencies": { - "lodash._reinterpolate": "^3.0.0", - "lodash.templatesettings": "^4.0.0" - } - }, - "node_modules/lodash.templatesettings": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", - "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", - "dev": true, - "optional": true, - "dependencies": { - "lodash._reinterpolate": "^3.0.0" - } - }, "node_modules/log-symbols": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", @@ -8483,32 +8313,14 @@ } }, "node_modules/lru-cache": { - "version": "7.14.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.14.1.tgz", - "integrity": "sha512-ysxwsnTKdAx96aTRdhDOCQfDgbHnt8SK0KY8SEjO0wHinhWOFTESbjVCMPbU1uGXg/ch4lifqx0wfjOawU2+WA==", + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "dev": true, "engines": { "node": ">=12" } }, - "node_modules/lzma-native": { - "version": "8.0.6", - "resolved": "https://registry.npmjs.org/lzma-native/-/lzma-native-8.0.6.tgz", - "integrity": "sha512-09xfg67mkL2Lz20PrrDeNYZxzeW7ADtpYFbwSQh9U8+76RIzx5QsJBMy8qikv3hbUPfpy6hqwxt6FcGK81g9AA==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "node-addon-api": "^3.1.0", - "node-gyp-build": "^4.2.1", - "readable-stream": "^3.6.0" - }, - "bin": { - "lzmajs": "bin/lzmajs" - }, - "engines": { - "node": ">=10.0.0" - } - }, "node_modules/macos-alias": { "version": "0.2.11", "resolved": "https://registry.npmjs.org/macos-alias/-/macos-alias-0.2.11.tgz", @@ -8604,13 +8416,22 @@ "node": ">=6" } }, + "node_modules/mem/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, + "engines": { + "node": ">=6" + } + }, "node_modules/memfs": { - "version": "3.4.13", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.13.tgz", - "integrity": "sha512-omTM41g3Skpvx5dSYeZIbXKcXoAVc/AoMNwn9TKx++L/gaen/+4TTttmu8ZSch5vfVJ8uJvGbroTsIlslRg6lg==", + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", + "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", "dev": true, "dependencies": { - "fs-monkey": "^1.0.3" + "fs-monkey": "^1.0.4" }, "engines": { "node": ">= 4.0.0" @@ -8647,12 +8468,12 @@ } }, "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", + "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", "dev": true, "dependencies": { - "braces": "^3.0.2", + "braces": "^3.0.3", "picomatch": "^2.3.1" }, "engines": { @@ -8663,6 +8484,7 @@ "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, "bin": { "mime": "cli.js" }, @@ -8692,11 +8514,11 @@ } }, "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==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-3.1.0.tgz", + "integrity": "sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==", "engines": { - "node": ">=6" + "node": ">=8" } }, "node_modules/mimic-response": { @@ -8708,14 +8530,6 @@ "node": ">=4" } }, - "node_modules/min-document": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", - "integrity": "sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==", - "dependencies": { - "dom-walk": "^0.1.0" - } - }, "node_modules/minimalistic-assert": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", @@ -8867,8 +8681,7 @@ "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==", - "dev": true + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/multicast-dns": { "version": "7.2.5", @@ -8896,17 +8709,23 @@ } }, "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==", + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.19.0.tgz", + "integrity": "sha512-nO1xXxfh/RWNxfd/XPfbIfFk5vgLsAxUR9y5O0cHMJu/AW9U95JLXqthYHjEp+8gQ5p96K9jUp8nbVOxCdRbtw==", "dev": true, "optional": true }, "node_modules/nanoid": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", - "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -8958,9 +8777,9 @@ } }, "node_modules/node-abi": { - "version": "3.33.0", - "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.33.0.tgz", - "integrity": "sha512-7GGVawqyHF4pfd0YFybhv/eM9JwTtPqx0mAanQ146O3FlSh3pA24zf9IRQTOsfTSqXTNzPSP5iagAJ94jjuVog==", + "version": "3.63.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.63.0.tgz", + "integrity": "sha512-vAszCsOUrUxjGAmdnM/pq7gUgie0IRteCQMX6d4A534fQCR93EJU5qgzBvU6EkFfK27s0T3HEV3BOyJIr7OMYw==", "dev": true, "dependencies": { "semver": "^7.3.5" @@ -8975,25 +8794,20 @@ "integrity": "sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==", "dev": true }, - "node_modules/node-addon-api": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", - "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==", - "dev": true - }, "node_modules/node-api-version": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/node-api-version/-/node-api-version-0.1.4.tgz", - "integrity": "sha512-KGXihXdUChwJAOHO53bv9/vXcLmdUsZ6jIptbvYvkpKfth+r7jw44JkVxQFA3kX5nQjzjmGu1uAu/xNNLNlI5g==", + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/node-api-version/-/node-api-version-0.2.0.tgz", + "integrity": "sha512-fthTTsi8CxaBXMaBAD7ST2uylwvsnYxh2PfaScwpMhos6KlSFajXQPcM4ogNE1q2s3Lbz9GCGqeIHC+C6OZnKg==", "dev": true, "dependencies": { "semver": "^7.3.5" } }, "node_modules/node-fetch": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz", - "integrity": "sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==", + "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==", + "dev": true, "dependencies": { "whatwg-url": "^5.0.0" }, @@ -9019,12 +8833,13 @@ } }, "node_modules/node-gyp": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.3.1.tgz", - "integrity": "sha512-4Q16ZCqq3g8awk6UplT7AuxQ35XN4R/yf/+wSAwcBUAjg7l58RTactWaP8fIDTi0FzI7YcVLujwExakZlfWkXg==", + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.4.1.tgz", + "integrity": "sha512-OQkWKbjQKbGkMf/xqI1jjy3oCTgMKJac58G2+bjZb3fza6gW2YrCSdMQYaoTb70crvE//Gngr4f0AgVHmqHvBQ==", "dev": true, "dependencies": { "env-paths": "^2.2.0", + "exponential-backoff": "^3.1.1", "glob": "^7.1.4", "graceful-fs": "^4.2.6", "make-fetch-happen": "^10.0.3", @@ -9042,17 +8857,6 @@ "node": "^12.13 || ^14.13 || >=16" } }, - "node_modules/node-gyp-build": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.6.0.tgz", - "integrity": "sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ==", - "dev": true, - "bin": { - "node-gyp-build": "bin.js", - "node-gyp-build-optional": "optional.js", - "node-gyp-build-test": "build-test.js" - } - }, "node_modules/node-loader": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/node-loader/-/node-loader-2.0.0.tgz", @@ -9073,9 +8877,9 @@ } }, "node_modules/node-releases": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", - "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==", + "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/nopt": { @@ -9106,9 +8910,9 @@ } }, "node_modules/normalize-package-data/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "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" @@ -9136,21 +8940,31 @@ } }, "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", "dev": true, "dependencies": { - "path-key": "^3.0.0" + "path-key": "^2.0.0" }, "engines": { - "node": ">=8" + "node": ">=4" + } + }, + "node_modules/npm-run-path/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==", + "dev": true, + "engines": { + "node": ">=4" } }, "node_modules/npmlog": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", + "deprecated": "This package is no longer supported.", "dev": true, "dependencies": { "are-we-there-yet": "^3.0.0", @@ -9183,9 +8997,9 @@ } }, "node_modules/object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -9201,13 +9015,13 @@ } }, "node_modules/object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", "has-symbols": "^1.0.3", "object-keys": "^1.1.1" }, @@ -9218,15 +9032,47 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/object.fromentries": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.groupby": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/object.values": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", - "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", + "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -9241,11 +9087,6 @@ "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", "dev": true }, - "node_modules/omggif": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/omggif/-/omggif-1.0.10.tgz", - "integrity": "sha512-LMJTtvgc/nugXj0Vcrrs68Mn2D1r0zf630VNtqtpI1FEO7e+O9FP4gqs9AcnBaSEeoHIPm28u6qgPR0oyEpGSw==" - }, "node_modules/on-finished": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", @@ -9290,10 +9131,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/onetime/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==", + "engines": { + "node": ">=6" + } + }, "node_modules/open": { - "version": "8.4.1", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.1.tgz", - "integrity": "sha512-/4b7qZNhv6Uhd7jjnREh1NjnPxlTq+XNWPG88Ydkj5AILcA5m3ajvcg57pB24EQjKv0dK62XnDqk9c/hkIG5Kg==", + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", "dev": true, "dependencies": { "define-lazy-prop": "^2.0.0", @@ -9308,9 +9157,9 @@ } }, "node_modules/optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "dev": true, "dependencies": { "deep-is": "^0.1.3", @@ -9318,7 +9167,7 @@ "levn": "^0.4.1", "prelude-ls": "^1.2.1", "type-check": "^0.4.0", - "word-wrap": "^1.2.3" + "word-wrap": "^1.2.5" }, "engines": { "node": ">= 0.8.0" @@ -9458,11 +9307,6 @@ "node": ">=6" } }, - "node_modules/pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" - }, "node_modules/param-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", @@ -9496,25 +9340,6 @@ "node": ">=0.10.0" } }, - "node_modules/parse-bmfont-ascii": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/parse-bmfont-ascii/-/parse-bmfont-ascii-1.0.6.tgz", - "integrity": "sha512-U4RrVsUFCleIOBsIGYOMKjn9PavsGOXxbvYGtMOEfnId0SVNsgehXh1DxUdVPLoxd5mvcEtvmKs2Mmf0Mpa1ZA==" - }, - "node_modules/parse-bmfont-binary": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/parse-bmfont-binary/-/parse-bmfont-binary-1.0.6.tgz", - "integrity": "sha512-GxmsRea0wdGdYthjuUeWTMWPqm2+FAd4GI8vCvhgJsFnoGhTrLhXDDupwTo7rXVAgaLIGoVHDZS9p/5XbSqeWA==" - }, - "node_modules/parse-bmfont-xml": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/parse-bmfont-xml/-/parse-bmfont-xml-1.1.4.tgz", - "integrity": "sha512-bjnliEOmGv3y1aMEfREMBJ9tfL3WR0i0CKPj61DnSLaoxWR3nLrsQrEbCId/8rF4NyRF0cCqisSVXyQYWM+mCQ==", - "dependencies": { - "xml-parse-from-string": "^1.0.0", - "xml2js": "^0.4.5" - } - }, "node_modules/parse-color": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/parse-color/-/parse-color-1.0.0.tgz", @@ -9532,11 +9357,6 @@ "dev": true, "optional": true }, - "node_modules/parse-headers": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.5.tgz", - "integrity": "sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA==" - }, "node_modules/parse-json": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", @@ -9628,34 +9448,16 @@ "node": ">=8" } }, - "node_modules/peek-readable": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-4.1.0.tgz", - "integrity": "sha512-ZI3LnwUv5nOGbQzD9c2iDG6toheuXSZP5esSHBjopsXH4dg19soufvpUGA3uohi5anFtGb2lhAVdHzH6R/Evvg==", - "engines": { - "node": ">=8" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Borewit" - } - }, "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==", "dev": true }, - "node_modules/phin": { - "version": "2.9.3", - "resolved": "https://registry.npmjs.org/phin/-/phin-2.9.3.tgz", - "integrity": "sha512-CzFr90qM24ju5f88quFC/6qohjC144rehe5n6DH900lgXmUe86+xCKc10ev56gRKC4/BkHUoG4uSiQgBiIXwDA==" - }, "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==" }, "node_modules/picomatch": { "version": "2.3.1", @@ -9678,25 +9480,6 @@ "node": ">=0.10.0" } }, - "node_modules/pixelmatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/pixelmatch/-/pixelmatch-4.0.2.tgz", - "integrity": "sha512-J8B6xqiO37sU/gkcMglv6h5Jbd9xNER7aHzpfRdNmV4IbQBzBpe4l9XmbG+xPF/znacgu2jfEw+wHffaq/YkXA==", - "dependencies": { - "pngjs": "^3.0.0" - }, - "bin": { - "pixelmatch": "bin/pixelmatch" - } - }, - "node_modules/pixelmatch/node_modules/pngjs": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-3.4.0.tgz", - "integrity": "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==", - "engines": { - "node": ">=4.0.0" - } - }, "node_modules/pkg-dir": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", @@ -9829,12 +9612,12 @@ } }, "node_modules/playwright": { - "version": "1.38.0", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.38.0.tgz", - "integrity": "sha512-fJGw+HO0YY+fU/F1N57DMO+TmXHTrmr905J05zwAQE9xkuwP/QLDk63rVhmyxh03dYnEhnRbsdbH9B0UVVRB3A==", + "version": "1.44.1", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.44.1.tgz", + "integrity": "sha512-qr/0UJ5CFAtloI3avF95Y0L1xQo6r3LQArLIg/z/PoGJ6xa+EwzrwO5lpNr/09STxdHuUoP2mvuELJS+hLdtgg==", "dev": true, "dependencies": { - "playwright-core": "1.38.0" + "playwright-core": "1.44.1" }, "bin": { "playwright": "cli.js" @@ -9847,9 +9630,9 @@ } }, "node_modules/playwright-core": { - "version": "1.38.0", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.38.0.tgz", - "integrity": "sha512-f8z1y8J9zvmHoEhKgspmCvOExF2XdcxMW8jNRuX4vkQFrzV4MlZ55iwb5QeyiFQgOFCUolXiRHgpjSEnqvO48g==", + "version": "1.44.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.44.1.tgz", + "integrity": "sha512-wh0JWtYTrhv1+OSsLPgFzGzt67Y7BE/ZS3jEqgGBlp2ppp1ZDj8c+9IARNW4dwf1poq5MgHreEM2KV/GuR4cFA==", "dev": true, "bin": { "playwright-core": "cli.js" @@ -9858,31 +9641,47 @@ "node": ">=16" } }, + "node_modules/playwright/node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, "node_modules/plist": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/plist/-/plist-3.0.6.tgz", - "integrity": "sha512-WiIVYyrp8TD4w8yCvyeIr+lkmrGRd5u0VbRnU+tP/aRLxP/YadJUYOMZJ/6hIa3oUyVCsycXvtNRgd5XBJIbiA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz", + "integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==", "dev": true, "dependencies": { + "@xmldom/xmldom": "^0.8.8", "base64-js": "^1.5.1", "xmlbuilder": "^15.1.1" }, "engines": { - "node": ">=6" + "node": ">=10.4.0" } }, - "node_modules/pngjs": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-6.0.0.tgz", - "integrity": "sha512-TRzzuFRRmEoSW/p1KVAmiOgPco2Irlah+bGFCeNfJXxxYGwSw7YwAOAcd7X28K/m5bjBWKsC29KyoMfHbypayg==", + "node_modules/possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "dev": true, "engines": { - "node": ">=12.13.0" + "node": ">= 0.4" } }, "node_modules/postcss": { - "version": "8.4.21", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz", - "integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==", + "version": "8.4.38", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", + "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", "dev": true, "funding": [ { @@ -9892,21 +9691,25 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "dependencies": { - "nanoid": "^3.3.4", + "nanoid": "^3.3.7", "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" + "source-map-js": "^1.2.0" }, "engines": { "node": "^10 || ^12 || >=14" } }, "node_modules/postcss-modules-extract-imports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", - "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", + "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", "dev": true, "engines": { "node": "^10 || ^12 || >= 14" @@ -9916,9 +9719,9 @@ } }, "node_modules/postcss-modules-local-by-default": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", - "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.5.tgz", + "integrity": "sha512-6MieY7sIfTK0hYfafw1OMEG+2bg8Q1ocHCpoWLqOKj3JXlKu4G7btkmM/B7lFubYkYWmRSPLZi5chid63ZaZYw==", "dev": true, "dependencies": { "icss-utils": "^5.0.0", @@ -9933,9 +9736,9 @@ } }, "node_modules/postcss-modules-scope": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", - "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.0.tgz", + "integrity": "sha512-oq+g1ssrsZOsx9M96c5w8laRmvEu9C3adDSjI8oTcbfkrTE8hx/zfyobUoWIxaKPO8bt6S62kxpw5GqypEw1QQ==", "dev": true, "dependencies": { "postcss-selector-parser": "^6.0.4" @@ -9963,9 +9766,9 @@ } }, "node_modules/postcss-selector-parser": { - "version": "6.0.11", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz", - "integrity": "sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.0.tgz", + "integrity": "sha512-UMz42UD0UY0EApS0ZL9o1XnLhSTtvvvLe5Dc2H2O56fvRZi+KulDyf5ctDhhtYJBGKStV2FL1fy6253cmLgqVQ==", "dev": true, "dependencies": { "cssesc": "^3.0.0", @@ -9981,6 +9784,32 @@ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", "dev": true }, + "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, + "optional": true, + "dependencies": { + "commander": "^9.4.0" + }, + "bin": { + "postject": "dist/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "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, + "optional": 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", @@ -10000,14 +9829,6 @@ "renderkid": "^3.0.0" } }, - "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" - } - }, "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", @@ -10081,9 +9902,9 @@ } }, "node_modules/punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "engines": { "node": ">=6" } @@ -10174,9 +9995,9 @@ } }, "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==", + "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==", "dev": true, "dependencies": { "bytes": "3.1.2", @@ -10189,9 +10010,9 @@ } }, "node_modules/rcedit": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/rcedit/-/rcedit-3.0.1.tgz", - "integrity": "sha512-XM0Jv40/y4hVAqj/MO70o/IWs4uOsaSoo2mLyk3klFDW+SStLnCtzuQu+1OBTIMGlM8CvaK9ftlYCp6DJ+cMsw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/rcedit/-/rcedit-3.1.0.tgz", + "integrity": "sha512-WRlRdY1qZbu1L11DklT07KuHfRk42l0NFFJdaExELEu4fEQ982bP5Z6OWGPj/wLLIuKRQDCxZJGAwoFsxhZhNA==", "dev": true, "dependencies": { "cross-spawn-windows-exe": "^1.1.0" @@ -10201,9 +10022,9 @@ } }, "node_modules/react": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", - "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", "dependencies": { "loose-envify": "^1.1.0" }, @@ -10212,26 +10033,26 @@ } }, "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==", + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", "dependencies": { "loose-envify": "^1.1.0", - "scheduler": "^0.23.0" + "scheduler": "^0.23.2" }, "peerDependencies": { - "react": "^18.2.0" + "react": "^18.3.1" } }, "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==" + "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==" }, "node_modules/react-redux": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-8.0.5.tgz", - "integrity": "sha512-Q2f6fCKxPFpkXt1qNRZdEDLlScsDWyrgSj0mliK59qU6W5gvBiKkdMEG2lJzhd1rCctf0hb6EtePPLZ2e0m1uw==", + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-8.1.3.tgz", + "integrity": "sha512-n0ZrutD7DaX/j9VscF+uTALI3oUPa/pO4Z3soOBIjuRn/FzVu6aehhysxZCLi6y7duMf52WNZGMl7CtuK5EnRw==", "dependencies": { "@babel/runtime": "^7.12.1", "@types/hoist-non-react-statics": "^3.3.1", @@ -10246,7 +10067,7 @@ "react": "^16.8 || ^17.0 || ^18.0", "react-dom": "^16.8 || ^17.0 || ^18.0", "react-native": ">=0.59", - "redux": "^4" + "redux": "^4 || ^5.0.0-beta.0" }, "peerDependenciesMeta": { "@types/react": { @@ -10267,29 +10088,29 @@ } }, "node_modules/react-router": { - "version": "6.8.1", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.8.1.tgz", - "integrity": "sha512-Jgi8BzAJQ8MkPt8ipXnR73rnD7EmZ0HFFb7jdQU24TynGW1Ooqin2KVDN9voSC+7xhqbbCd2cjGUepb6RObnyg==", + "version": "6.23.1", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.23.1.tgz", + "integrity": "sha512-fzcOaRF69uvqbbM7OhvQyBTFDVrrGlsFdS3AL+1KfIBtGETibHzi3FkoTRyiDJnWNc2VxrfvR+657ROHjaNjqQ==", "dependencies": { - "@remix-run/router": "1.3.2" + "@remix-run/router": "1.16.1" }, "engines": { - "node": ">=14" + "node": ">=14.0.0" }, "peerDependencies": { "react": ">=16.8" } }, "node_modules/react-router-dom": { - "version": "6.8.1", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.8.1.tgz", - "integrity": "sha512-67EXNfkQgf34P7+PSb6VlBuaacGhkKn3kpE51+P6zYSG2kiRoumXEL6e27zTa9+PGF2MNXbgIUHTVlleLbIcHQ==", + "version": "6.23.1", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.23.1.tgz", + "integrity": "sha512-utP+K+aSTtEdbWpC+4gxhdlPFwuEfDKq8ZrPFU65bbRJY+l706qjR7yaidBpo3MSeA/fzwbXWbKBI6ftOnP3OQ==", "dependencies": { - "@remix-run/router": "1.3.2", - "react-router": "6.8.1" + "@remix-run/router": "1.16.1", + "react-router": "6.23.1" }, "engines": { - "node": ">=14" + "node": ">=14.0.0" }, "peerDependencies": { "react": ">=16.8", @@ -10311,6 +10132,18 @@ "react-dom": ">=16.6.0" } }, + "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, + "dependencies": { + "debug": "^4.3.4" + }, + "bin": { + "read-binary-file-arch": "cli.js" + } + }, "node_modules/read-pkg": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", @@ -10418,9 +10251,10 @@ } }, "node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -10430,21 +10264,6 @@ "node": ">= 6" } }, - "node_modules/readable-web-to-node-stream": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.2.tgz", - "integrity": "sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==", - "dependencies": { - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Borewit" - } - }, "node_modules/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -10486,19 +10305,20 @@ } }, "node_modules/regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" }, "node_modules/regexp.prototype.flags": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", - "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", + "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "functions-have-names": "^1.2.2" + "call-bind": "^1.0.6", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.1" }, "engines": { "node": ">= 0.4" @@ -10507,18 +10327,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, "node_modules/relateurl": { "version": "0.2.7", "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", @@ -10568,13 +10376,6 @@ "node": ">=0.10.0" } }, - "node_modules/require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true, - "optional": true - }, "node_modules/requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", @@ -10582,16 +10383,16 @@ "dev": true }, "node_modules/reselect": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/reselect/-/reselect-4.1.7.tgz", - "integrity": "sha512-Zu1xbUt3/OPwsXL46hvOOoQrap2azE7ZQbokq61BQfiXvhewsKDwhMeZjTX9sX0nvw1t/U5Audyn1I9P/m9z0A==" + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/reselect/-/reselect-4.1.8.tgz", + "integrity": "sha512-ab9EmR80F/zQTMNeneUr4cv+jSwPJgIlvEmVwLerwrWVbpLlBuls9XHzIeTFy4cegU2NHBp3va0LKOzU5qFEYQ==" }, "node_modules/resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", "dependencies": { - "is-core-module": "^2.9.0", + "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -10687,24 +10488,16 @@ } }, "node_modules/rfdc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", - "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.1.tgz", + "integrity": "sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==", "dev": true }, - "node_modules/rifm": { - "version": "0.12.1", - "resolved": "https://registry.npmjs.org/rifm/-/rifm-0.12.1.tgz", - "integrity": "sha512-OGA1Bitg/dSJtI/c4dh90svzaUPt228kzFsUkJbtA2c964IqEAwWXeL9ZJi86xWv3j5SMqRvGULl7bA6cK0Bvg==", - "peer": true, - "peerDependencies": { - "react": ">=16.8" - } - }, "node_modules/rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", "dev": true, "dependencies": { "glob": "^7.1.3" @@ -10758,18 +10551,37 @@ } }, "node_modules/rxjs": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.0.tgz", - "integrity": "sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==", + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", "dev": true, "dependencies": { "tslib": "^2.1.0" } }, + "node_modules/safe-array-concat": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", + "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "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", @@ -10786,15 +10598,18 @@ ] }, "node_modules/safe-regex-test": { - "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==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", + "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", "is-regex": "^1.1.4" }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -10803,25 +10618,20 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "devOptional": true - }, - "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/scheduler": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", - "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", "dependencies": { "loose-envify": "^1.1.0" } }, "node_modules/schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", "dev": true, "dependencies": { "@types/json-schema": "^7.0.8", @@ -10874,11 +10684,12 @@ "dev": true }, "node_modules/selfsigned": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.1.1.tgz", - "integrity": "sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", + "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", "dev": true, "dependencies": { + "@types/node-forge": "^1.3.0", "node-forge": "^1" }, "engines": { @@ -10886,12 +10697,9 @@ } }, "node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dependencies": { - "lru-cache": "^6.0.0" - }, + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", + "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", "bin": { "semver": "bin/semver.js" }, @@ -10906,17 +10714,6 @@ "dev": true, "optional": true }, - "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==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/send": { "version": "0.18.0", "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", @@ -10992,9 +10789,9 @@ } }, "node_modules/serialize-javascript": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", - "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", "dev": true, "dependencies": { "randombytes": "^2.1.0" @@ -11099,6 +10896,38 @@ "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", "dev": true }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", @@ -11138,15 +10967,28 @@ "node": ">=8" } }, + "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==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "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==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", "dev": true, "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -11203,16 +11045,16 @@ } }, "node_modules/socks": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", - "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz", + "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==", "dev": true, "dependencies": { - "ip": "^2.0.0", + "ip-address": "^9.0.5", "smart-buffer": "^4.2.0" }, "engines": { - "node": ">= 10.13.0", + "node": ">= 10.0.0", "npm": ">= 3.0.0" } }, @@ -11231,18 +11073,17 @@ } }, "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", "engines": { "node": ">=0.10.0" } }, "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", + "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", "dev": true, "engines": { "node": ">=0.10.0" @@ -11258,10 +11099,19 @@ "source-map": "^0.6.0" } }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", "dev": true, "dependencies": { "spdx-expression-parse": "^3.0.0", @@ -11269,9 +11119,9 @@ } }, "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==", + "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 }, "node_modules/spdx-expression-parse": { @@ -11285,9 +11135,9 @@ } }, "node_modules/spdx-license-ids": { - "version": "3.0.12", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.12.tgz", - "integrity": "sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA==", + "version": "3.0.18", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.18.tgz", + "integrity": "sha512-xxRs31BqRYHwiMzudOrpSiHtZ8i/GeionCBDSilhYRj+9gIcI8wCZTlXZKu9vZIVqViP3dcp9qE5G6AlIaD+TQ==", "dev": true }, "node_modules/spdy": { @@ -11321,11 +11171,10 @@ } }, "node_modules/sprintf-js": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", - "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==", - "dev": true, - "optional": true + "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 }, "node_modules/ssri": { "version": "9.0.1", @@ -11362,6 +11211,7 @@ "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, "dependencies": { "safe-buffer": "~5.2.0" } @@ -11380,29 +11230,50 @@ "node": ">=8" } }, + "node_modules/string.prototype.trim": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", + "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/string.prototype.trimend": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", - "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", + "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/string.prototype.trimstart": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", - "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -11480,26 +11351,10 @@ "node": ">=0.8.0" } }, - "node_modules/strtok3": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-6.3.0.tgz", - "integrity": "sha512-fZtbhtvI9I48xDSywd/somNqgUHl2L2cstmXCCif0itOf96jeW18MBSyrLuNicYQVkvpOxkZtkzujiTJ9LW5Jw==", - "dependencies": { - "@tokenizer/token": "^0.3.0", - "peek-readable": "^4.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Borewit" - } - }, "node_modules/style-loader": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.1.tgz", - "integrity": "sha512-GPcQ+LDJbrcxHORTRes6Jy2sfvK2kS6hpSfI/fXhPt+spVzxF6LJ1dHLN9zIGmVaaP044YKaIatFaufENRiDoQ==", + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.4.tgz", + "integrity": "sha512-0WqXzrsMTyb8yjZJHDqwmnwRJvhALK9LfRtRc6B4UTWe8AijYLZYZ9thuJTZc2VfQWINADW/j+LiJnfy2RoC1w==", "dev": true, "engines": { "node": ">= 12.13.0" @@ -11513,9 +11368,9 @@ } }, "node_modules/stylis": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.1.3.tgz", - "integrity": "sha512-GP6WDNWf+o403jrEp9c5jibKavrtLW+/qYGhFxFrG8maXhwTBI7gLLhiBb0o7uFccWN+EOS9aMO6cGHWAO07OA==" + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", + "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==" }, "node_modules/sudo-prompt": { "version": "9.2.1", @@ -11568,14 +11423,14 @@ } }, "node_modules/tar": { - "version": "6.1.13", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.13.tgz", - "integrity": "sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", "dev": true, "dependencies": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", - "minipass": "^4.0.0", + "minipass": "^5.0.0", "minizlib": "^2.1.1", "mkdirp": "^1.0.3", "yallist": "^4.0.0" @@ -11585,9 +11440,9 @@ } }, "node_modules/tar/node_modules/minipass": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.0.3.tgz", - "integrity": "sha512-OW2r4sQ0sI+z5ckEt5c1Tri4xTgZwYDxpE54eqWlQloQRoWtXjqt9udJ5Z4dSv7wK+nfFI7FRXyCpBSft+gpFw==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", "dev": true, "engines": { "node": ">=8" @@ -11624,6 +11479,7 @@ "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, "optional": true, "dependencies": { @@ -11634,13 +11490,13 @@ } }, "node_modules/terser": { - "version": "5.16.3", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.16.3.tgz", - "integrity": "sha512-v8wWLaS/xt3nE9dgKEWhNUFP6q4kngO5B8eYFUuebsu7Dw/UNAnpUod6UHo04jSSkv8TzKHjZDSd7EXdDQAl8Q==", + "version": "5.31.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.31.0.tgz", + "integrity": "sha512-Q1JFAoUKE5IMfI4Z/lkE/E6+SwgzO+x4tq4v1AyBLRj8VSYvRO6A/rQrPg1yud4g0En9EKI1TvFRF2tQFcoUkg==", "dev": true, "dependencies": { - "@jridgewell/source-map": "^0.3.2", - "acorn": "^8.5.0", + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, @@ -11652,16 +11508,16 @@ } }, "node_modules/terser-webpack-plugin": { - "version": "5.3.6", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.6.tgz", - "integrity": "sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ==", + "version": "5.3.10", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", + "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", "dev": true, "dependencies": { - "@jridgewell/trace-mapping": "^0.3.14", + "@jridgewell/trace-mapping": "^0.3.20", "jest-worker": "^27.4.5", "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.0", - "terser": "^5.14.1" + "serialize-javascript": "^6.0.1", + "terser": "^5.26.0" }, "engines": { "node": ">= 10.13.0" @@ -11709,11 +11565,6 @@ "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", "dev": true }, - "node_modules/timm": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/timm/-/timm-1.7.1.tgz", - "integrity": "sha512-IjZc9KIotudix8bMaBW6QvMuq64BrJWFs1+4V0lXwWGQZwH+LnX87doAYhem4caOEusRP9/g6jVDQmZ8XOk1nw==" - }, "node_modules/tiny-each-async": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/tiny-each-async/-/tiny-each-async-2.0.3.tgz", @@ -11721,22 +11572,14 @@ "dev": true, "optional": true }, - "node_modules/tinycolor2": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.6.0.tgz", - "integrity": "sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==" - }, "node_modules/tmp": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", - "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", + "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==", "dev": true, "optional": true, - "dependencies": { - "rimraf": "^3.0.0" - }, "engines": { - "node": ">=8.17.0" + "node": ">=14.14" } }, "node_modules/tmp-promise": { @@ -11793,31 +11636,16 @@ "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, - "engines": { - "node": ">=0.6" - } - }, - "node_modules/token-types": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/token-types/-/token-types-4.2.1.tgz", - "integrity": "sha512-6udB24Q737UD/SDsKAHI9FCRP7Bqc9D/MQUV02ORQg5iskjtLJlZJNdN4kKtcdtwCeWIwIHDGaUsTsCCAa8sFQ==", - "dependencies": { - "@tokenizer/token": "^0.3.0", - "ieee754": "^1.2.1" - }, + "dev": true, "engines": { - "node": ">=10" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Borewit" + "node": ">=0.6" } }, "node_modules/tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true }, "node_modules/trim-repeated": { "version": "1.0.0", @@ -11841,15 +11669,16 @@ } }, "node_modules/ts-loader": { - "version": "9.4.2", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.4.2.tgz", - "integrity": "sha512-OmlC4WVmFv5I0PpaxYb+qGeGOdm5giHU7HwDDUjw59emP2UYMHy9fFSDcYgSNoH8sXcj4hGCSEhlDZ9ULeDraA==", + "version": "9.5.1", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.5.1.tgz", + "integrity": "sha512-rNH3sK9kGZcH9dYzC7CewQm4NtxJTjSEVRJ2DyBZR7f8/wcta+iV44UPCXc5+nzDzivKtlzV6c9P4e+oFhDLYg==", "dev": true, "dependencies": { "chalk": "^4.1.0", "enhanced-resolve": "^5.0.0", "micromatch": "^4.0.0", - "semver": "^7.3.4" + "semver": "^7.3.4", + "source-map": "^0.7.4" }, "engines": { "node": ">=12.0.0" @@ -11859,10 +11688,19 @@ "webpack": "^5.0.0" } }, + "node_modules/ts-loader/node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, "node_modules/ts-node": { - "version": "10.9.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", - "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", "dev": true, "dependencies": { "@cspotcode/source-map-support": "^0.8.0", @@ -11903,13 +11741,13 @@ } }, "node_modules/tsconfig-paths": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", - "integrity": "sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==", + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", "dev": true, "dependencies": { "@types/json5": "^0.0.29", - "json5": "^1.0.1", + "json5": "^1.0.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" } @@ -11927,9 +11765,9 @@ } }, "node_modules/tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", "dev": true }, "node_modules/tsutils": { @@ -11966,12 +11804,11 @@ } }, "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, + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", "engines": { - "node": ">=10" + "node": ">=12.20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -11990,15 +11827,74 @@ "node": ">= 0.6" } }, + "node_modules/typed-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", + "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", + "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", + "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "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==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", + "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", + "call-bind": "^1.0.7", "for-each": "^0.3.3", - "is-typed-array": "^1.1.9" + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -12032,6 +11928,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true + }, "node_modules/unique-filename": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-2.0.1.tgz", @@ -12057,9 +11959,9 @@ } }, "node_modules/universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "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" @@ -12085,9 +11987,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", - "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.16.tgz", + "integrity": "sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==", "dev": true, "funding": [ { @@ -12097,14 +11999,18 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" + "escalade": "^3.1.2", + "picocolors": "^1.0.1" }, "bin": { - "browserslist-lint": "cli.js" + "update-browserslist-db": "cli.js" }, "peerDependencies": { "browserslist": ">= 4.21.0" @@ -12119,9 +12025,9 @@ } }, "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==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.2.tgz", + "integrity": "sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw==", "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0" } @@ -12139,136 +12045,11 @@ "node": ">=8" } }, - "node_modules/username/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==", - "dev": true, - "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" - } - }, - "node_modules/username/node_modules/execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "dev": true, - "dependencies": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/username/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==", - "dev": true, - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/username/node_modules/is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/username/node_modules/npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", - "dev": true, - "dependencies": { - "path-key": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/username/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==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/username/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/username/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==", - "dev": true, - "dependencies": { - "shebang-regex": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/username/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==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/username/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/utif2": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/utif2/-/utif2-4.1.0.tgz", - "integrity": "sha512-+oknB9FHrJ7oW7A2WZYajOcv4FcDR4CfoGB0dPNfxbi4GO05RRnFmt5oa23+9w32EanrYcSJWspUiJkLMs+37w==", - "dependencies": { - "pako": "^1.0.11" - } - }, "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==" + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true }, "node_modules/utila": { "version": "0.4.0", @@ -12320,9 +12101,9 @@ } }, "node_modules/watchpack": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", - "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.1.tgz", + "integrity": "sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==", "dev": true, "dependencies": { "glob-to-regexp": "^0.4.1", @@ -12353,37 +12134,38 @@ "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==" + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "dev": true }, "node_modules/webpack": { - "version": "5.76.2", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.76.2.tgz", - "integrity": "sha512-Th05ggRm23rVzEOlX8y67NkYCHa9nTNcwHPBhdg+lKG+mtiW7XgggjAeeLnADAe7mLjJ6LUNfgHAuRRh+Z6J7w==", + "version": "5.91.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.91.0.tgz", + "integrity": "sha512-rzVwlLeBWHJbmgTC/8TvAcu5vpJNII+MelQpylD4jNERPwpBJOE2lEcko1zJX3QJeLjTTAnQxn/OJ8bjDzVQaw==", "dev": true, "dependencies": { "@types/eslint-scope": "^3.7.3", - "@types/estree": "^0.0.51", - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/wasm-edit": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", + "@types/estree": "^1.0.5", + "@webassemblyjs/ast": "^1.12.1", + "@webassemblyjs/wasm-edit": "^1.12.1", + "@webassemblyjs/wasm-parser": "^1.12.1", "acorn": "^8.7.1", - "acorn-import-assertions": "^1.7.6", - "browserslist": "^4.14.5", + "acorn-import-assertions": "^1.9.0", + "browserslist": "^4.21.10", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.10.0", - "es-module-lexer": "^0.9.0", + "enhanced-resolve": "^5.16.0", + "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", + "graceful-fs": "^4.2.11", "json-parse-even-better-errors": "^2.3.1", "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", - "schema-utils": "^3.1.0", + "schema-utils": "^3.2.0", "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.1.3", - "watchpack": "^2.4.0", + "terser-webpack-plugin": "^5.3.10", + "watchpack": "^2.4.1", "webpack-sources": "^3.2.3" }, "bin": { @@ -12403,9 +12185,9 @@ } }, "node_modules/webpack-dev-middleware": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz", - "integrity": "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==", + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.4.tgz", + "integrity": "sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q==", "dev": true, "dependencies": { "colorette": "^2.0.10", @@ -12425,28 +12207,16 @@ "webpack": "^4.0.0 || ^5.0.0" } }, - "node_modules/webpack-dev-middleware/node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, "node_modules/webpack-dev-middleware/node_modules/schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", "dev": true, "dependencies": { "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", + "ajv": "^8.9.0", "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" + "ajv-keywords": "^5.1.0" }, "engines": { "node": ">= 12.13.0" @@ -12457,9 +12227,9 @@ } }, "node_modules/webpack-dev-server": { - "version": "4.11.1", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.11.1.tgz", - "integrity": "sha512-lILVz9tAUy1zGFwieuaQtYiadImb5M3d+H+L1zDYalYoDl0cksAB1UNyuE5MMWJrG6zR1tXkCP2fitl7yoUJiw==", + "version": "4.15.2", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.2.tgz", + "integrity": "sha512-0XavAZbNJ5sDrCbkpWL8mia0o5WPOd2YGtxrEiZkBK9FjLppIUK2TgxK6qGD2P3hUXTJNNPVibrerKcx5WkR1g==", "dev": true, "dependencies": { "@types/bonjour": "^3.5.9", @@ -12468,7 +12238,7 @@ "@types/serve-index": "^1.9.1", "@types/serve-static": "^1.13.10", "@types/sockjs": "^0.3.33", - "@types/ws": "^8.5.1", + "@types/ws": "^8.5.5", "ansi-html-community": "^0.0.8", "bonjour-service": "^1.0.11", "chokidar": "^3.5.3", @@ -12481,6 +12251,7 @@ "html-entities": "^2.3.2", "http-proxy-middleware": "^2.0.3", "ipaddr.js": "^2.0.1", + "launch-editor": "^2.6.0", "open": "^8.0.9", "p-retry": "^4.5.0", "rimraf": "^3.0.2", @@ -12489,8 +12260,8 @@ "serve-index": "^1.9.1", "sockjs": "^0.3.24", "spdy": "^4.0.2", - "webpack-dev-middleware": "^5.3.1", - "ws": "^8.4.2" + "webpack-dev-middleware": "^5.3.4", + "ws": "^8.13.0" }, "bin": { "webpack-dev-server": "bin/webpack-dev-server.js" @@ -12506,42 +12277,33 @@ "webpack": "^4.37.0 || ^5.0.0" }, "peerDependenciesMeta": { + "webpack": { + "optional": true + }, "webpack-cli": { "optional": true } } }, - "node_modules/webpack-dev-server/node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, "node_modules/webpack-dev-server/node_modules/ipaddr.js": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", - "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz", + "integrity": "sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==", "dev": true, "engines": { "node": ">= 10" } }, "node_modules/webpack-dev-server/node_modules/schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", "dev": true, "dependencies": { "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", + "ajv": "^8.9.0", "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" + "ajv-keywords": "^5.1.0" }, "engines": { "node": ">= 12.13.0" @@ -12552,9 +12314,9 @@ } }, "node_modules/webpack-dev-server/node_modules/ws": { - "version": "8.12.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.12.1.tgz", - "integrity": "sha512-1qo+M9Ba+xNhPB+YTWUlK6M17brTut5EXbcBaMRN5pH5dFrXz7lzz1ChFSUq3bOUl8yEvSenhHmYUNJxFzdJew==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", "dev": true, "engines": { "node": ">=10.0.0" @@ -12573,12 +12335,13 @@ } }, "node_modules/webpack-merge": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", - "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", + "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", "dev": true, "dependencies": { "clone-deep": "^4.0.1", + "flat": "^5.0.2", "wildcard": "^2.0.0" }, "engines": { @@ -12617,15 +12380,11 @@ "node": ">=0.8.0" } }, - "node_modules/whatwg-fetch": { - "version": "3.6.19", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.19.tgz", - "integrity": "sha512-d67JP4dHSbm2TrpFj8AbO8DnL1JXL5J9u0Kq2xW6d0TFDbCA3Muhdt8orXC22utleTVj7Prqt82baN6RBvnEgw==" - }, "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==", + "dev": true, "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" @@ -12662,25 +12421,17 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==", - "dev": true, - "optional": true - }, "node_modules/which-typed-array": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", - "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", + "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", "dev": true, "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", "for-each": "^0.3.3", "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0", - "is-typed-array": "^1.1.10" + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -12699,15 +12450,15 @@ } }, "node_modules/wildcard": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", - "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", + "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", "dev": true }, "node_modules/word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", "dev": true, "engines": { "node": ">=0.10.0" @@ -12737,9 +12488,9 @@ "dev": true }, "node_modules/ws": { - "version": "7.5.9", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", - "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "dev": true, "engines": { "node": ">=8.3.0" @@ -12757,42 +12508,6 @@ } } }, - "node_modules/xhr": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/xhr/-/xhr-2.6.0.tgz", - "integrity": "sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA==", - "dependencies": { - "global": "~4.4.0", - "is-function": "^1.0.1", - "parse-headers": "^2.0.0", - "xtend": "^4.0.0" - } - }, - "node_modules/xml-parse-from-string": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/xml-parse-from-string/-/xml-parse-from-string-1.0.1.tgz", - "integrity": "sha512-ErcKwJTF54uRzzNMXq2X5sMIy88zJvfN2DmdoQvy7PAFJ+tPRU6ydWuOKNMyfmOjdyBQTFREi60s0Y0SyI0G0g==" - }, - "node_modules/xml2js": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", - "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", - "dependencies": { - "sax": ">=0.6.0", - "xmlbuilder": "~11.0.0" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/xml2js/node_modules/xmlbuilder": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", - "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", - "engines": { - "node": ">=4.0" - } - }, "node_modules/xmlbuilder": { "version": "15.1.1", "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", @@ -12814,6 +12529,8 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true, + "optional": true, "engines": { "node": ">=0.4" } @@ -12822,12 +12539,14 @@ "version": "4.19.0", "resolved": "https://registry.npmjs.org/xterm/-/xterm-4.19.0.tgz", "integrity": "sha512-c3Cp4eOVsYY5Q839dR5IejghRPpxciGmLWWaP9g+ppfMeBChMeLa1DCA+pmX/jyDZ+zxFOmlJL/82qVdayVoGQ==", + "deprecated": "This package is now deprecated. Move to @xterm/xterm instead.", "dev": true }, "node_modules/xterm-addon-fit": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/xterm-addon-fit/-/xterm-addon-fit-0.5.0.tgz", "integrity": "sha512-DsS9fqhXHacEmsPxBJZvfj2la30Iz9xk+UKjhQgnYNkrUIN5CYLbw7WEfz117c7+S86S/tpHPfvNxJsF5/G8wQ==", + "deprecated": "This package is now deprecated. Move to @xterm/addon-fit instead.", "dev": true, "peerDependencies": { "xterm": "^4.0.0" @@ -12837,6 +12556,7 @@ "version": "0.8.2", "resolved": "https://registry.npmjs.org/xterm-addon-search/-/xterm-addon-search-0.8.2.tgz", "integrity": "sha512-I1863mjn8P6uVrqm/X+btalVsqjAKLhnhpbP7SavAOpEkI1jJhbHU2UTp7NjeRtcKTks6UWk/ycgds5snDSejg==", + "deprecated": "This package is now deprecated. Move to @xterm/addon-search instead.", "dev": true, "peerDependencies": { "xterm": "^4.0.0" @@ -12854,20 +12574,24 @@ "node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true }, "node_modules/yaml": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.1.tgz", - "integrity": "sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==", + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.3.tgz", + "integrity": "sha512-sntgmxj8o7DE7g/Qi60cqpLBA3HG3STcDA0kO+WfB05jEKhZMbY7umNm2rBpQvsmZ16/lPXCJGW2672dgOUkrg==", + "bin": { + "yaml": "bin.mjs" + }, "engines": { "node": ">= 14" } }, "node_modules/yargs": { - "version": "17.6.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.2.tgz", - "integrity": "sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==", + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dev": true, "dependencies": { "cliui": "^8.0.1", @@ -12934,9 +12658,9 @@ } }, "node_modules/yarn-or-npm/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "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" diff --git a/package.json b/package.json index abe2b24a..86e49446 100644 --- a/package.json +++ b/package.json @@ -1,9 +1,9 @@ { - "name": "zowe-enterprise-necessity", + "name": "zowe-install-wizard", "author": "Zowe", - "description": "Zowe Enterprise Necessity", - "productName": "zowe-enterprise-necessity", - "version": "1.0.0", + "description": "Zowe Server Install Wizard", + "productName": "zowe-install-wizard", + "version": "1.0.1", "main": ".webpack/main", "scripts": { "start": "electron-forge start --enable-logging", @@ -17,13 +17,13 @@ "keywords": [], "license": "EPL 2.0", "devDependencies": { - "@electron-forge/cli": "^6.0.5", - "@electron-forge/maker-deb": "^6.0.5", - "@electron-forge/maker-dmg": "^6.0.5", - "@electron-forge/maker-rpm": "^6.0.5", - "@electron-forge/maker-squirrel": "^6.0.5", - "@electron-forge/maker-zip": "^6.0.5", - "@electron-forge/plugin-webpack": "^6.0.5", + "@electron-forge/cli": "^6.4.0", + "@electron-forge/maker-deb": "^6.4.0", + "@electron-forge/maker-dmg": "^6.4.0", + "@electron-forge/maker-rpm": "^6.4.0", + "@electron-forge/maker-squirrel": "^6.4.0", + "@electron-forge/maker-zip": "^6.4.0", + "@electron-forge/plugin-webpack": "^6.4.0", "@playwright/test": "^1.38.0", "@types/flat": "^5.0.2", "@types/js-yaml": "^4.0.5", @@ -32,9 +32,9 @@ "@types/react-router-dom": "^5.3.3", "@typescript-eslint/eslint-plugin": "^5.52.0", "@typescript-eslint/parser": "^5.52.0", - "@vercel/webpack-asset-relocator-loader": "^1.7.3", + "@vercel/webpack-asset-relocator-loader": "1.7.3", "css-loader": "^6.7.3", - "electron": "22.0.0", + "electron": "^26.0.0", "electron-playwright-helpers": "^1.6.0", "eslint": "^8.34.0", "eslint-plugin-header": "^3.1.1", @@ -64,10 +64,10 @@ "@types/flat": "^5.0.2", "ajv": "^8.12.0", "ajv-formats": "^2.1.1", + "electron-log": "^5.1.5", "electron-squirrel-startup": "^1.0.0", "electron-store": "^8.1.0", "flat": "^5.0.2", - "jimp": "^0.22.10", "js-yaml": "^4.1.0", "react": "^18.2.0", "react-dom": "^18.2.0", diff --git a/playwright_test/Pages/apfAuth.page.ts b/playwright_test/Pages/apfAuth.page.ts index aad9acfc..80cb429e 100644 --- a/playwright_test/Pages/apfAuth.page.ts +++ b/playwright_test/Pages/apfAuth.page.ts @@ -80,6 +80,10 @@ class ApfAuthPage { this.dataset_prefix_value = page.getByLabel('Dataset Prefix') this.auth_load_lib_value = page.getByLabel('APF Authorized Load Library') this.auth_plugin_lib_value = page.getByLabel('Zowe ZIS Plugins Load Library') + + //this.select_SMPE = page.getByLabel('//button[contains(text(),"SMP/E")]') + this.select_SMPE = page.locator('span:has-text("SMP/E")'); + } commonPage = new CommonPage(); @@ -94,13 +98,16 @@ class ApfAuthPage { await this.click_ApfAuth.click({ timeout: 9000 }) } - async movetoInstallationPage() { - await this.commonPage.waitForElement(this.licenseAgreement) - await this.licenseAgreement.click({ timeout: 9000 }) - await this.commonPage.waitForElement(this.acceptLicense) - await this.acceptLicense.click({ timeout: 9000 }) - await this.commonPage.waitForElement(this.continueToComponentInstallation) - await this.continueToComponentInstallation.click({ timeout: 5000 }) + async selectInstallationType(){ + await this.select_SMPE.waitFor({ state: 'visible', timeout: 9000 }); // Adjust timeout if needed + console.log('SMP/E span is visible.'); + await this.select_SMPE.click({timeout: 9000}) + } + + async movetoInstallationPage(){ + await this.licenseAgreement.click({timeout: 9000}) + await this.acceptLicense.click({timeout: 9000}) + await this.continueToComponentInstallation.click({timeout: 5000}) } async fillApfDetails(datasetPrefix: string, authLoadLib: string, authpluginLib: string) { diff --git a/playwright_test/Pages/connection.page.ts b/playwright_test/Pages/connection.page.ts index 8a8d8dc1..1734b13e 100644 --- a/playwright_test/Pages/connection.page.ts +++ b/playwright_test/Pages/connection.page.ts @@ -27,27 +27,18 @@ class ConnectionPage { this.resumeProgress = page.locator('//button[contains(text(),"Resume Progress")]') this.greenCheckIconSelector = page.locator('.MuiContainer-root svg[data-testid="CheckCircleIcon"]') } - - commonPage = new CommonPage(); - - async fillConnectionDetails(host: string, port: string, username: string, password: string) { - await this.commonPage.waitForElement(this.host) - await this.host.clear({ timeout: 2000 }) - await this.host.fill(host) - await this.commonPage.validateElementValue(this.host, host) - await this.commonPage.waitForElement(this.port) - await this.port.clear({ timeout: 2000 }) + async fillConnectionDetails(host: string, port: string, username: string, password: string){ + console.log("Filling connection details..."); + await this.host.fill(host); + await this.page.waitForTimeout(1000); await this.port.fill(port) await this.commonPage.validateElementValue(this.port, port) await this.commonPage.waitForElement(this.userName) await this.userName.clear({ timeout: 2000 }) await this.userName.fill(username) - await this.commonPage.validateElementValue(this.userName, username) - await this.commonPage.waitForElement(this.password) - await this.password.clear({ timeout: 2000 }) - await this.password.fill(password) - await this.commonPage.validateElementValue(this.password, password) - return true + await this.page.waitForTimeout(1000); + await this.password.fill(password); + console.log("Connection details filled."); } async performLogin(host: string, port: string, username: string, password: string) { @@ -83,9 +74,11 @@ class ConnectionPage { return await this.connectionPageTitle.textContent(); } - async SubmitValidateCredential() { - await this.commonPage.waitForElement(this.validateCredential) - await this.validateCredential.click() + async SubmitValidateCredential(){ + console.log("Submitting credentials..."); + await this.page.waitForTimeout(1000); + await this.validateCredential.click(); + console.log("Credentials submitted."); } async clickContinueButton() { @@ -102,7 +95,6 @@ class ConnectionPage { await this.commonPage.waitForElement(this.continueButton) return await this.continueButton.isDisabled(); } - async isGreenCheckIconVisible() { await this.commonPage.waitForElement(this.greenCheckIconSelector) return await this.greenCheckIconSelector.isHidden(); diff --git a/playwright_test/Pages/installation.page.ts b/playwright_test/Pages/installation.page.ts index 5739f07d..73d0137d 100644 --- a/playwright_test/Pages/installation.page.ts +++ b/playwright_test/Pages/installation.page.ts @@ -53,111 +53,93 @@ class InstallationPage { return await this.pageTitle.textContent({ timeout: 2000 }); } - async enterPrefix(prefix: any) { - await this.commonPage.waitForElement(this.prefix) - await this.prefix.clear({ timeout: 2000 }) + async enterPrefix(prefix: string): Promise{ + await this.page.waitForTimeout(500) await this.prefix.fill(prefix); await this.commonPage.validateElementValue(this.prefix, prefix) } - async getPrefixValue() { - await this.commonPage.waitForElement(this.prefix) - return await this.prefix.textContent(); + async getPrefixValue(): Promise { + return await this.prefix.inputValue(); } - async enterProcLib(proclib: any) { - await this.commonPage.waitForElement(this.procLib) - await this.procLib.clear({ timeout: 2000 }) + async enterProcLib(proclib: string): Promise { + await this.page.waitForTimeout(500) await this.procLib.fill(proclib); await this.commonPage.validateElementValue(this.procLib, proclib) } - async getProclibValue() { - await this.commonPage.waitForElement(this.procLib) - return await this.procLib.textContent(); + + async getProclibValue(): Promise { + return await this.procLib.inputValue(); } - async enterParmLib(parmlib: any) { - await this.commonPage.waitForElement(this.parmLib) - await this.parmLib.clear({ timeout: 2000 }) + async enterParmLib(parmlib: string): Promise{ + await this.page.waitForTimeout(500) await this.parmLib.fill(parmlib); await this.commonPage.validateElementValue(this.parmLib, parmlib) } - async getParmlibValue() { - await this.commonPage.waitForElement(this.parmLib) - return await this.parmLib.textContent(); + async getParmlibValue(): Promise { + return await this.parmLib.inputValue(); } - async enterZis(zis: any) { - await this.commonPage.waitForElement(this.zis) - await this.zis.clear({ timeout: 2000 }) + async enterZis(zis: string): Promise { + await this.page.waitForTimeout(500) await this.zis.fill(zis); await this.commonPage.validateElementValue(this.zis, zis) } - async enterJclLib(Jcllib: any) { - await this.commonPage.waitForElement(this.jclLib) - await this.jclLib.clear({ timeout: 2000 }) + async enterJclLib(Jcllib: string): Promise { + await this.page.waitForTimeout(500) await this.jclLib.fill(Jcllib); await this.commonPage.validateElementValue(this.jclLib, Jcllib) } - async enterLoadLib(loadlib: any) { - await this.commonPage.waitForElement(this.loadLib) - await this.loadLib.clear({ timeout: 2000 }) + async enterLoadLib(loadlib: string): Promise{ + await this.page.waitForTimeout(500) await this.loadLib.fill(loadlib); await this.commonPage.validateElementValue(this.loadLib, loadlib) } - async enterAuthLoadLib(authloadlib: any) { - await this.commonPage.waitForElement(this.authLoadLib) - await this.authLoadLib.clear({ timeout: 2000 }) + async enterAuthLoadLib(authloadlib: string): Promise { await this.authLoadLib.fill(authloadlib); - await this.commonPage.validateElementValue(this.authLoadLib, authloadlib) + await this.page.waitForTimeout(5000) } - async getAuthLoadLibValue() { - await this.commonPage.waitForElement(this.authLoadLib) - return await this.authLoadLib.textContent(); + async getAuthLoadLibValue(): Promise { + return await this.authLoadLib.inputValue(); } - async enterAuthPluginLib(authpluginlib: any) { - await this.commonPage.waitForElement(this.authPluginLib) - await this.authPluginLib.clear({ timeout: 2000 }) + async enterAuthPluginLib(authpluginlib: string): Promise { await this.authPluginLib.fill(authpluginlib); - await this.commonPage.validateElementValue(this.authPluginLib, authpluginlib) + await this.page.waitForTimeout(5000) } - async getAuthPluginLibValue() { - await this.commonPage.waitForElement(this.authPluginLib) - return await this.authPluginLib.textContent(); + async getAuthPluginLibValue(): Promise { + return await this.authPluginLib.inputValue(); } - async clickInstallMvsDatasets() { - await this.commonPage.waitForElement(this.installMVSDatasets) - await this.installMVSDatasets.click(); + async clickInstallMvsDatasets(){ + await this.installMVSDatasets.click(); + await this.waitForContinueButtonToBeEnabled(); } - async clickViewEditYaml() { - await this.commonPage.waitForElement(this.viewEditYaml) + async clickViewEditYaml(){ await this.viewEditYaml.click(); } - async clickViewSubmitJob() { - await this.commonPage.waitForElement(this.viewSubmitJob) + async clickViewSubmitJob(){ await this.viewSubmitJob.click(); } - async clickViewJobOutput() { - await this.commonPage.waitForElement(this.viewJobOutput) + async clickViewJobOutput(){ await this.viewJobOutput.click(); await this.page.waitForTimeout(2000); } - async clickSaveAndClose() { - await this.commonPage.waitForElement(this.saveAndClose) - await this.saveAndClose.click({ timeout: 2000 }); + async clickSaveAndClose(){ + await this.saveAndClose.click({timeout: 2000}); } async clickPreviousStep() { @@ -175,18 +157,16 @@ class InstallationPage { await this.continueToNetworkSetup.click(); } - async isContinueToNetworkSetupDisabled() { - await this.commonPage.waitForElement(this.continueToNetworkSetup) + async isContinueToNetworkSetupDisabled(){ return await this.continueToNetworkSetup.isDisabled() } - async isContinueToNetworkSetupEnabled() { - await this.commonPage.waitForElement(this.continueToNetworkSetup) + async isContinueToNetworkSetupEnabled(){ return await this.continueToNetworkSetup.isEnabled() } - async open_monacoEditor() { - await this.commonPage.waitForElement(this.viewEditYaml) + async open_monacoEditor(){ + await this.page.waitForTimeout(1000) this.viewEditYaml.click({ timeout: 2000 }) await this.commonPage.waitForElement(this.editorTitleElement) const editor_title = await this.editorTitleElement.textContent(); @@ -198,5 +178,22 @@ class InstallationPage { await this.closeEditorButton.click(); } + async clickInstallMvsDatasetsInvalid(){ + await this.installMVSDatasets.click(); + } + + async fillAllFields(datasetPrefix: string, parmLib: string, procLib: string, jclLib: string, loadLib: string, authLoadLib: string, authPluginLib: string){ + await this.enterPrefix(datasetPrefix); + await this.enterParmLib(parmLib); + await this.enterProcLib(procLib); + await this.enterJclLib(jclLib); + await this.enterLoadLib(loadLib); + await this.enterAuthLoadLib(authLoadLib); + await this.enterAuthPluginLib(authPluginLib); + await this.enterAuthLoadLib(authLoadLib); + await this.enterAuthPluginLib(authPluginLib); + await this.enterAuthLoadLib(authLoadLib); + await this.enterAuthPluginLib(authPluginLib); + } } export default InstallationPage; diff --git a/playwright_test/Pages/installationType.page.ts b/playwright_test/Pages/installationType.page.ts index 7d4ce1fb..459842be 100644 --- a/playwright_test/Pages/installationType.page.ts +++ b/playwright_test/Pages/installationType.page.ts @@ -27,7 +27,7 @@ class InstallationTypePage { this.uploadPax = page.locator("//span[text()='Upload Zowe PAX for offline install']/preceding-sibling::span/input") this.smpe = page.locator("//span[text()='SMP/E']/preceding-sibling::span/input") this.licenseAgreement = page.locator("//button[text()='License Agreement']") - this.saveAndClose = page.locator("//button[contains(text(),'Save & close')]") + this.saveAndClose = page.locator("//button[contains(text(),'Save & close')]") this.previousStep = page.locator("//button[contains(text(),'Previous step')]") this.continueToComponentInstallation = page.locator("//button[text()='Continue to Components Installation']") this.zoweLink = page.locator("//a[@href='zowe.org']") @@ -37,97 +37,107 @@ class InstallationTypePage { this.validateLocation = page.locator("//button[text()= 'Validate location']") this.validateLocationGreenCheck = page.locator("//button[text()='Validate location']//following-sibling::*[@data-testid='CheckCircleIcon']") this.licenseAgreementGreenCheck = page.locator("//button[text()='License Agreement']//following-sibling::*[@data-testid='CheckCircleIcon']") + this.continueUpnax = page.locator("//button[contains(text(),'Continue to Unpax')]") + this.retrieveExampleZoweYaml = page.locator("//button[contains(text(),'Retrieve example-zowe.yaml')]") + this.continueCompInstallation = page.locator("//button[contains(text(),'Continue to Components Installation')]") + this.skipUnpaxButton = page.locator("//button[text()='Skip ']") } - commonPage = new CommonPage(); - - async getInstallationTypePageTitle() { - await this.commonPage.waitForElement(this.pageTitle) + async getInstallationTypePageTitle(){ return await this.pageTitle.textContent({ timeout: 2000 }); } - async selectDownloadZowePax() { - await this.commonPage.waitForElement(this.downloadPax) - await this.downloadPax.click({ timeout: 5000 }) + async selectDownloadZowePax(){ + await this.downloadPax.click({timeout: 5000}) + } + + async selectUploadZowePax(){ + await this.uploadPax.click({timeout: 5000}); } - async selectUploadZowePax() { - await this.commonPage.waitForElement(this.uploadPax) - await this.uploadPax.click({ timeout: 5000 }); + async selectSmpe(){ + await this.smpe.click({timeout: 5000}); } - async selectSmpe() { - await this.commonPage.waitForElement(this.smpe) - await this.smpe.click({ timeout: 5000 }); + async continueToUnpax(){ + await this.continueUpnax.click({timeout: 5000}); } - async clickZoweLink() { - await this.commonPage.waitForElement(this.zoweLink) + async retrieveExampleYaml(){ + await this.retrieveExampleZoweYaml.click({timeout: 5000}); + } + + async continueComponentInstallation(){ + const timeout = 5000; + const interval = 500; + while (true) { + if (await this.continueCompInstallation.isEnabled()) { + await this.continueCompInstallation.click(); + return; + } + await this.page.waitForTimeout(interval); + } + await this.continueCompInstallation.click({timeout: timeout}); + } + + async clickZoweLink(){ await this.zoweLink.click(); } - async clickLicenseAgreement() { - await this.commonPage.waitForElement(this.licenseAgreement) - await this.licenseAgreement.click({ timeout: 5000 }); + async clickLicenseAgreement(){ + await this.licenseAgreement.click({timeout: 5000}); } - async clickSaveAndClose() { - await this.commonPage.waitForElement(this.saveAndClose) - await this.saveAndClose.click({ timeout: 5000 }); - await this.page.waitForTimeout(2000) + async clickSaveAndClose(){ + await this.saveAndClose.click({timeout: 5000}); } - async clickPreviousStep() { - await this.commonPage.waitForElement(this.previousStep) + async clickPreviousStep(){ await this.previousStep.click(); - await this.page.waitForTimeout(2000) } - async clickContinueToInstallation() { - await this.commonPage.waitForElement(this.continueToComponentInstallation) + async clickContinueToInstallation(){ await this.continueToComponentInstallation.click(); - await this.page.waitForTimeout(5000); } - async isContinueToComponentInstallationDisabled() { - await this.commonPage.waitForElement(this.continueToComponentInstallation) + async isContinueToComponentInstallationDisabled(){ return await this.continueToComponentInstallation.isDisabled() } - async isContinueToComponentInstallationEnabled() { - await this.commonPage.waitForElement(this.continueToComponentInstallation) + async isContinueToComponentInstallationEnabled(){ return await this.continueToComponentInstallation.isEnabled() } - async clickAgreeLicense() { - await this.commonPage.waitForElement(this.agreeLicense) - await this.agreeLicense.click({ timeout: 5000 }); + async isContinueUnpaxEnabled(){ + return await this.continueUpnax.isEnabled() + } + + async clickAgreeLicense(){ + await this.agreeLicense.click({timeout: 5000}); } - async isLicenseAgreementGreenCheckVisible() { - await this.commonPage.waitForElement(this.licenseAgreementGreenCheck) + async isLicenseAgreementGreenCheckVisible(){ return await this.licenseAgreementGreenCheck.isVisible(); } - async clickUploadPaxButton() { - await this.commonPage.waitForElement(this.uploadPaxButton) - await this.uploadPaxButton.click({ timeout: 5000 }); + async clickUploadPaxButton(){ + await this.uploadPaxButton.click({timeout: 5000}); + } + + async skipUnpax(){ + await this.skipUnpaxButton.click({timeout: 5000}); } - async enterRuntimeDir(runtimeDir: any) { - await this.commonPage.waitForElement(this.runtimeDir) - await this.runtimeDir.clear({ timeout: 5000 }) + async enterRuntimeDir(runtimeDir: any){ + await this.runtimeDir.clear({timeout: 5000}) await this.runtimeDir.fill(runtimeDir); } - async clickValidateLocation() { - await this.commonPage.waitForElement(this.validateLocation) - await this.validateLocation.click({ timeout: 5000 }); - await this.page.waitForTimeout(2000) + async clickValidateLocation(){ + await this.validateLocation.click({timeout: 5000}); } - async isValidateLocationGreenCheckVisible() { - await this.commonPage.waitForElement(this.validateLocationGreenCheck) + async isValidateLocationGreenCheckVisible(){ return await this.validateLocationGreenCheck.isVisible(); } @@ -139,9 +149,7 @@ class InstallationTypePage { async uploadZowePaxAndNavigateToInstallationPage(uploadPaxPath: any) { this.selectUploadZowePax() - await this.commonPage.waitForElement(this.uploadPaxButton) await this.uploadPaxButton.setInputFiles(uploadPaxPath) - await this.page.waitForTimeout(2000) } async smpeZowePaxAndNavigateToInstallationPage(runtimeDir: any) { @@ -149,6 +157,5 @@ class InstallationTypePage { this.enterRuntimeDir(runtimeDir) this.clickValidateLocation() } - } export default InstallationTypePage; diff --git a/playwright_test/Pages/networking.page.ts b/playwright_test/Pages/networking.page.ts index 5231de09..5a2c2f1f 100644 --- a/playwright_test/Pages/networking.page.ts +++ b/playwright_test/Pages/networking.page.ts @@ -21,67 +21,6 @@ class NetworkingPage { close_button: Locator; CONFPAGE_TITLE: Locator; continueToComponentInstallation: Locator; - addDomainField: Locator; - domainName: Locator; - click_networking: Locator; - fillExternalDomainValue: Locator; - externalDomains: Locator; - externalPort: Locator; - getExternalPortValue: Locator; - components: Locator; - metricService: Locator; - metricServiceEnbaled: Locator; - metricServiceDebug: Locator; - metricServicePort: Locator; - zss: Locator; - zssTls: Locator; - zssPort: Locator; - zssEnabled: Locator; - explorerUss: Locator; - explorerUssEnabled: Locator; - jobsApi: Locator; - jobsApiDebug: Locator; - jobsApiEnabled: Locator; - jobsApiPort: Locator; - filesApi: Locator; - filesApiDebug: Locator; - filesApiEnabled: Locator; - filesApiPort: Locator; - explorerMvs: Locator; - explorerMvsEnabled: Locator; - cloudGateway: Locator; - cloudGatewayDebug: Locator; - cloudGatewayEnabled: Locator; - cloudGatewayPort: Locator; - explorerJes: Locator; - explorerJesEnabled: Locator; - apiCatalog: Locator; - apiCatalogDebug: Locator; - apiCatalogEnabled: Locator; - apicatalogPort: Locator; - gateway: Locator; - gatewayDebug: Locator; - gatewayEnabled: Locator; - gatewayPort: Locator; - appServer: Locator; - appServerDebug: Locator; - appServerEnabled: Locator; - appServerPort: Locator; - cachingService: Locator; - cachingServiceDebug: Locator; - cachingServiceEnabled: Locator; - cachingServicePort: Locator; - discovery: Locator; - discoveryDebug: Locator; - discoveryEnabled: Locator; - discoveryPort: Locator; - metricService_debug_checkbox: Locator; - metricService_enabled_checkbox: Locator; - deleteDomainName: Locator; - NETWORKING_TITLE: Locator; - viewAndSubmitJob: Locator; - APFAUTH_TITLE: Locator; - installationTitle: Locator; constructor(page: Page) { this.page = page; @@ -96,7 +35,7 @@ class NetworkingPage { this.metricService = page.locator('//strong[text()="metrics-service"]'); this.metricServiceEnbaled = page.locator('//*[@id="zen-root-container"]/div[2]/div/div[4]/div/form/div/div[2]/label[2]'); this.metricServiceDebug = page.locator('//*[@id="zen-root-container"]/div[2]/div/div[4]/div/form/div/div[2]/label[1]'); - this.metricServicePort = page.locator('//html/body/div/div[2]/div/div[4]/div/form/div/div[2]/div[4]/div/input'); + this.metricServicePort = page.locator('input[id=":rq:"]'); this.zss = page.getByLabel('zss'); this.zssTls = page.locator('//*[@id="zen-root-container"]/div[2]/div/div[4]/div/form/div/div[2]/label[3]'); this.zssPort = page.locator('//*[@id=":r1l:-label"]'); @@ -139,24 +78,26 @@ class NetworkingPage { this.discoveryDebug = page.locator('//*[@id="zen-root-container"]/div[2]/div/div[4]/div/form/div/div[2]/label[22]'); this.discoveryEnabled = page.locator('//*[@id="zen-root-container"]/div[2]/div/div[4]/div/form/div/div[2]/label[23]'); this.discoveryPort = page.locator('//*[@id=":r25:-label"]'); - this.metricService_debug_checkbox = page.locator('//*[@id="zen-root-container"]/div[2]/div/div[4]/div/form/div/div[2]/label[1]/span[1]/input'); + this.explorerUSS_debug_checkbox = page.locator('//*[@id="container-box-id"]/form/div/div[2]/div[4]/div/div[4]/div[1]/label/span[1]/input'); + this.app_server_debug = page.locator('//*[@id="container-box-id"]/form/div/div[2]/div[4]/div/div[11]/div[1]/label/span[1]/input'); + this.metricService_debug_checkbox = page.locator('//*[@id="container-box-id"]/form/div/div[2]/div[4]/div/div[1]/div[1]/label/span[1]/input'); this.metricService_enabled_checkbox = page.locator('//*[@id="zen-root-container"]/div[2]/div/div[4]/div/form/div/div[2]/label[2]/span[1]/input'); this.deleteDomainName = page.locator('//*[@id="zen-root-container"]/div[2]/div/div[4]/div/form/div/div[2]/div[2]/button'); this.readYaml = page.locator('div.view-lines'); this.previous_step_button = page.locator('//button[contains(text(),"Previous step")]'); - this.skip_button = page.locator('//button[contains(text(),"Skip")]'); this.editor_title_element = page.locator('//h2[text()="Editor"]'); this.NETWORKING_TITLE = page.locator(' //div[text()="Networking"]'); this.licenseAgreement = page.locator('//button[contains(text(), "License Agreement")]'); this.acceptLicense = page.locator('//html/body/div[2]/div[3]/div/div[2]/button[1]'); this.continueToComponentInstallation = page.locator('//button[contains(text(), "Continue to Components Installation")]'); - this.view_yaml = page.locator('//button[contains(text(),"View Yaml")]'); - this.viewAndSubmitJob = page.locator('//button[contains(text(), "Preview Job")]'); - this.view_job_output = page.locator('//button[contains(text(), "Submit Job")]'); - this.save_and_close = page.locator('//button[contains(text(),"Save & close")]'); + this.view_yaml = page.locator('//button[contains(text(), "View/Edit Yaml")]'); + this.viewAndSubmitJob = page.locator('//button[contains(text(), "Preview Job")]'); + this.view_job_output = page.locator('//button[contains(text(), "Submit Job")]'); + this.save_and_close = page.locator('//button[contains(text(),"Save & close")]'); this.previous_step = page.locator('//button[contains(text(),"Previous step")]'); - this.skip_button = page.locator('//button[contains(text(),"Skip")]'); - this.close_button = page.locator('//button[contains(text(), "Close")]'); + this.skip_button = page.locator('//button[contains(text(),"Skip ")]'); + //*[@id="zen-root-container"]/div[2]/div/div[5]/button[2] + this.close_button = page.locator("//button[text()='Close']"); this.APFAUTH_TITLE = page.locator('//div[text()="APF Authorize Load Libraries"]'); this.continueToApfAuthSetup = page.locator('//button[contains(text(), "Continue to APF Auth Setup")]'); this.installationTitle = page.locator('//div[text()="Installation"]'); @@ -181,27 +122,17 @@ class NetworkingPage { return networking_title; } - async fillExternalDomainPort(port: string, p0: { timeout: number; }) { - await this.commonPage.waitForElement(this.externalPort) - await this.externalPort.clear({ timeout: 2000 }) - await this.externalPort.fill(port, { timeout: 10000 }) + async fillExternalDomainPort(port: number){ + await this.externalPort.fill(port, { timeout: 10000 }) } - async fillMetricServicePort(port: string) { - // Scroll down a bit - await this.page.evaluate(() => { - window.scrollBy(0, 200); - }); - // Add a wait after scrolling - await this.commonPage.waitForElement(this.metricServicePort) - await this.metricServicePort.clear({ timeout: 2000 }) - await this.metricServicePort.fill(port, { timeout: 10000 }) + async fillMetricServicePort(port: string){ + await this.metricServicePort.waitFor({ state: 'visible', timeout: 10000 }); + await this.metricServicePort.fill(port, { timeout: 10000 }); } - async get_metricServiceport_value() { - await this.commonPage.waitForElement(this.metricServicePort) - const value = await this.metricServicePort.inputValue(); - return value; + async get_metricServiceport_value(): Promise { + return await this.metricServicePort.inputValue(); } async fillExternalDomainName(externalDomainName: string, p0: { timeout: number; }) { @@ -210,9 +141,9 @@ class NetworkingPage { await this.domainName.fill(externalDomainName, { timeout: 10000 }); } - async fillexternal_domainvalues(externalDomainName: string, port: string) { - await this.fillExternalDomainName(externalDomainName, { timeout: 10000 }); - await this.fillExternalDomainPort(port, { timeout: 10000 }) + async fillexternal_domainvalues(externalDomainName:string, port: number){ + await this.fillExternalDomainName(externalDomainName, { timeout: 10000 }); + await this.fillExternalDomainPort(port, { timeout: 10000 }) } async get_externalDomainName_value() { @@ -227,42 +158,62 @@ class NetworkingPage { return value; } - async click_checkBox(n: string) { - const xpathLocator = `//*[@id="zen-root-container"]/div[2]/div/div[4]/div/form/div/div[2]/label[${n}]/span[1]/input`; + async click_checkBox(xpath: string): Promise { + //const html = await this.page.content(); // Get the HTML content + //console.log(html); + try { + const checkbox = await this.page.waitForSelector(xpath, { state: 'visible' }); + const isChecked = await checkbox.evaluate((input) => input.checked); + if (!isChecked) { + await checkbox.click(); + } + } catch (error) { + console.error(`Error checking checkbox with XPath "${xpath}":`, error); + return false; + } + } - const checkbox = await this.page.waitForSelector(xpathLocator, { state: 'visible' }); - if (checkbox) { - const isChecked = await checkbox.evaluate((input) => input.checked); - console.log('Is checkbox checked:', isChecked); - if (!isChecked) { - await checkbox.click(); - console.log('Checkbox clicked'); + async isCheckboxCheckedAndBlue(xpath: string): Promise{ + try{ + const checkbox = await this.page.waitForSelector(xpath); + if (checkbox) { + const isChecked = await checkbox.evaluate((input) => input.checked); + return isChecked; } else { - console.log('Checkbox is already checked'); + return false; } - } else { - console.log('Checkbox not found'); - } + } catch (error){ + console.log('Checkbox not found'); + return false; + + } } - async isCheckboxCheckedAndBlue(nthChild: string) { - const xpathLocator = `//*[@id="zen-root-container"]/div[2]/div/div[4]/div/form/div/div[2]/label[${nthChild}]/span[1]/input`; + async isMetricsServiceDebugChecked(): Promise { + return await this.isCheckboxCheckedAndBlue(this.metricService_debug_checkbox); + } - const checkbox = await this.page.waitForSelector(xpathLocator); + async clickMetricsServiceDebug(): Promise { + await this.click_checkBox(this.metricService_debug_checkbox); + } - if (checkbox) { - // Check if the checkbox is clicked - const isChecked = await checkbox.evaluate((input) => input.checked); - console.log('Is checkbox clicked:', isChecked); - return isChecked; - } else { - console.log('Checkbox not found'); - return false; - } + async isExplorerUssDebugChecked(): Promise { + return await this.isCheckboxCheckedAndBlue(this.explorerUSS_debug_checkbox); } + async isAppServerDebugChecked(): Promise { + return await this.isCheckboxCheckedAndBlue(this.app_server_debug); + } + + async clickExplorerUssDebug(): Promise { + await this.click_checkBox(this.explorerUSS_debug_checkbox); + } + + async clickAppServerDebug(): Promise { + await this.click_checkBox(this.app_server_debug); + } async delete_DomainNameField() { await this.commonPage.waitForElement(this.deleteDomainName) @@ -299,12 +250,13 @@ class NetworkingPage { return await this.skip_button.isEnabled({ timeout: 5000 }); } - async click_skipNetworking() { - await this.commonPage.waitForElement(this.skip_button) - await this.skip_button.click({ timeout: 2000 }); - await this.commonPage.waitForElement(this.APFAUTH_TITLE) - const apfAuth_title = await this.APFAUTH_TITLE.textContent(); - return apfAuth_title; + async click_skipNetworking(){ + const isEnabled = await this.is_skipNetworkingButtonEnable(); + if (isEnabled) { + await this.skip_button.click({ timeout: 2000 }); + } else { + throw new Error('Skip button is not enabled and cannot be clicked.'); + } } async isPreviousButtonEnable() { @@ -348,45 +300,29 @@ class NetworkingPage { let allText = ''; while (true) { - // Extract text from all div.view-line elements - const newText = await this.page.evaluate(() => { - const viewLines = document.querySelectorAll('.view-lines .view-line'); - let text = ''; - viewLines.forEach((line) => { - text += line.textContent + '\n'; + const newText = await this.page.evaluate(() => { + const viewLines = document.querySelectorAll('.view-lines .view-line'); + let text = ''; + viewLines.forEach((line) => { + text += line.textContent + '\n'; + }); + return text; }); - return text; - }); - - // Append the new text to the existing text - allText += newText; - console.log(allText) - - // Scroll a little to load more content - await this.page.evaluate(() => { - const editor = document.querySelector('.monaco-scrollable-element.editor-scrollable.vs'); - editor.scrollTop += 100; // Adjust the scroll amount as needed - }); - - // Wait for a brief moment for new content to load - await this.page.waitForTimeout(1000); // Adjust timeout as needed - - // Get the current scroll height - const currentScrollHeight = await this.page.evaluate(() => { - const editor = document.querySelector('.monaco-scrollable-element.editor-scrollable.vs'); - return editor.scrollHeight; - }); - - // If the scroll height hasn't changed since the last iteration, we've reached the end - if (currentScrollHeight === previousScrollHeight) { - break; - } - - // Update the previous scroll height for the next iteration - previousScrollHeight = currentScrollHeight; + allText += newText; + await this.page.evaluate(() => { + const editor = document.querySelector('.monaco-scrollable-element.editor-scrollable.vs'); + editor.scrollTop += 100; + }); + await this.page.waitForTimeout(1000); + const currentScrollHeight = await this.page.evaluate(() => { + const editor = document.querySelector('.monaco-scrollable-element.editor-scrollable.vs'); + return editor.scrollHeight; + }); + if (currentScrollHeight === previousScrollHeight) { + break; + } + previousScrollHeight = currentScrollHeight; } - - console.log('All text:', allText); return allText; } diff --git a/playwright_test/Pages/planning.page.ts b/playwright_test/Pages/planning.page.ts index 65f4f721..ea974431 100644 --- a/playwright_test/Pages/planning.page.ts +++ b/playwright_test/Pages/planning.page.ts @@ -46,11 +46,12 @@ class PlanningPage { this.jobName = page.locator("//label[contains(text(),'Job Name')]//following-sibling::div/input") this.jobPrefix = page.locator("//label[contains(text(),'Job Prefix')]//following-sibling::div/input") this.cookieIdentifier = page.locator("//label[contains(text(),'Cookie Identifier')]//following-sibling::div/input") - this.javaLocation = page.locator("//label[contains(text(),'Java location')]//following-sibling::div/input") - this.nodeJsLocation = page.locator("//label[contains(text(),'Node.js location')]//following-sibling::div/input") + this.javaLocation = page.locator("//label[contains(text(),'Java Home Directory')]//following-sibling::div/input") + this.nodeJsLocation = page.locator("//label[contains(text(),'Node.js Home Directory')]//following-sibling::div/input") this.setZosmf = page.locator("//span[text()='Set z/OSMF Attributes (optional)']/preceding-sibling::span/input") this.zosmfHost = page.locator("//label[contains(text(),'z/OSMF Host')]//following-sibling::div/input") - this.zosmfPort = page.locator("//label[contains(text(),'z/OSMF Port')]//following-sibling::div/input") + this.zosmfPort = page.locator('//label[contains(text(), "z/OSMF Port")]/following-sibling::div/input[@id="zosmf-port"]') + //this.zosmfPort = page.locator('//input[@id="zosmf-port"]'); this.zosmfApplicationId = page.locator("//label[contains(text(),'z/OSMF Application Id')]//following-sibling::div/input") this.validateLocations = page.locator("//button[contains(text(), 'Validate locations')]") this.ValidateLocationsGreenCheck = page.locator("//button[text()='Validate locations']//following-sibling::*[@data-testid='CheckCircleIcon']") @@ -87,34 +88,28 @@ class PlanningPage { return true } - async clickSaveAndValidate() { - await this.commonPage.waitForElement(this.saveAndValidate); + async clickSaveAndValidate(){ await this.saveAndValidate.click({ timeout: 5000 }); } - async validateJobStatement(jobStatement: string) { - const jobStatementFilled = await this.enterJobStatement(jobStatement); - if (jobStatementFilled) { - this.clickSaveAndValidate(); - } else { - this.enterJobStatement(jobStatement); - this.clickSaveAndValidate(); + async isSaveAndValidateGreenCheckVisible(): Promise { + try { + await this.saveAndValidateGreenCheck.waitFor({ state: 'visible', timeout: 10000 }); + return true; + } catch (error) { + console.error('Error checking visibility:', error); + return false; } } - async isSaveAndValidateGreenCheckVisible() { - await this.commonPage.waitForElement(this.saveAndValidateGreenCheck) - return await this.saveAndValidateGreenCheck.isVisible({ timeout: 5000 }); - } - async getErrorMessage() { await this.commonPage.waitForElement(this.errorMessage) return await this.errorMessage.textContent(); } - async enterRuntimeDir(runtimeDir: any) { - await this.commonPage.waitForElement(this.runtimeDir) - await this.runtimeDir.clear({ timeout: 2000 }) + async enterRuntimeDir(runtimeDir: any){ + await this.page.waitForTimeout(500); + //await this.runtimeDir.clear({timeout: 2000}) await this.runtimeDir.fill(runtimeDir); await this.commonPage.validateElementValue(this.runtimeDir, runtimeDir) } @@ -207,7 +202,7 @@ class PlanningPage { await this.zosmfHost.fill(zosmfHost); await this.commonPage.validateElementValue(this.zosmfHost, zosmfHost) } - + async enterZosmfPort(zosmfPort: any) { await this.commonPage.waitForElement(this.zosmfPort) await this.zosmfPort.clear({ timeout: 2000 }) @@ -222,19 +217,24 @@ class PlanningPage { await this.commonPage.validateElementValue(this.zosmfApplicationId, zosmfApplicationId) } - async clickValidateLocations() { - await this.commonPage.waitForElement(this.validateLocations) - await this.validateLocations.click({ timeout: 5000 }); + async clickValidateLocations(){ + await this.validateLocations.click({timeout: 5000}); + await this.isContinueToInstallationEnabled() } - async isValidateLocationsGreenCheckVisible() { - await this.commonPage.waitForElement(this.ValidateLocationsGreenCheck) - return await this.ValidateLocationsGreenCheck.isVisible(); + async isValidateLocationsGreenCheckVisible(): Promise { + try { + await this.ValidateLocationsGreenCheck.waitFor({ state: 'visible', timeout: 15000 }); + return true; + } catch (error) { + console.error('Error checking visibility:', error); + return false; + } } - async clickSaveAndClose() { - await this.commonPage.waitForElement(this.saveAndClose) - await this.saveAndClose.click({ timeout: 2000 }); + + async clickSaveAndClose(){ + await this.saveAndClose.click({timeout: 15000}); } async clickPreviousStep() { @@ -242,8 +242,19 @@ class PlanningPage { await this.previousStep.click(); } - async clickContinueToInstallation() { - await this.commonPage.waitForElement(this.continueInstallationOptions) + async clickContinueToInstallation(){ + const timeout = 30000; + const interval = 100; + const startTime = Date.now(); + const isButtonEnabled = async (): Promise => { + return await this.isContinueToInstallationEnabled(); + }; + while (!(await isButtonEnabled())) { + if (Date.now() - startTime > timeout) { + throw new Error('Timed out waiting for the button to be enabled.'); + } + await new Promise(resolve => setTimeout(resolve, interval)); + } await this.continueInstallationOptions.click(); } @@ -262,19 +273,15 @@ class PlanningPage { return await this.continueInstallationOptions.isEnabled() } - async insertValidateJobStatement() { - const jobStatement = "//HELLOJOB JOB 'HELLO, WORLD!',CLASS=A,MSGCLASS=A\n//STEP01 EXEC PGM=IEFBR14\n//SYSPRINT DD SYSOUT=A\n//SYSIN DD DUMMY" - const jobStatementFilled = await this.enterJobStatement(jobStatement); - if (jobStatementFilled) { - this.clickSaveAndValidate(); - } else { - this.enterJobStatement(jobStatement); - this.clickSaveAndValidate(); - } + async clickSaveValidate(){ + await this.jobStatement.fill("//ZWEJOB01 JOB IZUACCT,'SYSPROG',CLASS=A,\n// MSGLEVEL=(1,1),MSGCLASS=A") + await this.saveAndValidate.click(); + await this.page.waitForTimeout(500); } - async fillPlanningPageWithRequiredFields(runtimeDir: any, workspaceDir: any, extensionDir: any, logDir: any, profileIdentifier: any, jobPrefix: any, jobname: any, javaLocation: any, nodejsLocation: any, zOSMFHost: any, zOSMFPort: any, zOSMFAppID: any) { - await this.page.waitForTimeout(2000); + + async fillPlanningPageWithRequiredFields(runtimeDir: any, workspaceDir: any, extensionDir: any, logDir: any, profileIdentifier:any, jobPrefix:any,jobname:any, javaLocation:any,nodejsLocation:any,zOSMFHost:any,zOSMFPort:any,zOSMFAppID:any){ + await this.clickSaveValidate(); await this.enterRuntimeDir(runtimeDir); await this.enterWorkspaceDir(workspaceDir); await this.enterLogsDir(logDir); @@ -284,8 +291,8 @@ class PlanningPage { await this.enterJobPrefix(jobPrefix); await this.enterJavaLocation(javaLocation); await this.enterNodeJsLocation(nodejsLocation); - await this.enterZosmfHost(zOSMFHost); - await this.enterZosmfPort(zOSMFPort); + //await this.enterZosmfHost(zOSMFHost); + //await this.enterZosmfPort(zOSMFPort); await this.enterZosmfApplicationId(zOSMFAppID); await this.page.waitForTimeout(2000); return true diff --git a/playwright_test/Pages/security.page.ts b/playwright_test/Pages/security.page.ts index 3c4fb95d..abe49114 100644 --- a/playwright_test/Pages/security.page.ts +++ b/playwright_test/Pages/security.page.ts @@ -44,7 +44,6 @@ class SecurityPage { this.uploadYaml_greenCheckXpath = page.locator('#card-download-progress-card svg.MuiSvgIcon-colorSuccess') this.init_security_greenCheckXpath = page.locator("#card-success-progress-card svg.MuiSvgIcon-colorSuccess") this.previous_step_button = page.locator('//button[contains(text(),"Previous step")]') - this.skip_button = page.locator('//button[contains(text(),"Skip")]') this.editor_title_element = page.locator('//h2[text()="Editor"]') this.APFAUTH_TITLE = page.locator('//div[text()="APF Authorize Load Libraries"]') this.licenseAgreement = page.locator('//button[contains(text(), "License Agreement")]') @@ -58,12 +57,14 @@ class SecurityPage { this.view_job_output = page.locator('//button[contains(text(), "Submit Job")]') this.save_and_close = page.locator('//button[contains(text(),"Save & close")]') this.previous_step = page.locator('//button[contains(text(),"Previous step")]') - this.skip_button = page.locator('//button[contains(text(),"Skip")]') + this.skip_button = page.locator('//button[contains(text(),"Skip ")]') this.initSecurity = page.locator("//button[contains(text(), 'Initialize Security Config')]") this.close_button = page.locator('//button[contains(text(), "Close")]') this.certificateTab_title = page.locator('//div[text()="Certificates"]') + this.stc_title = page.locator('//div[text()="Stcs"]') this.securityTab_title = page.locator('//div[text()="Security"]') - this.continue_CertificateSelector = page.locator('//button[contains(text(), "Continue to Certificates Setup")]') + this.continue_CertificateSelector = page.locator('//button[contains(text(), "Continue to STC Setup")]') + this.admin = page.getByLabel('Admin'); this.stc = page.getByLabel('Stc'); this.sys_prog = page.getByLabel('Sys Prog'); @@ -145,17 +146,17 @@ class SecurityPage { await this.commonPage.waitForElement(this.writeConfig_greenCheckXpath) return await this.writeConfig_greenCheckXpath.isVisible({ timeout: 50000 }); } - + async isUploadConfigGreenCheckVisible() { await this.commonPage.waitForElement(this.uploadYaml_greenCheckXpath) return await this.uploadYaml_greenCheckXpath.isVisible({ timeout: 50000 }); } - + async isInitSecurityGreenCheckVisible() { await this.commonPage.waitForElement(this.init_security_greenCheckXpath) return await this.init_security_greenCheckXpath.isVisible({ timeout: 50000 }); } - + async isPreviousButtonEnable() { await this.commonPage.waitForElement(this.previous_step) return await this.previous_step.isEnabled({ timeout: 50000 }); @@ -194,12 +195,8 @@ class SecurityPage { return await this.skip_button.isEnabled({ timeout: 5000 }); } - async click_skipSecurity() { - await this.commonPage.waitForElement(this.skip_button) - await this.skip_button.click({ timeout: 2000 }); - await this.commonPage.waitForElement(this.certificateTab_title) - const certificatePage_title = await this.certificateTab_title.textContent(); - return certificatePage_title; + async click_skipSecurity(){ + await this.skip_button.click({ timeout: 2000 }); } async open_monacoEditor() { @@ -267,12 +264,21 @@ class SecurityPage { const sysProg_value = await this.sys_prog.textContent(); return sysProg_value; } + async returnTitleOfSecurityPage(){ + const securityPage_title = await this.securityTab_title.textContent(); + return securityPage_title; + } + + async returnTitleOfCertPage(){ + const certPage_title = await this.certificateTab_title.textContent(); + return certPage_title; + } - async returnTitleOfSecurityPage() { - await this.commonPage.waitForElement(this.securityTab_title) - const securityPage_title = await this.securityTab_title.textContent(); - return securityPage_title; + async returnTitleOfstcPage(){ + const stcPage_title = await this.stc_title.textContent(); + return stcPage_title; } } + export default SecurityPage; \ No newline at end of file diff --git a/playwright_test/Tests/ApfAuth.spec.ts b/playwright_test/Tests/ApfAuth.spec.ts index 59470b5e..c438e532 100644 --- a/playwright_test/Tests/ApfAuth.spec.ts +++ b/playwright_test/Tests/ApfAuth.spec.ts @@ -4,30 +4,20 @@ import ApfAuthPage from '../Pages/ApfAuth.page'; import TitlePage from '../Pages/title.page'; import ConnectionPage from '../Pages/connection.page'; import PlanningPage from '../Pages/planning.page'; -import SecurityPage from '../Pages/security.page.js'; +import InstallationTypePage from '../Pages/installationType.page'; +import InstallationPage from '../Pages/installation.page.ts'; +import NetworkingPage from '../Pages/networking.page'; +import config from '../utils/config'; +import { spawn } from 'child_process'; +import path from 'path'; +let page: Page; + let electronApp: ElectronApplication const APF_AUTH_TITLE = 'APF Authorize Load Libraries' const NETWORKING_TITLE = 'Networking' const SECURITY_TITLE = 'Security' -const DATASET_PREFIX = 'IBMUSER.ZWEV1' -const AUTH_LOAD_LIB = 'IBMUSER.ZWEV1.ZWEAUTH' -const AUTH_PLUGIN_LIB = 'IBMUSER.ZWEV1.CUST.ZWESAPL' -const SSH_HOST = process.env.SSH_HOST; -const SSH_PASSWD = process.env.SSH_PASSWD; -const SSH_PORT = process.env.SSH_PORT; -const SSH_USER = process.env.SSH_USER; -const ZOWE_EXTENSION_DIR = process.env.ZOWE_EXTENSION_DIR; -const ZOWE_LOG_DIR = process.env.ZOWE_LOG_DIR; -const ZOWE_ROOT_DIR = process.env.ZOWE_ROOT_DIR; -const ZOWE_WORKSPACE_DIR = process.env.ZOWE_WORKSPACE_DIR; -const JOB_NAME = process.env.JOB_NAME; -const JOB_PREFIX = process.env.JOB_PREFIX; -const JAVA_HOME = process.env.JAVA_HOME; -const NODE_HOME = process.env.NODE_HOME; -const ZOSMF_HOST = process.env.ZOSMF_HOST; -const ZOSMF_PORT = process.env.ZOSMF_PORT; -const ZOSMF_APP_ID = process.env.ZOSMF_APP_ID; + test.beforeAll(async () => { try { @@ -38,144 +28,147 @@ test.beforeAll(async () => { } }); -test.describe('ApfAuthTab', () => { - let connectionPage: ConnectionPage; - let titlePage: TitlePage; - let apfAuthPage: ApfAuthPage; - let planningPage: PlanningPage; - let securityPage: SecurityPage; - - test.beforeEach(async ({ page }) => { - test.setTimeout(900000); - electronApp = await electron.launch({ args: ['.webpack/main/index.js'] }) - page = await electronApp.firstWindow() - connectionPage = new ConnectionPage(page); - titlePage = new TitlePage(page); - planningPage = new PlanningPage(page) - apfAuthPage = new ApfAuthPage(page); - titlePage.navigateToConnectionTab() - connectionPage.performLogin(SSH_HOST, SSH_PORT, SSH_USER, SSH_PASSWD) - await page.waitForTimeout(5000); - connectionPage.clickContinueButton() - planningPage.insertValidateJobStatement() - await page.waitForTimeout(20000); - planningPage.validatePlanningStageLocations(ZOWE_ROOT_DIR, ZOWE_WORKSPACE_DIR, ZOWE_EXTENSION_DIR, ZOWE_LOG_DIR, '1', JOB_NAME, JOB_PREFIX, JAVA_HOME, NODE_HOME, ZOSMF_HOST, ZOSMF_PORT, ZOSMF_APP_ID) - await page.waitForTimeout(30000); - planningPage.clickContinueToInstallation() - await page.waitForTimeout(5000); - apfAuthPage.movetoInstallationPage() - await page.waitForTimeout(5000); - }) - - test.afterEach(async () => { - await electronApp.close() - - }) - test('Test Resume Progress', async ({ page }) => { - await page.waitForTimeout(8000); - apfAuthPage.fillApfDetails(DATASET_PREFIX, AUTH_LOAD_LIB, AUTH_PLUGIN_LIB) - await page.waitForTimeout(5000); - apfAuthPage.click_saveAndClose() - await page.waitForTimeout(8000); - connectionPage.click_resumeProgress() - await page.waitForTimeout(8000); - const title = await apfAuthPage.getApfAuthPageTitle(); - expect(title).toBe(APF_AUTH_TITLE); - const datatsetPrefixValue = await apfAuthPage.get_datasetPrefix_value(); - const AuthLoadLib_Value = await apfAuthPage.get_authLoadLib_value(); - const AuthPluginLib_Value = await apfAuthPage.get_authPluginLib_value(); - expect(datatsetPrefixValue).toBe(DATASET_PREFIX); - expect(AuthLoadLib_Value).toBe(AUTH_LOAD_LIB); - expect(AuthPluginLib_Value).toBe(AUTH_PLUGIN_LIB); - }) - - test('Verify title', async ({ page }) => { - await page.waitForTimeout(5000); - apfAuthPage.fillApfDetails(DATASET_PREFIX, AUTH_LOAD_LIB, AUTH_PLUGIN_LIB) - await page.waitForTimeout(5000); - apfAuthPage.movetoApfAuthPage() - await page.waitForTimeout(5000); - expect(apfAuthPage.datasetPrefix).toBeTruthy() - expect(apfAuthPage.authLoadLib).toBeTruthy() - expect(apfAuthPage.authpluginLib).toBeTruthy() - expect(apfAuthPage.run_zwe_init_apfauth).toBeTruthy() - expect(apfAuthPage.view_yaml).toBeTruthy() - expect(apfAuthPage.save_and_close).toBeTruthy() - expect(apfAuthPage.previous_step).toBeTruthy() - expect(apfAuthPage.skip_apf_auth).toBeTruthy() - expect(apfAuthPage.continue_security_setup).toBeTruthy() - - }) - - test('test apfAuth with empty data', async ({ page }) => { - await page.waitForTimeout(5000); - apfAuthPage.fillApfDetails('', '', '') - await page.waitForTimeout(5000); - apfAuthPage.movetoApfAuthPage() - await page.waitForTimeout(5000); - apfAuthPage.initializeApfauth() - await page.waitForTimeout(5000); - const isWriteConfig_check_visible = await apfAuthPage.isWriteConfigGreenCheckVisible(); - expect(isWriteConfig_check_visible).toBe(false); - const isUploadConfig_check_visible = await apfAuthPage.isUploadConfigGreenCheckVisible(); - expect(isUploadConfig_check_visible).toBe(false); - const isInitApf_check_visible = await apfAuthPage.isInitApfGreenCheckVisible(); - expect(isInitApf_check_visible).toBe(false); - }) - - test('test apfAuth with valid data', async ({ page }) => { - await page.waitForTimeout(5000); - apfAuthPage.fillApfDetails(DATASET_PREFIX, AUTH_LOAD_LIB, AUTH_PLUGIN_LIB) - await page.waitForTimeout(5000); - apfAuthPage.movetoApfAuthPage() - await page.waitForTimeout(5000); - apfAuthPage.initializeApfauth() - await page.waitForTimeout(5000); - const isWriteConfig_check_visible = await apfAuthPage.isWriteConfigGreenCheckVisible(); - expect(isWriteConfig_check_visible).toBe(true); - const isUploadConfig_check_visible = await apfAuthPage.isUploadConfigGreenCheckVisible(); - expect(isUploadConfig_check_visible).toBe(true); - const isInitApf_check_visible = await apfAuthPage.isInitApfGreenCheckVisible(); - expect(isInitApf_check_visible).toBe(true); - }) - - test('click Previous step', async ({ page }) => { - await page.waitForTimeout(5000); - apfAuthPage.movetoApfAuthPage() - const title = await apfAuthPage.returnTitleOfPrevPage(); - expect(title).toBe(NETWORKING_TITLE); - }) - - test('test skip apfAuth button is enable', async ({ page }) => { - apfAuthPage.movetoApfAuthPage() - const isSkipApfAuthEnable = await apfAuthPage.is_skipApfAuthButtonEnable(); - expect(isSkipApfAuthEnable).toBe(true); - await page.waitForTimeout(2000); - }) - - test('test previous button is enabled', async ({ page }) => { - apfAuthPage.movetoApfAuthPage() - const is_prevButtonEnable = await apfAuthPage.isPreviousButtonEnable(); - expect(is_prevButtonEnable).toBe(true); - await page.waitForTimeout(2000); - }) - - test('test continue button is disable', async ({ page }) => { - apfAuthPage.movetoApfAuthPage() - const is_ContinueButtonDisable = await apfAuthPage.isContinueButtonDisable(); - expect(is_ContinueButtonDisable).toBe(true); - await page.waitForTimeout(2000); - }) - test('click view yaml button', async ({ page }) => { - apfAuthPage.movetoApfAuthPage() - await page.waitForTimeout(5000); - apfAuthPage.viewYaml() - await page.waitForTimeout(5000); - expect(apfAuthPage.editor_title_element).toBeTruthy(); - apfAuthPage.closeButton() - await page.waitForTimeout(2000); - }) +test.describe('ApfAuthTab', () => { + let connectionPage: ConnectionPage; + let titlePage : TitlePage; + let apfAuthPage : ApfAuthPage; + let planningPage : PlanningPage; + let installationTypePage : InstallationTypePage; + let installationPage : InstallationPage; + let networkingPage : NetworkingPage; + + test.beforeEach(async ({ page }) => { + test.setTimeout(900000); + electronApp = await electron.launch({ args: ['.webpack/main/index.js'] }) + page = await electronApp.firstWindow() + connectionPage = new ConnectionPage(page); + titlePage = new TitlePage(page); + planningPage = new PlanningPage(page) + apfAuthPage = new ApfAuthPage(page); + installationTypePage = new InstallationTypePage(page); + installationPage = new InstallationPage(page); + networkingPage = new NetworkingPage(page); + titlePage.navigateToConnectionTab() + await connectionPage.fillConnectionDetails(config.SSH_HOST, config.SSH_PORT, config.SSH_USER, config.SSH_PASSWD); + await connectionPage.SubmitValidateCredential(); + await connectionPage.clickContinueButton(); + await planningPage.fillPlanningPageWithRequiredFields(config.ZOWE_ROOT_DIR, + config.ZOWE_WORKSPACE_DIR, + config.ZOWE_EXTENSION_DIR, + config.ZOWE_LOG_DIR, + '1', + config.JOB_NAME, + config.JOB_PREFIX, + config.JAVA_HOME, + config.NODE_HOME, + config.ZOSMF_HOST, + config.ZOSMF_PORT, + config.ZOSMF_APP_ID + ); + await planningPage.clickValidateLocations() + await planningPage.clickContinueToInstallation() + await installationTypePage.downloadZowePaxAndNavigateToInstallationPage() + await installationTypePage.continueToUnpax() + await installationTypePage.skipUnpax() + await installationPage.fillAllFields(config.DATASET_PREFIX, + config.PARM_LIB, + config.PROC_LIB, + config.JCL_LIB, + config.LOAD_LIB, + config.AUTH_LOAD_LIB, + config.AUTH_PLUGIN_LIB + ) + await installationPage.clickInstallMvsDatasets(); + await installationPage.clickContinueToNetworkSetup(); + await networkingPage.click_skipNetworking() + await page.waitForTimeout(1000); + }) + + test.afterEach(async () => { + await electronApp.close() + }) + test('Test Resume Progress', async ({ page }) => { + apfAuthPage.fillApfDetails(config.DATASET_PREFIX, config.AUTH_LOAD_LIB, config.AUTH_PLUGIN_LIB) + apfAuthPage.click_saveAndClose() + connectionPage.click_resumeProgress() + const title = await apfAuthPage.returnTitleOfApfAuthPage(); + expect(title).toBe(config.APF_AUTH_TITLE); + const datatsetPrefixValue = await apfAuthPage.get_datasetPrefix_value(); + const AuthLoadLib_Value = await apfAuthPage.get_authLoadLib_value(); + const AuthPluginLib_Value = await apfAuthPage.get_authPluginLib_value(); + expect(datatsetPrefixValue).toBe(config.DATASET_PREFIX); + expect(AuthLoadLib_Value).toBe(config.AUTH_LOAD_LIB); + expect(AuthPluginLib_Value).toBe(config.AUTH_PLUGIN_LIB); + }) + + test('Verify title', async ({ page }) => { + apfAuthPage.fillApfDetails(DATASET_PREFIX,AUTH_LOAD_LIB,AUTH_PLUGIN_LIB) + apfAuthPage.movetoApfAuthPage() + await expect(apfAuthPage.datasetPrefix).toBeTruthy() + await expect(apfAuthPage.authLoadLib).toBeTruthy() + await expect(apfAuthPage.authpluginLib).toBeTruthy() + await expect(apfAuthPage.run_zwe_init_apfauth).toBeTruthy() + await expect(apfAuthPage.view_yaml).toBeTruthy() + await expect(apfAuthPage.save_and_close).toBeTruthy() + await expect(apfAuthPage.previous_step).toBeTruthy() + await expect(apfAuthPage.skip_apf_auth).toBeTruthy() + await expect(apfAuthPage.continue_security_setup).toBeTruthy() + + }) + test('test apfAuth with empty data', async ({ page }) => { + apfAuthPage.fillApfDetails('','','') + apfAuthPage.movetoApfAuthPage() + apfAuthPage.initializeApfauth() + const isWriteConfig_check_visible = await apfAuthPage.isWriteConfigGreenCheckVisible(); + expect(isWriteConfig_check_visible).toBe(false); + const isUploadConfig_check_visible = await apfAuthPage.isUploadConfig_check_visible(); + expect(isUploadConfig_check_visible).toBe(false); + const isInitApf_check_visible = await apfAuthPage.isInitApf_check_visible(); + expect(isInitApf_check_visible).toBe(false); + }) + test('test apfAuth with valid data', async ({ page }) => { + apfAuthPage.fillApfDetails(DATASET_PREFIX,AUTH_LOAD_LIB,AUTH_PLUGIN_LIB) + apfAuthPage.movetoApfAuthPage() + apfAuthPage.initializeApfauth() + const isWriteConfig_check_visible = await apfAuthPage.isWriteConfigGreenCheckVisible(); + expect(isWriteConfig_check_visible).toBe(true); + const isUploadConfig_check_visible = await apfAuthPage.isUploadConfig_check_visible(); + expect(isUploadConfig_check_visible).toBe(true); + const isInitApf_check_visible = await apfAuthPage.isInitApf_check_visible(); + expect(isInitApf_check_visible).toBe(true); + }) + + test('click Previous step', async ({ page }) => { + apfAuthPage.movetoApfAuthPage() + const title = await apfAuthPage.returnTitleOfPrevPage(); + expect(title).toBe(NETWORKING_TITLE); + }) + + test('test skip apfAuth button is enable', async ({ page }) => { + apfAuthPage.movetoApfAuthPage() + const isSkipApfAuthEnable = await apfAuthPage.is_skipApfAuthButtonEnable(); + expect(isSkipApfAuthEnable).toBe(true); + }) + + test('test previous button is enabled', async ({ page }) => { + apfAuthPage.movetoApfAuthPage() + const is_prevButtonEnable = await apfAuthPage.isPreviousButtonEnable(); + expect(is_prevButtonEnable).toBe(true); + }) + + test('test continue button is disable', async ({ page }) => { + apfAuthPage.movetoApfAuthPage() + const is_ContinueButtonDisable = await apfAuthPage.isContinueButtonDisable(); + expect(is_ContinueButtonDisable).toBe(true); + }) + + test('click view yaml button', async ({ page }) => { + apfAuthPage.movetoApfAuthPage() + apfAuthPage.viewYaml() + await expect(apfAuthPage.editor_title_element).toBeTruthy(); + apfAuthPage.closeButton() + }) test('test click skip APFAuth button', async ({ page }) => { await apfAuthPage.movetoApfAuthPage() @@ -184,43 +177,33 @@ test.describe('ApfAuthTab', () => { }) - test('Test view and submit button', async ({ page }) => { - apfAuthPage.movetoApfAuthPage() - await page.waitForTimeout(5000); - apfAuthPage.click_viewAndSubmitJob() - await page.waitForTimeout(5000); - expect(apfAuthPage.editor_title_element).toBeTruthy() - apfAuthPage.closeButton() - await page.waitForTimeout(2000); - }) - - test('Test view job', async ({ page }) => { - apfAuthPage.movetoApfAuthPage() - await page.waitForTimeout(5000); - apfAuthPage.click_previewJob() - await page.waitForTimeout(5000); - expect(apfAuthPage.editor_title_element).toBeTruthy() - apfAuthPage.closeButton() - await page.waitForTimeout(5000); - }) - - test('Test save and close and Resume Progress', async ({ page }) => { - await page.waitForTimeout(5000); - apfAuthPage.fillApfDetails(DATASET_PREFIX, AUTH_LOAD_LIB, AUTH_PLUGIN_LIB) - await page.waitForTimeout(5000); - apfAuthPage.movetoApfAuthPage() - await page.waitForTimeout(5000); - apfAuthPage.click_saveAndClose() - await page.waitForTimeout(3000); - titlePage.clickOnResumeProgress(); - await page.waitForTimeout(15000); - const title = await securityPage.returnTitleOfSecurityPage(); - expect(title).toBe(SECURITY_TITLE); - const datatsetPrefixValue = await apfAuthPage.get_datasetPrefix_value(); - const authPluginLibValue = await apfAuthPage.get_authPluginLib_value(); - const authLoadLibValue = await apfAuthPage.get_authLoadLib_value(); - expect(datatsetPrefixValue).toBe(DATASET_PREFIX); - expect(authLoadLibValue).toBe(AUTH_LOAD_LIB); - expect(authPluginLibValue).toBe(AUTH_PLUGIN_LIB); - }) + test('Test view and submit button', async ({ page }) => { + apfAuthPage.movetoApfAuthPage() + apfAuthPage.click_viewAndSubmitJob() + await expect(apfAuthPage.editor_title_element).toBeTruthy() + apfAuthPage.closeButton() + }) + + + test('Test view job', async ({ page }) => { + apfAuthPage.movetoApfAuthPage() + apfAuthPage.click_previewJob() + await expect(apfAuthPage.editor_title_element).toBeTruthy() + apfAuthPage.closeButton() + }) + + test('Test save and close and Resume Progress', async ({ page }) => { + apfAuthPage.fillApfDetails(config.DATASET_PREFIX, config.AUTH_LOAD_LIB, config.AUTH_PLUGIN_LIB) + apfAuthPage.movetoApfAuthPage() + apfAuthPage.click_saveAndClose() + titlePage.clickOnResumeProgress(); + const title = await securityPage.returnTitleOfSecurityPage(); + expect(title).toBe(SECURITY_TITLE); + const datatsetPrefixValue = await apfAuthPage.get_datasetPrefix_value(); + const authPluginLibValue = await apfAuthPage.get_authPluginLib_value(); + const authLoadLibValue = await apfAuthPage.get_authLoadLib_value(); + expect(datatsetPrefixValue).toBe(config.DATASET_PREFIX); + expect(authLoadLibValue).toBe(config.AUTH_LOAD_LIB); + expect(authPluginLibValue).toBe(config.AUTH_PLUGIN_LIB); + }) }) \ No newline at end of file diff --git a/playwright_test/Tests/Connection.spec.ts b/playwright_test/Tests/Connection.spec.ts index 78fc525d..d0abb293 100644 --- a/playwright_test/Tests/Connection.spec.ts +++ b/playwright_test/Tests/Connection.spec.ts @@ -2,17 +2,16 @@ import { test, ElectronApplication, expect, _electron as electron } from '@playw import ConnectionPage from '../Pages/connection.page'; import TitlePage from '../Pages/title.page'; import { prepareEnvironment } from '../prepare.js'; +import config from '../utils/config'; +let page: Page; let electronApp: ElectronApplication -const SSH_HOST = process.env.SSH_HOST; -const SSH_PASSWD = process.env.SSH_PASSWD; -const SSH_PORT = process.env.SSH_PORT; -const SSH_USER = process.env.SSH_USER; const CONNECTION_PAGE_TITLE = 'Connection' +const INSTALLATION_TITLE = 'Installation' test.beforeAll(async () => { try { - await prepareEnvironment({ install: true, remove: false }); + await prepareEnvironment({ install: false, remove: false }); } catch (error) { console.error('Error during environment preparation:', error); process.exit(1); @@ -29,6 +28,7 @@ test.describe('ConnectionTab', () => { page = await electronApp.firstWindow() connectionPage = new ConnectionPage(page); titlePage = new TitlePage(page); + await titlePage.navigateToConnectionTab() }); test.afterEach(async () => { @@ -36,27 +36,23 @@ test.describe('ConnectionTab', () => { }); test('Test Save and close and Resume Progress', async ({ page }) => { - titlePage.navigateToConnectionTab() - connectionPage.performLogin(SSH_HOST, SSH_PORT, SSH_USER, SSH_PASSWD) - await page.waitForTimeout(5000); - connectionPage.click_saveAndClose() - await page.waitForTimeout(3000); - titlePage.clickOnResumeProgress(); - await page.waitForTimeout(5000); + await connectionPage.fillConnectionDetails(config.SSH_HOST, config.SSH_PORT, config.SSH_USER, config.SSH_PASSWD); + await connectionPage.SubmitValidateCredential() + await connectionPage.click_saveAndClose() + await titlePage.clickOnResumeProgress(); const title = await connectionPage.getConnectionPageTitle(); expect(title).toBe(CONNECTION_PAGE_TITLE); const hostValue = await connectionPage.getHostValue(); - expect(hostValue).toBe(SSH_HOST); + expect(hostValue).toBe(config.SSH_HOST); const portValue = await connectionPage.getPortValue(); - expect(portValue).toBe(SSH_PORT); + expect(portValue).toBe(config.SSH_PORT); const userNameValue = await connectionPage.getUsernameValue(); - expect(userNameValue).toBe(SSH_USER); + expect(userNameValue).toBe(config.SSH_USER); }) test('test invalid credentials', async ({ page }) => { - titlePage.navigateToConnectionTab() - connectionPage.performLogin(SSH_HOST, SSH_PORT, SSH_USER, SSH_PASSWD) - await page.waitForTimeout(5000); + await connectionPage.fillConnectionDetails(config.SSH_HOST, config.SSH_PORT, config.SSH_USER, config.SSH_PASSWD); + await connectionPage.SubmitValidateCredential() const isGreenIconHidden = await connectionPage.isGreenCheckIconVisible(); expect(isGreenIconHidden).toBe(true); const isContinueDisable = await connectionPage.isContinueButtonVisible(); @@ -64,9 +60,8 @@ test.describe('ConnectionTab', () => { }) test('test valid credentials', async ({ page }) => { - titlePage.navigateToConnectionTab() - connectionPage.performLogin(SSH_HOST, SSH_PORT, SSH_USER, SSH_PASSWD) - await page.waitForTimeout(5000); + await connectionPage.fillConnectionDetails(config.SSH_HOST, config.SSH_PORT, config.SSH_USER, config.SSH_PASSWD); + await connectionPage.SubmitValidateCredential() const isGreenIconHidden = await connectionPage.isGreenCheckIconVisible(); expect(isGreenIconHidden).toBe(false); const isContinueDisable = await connectionPage.isContinueButtonVisible(); @@ -74,17 +69,14 @@ test.describe('ConnectionTab', () => { }) test('test required fields', async ({ page }) => { - expect(connectionPage.userName).toBeTruthy() - expect(connectionPage.password).toBeTruthy() - expect(connectionPage.port).toBeTruthy() - expect(connectionPage.host).toBeTruthy() - await page.waitForTimeout(2000); + await expect(connectionPage.userName).toBeTruthy() + await expect(connectionPage.password).toBeTruthy() + await expect(connectionPage.port).toBeTruthy() + await expect(connectionPage.host).toBeTruthy() }) test('test continue disable', async ({ page }) => { - titlePage.navigateToConnectionTab() const isContinueButtonDisable = await connectionPage.isContinueButtonVisible(); expect(isContinueButtonDisable).toBe(true); - await page.waitForTimeout(2000); }) }) \ No newline at end of file diff --git a/playwright_test/Tests/Installation.spec.ts b/playwright_test/Tests/Installation.spec.ts index 83e94747..c53d992d 100644 --- a/playwright_test/Tests/Installation.spec.ts +++ b/playwright_test/Tests/Installation.spec.ts @@ -5,34 +5,14 @@ import PlanningPage from '../Pages/planning.page.ts'; import InstallationTypePage from '../Pages/installationType.page.ts'; import InstallationPage from '../Pages/installation.page.ts'; import NetworkingPage from '../Pages/networking.page.ts'; +import config from '../utils/config'; let electronApp: ElectronApplication const NETWORKING_PAGE_TITLE = 'Networking' -const INSTALLATION_TYPE_TITLE = 'Installation Type'; -const RUNTIME_DIR = process.env.ZOWE_ROOT_DIR; -const SSH_HOST = process.env.SSH_HOST; -const SSH_PASSWD = process.env.SSH_PASSWD; -const SSH_PORT = process.env.SSH_PORT; -const SSH_USER = process.env.SSH_USER; -const ZOWE_EXTENSION_DIR = process.env.ZOWE_EXTENSION_DIR; -const ZOWE_LOG_DIR = process.env.ZOWE_LOG_DIR; -const ZOWE_WORKSPACE_DIR = process.env.ZOWE_WORKSPACE_DIR; -const JOB_NAME = process.env.JOB_NAME; -const JOB_PREFIX = process.env.JOB_PREFIX; -const JAVA_HOME = process.env.JAVA_HOME; -const NODE_HOME = process.env.NODE_HOME; -const ZOSMF_HOST = process.env.ZOSMF_HOST; -const ZOSMF_PORT = process.env.ZOSMF_PORT; -const ZOSMF_APP_ID = process.env.ZOSMF_APP_ID; -const DATASET_PREFIX = process.env.DATASET_PREFIX; -const PROC_LIB = process.env.PROC_LIB; -const PARM_LIB = process.env.PARM_LIB; -const ZIS = process.env.SECURITY_STC_ZIS; -const JCL_LIB = process.env.JCL_LIB; -const LOAD_LIB = process.env.LOAD_LIB; -const AUTH_LOAD_LIB = process.env.AUTH_LOAD_LIB; -const AUTH_PLUGIN_LIB = process.env.AUTH_PLUGIN_LIB; -const UPLOAD_PAX_PATH = process.env.ZOWE_ROOT_DIR +const INSTALLATION_TYPE_TITLE = 'Installation'; +const DOWNLOAD_ZOWE_TITLE = 'Download Zowe Pax'; + + test.describe('InstallationTab', () => { let connectionPage: ConnectionPage; @@ -52,17 +32,29 @@ test.describe('InstallationTab', () => { installationTypePage = new InstallationTypePage(page); installationPage = new InstallationPage(page); networkingPage = new NetworkingPage(page); + titlePage.navigateToConnectionTab() - connectionPage.performLogin(SSH_HOST, SSH_PORT, SSH_USER, SSH_PASSWD) - await page.waitForTimeout(5000); - connectionPage.clickContinueButton() - await page.waitForTimeout(2000); - planningPage.insertValidateJobStatement() - await page.waitForTimeout(20000); - planningPage.validatePlanningStageLocations(RUNTIME_DIR, ZOWE_WORKSPACE_DIR, ZOWE_EXTENSION_DIR, ZOWE_LOG_DIR, '1', JOB_NAME, JOB_PREFIX, JAVA_HOME, NODE_HOME, ZOSMF_HOST, ZOSMF_PORT, ZOSMF_APP_ID) - await page.waitForTimeout(20000); - planningPage.clickContinueToInstallation() - await page.waitForTimeout(5000); + await connectionPage.fillConnectionDetails(config.SSH_HOST, config.SSH_PORT, config.SSH_USER, config.SSH_PASSWD); + await connectionPage.SubmitValidateCredential(); + await connectionPage.clickContinueButton(); + await planningPage.fillPlanningPageWithRequiredFields(config.ZOWE_ROOT_DIR, + config.ZOWE_WORKSPACE_DIR, + config.ZOWE_EXTENSION_DIR, + config.ZOWE_LOG_DIR, + '1', + config.JOB_NAME, + config.JOB_PREFIX, + config.JAVA_HOME, + config.NODE_HOME, + config.ZOSMF_HOST, + config.ZOSMF_PORT, + config.ZOSMF_APP_ID + ); + await planningPage.clickValidateLocations() + await planningPage.clickContinueToInstallation() + await installationTypePage.downloadZowePaxAndNavigateToInstallationPage() + await installationTypePage.continueToUnpax() + await installationTypePage.skipUnpax() }) test.afterEach(async () => { @@ -70,10 +62,6 @@ test.describe('InstallationTab', () => { }) test('Test all required fields on Installation page', async ({ page }) => { - await page.waitForTimeout(5000) - installationTypePage.downloadZowePaxAndNavigateToInstallationPage() - installationTypePage.clickContinueToInstallation() - await page.waitForTimeout(5000); expect(installationPage.prefix).toBeTruthy() expect(installationPage.procLib).toBeTruthy() expect(installationPage.parmLib).toBeTruthy() @@ -89,182 +77,91 @@ test.describe('InstallationTab', () => { expect(installationPage.saveAndClose).toBeTruthy() expect(installationPage.previousStep).toBeTruthy() expect(installationPage.skipInstallation).toBeTruthy() - expect(installationPage.continueToNetworkSetup).toBeTruthy() - const is_Continue_Button_disable = await installationPage.isContinueToNetworkSetupDisabled(); + expect(installationPage.clickContinueToNetworkSetup).toBeTruthy() + const is_Continue_Button_disable = await installationPage.isContinueToNetworkSetupEnabled(); expect(is_Continue_Button_disable).toBe(true); }) test('Test Installation with Valid Data with Download Pax', async ({ page }) => { - await page.waitForTimeout(5000); - installationTypePage.downloadZowePaxAndNavigateToInstallationPage() - installationTypePage.clickContinueToInstallation() - await page.waitForTimeout(5000); - installationPage.enterPrefix(DATASET_PREFIX) - installationPage.enterProcLib(PROC_LIB) - installationPage.enterParmLib(PARM_LIB) - installationPage.enterZis(ZIS) - installationPage.enterJclLib(JCL_LIB) - installationPage.enterLoadLib(LOAD_LIB) - installationPage.enterAuthLoadLib(AUTH_LOAD_LIB) - installationPage.enterAuthPluginLib(AUTH_PLUGIN_LIB) - installationPage.clickInstallMvsDatasets(); - await page.waitForTimeout(1800000); + await installationPage.fillAllFields(config.DATASET_PREFIX, + config.PARM_LIB, + config.PROC_LIB, + config.JCL_LIB, + config.LOAD_LIB, + config.AUTH_LOAD_LIB, + config.AUTH_PLUGIN_LIB + ) + await installationPage.clickInstallMvsDatasets(); const is_Continue_Button_enable = await installationPage.isContinueToNetworkSetupEnabled(); expect(is_Continue_Button_enable).toBe(true); - installationPage.clickContinueToNetworkSetup(); - await page.waitForTimeout(2000); - const networkSetup_title = await networkingPage.returnTitleOfNetworkingPage() - expect(networkSetup_title).toBe(NETWORKING_PAGE_TITLE); - }) - - test('Test Installation with Valid Data with Upload Pax', async ({ page }) => { - await page.waitForTimeout(5000); - installationTypePage.uploadZowePaxAndNavigateToInstallationPage(UPLOAD_PAX_PATH) - installationTypePage.clickContinueToInstallation() - await page.waitForTimeout(5000); - installationPage.enterPrefix(DATASET_PREFIX) - installationPage.enterProcLib(PROC_LIB) - installationPage.enterParmLib(PARM_LIB) - installationPage.enterZis(ZIS) - installationPage.enterJclLib(JCL_LIB) - installationPage.enterLoadLib(LOAD_LIB) - installationPage.enterAuthLoadLib(AUTH_LOAD_LIB) - installationPage.enterAuthPluginLib(AUTH_PLUGIN_LIB) - installationPage.clickInstallMvsDatasets(); - await page.waitForTimeout(1800000); - const is_Continue_Button_enable = await installationPage.isContinueToNetworkSetupEnabled(); - expect(is_Continue_Button_enable).toBe(true); - installationPage.clickContinueToNetworkSetup(); - await page.waitForTimeout(2000); - const networkSetup_title = await networkingPage.returnTitleOfNetworkingPage() - expect(networkSetup_title).toBe(NETWORKING_PAGE_TITLE); - }) - - test('Test Installation with Valid Data with SMPE', async ({ page }) => { - await page.waitForTimeout(5000); - installationTypePage.smpeZowePaxAndNavigateToInstallationPage(RUNTIME_DIR) - installationTypePage.clickContinueToInstallation() - await page.waitForTimeout(5000); - installationPage.enterPrefix(DATASET_PREFIX) - installationPage.enterProcLib(PROC_LIB) - installationPage.enterParmLib(PARM_LIB) - installationPage.enterZis(ZIS) - installationPage.enterJclLib(JCL_LIB) - installationPage.enterLoadLib(LOAD_LIB) - installationPage.enterAuthLoadLib(AUTH_LOAD_LIB) - installationPage.enterAuthPluginLib(AUTH_PLUGIN_LIB) - installationPage.clickInstallMvsDatasets(); - await page.waitForTimeout(1800000); - const is_Continue_Button_enable = await installationPage.isContinueToNetworkSetupEnabled(); - expect(is_Continue_Button_enable).toBe(true); - installationPage.clickContinueToNetworkSetup(); - await page.waitForTimeout(2000); - const networkSetup_title = await networkingPage.returnTitleOfNetworkingPage() - expect(networkSetup_title).toBe(NETWORKING_PAGE_TITLE); + await installationPage.clickContinueToNetworkSetup(); + const networkconfig_title = await networkingPage.returnTitleOfNetworkingPage() + expect (networkconfig_title).toBe(NETWORKING_PAGE_TITLE); }) test('Test Installation with the Invalid Data', async ({ page }) => { - await page.waitForTimeout(5000); - installationTypePage.downloadZowePaxAndNavigateToInstallationPage() - installationTypePage.clickContinueToInstallation() - await page.waitForTimeout(5000); - installationPage.enterPrefix('DSPREFID') - installationPage.enterProcLib('') - installationPage.enterParmLib(9999) - installationPage.enterZis(ZIS) - installationPage.enterJclLib('BLANK') - installationPage.enterLoadLib('') - installationPage.enterAuthLoadLib('AuthLoad') - installationPage.enterAuthPluginLib('') - installationPage.clickInstallMvsDatasets(); - await page.waitForTimeout(1800000); + await installationPage.enterPrefix('DSPREFID') + await installationPage.enterProcLib('') + await installationPage.enterParmLib('test') + await installationPage.enterJclLib('BLANK') + await installationPage.enterLoadLib('') + await installationPage.enterAuthLoadLib('AuthLoad') + await installationPage.enterAuthPluginLib('') + await installationPage.clickInstallMvsDatasetsInvalid(); + await installationPage.clickCloseEditor(); const is_Continue_Button_enable = await installationPage.isContinueToNetworkSetupEnabled(); expect(is_Continue_Button_enable).toBe(false); }) test('Test Previous step', async ({ page }) => { - await page.waitForTimeout(5000); - installationTypePage.downloadZowePaxAndNavigateToInstallationPage() - installationTypePage.clickContinueToInstallation() - await page.waitForTimeout(5000); - installationPage.clickPreviousStep(); - await page.waitForTimeout(2000); + await installationPage.clickPreviousStep(); const title = await installationTypePage.getInstallationTypePageTitle(); - expect(title).toBe(INSTALLATION_TYPE_TITLE); + expect(title).toBe(DOWNLOAD_ZOWE_TITLE); }) test('Test Skip Installation Button', async ({ page }) => { - await page.waitForTimeout(5000); - installationTypePage.downloadZowePaxAndNavigateToInstallationPage() - installationTypePage.clickContinueToInstallation() - await page.waitForTimeout(5000); - const is_Continue_Button_disable = await installationPage.isContinueToNetworkSetupDisabled(); - expect(is_Continue_Button_disable).toBe(true); - installationPage.clickSkipInstallation() - await page.waitForTimeout(2000); - const title = await networkingPage.returnTitleOfNetworkingPage(); - expect(title).toBe(NETWORKING_PAGE_TITLE); + const is_Continue_Button_disable = await installationPage.isContinueToNetworkSetupEnabled(); + expect(is_Continue_Button_disable).toBe(false); + const is_Skip_Button_disable = await installationPage.isSkipToNetworkSetupEnabled(); + expect(is_Skip_Button_disable).toBe(false); + const title = await installationTypePage.getInstallationTypePageTitle(); + expect(title).toBe(INSTALLATION_TYPE_TITLE); }) test('Test View Yaml Button', async ({ page }) => { - await page.waitForTimeout(5000); - installationTypePage.downloadZowePaxAndNavigateToInstallationPage() - installationTypePage.clickContinueToInstallation() - await page.waitForTimeout(5000); - installationPage.clickViewEditYaml() - await page.waitForTimeout(5000); - expect(installationPage.editorTitleElement).toBeTruthy(); - installationPage.clickCloseEditor() - await page.waitForTimeout(2000); - }) - - test('Test View and Submit button', async ({ page }) => { - await page.waitForTimeout(5000); - installationTypePage.downloadZowePaxAndNavigateToInstallationPage() - installationTypePage.clickContinueToInstallation() - await page.waitForTimeout(5000); - installationPage.clickViewSubmitJob() - await page.waitForTimeout(5000); + await installationPage.clickViewEditYaml() expect(installationPage.editorTitleElement).toBeTruthy(); - installationPage.clickCloseEditor() - await page.waitForTimeout(2000); + await installationPage.clickCloseEditor() }) test('Test View Job Output', async ({ page }) => { - await page.waitForTimeout(5000); - installationTypePage.downloadZowePaxAndNavigateToInstallationPage() - installationTypePage.clickContinueToInstallation() - await page.waitForTimeout(5000); - installationPage.clickViewJobOutput() - await page.waitForTimeout(5000); + await installationPage.clickViewJobOutput() expect(installationPage.editorTitleElement).toBeTruthy(); - installationPage.clickCloseEditor() - await page.waitForTimeout(2000); + await installationPage.clickCloseEditor() }) - test('Test Save and Close and Resume Progress', async ({ page }) => { - await page.waitForTimeout(5000); - installationTypePage.downloadZowePaxAndNavigateToInstallationPage() - installationTypePage.clickContinueToInstallation() - await page.waitForTimeout(5000); - installationPage.enterPrefix(DATASET_PREFIX) - installationPage.enterProcLib(PROC_LIB) - installationPage.enterParmLib(PARM_LIB) - installationPage.enterAuthLoadLib(AUTH_LOAD_LIB) - installationPage.enterAuthPluginLib(AUTH_PLUGIN_LIB) - installationPage.clickSaveAndClose(); - await page.waitForTimeout(3000); - titlePage.clickOnResumeProgress(); - await page.waitForTimeout(5000); + test('Test Save and Close and Resume Progress', async ({page}) => { + await installationPage.fillAllFields(config.DATASET_PREFIX, + config.PARM_LIB, + config.PROC_LIB, + config.JCL_LIB, + config.LOAD_LIB, + config.AUTH_LOAD_LIB, + config.AUTH_PLUGIN_LIB + ) + await installationPage.clickSaveAndClose(); + await titlePage.clickOnResumeProgress(); + await connectionPage.fillConnectionDetails(config.SSH_HOST, config.SSH_PORT, config.SSH_USER, config.SSH_PASSWD); + await connectionPage.SubmitValidateCredential(); const prefix_value = await installationPage.getPrefixValue(); const procLib_value = await installationPage.getProclibValue(); const parmLib_value = await installationPage.getParmlibValue(); const authLoadLib_value = await installationPage.getAuthLoadLibValue(); const authPluginLib_value = await installationPage.getAuthPluginLibValue(); - expect(prefix_value).toBe(DATASET_PREFIX); - expect(parmLib_value).toBe(PARM_LIB); - expect(procLib_value).toBe(PROC_LIB); - expect(authLoadLib_value).toBe(AUTH_LOAD_LIB); - expect(authPluginLib_value).toBe(AUTH_PLUGIN_LIB); + expect(prefix_value).toBe(config.DATASET_PREFIX); + expect(parmLib_value).toBe(config.PARM_LIB); + expect(procLib_value).toBe(config.PROC_LIB); + expect(authLoadLib_value).toBe(config.AUTH_LOAD_LIB); + expect(authPluginLib_value).toBe(config.AUTH_PLUGIN_LIB); }) }) \ No newline at end of file diff --git a/playwright_test/Tests/InstallationType.spec.ts b/playwright_test/Tests/InstallationType.spec.ts index df39e0c1..23aafd80 100644 --- a/playwright_test/Tests/InstallationType.spec.ts +++ b/playwright_test/Tests/InstallationType.spec.ts @@ -4,26 +4,13 @@ import ConnectionPage from '../Pages/connection.page.ts'; import PlanningPage from '../Pages/planning.page.ts'; import InstallationTypePage from '../Pages/installationType.page.ts'; import InstallationPage from '../Pages/installation.page.ts'; +import config from '../utils/config'; let electronApp: ElectronApplication const PLANNING_TITLE = 'Before you start'; const INSTALLATION_PAGE_TITLE = 'Installation'; -const RUNTIME_DIR = process.env.ZOWE_ROOT_DIR; -const SSH_HOST = process.env.SSH_HOST; -const SSH_PASSWD = process.env.SSH_PASSWD; -const SSH_PORT = process.env.SSH_PORT; -const SSH_USER = process.env.SSH_USER; -const ZOWE_EXTENSION_DIR = process.env.ZOWE_EXTENSION_DIR; -const ZOWE_LOG_DIR = process.env.ZOWE_LOG_DIR; -const ZOWE_WORKSPACE_DIR = process.env.ZOWE_WORKSPACE_DIR; -const JOB_NAME = process.env.JOB_NAME; -const JOB_PREFIX = process.env.JOB_PREFIX; -const JAVA_HOME = process.env.JAVA_HOME; -const NODE_HOME = process.env.NODE_HOME; -const ZOSMF_HOST = process.env.ZOSMF_HOST; -const ZOSMF_PORT = process.env.ZOSMF_PORT; -const ZOSMF_APP_ID = process.env.ZOSMF_APP_ID; -const UPLOAD_PAX_PATH = process.env.ZOWE_ROOT_DIR +const DOWNLOAD_ZOWE_PAX = 'Download Zowe Pax'; + test.describe('InstallationTypeTab', () => { let connectionPage: ConnectionPage; @@ -42,15 +29,24 @@ test.describe('InstallationTypeTab', () => { installationTypePage = new InstallationTypePage(page); installationPage = new InstallationPage(page); titlePage.navigateToConnectionTab() - connectionPage.performLogin(SSH_HOST, SSH_PORT, SSH_USER, SSH_PASSWD) - await page.waitForTimeout(5000); - connectionPage.clickContinueButton() - planningPage.insertValidateJobStatement() - await page.waitForTimeout(20000); - planningPage.validatePlanningStageLocations(RUNTIME_DIR, ZOWE_WORKSPACE_DIR, ZOWE_EXTENSION_DIR, ZOWE_LOG_DIR, '1', JOB_NAME, JOB_PREFIX, JAVA_HOME, NODE_HOME, ZOSMF_HOST, ZOSMF_PORT, ZOSMF_APP_ID) - await page.waitForTimeout(20000); - planningPage.clickContinueToInstallation() - await page.waitForTimeout(5000); + await connectionPage.fillConnectionDetails(config.SSH_HOST, config.SSH_PORT, config.SSH_USER, config.SSH_PASSWD); + await connectionPage.SubmitValidateCredential(); + await connectionPage.clickContinueButton(); + await planningPage.fillPlanningPageWithRequiredFields(config.ZOWE_ROOT_DIR, + config.ZOWE_WORKSPACE_DIR, + config.ZOWE_EXTENSION_DIR, + config.ZOWE_LOG_DIR, + '1', + config.JOB_NAME, + config.JOB_PREFIX, + config.JAVA_HOME, + config.NODE_HOME, + config.ZOSMF_HOST, + config.ZOSMF_PORT, + config.ZOSMF_APP_ID + ); + await planningPage.clickValidateLocations() + await planningPage.clickContinueToInstallation() }) test.afterEach(async () => { @@ -58,7 +54,6 @@ test.describe('InstallationTypeTab', () => { }) test('Test all required fields on Installation Type page', async ({ page }) => { - await page.waitForTimeout(5000) expect(installationTypePage.downloadPax).toBeTruthy() expect(installationTypePage.uploadPax).toBeTruthy() expect(installationTypePage.smpe).toBeTruthy() @@ -66,97 +61,62 @@ test.describe('InstallationTypeTab', () => { expect(installationTypePage.saveAndClose).toBeTruthy() expect(installationTypePage.previousStep).toBeTruthy() expect(installationTypePage.continueToComponentInstallation).toBeTruthy() - const is_Continue_Button_disable = await installationTypePage.isContinueToComponentInstallationDisabled(); - expect(is_Continue_Button_disable).toBe(true); + const is_continue_button_enabled = await installationTypePage.isContinueUnpaxEnabled(); + expect(is_continue_button_enabled).toBe(false); }) test('Test Downlad Zowe Pax', async ({ page }) => { - await page.waitForTimeout(5000) - installationTypePage.selectDownloadZowePax() - installationTypePage.clickLicenseAgreement() - installationTypePage.clickAgreeLicense() + await installationTypePage.selectDownloadZowePax() + await installationTypePage.clickLicenseAgreement() + await installationTypePage.clickAgreeLicense() const is_GreenCheck_Visible = await installationTypePage.isLicenseAgreementGreenCheckVisible(); expect(is_GreenCheck_Visible).toBe(true); - const Is_Continue_Button_Enable = await installationTypePage.isContinueToComponentInstallationEnabled(); - expect(Is_Continue_Button_Enable).toBe(true); + const is_continue_button_enabled = await installationTypePage.isContinueUnpaxEnabled(); + expect(is_continue_button_enabled).toBe(true); }) + /* Need to figure out new logic test('Test Upload Zowe Pax', async ({ page }) => { - await page.waitForTimeout(5000) - installationTypePage.uploadZowePaxAndNavigateToInstallationPage(UPLOAD_PAX_PATH) - const Is_Continue_Button_Enable = await installationTypePage.isContinueToComponentInstallationEnabled(); + await installationTypePage.uploadZowePaxAndNavigateToInstallationPage(UPLOAD_PAX_PATH) + const Is_Continue_Button_Enable = await installationTypePage.isContinueUnpaxEnabled(); expect(Is_Continue_Button_Enable).toBe(true); - }) + })*/ - test('Test SMPE with Valid Path', async ({ page }) => { - await page.waitForTimeout(5000) - installationTypePage.selectSmpe() - installationTypePage.enterRuntimeDir(RUNTIME_DIR) - installationTypePage.clickValidateLocation() - await page.waitForTimeout(5000) - const is_GreenCheck_Visible = await installationTypePage.isValidateLocationGreenCheckVisible(); - expect(is_GreenCheck_Visible).toBe(true); - const Is_Continue_Button_Enable = await installationTypePage.isContinueToComponentInstallationEnabled(); + test('Test SMPE ', async ({ page }) => { + await installationTypePage.selectSmpe() + const Is_Continue_Button_Enable = await installationTypePage.isContinueUnpaxEnabled(); expect(Is_Continue_Button_Enable).toBe(true); }) - test('Test SMPE with Invalid Path', async ({ page }) => { - await page.waitForTimeout(5000) - installationTypePage.selectSmpe() - installationTypePage.enterRuntimeDir('ABCDE') - installationTypePage.clickValidateLocation() - await page.waitForTimeout(5000) - const is_GreenCheck_Visible = await installationTypePage.isValidateLocationGreenCheckVisible(); - expect(is_GreenCheck_Visible).toBe(false); - const Is_Continue_Button_Enable = await installationTypePage.isContinueToComponentInstallationEnabled(); - expect(Is_Continue_Button_Enable).toBe(false); - }) - - test('Test SMPE with Empty Path', async ({ page }) => { - await page.waitForTimeout(5000) - installationTypePage.selectSmpe() - installationTypePage.enterRuntimeDir('') - installationTypePage.clickValidateLocation() - await page.waitForTimeout(5000) - const is_GreenCheck_Visible = await installationTypePage.isValidateLocationGreenCheckVisible(); - expect(is_GreenCheck_Visible).toBe(false); - const Is_Continue_Button_Enable = await installationTypePage.isContinueToComponentInstallationEnabled(); - expect(Is_Continue_Button_Enable).toBe(false); - }) - test('Test Previous step', async ({ page }) => { - installationTypePage.clickPreviousStep(); - await page.waitForTimeout(2000); + await installationTypePage.clickPreviousStep(); const title = await planningPage.getPlanningPageTitle(); expect(title).toBe(PLANNING_TITLE); }) test('Test Continue To Components Installation Button', async ({ page }) => { - await page.waitForTimeout(5000) - installationTypePage.selectDownloadZowePax() - installationTypePage.clickLicenseAgreement() - installationTypePage.clickAgreeLicense() - const Is_Continue_Button_Enable = await installationTypePage.isContinueToComponentInstallationEnabled(); + await installationTypePage.selectDownloadZowePax() + await installationTypePage.clickLicenseAgreement() + await installationTypePage.clickAgreeLicense() + const Is_Continue_Button_Enable = await installationTypePage.isContinueUnpaxEnabled(); expect(Is_Continue_Button_Enable).toBe(true); - installationTypePage.clickContinueToInstallation() + await installationTypePage.continueToUnpax() const title = await installationPage.getInstallationPageTitle(); - expect(title).toBe(INSTALLATION_PAGE_TITLE); + expect(title).toBe(DOWNLOAD_ZOWE_PAX); }) - test('Test Save and Close and Resume Progress', async ({ page }) => { - await page.waitForTimeout(5000) - installationTypePage.selectDownloadZowePax() - installationTypePage.clickLicenseAgreement() - installationTypePage.clickAgreeLicense() - const Is_Continue_Button_Enable = await installationTypePage.isContinueToComponentInstallationEnabled(); + test('Test Save and Close and Resume Progress', async ({page}) => { + await installationTypePage.selectDownloadZowePax() + await installationTypePage.clickLicenseAgreement() + await installationTypePage.clickAgreeLicense() + const Is_Continue_Button_Enable = await installationTypePage.isContinueUnpaxEnabled(); expect(Is_Continue_Button_Enable).toBe(true); - installationTypePage.clickSaveAndClose(); - await page.waitForTimeout(3000); - titlePage.clickOnResumeProgress(); - await page.waitForTimeout(5000); + await installationTypePage.clickSaveAndClose(); + await titlePage.clickOnResumeProgress(); + await connectionPage.fillConnectionDetails(config.SSH_HOST, config.SSH_PORT, config.SSH_USER, config.SSH_PASSWD); const is_GreenCheck_Visible = await installationTypePage.isLicenseAgreementGreenCheckVisible(); expect(is_GreenCheck_Visible).toBe(true); - const Is_Continue_Button_Enable_After_Save = await installationTypePage.isContinueToComponentInstallationEnabled(); + const Is_Continue_Button_Enable_After_Save = await installationTypePage.isContinueUnpaxEnabled(); expect(Is_Continue_Button_Enable_After_Save).toBe(true); }) }) \ No newline at end of file diff --git a/playwright_test/Tests/Networking.spec.ts b/playwright_test/Tests/Networking.spec.ts index 53897cf3..d9a02b99 100644 --- a/playwright_test/Tests/Networking.spec.ts +++ b/playwright_test/Tests/Networking.spec.ts @@ -3,29 +3,19 @@ import SecurityPage from '../Pages/security.page'; import { prepareEnvironment } from '../prepare.js'; import TitlePage from '../Pages/title.page'; import ConnectionPage from '../Pages/connection.page'; +import InstallationPage from '../Pages/installation.page.ts'; +import InstallationTypePage from '../Pages/installationType.page.ts'; import PlanningPage from '../Pages/planning.page'; import NetworkingPage from '../Pages/networking.page'; +import path from 'path'; +import config from '../utils/config'; + +let page: Page; let electronApp: ElectronApplication const NETWORKING_TITLE = 'Networking'; const INSTALLATION_TITLE = 'Installation'; -const DOMAIN_NAME = process.env.DOMAIN_NAME; -const EXTERNAL_PORT = process.env.EXTERNAL_PORT; -const ZOWE_ROOT_DIR = process.env.ZOWE_ROOT_DIR; -const SSH_HOST = process.env.SSH_HOST; -const SSH_PASSWD = process.env.SSH_PASSWD; -const SSH_PORT = process.env.SSH_PORT; -const SSH_USER = process.env.SSH_USER; -const ZOWE_EXTENSION_DIR = process.env.ZOWE_EXTENSION_DIR; -const ZOWE_LOG_DIR = process.env.ZOWE_LOG_DIR; -const ZOWE_WORKSPACE_DIR = process.env.ZOWE_WORKSPACE_DIR; -const JOB_NAME = process.env.JOB_NAME; -const JOB_PREFIX = process.env.JOB_PREFIX; -const JAVA_HOME = process.env.JAVA_HOME; -const NODE_HOME = process.env.NODE_HOME; -const ZOSMF_HOST = process.env.ZOSMF_HOST; -const ZOSMF_PORT = process.env.ZOSMF_PORT; -const ZOSMF_APP_ID = process.env.ZOSMF_APP_ID; + test.beforeAll(async () => { try { @@ -37,192 +27,165 @@ test.beforeAll(async () => { }); test.describe('networkingTab', () => { - let connectionPage: ConnectionPage; - let titlePage: TitlePage; - let planningPage: PlanningPage; - let networkingPage: NetworkingPage; - - test.beforeEach(async ({ page }) => { - test.setTimeout(900000); - electronApp = await electron.launch({ args: ['.webpack/main/index.js'] }) - page = await electronApp.firstWindow() - connectionPage = new ConnectionPage(page); - networkingPage = new NetworkingPage(page); - titlePage = new TitlePage(page); - planningPage = new PlanningPage(page); - titlePage.navigateToConnectionTab() - connectionPage.performLogin(SSH_HOST, SSH_PORT, SSH_USER, SSH_PASSWD) - await page.waitForTimeout(5000); - connectionPage.clickContinueButton() - planningPage.insertValidateJobStatement() - await page.waitForTimeout(20000); - planningPage.validatePlanningStageLocations(ZOWE_ROOT_DIR, ZOWE_WORKSPACE_DIR, ZOWE_EXTENSION_DIR, ZOWE_LOG_DIR, '1', JOB_NAME, JOB_PREFIX, JAVA_HOME, NODE_HOME, ZOSMF_HOST, ZOSMF_PORT, ZOSMF_APP_ID) - await page.waitForTimeout(20000); - planningPage.clickContinueToInstallation() - await page.waitForTimeout(5000); - networkingPage.movetoNetworkingPage() - await page.waitForTimeout(5000); - }) + let connectionPage: ConnectionPage; + let titlePage : TitlePage; + let securityPage : SecurityPage; + let planningPage : PlanningPage; + let networkingPage : NetworkingPage; + let installationTypePage : InstallationTypePage; + let installationPage : InstallationPage; + + test.beforeEach(async ({ page }) => { + test.setTimeout(900000); + electronApp = await electron.launch({ args: ['.webpack/main/index.js'] }) + page = await electronApp.firstWindow() + connectionPage = new ConnectionPage(page); + networkingPage = new NetworkingPage(page); + titlePage = new TitlePage(page); + planningPage = new PlanningPage(page); + installationPage = new InstallationPage(page); + installationTypePage = new InstallationTypePage(page); + titlePage.navigateToConnectionTab() + await connectionPage.fillConnectionDetails(config.SSH_HOST, config.SSH_PORT, config.SSH_USER, config.SSH_PASSWD); + await connectionPage.SubmitValidateCredential(); + await connectionPage.clickContinueButton(); + await planningPage.fillPlanningPageWithRequiredFields(config.ZOWE_ROOT_DIR, + config.ZOWE_WORKSPACE_DIR, + config.ZOWE_EXTENSION_DIR, + config.ZOWE_LOG_DIR, + '1', + config.JOB_NAME, + config.JOB_PREFIX, + config.JAVA_HOME, + config.NODE_HOME, + config.ZOSMF_HOST, + config.ZOSMF_PORT, + config.ZOSMF_APP_ID + ); + await planningPage.clickValidateLocations() + await planningPage.clickContinueToInstallation() + await installationTypePage.downloadZowePaxAndNavigateToInstallationPage() + await installationTypePage.continueToUnpax() + await installationTypePage.skipUnpax() + await installationPage.fillAllFields(config.DATASET_PREFIX, + config.PARM_LIB, + config.PROC_LIB, + config.JCL_LIB, + config.LOAD_LIB, + config.AUTH_LOAD_LIB, + config.AUTH_PLUGIN_LIB + ) + await installationPage.clickInstallMvsDatasets(); + await installationPage.clickContinueToNetworkSetup(); + }) test.afterEach(async () => { await electronApp.close() }) test('test title of page', async ({ page }) => { - await page.waitForTimeout(5000); - const title = await networkingPage.returnTitleOfNetworkingPage(); - expect(title).toBe(NETWORKING_TITLE); - }) + const title = await networkingPage.returnTitleOfNetworkingPage(); + expect(title).toBe(NETWORKING_TITLE); + }) test('test all required fields', async ({ page }) => { - await page.waitForTimeout(5000); - expect(networkingPage.externalDomains).toBeTruthy() - expect(networkingPage.externalPort).toBeTruthy() - expect(networkingPage.components).toBeTruthy() - expect(networkingPage.metricService).toBeTruthy() - expect(networkingPage.zss).toBeTruthy() - expect(networkingPage.explorerUss).toBeTruthy() - expect(networkingPage.jobsApi).toBeTruthy() - expect(networkingPage.filesApi).toBeTruthy() - expect(networkingPage.filesApiDebug).toBeTruthy() - expect(networkingPage.explorerMvs).toBeTruthy() - expect(networkingPage.cloudGateway).toBeTruthy() - expect(networkingPage.explorerJes).toBeTruthy() - expect(networkingPage.apiCatalog).toBeTruthy() - expect(networkingPage.gateway).toBeTruthy() - expect(networkingPage.appServer).toBeTruthy() - expect(networkingPage.cachingService).toBeTruthy() - expect(networkingPage.discovery).toBeTruthy() - }) + await expect(networkingPage.externalDomains).toBeTruthy() + await expect(networkingPage.externalPort).toBeTruthy() + await expect(networkingPage.components).toBeTruthy() + await expect(networkingPage.metricService).toBeTruthy() + await expect(networkingPage.zss).toBeTruthy() + await expect(networkingPage.explorerUss).toBeTruthy() + await expect(networkingPage.jobsApi).toBeTruthy() + await expect(networkingPage.filesApi).toBeTruthy() + await expect(networkingPage.filesApiDebug).toBeTruthy() + await expect(networkingPage.explorerMvs).toBeTruthy() + await expect(networkingPage.cloudGateway).toBeTruthy() + await expect(networkingPage.explorerJes).toBeTruthy() + await expect(networkingPage.apiCatalog).toBeTruthy() + await expect(networkingPage.gateway).toBeTruthy() + await expect(networkingPage.appServer).toBeTruthy() + await expect(networkingPage.cachingService).toBeTruthy() + await expect(networkingPage.discovery).toBeTruthy() + }) test('test external domain field', async ({ page }) => { - await page.waitForTimeout(5000); - await networkingPage.fillexternal_domainvalues(DOMAIN_NAME, EXTERNAL_PORT); - await page.waitForTimeout(5000); + await networkingPage.fillexternal_domainvalues(config.DOMAIN_NAME, config.EXTERNAL_PORT); const port = await networkingPage.get_externalDomainport_value(); const domainName = await networkingPage.get_externalDomainName_value(); - console.log(port, domainName) - expect(port).toBe(DOMAIN_NAME); - expect(domainName).toBe(EXTERNAL_PORT); - await page.waitForTimeout(5000); + expect(port).toBe(config.EXTERNAL_PORT); + expect(domainName).toBe(config.DOMAIN_NAME); }) test('test deleting domain name field', async ({ page }) => { await networkingPage.delete_DomainNameField(); - await page.waitForTimeout(5000); const isDomainNameVisible = await networkingPage.domainName.isVisible(); expect(isDomainNameVisible).toBeFalsy() }) test('test add more domain name field', async ({ page }) => { - await page.waitForTimeout(5000); await networkingPage.add_DomainNameField(); - await page.waitForTimeout(5000); - expect(networkingPage.domainName).toBeTruthy() + await expect(networkingPage.domainName).toBeTruthy() }) test('test add special char in other port no', async ({ page }) => { - await page.waitForTimeout(5000); + const originalValue = await networkingPage.get_metricServiceport_value(); await networkingPage.fillMetricServicePort('*^%$^&'); - await page.waitForTimeout(5000); - const port = await networkingPage.get_metricServiceport_value(); - expect(port).toBe(''); + const newValue = await networkingPage.get_metricServiceport_value(); + expect(newValue).toBe(originalValue); }) - test('test enabled debug component', async ({ page }) => { - await page.waitForTimeout(5000); - await networkingPage.click_checkBox('1'); - await networkingPage.click_checkBox('2'); - await page.waitForTimeout(10000); - const isEnabled = await networkingPage.isCheckboxCheckedAndBlue('2'); - const isDebug = await networkingPage.isCheckboxCheckedAndBlue('1'); - expect(isEnabled).toBe(true); - expect(isDebug).toBe(true); + test('test enabled metric service debug', async ({ page }) => { + const beforeClick = await networkingPage.isMetricsServiceDebugChecked(); + expect(beforeClick).toBe(false); + await networkingPage.clickMetricsServiceDebug(); + const afterClick = await networkingPage.isMetricsServiceDebugChecked(); + expect(afterClick).toBe(true); }) test('Test view yaml button', async ({ page }) => { - await page.waitForTimeout(7000); - networkingPage.viewYaml() - await page.waitForTimeout(5000); - expect(networkingPage.editor_title_element).toBeTruthy(); - await page.waitForTimeout(5000); - networkingPage.closeButton() - await page.waitForTimeout(2000); - }) + await networkingPage.viewYaml() + await expect(networkingPage.editor_title_element).toBeTruthy(); + await networkingPage.closeButton() + }) - test('Test view and submit button', async ({ page }) => { - await page.waitForTimeout(5000); - networkingPage.click_viewAndSubmitJob() - await page.waitForTimeout(5000); - expect(networkingPage.editor_title_element).toBeTruthy() - networkingPage.closeButton() - await page.waitForTimeout(2000); - }) - - test('Test view job', async ({ page }) => { - await page.waitForTimeout(5000); - networkingPage.click_previewJob() - await page.waitForTimeout(5000); - expect(networkingPage.editor_title_element).toBeTruthy() - networkingPage.closeButton() - await page.waitForTimeout(5000); - }) test('Test save and close', async ({ page }) => { - await page.waitForTimeout(5000); - await networkingPage.fillexternal_domainvalues(DOMAIN_NAME, EXTERNAL_PORT); - await page.waitForTimeout(5000); - networkingPage.click_saveAndClose() - await page.waitForTimeout(3000); - titlePage.clickOnResumeProgress(); - await page.waitForTimeout(15000); + await networkingPage.fillexternal_domainvalues(config.DOMAIN_NAME, config.EXTERNAL_PORT); + await networkingPage.click_saveAndClose() + await titlePage.clickOnResumeProgress(); + await connectionPage.fillConnectionDetails(config.SSH_HOST, config.SSH_PORT, config.SSH_USER, config.SSH_PASSWD); + await connectionPage.SubmitValidateCredential(); const title = await networkingPage.returnTitleOfNetworkingPage(); expect(title).toBe(NETWORKING_TITLE); const port = await networkingPage.get_externalDomainport_value(); const domainName = await networkingPage.get_externalDomainName_value(); - expect(port).toBe(EXTERNAL_PORT); - expect(domainName).toBe(DOMAIN_NAME); - await page.waitForTimeout(5000); - - }) + expect(port).toBe(config.EXTERNAL_PORT); + expect(domainName).toBe(config.DOMAIN_NAME); + }) test('click Previous step button', async ({ page }) => { - await page.waitForTimeout(5000); - const title = await networkingPage.returnTitleOfPrevPage(); - expect(title).toBe(INSTALLATION_TITLE); - }) - - test('Test previous button is enabled', async ({ page }) => { - const is_prevButtonEnable = await networkingPage.isPreviousButtonEnable(); - expect(is_prevButtonEnable).toBe(true); - await page.waitForTimeout(2000); - }) + const is_prevButtonEnable = await networkingPage.isPreviousButtonEnable(); + expect(is_prevButtonEnable).toBe(true); + const title = await networkingPage.returnTitleOfPrevPage(); + expect(title).toBe(INSTALLATION_TITLE); + }) test('Test continue to APF Auth button is disable', async ({ page }) => { - await page.waitForTimeout(2000); - const is_ContinueButtonDisable = await networkingPage.isContinueButtonDisable(); - expect(is_ContinueButtonDisable).toBe(true); - await page.waitForTimeout(2000); - }) + const is_ContinueButtonDisable = await networkingPage.isContinueButtonDisable(); + expect(is_ContinueButtonDisable).toBe(true); + }) test('Test Skip networking button is enable', async ({ page }) => { - await page.waitForTimeout(2000); - const isLaunchConfigEnable = await networkingPage.is_skipNetworkingButtonEnable(); - expect(isLaunchConfigEnable).toBe(true); - await page.waitForTimeout(2000); - }) + const isLaunchConfigEnable = await networkingPage.is_skipNetworkingButtonEnable(); + expect(isLaunchConfigEnable).toBe(true); + }) test('Test yaml should be updated', async ({ page }) => { - await page.waitForTimeout(5000); - await networkingPage.fillexternal_domainvalues(DOMAIN_NAME, EXTERNAL_PORT); - await page.waitForTimeout(5000); + await networkingPage.fillexternal_domainvalues(config.DOMAIN_NAME, config.EXTERNAL_PORT); await networkingPage.viewYaml(); - await page.waitForTimeout(10000); - expect(networkingPage.editor_title_element).toBeTruthy(); - await page.waitForTimeout(5000); + await expect(networkingPage.editor_title_element).toBeTruthy(); const yaml = await networkingPage.read_yaml(); - await page.waitForTimeout(5000); - expect(yaml).toContain(DOMAIN_NAME); - expect(yaml).toContain(EXTERNAL_PORT); - }) + expect(yaml).toContain(config.DOMAIN_NAME); + expect(yaml).toContain(config.EXTERNAL_PORT); + }) }); diff --git a/playwright_test/Tests/Planning.spec.ts b/playwright_test/Tests/Planning.spec.ts index 780e5f4d..f87cc980 100644 --- a/playwright_test/Tests/Planning.spec.ts +++ b/playwright_test/Tests/Planning.spec.ts @@ -4,32 +4,15 @@ import TitlePage from '../Pages/title.page'; import PlanningPage from '../Pages/planning.page.ts'; import InstallationTypePage from '../Pages/installationType.page.ts'; let page: Page; +import config from '../utils/config'; let electronApp: ElectronApplication const CONNECTION_PAGE_TITLE = 'Connection'; -const SSH_HOST = process.env.SSH_HOST; -const SSH_PASSWD = process.env.SSH_PASSWD; -const SSH_PORT = process.env.SSH_PORT; -const SSH_USER = process.env.SSH_USER; const PLANNING_TITLE = 'Before you start'; const INSTALLATION_TYPE_TITLE = 'Installation Type'; -const JOB_STATEMENT = "//HELLOJOB JOB 'HELLO, WORLD!',CLASS=A,MSGCLASS=A\n//STEP01 EXEC PGM=IEFBR14\n//SYSPRINT DD SYSOUT=A\n//SYSIN DD DUMMY"; const INVALID_JOB_STATEMENT = "//HELLOJOB JOB 'HELLO, WORLD!',CLASS=A,MSGCLASS"; -const ERROR_MESSAGE = "Failed to verify job statement"; -const ERROR_MESSAGE1 = "Error invoking remote method 'get-env-vars': Error: Failed to submit jcl, job id not found" -const RUNTIME_DIR = process.env.ZOWE_ROOT_DIR; -const WORKSPACE_DIR = process.env.ZOWE_WORKSPACE_DIR; -const LOG_DIR = process.env.ZOWE_LOG_DIR; -const EXTENSIONS_DIR = process.env.ZOWE_EXTENSION_DIR; -const RBAC_IDENTIFIER = '1'; -const JOB_NAME = process.env.JOB_NAME; -const JOB_PREFIX = process.env.JOB_PREFIX; -const COOKIE_IDENTIFIER = '1'; -const JAVA_LOCATION = process.env.JAVA_HOME; -const NODEJS_LOCATION = process.env.NODE_HOME; -const ZOSMF_HOST = process.env.ZOSMF_HOST; -const ZOSMF_PORT = process.env.ZOSMF_PORT; -const ZOSMF_APP_ID = process.env.ZOSMF_APP_ID; +const ERROR_MESSAGE = "Failed to verify job statement STMT NO. MESSAGE\n 1 IEFC006I POSITIONAL PARAMETERS MUST BE SPECIFIED BEFORE KEYWORD PARAMETERS"; +const EMPTY_ERROR = "Error invoking remote method 'get-env-vars': Error: Failed to submit jcl, job id not found"; test.describe('PlanningTab', () => { let connectionPage: ConnectionPage; @@ -37,20 +20,19 @@ test.describe('PlanningTab', () => { let planningPage: PlanningPage; let installationTypePage: InstallationTypePage - test.beforeEach(async () => { - test.setTimeout(900000); - electronApp = await electron.launch({ args: ['.webpack/main/index.js'] }) - page = await electronApp.firstWindow() - connectionPage = new ConnectionPage(page); - titlePage = new TitlePage(page); - planningPage = new PlanningPage(page); - installationTypePage = new InstallationTypePage(page); - titlePage.navigateToConnectionTab() - connectionPage.performLogin(SSH_HOST, SSH_PORT, SSH_USER, SSH_PASSWD) - await page.waitForTimeout(5000); - connectionPage.clickContinueButton(); - await page.waitForTimeout(3000); - }) + test.beforeEach(async () => { + test.setTimeout(900000); + electronApp = await electron.launch({ args: ['.webpack/main/index.js'] }) + page = await electronApp.firstWindow() + connectionPage = new ConnectionPage(page); + titlePage = new TitlePage(page); + planningPage = new PlanningPage(page); + installationTypePage = new InstallationTypePage(page); + titlePage.navigateToConnectionTab(); + await connectionPage.fillConnectionDetails(config.SSH_HOST, config.SSH_PORT, config.SSH_USER, config.SSH_PASSWD); + await connectionPage.SubmitValidateCredential(); + await connectionPage.clickContinueButton(); + }) test.afterEach(async () => { await electronApp.close() @@ -63,178 +45,129 @@ test.describe('PlanningTab', () => { expect(planningPage.saveAndValidate).toBeTruthy(); }) - test('Test Valid Job Statement and Save Validate', async () => { - planningPage.validateJobStatement(JOB_STATEMENT); - await page.waitForTimeout(20000); - const isGreen_check_visible = await planningPage.isSaveAndValidateGreenCheckVisible(); - expect(isGreen_check_visible).toBe(true); - }) + test('Test Valid Job Statement and Save Validate', async () => { + await planningPage.clickSaveValidate(); + const isGreen_check_visible = await planningPage.isSaveAndValidateGreenCheckVisible(); + expect(isGreen_check_visible).toBe(true); + }) - test('Test Invalid Job Statement and Save Validate', async () => { - planningPage.validateJobStatement(INVALID_JOB_STATEMENT); - await page.waitForTimeout(20000); - const error_Message = await planningPage.getErrorMessage() - expect(error_Message).toBe(ERROR_MESSAGE); - const isGreen_check_visible = await planningPage.isSaveAndValidateGreenCheckVisible(); - expect(isGreen_check_visible).toBe(false); - }) + test('Test Invalid Job Statement and Save Validate', async () => { + await planningPage.enterJobStatement(INVALID_JOB_STATEMENT); + await planningPage.clickSaveAndValidate(); + const error_Message = await planningPage.getErrorMessage() + expect (error_Message).toBe(ERROR_MESSAGE); + const isGreen_check_visible = await planningPage.isSaveAndValidateGreenCheckVisible(); + expect(isGreen_check_visible).toBe(false); + }) - test('Test Empty Job Statement and Save Validate', async () => { - planningPage.validateJobStatement(''); - await page.waitForTimeout(20000); - const error_Message = await planningPage.getErrorMessage() - expect(error_Message).toBe(ERROR_MESSAGE1); - const isGreen_check_visible = await planningPage.isSaveAndValidateGreenCheckVisible(); - expect(isGreen_check_visible).toBe(false); - }) + test('Test Empty Job Statement and Save Validate', async () => { + await planningPage.enterJobStatement(''); + await planningPage.clickSaveAndValidate(); + await page.waitForTimeout(20000); + const error_Message = await planningPage.getErrorMessage() + expect (error_Message).toBe(EMPTY_ERROR); + const isGreen_check_visible = await planningPage.isSaveAndValidateGreenCheckVisible(); + expect(isGreen_check_visible).toBe(false); + }) - test('Test all required fields on Planning Tab After Job Validation', async () => { - planningPage.validateJobStatement(JOB_STATEMENT); - await page.waitForTimeout(20000); - expect(planningPage.runtimeDir).toBeTruthy(); - expect(planningPage.workspaceDir).toBeTruthy(); - expect(planningPage.logsDir).toBeTruthy(); - expect(planningPage.extensionsDir).toBeTruthy(); - expect(planningPage.rbacProfileIdentifier).toBeTruthy(); - expect(planningPage.jobName).toBeTruthy(); - expect(planningPage.jobPrefix).toBeTruthy(); - expect(planningPage.cookieIdentifier).toBeTruthy(); - expect(planningPage.javaLocation).toBeTruthy(); - expect(planningPage.nodeJsLocation).toBeTruthy(); - expect(planningPage.setZosmf).toBeTruthy(); - expect(planningPage.zosmfHost).toBeTruthy(); - expect(planningPage.zosmfPort).toBeTruthy(); - expect(planningPage.zosmfApplicationId).toBeTruthy(); - expect(planningPage.validateLocations).toBeTruthy(); - expect(planningPage.saveAndClose).toBeTruthy(); - expect(planningPage.previousStep).toBeTruthy(); - expect(planningPage.continueInstallationOptions).toBeTruthy(); - }) + test('Test all required fields on Planning Tab After Job Validation', async () => { + await planningPage.clickSaveValidate(); + expect(planningPage.runtimeDir).toBeTruthy(); + expect(planningPage.workspaceDir).toBeTruthy(); + expect(planningPage.logsDir).toBeTruthy(); + expect(planningPage.extensionsDir).toBeTruthy(); + expect(planningPage.rbacProfileIdentifier).toBeTruthy(); + expect(planningPage.jobName).toBeTruthy(); + expect(planningPage.jobPrefix).toBeTruthy(); + expect(planningPage.cookieIdentifier).toBeTruthy(); + expect(planningPage.javaLocation).toBeTruthy(); + expect(planningPage.nodeJsLocation).toBeTruthy(); + expect(planningPage.setZosmf).toBeTruthy(); + expect(planningPage.zosmfHost).toBeTruthy(); + expect(planningPage.zosmfPort).toBeTruthy(); + expect(planningPage.zosmfApplicationId).toBeTruthy(); + expect(planningPage.validateLocations).toBeTruthy(); + expect(planningPage.saveAndClose).toBeTruthy(); + expect(planningPage.previousStep).toBeTruthy(); + expect(planningPage.continueInstallationOptions).toBeTruthy(); + const is_Continue_Button_disable = await planningPage.isContinueToInstallationDisabled(); + expect(is_Continue_Button_disable).toBe(true); + }) - test('Test Validate Locations with Valid Data', async () => { - planningPage.validateJobStatement(JOB_STATEMENT); - await page.waitForTimeout(20000); - planningPage.enterRuntimeDir(RUNTIME_DIR); - await page.waitForTimeout(1000); - planningPage.enterWorkspaceDir(WORKSPACE_DIR); - await page.waitForTimeout(1000); - planningPage.enterLogsDir(LOG_DIR); - await page.waitForTimeout(1000); - planningPage.enterExtensionsDir(EXTENSIONS_DIR); - await page.waitForTimeout(1000); - planningPage.enterRbacProfileIdentifier(RBAC_IDENTIFIER); - await page.waitForTimeout(1000); - planningPage.enterJobName(JOB_NAME); - await page.waitForTimeout(1000); - planningPage.enterJobPrefix(JOB_PREFIX); - await page.waitForTimeout(1000); - planningPage.enterCookieIdentifier(COOKIE_IDENTIFIER); - await page.waitForTimeout(1000); - planningPage.enterJavaLocation(JAVA_LOCATION); - await page.waitForTimeout(1000); - planningPage.enterNodeJsLocation(NODEJS_LOCATION); - await page.waitForTimeout(1000); - planningPage.checkSetZosmfAttribute(); - await page.waitForTimeout(1000); - planningPage.enterZosmfHost(ZOSMF_HOST); - await page.waitForTimeout(1000); - planningPage.enterZosmfPort(ZOSMF_PORT); - await page.waitForTimeout(1000); - planningPage.enterZosmfApplicationId(ZOSMF_APP_ID); - await page.waitForTimeout(1000); - planningPage.clickValidateLocations(); - await page.waitForTimeout(20000); - const is_GreenCheck_Visible = await planningPage.isValidateLocationsGreenCheckVisible(); - expect(is_GreenCheck_Visible).toBe(true); - const is_Continue_Button_enable = await planningPage.isContinueToInstallationEnabled(); - expect(is_Continue_Button_enable).toBe(true); - planningPage.clickContinueToInstallation(); - await page.waitForTimeout(1000); - const installationType_title = await installationTypePage.getInstallationTypePageTitle() - expect(installationType_title).toBe(INSTALLATION_TYPE_TITLE); - }) + test('Test Validate Locations with Valid Data', async () => { + await planningPage.fillPlanningPageWithRequiredFields(config.ZOWE_ROOT_DIR, + config.ZOWE_WORKSPACE_DIR, + config.ZOWE_EXTENSION_DIR, + config.ZOWE_LOG_DIR, + '1', + config.JOB_NAME, + config.JOB_PREFIX, + config.JAVA_HOME, + config.NODE_HOME, + config.ZOSMF_HOST, + config.ZOSMF_PORT, + config.ZOSMF_APP_ID + ); + await planningPage.clickValidateLocations() + const is_GreenCheck_Visible = await planningPage.isValidateLocationsGreenCheckVisible(); + expect(is_GreenCheck_Visible).toBe(true); + const is_Continue_Button_enable = await planningPage.isContinueToInstallationEnabled(); + expect(is_Continue_Button_enable).toBe(true); + await planningPage.clickContinueToInstallation(); + const installationType_title = await installationTypePage.getInstallationTypePageTitle() + expect (installationType_title).toBe(INSTALLATION_TYPE_TITLE); + }) - test('Test Validate Locations with Invalid Data', async () => { - await page.waitForTimeout(1000); - planningPage.validateJobStatement(JOB_STATEMENT); - await page.waitForTimeout(20000); - planningPage.enterRuntimeDir('Test/DIR'); - await page.waitForTimeout(1000); - planningPage.enterWorkspaceDir('Workspace Dir'); - await page.waitForTimeout(1000); - planningPage.enterLogsDir(LOG_DIR); - await page.waitForTimeout(1000); - planningPage.enterExtensionsDir(EXTENSIONS_DIR); - await page.waitForTimeout(1000); - planningPage.enterRbacProfileIdentifier('22'); - await page.waitForTimeout(1000); - planningPage.enterJobName(JOB_NAME); - await page.waitForTimeout(1000); - planningPage.enterJobPrefix(JOB_PREFIX); - await page.waitForTimeout(1000); - planningPage.enterCookieIdentifier('99999'); - await page.waitForTimeout(1000); - planningPage.enterJavaLocation('/'); - await page.waitForTimeout(1000); - planningPage.enterNodeJsLocation(NODEJS_LOCATION); - await page.waitForTimeout(1000); - planningPage.checkSetZosmfAttribute(); - await page.waitForTimeout(1000); - planningPage.enterZosmfHost(ZOSMF_HOST); - await page.waitForTimeout(1000); - planningPage.enterZosmfPort('987776'); - await page.waitForTimeout(1000); - planningPage.enterZosmfApplicationId('ABCDDDETT'); - await page.waitForTimeout(1000); - planningPage.clickValidateLocations(); - await page.waitForTimeout(20000); - const is_GreenCheck_Visible = await planningPage.isValidateLocationsGreenCheckVisible(); - expect(is_GreenCheck_Visible).toBe(false); - const is_Continue_Button_enable = await planningPage.isContinueToInstallationEnabled(); - expect(is_Continue_Button_enable).toBe(false); - }) + test('Test Validate Locations with Invalid Data', async () => { + await planningPage.clickSaveValidate(); + await planningPage.enterRuntimeDir('Test/DIR'); + await planningPage.enterWorkspaceDir('Workspace Dir'); + await planningPage.enterLogsDir(config.ZOWE_LOG_DIR); + await planningPage.enterExtensionsDir(config.ZOWE_EXTENSION_DIR); + await planningPage.enterRbacProfileIdentifier('TEST'); + await planningPage.enterJobName(config.JOB_NAME); + await planningPage.enterJobPrefix(config.JOB_PREFIX); + await planningPage.enterCookieIdentifier('9999'); + await planningPage.enterJavaLocation('/'); + await planningPage.enterNodeJsLocation(config.NODE_HOME); + await planningPage.enterZosmfApplicationId('ABCDDDETT'); + await planningPage.clickValidateLocations(); + const is_GreenCheck_Visible = await planningPage.isValidateLocationsGreenCheckVisible(); + expect(is_GreenCheck_Visible).toBe(false); + const is_Continue_Button_enable = await planningPage.isContinueToInstallationEnabled(); + expect(is_Continue_Button_enable).toBe(false); + }) - test('Test Previous step', async ({ page }) => { - planningPage.clickPreviousStep(); - await page.waitForTimeout(1000); - const title = await connectionPage.getConnectionPageTitle(); - expect(title).toBe(CONNECTION_PAGE_TITLE); - }) + test('Test Previous step', async ({ page }) => { + await planningPage.clickPreviousStep(); + const title = await connectionPage.getConnectionPageTitle(); + expect(title).toBe(CONNECTION_PAGE_TITLE); + }) - test('Test Save and Close and Resume Progress', async () => { - planningPage.validateJobStatement(JOB_STATEMENT); - await page.waitForTimeout(20000); - planningPage.enterRuntimeDir(RUNTIME_DIR); - await page.waitForTimeout(1000); - planningPage.enterWorkspaceDir(WORKSPACE_DIR); - await page.waitForTimeout(1000); - planningPage.enterLogsDir(LOG_DIR); - await page.waitForTimeout(1000); - planningPage.enterExtensionsDir(EXTENSIONS_DIR); - await page.waitForTimeout(1000); - planningPage.enterRbacProfileIdentifier(RBAC_IDENTIFIER); - await page.waitForTimeout(1000); - planningPage.enterJobName(JOB_NAME); - await page.waitForTimeout(1000); - planningPage.enterJobPrefix(JOB_PREFIX); - await page.waitForTimeout(1000); - planningPage.enterCookieIdentifier(COOKIE_IDENTIFIER); - await page.waitForTimeout(1000); - planningPage.enterJavaLocation(JAVA_LOCATION); - await page.waitForTimeout(1000); - planningPage.enterNodeJsLocation(NODEJS_LOCATION); - await page.waitForTimeout(1000); - planningPage.clickValidateLocations(); - await page.waitForTimeout(20000); - planningPage.clickSaveAndClose(); - await page.waitForTimeout(3000); - titlePage.clickOnResumeProgress(); - await page.waitForTimeout(5000); - const title = await planningPage.getPlanningPageTitle(); - expect(title).toBe(PLANNING_TITLE); - const is_GreenCheck_Visible = await planningPage.isValidateLocationsGreenCheckVisible(); - expect(is_GreenCheck_Visible).toBe(true); - const is_Continue_Button_enable = await planningPage.isContinueToInstallationEnabled(); - expect(is_Continue_Button_enable).toBe(true); + test('Test Save and Close and Resume Progress', async () => { + await planningPage.fillPlanningPageWithRequiredFields(config.ZOWE_ROOT_DIR, + config.ZOWE_WORKSPACE_DIR, + config.ZOWE_EXTENSION_DIR, + config.ZOWE_LOG_DIR, + '1', + config.JOB_NAME, + config.JOB_PREFIX, + config.JAVA_HOME, + config.NODE_HOME, + config.ZOSMF_HOST, + config.ZOSMF_PORT, + config.ZOSMF_APP_ID + ); + await planningPage.clickValidateLocations() + await planningPage.clickSaveAndClose(); + await titlePage.clickOnResumeProgress(); + await connectionPage.fillConnectionDetails(config.SSH_HOST, config.SSH_PORT, config.SSH_USER, config.SSH_PASSWD); + await connectionPage.SubmitValidateCredential(); + const title = await planningPage.getPlanningPageTitle(); + expect(title).toBe(PLANNING_TITLE); + const is_GreenCheck_Visible = await planningPage.isValidateLocationsGreenCheckVisible(); + expect(is_GreenCheck_Visible).toBe(true); + const is_Continue_Button_enable = await planningPage.isContinueToInstallationEnabled(); + expect(is_Continue_Button_enable).toBe(true); + }) }) -}) diff --git a/playwright_test/Tests/Security.spec.ts b/playwright_test/Tests/Security.spec.ts index 6cfb21dc..73d43100 100644 --- a/playwright_test/Tests/Security.spec.ts +++ b/playwright_test/Tests/Security.spec.ts @@ -5,34 +5,20 @@ import ApfAuthPage from '../Pages/ApfAuth.page'; import TitlePage from '../Pages/title.page'; import ConnectionPage from '../Pages/connection.page'; import PlanningPage from '../Pages/planning.page'; +import NetworkingPage from '../Pages/networking.page'; +import InstallationPage from '../Pages/installation.page.ts'; +import InstallationTypePage from '../Pages/installationType.page.ts'; +import path from 'path'; +import config from '../utils/config'; +let page: Page; + let electronApp: ElectronApplication const CERTIFICATE_TITLE = 'Certificates' const SECURITY_TITLE = 'Security' -const APF_AUTH_TITLE = 'APF Authorize Load Libraries' -const ZOWE_ROOT_DIR = process.env.ZOWE_ROOT_DIR; -const SSH_HOST = process.env.SSH_HOST; -const SSH_PASSWD = process.env.SSH_PASSWD; -const SSH_PORT = process.env.SSH_PORT; -const SSH_USER = process.env.SSH_USER; -const ZOWE_EXTENSION_DIR = process.env.ZOWE_EXTENSION_DIR; -const ZOWE_LOG_DIR = process.env.ZOWE_LOG_DIR; -const ZOWE_WORKSPACE_DIR = process.env.ZOWE_WORKSPACE_DIR; -const JOB_NAME = process.env.JOB_NAME; -const JOB_PREFIX = process.env.JOB_PREFIX; -const JAVA_HOME = process.env.JAVA_HOME; -const NODE_HOME = process.env.NODE_HOME; -const ZOSMF_HOST = process.env.ZOSMF_HOST; -const ZOSMF_PORT = process.env.ZOSMF_PORT; -const ZOSMF_APP_ID = process.env.ZOSMF_APP_ID; -const SECURITY_ADMIN = process.env.SECURITY_ADMIN; -const SECURITY_STC = process.env.SECURITY_STC; -const SECURITY_SYSPROG = process.env.SECURITY_SYSPROG; -const SECURITY_USER_ZIS = process.env.SECURITY_USER_ZIS; -const SECURITY_USER_ZOWE = process.env.SECURITY_USER_ZOWE; -const SECURITY_AUX = process.env.SECURITY_AUX; -const SECURITY_STC_ZOWE = process.env.SECURITY_STC_ZOWE; -const SECURITY_STC_ZIS = process.env.SECURITY_STC_ZIS; +const APF_AUTH_TITLE ='APF Authorize Load Libraries' +const STC_TITTLE = 'Stcs' + test.beforeAll(async () => { try { @@ -44,173 +30,170 @@ test.beforeAll(async () => { }); test.describe('securityTab', () => { - let connectionPage: ConnectionPage; - let titlePage: TitlePage; - let securityPage: SecurityPage; - let planningPage: PlanningPage; - let apfAuthPage: ApfAuthPage; - - test.beforeEach(async ({ page }) => { - test.setTimeout(900000); - electronApp = await electron.launch({ args: ['.webpack/main/index.js'] }) - page = await electronApp.firstWindow() - connectionPage = new ConnectionPage(page); - titlePage = new TitlePage(page); - planningPage = new PlanningPage(page); - apfAuthPage = new ApfAuthPage(page); - securityPage = new SecurityPage(page); - titlePage.navigateToConnectionTab() - connectionPage.performLogin(SSH_HOST, SSH_PORT, SSH_USER, SSH_PASSWD) - await page.waitForTimeout(5000); - connectionPage.clickContinueButton() - planningPage.insertValidateJobStatement() - await page.waitForTimeout(20000); - planningPage.validatePlanningStageLocations(ZOWE_ROOT_DIR, ZOWE_WORKSPACE_DIR, ZOWE_EXTENSION_DIR, ZOWE_LOG_DIR, '1', JOB_NAME, JOB_PREFIX, JAVA_HOME, NODE_HOME, ZOSMF_HOST, ZOSMF_PORT, ZOSMF_APP_ID) - await page.waitForTimeout(20000); - planningPage.clickContinueToInstallation() - await page.waitForTimeout(5000); - securityPage.movetoSecurityPage() - await page.waitForTimeout(5000); - }) + let connectionPage: ConnectionPage; + let titlePage : TitlePage; + let securityPage : SecurityPage; + let planningPage : PlanningPage; + let apfAuthPage : ApfAuthPage; + let networkingPage : NetworkingPage; + let installationTypePage : InstallationTypePage; + let installationPage : InstallationPage; + + + test.beforeEach(async ({ page }) => { + test.setTimeout(900000); + electronApp = await electron.launch({ args: ['.webpack/main/index.js'] }) + page= await electronApp.firstWindow() + connectionPage = new ConnectionPage(page); + titlePage = new TitlePage(page); + planningPage = new PlanningPage(page); + networkingPage = new NetworkingPage(page); + apfAuthPage = new ApfAuthPage(page); + securityPage = new SecurityPage(page); + installationPage = new InstallationPage(page); + installationTypePage = new InstallationTypePage(page); + titlePage.navigateToConnectionTab() + await connectionPage.fillConnectionDetails(config.SSH_HOST, config.SSH_PORT, config.SSH_USER, config.SSH_PASSWD); + await connectionPage.SubmitValidateCredential(); + await connectionPage.clickContinueButton(); + await planningPage.fillPlanningPageWithRequiredFields(config.ZOWE_ROOT_DIR, + config.ZOWE_WORKSPACE_DIR, + config.ZOWE_EXTENSION_DIR, + config.ZOWE_LOG_DIR, + '1', + config.JOB_NAME, + config.JOB_PREFIX, + config.JAVA_HOME, + config.NODE_HOME, + config.ZOSMF_HOST, + config.ZOSMF_PORT, + config.ZOSMF_APP_ID + ); + await planningPage.clickValidateLocations() + await planningPage.clickContinueToInstallation() + await installationTypePage.downloadZowePaxAndNavigateToInstallationPage() + await installationTypePage.continueToUnpax() + await installationTypePage.skipUnpax() + await installationPage.fillAllFields(config.DATASET_PREFIX, + config.PARM_LIB, + config.PROC_LIB, + config.JCL_LIB, + config.LOAD_LIB, + config.AUTH_LOAD_LIB, + config.AUTH_PLUGIN_LIB + ) + await installationPage.clickInstallMvsDatasets(); + await installationPage.clickContinueToNetworkSetup(); + await networkingPage.click_skipNetworking() + await apfAuthPage.click_skipApfAuth() + }) test.afterEach(async () => { await electronApp.close() }) - test('Test all required fields on security page', async ({ page }) => { - await page.waitForTimeout(5000); - expect(securityPage.product).toBeTruthy() - expect(securityPage.admin).toBeTruthy() - expect(securityPage.stc).toBeTruthy() - expect(securityPage.sys_prog).toBeTruthy() - expect(securityPage.user_zis).toBeTruthy() - expect(securityPage.user_zowe).toBeTruthy() - expect(securityPage.aux).toBeTruthy() - expect(securityPage.stc_zowe).toBeTruthy() - expect(securityPage.stc_zis).toBeTruthy() - expect(securityPage.view_yaml).toBeTruthy() - expect(securityPage.save_and_close).toBeTruthy() - expect(securityPage.previous_step).toBeTruthy() - expect(securityPage.skip_button).toBeTruthy() - expect(securityPage.continue_CertificateSelector).toBeTruthy() - }) - - test('test security with empty data', async ({ page }) => { - await page.waitForTimeout(5000); - securityPage.fillSecurityDetails('', '', '', '', '', '', '', '', '') - await page.waitForTimeout(5000); - securityPage.initializeSecurity() - await page.waitForTimeout(15000); - const isWriteConfig_check_visible = await securityPage.isWriteConfigGreenCheckVisible(); - expect(isWriteConfig_check_visible).toBe(false); - const isUploadConfig_check_visible = await securityPage.isUploadConfigGreenCheckVisible(); - expect(isUploadConfig_check_visible).toBe(false); - const isInitSecurity_check_visible = await securityPage.isInitSecurityGreenCheckVisible(); - expect(isInitSecurity_check_visible).toBe(false); - await page.waitForTimeout(15000); - }) - - test('test security with valid data', async ({ page }) => { - await page.waitForTimeout(5000); - securityPage.fillSecurityDetails('RACF', SECURITY_ADMIN, SECURITY_STC, SECURITY_SYSPROG, SECURITY_USER_ZIS, SECURITY_USER_ZOWE, SECURITY_AUX, SECURITY_STC_ZOWE, SECURITY_STC_ZIS) - await page.waitForTimeout(5000); - securityPage.initializeSecurity() - await page.waitForTimeout(5000); - const isWriteConfig_check_visible = await securityPage.isWriteConfigGreenCheckVisible(); - expect(isWriteConfig_check_visible).toBe(true); - const isUploadConfig_check_visible = await securityPage.isUploadConfigGreenCheckVisible(); - expect(isUploadConfig_check_visible).toBe(true); - const isInitSecurity_check_visible = await securityPage.isInitSecurityGreenCheckVisible(); - expect(isInitSecurity_check_visible).toBe(true); - await page.waitForTimeout(5000); - }) - - test('click Previous step button', async ({ page }) => { - await page.waitForTimeout(5000); - const title = await securityPage.returnTitleOfPrevPage(); - expect(title).toBe(APF_AUTH_TITLE); - }) - - test('test click skip security button', async ({ page }) => { - await page.waitForTimeout(5000); - const certificate_title = await securityPage.click_skipSecurity(); - expect(certificate_title).toBe(CERTIFICATE_TITLE); - }) - - test('Test previous button is enabled', async ({ page }) => { - const is_prevButtonEnable = await securityPage.isPreviousButtonEnable(); - expect(is_prevButtonEnable).toBe(true); - await page.waitForTimeout(2000); - }) - - test('Test continue to certificate button is disable', async ({ page }) => { - await page.waitForTimeout(2000); - const is_ContinueButtonDisable = await securityPage.isContinueButtonDisable(); - expect(is_ContinueButtonDisable).toBe(true); - await page.waitForTimeout(2000); - }) - - test('Test Skip security button is enable', async ({ page }) => { - await page.waitForTimeout(2000); - const isSkipSecurityEnable = await securityPage.is_skipSecurityButtonEnable(); - expect(isSkipSecurityEnable).toBe(true); - await page.waitForTimeout(2000); - }) - - - test('Test view yaml button', async ({ page }) => { - await page.waitForTimeout(7000); - securityPage.viewYaml() - await page.waitForTimeout(5000); - expect(securityPage.editor_title_element).toBeTruthy(); - securityPage.closeButton() - await page.waitForTimeout(2000); - }) - - test('Test view and submit button', async ({ page }) => { - await page.waitForTimeout(5000); - securityPage.click_viewAndSubmitJob() - await page.waitForTimeout(5000); - expect(securityPage.editor_title_element).toBeTruthy() - securityPage.closeButton() - await page.waitForTimeout(2000); - }) - - - test('Test view job', async ({ page }) => { - await page.waitForTimeout(5000); - securityPage.click_previewJob() - await page.waitForTimeout(5000); - expect(securityPage.editor_title_element).toBeTruthy() - securityPage.closeButton() - await page.waitForTimeout(5000); - }) - - test('Test save and close and Resume Progress', async ({ page }) => { - await page.waitForTimeout(5000); - securityPage.fillSecurityDetails('RACF', SECURITY_ADMIN, SECURITY_STC, SECURITY_SYSPROG, SECURITY_USER_ZIS, SECURITY_USER_ZOWE, SECURITY_AUX, SECURITY_STC_ZOWE, SECURITY_STC_ZIS) - await page.waitForTimeout(5000); - securityPage.click_saveAndClose() - await page.waitForTimeout(3000); - titlePage.clickOnResumeProgress(); - await page.waitForTimeout(15000); - const title = await securityPage.returnTitleOfSecurityPage(); - expect(title).toBe(SECURITY_TITLE); - const sysProg_value = await securityPage.get_sysProg_value(); - const admin_value = await securityPage.get_admin_value(); - const stc_value = await securityPage.get_stc_value(); - const userZowe_value = await securityPage.get_user_zowe_value(); - const userZis_value = await securityPage.get_user_zis_value(); - const aux_value = await securityPage.get_aux_value(); - const stcZis_value = await securityPage.get_stc_zis_value(); - const stcZowe_value = await securityPage.get_stc_zowe_value(); - expect(sysProg_value).toBe(process.env.SECURITY_SYSPROG); - expect(admin_value).toBe(process.env.SECURITY_ADMIN); - expect(stc_value).toBe(process.env.SECURITY_STC); - expect(userZowe_value).toBe(process.env.SECURITY_USER_ZOWE); - expect(userZis_value).toBe(process.env.SECURITY_USER_ZIS); - expect(stcZowe_value).toBe(process.env.SECURITY_STC_ZOWE); - expect(stcZis_value).toBe(process.env.SECURITY_STC_ZIS); - expect(aux_value).toBe(process.env.SECURITY_AUX); - }) + test('Test all required fields on security page', async ({ page }) => { + await expect(securityPage.product).toBeTruthy() + await expect(securityPage.admin).toBeTruthy() + await expect(securityPage.stc).toBeTruthy() + await expect(securityPage.sys_prog).toBeTruthy() + await expect(securityPage.user_zis).toBeTruthy() + await expect(securityPage.user_zowe).toBeTruthy() + await expect(securityPage.aux).toBeTruthy() + await expect(securityPage.stc_zowe).toBeTruthy() + await expect(securityPage.stc_zis).toBeTruthy() + await expect(securityPage.view_yaml).toBeTruthy() + await expect(securityPage.save_and_close).toBeTruthy() + await expect(securityPage.previous_step).toBeTruthy() + await expect(securityPage.skip_button).toBeTruthy() + await expect(securityPage.continue_CertificateSelector).toBeTruthy() + + }) + //needs to be done + test('test security with valid data', async ({ page }) => { + await securityPage.fillSecurityDetails('RACF', + config.SECURITY_ADMIN, + config.SECURITY_STC, + config.SECURITY_SYSPROG, + config.SECURITY_USER_ZIS, + config.SECURITY_USER_ZOWE, + config.SECURITY_AUX, + config.SECURITY_STC_ZOWE, + config.SECURITY_STC_ZIS + ) + await securityPage.initializeSecurity() + const is_ContinueButtonDisable = await securityPage.isContinueButtonDisable(); + expect(is_ContinueButtonDisable).toBe(false); + }) + + test('click Previous step button', async ({ page }) => { + const is_prevButtonEnable = await securityPage.isPreviousButtonEnable(); + expect(is_prevButtonEnable).toBe(true); + const title = await securityPage.returnTitleOfPrevPage(); + expect(title).toBe(APF_AUTH_TITLE); + }) + + + test('test click skip security button', async ({ page }) => { + const isSkipSecurityEnable = await securityPage.is_skipSecurityButtonEnable(); + expect(isSkipSecurityEnable).toBe(true); + await securityPage.click_skipSecurity(); + const title = await securityPage.returnTitleOfstcPage() + expect(title).toBe(STC_TITTLE); + }) + + + test('Test continue to certificate button is disable', async ({ page }) => { + const is_ContinueButtonDisable = await securityPage.isContinueButtonDisable(); + expect(is_ContinueButtonDisable).toBe(true); + }) + + test('Test view yaml button', async ({ page }) => { + await securityPage.viewYaml() + await expect(securityPage.editor_title_element).toBeTruthy(); + await securityPage.closeButton() + }) + + + + test('Test view job output', async ({ page }) => { + await securityPage.click_viewAndSubmitJob() + await expect(securityPage.editor_title_element).toBeTruthy() + await securityPage.closeButton() + }) + + test('Test save and close and Resume Progress', async ({ page }) => { + await securityPage.fillSecurityDetails('RACF', + config.SECURITY_ADMIN, + config.SECURITY_STC, + config.SECURITY_SYSPROG, + config.SECURITY_USER_ZIS, + config.SECURITY_USER_ZOWE, + config.SECURITY_AUX, + config.SECURITY_STC_ZOWE, + config.SECURITY_STC_ZIS + ) + await securityPage.click_saveAndClose() + await titlePage.clickOnResumeProgress(); + await connectionPage.fillConnectionDetails(config.SSH_HOST, config.SSH_PORT, config.SSH_USER, config.SSH_PASSWD); + await connectionPage.SubmitValidateCredential(); + const title = await securityPage.returnTitleOfSecurityPage(); + expect(title).toBe(SECURITY_TITLE); + const sysProg_value = await securityPage.get_sysProg_value(); + const admin_value = await securityPage.get_admin_value(); + const stc_value = await securityPage.get_stc_value(); + const userZowe_value = await securityPage.get_user_zowe_value(); + const userZis_value = await securityPage.get_user_zis_value(); + const aux_value = await securityPage.get_aux_value(); + const stcZis_value = await securityPage.get_stc_zis_value(); + const stcZowe_value = await securityPage.get_stc_zowe_value(); + expect(sysProg_value).toBe(process.env.SECURITY_SYSPROG); + expect(admin_value).toBe(process.env.SECURITY_ADMIN); + expect(stc_value).toBe(process.env.SECURITY_STC); + expect(userZowe_value).toBe(process.env.SECURITY_USER_ZOWE); + expect(userZis_value).toBe(process.env.SECURITY_USER_ZIS); + expect(stcZowe_value).toBe(process.env.SECURITY_STC_ZOWE); + expect(stcZis_value).toBe(process.env.SECURITY_STC_ZIS); + expect(aux_value).toBe(process.env.SECURITY_AUX); + }) }) \ No newline at end of file diff --git a/playwright_test/utils/config.ts b/playwright_test/utils/config.ts new file mode 100644 index 00000000..2acdca11 --- /dev/null +++ b/playwright_test/utils/config.ts @@ -0,0 +1,72 @@ +interface Config { + SSH_HOST: string | undefined; + SSH_PASSWD: string | undefined; + SSH_PORT: string | undefined; + SSH_USER: string | undefined; + ZOWE_EXTENSION_DIR: string | undefined; + ZOWE_LOG_DIR: string | undefined; + ZOWE_ROOT_DIR: string | undefined; + ZOWE_WORKSPACE_DIR: string | undefined; + JOB_NAME: string | undefined; + JOB_PREFIX: string | undefined; + JAVA_HOME: string | undefined; + NODE_HOME: string | undefined; + ZOSMF_HOST: string | undefined; + ZOSMF_PORT: string | undefined; + ZOSMF_APP_ID: string | undefined; + DATASET_PREFIX: string | undefined; + AUTH_LOAD_LIB: string | undefined; + AUTH_PLUGIN_LIB: string | undefined; + PROC_LIB: string | undefined; + PARM_LIB: string | undefined; + JCL_LIB: string | undefined; + LOAD_LIB: string | undefined; + DOMAIN_NAME: string | undefined; + SECURITY_ADMIN: string | undefined; + EXTERNAL_PORT: number | undefined; + SECURITY_STC: string | undefined; + SECURITY_SYSPROG: string | undefined; + SECURITY_USER_ZIS: string | undefined; + SECURITY_USER_ZOWE: string | undefined; + SECURITY_AUX: string | undefined; + SECURITY_STC_ZOWE: string | undefined; + SECURITY_STC_ZIS: string | undefined; + +} + +const config: Config = { + SSH_HOST: process.env.SSH_HOST, + SSH_PASSWD: process.env.SSH_PASSWD, + SSH_PORT: process.env.SSH_PORT, + SSH_USER: process.env.SSH_USER, + ZOWE_EXTENSION_DIR: process.env.ZOWE_EXTENSION_DIR, + ZOWE_LOG_DIR: process.env.ZOWE_LOG_DIR, + ZOWE_ROOT_DIR: process.env.ZOWE_ROOT_DIR, + ZOWE_WORKSPACE_DIR: process.env.ZOWE_WORKSPACE_DIR, + JOB_NAME: process.env.JOB_NAME, + JOB_PREFIX: process.env.JOB_PREFIX, + JAVA_HOME: process.env.JAVA_HOME, + NODE_HOME: process.env.NODE_HOME, + ZOSMF_HOST: process.env.ZOSMF_HOST, + ZOSMF_PORT: process.env.ZOSMF_PORT, + ZOSMF_APP_ID: process.env.ZOSMF_APP_ID, + DATASET_PREFIX: process.env.DATASET_PREFIX, + AUTH_LOAD_LIB: process.env.AUTH_LOAD_LIB, + AUTH_PLUGIN_LIB: process.env.AUTH_PLUGIN_LIB, + PROC_LIB: process.env.PROC_LIB, + PARM_LIB: process.env.PARM_LIB, + JCL_LIB: process.env.JCL_LIB, + LOAD_LIB: process.env.LOAD_LIB, + EXTERNAL_PORT: process.env.EXTERNAL_PORT, + SECURITY_ADMIN: process.env.SECURITY_ADMIN, + SECURITY_STC: process.env.SECURITY_STC, + SECURITY_SYSPROG: process.env.SECURITY_SYSPROG, + SECURITY_USER_ZIS: process.env.SECURITY_USER_ZIS, + SECURITY_USER_ZOWE: process.env.SECURITY_USER_ZOWE, + SECURITY_AUX: process.env.SECURITY_AUX, + SECURITY_STC_ZOWE: process.env.SECURITY_STC_ZOWE, + SECURITY_STC_ZIS: process.env.SECURITY_STC_ZIS, + DOMAIN_NAME: process.env.DOMAIN_NAME +}; + +export default config; diff --git a/src/actions/ConnectionActions.ts b/src/actions/ConnectionActions.ts index 8b6b601d..b5dfcf1b 100644 --- a/src/actions/ConnectionActions.ts +++ b/src/actions/ConnectionActions.ts @@ -17,14 +17,14 @@ export class ConnectionActions { constructor() { this.mode = 'ftp'; // REVIEW: get from storage when picking strategy? - this.strategy = this.getStartegy(); + this.strategy = this.getStrategy(); } setMode(mode: IIpcConnectionArgs["connectionType"]) { this.mode = mode; } - getStartegy(): FTPConnection | CLIConnection { + getStrategy(): FTPConnection | CLIConnection { switch (this.mode) { case 'ftp': return new FTPConnection(); diff --git a/src/actions/ConnectionHandler.ts b/src/actions/ConnectionHandler.ts index 54eecb9c..87ef6f79 100644 --- a/src/actions/ConnectionHandler.ts +++ b/src/actions/ConnectionHandler.ts @@ -9,7 +9,7 @@ */ import { ConnectionStore } from "../storage/ConnectionStore"; -import { connectFTPServer } from "../services/utils"; +import { connectFTPServer } from "../services/ServiceUtils"; import { IIpcConnectionArgs, IResponse } from '../types/interfaces'; class Connection { @@ -36,6 +36,7 @@ export class FTPConnection extends Connection { response.details = e.message; } } + config.password = ""; if (response.status) { this.saveConnectionData(config); } @@ -44,10 +45,12 @@ export class FTPConnection extends Connection { saveConnectionData(args: IIpcConnectionArgs): IResponse { const details = Object.keys(args).reduce((acc: string, k: keyof IIpcConnectionArgs) => { - - const value = (typeof args[k] == 'number') ? args[k].toString() : args[k]; - const status = ConnectionStore.set(`ftp-details.${k}`, value); - return acc + status ? '' : `\n Can't set ftp-details.${k}, check the store schema`; + if(k != "password"){ + const value = (typeof args[k] == 'number') ? args[k].toString() : args[k]; + const status = ConnectionStore.set(`ftp-details.${k}`, value); + return acc + status ? '' : `\n Can't set ftp-details.${k}, check the store schema`; + } + return; }, ""); return {status: true, details} } diff --git a/src/actions/HomeActions.ts b/src/actions/HomeActions.ts index 5d85d9b3..da062642 100644 --- a/src/actions/HomeActions.ts +++ b/src/actions/HomeActions.ts @@ -26,7 +26,8 @@ export class HomeActions { const status = ConnectionStore.set('zowe-cli-version', stdout); return {status, details: stdout}; } catch (err) { - console.info('Failed to detect Zowe CLI version', err); + // "No Zowe CLI found on local machine" printed upstream + // console.info('Failed to detect Zowe CLI version', err); return {status: false, details: ''}; } } diff --git a/src/actions/InstallActions.ts b/src/actions/InstallActions.ts index 9e139714..f52c5094 100644 --- a/src/actions/InstallActions.ts +++ b/src/actions/InstallActions.ts @@ -18,14 +18,14 @@ export class InstallActions { constructor() { this.mode = 'ftp'; // REVIEW: get from storage when picking strategy? - this.strategy = this.getStartegy(); + this.strategy = this.getStrategy(); } setMode(mode: IIpcConnectionArgs["connectionType"]) { this.mode = mode; } - getStartegy(): FTPInstallation | CLIInstallation { + getStrategy(): FTPInstallation | CLIInstallation { switch (this.mode) { case 'ftp': return new FTPInstallation(); @@ -37,30 +37,49 @@ export class InstallActions { } runInitCertificates(connectionArgs: IIpcConnectionArgs, - installationArgs: {installationDir: string, installationType: string}, zoweConfig: any){ - return this.strategy.initCertificates(connectionArgs, installationArgs, zoweConfig) + installationArgs: InstallationArgs){ + return this.strategy.initCertificates(connectionArgs, installationArgs) + } + + downloadUnpax(connectionArgs: IIpcConnectionArgs, + installationArgs: InstallationArgs, + version: string): Promise { + return this.strategy.downloadUnpax(connectionArgs, installationArgs, version); } runInstallation ( connectionArgs: IIpcConnectionArgs, - installationArgs: InstallationArgs, - version: string, zoweConfig: any, skipDownload: boolean): Promise { - return this.strategy.runInstallation(connectionArgs, installationArgs, version, zoweConfig, skipDownload); + installationArgs: InstallationArgs): Promise { + return this.strategy.runInstallation(connectionArgs, installationArgs); + } + + runInitSecurity(connectionArgs: IIpcConnectionArgs, + installationArgs: InstallationArgs): Promise { + return this.strategy.runInitSecurity(connectionArgs, installationArgs); + } + + uploadLatestYaml(connectionArgs: IIpcConnectionArgs, + installationArgs: InstallationArgs): Promise { + return this.strategy.uploadLatestYaml(connectionArgs, installationArgs); + } + + smpeGetExampleYamlAndSchemas(connectionArgs: IIpcConnectionArgs, installArgs: InstallationArgs): Promise { + return this.strategy.getExampleYamlAndSchemas(connectionArgs, installArgs); } - initSecurity(connectionArgs: IIpcConnectionArgs, - installationArgs: {installationDir: string, installationType: string}, zoweConfig: object): Promise { - return this.strategy.initSecurity(connectionArgs, installationArgs, zoweConfig); + initStcs(connectionArgs: IIpcConnectionArgs, + installationArgs: InstallationArgs): Promise { + return this.strategy.initStcs(connectionArgs, installationArgs); } initVsam(connectionArgs: IIpcConnectionArgs, - installationArgs: {installationDir: string, installationType: string}, zoweConfig: object): Promise { - return this.strategy.initVsam(connectionArgs, installationArgs, zoweConfig); + installationArgs: InstallationArgs): Promise { + return this.strategy.initVsam(connectionArgs, installationArgs); } - apfAuth(connectionArgs: IIpcConnectionArgs, - installationArgs: {installationDir: string, installationType: string}, zoweConfig: object): Promise { - return this.strategy.apfAuth(connectionArgs, installationArgs, zoweConfig); + runApfAuth(connectionArgs: IIpcConnectionArgs, + installationArgs: InstallationArgs): Promise { + return this.strategy.runApfAuth(connectionArgs, installationArgs); } } \ No newline at end of file diff --git a/src/actions/InstallationHandler.ts b/src/actions/InstallationHandler.ts index 32b58f7e..048672aa 100644 --- a/src/actions/InstallationHandler.ts +++ b/src/actions/InstallationHandler.ts @@ -18,19 +18,18 @@ import { ProgressStore } from "../storage/ProgressStore"; import * as fs from 'fs'; import { ConfigurationStore } from '../storage/ConfigurationStore'; import { InstallationArgs } from '../types/stateInterfaces'; +import { FALLBACK_SCHEMA, deepMerge } from '../renderer/components/common/Utils'; +import { updateSchemaReferences } from '../services/ResolveRef'; class Installation { - public async runInstallation ( + public async uploadLatestYaml ( connectionArgs: IIpcConnectionArgs, installationArgs: InstallationArgs, - version: string, - zoweConfig: any, - skipDownload: boolean ): Promise { - const currentConfig: any = ConfigurationStore.getConfig(); - const SMPE_INSTALL: boolean = installationArgs.installationType === "smpe"; - const savingResult = await this.generateYamlFile(zoweConfig); + let currentConfig: any = ConfigurationStore.getConfig(); + if(currentConfig.installationArgs) delete currentConfig.installationArgs; + const savingResult = await this.generateYamlFile(currentConfig); if (!savingResult.status) { console.log("failed to save yaml"); return savingResult; @@ -38,61 +37,213 @@ class Installation { try { console.log("uploading yaml..."); - const uploadYaml = await this.uploadYaml(connectionArgs, installationArgs.installationDir); - ProgressStore.set('installation.uploadYaml', uploadYaml.status); + const uploadYaml = await this.uploadYaml(connectionArgs,installationArgs.installationDir); + ProgressStore.set('downloadUnpax.uploadYaml', uploadYaml.status); if(!uploadYaml.status){ return {status: false, details: `Error uploading yaml configuration: ${uploadYaml.details}`}; } + return {status: true, details: "Successfully uploaded yaml config"}; + } catch (error) { + return {status: false, details: error.message}; + } + } - let download, upload, unpax; - if(!skipDownload){ - if(installationArgs.installationType === "download"){ - console.log("downloading...", version); - download = await this.downloadPax(version); - ProgressStore.set('installation.download', download.status); - } else { - //if the user has selected an SMPE or opted to upload their own pax, we simply set this status to true as no download is required - download = {status: true, details: ''} - ProgressStore.set('installation.download', true); + // Mutates yamlObj from source installationArgs + mergeYamlAndInstallationArgs = function(yamlObj: any, installationArgs: InstallationArgs){ + if (installationArgs.installationDir) { + yamlObj.zowe.runtimeDirectory = installationArgs.installationDir; + } + if (installationArgs.workspaceDir) { + yamlObj.zowe.workspaceDirectory = installationArgs.workspaceDir; + } + if (installationArgs.logDir) { + yamlObj.zowe.logDirectory = installationArgs.logDir; + } + if (installationArgs.extensionDir) { + yamlObj.zowe.extensionDirectory = installationArgs.extensionDir; + } + if (installationArgs.rbacProfile) { + yamlObj.zowe.rbacProfileIdentifier = installationArgs.rbacProfile; + } + if (installationArgs.jobName) { + if(yamlObj.zowe.job == undefined){ + yamlObj.zowe.job = { + name: "", + prefix: "" } + } + yamlObj.zowe.job.name = installationArgs.jobName; + } + if (installationArgs.jobPrefix) { + yamlObj.zowe.job.prefix = installationArgs.jobPrefix; + } + if (installationArgs.cookieId) { + yamlObj.zowe.cookieIdentifier = installationArgs.cookieId; + } + if (installationArgs.javaHome) { + if(yamlObj.java == undefined){ + yamlObj.java = {home: ""} + } + yamlObj.java.home = installationArgs.javaHome; + } + if (installationArgs.nodeHome) { + if(yamlObj.node == undefined){ + yamlObj.node = {home: ""} + } + yamlObj.node.home = installationArgs.nodeHome; + } + if (installationArgs.zosmfHost) { + if(yamlObj.zOSMF == undefined){ + yamlObj.zOSMF = {host: "", port: "443", applId: ""} + } + yamlObj.zOSMF.host = installationArgs.zosmfHost; + } + if (installationArgs.zosmfPort) { + yamlObj.zOSMF.port = installationArgs.zosmfPort; + } + if (installationArgs.zosmfApplId) { + yamlObj.zOSMF.applId = installationArgs.zosmfApplId; + } + } - if(!download.status){ - return {status: false, details: `Error downloading pax: ${download.details}`}; - } + public async getExampleYamlAndSchemas ( + connectionArgs: IIpcConnectionArgs, + installationArgs: InstallationArgs, + ): Promise { + try{ + ProgressStore.set('downloadUnpax.getSchemas', false); + ProgressStore.set('downloadUnpax.getExampleYaml', false); + + const currentConfig: any = ConfigurationStore.getConfig(); + let yamlObj + const zoweRuntimePath = installationArgs.installationDir; + let readPaxYamlAndSchema = await this.readExampleYamlAndSchema(connectionArgs, zoweRuntimePath); + let parsedSchema = false, parsedYaml = false; - console.log("uploading..."); - if(installationArgs.installationType === "upload"){ - //upload the PAX the user selected in the "Install Type" stage to the installation dir (from the planning stage) - console.log('Uploading user selected pax') - upload = await new FileTransfer().upload(connectionArgs, installationArgs.userUploadedPaxPath, path.join(installationArgs.installationDir, "zowe.pax"), DataType.BINARY) - } else if (installationArgs.installationType === "download"){ - console.log('Uploading pax downloaded from jfrog') - upload = await this.uploadPax(connectionArgs, installationArgs.installationDir); + const manifestFileFromPax = readPaxYamlAndSchema?.details?.schemas?.manifestFile; + let manifestFile; + + if(manifestFileFromPax) { + try { + manifestFile = JSON.parse(manifestFileFromPax); + } catch (error) { + console.error('Error parsing manifest file:', error); + } + } + if(readPaxYamlAndSchema.details.yaml){ + const yamlFromPax = readPaxYamlAndSchema.details.yaml; + if(yamlFromPax){ + try { + yamlObj = parse(yamlFromPax); + if (currentConfig) { + yamlObj = deepMerge(yamlObj, currentConfig); + } + this.mergeYamlAndInstallationArgs(yamlObj, installationArgs); + ConfigurationStore.setConfig(yamlObj); + ProgressStore.set('downloadUnpax.getExampleYaml', true); + parsedYaml = true; + } catch(e) { + console.log('error parsing example-zowe.yaml:', e); + ProgressStore.set('downloadUnpax.getExampleYaml', false); + return {status: false, details: {message: e.message}} + } + } else { + console.log("no yaml found from pax"); + ProgressStore.set('downloadUnpax.getExampleYaml', false); + return {status: false, details: {message: "no yaml found from pax"}} } - ProgressStore.set('installation.upload', upload.status); - if(!upload.status){ - return {status: false, details: `Error uploading pax: ${upload.details}`}; + //No reason not to always set schema to latest if user is re-running installation + if(readPaxYamlAndSchema.details.schemas.yamlSchema){ + try { + let yamlSchema = JSON.parse(readPaxYamlAndSchema.details.schemas.yamlSchema); + updateSchemaReferences(readPaxYamlAndSchema.details.schemas, yamlSchema); + if(yamlSchema){ + ConfigurationStore.setSchema(yamlSchema); + parsedSchema = true; + ProgressStore.set('downloadUnpax.getSchemas', true); + } + } catch (e) { + console.log('error setting schema from pax:', e); + ProgressStore.set('downloadUnpax.getSchemas', false); + ConfigurationStore.setSchema(FALLBACK_SCHEMA); + return {status: false, details: {message: e.message}} + } + } else { + console.log('no schema found from pax'); + ProgressStore.set('downloadUnpax.getSchemas', false); + ConfigurationStore.setSchema(FALLBACK_SCHEMA); + return {status: false, details: {message: 'no schemas found from pax'}} } + return {status: parsedSchema && parsedYaml, details: {message: "Successfully retrieved example-zowe.yaml and schemas", mergedYaml: yamlObj, manifestFile}} + } + } catch (e) { + ConfigurationStore.setSchema(FALLBACK_SCHEMA); + return {status: false, details: e.message}; + } - console.log("unpaxing..."); - unpax = await this.unpax(connectionArgs, installationArgs.installationDir); - ProgressStore.set('installation.unpax', unpax.status); + } - if(!unpax.status){ - return {status: false, details: `Error unpaxing Zowe archive: ${unpax.details}`}; - } + public async downloadUnpax ( + connectionArgs: IIpcConnectionArgs, + installationArgs: InstallationArgs, + version: string, + ): Promise { + + // Initialize Progress Store For unpaxing + ProgressStore.set('downloadUnpax.uploadYaml', false); + ProgressStore.set('downloadUnpax.download', false); + ProgressStore.set('downloadUnpax.upload', false); + ProgressStore.set('downloadUnpax.unpax', false); + ProgressStore.set('downloadUnpax.getExampleYaml', false); + ProgressStore.set('downloadUnpax.getSchemas', false); + + + let currentConfig: any = ConfigurationStore.getConfig(); + if(currentConfig.installationArgs) delete currentConfig.installationArgs; + const SMPE_INSTALL: boolean = installationArgs.installationType === "smpe"; + const savingResult = await this.generateYamlFile(currentConfig); + if (!savingResult.status) { + console.log("failed to save yaml"); + return savingResult; + } + + try { + console.log("uploading yaml..."); + const uploadYaml = await this.uploadYaml(connectionArgs, installationArgs.installationDir); + ProgressStore.set('downloadUnpax.uploadYaml', uploadYaml.status); + + if(!uploadYaml.status){ + return {status: false, details: `Error uploading yaml configuration: ${uploadYaml.details}`}; + } + + let download, upload, unpax; + if(installationArgs.installationType === "download"){ + console.log("downloading...", version); + download = await this.downloadPax(version); + ProgressStore.set('downloadUnpax.download', download.status); } else { //if the user has selected an SMPE or opted to upload their own pax, we simply set this status to true as no download is required - unpax = upload = download = {status: true, details: ''} - ProgressStore.set('installation.download', true); + download = {status: true, details: ''} + ProgressStore.set('downloadUnpax.download', true); } if(!download.status){ return {status: false, details: `Error downloading pax: ${download.details}`}; } + console.log("uploading..."); + if(installationArgs.installationType === "upload"){ + //upload the PAX the user selected in the "Install Type" stage to the installation dir (from the planning stage) + console.log('Uploading user selected pax from ', installationArgs.userUploadedPaxPath) + upload = await new FileTransfer().upload(connectionArgs, installationArgs.userUploadedPaxPath, path.join(installationArgs.installationDir, "zowe.pax"), DataType.BINARY) + } else if (installationArgs.installationType === "download"){ + console.log('Uploading pax downloaded from jfrog') + upload = await this.uploadPax(connectionArgs, installationArgs.installationDir); + } + ProgressStore.set('downloadUnpax.upload', upload.status); + if(!upload.status){ return {status: false, details: `Error uploading pax: ${upload.details}`}; } @@ -100,125 +251,64 @@ class Installation { if (!SMPE_INSTALL) { console.log("unpaxing..."); unpax = await this.unpax(connectionArgs, installationArgs.installationDir); - ProgressStore.set('installation.unpax', unpax.status); + ProgressStore.set('downloadUnpax.unpax', unpax.status); if (!unpax.status) { return {status: false, details: `Error unpaxing Zowe archive: ${unpax.details}`}; } } - let yamlObj - let zoweRuntimePath = installationArgs.installationType === "smpe" ? installationArgs.installationDir : installationArgs.installationDir + "/runtime"; - let readPaxYamlAndSchema = await this.readExampleYamlAndSchema(connectionArgs, zoweRuntimePath); - if(readPaxYamlAndSchema.details.yaml){ - const parseExampleYamlFromPax = function(catPath: string){ - const jobOutputSplit = JSON.stringify(readPaxYamlAndSchema.details.yaml).split(`cat ${catPath}\\r\\n`) - if(jobOutputSplit[1]){ - const trimmedYamlSchema = jobOutputSplit[1].split(`+ echo 'Script finished.'`)[0].split(`Script finished.`); - // console.log("\n\n *** trimmedYamlSchema[0]: ", trimmedYamlSchema[0].replaceAll(`\\r\\n`, `\r\n`).replaceAll(`\\"`, `"`)); - return trimmedYamlSchema[0].replaceAll(`\\r\\n`, `\r\n`).replaceAll(`\\"`, `"`); - } - return ""; - } - const yamlFromPax = parseExampleYamlFromPax(`${zoweRuntimePath}/example-zowe.yaml`); - if(yamlFromPax){ - try { - yamlObj = parse(yamlFromPax); - if (currentConfig) { - console.log("current config:", JSON.stringify(currentConfig)); - // console.log("yamlObj: ", JSON.stringify(yamlObj)); - yamlObj = {...currentConfig, ...yamlObj} - console.log("merged yamlObj: ", JSON.stringify(yamlObj)); - } - if (yamlObj.zowe.runtimeDirectory === undefined && installationArgs.installationDir) { - yamlObj.zowe.runtimeDirectory = installationArgs.installationDir; - } - if (yamlObj.zowe.workspaceDirectory === undefined && installationArgs.workspaceDir) { - yamlObj.zowe.workspaceDirectory = installationArgs.workspaceDir; - } - if (yamlObj.zowe.logDirectory === undefined && installationArgs.logDir) { - yamlObj.zowe.logDirectory = installationArgs.logDir; - } - if (yamlObj.zowe.extensionDirectory === undefined && installationArgs.extensionDir) { - yamlObj.zowe.extensionDirectory = installationArgs.extensionDir; - } - if (yamlObj.zowe.rbacProfileIdentifier === undefined && installationArgs.rbacProfile) { - yamlObj.zowe.rbacProfileIdentifier = installationArgs.rbacProfile; - } - if (yamlObj.zowe.job.name === undefined && installationArgs.jobName) { - yamlObj.zowe.job.name = installationArgs.jobName; - } - if (yamlObj.zowe.job.prefix === undefined && installationArgs.jobPrefix) { - yamlObj.zowe.job.prefix = installationArgs.jobPrefix; - } - if (yamlObj.zowe.cookieIdentifier === undefined && installationArgs.cookieId) { - yamlObj.zowe.cookieIdentifier = installationArgs.cookieId; - } - if (yamlObj.java.home === undefined && installationArgs.javaHome) { - yamlObj.java.home = installationArgs.javaHome; - } - if (yamlObj.node.home === undefined && installationArgs.nodeHome) { - yamlObj.node.home = installationArgs.nodeHome; - } - if (yamlObj.zOSMF.host === undefined && installationArgs.zosmfHost) { - yamlObj.zOSMF.host = installationArgs.zosmfHost; - } - if (yamlObj.zOSMF.port === undefined && installationArgs.zosmfPort) { - yamlObj.zOSMF.port = installationArgs.zosmfPort; - } - if (yamlObj.zOSMF.applId === undefined && installationArgs.zosmfApplId) { - yamlObj.zOSMF.applId = installationArgs.zosmfApplId; - } - if (zoweConfig) { - yamlObj = {...yamlObj, ...zoweConfig}; - } - console.log('Setting merged yaml:', JSON.stringify(yamlObj)); - ConfigurationStore.setConfig(yamlObj); - } catch(e) { - console.log('error parsing example-zowe.yaml:', e); - } - } else { - console.log("no yaml found from pax"); + + let yamlObj = {}; + let manifestFile = {}; + + await this.getExampleYamlAndSchemas(connectionArgs, installationArgs).then((res: IResponse) => { + + if(!res?.status) { + return { status: false, details: { message: 'Failed to get YAML and schemas.' } }; } - //No reason not to always set schema to latest if user is re-running installation - if(readPaxYamlAndSchema.details.yamlSchema && readPaxYamlAndSchema.details.serverCommon){ - const parseSchemaFromPax = function(inputString: string, catPath: string){ - const jobOutputSplit = inputString.split(`cat ${catPath}\\r\\n`) - if(jobOutputSplit[1]){ - const trimmedYamlSchema = jobOutputSplit[1].split(`Script finished.`)[0].split(`Script finished.`); - return trimmedYamlSchema[0].replaceAll(`\\r\\n`, `\r\n`).replaceAll(`\\"`, `"`).replaceAll(`\\\\"`, `\\"`); - } - return ""; - } - try { - let yamlSchema = JSON.parse(parseSchemaFromPax(JSON.stringify(readPaxYamlAndSchema.details.yamlSchema), `${zoweRuntimePath}/schemas/zowe-yaml-schema.json`)); - const serverCommon = JSON.parse(parseSchemaFromPax(JSON.stringify(readPaxYamlAndSchema.details.serverCommon), `${zoweRuntimePath}/schemas/server-common.json`)); - // console.log('yaml schema:', parseSchemas(JSON.stringify(readPaxYamlAndSchema.details.yamlSchema), `${zoweRuntimePath}/schemas/zowe-yaml-schema.json`)); - // console.log('server common', parseSchemas(JSON.stringify(readPaxYamlAndSchema.details.serverCommon), `${zoweRuntimePath}/schemas/server-common.json`)); - if(yamlSchema && serverCommon){ - // FIXME: Link schema by $ref properly - https://jsonforms.io/docs/ref-resolving - // Without these, AJV does not properly find $refs in the schema and therefore validation cannot occur - yamlSchema.properties.zowe.properties.setup.properties.dataset.properties.parmlibMembers.properties.zis = serverCommon.$defs.datasetMember; - yamlSchema.properties.zowe.properties.setup.properties.certificate.properties.pkcs12.properties.directory = serverCommon.$defs.path; - yamlSchema.$id = serverCommon.$id; - if(yamlSchema.$defs?.networkSettings?.properties?.server?.properties?.listenAddresses?.items){ - delete yamlSchema.$defs?.networkSettings?.properties?.server?.properties?.listenAddresses?.items?.ref; - yamlSchema.$defs.networkSettings.properties.server.properties.listenAddresses.items = serverCommon.$defs.ipv4 - } - console.log('Setting schema from runtime dir:', JSON.stringify(yamlSchema)); - ConfigurationStore.setSchema(yamlSchema); - } - } catch (e) { - console.log('error setting schema from pax:', e); - } + manifestFile = res.details?.manifestFile; + + if(res.details?.mergedYaml != undefined){ + yamlObj = res.details.mergedYaml; } - + + }) + return {status: download.status && uploadYaml.status && upload.status && unpax.status, details: {message: 'Zowe unpax successful.', mergedYaml: yamlObj, manifestFile}}; + } catch (error) { + return {status: false, details: error.message}; + } + } + + public async runInstallation ( + connectionArgs: IIpcConnectionArgs, + installationArgs: InstallationArgs, + ): Promise { + // Initialize Progress Store For Dataset Installation + ProgressStore.set('installation.uploadYaml', false); + ProgressStore.set('installation.install', false); + ProgressStore.set('installation.initMVS', false); + let currentConfig: any = ConfigurationStore.getConfig(); + if(currentConfig.installationArgs) delete currentConfig.installationArgs; + const savingResult = await this.generateYamlFile(currentConfig); + if (!savingResult.status) { + console.log("failed to save yaml"); + return savingResult; + } + + try { + console.log("uploading yaml..."); + const uploadYaml = await this.uploadYaml(connectionArgs, installationArgs.installationDir); + ProgressStore.set('installation.uploadYaml', uploadYaml.status); + + if(!uploadYaml.status){ + return {status: false, details: `Error uploading yaml configuration: ${uploadYaml.details}`}; } let installation; if (installationArgs.installationType !== "smpe") { console.log("installing..."); - installation = await this.install(connectionArgs, installationArgs.installationDir); + installation = await this.install(connectionArgs, installationArgs); ProgressStore.set('installation.install', installation.status); } else { //If the user has opted to perform an SMPE installation, they must run 'zwe install' manually and therefore we set this to true @@ -233,7 +323,7 @@ class Installation { let initMvs; if(installation.status){ console.log("running zwe init mvs..."); - initMvs = await this.initMVS(connectionArgs, installationArgs.installationDir); + initMvs = await this.initMVS(connectionArgs, installationArgs); ProgressStore.set('installation.initMVS', initMvs.status); } else { initMvs = {status: false, details: `zwe install step failed, unable to run zwe init mvs.`} @@ -244,17 +334,22 @@ class Installation { return {status: false, details: `Error running zwe init mvs: ${initMvs.details}`}; } - return {status: download.status && uploadYaml.status && upload.status && unpax.status && installation.status && initMvs.status, details: {message: 'Zowe install successful.', mergedYaml: yamlObj}}; + return {status: installation.status && initMvs.status, details: {message: 'Zowe install successful.'}}; } catch (error) { return {status: false, details: error.message}; } } - public async apfAuth(connectionArgs: IIpcConnectionArgs, - installationArgs: {installationDir: string, installationType: string}, zoweConfig: object): Promise{ + public async runApfAuth(connectionArgs: IIpcConnectionArgs, + installationArgs: InstallationArgs): Promise{ + ProgressStore.set('apfAuth.writeYaml', false); + ProgressStore.set('apfAuth.uploadYaml', false); + ProgressStore.set('apfAuth.success', false); + let currentConfig: any = ConfigurationStore.getConfig(); + if(currentConfig.installationArgs) delete currentConfig.installationArgs; console.log('writing current yaml to disk'); const filePath = path.join(app.getPath('temp'), 'zowe.yaml') - await fs.writeFile(filePath, stringify(zoweConfig), (err) => { + await fs.writeFile(filePath, stringify(currentConfig), (err) => { if (err) { console.warn("Can't save configuration to zowe.yaml"); return ProgressStore.set('apfAuth.writeYaml', false); @@ -262,24 +357,30 @@ class Installation { }); ProgressStore.set('apfAuth.writeYaml', true); console.log("uploading yaml..."); - const uploadYaml = await this.uploadYaml(connectionArgs, installationArgs.installationDir); + const uploadYaml = await this.uploadYaml(connectionArgs,installationArgs.installationDir); if(!uploadYaml.status){ ProgressStore.set('apfAuth.uploadYaml', false); return {status: false, details: 'Failed to upload YAML file'} } ProgressStore.set('apfAuth.uploadYaml', uploadYaml.status); - const script = `cd ${installationArgs.installationType === "smpe" ? installationArgs.installationDir + '/bin' : installationArgs.installationDir + '/runtime/bin'};./zwe init apfauth -c ${installationArgs.installationDir}/zowe.yaml --allow-overwritten --update-config`; + console.log("Check out this install arg! " + installationArgs.installationDir); + const script = `cd ${installationArgs.installationDir}/bin;./zwe init apfauth -c ${installationArgs.installationDir}/zowe.yaml --allow-overwritten --update-config`; const result = await new Script().run(connectionArgs, script); ProgressStore.set('apfAuth.success', result.rc === 0); return {status: result.rc === 0, details: result.jobOutput} } - public async initSecurity(connectionArgs: IIpcConnectionArgs, - installationArgs: {installationDir: string, installationType: string}, zoweConfig: object): Promise{ + public async runInitSecurity(connectionArgs: IIpcConnectionArgs, + installationArgs: InstallationArgs): Promise{ + ProgressStore.set('initSecurity.writeYaml', false); + ProgressStore.set('initSecurity.uploadYaml', false); + ProgressStore.set('initSecurity.success', false); + let currentConfig: any = ConfigurationStore.getConfig(); + if(currentConfig.installationArgs) delete currentConfig.installationArgs; console.log('writing current yaml to disk'); const filePath = path.join(app.getPath('temp'), 'zowe.yaml') - await fs.writeFile(filePath, stringify(zoweConfig), (err) => { + await fs.writeFile(filePath, stringify(currentConfig), (err) => { if (err) { console.warn("Can't save configuration to zowe.yaml"); ProgressStore.set('initSecurity.writeYaml', false); @@ -293,16 +394,67 @@ class Installation { return {status: false, details: `Error uploading yaml configuration: ${uploadYaml.details}`}; } ProgressStore.set('initSecurity.uploadYaml', uploadYaml.status); - const script = `cd ${installationArgs.installationType === "smpe" ? installationArgs.installationDir + '/bin' : installationArgs.installationDir + '/runtime/bin'};./zwe init security -c ${installationArgs.installationDir}/zowe.yaml --allow-overwritten --update-config`; + console.log("Check out this install arg! " + installationArgs.installationDir); + const script = `cd ${installationArgs.installationDir}/bin;./zwe init security -c ${installationArgs.installationDir}/zowe.yaml --allow-overwritten --update-config`; const result = await new Script().run(connectionArgs, script); ProgressStore.set('initSecurity.success', result.rc === 0); return {status: result.rc === 0, details: result.jobOutput} } - async initCertificates(connectionArgs: IIpcConnectionArgs, installationArgs: {installationDir: string, installationType: string}, zoweConfig: any){ + public async initStcs(connectionArgs: IIpcConnectionArgs, + installationArgs: InstallationArgs): Promise{ + let currentConfig: any = ConfigurationStore.getConfig(); + if(currentConfig.installationArgs) delete currentConfig.installationArgs; + + // Initialize Progress Store For Stcs + ProgressStore.set('initStcs.writeYaml', false); + ProgressStore.set('initStcs.uploadYaml', false); + ProgressStore.set('initStcs.success', false); + + console.log('writing current yaml to disk'); + const filePath = path.join(app.getPath('temp'), 'zowe.yaml') + await fs.writeFile(filePath, stringify(currentConfig), (err) => { + if (err) { + console.warn("Can't save configuration to zowe.yaml"); + ProgressStore.set('initStcs.writeYaml', false); + return {status: false, details: `Can't save configuration to zowe.yaml`}; + } + }); + ProgressStore.set('initStcs.writeYaml', true); + console.log("uploading yaml..."); + const uploadYaml = await this.uploadYaml(connectionArgs, installationArgs.installationDir); + if(!uploadYaml.status){ + return {status: false, details: `Error uploading yaml configuration: ${uploadYaml.details}`}; + } + ProgressStore.set('initStcs.uploadYaml', uploadYaml.status); + const script = `cd ${installationArgs.installationDir + '/bin'};./zwe init stc -c ${installationArgs.installationDir}/zowe.yaml --allow-overwritten --update-config`; + const result = await new Script().run(connectionArgs, script); + let errorFound = false; + let errorMessage = ''; + const errorPattern = /Error ZWE.*/; + for (const key in result.jobOutput) { + const match = result.jobOutput[key].match(errorPattern); + if (match) { + errorFound = true; + errorMessage = match[0]; + break; + } + } + + ProgressStore.set('initStcs.success', result.rc === 0 && !errorFound); + return {status: result.rc === 0 && !errorFound, details: result.jobOutput, error: errorFound, errorMsg: errorMessage } + + } + + async initCertificates(connectionArgs: IIpcConnectionArgs, installationArgs: InstallationArgs){ + ProgressStore.set('certificate.writeYaml', false); + ProgressStore.set('certificate.uploadYaml', false);; + ProgressStore.set('certificate.zweInitCertificate', false); + let currentConfig: any = ConfigurationStore.getConfig(); + if(currentConfig.installationArgs) delete currentConfig.installationArgs console.log('writing current yaml to disk'); const filePath = path.join(app.getPath('temp'), 'zowe.yaml') - await fs.writeFile(filePath, stringify(zoweConfig), (err: any) => { + await fs.writeFile(filePath, stringify(currentConfig), (err: any) => { if (err) { console.warn("Can't save configuration to zowe.yaml"); return ProgressStore.set('certificate.writeYaml', false); @@ -315,15 +467,27 @@ class Installation { return ProgressStore.set('certificate.uploadYaml', false);; } ProgressStore.set('certificate.uploadYaml', uploadYaml.status); - const script = `cd ${installationArgs.installationType === "smpe" ? installationArgs.installationDir + '/bin' : installationArgs.installationDir + '/runtime/bin'} && ./zwe init certificate --update-config -c ${installationArgs.installationDir}/zowe.yaml`; + console.log("Check out this install arg! " + installationArgs.installationDir); + const script = `cd ${installationArgs.installationDir + '/bin'};./zwe init certificate --update-config -c ${installationArgs.installationDir}/zowe.yaml`; const result = await new Script().run(connectionArgs, script); ProgressStore.set('certificate.zweInitCertificate', result.rc === 0); - return {status: result.rc === 0, details: result.jobOutput} + const yamlPath = `${installationArgs.installationDir}/zowe.yaml`; + // const tagScript = `chtag -t -c ISO8859-1 ${yamlPath}`; + // const tagResult = await new Script().run(connectionArgs, tagScript); + const yaml = await new FileTransfer().download(connectionArgs, yamlPath, DataType.ASCII); + var parsedYaml; + try{ + parsedYaml = JSON.parse(JSON.stringify(parse(yaml))); + } catch (e){ + console.log('error parsing yaml:', e.message); + } + return {status: result.rc === 0, details: {jobOutput: result.jobOutput, updatedYaml: parsedYaml}} } public async initVsam(connectionArgs: IIpcConnectionArgs, - installationArgs: {installationDir: string, installationType: string}, zoweConfig: object): Promise{ - + installationArgs: InstallationArgs): Promise{ + let currentConfig: any = ConfigurationStore.getConfig(); + if(currentConfig.installationArgs) delete currentConfig.installationArgs; // Initialize Progress Store For Vsam ProgressStore.set('initVsam.writeYaml', false); ProgressStore.set('initVsam.uploadYaml', false); @@ -331,7 +495,7 @@ class Installation { console.log('writing current yaml to disk'); const filePath = path.join(app.getPath('temp'), 'zowe.yaml') - await fs.writeFile(filePath, stringify(zoweConfig), (err) => { + await fs.writeFile(filePath, stringify(currentConfig), (err) => { if (err) { console.warn("Can't save configuration to zowe.yaml"); ProgressStore.set('initVsam.writeYaml', false); @@ -345,7 +509,7 @@ class Installation { return {status: false, details: `Error uploading yaml configuration: ${uploadYaml.details}`}; } ProgressStore.set('initVsam.uploadYaml', uploadYaml.status); - const script = `cd ${installationArgs.installationType === "smpe" ? installationArgs.installationDir + '/bin' : installationArgs.installationDir + '/runtime/bin'};./zwe init vsam -c ${installationArgs.installationDir}/zowe.yaml --allow-overwritten --update-config`; + const script = `cd ${installationArgs.installationDir + '/bin'};./zwe init vsam -c ${installationArgs.installationDir}/zowe.yaml --allow-overwritten --update-config`; const result = await new Script().run(connectionArgs, script); let errorFound = false; @@ -391,11 +555,11 @@ class Installation { return {status: false, details: 'Method not implemented.'} } - async install(connectionArgs: IIpcConnectionArgs, installDir: string): Promise { + async install(connectionArgs: IIpcConnectionArgs, installationArgs: InstallationArgs): Promise { return {status: false, details: 'Method not implemented.'} } - async initMVS(connectionArgs: IIpcConnectionArgs, installDir: string): Promise { + async initMVS(connectionArgs: IIpcConnectionArgs, installationArgs: InstallationArgs): Promise { return {status: false, details: 'Method not implemented.'} } @@ -412,7 +576,8 @@ export class FTPInstallation extends Installation { const filePath = path.join(installDir, "zowe.yaml"); console.log(`Uploading ${tempPath} to ${filePath}`) await new FileTransfer().upload(connectionArgs, tempPath, filePath, DataType.BINARY) - const script = `chtag -t -c ISO8859-1 ${installDir}/zowe.yaml`; + // console.log("Check out this install arg! " + installDir); + const script = `cd ${installDir}; cat zowe.yaml | grep 'zowe' > /dev/null; if [ $? -eq 0 ]; then if [ $(chtag -p zowe.yaml | cut -f 2 -d" ") != "untagged" ]; then iconv -f iso8859-1 -t 1047 zowe.yaml > zowe.yaml.1047; mv zowe.yaml.1047 zowe.yaml; chtag -tc 1047 zowe.yaml; fi; else iconv -f iso8859-1 -t 1047 zowe.yaml > zowe.yaml.1047; mv zowe.yaml.1047 zowe.yaml; chtag -tc 1047 zowe.yaml; fi`; const result = await new Script().run(connectionArgs, script); return {status: result.rc === 0, details: result.jobOutput} } @@ -443,31 +608,38 @@ export class FTPInstallation extends Installation { // TODO: Is this necessary adding "/runtime" ? User already specifies /runtime directory - removes 8 chars from max limit. See Planning.tsx async unpax(connectionArgs: IIpcConnectionArgs, installDir: string) { - const script = `mkdir ${installDir}/runtime;cd ${installDir}/runtime;pax -ppx -rf ../zowe.pax;rm ../zowe.pax`; + const script = `mkdir ${installDir};cd ${installDir} && pax -ppx -rf ./zowe.pax;rm -rf ./zowe.pax`; const result = await new Script().run(connectionArgs, script); return {status: result.rc === 0, details: result.jobOutput} } - async install(connectionArgs: IIpcConnectionArgs, installDir: string) { - const script = `cd ${installDir}/runtime/bin;./zwe install -c ${installDir}/zowe.yaml --allow-overwritten`; + async install(connectionArgs: IIpcConnectionArgs, installationArgs: InstallationArgs) { + const script = `cd ${installationArgs.installationDir + '/bin' }; ./zwe install -c ${installationArgs.installationDir}/zowe.yaml --allow-overwritten`; const result = await new Script().run(connectionArgs, script); return {status: result.rc === 0, details: result.jobOutput} } - async initMVS(connectionArgs: IIpcConnectionArgs, installDir: string) { - const script = `cd ${installDir}/runtime/bin;./zwe init mvs -c ${installDir}/zowe.yaml --allow-overwritten`; + async initMVS(connectionArgs: IIpcConnectionArgs, installationArgs: InstallationArgs) { + const script = `cd ${installationArgs.installationDir + '/bin' }; ./zwe init mvs -c ${installationArgs.installationDir}/zowe.yaml --allow-overwritten`; const result = await new Script().run(connectionArgs, script); return {status: result.rc === 0, details: result.jobOutput} } async readExampleYamlAndSchema(connectionArgs: IIpcConnectionArgs, installDir: string){ - const catYaml = `cat ${installDir}/example-zowe.yaml`; - const yamlResult = await new Script().run(connectionArgs, catYaml); - const catYamlSchema = `cat ${installDir}/schemas/zowe-yaml-schema.json`; - const yamlSchemaResult = await new Script().run(connectionArgs, catYamlSchema); - const catCommonSchema = `cat ${installDir}/schemas/server-common.json`; - const commonSchemaResult = await new Script().run(connectionArgs, catCommonSchema); - return {status: yamlResult.rc === 0 && yamlSchemaResult.rc == 0 && commonSchemaResult.rc == 0, details: {yaml: yamlResult.jobOutput, yamlSchema: yamlSchemaResult.jobOutput, serverCommon: commonSchemaResult.jobOutput}} + try { + const yamlPath = `${installDir}/example-zowe.yaml`; + const yaml = await new FileTransfer().download(connectionArgs, yamlPath, DataType.ASCII); + const yamlSchemaPath = `${installDir}/schemas/zowe-yaml-schema.json`; + const yamlSchema = await new FileTransfer().download(connectionArgs, yamlSchemaPath, DataType.ASCII); + const serverCommonPath = `${installDir}/schemas/server-common.json`; + const serverCommon = await new FileTransfer().download(connectionArgs, serverCommonPath, DataType.ASCII); + const manifestFilePath = `${installDir}/manifest.json`; + const manifestFile = await new FileTransfer().download(connectionArgs, manifestFilePath, DataType.ASCII); + return {status: true, details: {yaml, schemas: {yamlSchema, serverCommon, manifestFile}}}; + } catch (e) { + console.log("Error downloading example-zowe.yaml and schemas:", e.message); + return {status: false, details: {yaml: '', schemas: {yamlSchema: '', serverCommon: '', manifestFile: ''}}}; + } } async checkInstallData() { diff --git a/src/actions/PlanningActions.ts b/src/actions/PlanningActions.ts index 216919ea..e64a7fc1 100644 --- a/src/actions/PlanningActions.ts +++ b/src/actions/PlanningActions.ts @@ -16,7 +16,7 @@ import { IIpcConnectionArgs, IResponse } from '../types/interfaces'; import { ConfigurationStore } from "../storage/ConfigurationStore"; import { parse } from 'yaml'; import * as https from 'https'; -import { checkDirExists, makeDir } from '../services/utils' +import { checkDirExists, makeDir } from '../services/ServiceUtils' export class PlanningActions { @@ -132,8 +132,8 @@ export class PlanningActions { }); } -public static async setConfigByKey(key: string, value: string | Array): Promise { - const status = ConfigurationStore.setConfigByKey(key, value); + public static async setConfigByKeyAndValidate(key: string, value: string | Array): Promise { + const status = ConfigurationStore.setConfigByKeyAndValidate(key, value); return {status, details: ''}; } diff --git a/src/main/index.ts b/src/main/index.ts index 9c2a2533..5b45ce2f 100644 --- a/src/main/index.ts +++ b/src/main/index.ts @@ -16,8 +16,10 @@ import { InstallActions } from "../actions/InstallActions"; import { PlanningActions } from "../actions/PlanningActions"; import { IIpcConnectionArgs } from '../types/interfaces'; import { ProgressStore } from "../storage/ProgressStore"; -import { checkDirExists } from '../services/utils'; +import { checkDirExists } from '../services/ServiceUtils'; import { ConfigurationStore } from '../storage/ConfigurationStore'; +import { EditorStore } from '../storage/EditorStore'; +import { log, warn, error, info } from 'electron-log/main'; declare const MAIN_WINDOW_WEBPACK_ENTRY: string; declare const MAIN_WINDOW_PRELOAD_WEBPACK_ENTRY: string; @@ -25,6 +27,11 @@ declare const MAIN_WINDOW_PRELOAD_WEBPACK_ENTRY: string; const connectionActions = new ConnectionActions(); const installActions = new InstallActions(); +console.log = log; +console.warn = warn; +console.error = error; +console.info = info; + // REVIEW: electron-squirrel-startup, review the necessity of it, package will have an operation viloation as it is 7 years old. // if (require('electron-squirrel-startup')) { // ? // app.quit(); @@ -34,7 +41,7 @@ const installActions = new InstallActions(); // TODO: Add inline help for inputs, components, etc // TODO: Make separate component for validation button - button / icon / error details // REVIEW: services/FileTransfer.ts SubmitJcl.ts CheckHLQ.ts -// REVIEW: merge all services to utils.ts file? +// REVIEW: merge all services to ServiceUtils.ts file? const createWindow = (): void => { @@ -101,7 +108,6 @@ const createWindow = (): void => { return res; }); - ipcMain.handle('get-schema', async (event, schema: any) => { const res: any = await ConfigurationStore.getSchema(); return {status: true, details: res}; @@ -114,7 +120,37 @@ const createWindow = (): void => { }); ipcMain.handle('set-config-by-key', async (_event, key: string, value) => { - const res = await ConfigurationStore.setConfigByKey(key, value); + const res = await PlanningActions.setConfigByKeyAndValidate(key, value); + return res; + }); + + ipcMain.handle('get-jcl-output', async (event) => { + const res: any = await EditorStore.getJCLOutput(); + return res; + }); + + ipcMain.handle('set-jcl-output', async (event, value) => { + const res: any = await EditorStore.setJCLOutput(value); + return res; + }); + + ipcMain.handle('get-standard-output', async (event) => { + const res: any = await EditorStore.getStandardOutput(); + return res; + }); + + ipcMain.handle('set-standard-output', async (event, value) => { + const res: any = await EditorStore.setStandardOutput(value); + return res; + }); + + ipcMain.handle('get-yaml-output', async (event) => { + const res: any = await EditorStore.getYAMLOutput(); + return res; + }); + + ipcMain.handle('set-yaml-output', async (event, value) => { + const res: any = await EditorStore.setYAMLOutput(value); return res; }); @@ -158,18 +194,28 @@ const createWindow = (): void => { return res; }) - ipcMain.handle('install-mvs', async (event, connectionArgs, installationArgs, version, zoweConfig, skipDownload) => { - const res = await installActions.runInstallation(connectionArgs, installationArgs, version, zoweConfig, skipDownload); + ipcMain.handle('install-mvs', async (event, connectionArgs, installationArgs) => { + const res = await installActions.runInstallation(connectionArgs, installationArgs); + return res; + }); + + ipcMain.handle('download-unpax', async (event, connectionArgs, installationArgs, version) => { + const res = await installActions.downloadUnpax(connectionArgs, installationArgs, version); + return res; + }); + + ipcMain.handle('get-yaml-schema', async (event, connectionArgs, installationArgs) => { + const res = await installActions.smpeGetExampleYamlAndSchemas(connectionArgs, installationArgs); return res; }); - ipcMain.handle('init-certificates', async (event, connectionArgs, installationArgs, zoweConfig) => { - const res = await installActions.runInitCertificates(connectionArgs, installationArgs, zoweConfig); + ipcMain.handle('init-certificates', async (event, connectionArgs, installationArgs) => { + const res = await installActions.runInitCertificates(connectionArgs, installationArgs); return res; }); - ipcMain.handle('init-apf', async (_event, connectionArgs, installationArgs, zoweConfig) => { - const res = await installActions.apfAuth(connectionArgs, installationArgs, zoweConfig); + ipcMain.handle('init-apf', async (_event, connectionArgs, installationArgs) => { + const res = await installActions.runApfAuth(connectionArgs, installationArgs); return res; }); @@ -185,18 +231,33 @@ const createWindow = (): void => { return res; }); + ipcMain.handle('get-download-unpax-progress', async () => { + const res = ProgressStore.getAll()['downloadUnpax']; + return res; + }); + ipcMain.handle('get-certificate-progress', async (event) => { const res = ProgressStore.getAll()['certificate']; return res; }); - ipcMain.handle('init-security', async (event, connectionArgs, installationArgs, zoweConfig) => { - const res = await installActions.initSecurity(connectionArgs, installationArgs, zoweConfig); + ipcMain.handle('init-security', async (event, connectionArgs, installationArgs) => { + const res = await installActions.runInitSecurity(connectionArgs, installationArgs); return res; }); - ipcMain.handle('init-vsam', async (event, connectionArgs, installationArgs, zoweConfig) => { - const res = await installActions.initVsam(connectionArgs, installationArgs, zoweConfig); + ipcMain.handle('upload-latest-yaml', async (event, connectionArgs, installationArgs) => { + const res = await installActions.uploadLatestYaml(connectionArgs, installationArgs); + return res; + }); + + ipcMain.handle('init-stcs', async (event, connectionArgs, installationArgs) => { + const res = await installActions.initStcs(connectionArgs, installationArgs); + return res; + }); + + ipcMain.handle('init-vsam', async (event, connectionArgs, installationArgs) => { + const res = await installActions.initVsam(connectionArgs, installationArgs); return res; }); @@ -205,6 +266,11 @@ const createWindow = (): void => { return res; }); + ipcMain.handle('get-init-stcs-progress', async () => { + const res = ProgressStore.getAll()['initStcs']; + return res; + }); + ipcMain.handle('get-init-vsam-progress', async () => { const res = ProgressStore.getAll()['initVsam']; return res; diff --git a/src/renderer/components/Header.tsx b/src/renderer/components/Header.tsx index 1f59daa9..62d5aeb4 100644 --- a/src/renderer/components/Header.tsx +++ b/src/renderer/components/Header.tsx @@ -24,7 +24,7 @@ interface AlertData { severity: AlertColor; } -// Global event emmitter Zen can use +// Global event emmitter Wizard can use export const alertEmitter = new EventEmitter(); export default function Header() { @@ -84,7 +84,7 @@ export default function Header() { - Zowe Enterprise Necessity + Zowe Server Install Wizard {alertData.show && ( <>{alertData.message} diff --git a/src/renderer/components/Home.tsx b/src/renderer/components/Home.tsx index ebf8ab5b..1499e9ca 100644 --- a/src/renderer/components/Home.tsx +++ b/src/renderer/components/Home.tsx @@ -11,24 +11,25 @@ import '../global.css'; import { useEffect, useState } from "react"; import { Link } from 'react-router-dom'; -import { Box, Card, CardContent, CardMedia, Typography, Button, DialogContent, DialogActions } from '@mui/material'; +import { Box, Card, CardContent, CardMedia, Typography, Button } from '@mui/material'; import flatten, { unflatten } from 'flat'; import { IResponse, IIpcConnectionArgs } from '../../types/interfaces'; -import { setConnectionArgs, setResumeProgress, selectInitJobStatement } from './stages/connection/connectionSlice'; +import { setConnectionArgs, setResumeProgress, selectInitJobStatement, selectResumeProgress, connectionSlice } from './stages/connection/connectionSlice'; import { setJobStatement } from './stages/PlanningSlice'; -import { setZoweCLIVersion } from './configuration-wizard/wizardSlice'; +import { selectSchema, selectYaml, setSchema, setYaml, setZoweCLIVersion } from './configuration-wizard/wizardSlice'; import { useAppDispatch, useAppSelector } from '../hooks'; import { Tooltip } from '@mui/material'; import installationImg from '../assets/installation.png' import installationDryImg from '../assets/installation-dry-run.png' -import eventDispatcher from "../../utils/eventDispatcher"; -import { selectActiveStepIndex, selectIsSubstep, selectActiveSubStepIndex, selectActiveStepDate} from './stages/progress/activeStepSlice'; +import eventDispatcher from "../../services/eventDispatcher"; import { selectConnectionStatus} from './stages/progress/progressSlice'; import HorizontalLinearStepper from './common/Stepper'; import Wizard from './configuration-wizard/Wizard' -import Connection from './stages/connection/Connection'; import { ActiveState } from '../../types/stateInterfaces'; -import { getPreviousInstallation } from './stages/progress/StageProgressStatus'; +import { getInstallationArguments, getPreviousInstallation } from './stages/progress/StageProgressStatus'; +import { DEF_NO_OUTPUT, FALLBACK_SCHEMA, FALLBACK_YAML } from './common/Utils'; +import { selectInstallationArgs, setInstallationArgs, installationSlice } from './stages/installation/installationSlice'; +import PasswordDialog from './common/passwordDialog'; // REVIEW: Get rid of routing @@ -49,39 +50,20 @@ const cards: Array = [ media: installationImg, }, { - id: "configure", + id: "dry run", name: "Zowe Installation Dry Run", description: "It will guide you through the installation steps without running the installation.", - link: "/", + link: "/wizard", media: installationDryImg, } ] -const makeCard = (card: ICard) => { - const {id, name, description, link, media} = card; - return ( - - - - - - - - {name} - - - {description} - - - - - - - ) -} +const prevInstallationKey = "prev_installation"; +const lastActiveState: ActiveState = { + activeStepIndex: 0, + isSubStep: false, + activeSubStepIndex: 0, +}; const Home = () => { @@ -89,24 +71,102 @@ const Home = () => { const connectionStatus = useAppSelector(selectConnectionStatus); const [showWizard, setShowWizard] = useState(false); const [showLoginDialog, setShowLogin] = useState(false); + const [localYaml, setLocalYaml] = useState(useAppSelector(selectYaml)); + const [schema, setLocalSchema] = useState(useAppSelector(selectSchema)); + const installationArgs = useAppSelector(selectInstallationArgs); const { activeStepIndex, isSubStep, activeSubStepIndex, lastActiveDate } = getPreviousInstallation(); - const prevInstallationKey = "prev_installation"; - const lastActiveState: ActiveState = { - activeStepIndex: 0, - isSubStep: false, - activeSubStepIndex: 0, - }; const [isNewInstallation, setIsNewInstallation] = useState(false); const stages: any = []; const defaultTooltip: string = "Resume"; const resumeTooltip = connectionStatus ? defaultTooltip : `Validate Credentials & ${defaultTooltip}`; + const [showPasswordDialog, setShowPasswordDialog] = useState(false); + const [updatedConnection, setUpdatedConnection] = useState(false); + const [isResume, setIsResume] = useState(useAppSelector(selectResumeProgress)); + + const makeCard = (card: ICard) => { + const {id, name, description, link, media} = card; + + const handleClick = () => { + let newInstallationArgs = installationSlice.getInitialState().installationArgs; + if (id === "install") { + newInstallationArgs = {...newInstallationArgs, dryRunMode: false}; + } else if (id === "dry run") { + newInstallationArgs = {...newInstallationArgs, dryRunMode: true}; + } + dispatch(setYaml(FALLBACK_YAML)); + dispatch(setInstallationArgs(newInstallationArgs)); + window.electron.ipcRenderer.setConfigByKeyNoValidate("installationArgs", newInstallationArgs); + setLocalYaml(FALLBACK_YAML); + window.electron.ipcRenderer.setConfig(FALLBACK_YAML); + // TODO: Ideally, reset connectionArgs too + // but this introduces bug with "self certificate chain" it's the checkbox, it looks checked but + // it acts like it's not unless you touch it + // dispatch(setConnectionArgs(connectionSlice.getInitialState().connectionArgs)); + setIsResume(false); + }; + + return ( + + + + + + + + {name} + + + {description} + + + + + + + ) + } useEffect(() => { eventDispatcher.on('saveAndCloseEvent', () => setShowWizard(false)); + //Home is the first screen the user will always see 100% of the time. Therefore, we will call the loading of the configs, schemas, and installation args here and set them to the redux memory states + + //YAML LOADING - necessary for editor state as well as form values + if(localYaml == undefined || (typeof localYaml === "object" && Object.keys(localYaml).length === 0)){ + window.electron.ipcRenderer.getConfig().then((res: IResponse) => { + if (res.status) { + dispatch(setYaml(res.details)); + } else { + dispatch(setYaml(FALLBACK_YAML)); + } + }) + } + + //SCHEMA LOADING - necessary for JsonForms + if(schema == undefined || (typeof schema === "object" && Object.keys(schema).length === 0)){ + window.electron.ipcRenderer.getSchema().then((res: IResponse) => { + if (res.status && res.details !== undefined) { + dispatch(setSchema(res.details)); + } else { + dispatch(setSchema(FALLBACK_SCHEMA)); + } + }) + } + + //Load installation args + window.electron.ipcRenderer.getConfigByKey("installationArgs").then((res: IResponse) => { + if(res != undefined){ + dispatch(setInstallationArgs(res)); + } else { + dispatch(setInstallationArgs({...selectInstallationArgs, ...getInstallationArguments()})); + } + }) window.electron.ipcRenderer.checkZoweCLI().then((res: IResponse) => { if (res.status) { @@ -114,12 +174,16 @@ const Home = () => { } else { console.info('No Zowe CLI found on local machine'); } - }); + }); + + window.electron.ipcRenderer.setStandardOutput(DEF_NO_OUTPUT).then((res: any) => { + }) + window.electron.ipcRenderer.findPreviousInstallations().then((res: IResponse) => { const connectionStore = res.details; if (connectionStore["connection-type"] === 'ftp') { const jobStatement = connectionStore['ftp-details'].jobStatement.trim() || useAppSelector(selectInitJobStatement); - console.log(JSON.stringify(connectionStore['ftp-details'],null,2)); + // console.log(JSON.stringify(connectionStore['ftp-details'],null,2)); const connectionArgs: IIpcConnectionArgs = { ...connectionStore["ftp-details"], password: "", @@ -151,7 +215,17 @@ const Home = () => { const resumeProgress = () => { setShowWizard(true); - dispatch(setResumeProgress(!connectionStatus)); + dispatch(setResumeProgress(true)); + + if(connectionStatus) { + setShowPasswordDialog(true); + setUpdatedConnection(false); + } + } + + const confirmConnection = (status: boolean) => { + setUpdatedConnection(status); + setShowWizard(status); } return ( @@ -176,7 +250,7 @@ const Home = () => { -
Last updated on: {lastActiveDate}
+ {lastActiveDate &&
Last updated on: {lastActiveDate}
}
} } - {showWizard && } + {showWizard && + <> + {showPasswordDialog && } + {(showPasswordDialog && updatedConnection) && } + {!showPasswordDialog && } + + } ); }; diff --git a/src/renderer/components/common/EditorDialog.tsx b/src/renderer/components/common/EditorDialog.tsx index 09b9b5d9..9a14a75a 100644 --- a/src/renderer/components/common/EditorDialog.tsx +++ b/src/renderer/components/common/EditorDialog.tsx @@ -11,11 +11,12 @@ import { useState, useEffect, useRef } from "react"; import { useAppSelector, useAppDispatch } from '../../hooks'; import { Button, Dialog, DialogActions, DialogContent, DialogTitle } from '@mui/material'; -import { selectYaml, selectSchema, setNextStepEnabled, setYaml } from '../configuration-wizard/wizardSlice'; -import Ajv2019 from "ajv/dist/2019" +import { selectYaml, selectOutput, setNextStepEnabled, setYaml } from '../configuration-wizard/wizardSlice'; import MonacoEditorComponent from "../common/MonacoEditor"; -import draft7MetaSchema from "ajv/dist/refs/json-schema-draft-07.json"; import { parse, stringify } from "yaml"; +import { IResponse } from "../../../types/interfaces"; +import { DEF_NO_OUTPUT, schemaValidate } from "./Utils"; +import { alertEmitter } from "../Header"; const test_jcl = ` //MYJOB JOB (ACCT), 'My Job Description', @@ -32,8 +33,8 @@ const test_op = "WARNING: 'Some Warning'\nERROR: 'Some Error'\nINFO: 'Some Info' const EditorDialog = ({contentType, isEditorVisible, toggleEditorVisibility, onChange, content, readOnlyYaml} : {contentType: any, isEditorVisible: boolean, toggleEditorVisibility: any, onChange?: any, content?: any, readOnlyYaml?: boolean}) => { const dispatch = useAppDispatch(); - const schema = useAppSelector(selectSchema); const [setupYaml, setSetupYaml] = useState(useAppSelector(selectYaml)); + const [setupOutput, setSetupOutput] = useState(useAppSelector(selectOutput)); const [editorVisible, setEditorVisible] = useState(false); const [editorContent, setEditorContent] = useState(content ? content : ''); const [isSchemaValid, setIsSchemaValid] = useState(true); @@ -42,7 +43,8 @@ const EditorDialog = ({contentType, isEditorVisible, toggleEditorVisibility, onC useEffect(() => { setEditorVisible(isEditorVisible); - if(isEditorVisible) { + /* TODO: Should use an array for the Store to house separate outputs (Security vs Certificates for example) */ + if(isEditorVisible) { if(contentType == 'yaml') { setEditorContent(stringify(setupYaml)); } @@ -50,7 +52,9 @@ const EditorDialog = ({contentType, isEditorVisible, toggleEditorVisibility, onC setEditorContent(test_jcl); } if(contentType == 'output') { - setEditorContent(test_op); + window.electron.ipcRenderer.getStandardOutput().then((res: IResponse) => { + setEditorContent(res || DEF_NO_OUTPUT) // We may not always have output to show (for ex: no encountered error or run commands) + }); } } }, [isEditorVisible]) @@ -80,24 +84,22 @@ const EditorDialog = ({contentType, isEditorVisible, toggleEditorVisibility, onC jsonData = newCode; } - const ajv = new Ajv2019() - ajv.addKeyword("$anchor"); - ajv.addMetaSchema(draft7MetaSchema) - const validate = ajv.compile(schema); - // To validate the javascript object against the schema - const isValid = validate(jsonData); - setIsSchemaValid(isValid); + setIsSchemaValid(!schemaValidate.errors); - if(validate.errors && jsonData) { - const errPath = validate.errors[0].schemaPath; - const errMsg = validate.errors[0].message; + if(schemaValidate.errors && jsonData) { + const errPath = schemaValidate.errors[0].schemaPath; + const errMsg = schemaValidate.errors[0].message; setSchemaError(`Invalid Schema: ${errPath}. ${errMsg} `, ); jsonData = jsonData ? jsonData : ""; setSetupYaml(jsonData); window.electron.ipcRenderer.setConfig(jsonData); dispatch(setYaml(jsonData)); } else if(isSchemaValid && jsonData) { + if(jsonData?.installationArgs) { + delete jsonData.installationArgs; + setEditorContent(stringify(jsonData)); + } window.electron.ipcRenderer.setConfig(jsonData); dispatch(setYaml(jsonData)); setSetupYaml(jsonData); @@ -129,6 +131,11 @@ const EditorDialog = ({contentType, isEditorVisible, toggleEditorVisibility, onC reader.readAsText(file); }; + const handleClose = () => { + alertEmitter.emit('hideAlert'); + toggleEditorVisibility(); + }; + const handleFileExport = () => { const content = editorContent; const blob = new Blob([content], { type: 'text/plain' }); @@ -147,11 +154,13 @@ const EditorDialog = ({contentType, isEditorVisible, toggleEditorVisibility, onC return (
Editor @@ -172,7 +181,7 @@ const EditorDialog = ({contentType, isEditorVisible, toggleEditorVisibility, onC )} {contentType === 'jcl' && } - +
diff --git a/src/renderer/components/common/JsonForms.tsx b/src/renderer/components/common/JsonForms.tsx index dce65c2d..b6b65b6e 100644 --- a/src/renderer/components/common/JsonForms.tsx +++ b/src/renderer/components/common/JsonForms.tsx @@ -13,42 +13,141 @@ import { JsonForms } from '@jsonforms/react'; import { materialRenderers, materialCells } from '@jsonforms/material-renderers'; import { ThemeProvider } from '@mui/material/styles'; import jsonFormTheme from '../../jsonFormsTheme'; +import Radio from '@mui/material/Radio'; +import RadioGroup from '@mui/material/RadioGroup'; +import FormControlLabel from '@mui/material/FormControlLabel'; +import FormControl from '@mui/material/FormControl'; + +// Creates a basic input element in the UI schema +const createControl = (scope: string, label?: string) => ({ + type: 'Control', + label: label ? label.charAt(0).toUpperCase() + label.slice(1).toLowerCase() : undefined, + scope, // Scope specifies the JSON path +}); + +// createGroup generates a group object, used to group together multiple form elements - can optionally include a rule (like visibility) +const createGroup = (label: string, elements: any[], rule?: any) => ({ + type: 'Group', + label: `\n${label}`, + elements: elements || [], + ...(rule && {rule}), +}); + +// createVerticalLayout generates a layout object that arranges its child elements vertically. +const createVerticalLayout = (elements: any[]) => ({ + type: 'VerticalLayout', + elements, +}); + +// Same as above, but arranges its child elements horizontally. +const createHorizontalLayout = (elements: any[]) => ({ + type: 'HorizontalLayout', + elements, +}); + +// To handle the "if", "else", and "then" in the schema +const conditionalSchema = (schema: any, formData: any, prop: any): boolean=> { + if(schema.if && schema.then && schema.else){ + const ifProp = Object.keys(schema.if.properties)[0]; + const ifPropValue = schema.if.properties[ifProp].const.toLowerCase(); + const thenProp = schema.then.required[0].toLowerCase(); + const elseProp = schema.else.required[0].toLowerCase(); + + if(formData && formData[ifProp]) { + const formDataPropValue = formData[ifProp].toLowerCase(); + if( (formDataPropValue == ifPropValue && prop == elseProp) || (formDataPropValue != ifPropValue && prop == thenProp) ) { + return true; + } + } + return false; + } + return false; +} + +const getDefaultFormData = (schema: any, formData: any) => { + if (schema.oneOf) { + schema = schema.oneOf[0]; + } + if (schema && schema.properties) { + const defaultFormData = { ...formData }; + Object.keys(schema.properties).forEach((property) => { + if (schema.properties[property].type && schema.properties[property].default !== undefined || schema.properties[property].type === 'object') { + // If the property is an object, recursively set default values + if (schema.properties[property].type === 'object') { + defaultFormData[property] = getDefaultFormData( + schema.properties[property], + defaultFormData[property] || {} + ); + } else { + defaultFormData[property] = schema.properties[property].default; + } + } + }); + return defaultFormData; + } + return null; +}; + +// Function to return form data based on the attributes present in the schema +const filterFormData = (data: { [key: string]: any }, schema: any) => { + if (!data) { + return null; + } + const filteredData: { [key: string]: any } = {}; + const schemaProperties = schema?.properties || {}; + + Object.keys(data).forEach(key => { + if (key in schemaProperties) { + filteredData[key] = data[key]; + } + }); + + return filteredData; +}; + +// Function to find the matching schema for the given form data +const findMatchingSchemaIndex = (formData: any, oneOfSchemas: any) => { + for (let i = 0; i < oneOfSchemas.length; i++) { + const subSchema = oneOfSchemas[i]; + const filteredData = filterFormData(formData, subSchema); + if (filteredData && JSON.stringify(filteredData) === JSON.stringify(formData)) { + return i; + } + } + return 0; // Default to the first schema if no match is found +}; const makeUISchema = (schema: any, base: string, formData: any): any => { if (!schema || !formData) { return ""; } + + if(schema.oneOf) { + const schemaIndex = findMatchingSchemaIndex(formData, schema.oneOf) + schema = schema.oneOf[schemaIndex]; + } + const properties = Object.keys(schema?.properties); - // Creates a basic input element in the UI schema - const createControl = (scope: string) => ({ - type: 'Control', - scope, // Scope specifies the JSON path - }); + // Map each property in the JSON schema to an appropriate UI element based on its type and structure. + const elements = properties.map((prop: any) => { - // createGroup generates a group object, used to group together multiple form elements - can optionally include a rule (like visibility) - const createGroup = (label: string, elements: any[], rule?: any) => ({ - type: 'Group', - label: `\n${label}`, - elements: elements || [], - ...(rule && {rule}), - }); + const propertySchema = schema.properties[prop]; - // createVerticalLayout generates a layout object that arranges its child elements vertically. - const createVerticalLayout = (elements: any[]) => ({ - type: 'VerticalLayout', - elements, - }); + if (propertySchema.anyOf && propertySchema.anyOf.length > 0) { + let matchingPropertyIndex = findMatchingSchemaIndex(formData[prop], propertySchema.anyOf); + let selectedProperty = propertySchema.anyOf[matchingPropertyIndex]; - // Same as above, but arranges its child elements horizontally. - const createHorizontalLayout = (elements: any[]) => ({ - type: 'HorizontalLayout', - elements, - }); + if (selectedProperty.type === 'null') { + matchingPropertyIndex = matchingPropertyIndex > 0 ? matchingPropertyIndex-1 : propertySchema.anyOf.length-1; + } - // Map each property in the JSON schema to an appropriate UI element based on its type and structure. - const elements = properties.map((prop: any) => { - if (schema.properties[prop].type === 'object') { + if (propertySchema.type !== 'object') { + return createControl(`#/properties${base}${prop}/anyOf[${matchingPropertyIndex}]`, prop); + } + } + + if (propertySchema.type === 'object') { // Create a group with a hide rule if patternProperties are present or conditional hiding is required. if (schema.properties[prop].patternProperties || (schema.if && conditionalSchema(schema, formData, prop))) { return createGroup(prop, [], { @@ -86,71 +185,63 @@ const makeUISchema = (schema: any, base: string, formData: any): any => { return createVerticalLayout(elements); // Return whole structure } -// To handle the "if", "else", and "then" in the schema -const conditionalSchema = (schema: any, formData: any, prop: any): boolean=> { - if(schema.if && schema.then && schema.else){ - const ifProp = Object.keys(schema.if.properties)[0]; - const ifPropValue = schema.if.properties[ifProp].const.toLowerCase(); - const thenProp = schema.then.required[0].toLowerCase(); - const elseProp = schema.else.required[0].toLowerCase(); - - if(formData && formData[ifProp]) { - const formDataPropValue = formData[ifProp].toLowerCase(); - if( (formDataPropValue == ifPropValue && prop == elseProp) || (formDataPropValue != ifPropValue && prop == thenProp) ) { - return true; - } - } - return false; - } - return false; -} - export default function JsonForm(props: any) { - const {schema, onChange, formData} = props; + let {schema, onChange, formData} = props; - const isFormDataEmpty = formData === null || formData === undefined; + const isFormDataEmpty = formData === null || formData === undefined || Object.keys(formData).length < 1; + formData = isFormDataEmpty ? getDefaultFormData(schema, {}) : formData; + + const [selectedSchemaIndex, setSelectedSchemaIndex] = schema.oneOf ? useState(findMatchingSchemaIndex(formData, schema.oneOf)) : useState(0); + const [requiredSchema, setRequiredSchema] = useState(schema); useEffect(() => { - if (isFormDataEmpty) { - const defaultFormData = getDefaultFormData(schema, formData); - onChange(defaultFormData); + if (schema?.oneOf) { + setRequiredSchema(schema.oneOf[selectedSchemaIndex]); + formData = filterFormData(formData, schema.oneOf[selectedSchemaIndex]); } - }, [isFormDataEmpty, schema, onChange]); - - const getDefaultFormData = (schema: any, formData: any) => { - if (schema && schema.properties) { - const defaultFormData = { ...formData }; - Object.keys(schema.properties).forEach((property) => { - if (schema.properties[property].type && schema.properties[property].default !== undefined || schema.properties[property].type === 'object') { - // If the property is an object, recursively set default values - if (schema.properties[property].type === 'object') { - defaultFormData[property] = getDefaultFormData( - schema.properties[property], - defaultFormData[property] || {} - ); - } else { - defaultFormData[property] = schema.properties[property].default; - } - } - }); - return defaultFormData; - } - return null; - }; - - // const [formState, setFormState] = useState(isFormDataEmpty ? getDefaultFormData(schema, {}) : formData); + }, []); + + const handleSchemaChange = (event: any) => { + const schemaIndex = parseInt(event.target.value); + setSelectedSchemaIndex(schemaIndex); + setRequiredSchema(schema.oneOf[schemaIndex]); + formData = filterFormData(formData, schema.oneOf[schemaIndex]); + onChange(formData, schemaIndex); + } return ( - { onChange(data) }} - /> + { schema.oneOf && +
+ + + { schema.oneOf.map((schemaOption: any, index: number) => ( + } + label={schemaOption.name ? schemaOption.name : `Option ${index+1}`} + /> + ))} + + +
+ + } + { schema.oneOf ? onChange(data, selectedSchemaIndex) : onChange(data) }} + />
); } \ No newline at end of file diff --git a/src/renderer/components/common/MonacoEditor.tsx b/src/renderer/components/common/MonacoEditor.tsx index 95bfd012..8be5fbd6 100644 --- a/src/renderer/components/common/MonacoEditor.tsx +++ b/src/renderer/components/common/MonacoEditor.tsx @@ -49,6 +49,7 @@ const MonacoEditorComponent = ({contentType, initialContent, onContentChange, is editorRef.current = monaco.editor.create(document.getElementById('monaco-editor-container'), { language: lang, theme: theme, + wordWrap: contentType === "yaml" ? "off" : "on", value: initialContent, readOnly: readOnly }); @@ -88,7 +89,7 @@ const MonacoEditorComponent = ({contentType, initialContent, onContentChange, is } return ( -
+
{isError && (
diff --git a/src/renderer/components/common/Stepper.tsx b/src/renderer/components/common/Stepper.tsx index 7d0ae4db..382ce77c 100644 --- a/src/renderer/components/common/Stepper.tsx +++ b/src/renderer/components/common/Stepper.tsx @@ -18,23 +18,23 @@ import Button from '@mui/material/Button'; import Typography from '@mui/material/Typography'; import { Link } from 'react-router-dom'; import { selectConnectionStatus } from '../stages/progress/progressSlice'; -import { useAppSelector, useAppDispatch } from '../../hooks'; -import { selectNextStepEnabled } from '../configuration-wizard/wizardSlice'; -import { selectPlanningStatus, selectInitializationStatus, selectDatasetInstallationStatus, selectNetworkingStatus, selectApfAuthStatus, selectSecurityStatus, selectCertificateStatus, selectLaunchConfigStatus, selectReviewStatus } from '../stages/progress/progressSlice'; -import { selectInstallationTypeStatus } from '../stages/progress/progressSlice'; +import { useAppDispatch, useAppSelector } from '../../hooks'; +import { selectNextStepEnabled, setLoading, setYaml } from '../configuration-wizard/wizardSlice'; import { selectActiveStepIndex, selectActiveSubStepIndex } from '../stages/progress/activeStepSlice'; import { alertEmitter } from '../Header'; import EditorDialog from "./EditorDialog"; import savedInstall from '../../assets/saved-install-green.png'; -import eventDispatcher from '../../../utils/eventDispatcher'; +import eventDispatcher from '../../../services/eventDispatcher'; import Warning from '@mui/icons-material/Warning'; import CheckCircle from '@mui/icons-material/CheckCircle'; -import Home from '../Home'; -import { getProgress, getCompleteProgress, mapAndSetSkipStatus, mapAndGetSkipStatus } from '../stages/progress/StageProgressStatus'; - +import { TYPE_YAML, TYPE_OUTPUT, TYPE_JCL, INIT_STAGE_LABEL, REVIEW_INSTALL_STAGE_LABEL, UNPAX_STAGE_LABEL } from '../common/Utils'; +import { getProgress, getCompleteProgress, updateSubStepSkipStatus, updateStepSkipStatus } from '../stages/progress/StageProgressStatus'; import '../../styles/Stepper.css'; import { StepIcon } from '@mui/material'; -import { stages } from '../configuration-wizard/Wizard'; +import { getStageDetails } from '../../../services/StageDetails'; +import { IResponse } from '../../../types/interfaces'; +import { selectConnectionArgs, setPassword } from '../stages/connection/connectionSlice'; +import { selectInstallationArgs } from '../stages/installation/installationSlice'; // TODO: define props, stages, stage interfaces // TODO: One rule in the store to enable/disable button @@ -42,8 +42,8 @@ export default function HorizontalLinearStepper({stages, initialization}:{stages const connectionStatus = useSelector(selectConnectionStatus); - const INIT_STAGE_ID = 3; - const REVIEW_STAGE_ID = 4; + const INIT_STAGE_ID = getStageDetails(INIT_STAGE_LABEL).id; + const REVIEW_STAGE_ID = getStageDetails(REVIEW_INSTALL_STAGE_LABEL).id; const completeProgress = getCompleteProgress(); @@ -51,43 +51,35 @@ export default function HorizontalLinearStepper({stages, initialization}:{stages useSelector(selectConnectionStatus), completeProgress.planningStatus, completeProgress.installationTypeStatus, + completeProgress.downloadUnpaxStatus, completeProgress.initializationStatus, completeProgress.reviewStatus ]; - const [subStageProgressStatus, setProgressStatus] = useState([ + const [subStageProgressStatus, setSubStageProgressStatus] = useState([ completeProgress.datasetInstallationStatus, completeProgress.networkingStatus, completeProgress.apfAuthStatus, completeProgress.securityStatus, + completeProgress.stcsStatus, completeProgress.certificateStatus, completeProgress.launchConfigStatus ]) - const TYPE_YAML = "yaml"; - const TYPE_JCL = "jcl"; - const TYPE_OUTPUT = "output"; - const [activeStep, setActiveStep] = initialization ? useState(0) : useState(useAppSelector(selectActiveStepIndex)); const [activeSubStep, setActiveSubStep] = initialization ? useState(0) : useState(useAppSelector(selectActiveSubStepIndex)); const [nextText, setNextText] = useState("Continue"); const [contentType, setContentType] = useState('output'); const [editorVisible, setEditorVisible] = useState(false); const [editorContent, setEditorContent] = useState(''); + const installationArgs = useAppSelector(selectInstallationArgs); + const connectionArgs = useAppSelector(selectConnectionArgs); + const dispatch = useAppDispatch(); useEffect(() => { - const mvsCompleteListener = (completed: boolean) => { - setProgressStatus([true, completeProgress.networkingStatus, - completeProgress.apfAuthStatus, - completeProgress.securityStatus, - completeProgress.certificateStatus, - completeProgress.launchConfigStatus]) - }; eventDispatcher.on('updateActiveStep', updateActiveStepListener); - eventDispatcher.on('initMvsComplete', mvsCompleteListener); return () => { eventDispatcher.off('updateActiveStep', updateActiveStepListener); - eventDispatcher.off('initMvsComplete', mvsCompleteListener); }; }, []); @@ -123,10 +115,33 @@ export default function HorizontalLinearStepper({stages, initialization}:{stages toggleEditorVisibility(TYPE_OUTPUT); }; - const handleSkip = () => { + const handleSkip = async () => { stages[activeStep].isSkipped = true; - stages[activeStep].subStages[activeSubStep].isSkipped = true; - mapAndSetSkipStatus(activeSubStep, true); + updateStepSkipStatus(activeStep, true); + if(stages[activeStep].subStages){ + stages[activeStep].subStages[activeSubStep].isSkipped = true; + updateSubStepSkipStatus(activeSubStep, true); + } + if(stages[activeStep].label === UNPAX_STAGE_LABEL && installationArgs.installationType != "smpe"){ + alertEmitter.emit('showAlert', 'Retrieving example-zowe.yaml and latest schemas from Zowe runtime files...', 'info'); + dispatch(setLoading(true)); + await window.electron.ipcRenderer.fetchExampleYamlBtnOnClick(connectionArgs, installationArgs).then((res: IResponse) => { + if(!res.status){ //errors during runInstallation() + alertEmitter.emit('showAlert', res.details.message ? res.details.message : res.details, 'error'); + console.log("failed to retrieve schemas: ", res.details.message ? res.details.message : res.details); + } + if(res.details?.mergedYaml != undefined){ + dispatch(setYaml(res.details.mergedYaml)); + window.electron.ipcRenderer.setConfig(res.details.mergedYaml); + alertEmitter.emit('showAlert', "Successfully fetched example-zowe.yaml and latest schemas", 'success'); + console.log("Successfully fetched example-zowe.yaml and latest schemas"); + } + }).catch((e: any) => { + alertEmitter.emit('showAlert', e.message, 'error'); + console.log("failed to retrieve schemas", e.message); + }); + } + dispatch(setLoading(false)); handleNext(); } @@ -167,29 +182,20 @@ export default function HorizontalLinearStepper({stages, initialization}:{stages return; } - // To not access the stage if any previous stage is not completed - for (let i = 0; i < newActiveStep; i++) { - const statusAtIndex = stageProgressStatus[i]; - // We can access 'Review Installation' if Initialization in not completed since it can be skipped - if (!statusAtIndex && !(newActiveStep == REVIEW_STAGE_ID && i == INIT_STAGE_ID)) { - return; - } - } - setActiveStep(newActiveStep); const newSubStep = isSubStep ? subStepIndex : 0; - if((subStepIndex > 0 && subStageProgressStatus[0] === true) || subStepIndex === 0){ //only allow substages after installation to be navigated to if init mvs has been completed + if((subStepIndex > 0 && completeProgress.datasetInstallationStatus === true) || subStepIndex === 0){ //only allow substages after installation to be navigated to if init mvs has been completed setActiveSubStep(newSubStep); } } - const getStepIcon = (error: any, stageId: number, isSubStep?: boolean, subStepId?: number) => { + const getStepIcon = (stageId: number, isSubStep?: boolean, subStepId?: number) => { - if (!error || (isSubStep && getProgress(stages[stageId].subStages[subStepId].statusKey)) || (!isSubStep && getProgress(stages[stageId].statusKey))) { + if ((isSubStep && getProgress(stages[stageId].subStages[subStepId].statusKey)) || (!isSubStep && ((stageId == 0 && connectionStatus) || (getProgress(stages[stageId].statusKey))))) { return } />; } - if ((isSubStep && mapAndGetSkipStatus(subStepId)) || (error && activeStep>stageId && !isSubStep) || (error && isSubStep && stages[stageId].subStages[subStepId].isSkipped)) { + if ((isSubStep && stages[stageId].subStages[subStepId].isSkipped) || (!isSubStep && stages[stageId].isSkipped)) { return } />; } @@ -221,10 +227,36 @@ export default function HorizontalLinearStepper({stages, initialization}:{stages const onSaveAndClose = () => { alertEmitter.emit('hideAlert'); eventDispatcher.emit('saveAndCloseEvent'); + dispatch(setPassword('')); + // TODO: This is a workaround for same session + Save & Close + new install not resetting the Wizard properly. + // Fixed by reloading page. This is not ideal and should be investigated + window.location.reload(); } const isNextStepEnabled = useAppSelector(selectNextStepEnabled); + const skipButtonDisabled = (stages: any, activeStep: number, activeSubStep: number) => { + if(stages[activeStep]) { + if(stages[activeStep].isSkippable && !stages[activeStep].subStages) { + if(getProgress(stages[activeStep].statusKey)) { + return true; + } else { + return false; + } + } else if(stages[activeStep].subStages) { + if(stages[activeStep].subStages[activeSubStep].label === ("Installation")) { + return true; + } else if(getProgress(stages[activeStep].subStages[activeSubStep].statusKey)) { + return true; + } else { + return false; + } + } + } else { + return true; + } + } + return ( @@ -247,14 +279,12 @@ export default function HorizontalLinearStepper({stages, initialization}:{stages {backgroundColor: '#E0E0E0', padding: '10px 20px 25px', position: 'relative', - marginBottom: '-27px', + marginBottom: '-30px', borderTopRightRadius: '7px', borderTopLeftRadius: '7px', boxShadow: 'rgb(0 0 0 / 15%) 0px 6px 4px -1px inset'} : {}}> : }> - icon={getStepIcon(labelProps.error, stage.id)}> + icon={getStepIcon(stage.id)}> handleStepperClick(stage.id, !!stage.subStage)}>{stage.label}
@@ -271,9 +301,7 @@ export default function HorizontalLinearStepper({stages, initialization}:{stages return ( : }> - icon={getStepIcon(labelProps.error, activeStep, true, index)}> + icon={getStepIcon(activeStep, true, index)}> handleStepperClick(activeStep, true, stage.id )}>{stage.label} @@ -320,7 +348,7 @@ export default function HorizontalLinearStepper({stages, initialization}:{stages } {stages[activeStep] && stages[activeStep].isSkippable && + +
+ + +
+ ); +}; + +export default PasswordDialog; \ No newline at end of file diff --git a/src/renderer/components/configuration-wizard/Wizard.tsx b/src/renderer/components/configuration-wizard/Wizard.tsx index 2c8e6597..8db4c86a 100644 --- a/src/renderer/components/configuration-wizard/Wizard.tsx +++ b/src/renderer/components/configuration-wizard/Wizard.tsx @@ -13,37 +13,41 @@ import Connection from "../stages/connection/Connection"; import Planning from "../stages/Planning"; import Installation from "../stages/installation/Installation"; import Security from "../stages/Security"; +import Stcs from "../stages/Stcs"; import Certificates from "../stages/Certificates"; import Initialization from "../stages/Initialization"; import ReviewInstallation from '../stages/ReviewInstallation'; import FinishInstallation from '../stages/FinishInstallation'; -import spock from '../../assets/spock.svg' import InstallationType from '../stages/installation/InstallTypeSelection'; import { selectLoading } from './wizardSlice'; import { useAppSelector } from '../../hooks'; import InitApfAuth from '../stages/InitApfAuth'; import Networking from '../stages/Networking'; -import Vsam from '../stages/Vsam'; +import CachingService from '../stages/CachingService'; import LaunchConfig from '../stages/LaunchConfig'; import { getProgress } from '../stages/progress/StageProgressStatus'; +import Unpax from '../stages/Unpax'; +import { APF_AUTH_STAGE_LABEL, CERTIFICATES_STAGE_LABEL, CONNECTION_STAGE_LABEL, FINISH_INSTALL_STAGE_LABEL, INIT_STAGE_LABEL, INSTALLATION_TYPE_STAGE_LABEL, INSTALL_STAGE_LABEL, LAUNCH_CONFIG_STAGE_LABEL, NETWORKING_STAGE_LABEL, PLANNING_STAGE_LABEL, REVIEW_INSTALL_STAGE_LABEL, SECURITY_STAGE_LABEL, UNPAX_STAGE_LABEL, CACHING_SERVICE_LABEL } from '../common/Utils'; const mvsDatasetInitProgress = getProgress('datasetInstallationStatus'); export const stages = [ - {id: 0, label: 'Connection', component: , hasJCL: false, isSkippable: false, isSkipped: false, hasOutput: false, steps: 1, nextButton: 'Continue', statusKey: 'connectionStatus'}, - {id: 1, label: 'Planning', component: , hasJCL: false, isSkippable: false, isSkipped: false, hasOutput: true, steps: 3, nextButton: 'Continue to Installation Options', statusKey: 'planningStatus'}, - {id: 2, label: 'Installation Type', component: , hasJCL: false, isSkippable: false, isSkipped: false, hasOutput: false, steps: 1, nextButton: 'Continue to Components Installation', statusKey: 'installationTypeStatus'}, - {id: 3, label: 'Initialization', component: , hasJCL: true, isSkippable: true, isSkipped: false, hasYaml: true, hasOutput: true, steps: 1, subStages: [ - {id: 0, label: 'Installation', component: , hasJCL: true, isSkippable: mvsDatasetInitProgress ?? false, isSkipped: false, hasYaml: true, hasOutput: true, steps: 1, nextButton: 'Continue to Network Setup', statusKey: 'datasetInstallationStatus'}, - {id: 1, label: 'Networking', component: , hasJCL: true, isSkippable: true, isSkipped: false, hasYaml: true, hasOutput: true, steps: 1, nextButton: 'Continue to APF Auth Setup', statusKey: 'networkingStatus'}, - {id: 2, label: 'APF Auth', component: , hasJCL: true, isSkippable: true, isSkipped: false, hasYaml: true, hasOutput: true, steps: 1, nextButton: 'Continue to Security Setup', statusKey: 'apfAuthStatus'}, - {id: 3, label: 'Security', component: , hasJCL: true, isSkippable: true, isSkipped: false, hasYaml: true, hasOutput: true, steps: 1, nextButton: 'Continue to Certificates Setup', statusKey: 'securityStatus'}, - {id: 4, label: 'Certificates', component: , hasJCL: true, isSkippable: true, isSkipped: false, hasYaml: true, hasOutput: true, steps: 1, nextButton: 'Continue to Vsam Setup', statusKey: 'certificateStatus'}, - {id: 5, label: 'Vsam', component: , hasJCL: true, isSkippable: true, isSkipped: false, hasYaml: true, hasOutput: true, steps: 1, nextButton: 'Continue to Launch Setup', statusKey: 'vsamStatus'}, - {id: 6, label: 'Launch Config', component: , hasJCL: true, isSkippable: true, isSkipped: false, hasYaml: true, hasOutput: true, steps: 1, nextButton: 'Continue to Instance Setup', statusKey: 'launchConfigStatus'}, + {id: 0, label: CONNECTION_STAGE_LABEL, component: , hasJCL: false, isSkippable: false, isSkipped: false, hasOutput: false, steps: 1, nextButton: 'Continue', statusKey: 'connectionStatus'}, + {id: 1, label: PLANNING_STAGE_LABEL, component: , hasJCL: false, isSkippable: false, isSkipped: false, hasOutput: true, steps: 3, nextButton: 'Continue to Installation Options', statusKey: 'planningStatus'}, + {id: 2, label: INSTALLATION_TYPE_STAGE_LABEL, component: , hasJCL: false, isSkippable: false, isSkipped: false, hasOutput: false, steps: 1, nextButton: "Continue to Unpax", statusKey: 'installationTypeStatus'}, + {id: 3, label: UNPAX_STAGE_LABEL, component: , hasJCL: false, isSkippable: true, isSkipped: false, hasOutput: false, steps: 1, nextButton: 'Continue to Components Installation', statusKey: 'downloadUnpaxStatus'}, + {id: 4, label: INIT_STAGE_LABEL, component: , hasJCL: true, isSkippable: true, isSkipped: false, hasYaml: true, hasOutput: true, steps: 1, subStages: [ + {id: 0, label: INSTALL_STAGE_LABEL, component: , hasJCL: true, isSkippable: mvsDatasetInitProgress ?? false, isSkipped: false, hasYaml: true, hasOutput: true, steps: 1, nextButton: 'Continue to Network Setup', statusKey: 'datasetInstallationStatus'}, + {id: 1, label: NETWORKING_STAGE_LABEL, component: , hasJCL: true, isSkippable: true, isSkipped: false, hasYaml: true, hasOutput: true, steps: 1, nextButton: 'Continue to APF Auth Setup', statusKey: 'networkingStatus'}, + {id: 2, label: APF_AUTH_STAGE_LABEL, component: , hasJCL: true, isSkippable: true, isSkipped: false, hasYaml: true, hasOutput: true, steps: 1, nextButton: 'Continue to Security Setup', statusKey: 'apfAuthStatus'}, + {id: 3, label: SECURITY_STAGE_LABEL, component: , hasJCL: true, isSkippable: true, isSkipped: false, hasYaml: true, hasOutput: true, steps: 1, nextButton: 'Continue to STC Setup', statusKey: 'securityStatus'}, + {id: 4, label: 'Stcs', component: , hasJCL: true, isSkippable: true, isSkipped: false, hasYaml: true, hasOutput: true, steps: 1, nextButton: 'Continue to Certificates Setup', statusKey: 'stcsStatus'}, + {id: 5, label: CERTIFICATES_STAGE_LABEL, component: , hasJCL: true, isSkippable: true, isSkipped: false, hasYaml: true, hasOutput: true, steps: 1, nextButton: 'Continue to Caching Service Setup', statusKey: 'certificateStatus'}, + {id: 6, label: CACHING_SERVICE_LABEL, component: , hasJCL: true, isSkippable: true, isSkipped: false, hasYaml: true, hasOutput: true, steps: 1, nextButton: 'Continue to Launch Setup', statusKey: 'cachingServiceStatus'}, + {id: 7, label: LAUNCH_CONFIG_STAGE_LABEL, component: , hasJCL: true, isSkippable: true, isSkipped: false, hasYaml: true, hasOutput: true, steps: 1, nextButton: 'Continue to Instance Setup', statusKey: 'launchConfigStatus'}, ], nextButton: 'Review', statusKey: 'initializationStatus'}, - {id: 4, label: 'Review Installation', component: , hasJCL: false, isSkippable: false, hasOutput: false, steps: 1, nextButton: 'Finish Installation', statusKey: 'reviewStatus'}, - {id: 5, label: 'Finish Installation', component: , hasJCL: false, isSkippable: false, isSkipped: false, hasOutput: false, steps: 1, statusKey: 'finishStatus'}, + {id: 5, label: REVIEW_INSTALL_STAGE_LABEL, component: , hasJCL: false, isSkippable: false, hasOutput: false, steps: 1, nextButton: 'Finish Installation', statusKey: 'reviewStatus'}, + {id: 6, label: FINISH_INSTALL_STAGE_LABEL, component: , hasJCL: false, isSkippable: false, isSkipped: false, hasOutput: false, steps: 1, statusKey: 'finishStatus'}, ] const Wizard = ({initialization}: {initialization: boolean}) => { diff --git a/src/renderer/components/configuration-wizard/wizardSlice.ts b/src/renderer/components/configuration-wizard/wizardSlice.ts index c73c254a..d03bf27f 100644 --- a/src/renderer/components/configuration-wizard/wizardSlice.ts +++ b/src/renderer/components/configuration-wizard/wizardSlice.ts @@ -16,6 +16,7 @@ interface WizardState { loading: boolean; nextStepEnabled: boolean; yaml: any; + output: string | undefined; schema: any; zoweCLIVersion: string; } @@ -26,6 +27,7 @@ const initialState: WizardState = { yaml: {}, schema: {}, zoweCLIVersion: '', + output: '', }; export const wizardSlice = createSlice({ @@ -40,9 +42,6 @@ export const wizardSlice = createSlice({ }, setYaml: (state, action: PayloadAction) => { state.yaml = action.payload; - window.electron.ipcRenderer.setConfig(action.payload).then((res: IResponse) => { - // Response - }); }, setSchema: (state, action: PayloadAction) => { state.schema = action.payload; @@ -50,11 +49,15 @@ export const wizardSlice = createSlice({ setZoweCLIVersion: (state, action: PayloadAction) => { state.zoweCLIVersion = action.payload; }, + setOutput: (state, action: PayloadAction) => { + state.output = action.payload + } }, }); -export const { setLoading, setYaml, setSchema, setNextStepEnabled, setZoweCLIVersion } = wizardSlice.actions; +export const { setLoading, setYaml, setOutput, setSchema, setNextStepEnabled, setZoweCLIVersion } = wizardSlice.actions; export const selectLoading = (state: RootState) => state.wizard.loading; export const selectYaml = (state: RootState) => state.wizard.yaml; +export const selectOutput = (state: RootState) => state.wizard.output; export const selectSchema = (state: RootState) => state.wizard.schema; export const selectNextStepEnabled = (state: RootState) => state.wizard.nextStepEnabled; export const selectZoweCLIVersion = (state: RootState) => state.wizard.zoweCLIVersion; diff --git a/src/renderer/components/stages/CachingService.tsx b/src/renderer/components/stages/CachingService.tsx new file mode 100644 index 00000000..b822cc49 --- /dev/null +++ b/src/renderer/components/stages/CachingService.tsx @@ -0,0 +1,437 @@ +/* + * This program and the accompanying materials are made available under the terms of the + * Eclipse Public License v2.0 which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-v20.html + * + * SPDX-License-Identifier: EPL-2.0 + * + * Copyright Contributors to the Zowe Project. + */ + +import { useState, useEffect, useRef } from "react"; +import { Box, Button, FormControl, InputLabel, Select, TextField, MenuItem } from '@mui/material'; +import { useAppSelector, useAppDispatch } from '../../hooks'; +import { selectYaml, selectSchema, setNextStepEnabled, setYaml } from '../configuration-wizard/wizardSlice'; +import { setInitializationStatus, setCachingServiceStatus } from './progress/progressSlice'; +import ContainerCard from '../common/ContainerCard'; +import JsonForm from '../common/JsonForms'; +import EditorDialog from "../common/EditorDialog"; +import { selectConnectionArgs } from "./connection/connectionSlice"; +import { IResponse } from "../../../types/interfaces"; +import ProgressCard from "../common/ProgressCard"; +import React from "react"; +import { createTheme } from '@mui/material/styles'; +import { stages } from "../configuration-wizard/Wizard"; +import { setActiveStep } from "./progress/activeStepSlice"; +import { getStageDetails, getSubStageDetails } from "../../../services/StageDetails"; +import { getProgress, setVsamInitState, updateSubStepSkipStatus, getInstallationArguments, getVsamInitState, isInitializationStageComplete, getCachedZoweVersion } from "./progress/StageProgressStatus"; +import { InitSubStepsState } from "../../../types/stateInterfaces"; +import { alertEmitter } from "../Header"; +import { INIT_STAGE_LABEL, ajv } from "../common/Utils"; + +const CachingService = () => { + + // TODO: Display granular details of installation - downloading - unpacking - running zwe command + + const subStageLabel = 'Caching Service'; + + const [STAGE_ID] = useState(getStageDetails(INIT_STAGE_LABEL).id); + const [SUB_STAGES] = useState(!!getStageDetails(INIT_STAGE_LABEL).subStages); + const [SUB_STAGE_ID] = useState(SUB_STAGES ? getSubStageDetails(STAGE_ID, subStageLabel).id : 0); + + const [theme] = useState(createTheme()); + + const dispatch = useAppDispatch(); + const [schema] = useState(useAppSelector(selectSchema)); + const yaml = useAppSelector(selectYaml); + const [setupSchema] = useState(schema?.properties?.zowe?.properties?.setup?.properties?.vsam); + const setupYaml = yaml?.zowe?.setup?.vsam; + const [showProgress, setShowProgress] = useState(getProgress('cachingServiceStatus')); + const [init, setInit] = useState(false); + const [editorVisible, setEditorVisible] = useState(false); + const [isFormValid, setIsFormValid] = useState(false); + const [formError, setFormError] = useState(''); + const [contentType, setContentType] = useState(''); + const [vsamInitProgress, setVsamInitProgress] = useState(getVsamInitState()); + const [stateUpdated, setStateUpdated] = useState(false); + const [initClicked, setInitClicked] = useState(false); + const [allowInitialization, setAllowInitialization] = useState(true); + const [installationArgs] = useState(getInstallationArguments()); + const [connectionArgs] = useState(useAppSelector(selectConnectionArgs)); + const [stageStatus, setStageStatus] = useState(stages[STAGE_ID].subStages[SUB_STAGE_ID].isSkipped); + const stageStatusRef = useRef(stageStatus); + const [showVsameDatsetName, setShowVsamDatasetName] = useState(false); + const [storageMode, setStorageMode] = useState(yaml?.components[`caching-service`]?.storage?.mode); + const storageModeOptions = ['VSAM', 'INFINISPAN']; + const zoweVersion: number = getCachedZoweVersion(); + const [showStorageModeOptions, setShowStorageModeOptions] = useState(false); + + let timer: any; + + const [defaultErrorMessage] = useState("Please ensure that the volume, storage class & dataset values are accurate."); + + const [validate] = useState(() => ajv.getSchema("https://zowe.org/schemas/v2/server-base") || ajv.compile(setupSchema)) + + useEffect(() => { + stageStatusRef.current = stageStatus; + }, [stageStatus]); + + useEffect(() => { + + (zoweVersion < 3) ? setStorageMode('VSAM') : setShowStorageModeOptions(true); + + if(storageMode.toUpperCase() !== 'VSAM' && zoweVersion >= 3) { + dispatchActions(true); + setShowProgress(false); + return; + } + + let nextPosition; + const stepProgress = getProgress('cachingServiceStatus'); + + dispatch(setInitializationStatus(isInitializationStageComplete())); + setShowProgress(initClicked || stepProgress); + + const nameExists = setupSchema?.properties?.name; + if(!nameExists) { + setShowVsamDatasetName(true); + } + + const vsamDatasetName = yaml?.components[`caching-service`]?.storage?.vsam?.name|| ''; + if(vsamDatasetName) { + datasetValidation(vsamDatasetName); + } + + if(stepProgress) { + nextPosition = document.getElementById('vsam-progress'); + nextPosition?.scrollIntoView({ behavior: 'smooth', block: 'center' }); + } else { + nextPosition = document.getElementById('container-box-id'); + nextPosition?.scrollIntoView({behavior: 'smooth'}); + } + + setInit(true); + dispatch(setNextStepEnabled(stepProgress)); + + return () => { + alertEmitter.emit('hideAlert'); + updateSubStepSkipStatus(SUB_STAGE_ID, stageStatusRef.current); + dispatch(setActiveStep({ activeStepIndex: STAGE_ID, isSubStep: SUB_STAGES, activeSubStepIndex: SUB_STAGE_ID })); + } + }, []); + + useEffect(() => { + setShowProgress(initClicked || getProgress('cachingServiceStatus')); + + if(initClicked) { + let nextPosition = document.getElementById('start-vsam-progress'); + nextPosition?.scrollIntoView({ behavior: 'smooth', block: 'start' }); + setStateUpdated(!stateUpdated); + dispatchActions(false); + } + }, [initClicked]); + + useEffect(() => { + if(!getProgress('cachingServiceStatus') && initClicked) { + timer = setInterval(() => { + window.electron.ipcRenderer.getInitVsamProgress().then((res: any) => { + setVsamInitializationProgress(res); + if(res.success){ + clearInterval(timer); + } + }) + }, 3000); + + if(showProgress) { + const nextPosition = document.getElementById('start-vsam-progress'); + nextPosition?.scrollIntoView({ behavior: 'smooth', block: 'start' }); + } + } + return () => { + clearInterval(timer); + }; + }, [showProgress, stateUpdated]); + + useEffect(() => { + verifyAndSetVsamInitCompletion(vsamInitProgress); + }, [vsamInitProgress]); + + const setVsamInitializationProgress = (vsamInitState: InitSubStepsState) => { + setVsamInitProgress(vsamInitState); + setVsamInitState(vsamInitState); + verifyAndSetVsamInitCompletion(vsamInitState); + } + + const verifyAndSetVsamInitCompletion = (vsamInitState: InitSubStepsState, selectedStorageMode?: string) => { + const allAttributesTrue = Object.values(vsamInitState).every(value => value === true); + if(allAttributesTrue) { + dispatchActions(true); + setShowProgress(initClicked || getProgress('cachingServiceStatus')); + } else if (selectedStorageMode && selectedStorageMode.toUpperCase() == 'VSAM') { + dispatchActions(false); + setShowProgress(false); + } + } + + const setStageSkipStatus = (status: boolean) => { + stages[STAGE_ID].subStages[SUB_STAGE_ID].isSkipped = status; + stages[STAGE_ID].isSkipped = !isInitializationStageComplete(); + setStageStatus(status); + } + + const updateProgress = (status: boolean) => { + setStateUpdated(!stateUpdated); + if(!status) { + for (let key in vsamInitProgress) { + vsamInitProgress[key as keyof(InitSubStepsState)] = false; + setVsamInitState(vsamInitProgress); + } + } + const allAttributesTrue = Object.values(vsamInitProgress).every(value => value === true); + status = allAttributesTrue ? true : false; + setVsamInitializationProgress(getVsamInitState()); + dispatchActions(status); + } + + const dispatchActions = (status: boolean) => { + dispatch(setCachingServiceStatus(status)); + dispatch(setInitializationStatus(isInitializationStageComplete())); + dispatch(setNextStepEnabled(status)); + setStageSkipStatus(!status); + } + + const toggleEditorVisibility = (type: any) => { + setContentType(type); + setEditorVisible(!editorVisible); + }; + + const process = async (event: any) => { + alertEmitter.emit('hideAlert'); + + setInitClicked(true); + updateProgress(false); + event.preventDefault(); + + if(!installationArgs.dryRunMode){ + window.electron.ipcRenderer.initVsamButtonOnClick(connectionArgs, installationArgs).then((res: IResponse) => { + updateProgress(res.status); + if(res.error) { + alertEmitter.emit('showAlert', res.errorMsg+" "+defaultErrorMessage, 'error'); + } + clearInterval(timer); + }).catch((err: any) => { + clearInterval(timer); + updateProgress(false); + window.electron.ipcRenderer.setStandardOutput(`zwe init vsam failed: ${typeof err === "string" ? err : err.toString()}`).then((res: any) => { + toggleEditorVisibility("output"); + }) + }); + } + else{ + setVsamInitState({ + writeYaml: true, + uploadYaml: true, + success: true + }); + updateProgress(true); + } + } + + const handleFormChange = (data: any) => { + alertEmitter.emit('hideAlert'); + + let newData = init ? (Object.keys(setupYaml).length > 0 ? setupYaml : data?.zowe?.setup?.vsam) : (data?.zowe?.setup?.vsam ? data?.zowe?.setup?.vsam : data); + setInit(false); + + if (newData) { + if(validate) { + validate(newData); + + if(validate.errors) { + setAllowInitialization(false); + const { schemaPath, message } = validate.errors[0]; + let errorText = `${schemaPath} ${message}`; + setStageConfig(false, errorText); + } else { + setAllowInitialization(true); + setStageConfig(true, ''); + } + + let yamlData = {...yaml}; + if(setupSchema?.properties?.name) { + if(!newData.name) { + setAllowInitialization(false); + } else { + yamlData = handleUpdateVsamName(newData.name); + } + } + + const updatedYaml = {...yamlData, zowe: {...yamlData.zowe, setup: {...yamlData.zowe.setup, vsam: newData}}}; + setYamlConfig(updatedYaml); + } + } + }; + + const setYamlConfig = (updatedYaml: any) => { + window.electron.ipcRenderer.setConfig(updatedYaml); + dispatch(setYaml(updatedYaml)); + } + + const setStageConfig = (isValid: boolean, errorMsg: string) => { + setIsFormValid(isValid); + setFormError(errorMsg); + } + + const handleUpdateVsamName = (newName: string): any => { + const updatedYaml = { + ...yaml, + components: { + ...yaml.components, + 'caching-service': { + ...yaml.components['caching-service'], + storage: { + ...yaml.components['caching-service']?.storage, + vsam: { + ...yaml.components['caching-service']?.storage?.vsam, + name: newName + } + } + } + } + }; + return updatedYaml; + }; + + const datasetValidation = (dsName: string) => { + const DsNamePattern = "^(?=.{1,38}$)[a-zA-Z#$@][a-zA-Z0-9#$@-]{0,7}([.][a-zA-Z#$@][a-zA-Z0-9#$@-]{0,7}){0,21}$"; + const regEx = new RegExp(DsNamePattern); + setAllowInitialization(regEx.test(dsName)); + } + + const cachingServiceChangeHandler = (newValue: string) => { + alertEmitter.emit('hideAlert'); + datasetValidation(newValue); + const updatedYaml = handleUpdateVsamName(newValue); + setYamlConfig(updatedYaml); + } + + const updateStorageMode = (event: any) => { + setStorageMode(event.target.value); + const updatedYaml = { + ...yaml, + components: { + ...yaml.components, + 'caching-service': { + ...yaml.components['caching-service'], + storage: { + ...yaml.components['caching-service']?.storage, + mode: event.target.value + } + } + } + }; + setYamlConfig(updatedYaml); + + if(event.target.value.toUpperCase() !== 'VSAM') { + dispatchActions(true); + setShowProgress(false); + } else { + verifyAndSetVsamInitCompletion(vsamInitProgress, event.target.value); + } + } + + return ( +
+ + + + + + + + { editorVisible && + + } + + + {!isFormValid &&
{formError}
} + + { showStorageModeOptions && + + Storage Mode + + + } + + { storageMode.toUpperCase() !== 'VSAM' ? + <> : ( + <> + handleFormChange(data)} formData={setupYaml}/> + + { showVsameDatsetName && + +
+ { + cachingServiceChangeHandler(e.target.value); + }} + /> + {allowInitialization &&

Zowe Caching Service VSAM data set.

} + {!allowInitialization &&

Invalid input. Please enter a valid VSAM dataset name.

} +
+
+ } + + { !showProgress ? + + + : + null + } + + + {!showProgress ? null : + + + + + + + } + + + )} + +
+ + +
+
+ ); +}; + +export default CachingService; \ No newline at end of file diff --git a/src/renderer/components/stages/Certificates.tsx b/src/renderer/components/stages/Certificates.tsx index 2195ce9a..b02b6c39 100644 --- a/src/renderer/components/stages/Certificates.tsx +++ b/src/renderer/components/stages/Certificates.tsx @@ -8,16 +8,14 @@ * Copyright Contributors to the Zowe Project. */ -import { useState, useEffect } from "react"; -import { Box, Button, FormControl } from '@mui/material'; +import { useState, useEffect, useRef } from "react"; +import { Box, Button, FormControl, FormHelperText, MenuItem, Select } from '@mui/material'; import { useAppSelector, useAppDispatch } from '../../hooks'; -import { setSecurityStatus, setInitializationStatus, selectCertificateStatus, setCertificateStatus, selectInitializationStatus } from './progress/progressSlice'; -import { selectYaml, selectSchema, setNextStepEnabled, setYaml, setSchema } from '../configuration-wizard/wizardSlice'; +import { setInitializationStatus, setCertificateStatus } from './progress/progressSlice'; +import { selectYaml, selectSchema, setNextStepEnabled, setYaml } from '../configuration-wizard/wizardSlice'; import ContainerCard from '../common/ContainerCard'; import JsonForm from '../common/JsonForms'; import EditorDialog from "../common/EditorDialog"; -import Ajv from "ajv"; -import { selectInstallationArgs } from "./installation/installationSlice"; import { selectConnectionArgs } from "./connection/connectionSlice"; import { IResponse } from "../../../../src/types/interfaces"; import React from "react"; @@ -25,94 +23,55 @@ import ProgressCard from "../common/ProgressCard"; import { createTheme } from '@mui/material/styles'; import { stages } from "../configuration-wizard/Wizard"; import { setActiveStep } from "./progress/activeStepSlice"; -import { getStageDetails, getSubStageDetails } from "../../../utils/StageDetails"; -import { setProgress, getProgress, setCertificateInitState, getCertificateInitState, mapAndSetSkipStatus, getInstallationArguments } from "./progress/StageProgressStatus"; +import { getStageDetails, getSubStageDetails } from "../../../services/StageDetails"; +import { getProgress, setCertificateInitState, getCertificateInitState, updateSubStepSkipStatus, getInstallationArguments, isInitializationStageComplete } from "./progress/StageProgressStatus"; import { CertInitSubStepsState } from "../../../types/stateInterfaces"; -import { FALLBACK_YAML, FALLBACK_SCHEMA } from "../../..//utils/yamlSchemaDefaults"; +import { TYPE_YAML, TYPE_OUTPUT, INIT_STAGE_LABEL, CERTIFICATES_STAGE_LABEL, ajv, deepMerge } from "../common/Utils"; const Certificates = () => { - const theme = createTheme(); + const [theme] = useState(createTheme()); - const stageLabel = 'Initialization'; - const subStageLabel = 'Certificates'; - - const STAGE_ID = getStageDetails(stageLabel).id; - const SUB_STAGES = !!getStageDetails(stageLabel).subStages; - const SUB_STAGE_ID = SUB_STAGES ? getSubStageDetails(STAGE_ID, subStageLabel).id : 0; + const [STAGE_ID] = useState(getStageDetails(INIT_STAGE_LABEL).id); + const [SUB_STAGES] = useState(!!getStageDetails(INIT_STAGE_LABEL).subStages); + const [SUB_STAGE_ID] = useState(SUB_STAGES ? getSubStageDetails(STAGE_ID, CERTIFICATES_STAGE_LABEL).id : 0); const dispatch = useAppDispatch(); const [schema, setLocalSchema] = useState(useAppSelector(selectSchema)); - const [yaml, setLYaml] = useState(useAppSelector(selectYaml)); - const connectionArgs = useAppSelector(selectConnectionArgs); - const installationArgs = getInstallationArguments(); - const setupSchema = schema ? schema.properties.zowe.properties.setup.properties.certificate : ""; - const verifyCertsSchema = schema ? {"type": "object", "properties": {"verifyCertificates": schema.properties.zowe.properties.verifyCertificates}} : ""; - const [setupYaml, setSetupYaml] = useState(yaml?.zowe?.setup?.certificate); - const [verifyCertsYaml, setVerifyCertsYaml] = useState({verifyCertificates: yaml?.zowe?.verifyCertificates}) + const yaml = useAppSelector(selectYaml); + const [connectionArgs] = useState(useAppSelector(selectConnectionArgs)); + const [installationArgs] = useState(getInstallationArguments()); + const [setupSchema] = useState(schema?.properties?.zowe?.properties?.setup?.properties?.certificate); + const setupYaml = yaml?.zowe?.setup?.certificate; + const [verifyCerts, setVerifyCerts] = useState(yaml?.zowe?.verifyCertificates ?? "STRICT"); const [isFormInit, setIsFormInit] = useState(false); - const [initializeForm, setInitializeForm] = useState(false); const [editorVisible, setEditorVisible] = useState(false); const [showProgress, setShowProgress] = useState(getProgress('certificateStatus')); const [isFormValid, setIsFormValid] = useState(false); const [formError, setFormError] = useState(''); const [contentType, setContentType] = useState(''); - const [reinit, setReinit] = useState(false); - - const section = 'certificate'; - const [certificateInitProgress, setCertificateInitProgress] = useState(getCertificateInitState()); const [stateUpdated, setStateUpdated] = useState(false); const [initClicked, setInitClicked] = useState(false); + const [reinit, setReinit] = useState(false); + const [stageStatus, setStageStatus] = useState(stages[STAGE_ID].subStages[SUB_STAGE_ID].isSkipped); + const stageStatusRef = useRef(stageStatus); let timer: any; - const TYPE_YAML = "yaml"; - const TYPE_JCL = "jcl"; - const TYPE_OUTPUT = "output"; - - const ajv = new Ajv(); - ajv.addKeyword("$anchor"); - let certificateSchema; - let validate: any; - let validateVerifyCertSchema: any; - if(schema) { - certificateSchema = schema?.properties?.zowe?.properties?.setup?.properties?.certificate; - } - if(certificateSchema) { - validate = ajv.compile(certificateSchema); - } - - if(verifyCertsSchema) { - validateVerifyCertSchema = ajv.compile(verifyCertsSchema); - } + const [validate] = useState(() => ajv.getSchema("https://zowe.org/schemas/v2/server-base") || ajv.compile(setupSchema)) useEffect(() => { + stageStatusRef.current = stageStatus; + }, [stageStatus]); - if(!yaml){ - window.electron.ipcRenderer.getConfig().then((res: IResponse) => { - if (res.status) { - dispatch(setYaml(res.details)); - setLYaml(res.details); - } else { - dispatch(setYaml(FALLBACK_YAML)); - setLYaml(FALLBACK_YAML); - } - }) - } + useEffect(() => { + const stepProgress = getProgress('certificateStatus'); - if(!schema){ - window.electron.ipcRenderer.getSchema().then((res: IResponse) => { - if (res.status) { - dispatch(setSchema(res.details)); - } else { - dispatch(setSchema(FALLBACK_SCHEMA)); - setLocalSchema(FALLBACK_SCHEMA) - } - }) - } + dispatch(setInitializationStatus(isInitializationStageComplete())); + setShowProgress(initClicked || stepProgress); - if(getProgress('certificateStatus')) { + if(stepProgress) { const nextPosition = document.getElementById('start-certificate-progress'); nextPosition.scrollIntoView({ behavior: 'smooth', block: 'start' }); } else { @@ -120,11 +79,12 @@ const Certificates = () => { nextPosition.scrollIntoView({behavior: 'smooth'}); } - setShowProgress(initClicked || getProgress('certificateStatus')); - updateProgress(getProgress('certificateStatus')); + dispatch(setNextStepEnabled(stepProgress)); + setIsFormInit(true); return () => { + updateSubStepSkipStatus(SUB_STAGE_ID, stageStatusRef.current); dispatch(setActiveStep({ activeStepIndex: STAGE_ID, isSubStep: SUB_STAGES, activeSubStepIndex: SUB_STAGE_ID })); } }, []); @@ -135,6 +95,8 @@ const Certificates = () => { if(initClicked) { let nextPosition = document.getElementById('start-certificate-progress'); nextPosition?.scrollIntoView({ behavior: 'smooth', block: 'start' }); + dispatchActions(false); + setStateUpdated(!stateUpdated); } }, [initClicked]); @@ -143,7 +105,10 @@ const Certificates = () => { if(!getProgress('certificateStatus') && initClicked) { timer = setInterval(() => { window.electron.ipcRenderer.getCertificateProgress().then((res: any) => { - setCertificateInitializationProgress(res) + setCertificateInitializationProgress(res); + if(res.success){ + clearInterval(timer); + } }) }, 3000); } @@ -161,8 +126,7 @@ const Certificates = () => { useEffect(() => { const allAttributesTrue = Object.values(certificateInitProgress).every(value => value === true); if(allAttributesTrue) { - dispatch(setNextStepEnabled(true)); - dispatch(setCertificateStatus(true)); + dispatchActions(true); setShowProgress(initClicked || getProgress('certificateStatus')); } }, [certificateInitProgress]); @@ -172,21 +136,18 @@ const Certificates = () => { setCertificateInitState(certificateInitState); const allAttributesTrue = Object.values(certificateInitState).every(value => value === true); if(allAttributesTrue) { - dispatch(setNextStepEnabled(true)); - dispatch(setCertificateStatus(true)); + dispatchActions(true); } } const setStageSkipStatus = (status: boolean) => { stages[STAGE_ID].subStages[SUB_STAGE_ID].isSkipped = status; - stages[STAGE_ID].isSkipped = status; - mapAndSetSkipStatus(SUB_STAGE_ID, status); + stages[STAGE_ID].isSkipped = !isInitializationStageComplete(); + setStageStatus(status); } const updateProgress = (status: boolean) => { setStateUpdated(!stateUpdated); - setStageSkipStatus(!status); - if(!status) { for (let key in certificateInitProgress) { certificateInitProgress[key as keyof(CertInitSubStepsState)] = false; @@ -195,10 +156,15 @@ const Certificates = () => { } const allAttributesTrue = Object.values(certificateInitProgress).every(value => value === true); status = allAttributesTrue ? true : false; - dispatch(setNextStepEnabled(status)); - dispatch(setInitializationStatus(status)); - dispatch(setCertificateStatus(status)); setCertificateInitializationProgress(getCertificateInitState()); + dispatchActions(status); + } + + const dispatchActions = (status: boolean) => { + dispatch(setCertificateStatus(status)); + dispatch(setInitializationStatus(isInitializationStageComplete())); + dispatch(setNextStepEnabled(status)); + setStageSkipStatus(!status); } const reinitialize = (event: any) => { @@ -206,18 +172,44 @@ const Certificates = () => { process(event); } - const process = async(event: any) => { + const process = async (event: any) => { setInitClicked(true); updateProgress(false); event.preventDefault(); - window.electron.ipcRenderer.initCertsButtonOnClick(connectionArgs, installationArgs, (await window.electron.ipcRenderer.getConfig()).details ?? yaml).then((res: IResponse) => { - updateProgress(res.status); - clearInterval(timer); - }).catch(() => { + if(!installationArgs.dryRunMode){ + window.electron.ipcRenderer.initCertsButtonOnClick(connectionArgs, installationArgs).then((res: IResponse) => { + clearInterval(timer); + updateProgress(res.status); + if(!res.status){ + window.electron.ipcRenderer.setStandardOutput(JSON.stringify(res.details.jobOutput, null, 2)).then((res: any) => { + toggleEditorVisibility("output"); + }) + } + if(res.details.updatedYaml != undefined){ + const updatedCerts = res.details.updatedYaml.zowe?.certificate; + const updatedYaml = {...yaml, zowe: {...yaml.zowe, certificate: updatedCerts}}; + window.electron.ipcRenderer.setConfig(updatedYaml); + dispatch(setYaml(updatedYaml)); + } + }).catch((e: any) => { clearInterval(timer); updateProgress(false); - console.warn('zwe init certificate failed'); + console.warn('zwe init certificate failed', e); + window.electron.ipcRenderer.setStandardOutput(`zwe init certificate failed: ${e}`).then((res: any) => { + toggleEditorVisibility("output"); + }) }); + } + else{ + setCertificateInitState( + { + writeYaml: true, + uploadYaml: true, + zweInitCertificate: true + } + ) + updateProgress(true); + } } const toggleEditorVisibility = (type: any) => { @@ -225,86 +217,107 @@ const Certificates = () => { setEditorVisible(!editorVisible); }; - const handleFormChange = (data: any, isYamlUpdated?: boolean) => { - const newData = isFormInit ? (Object.keys(setupYaml).length > 0 ? setupYaml : data.zowe.setup.certificate) : (data.zowe?.setup?.certificate ? data.zowe.setup.certificate : data); + const handleFormChange = (data: any, schemaOption?: any) => { + if(data?.zowe?.verifyCertificates){ + setVerifyCerts(data.zowe.verifyCertificates); + } + let newData = isFormInit ? (Object.keys(setupYaml).length > 0 ? setupYaml : data?.zowe?.setup?.certificate) : (data?.zowe?.setup?.certificate ? data?.zowe?.setup?.certificate : data); setIsFormInit(false); if (newData) { - if(validate) { validate(newData); + if(validate.errors) { - const errPath = validate.errors[0].schemaPath; - const errMsg = validate.errors[0].message; - setStageConfig(false, errPath+' '+errMsg, newData); - window.electron.ipcRenderer.setConfig({...yaml, zowe: {...yaml?.zowe, setup: {...yaml?.zowe?.setup, certificate: newData}}}); + const { schemaPath, message } = validate.errors[0]; + let errorText = `${schemaPath} ${message}`; + + if(schemaOption !== undefined && schemaOption !== null) { + validate.errors.forEach(err => { + if (err.schemaPath.includes(schemaOption)) { + errorText = err.message; + } + }) + } + + setStageConfig(false, errorText, newData); } else { - // setConfiguration(section, newData, true); - setLYaml((prevYaml: any) => ({ - ...prevYaml, zowe: {...yaml?.zowe, setup: {...yaml?.zowe?.setup, certificate: newData}} - })) - // dispatch(setYaml({...yaml, zowe: {...yaml.zowe, setup: {...yaml.zowe.setup, certificate: newData}}})) - window.electron.ipcRenderer.setConfig({...yaml, zowe: {...yaml?.zowe, setup: {...yaml?.zowe?.setup, certificate: newData}}}); setStageConfig(true, '', newData); } - } - } - }; - const handleVerifyCertsChange = (e: any) => { - if(e.verifyCertificates){ - if(validateVerifyCertSchema){ - validateVerifyCertSchema(e); - if(validateVerifyCertSchema.errors) { - const errPath = validateVerifyCertSchema.errors[0].schemaPath; - const errMsg = validateVerifyCertSchema.errors[0].message; - setIsFormValid(false); - setFormError(errPath+' '+errMsg); - window.electron.ipcRenderer.setConfig({...yaml, zowe: {...yaml?.zowe, verifyCertificates: e.verifyCertificates}}) - dispatch(setNextStepEnabled(false)); - } else { - setVerifyCertsYaml({'verifyCertificates': e.verifyCertificates}); - setIsFormValid(true); - window.electron.ipcRenderer.setConfig({...yaml, zowe: {...yaml?.zowe, verifyCertificates: e.verifyCertificates}}) - } + const updatedYaml = {...yaml, zowe: {...yaml.zowe, setup: {...yaml.zowe.setup, certificate: newData}}}; + window.electron.ipcRenderer.setConfig(updatedYaml); + dispatch(setYaml(updatedYaml)); } } - } + }; const setStageConfig = (isValid: boolean, errorMsg: string, data: any) => { setIsFormValid(isValid); setFormError(errorMsg); - setSetupYaml(data); } return (
- + {/* */} - {editorVisible && } - dispatch(setYaml((await window.electron.ipcRenderer.getConfig()).details ?? yaml))}> + {editorVisible && { + if(data?.zowe?.verifyCertificates){ + setVerifyCerts(data.zowe.verifyCertificates); + } + const newData = isFormInit ? (Object.keys(setupYaml).length > 0 ? setupYaml : data?.zowe?.setup?.certificate) : (data?.zowe?.setup?.certificate ? data?.zowe?.setup?.certificate : data); + setStageConfig(true, '', newData); + } + }/> } + {!isFormValid &&
{formError}
} - - + +

Verify Certificates

+ + + {schema?.properties?.zowe?.properties?.verifyCertificates.description} + {!showProgress ? : null}
{!showProgress ? null : - - - - + + + + } - +
); diff --git a/src/renderer/components/stages/InitApfAuth.tsx b/src/renderer/components/stages/InitApfAuth.tsx index 5211b172..7178714f 100644 --- a/src/renderer/components/stages/InitApfAuth.tsx +++ b/src/renderer/components/stages/InitApfAuth.tsx @@ -8,106 +8,66 @@ * Copyright Contributors to the Zowe Project. */ -import React, {useEffect, useState} from "react"; +import React, {useEffect, useRef, useState} from "react"; import { Box, Button, FormControl, TextField, Typography } from '@mui/material'; import { useAppSelector, useAppDispatch } from '../../hooks'; -import { selectYaml, selectSchema, setNextStepEnabled, setLoading, setYaml, setSchema } from '../configuration-wizard/wizardSlice'; +import { selectYaml, selectSchema, setNextStepEnabled } from '../configuration-wizard/wizardSlice'; import { selectConnectionArgs } from './connection/connectionSlice'; -import { setApfAuthStatus, setInitializationStatus, selectApfAuthStatus, selectInitializationStatus } from './progress/progressSlice'; +import { setApfAuthStatus, setInitializationStatus} from './progress/progressSlice'; import { IResponse } from '../../../types/interfaces'; import ProgressCard from '../common/ProgressCard'; import ContainerCard from '../common/ContainerCard'; import EditorDialog from "../common/EditorDialog"; -import Ajv from "ajv"; -import { selectInstallationArgs } from "./installation/installationSlice"; import { createTheme } from '@mui/material/styles'; +import { alertEmitter } from "../Header"; import { stages } from "../configuration-wizard/Wizard"; -import { setActiveStep, selectActiveStepIndex, selectActiveSubStepIndex, selectIsSubstep } from "./progress/activeStepSlice"; -import { getStageDetails, getSubStageDetails } from "../../../utils/StageDetails"; -import { setProgress, getProgress, setApfAuthState, getApfAuthState, mapAndSetSkipStatus, getInstallationArguments } from "./progress/StageProgressStatus"; +import { setActiveStep } from "./progress/activeStepSlice"; +import { getStageDetails, getSubStageDetails } from "../../../services/StageDetails"; +import { getProgress, setApfAuthState, getApfAuthState, updateSubStepSkipStatus, getInstallationArguments, isInitializationStageComplete } from "./progress/StageProgressStatus"; import { InitSubStepsState } from "../../../types/stateInterfaces"; -import { FALLBACK_SCHEMA, FALLBACK_YAML } from "../../../utils/yamlSchemaDefaults"; +import { JCL_UNIX_SCRIPT_OK, FALLBACK_YAML, INIT_STAGE_LABEL, APF_AUTH_STAGE_LABEL, ajv, SERVER_COMMON } from "../common/Utils"; const InitApfAuth = () => { // TODO: Display granular details of installation - downloading - unpacking - running zwe command - const stageLabel = 'Initialization'; - const subStageLabel = 'APF Auth'; - const STAGE_ID = getStageDetails(stageLabel).id; - const SUB_STAGES = !!getStageDetails(stageLabel).subStages; - const SUB_STAGE_ID = SUB_STAGES ? getSubStageDetails(STAGE_ID, subStageLabel).id : 0; + const [STAGE_ID] = useState(getStageDetails(INIT_STAGE_LABEL).id); + const [SUB_STAGES] = useState(!!getStageDetails(INIT_STAGE_LABEL).subStages); + const [SUB_STAGE_ID] = useState(SUB_STAGES ? getSubStageDetails(STAGE_ID, APF_AUTH_STAGE_LABEL).id : 0); - const theme = createTheme(); - - const activeStep = useAppSelector(selectActiveStepIndex); - const isSubStep = useAppSelector(selectIsSubstep); - const activeSubStepIndex = useAppSelector(selectActiveSubStepIndex); + const [theme] = useState(createTheme()); const dispatch = useAppDispatch(); const [schema, setLocalSchema] = useState(useAppSelector(selectSchema)); - const [yaml, setLYaml] = useState(useAppSelector(selectYaml)); - const connectionArgs = useAppSelector(selectConnectionArgs); - const setupSchema = schema?.properties?.zowe?.properties?.setup?.properties?.dataset; - const [setupYaml, setSetupYaml] = useState(yaml?.zowe?.setup?.dataset); + const [yaml, setLocalYaml] = useState(useAppSelector(selectYaml)); + const [connectionArgs] = useState(useAppSelector(selectConnectionArgs)); + const [setupYaml, setSetupYaml] = useState(yaml?.zowe?.setup?.dataset || FALLBACK_YAML.zowe.setup.dataset); const [showProgress, setShowProgress] = useState(getProgress('apfAuthStatus')); const [init, setInit] = useState(false); const [editorVisible, setEditorVisible] = useState(false); - const [isFormValid, setIsFormValid] = useState(false); - const [formError, setFormError] = useState(''); const [contentType, setContentType] = useState(''); const [apfAuthInitProgress, setApfAuthInitProgress] = useState(getApfAuthState()); const [stateUpdated, setStateUpdated] = useState(false); const [initClicked, setInitClicked] = useState(false); const [reinit, setReinit] = useState(false); + const [stageStatus, setStageStatus] = useState(stages[STAGE_ID].subStages[SUB_STAGE_ID].isSkipped); + const stageStatusRef = useRef(stageStatus); - const installationArgs = getInstallationArguments(); + const [installationArgs] = useState(getInstallationArguments()); let timer: any; - - const section = 'dataset'; - - const ajv = new Ajv(); - ajv.addKeyword("$anchor"); - let datasetSchema; - let validate: any; - if(schema) { - datasetSchema = schema.properties.zowe.properties.setup.properties.dataset; - } - - if(datasetSchema) { - validate = ajv.compile(datasetSchema); - } - - const isStepSkipped = !useAppSelector(selectApfAuthStatus); - const isInitializationSkipped = !useAppSelector(selectInitializationStatus); - + useEffect(() => { - if(!yaml){ - window.electron.ipcRenderer.getConfig().then((res: IResponse) => { - if (res.status) { - dispatch(setYaml(res.details)); - setLYaml(res.details); - } else { - dispatch(setYaml(FALLBACK_YAML)); - setLYaml(FALLBACK_YAML); - } - }) - } + stageStatusRef.current = stageStatus; + }, [stageStatus]); - if(!schema){ - window.electron.ipcRenderer.getSchema().then((res: IResponse) => { - if (res.status) { - dispatch(setSchema(res.details)); - } else { - dispatch(setSchema(FALLBACK_SCHEMA)); - setLocalSchema(FALLBACK_SCHEMA); - } - }) - } + useEffect(() => { + dispatch(setInitializationStatus(isInitializationStageComplete())); let nextPosition; - if(getProgress('apfAuthStatus')) { + const stepProgress = getProgress('apfAuthStatus') + + if(stepProgress) { nextPosition = document.getElementById('start-apf-progress'); nextPosition?.scrollIntoView({ behavior: 'smooth', block: 'start' }); } else { @@ -115,10 +75,12 @@ const InitApfAuth = () => { nextPosition?.scrollIntoView({behavior: 'smooth'}); } - updateProgress(getProgress('apfAuthStatus')); + dispatch(setNextStepEnabled(stepProgress)); + setInit(true); return () => { + updateSubStepSkipStatus(SUB_STAGE_ID, stageStatusRef.current); dispatch(setActiveStep({ activeStepIndex: STAGE_ID, isSubStep: SUB_STAGES, activeSubStepIndex: SUB_STAGE_ID })); } }, []); @@ -134,25 +96,28 @@ const InitApfAuth = () => { nextPosition = document.getElementById('start-apf-progress'); nextPosition.scrollIntoView({ behavior: 'smooth', block: 'start' }); } + dispatchActions(false); setStateUpdated(!stateUpdated); - dispatch(setApfAuthStatus(false)); } }, [initClicked]); useEffect(() => { const allAttributesTrue = Object.values(apfAuthInitProgress).every(value => value === true); if(allAttributesTrue) { - dispatch(setNextStepEnabled(true)); - dispatch(setApfAuthStatus(true)); setShowProgress(initClicked || getProgress('apfAuthStatus')); + dispatchActions(true); } }, [apfAuthInitProgress]); useEffect(() => { - if(!getProgress('apfAuthStatus') && initClicked) { + const stageComplete = apfAuthInitProgress.success; + if(!stageComplete && showProgress) { timer = setInterval(() => { window.electron.ipcRenderer.getApfAuthProgress().then((res: any) => { setApfAuthorizationInitProgress(res); + if(res.success){ + clearInterval(timer); + } }) }, 3000); } @@ -167,21 +132,18 @@ const InitApfAuth = () => { setApfAuthInitProgress(aftAuthorizationState); const allAttributesTrue = Object.values(aftAuthorizationState).every(value => value === true); if(allAttributesTrue) { - dispatch(setNextStepEnabled(true)); - dispatch(setApfAuthStatus(true)); + dispatchActions(true); } } const setStageSkipStatus = (status: boolean) => { stages[STAGE_ID].subStages[SUB_STAGE_ID].isSkipped = status; - stages[STAGE_ID].isSkipped = status; - mapAndSetSkipStatus(SUB_STAGE_ID, status); + stages[STAGE_ID].isSkipped = !isInitializationStageComplete(); + setStageStatus(status); } const updateProgress = (status: boolean) => { setStateUpdated(!stateUpdated); - setStageSkipStatus(!status); - if(!status) { for (let key in apfAuthInitProgress) { apfAuthInitProgress[key as keyof(InitSubStepsState)] = false; @@ -190,10 +152,15 @@ const InitApfAuth = () => { } const allAttributesTrue = Object.values(apfAuthInitProgress).every(value => value === true); status = allAttributesTrue ? true : false; - dispatch(setNextStepEnabled(status)); - dispatch(setInitializationStatus(status)); - dispatch(setApfAuthStatus(status)); setApfAuthorizationInitProgress(getApfAuthState()); + dispatchActions(status); + } + + const dispatchActions = (status: boolean) => { + dispatch(setApfAuthStatus(status)); + dispatch(setInitializationStatus(isInitializationStageComplete())); + dispatch(setNextStepEnabled(status)); + setStageSkipStatus(!status); } const toggleEditorVisibility = (type: any) => { @@ -206,22 +173,49 @@ const InitApfAuth = () => { process(event); } - const process = (event: any) => { + const process = async (event: any) => { setInitClicked(true); updateProgress(false); event.preventDefault(); - window.electron.ipcRenderer.apfAuthButtonOnClick(connectionArgs, installationArgs, yaml).then((res: IResponse) => { - updateProgress(res.status); - clearInterval(timer); - }).catch(() => { + if(!installationArgs.dryRunMode){ + window.electron.ipcRenderer.apfAuthButtonOnClick(connectionArgs, installationArgs).then((res: IResponse) => { + // Some parts of Wizard pass the response as a string directly into the object + if (res.status == false && typeof res.details == "string") { + res.details = { 3: res.details }; + } + if (res?.details && res.details[3] && res.details[3].indexOf(JCL_UNIX_SCRIPT_OK) == -1) { // This check means we got an error during zwe init apfAuth + alertEmitter.emit('showAlert', 'Please view Job Output for more details', 'error'); + window.electron.ipcRenderer.setStandardOutput(res.details[3]).then((res: any) => { + toggleEditorVisibility("output"); + }) + updateProgress(false); //res.status may not necessarily be false, even if things go wrong + clearInterval(timer); + } else { + updateProgress(res.status); + clearInterval(timer); + } + }).catch((err: any) => { clearInterval(timer); updateProgress(false); - console.warn('zwe init apfauth failed'); + // TODO: Test this + //alertEmitter.emit('showAlert', err.toString(), 'error'); + window.electron.ipcRenderer.setStandardOutput(`zwe init apfauth failed: ${typeof err === "string" ? err : err.toString()}`).then((res: any) => { + toggleEditorVisibility("output"); + }) }); + } + else{ + setApfAuthState({ + writeYaml: true, + uploadYaml: true, + success: true + }); + updateProgress(true); + } } const formChangeHandler = (data: any, isYamlUpdated?: boolean) => { - let updatedData = init ? (Object.keys(yaml?.zowe.setup.dataset).length > 0 ? yaml?.zowe.setup.dataset : data) : (data ? data : yaml?.zowe.setup.datasetg); + let updatedData = init ? (Object.keys(yaml?.zowe.setup.dataset).length > 0 ? yaml?.zowe.setup.dataset : data) : (data ? data : yaml?.zowe.setup.dataset); setInit(false); @@ -236,37 +230,20 @@ const InitApfAuth = () => { }, {}); } - if(validate) { - validate(updatedData); - if(validate.errors) { - const errPath = validate.errors[0].schemaPath; - const errMsg = validate.errors[0].message; - setStageConfig(false, errPath+' '+errMsg, updatedData, false); - } else { - // setConfiguration(section, updatedData, true); - setStageConfig(true, '', updatedData, true); - } - } - } - - const setStageConfig = (isValid: boolean, errorMsg: string, data: any, proceed: boolean) => { - setIsFormValid(isValid); - setFormError(errorMsg); - setSetupYaml(data); - updateProgress(proceed); + setSetupYaml(updatedData); } return (
- + {/* */} - {`Please review the following dataset setup configuration values before pressing run.\n`} + {`Please review the following dataset setup configuration values before pressing run. If you need to make changes, go back to the previous step.\n`} { : null} {!showProgress ? null : - - - - + + + + } - +
diff --git a/src/renderer/components/stages/Initialization.tsx b/src/renderer/components/stages/Initialization.tsx index 9f37ece3..a60fe812 100644 --- a/src/renderer/components/stages/Initialization.tsx +++ b/src/renderer/components/stages/Initialization.tsx @@ -12,14 +12,16 @@ import React, {useEffect} from "react"; import { useAppDispatch } from '../../hooks'; import ContainerCard from '../common/ContainerCard'; import { setActiveStep } from "./progress/activeStepSlice"; +import { getStageDetails } from "../../../../src/services/StageDetails"; const Initialization = () => { - const STAGE_ID = 3; - const SUB_STAGES = true; - const dispatch = useAppDispatch(); + const stageLabel = 'Initialization'; + const STAGE_ID = getStageDetails(stageLabel).id; + const SUB_STAGES = true; + useEffect(() => { return () => { dispatch(setActiveStep({ activeStepIndex: STAGE_ID, isSubStep: SUB_STAGES, activeSubStepIndex: 0 })); diff --git a/src/renderer/components/stages/LaunchConfig.tsx b/src/renderer/components/stages/LaunchConfig.tsx index 873e64b0..a94f988c 100644 --- a/src/renderer/components/stages/LaunchConfig.tsx +++ b/src/renderer/components/stages/LaunchConfig.tsx @@ -8,32 +8,30 @@ * Copyright Contributors to the Zowe Project. */ -import { useState, useEffect } from "react"; +import { useState, useEffect, useRef } from "react"; import { Box, Button } from '@mui/material'; import { useAppSelector, useAppDispatch } from '../../hooks'; -import { selectYaml, selectSchema, setNextStepEnabled, setYaml } from '../configuration-wizard/wizardSlice'; +import { selectYaml,setNextStepEnabled, setYaml } from '../configuration-wizard/wizardSlice'; import ContainerCard from '../common/ContainerCard'; import JsonForm from '../common/JsonForms'; import EditorDialog from "../common/EditorDialog"; -import Ajv from "ajv"; import { createTheme } from '@mui/material/styles'; -import { getStageDetails, getSubStageDetails } from "../../../utils/StageDetails"; +import { getStageDetails, getSubStageDetails } from "../../../services/StageDetails"; import { stages } from "../configuration-wizard/Wizard"; -import { selectInitializationStatus } from "./progress/progressSlice"; +import { selectInitializationStatus, setInitializationStatus, setLaunchConfigStatus } from "./progress/progressSlice"; import { setActiveStep } from "./progress/activeStepSlice"; -import { FALLBACK_YAML } from "../../../utils/yamlSchemaDefaults"; -import { IResponse } from "../../..//types/interfaces"; +import { TYPE_YAML, TYPE_OUTPUT, FALLBACK_YAML, ajv, INIT_STAGE_LABEL, LAUNCH_CONFIG_STAGE_LABEL } from "../common/Utils"; +import { IResponse } from "../../../types/interfaces"; +import { getInstallationArguments, getProgress, isInitializationStageComplete, updateSubStepSkipStatus } from "./progress/StageProgressStatus"; +import { selectConnectionArgs } from "./connection/connectionSlice"; +import { alertEmitter } from "../Header"; const LaunchConfig = () => { - const theme = createTheme(); - - const stageLabel = 'Initialization'; - const subStageLabel = 'Launch Config'; - - const STAGE_ID = getStageDetails(stageLabel).id; - const SUB_STAGES = !!getStageDetails(stageLabel).subStages; - const SUB_STAGE_ID = SUB_STAGES ? getSubStageDetails(STAGE_ID, subStageLabel).id : 0; + const [theme] = useState(createTheme()); + const [STAGE_ID] = useState(getStageDetails(INIT_STAGE_LABEL).id); + const [SUB_STAGES] = useState(!!getStageDetails(INIT_STAGE_LABEL).subStages); + const [SUB_STAGE_ID] = useState(SUB_STAGES ? getSubStageDetails(STAGE_ID, LAUNCH_CONFIG_STAGE_LABEL).id : 0); const dispatch = useAppDispatch(); // const schema = useAppSelector(selectSchema); @@ -429,30 +427,28 @@ const LaunchConfig = () => { } } } - const [yaml, setLYaml] = useState(useAppSelector(selectYaml)); - const setupSchema:any = schema ? schema.properties.zowe : ""; - const [setupYaml, setSetupYaml] = useState(yaml?.zowe); + const yaml = useAppSelector(selectYaml); + const [setupSchema] = useState(schema.properties.zowe); + const setupYaml = yaml?.zowe; const [isFormInit, setIsFormInit] = useState(false); const [editorVisible, setEditorVisible] = useState(false); const [isFormValid, setIsFormValid] = useState(false); const [formError, setFormError] = useState(''); const [contentType, setContentType] = useState(''); + const [installationArgs, setInstArgs] = useState(getInstallationArguments()); + const [connectionArgs] = useState(useAppSelector(selectConnectionArgs)); -// const section = 'setup'; - - const TYPE_YAML = "yaml"; - const TYPE_JCL = "jcl"; - const TYPE_OUTPUT = "output"; + const [validate] = useState(() => ajv.getSchema("https://zowe.org/schemas/v2/server-base") || ajv.compile(schema)); - const ajv = new Ajv(); - ajv.addKeyword("$anchor"); - let validate: any; + const [isInitializationSkipped] = useState(!useAppSelector(selectInitializationStatus)); - if(schema.properties.zowe) { - validate = ajv.compile(schema.properties.zowe); - } + const [stateUpdated, setStateUpdated] = useState(false); + const [stageStatus, setStageStatus] = useState(stages[STAGE_ID].subStages[SUB_STAGE_ID].isSkipped); + const stageStatusRef = useRef(stageStatus); - const isInitializationSkipped = !useAppSelector(selectInitializationStatus); + useEffect(() => { + stageStatusRef.current = stageStatus; + }, [stageStatus]); useEffect(() => { @@ -460,32 +456,47 @@ const LaunchConfig = () => { window.electron.ipcRenderer.getConfig().then((res: IResponse) => { if (res.status) { dispatch(setYaml(res.details)); - setLYaml(res.details); } else { dispatch(setYaml(FALLBACK_YAML)); - setLYaml(FALLBACK_YAML); } }) } const nextPosition = document.getElementById('container-box-id'); nextPosition.scrollIntoView({behavior: 'smooth'}); - dispatch(setNextStepEnabled(true)); - stages[STAGE_ID].subStages[SUB_STAGE_ID].isSkipped = false; - stages[STAGE_ID].isSkipped = isInitializationSkipped; + dispatch(setNextStepEnabled(getProgress('launchConfigStatus'))); + dispatch(setInitializationStatus(isInitializationStageComplete())); + setIsFormInit(true); return () => { + updateSubStepSkipStatus(SUB_STAGE_ID, stageStatusRef.current); dispatch(setActiveStep({ activeStepIndex: STAGE_ID, isSubStep: SUB_STAGES, activeSubStepIndex: SUB_STAGE_ID })); } }, []); + const setStageSkipStatus = (status: boolean) => { + stages[STAGE_ID].subStages[SUB_STAGE_ID].isSkipped = status; + stages[STAGE_ID].isSkipped = !isInitializationStageComplete(); + setStageStatus(status); + } + + const updateProgress = (status: boolean) => { + setStateUpdated(!setStateUpdated); + dispatch(setLaunchConfigStatus(status)); + dispatch(setNextStepEnabled(status)); + setStageSkipStatus(!status); + } + const toggleEditorVisibility = (type: any) => { setContentType(type); setEditorVisible(!editorVisible); }; const handleFormChange = async (data: any, isYamlUpdated?: boolean) => { + if(isFormInit){ + setLaunchConfigStatus(false) + } let newData = isFormInit ? (Object.keys(setupYaml).length > 0 ? setupYaml : data.zowe) : (data.zowe ? data.zowe : data); setIsFormInit(false); @@ -496,36 +507,68 @@ const LaunchConfig = () => { if(validate.errors) { const errPath = validate.errors[0].schemaPath; const errMsg = validate.errors[0].message; - setStageConfig(false, errPath+' '+errMsg, newData); + setStageConfig(false, errPath+' '+errMsg); } else { const newYaml = {...yaml, zowe: {...yaml.zowe, configmgr: newData.configmgr, launchScript: newData.launchScript}}; - await window.electron.ipcRenderer.setConfigByKey("zowe.configmgr", newData.configmgr); - await window.electron.ipcRenderer.setConfigByKey("zowe.launchScript", newData.launchScript); + await window.electron.ipcRenderer.setConfigByKeyAndValidate("zowe.configmgr", newData.configmgr); + await window.electron.ipcRenderer.setConfigByKeyAndValidate("zowe.launchScript", newData.launchScript); dispatch(setYaml(newYaml)); - setStageConfig(true, '', newData); + setStageConfig(true, ''); } } } }; - const setStageConfig = (isValid: boolean, errorMsg: string, data: any) => { + const setStageConfig = (isValid: boolean, errorMsg: string) => { setIsFormValid(isValid); setFormError(errorMsg); - setSetupYaml(data); - } + } + + const onSaveYaml = (e: any) => { + e.preventDefault(); + updateProgress(false); + dispatch(setLaunchConfigStatus(false)); + alertEmitter.emit('showAlert', 'Uploading yaml...', 'info'); + if(!installationArgs.dryRunMode){ + window.electron.ipcRenderer.uploadLatestYaml(connectionArgs, installationArgs).then((res: IResponse) => { + if(res && res.status) { + updateProgress(true); + alertEmitter.emit('showAlert', res.details, 'success'); + } else { + updateProgress(false); + alertEmitter.emit('showAlert', res.details, 'error'); + } + dispatch(setInitializationStatus(isInitializationStageComplete())); + }); + } + else{ + alertEmitter.emit('showAlert', 'Successfully uploaded yaml config'); + updateProgress(true); + dispatch(setInitializationStatus(isInitializationStageComplete())); + } + } return (
- + {/* */} - {editorVisible && } + + { editorVisible && + + } + {!isFormValid &&
{formError}
} +
diff --git a/src/renderer/components/stages/Networking.tsx b/src/renderer/components/stages/Networking.tsx index b479c26e..8de699c0 100644 --- a/src/renderer/components/stages/Networking.tsx +++ b/src/renderer/components/stages/Networking.tsx @@ -8,737 +8,673 @@ * Copyright Contributors to the Zowe Project. */ -import { useState, useEffect } from "react"; +import { useState, useEffect, useRef } from "react"; import { Box, Button, Checkbox, FormControlLabel, IconButton, SvgIcon, SvgIconProps, TextField } from '@mui/material'; import { useAppSelector, useAppDispatch } from '../../hooks'; -import { selectYaml, setNextStepEnabled, setSchema, setYaml } from '../configuration-wizard/wizardSlice'; +import { selectYaml, setNextStepEnabled, setYaml } from '../configuration-wizard/wizardSlice'; import ContainerCard from '../common/ContainerCard'; import EditorDialog from "../common/EditorDialog"; -import Ajv from "ajv"; import { createTheme } from '@mui/material/styles'; -import { getStageDetails, getSubStageDetails } from "../../../utils/StageDetails"; +import { getStageDetails, getSubStageDetails } from "../../../services/StageDetails"; import { stages } from "../configuration-wizard/Wizard"; -import { selectInitializationStatus } from "./progress/progressSlice"; +import { selectInitializationStatus, setInitializationStatus, setNetworkingStatus } from "./progress/progressSlice"; import { setActiveStep } from "./progress/activeStepSlice"; +import { TYPE_YAML, TYPE_JCL, TYPE_OUTPUT, ajv } from "../common/Utils"; import { IResponse } from "../../../types/interfaces"; -import { FALLBACK_SCHEMA, FALLBACK_YAML } from "../../../utils/yamlSchemaDefaults"; +import { selectConnectionArgs } from "./connection/connectionSlice"; +import { getInstallationArguments, getProgress, isInitializationStageComplete, updateSubStepSkipStatus } from "./progress/StageProgressStatus"; +import { alertEmitter } from "../Header"; -function PatternPropertiesForm(props: any){ - const [elements, setElements] = useState([]); - const [yaml, setLYaml] = useState(props.yaml); - const dispatch = useAppDispatch(); - - useEffect(() => { - if(yaml){ - const keys = Object.keys(props.schema.properties); - - //note on this nested for loop: it will only run on keys that have "patternProperties" as a child so it shouldnt be expensive - let newElements = []; - const LOOP_LIMIT = 1024; - for (let i = 0; i < keys.length && i < LOOP_LIMIT; i++) { //i = go through each property of the yaml - if (props.schema.properties[keys[i]].patternProperties != undefined) { //only for rendering patternProperties - if(typeof yaml[keys[i]] === "object" && Object.keys(yaml[keys[i]]).length > 0) { - newElements.push(

{keys[i]}

); - const patterns = Object.keys(props.schema.properties[keys[i]].patternProperties); //get all user defined regex patterns - for(let j = 0; j < patterns.length && j < LOOP_LIMIT; j++){ //j = go through each pattern - const pattern = new RegExp(patterns[j]); - const yamlValue = yaml[keys[i]]; - if(yamlValue){ - const toMatch = Object.keys(yamlValue); - for(let k = 0; k < toMatch.length && k < LOOP_LIMIT; k++){ - if(pattern.test(toMatch[k])){ - // console.log('matched pattern ' + pattern + ' to ' + toMatch[k] + ' for key' + keys[i]); - const matchedProps = Object.keys(yamlValue[toMatch[k]]); - if(matchedProps.length > 0) { - newElements.push({toMatch[k]}) - newElements.push(
); - // console.log('matchedProps:', matchedProps); - for(let l = 0; l < matchedProps.length && l < LOOP_LIMIT; l++){ - // pattern = patterns[j] = current regex pattern from patternProperties - // keys[i] = parent object that contains pattern properties (likely components or haInstances) - // toMatch[k] = regex matched child of keys[i], likely a component name such as app-server, gateway, etc - // matchedProps[l] = properties of toMatch[k] - switch (typeof yamlValue[toMatch[k]][matchedProps[l]]){ - case 'boolean': - newElements.push( { - // console.log('new yaml:', JSON.stringify({...yaml, [keys[i]]: {...yaml[keys[i]], [toMatch[k]]: {...yaml[keys[i]][toMatch[k]], [matchedProps[l]]: !yaml[keys[i]][toMatch[k]][matchedProps[l]]}}})); - const newYaml = {...yaml, [keys[i]]: {...yaml[keys[i]], [toMatch[k]]: {...yaml[keys[i]][toMatch[k]], [matchedProps[l]]: !yaml[keys[i]][toMatch[k]][matchedProps[l]]}}}; - setLYaml(newYaml); - await window.electron.ipcRenderer.setConfigByKey(`${keys[i]}.${toMatch[k]}.${matchedProps[l]}`, !yaml[keys[i]][toMatch[k]][matchedProps[l]]) - dispatch(setYaml(newYaml)); - }}/>} - />) - newElements.push(
); - break; - case 'number': - newElements.push( { - const newYaml = {...yaml, [keys[i]]: {...yaml[keys[i]], [toMatch[k]]: {...yaml[keys[i]][toMatch[k]], [matchedProps[l]]: Number(e.target.value)}}}; - setLYaml(newYaml); - await window.electron.ipcRenderer.setConfigByKey(`${keys[i]}.${toMatch[k]}.${matchedProps[l]}`, Number(e.target.value)) - dispatch(setYaml(newYaml)); - }} - />) - default: - break; - } - } - newElements.push(
); - } - } - } - } - } - } - } - } - setElements(newElements); - } - }, [yaml]) - - return
- {elements} -
-} - -function AddIcon(props: SvgIconProps) { - return ( - - - - ); -} - -function DeleteIcon(props: SvgIconProps) { - return ( - - - - ); -} - -const Networking = () => { - - const theme = createTheme(); - - const stageLabel = 'Initialization'; - const subStageLabel = 'Networking'; - - const STAGE_ID = getStageDetails(stageLabel).id; - const SUB_STAGES = !!getStageDetails(stageLabel).subStages; - const SUB_STAGE_ID = SUB_STAGES ? getSubStageDetails(STAGE_ID, subStageLabel).id : 0; - - const dispatch = useAppDispatch(); // const schema = useAppSelector(selectSchema); - const schema = { - "$id": "https://zowe.org/schemas/v2/server-base", - "title": "Zowe configuration file", - "description": "Configuration file for Zowe (zowe.org) version 2.", - "type": "object", - "additionalProperties": true, - "properties": { - "zowe": { - "type": "object", - "additionalProperties": true, - "properties": { - "externalDomains": { - "type": "array", - "description": "List of domain names of how you access Zowe from your local computer.", - "minItems": 1, - "uniqueItems": true, - "items": { - "type": ["string"] - } - }, - "externalPort": { - "type": "integer", - "minimum": 0, - "maximum": 65535, - "description": "Port number of how you access Zowe APIML Gateway from your local computer." +const schema: any = { + "$id": "https://zowe.org/schemas/v2/server-base", + "title": "Zowe configuration file", + "description": "Configuration file for Zowe (zowe.org) version 2.", + "type": "object", + "additionalProperties": true, + "properties": { + "zowe": { + "type": "object", + "additionalProperties": true, + "properties": { + "externalDomains": { + "type": "array", + "description": "List of domain names of how you access Zowe from your local computer.", + "minItems": 1, + "uniqueItems": true, + "items": { + "type": ["string"] } + }, + "externalPort": { + "type": "integer", + "minimum": 0, + "maximum": 65535, + "description": "Port number of how you access Zowe APIML Gateway from your local computer." } - }, - "components": { - "type": "object", - "patternProperties": { - "^.*$": { - "type": "object", - "properties": { - "enabled": { - "type": "boolean", - "description": "Whether to enable or disable this component", - "default": false - }, - "port": { - "type": "integer", - "description": "Optional, port number for component if applicable.", - }, - "debug": { - "type": "boolean", - "description": "Whether to enable or disable debug tracing for this component", - "default": false - }, - "certificate": { - "$ref": "#/$defs/certificate", - "description": "Certificate for current component." - }, - "launcher": { - "type": "object", - "description": "Set behavior of how the Zowe launcher will handle this particular component", - "additionalProperties": true, - "properties": { - "restartIntervals": { - "type": "array", - "description": "Intervals of seconds to wait before restarting a component if it fails before the minUptime value.", - "items": { - "type": "integer" - } - }, - "minUptime": { - "type": "integer", - "default": 90, - "description": "The minimum amount of seconds before a component is considered running and the restart counter is reset." - }, - "shareAs": { - "type": "string", - "description": "Determines which SHAREAS mode should be used when starting a component", - "enum": ["no", "yes", "must", ""], - "default": "yes" + } + }, + "components": { + "type": "object", + "patternProperties": { + "^.*$": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean", + "description": "Whether to enable or disable this component", + "default": false + }, + "port": { + "type": "integer", + "description": "Optional, port number for component if applicable.", + }, + "debug": { + "type": "boolean", + "description": "Whether to enable or disable debug tracing for this component", + "default": false + }, + "certificate": { + "$ref": "#/$defs/certificate", + "description": "Certificate for current component." + }, + "launcher": { + "type": "object", + "description": "Set behavior of how the Zowe launcher will handle this particular component", + "additionalProperties": true, + "properties": { + "restartIntervals": { + "type": "array", + "description": "Intervals of seconds to wait before restarting a component if it fails before the minUptime value.", + "items": { + "type": "integer" } + }, + "minUptime": { + "type": "integer", + "default": 90, + "description": "The minimum amount of seconds before a component is considered running and the restart counter is reset." + }, + "shareAs": { + "type": "string", + "description": "Determines which SHAREAS mode should be used when starting a component", + "enum": ["no", "yes", "must", ""], + "default": "yes" } - }, - "zowe": { - "type": "object", - "description": "Component level overrides for top level Zowe network configuration.", - "additionalProperties": false, - "properties": { - "network": { - "$ref": "#/$defs/networkSettings" - }, - "job": { - "$ref": "#/$defs/componentJobSettings" - } + } + }, + "zowe": { + "type": "object", + "description": "Component level overrides for top level Zowe network configuration.", + "additionalProperties": false, + "properties": { + "network": { + "$ref": "#/$defs/networkSettings" + }, + "job": { + "$ref": "#/$defs/componentJobSettings" } } } } } - }, - "haInstances": { - "type": "object", - "patternProperties": { - "^.*$": { - "type": "object", - "description": "Configuration of Zowe high availability instance.", - "required": ["hostname", "sysname"], - "properties": { - "hostname": { - "type": "string", - "description": "Host name of the Zowe high availability instance. This is hostname for internal communications." - }, - "sysname": { - "type": "string", - "description": "z/OS system name of the Zowe high availability instance. Some JES command will be routed to this system name." - }, - "components": { - "type": "object", - "patternProperties": { - "^.*$": { - "$ref": "#/$defs/component" - } + } + }, + "haInstances": { + "type": "object", + "patternProperties": { + "^.*$": { + "type": "object", + "description": "Configuration of Zowe high availability instance.", + "required": ["hostname", "sysname"], + "properties": { + "hostname": { + "type": "string", + "description": "Host name of the Zowe high availability instance. This is hostname for internal communications." + }, + "sysname": { + "type": "string", + "description": "z/OS system name of the Zowe high availability instance. Some JES command will be routed to this system name." + }, + "components": { + "type": "object", + "patternProperties": { + "^.*$": { + "$ref": "#/$defs/component" } } } } } } + } + }, + "$defs": { + "port": { + "type": "integer", + "minimum": 0, + "maximum": 65535 }, - "$defs": { - "port": { - "type": "integer", - "minimum": 0, - "maximum": 65535 - }, - "scheme": { - "type": "string", - "enum": [ - "http", - "https" - ], - "default": "https" - }, - "certificate": { - "oneOf": [ - { "$ref": "#/$defs/pkcs12-certificate" }, - { "$ref": "#/$defs/keyring-certificate" } - ] - }, - "pkcs12-certificate": { - "type": "object", - "additionalProperties": false, - "required": ["keystore", "truststore", "pem"], - "properties": { - "keystore": { - "type": "object", - "additionalProperties": false, - "description": "Certificate keystore.", - "required": ["type", "file", "alias"], - "properties": { - "type": { - "type": "string", - "description": "Keystore type.", - "const": "PKCS12" - }, - "file": { - "type": "string", - "pattern": "^([^\\0]){1,1024}$", - "minLength": 1, - "maxLength": 1024, - "description": "Path to your PKCS#12 keystore." - }, - "password": { - "type": "string", - "description": "Password of your PKCS#12 keystore." - }, - "alias": { - "type": "string", - "description": "Certificate alias name of defined in your PKCS#12 keystore" - } + "scheme": { + "type": "string", + "enum": [ + "http", + "https" + ], + "default": "https" + }, + "certificate": { + "oneOf": [ + { "$ref": "#/$defs/pkcs12-certificate" }, + { "$ref": "#/$defs/keyring-certificate" } + ] + }, + "pkcs12-certificate": { + "type": "object", + "additionalProperties": false, + "required": ["keystore", "truststore", "pem"], + "properties": { + "keystore": { + "type": "object", + "additionalProperties": false, + "description": "Certificate keystore.", + "required": ["type", "file", "alias"], + "properties": { + "type": { + "type": "string", + "description": "Keystore type.", + "const": "PKCS12" + }, + "file": { + "type": "string", + "pattern": "^([^\\0]){1,1024}$", + "minLength": 1, + "maxLength": 1024, + "description": "Path to your PKCS#12 keystore." + }, + "password": { + "type": "string", + "description": "Password of your PKCS#12 keystore." + }, + "alias": { + "type": "string", + "description": "Certificate alias name of defined in your PKCS#12 keystore" } - }, - "truststore": { - "type": "object", - "additionalProperties": false, - "description": "Certificate truststore.", - "required": ["type", "file"], - "properties": { - "type": { - "type": "string", - "description": "Truststore type.", - "const": "PKCS12" - }, - "file": { - "type": "string", - "pattern": "^([^\\0]){1,1024}$", - "minLength": 1, - "maxLength": 1024, - "description": "Path to your PKCS#12 keystore." - }, - "password": { - "type": "string", - "description": "Password of your PKCS#12 keystore." - } + } + }, + "truststore": { + "type": "object", + "additionalProperties": false, + "description": "Certificate truststore.", + "required": ["type", "file"], + "properties": { + "type": { + "type": "string", + "description": "Truststore type.", + "const": "PKCS12" + }, + "file": { + "type": "string", + "pattern": "^([^\\0]){1,1024}$", + "minLength": 1, + "maxLength": 1024, + "description": "Path to your PKCS#12 keystore." + }, + "password": { + "type": "string", + "description": "Password of your PKCS#12 keystore." } - }, - "pem": { - "type": "object", - "additionalProperties": false, - "description": "Certificate in PEM format.", - "required": ["key", "certificate"], - "properties": { - "key": { - "type": "string", - "pattern": "^([^\\0]){1,1024}$", - "minLength": 1, - "maxLength": 1024, - "description": "Path to the certificate private key stored in PEM format." - }, - "certificate": { - "type": "string", - "pattern": "^([^\\0]){1,1024}$", - "minLength": 1, - "maxLength": 1024, - "description": "Path to the certificate stored in PEM format." - }, - "certificateAuthorities": { - "description": "List of paths to the certificate authorities stored in PEM format.", - "oneOf": [{ + } + }, + "pem": { + "type": "object", + "additionalProperties": false, + "description": "Certificate in PEM format.", + "required": ["key", "certificate"], + "properties": { + "key": { + "type": "string", + "pattern": "^([^\\0]){1,1024}$", + "minLength": 1, + "maxLength": 1024, + "description": "Path to the certificate private key stored in PEM format." + }, + "certificate": { + "type": "string", + "pattern": "^([^\\0]){1,1024}$", + "minLength": 1, + "maxLength": 1024, + "description": "Path to the certificate stored in PEM format." + }, + "certificateAuthorities": { + "description": "List of paths to the certificate authorities stored in PEM format.", + "oneOf": [{ + "type": "string", + "pattern": "^([^\\0]){1,1024}$", + "minLength": 1, + "maxLength": 1024, + "description": "Paths to the certificate authorities stored in PEM format. You can separate multiple certificate authorities by comma." + }, + { + "type": "array", + "description": "Path to the certificate authority stored in PEM format.", + "items": { "type": "string", "pattern": "^([^\\0]){1,1024}$", "minLength": 1, "maxLength": 1024, - "description": "Paths to the certificate authorities stored in PEM format. You can separate multiple certificate authorities by comma." - }, - { - "type": "array", - "description": "Path to the certificate authority stored in PEM format.", - "items": { - "type": "string", - "pattern": "^([^\\0]){1,1024}$", - "minLength": 1, - "maxLength": 1024, - } } - ] - } + } + ] } } } - }, - "keyring-certificate": { - "type": "object", - "additionalProperties": false, - "required": ["keystore", "truststore"], - "properties": { - "keystore": { - "type": "object", - "additionalProperties": false, - "description": "Certificate keystore.", - "required": ["type", "file", "alias"], - "properties": { - "type": { - "type": "string", - "description": "Keystore type.", - "enum": ["JCEKS", "JCECCAKS", "JCERACFKS", "JCECCARACFKS", "JCEHYBRIDRACFKS"] - }, - "file": { - "type": "string", - "description": "Path of your z/OS keyring, including ring owner and ring name. Case sensitivity and spaces matter.", - "pattern": "^safkeyring:\/\/.*" - }, - "password": { - "type": "string", - "description": "Literally 'password' may be needed when using keyrings for compatibility with java servers.", - "enum": ["", "password"] - }, - "alias": { - "type": "string", - "description": "Certificate label of z/OS keyring. Case sensitivity and spaces matter." - } + } + }, + "keyring-certificate": { + "type": "object", + "additionalProperties": false, + "required": ["keystore", "truststore"], + "properties": { + "keystore": { + "type": "object", + "additionalProperties": false, + "description": "Certificate keystore.", + "required": ["type", "file", "alias"], + "properties": { + "type": { + "type": "string", + "description": "Keystore type.", + "enum": ["JCEKS", "JCECCAKS", "JCERACFKS", "JCECCARACFKS", "JCEHYBRIDRACFKS"] + }, + "file": { + "type": "string", + "description": "Path of your z/OS keyring, including ring owner and ring name. Case sensitivity and spaces matter.", + "pattern": "^safkeyring:\/\/.*" + }, + "password": { + "type": "string", + "description": "Literally 'password' may be needed when using keyrings for compatibility with java servers.", + "enum": ["", "password"] + }, + "alias": { + "type": "string", + "description": "Certificate label of z/OS keyring. Case sensitivity and spaces matter." } - }, - "truststore": { - "type": "object", - "additionalProperties": false, - "description": "Certificate truststore.", - "required": ["type", "file"], - "properties": { - "type": { - "type": "string", - "description": "Truststore type.", - "enum": ["JCEKS", "JCECCAKS", "JCERACFKS", "JCECCARACFKS", "JCEHYBRIDRACFKS"] - }, - "file": { - "type": "string", - "description": "Path of your z/OS keyring, including ring owner and ring name. Case sensitivity and spaces matter.", - "pattern": "^safkeyring:\/\/.*" - }, - "password": { - "type": "string", - "description": "Literally 'password' may be needed when using keyrings for compatibility with java servers.", - "enum": ["", "password"] - } + } + }, + "truststore": { + "type": "object", + "additionalProperties": false, + "description": "Certificate truststore.", + "required": ["type", "file"], + "properties": { + "type": { + "type": "string", + "description": "Truststore type.", + "enum": ["JCEKS", "JCECCAKS", "JCERACFKS", "JCECCARACFKS", "JCEHYBRIDRACFKS"] + }, + "file": { + "type": "string", + "description": "Path of your z/OS keyring, including ring owner and ring name. Case sensitivity and spaces matter.", + "pattern": "^safkeyring:\/\/.*" + }, + "password": { + "type": "string", + "description": "Literally 'password' may be needed when using keyrings for compatibility with java servers.", + "enum": ["", "password"] } - }, - "pem": { - "type": "object", - "additionalProperties": false, - "description": "Certificate in PEM format.", - "properties": { - "key": { - "type": "string", - "description": "Path to the certificate private key stored in PEM format." - }, - "certificate": { - "type": "string", - "description": "Path to the certificate stored in PEM format." - }, - "certificateAuthorities": { - "description": "List of paths to the certificate authorities stored in PEM format.", - "oneOf": [{ - "type": "string", - "description": "Paths to the certificate authorities stored in PEM format. You can separate multiple certificate authorities by comma." - }, - { - "type": "array", - "description": "Path to the certificate authority stored in PEM format.", - "items": { - "type": "string" - } + } + }, + "pem": { + "type": "object", + "additionalProperties": false, + "description": "Certificate in PEM format.", + "properties": { + "key": { + "type": "string", + "description": "Path to the certificate private key stored in PEM format." + }, + "certificate": { + "type": "string", + "description": "Path to the certificate stored in PEM format." + }, + "certificateAuthorities": { + "description": "List of paths to the certificate authorities stored in PEM format.", + "oneOf": [{ + "type": "string", + "description": "Paths to the certificate authorities stored in PEM format. You can separate multiple certificate authorities by comma." + }, + { + "type": "array", + "description": "Path to the certificate authority stored in PEM format.", + "items": { + "type": "string" } - ] - } + } + ] } } } - }, - "component": { - "$anchor": "zoweComponent", - "type": "object", - "properties": { - "enabled": { - "type": "boolean", - "description": "Whether to enable or disable this component", - "default": false - }, - "certificate": { - "$ref": "#/$defs/certificate", - "description": "Certificate for current component." - }, - "launcher": { - "type": "object", - "description": "Set behavior of how the Zowe launcher will handle this particular component", - "additionalProperties": true, - "properties": { - "restartIntervals": { - "type": "array", - "description": "Intervals of seconds to wait before restarting a component if it fails before the minUptime value.", - "items": { - "type": "integer" - } - }, - "minUptime": { - "type": "integer", - "default": 90, - "description": "The minimum amount of seconds before a component is considered running and the restart counter is reset." - }, - "shareAs": { - "type": "string", - "description": "Determines which SHAREAS mode should be used when starting a component", - "enum": ["no", "yes", "must", ""], - "default": "yes" + } + }, + "component": { + "$anchor": "zoweComponent", + "type": "object", + "properties": { + "enabled": { + "type": "boolean", + "description": "Whether to enable or disable this component", + "default": false + }, + "certificate": { + "$ref": "#/$defs/certificate", + "description": "Certificate for current component." + }, + "launcher": { + "type": "object", + "description": "Set behavior of how the Zowe launcher will handle this particular component", + "additionalProperties": true, + "properties": { + "restartIntervals": { + "type": "array", + "description": "Intervals of seconds to wait before restarting a component if it fails before the minUptime value.", + "items": { + "type": "integer" } + }, + "minUptime": { + "type": "integer", + "default": 90, + "description": "The minimum amount of seconds before a component is considered running and the restart counter is reset." + }, + "shareAs": { + "type": "string", + "description": "Determines which SHAREAS mode should be used when starting a component", + "enum": ["no", "yes", "must", ""], + "default": "yes" } - }, - "zowe": { - "type": "object", - "description": "Component level overrides for top level Zowe network configuration.", - "additionalProperties": false, - "properties": { - "network": { - "$ref": "#/$defs/networkSettings" - }, - "job": { - "$ref": "#/$defs/componentJobSettings" - } + } + }, + "zowe": { + "type": "object", + "description": "Component level overrides for top level Zowe network configuration.", + "additionalProperties": false, + "properties": { + "network": { + "$ref": "#/$defs/networkSettings" + }, + "job": { + "$ref": "#/$defs/componentJobSettings" } } } - }, - "componentJobSettings": { - "$anchor": "componentJobSettings", - "type": "object", - "description": "Component level overrides for job execution behavior", - "properties": { - "suffix": { - "type": "string", - "description": "Can be used by components to declare a jobname suffix to append to their job. This is not currently used by Zowe itself, it is up to components to use this value if desired. Zowe may use this value in the future." - } + } + }, + "componentJobSettings": { + "$anchor": "componentJobSettings", + "type": "object", + "description": "Component level overrides for job execution behavior", + "properties": { + "suffix": { + "type": "string", + "description": "Can be used by components to declare a jobname suffix to append to their job. This is not currently used by Zowe itself, it is up to components to use this value if desired. Zowe may use this value in the future." } - }, - "tlsSettings": { - "$anchor": "tlsSettings", - "type": "object", - "properties": { - "ciphers": { - "type": "array", - "description": "Acceptable TLS cipher suites for network connections, in IANA format.", - "items": { - "type": "string" - } - }, - "curves": { - "type": "array", - "description": "Acceptable key exchange elliptic curves for network connections.", - "items": { - "type": "string" - } - }, - "maxTls": { - "type": "string", - "enum": ["TLSv1.2", "TLSv1.3"], - "default": "TLSv1.3", - "description": "Maximum TLS version allowed for network connections." - }, - "minTls": { - "type": "string", - "enum": ["TLSv1.2", "TLSv1.3"], - "default": "TLSv1.2", - "description": "Minimum TLS version allowed for network connections, and less than or equal to network.maxTls." + } + }, + "tlsSettings": { + "$anchor": "tlsSettings", + "type": "object", + "properties": { + "ciphers": { + "type": "array", + "description": "Acceptable TLS cipher suites for network connections, in IANA format.", + "items": { + "type": "string" } + }, + "curves": { + "type": "array", + "description": "Acceptable key exchange elliptic curves for network connections.", + "items": { + "type": "string" + } + }, + "maxTls": { + "type": "string", + "enum": ["TLSv1.2", "TLSv1.3"], + "default": "TLSv1.3", + "description": "Maximum TLS version allowed for network connections." + }, + "minTls": { + "type": "string", + "enum": ["TLSv1.2", "TLSv1.3"], + "default": "TLSv1.2", + "description": "Minimum TLS version allowed for network connections, and less than or equal to network.maxTls." } - }, - "networkSettings": { - "type": "object", - "$anchor": "networkSettings", - "additionalProperties": false, - "description": "Optional, advanced network configuration parameters", - "properties": { - "server": { - "type": "object", - "additionalProperties": false, - "description": "Optional, advanced network configuration parameters for Zowe servers", - "properties": { - "tls": { - "$ref": "#/$defs/tlsSettings" - }, - "listenAddresses": { - "type": "array", - "description": "The IP addresses which all of the Zowe servers will be binding on and listening to. Some servers may only support listening on the first element.", - "items": { - "type": "string", - "pattern": "^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$" - } - }, - "vipaIp": { + } + }, + "networkSettings": { + "type": "object", + "$anchor": "networkSettings", + "additionalProperties": false, + "description": "Optional, advanced network configuration parameters", + "properties": { + "server": { + "type": "object", + "additionalProperties": false, + "description": "Optional, advanced network configuration parameters for Zowe servers", + "properties": { + "tls": { + "$ref": "#/$defs/tlsSettings" + }, + "listenAddresses": { + "type": "array", + "description": "The IP addresses which all of the Zowe servers will be binding on and listening to. Some servers may only support listening on the first element.", + "items": { "type": "string", - "description": "The IP address which all of the Zowe servers will be binding to. If you are using multiple DIPVA addresses, do not use this option." - }, - "validatePortFree": { - "type": "boolean", - "default": true, - "description": "Whether or not to ensure that the port a server is about to use is available. Usually, servers will know this when they attempt to bind to a port, so this option allows you to disable the additional verification step." + "pattern": "^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$" } + }, + "vipaIp": { + "type": "string", + "description": "The IP address which all of the Zowe servers will be binding to. If you are using multiple DIPVA addresses, do not use this option." + }, + "validatePortFree": { + "type": "boolean", + "default": true, + "description": "Whether or not to ensure that the port a server is about to use is available. Usually, servers will know this when they attempt to bind to a port, so this option allows you to disable the additional verification step." } - }, - "client": { - "type": "object", - "additionalProperties": false, - "description": "Optional, advanced network configuration parameters for Zowe servers when sending requests as clients.", - "properties": { - "tls": { - "$ref": "#/$defs/tlsSettings" - } + } + }, + "client": { + "type": "object", + "additionalProperties": false, + "description": "Optional, advanced network configuration parameters for Zowe servers when sending requests as clients.", + "properties": { + "tls": { + "$ref": "#/$defs/tlsSettings" } } } - }, - "registryHandler": { - "$anchor": "registryHandler", - "type": "object", - "required": ["registry", "path"], - "properties": { - "registry": { - "type": "string", - "description": "The location of the default registry for this handler. It could be a URL, path, dataset, whatever this handler supports" - }, - "path": { - "$ref": "/schemas/v2/server-common#zowePath", - "description": "Unix file path to the configmgr-compatible JS file which implements the handler API" - } + } + }, + "registryHandler": { + "$anchor": "registryHandler", + "type": "object", + "required": ["registry", "path"], + "properties": { + "registry": { + "type": "string", + "description": "The location of the default registry for this handler. It could be a URL, path, dataset, whatever this handler supports" + }, + "path": { + "$ref": "/schemas/v2/server-common#zowePath", + "description": "Unix file path to the configmgr-compatible JS file which implements the handler API" } } } } - const [yaml, setLYaml] = useState(useAppSelector(selectYaml)); - const [isFormInit, setIsFormInit] = useState(false); +} + +function AddIcon(props: SvgIconProps) { + return ( + + + + ); +} + +function DeleteIcon(props: SvgIconProps) { + return ( + + + + ); +} + +const Networking = () => { + + const theme = createTheme(); + + const stageLabel = 'Initialization'; + const subStageLabel = 'Networking'; + + const STAGE_ID = getStageDetails(stageLabel).id; + const SUB_STAGES = !!getStageDetails(stageLabel).subStages; + const SUB_STAGE_ID = SUB_STAGES ? getSubStageDetails(STAGE_ID, subStageLabel).id : 0; + + const dispatch = useAppDispatch(); + const [yaml, setLocalYaml] = useState(useAppSelector(selectYaml)); const [editorVisible, setEditorVisible] = useState(false); const [isFormValid, setIsFormValid] = useState(false); const [formError, setFormError] = useState(''); const [contentType, setContentType] = useState(''); + const [installationArgs, setInstArgs] = useState(getInstallationArguments()); + const connectionArgs = useAppSelector(selectConnectionArgs); + const [validate] = useState(() => ajv.getSchema("https://zowe.org/schemas/v2/server-base") || ajv.compile(schema)); + const [LOOP_LIMIT] = useState(1024); - const TYPE_YAML = "yaml"; - const TYPE_JCL = "jcl"; - const TYPE_OUTPUT = "output"; - - const ajv = new Ajv(); - ajv.addKeyword("$anchor"); - let validate: any; - - if(schema) { - validate = ajv.compile(schema); - } - - // useEffect(() => { - // // dispatch(setYaml(yaml)); - // setModdedYaml(createModdedYaml(yaml)); - // }, [yaml]); + const [stateUpdated, setStateUpdated] = useState(false); + const [stageStatus, setStageStatus] = useState(stages[STAGE_ID].subStages[SUB_STAGE_ID].isSkipped); + const stageStatusRef = useRef(stageStatus); const isInitializationSkipped = !useAppSelector(selectInitializationStatus); useEffect(() => { - if(!yaml){ - window.electron.ipcRenderer.getConfig().then((res: IResponse) => { - if (res.status) { - dispatch(setYaml(res.details)); - setLYaml(res.details); - } else { - dispatch(setYaml(FALLBACK_YAML)); - setLYaml(FALLBACK_YAML); - } - }) - } + stageStatusRef.current = stageStatus; + }, [stageStatus]); - if(!schema){ - window.electron.ipcRenderer.getSchema().then((res: IResponse) => { - if (res.status) { - dispatch(setSchema(res.details)); - } else { - dispatch(setSchema(FALLBACK_SCHEMA)); - } - }) - } + useEffect(() => { const nextPosition = document.getElementById('container-box-id'); if(nextPosition) nextPosition.scrollIntoView({behavior: 'smooth'}); - dispatch(setNextStepEnabled(true)); - stages[STAGE_ID].subStages[SUB_STAGE_ID].isSkipped = false; - stages[STAGE_ID].isSkipped = isInitializationSkipped; - setIsFormInit(true); + dispatch(setNextStepEnabled(getProgress('networkingStatus'))); + dispatch(setInitializationStatus(isInitializationStageComplete())); return () => { + updateSubStepSkipStatus(SUB_STAGE_ID, stageStatusRef.current); dispatch(setActiveStep({ activeStepIndex: STAGE_ID, isSubStep: SUB_STAGES, activeSubStepIndex: SUB_STAGE_ID })); } }, []); + const setStageSkipStatus = (status: boolean) => { + stages[STAGE_ID].subStages[SUB_STAGE_ID].isSkipped = status; + stages[STAGE_ID].isSkipped = !isInitializationStageComplete(); + setStageStatus(status); + } + + const updateProgress = (status: boolean) => { + setStateUpdated(!setStateUpdated); + dispatch(setNetworkingStatus(status)); + dispatch(setNextStepEnabled(status)); + setStageSkipStatus(!status); + } + const toggleEditorVisibility = (type: any) => { setContentType(type); setEditorVisible(!editorVisible); }; const handleFormChange = async (data: any, isYamlUpdated?: boolean) => { + if(validate) { + validate(data); + if(validate.errors) { + const errPath = validate.errors[0].schemaPath; + const errMsg = validate.errors[0].message; + setStageConfig(false, errPath+' '+errMsg, data.zowe); - if (data.zowe.externalDomains || data.zowe.externalPort || data.components) { - - if(validate) { - validate(data); - if(validate.errors) { - const errPath = validate.errors[0].schemaPath; - const errMsg = validate.errors[0].message; - setStageConfig(false, errPath+' '+errMsg, data.zowe); - - } else { - const newYaml = {...yaml, zowe: {...yaml.zowe, externalDomains: data.zowe.externalDomains, externalPort: data.zowe.externalPort}, components: data.components}; - // console.log("new yaml", JSON.stringify(newYaml)); - window.electron.ipcRenderer.setConfig(newYaml) - setStageConfig(true, '', newYaml); - } } } + let newYaml; + if (data.zowe && data.zowe.externalDomains && data.zowe.externalPort) { + newYaml = {...yaml, zowe: {...yaml.zowe, externalDomains: data.zowe.externalDomains, externalPort: data.zowe.externalPort}}; + } + if(data.components){ + newYaml = {...newYaml, components: data.components}; + } + window.electron.ipcRenderer.setConfig(newYaml) + setStageConfig(true, '', newYaml); }; const setStageConfig = (isValid: boolean, errorMsg: string, data: any) => { setIsFormValid(isValid); setFormError(errorMsg); - setLYaml(data); - } + setLocalYaml(data); + } + + const onSaveYaml = (e: any) => { + e.preventDefault(); + updateProgress(false); + alertEmitter.emit('showAlert', 'Uploading yaml...', 'info'); + if(!installationArgs.dryRunMode){ + window.electron.ipcRenderer.uploadLatestYaml(connectionArgs, installationArgs).then((res: IResponse) => { + if(res && res.status) { + updateProgress(true); + alertEmitter.emit('showAlert', res.details, 'success'); + } else { + updateProgress(false); + alertEmitter.emit('showAlert', res.details, 'error'); + } + dispatch(setInitializationStatus(isInitializationStageComplete())); + }); + } + else{ + alertEmitter.emit('showAlert', 'Successfully uploaded yaml config'); + updateProgress(true); + dispatch(setInitializationStatus(isInitializationStageComplete())); + } + } return ( yaml && schema &&
- - - + + {/* */} + - {editorVisible && } + {editorVisible && { + let newYaml; + if (data.zowe && data.zowe.externalDomains && data.zowe.externalPort) { + newYaml = {...yaml, zowe: {...yaml.zowe, externalDomains: data.zowe.externalDomains, externalPort: data.zowe.externalPort}}; + } + if(data.components){ + newYaml = {...newYaml, components: data.components}; + } + setStageConfig(true, '', newYaml); + }}/>} dispatch(setYaml((await window.electron.ipcRenderer.getConfig()).details ?? yaml))}> {!isFormValid &&
{formError}
} -

External Domains { - let domains = [...yaml.zowe?.externalDomains, ""]; +

External Domains { + let domains = [...yaml.zowe?.externalDomains || [], ""]; const newYaml = {...yaml, zowe: {...yaml.zowe, externalDomains: domains}}; window.electron.ipcRenderer.setConfig(newYaml ) dispatch(setYaml(newYaml)) - setLYaml(newYaml); + dispatch(setNetworkingStatus(false)); + setLocalYaml(newYaml); }}>

- {yaml.zowe.externalDomains != undefined && yaml.zowe.externalDomains.map((domain: string, index: number) => { @@ -748,7 +684,8 @@ const Networking = () => { // console.log(domains); window.electron.ipcRenderer.setConfig(newYaml ) dispatch(setYaml(newYaml)) - setLYaml(newYaml); + dispatch(setNetworkingStatus(false)); + setLocalYaml(newYaml); }} /> { let domains = [...yaml.zowe?.externalDomains]; @@ -756,7 +693,8 @@ const Networking = () => { const newYaml = {...yaml, zowe: {...yaml.zowe, externalDomains: domains}}; window.electron.ipcRenderer.setConfig(newYaml ) dispatch(setYaml(newYaml)) - setLYaml(newYaml); + dispatch(setNetworkingStatus(false)); + setLocalYaml(newYaml); }}>)}
{ const newYaml = {...yaml, zowe: {...yaml.zowe, externalPort: Number(e.target.value)}}; window.electron.ipcRenderer.setConfig(newYaml) dispatch(setYaml(newYaml)) - setLYaml(newYaml); + setLocalYaml(newYaml); // // props.setYaml(newYaml); - // await window.electron.ipcRenderer.setConfigByKey(`${keys[i]}.${toMatch[k]}.${matchedProps[l]}`, Number(e.target.value)) + // await window.electron.ipcRenderer.setConfigByKeyAndValidate(`${keys[i]}.${toMatch[k]}.${matchedProps[l]}`, Number(e.target.value)) // // dispatch(setYaml(newYaml)); }} /> - +
+ {Object.keys(schema.properties).map((schemaKey, index) => { + if(index < LOOP_LIMIT){ + if (schema.properties[schemaKey].patternProperties != undefined) { //only for rendering patternProperties + if(typeof yaml[schemaKey] === "object" && Object.keys(yaml[schemaKey]).length > 0) { + return
+

{schemaKey}

+ {Object.keys(schema.properties[schemaKey].patternProperties).map((regexPattern, rIndex) => { + const pattern = new RegExp(regexPattern); + if(rIndex < LOOP_LIMIT && yaml[schemaKey]) { + return Object.keys(yaml[schemaKey]).map((matchedPattern, mIndex) => { + if(mIndex < LOOP_LIMIT && pattern.test(matchedPattern)){ + return
+
+ + {matchedPattern} +
+
+ {Object.keys(yaml[schemaKey][matchedPattern]).map((schemaProperty, sIndex) => { + + if(sIndex < LOOP_LIMIT && schemaProperty.length > 0){ + return
+ + {typeof yaml[schemaKey][matchedPattern][schemaProperty] === "boolean" && { + // console.log('new yaml:', JSON.stringify({...yaml, [keys[i]]: {...yaml[keys[i]], [toMatch[k]]: {...yaml[keys[i]][toMatch[k]], [matchedProps[l]]: !yaml[keys[i]][toMatch[k]][matchedProps[l]]}}})); + const newYaml = {...yaml, [schemaKey]: {...yaml[schemaKey], [matchedPattern]: {...yaml[schemaKey][matchedPattern], [schemaProperty]: !yaml[schemaKey][matchedPattern][schemaProperty]}}}; + setLocalYaml(newYaml); + await window.electron.ipcRenderer.setConfigByKeyAndValidate(`${schemaKey}.${matchedPattern}.${schemaProperty}`, !yaml[schemaKey][matchedPattern][schemaProperty]) + dispatch(setYaml(newYaml)); + dispatch(setNetworkingStatus(false)); + }}/>} + />} + {typeof yaml[schemaKey][matchedPattern][schemaProperty] === "number" && { + if(!Number.isNaN(Number(e.target.value))){ + const newYaml = {...yaml, [schemaKey]: {...yaml[schemaKey], [matchedPattern]: {...yaml[schemaKey][matchedPattern], [schemaProperty]: Number(e.target.value)}}}; + setLocalYaml(newYaml); + await window.electron.ipcRenderer.setConfigByKeyAndValidate(`${schemaKey}.${matchedPattern}.${schemaProperty}`, Number(e.target.value)) + dispatch(setYaml(newYaml)); + dispatch(setNetworkingStatus(false)); + } + }} + />} +
+ } + return null; + })}
+ } + return null; + }) + } + return null; + }) + } +
+ } + } + } + return null; + })} +
+
diff --git a/src/renderer/components/stages/Planning.tsx b/src/renderer/components/stages/Planning.tsx index 00426b1b..3c519e35 100644 --- a/src/renderer/components/stages/Planning.tsx +++ b/src/renderer/components/stages/Planning.tsx @@ -8,150 +8,80 @@ * Copyright Contributors to the Zowe Project. */ -import React, {useEffect, useMemo, useState} from "react"; -import Box from '@mui/material/Box'; -import Link from '@mui/material/Link'; -import Typography from '@mui/material/Typography'; -import TextField from '@mui/material/TextField'; -import FormControl from '@mui/material/FormControl'; -import Button from '@mui/material/Button'; +import React, {useEffect, useState} from "react"; import ContainerCard from '../common/ContainerCard'; import CheckCircle from '@mui/icons-material/CheckCircle'; -import { setYaml, setSchema, setNextStepEnabled, setLoading, selectYaml } from '../configuration-wizard/wizardSlice'; -import { selectConnectionArgs, setConnectionArgs, setJobStatementVal } from './connection/connectionSlice'; -import { setPlanningStatus, selectPlanningStatus } from './progress/progressSlice'; -import { setZoweVersion, setInstallationArgs, selectInstallationArgs, selectZoweVersion } from './installation/installationSlice'; -import { setJobStatement, setJobStatementValid, setJobStatementValidMsg, setLocationValidationDetails, setIsLocationValid, selectJobStatement, selectJobStatementValid, selectJobStatementValidMsg, selectLocValidationDetails } from "./PlanningSlice"; +import { Box, Button, Checkbox, FormControl, FormControlLabel, Link, TextField, Typography } from "@mui/material"; +import { setYaml, setNextStepEnabled, setLoading, selectYaml } from '../configuration-wizard/wizardSlice'; +import { selectConnectionArgs, selectInitJobStatement, setJobStatementVal } from './connection/connectionSlice'; +import { setPlanningStatus } from './progress/progressSlice'; +import { setZoweVersion, setInstallationArgs, selectInstallationArgs } from './installation/installationSlice'; +import { setJobStatementValid, setIsLocationValid, selectJobStatementValid } from "./PlanningSlice"; import { useAppDispatch, useAppSelector } from '../../hooks'; import { IResponse } from '../../../types/interfaces'; import { alertEmitter } from "../Header"; -import { Checkbox, FormControlLabel } from "@mui/material"; -import { setActiveStep } from './progress/activeStepSlice'; -import EditorDialog from "../common/EditorDialog"; -import { getStageDetails } from "../../../utils/StageDetails"; -import { getProgress, getPlanningStageStatus, setPlanningValidationDetailsState, getPlanningValidationDetailsState } from "./progress/StageProgressStatus"; -import { FALLBACK_YAML } from "../../../utils/yamlSchemaDefaults"; +import { setActiveStep } from './progress/activeStepSlice'; // REVIEW: This part can be handled in wizardSlice, while connectionSlice/installationSlice/PlanningSlice could be unified in one storage entity +import { getStageDetails } from "../../../services/StageDetails"; +import { getPlanningStageStatus, setPlanningValidationDetailsState, getPlanningValidationDetailsState, getInstallationTypeStatus } from "./progress/StageProgressStatus"; +import { FALLBACK_YAML, isValidUSSPath } from "../common/Utils"; // TODO: Our current theoretical cap is 72 (possibly minus a couple for "\n", 70?) But we force more chars in InstallationHandler.tsx // This is all I want to manually test for now. Future work can min/max this harder const JCL_UNIX_SCRIPT_CHARS = 55; -const Planning = () => { +// TODO: Planning stage has no schema validation. Current schema validation method relies on just existence of property (removed) - const [stageLabel] = useState('Planning'); +const Planning = () => { + const stageLabel = 'Planning'; const STAGE_ID = getStageDetails(stageLabel).id; const SUB_STAGES = !!getStageDetails(stageLabel).subStages; const dispatch = useAppDispatch(); const connectionArgs = useAppSelector(selectConnectionArgs); - const [localYaml, setLocalYaml] = useState(useAppSelector(selectYaml)); - - // const jobStatementValid = useAppSelector(selectJobStatementValid); - const [jobStatementValid, setJobStatementValidation] = useState(getPlanningStageStatus()?.isJobStatementValid); - const jobStatementValidMsg = useAppSelector(selectJobStatementValidMsg); - - const locationValidationDetails = useAppSelector(selectLocValidationDetails); - - const planningStatus = useAppSelector(selectPlanningStatus); - + const localYaml = useAppSelector(selectYaml); const [step, setStep] = useState(0); - const [jobHeaderSaved, setJobHeaderSaved] = useState(false); - const [isJobStatementUpdated, setIsJobStatementUpdated] = useState(false); - // const [jobStatementValue, setJobStatementValue] = useState(useAppSelector(selectJobStatement)); - const [jobStatementValue, setJobStatementValue] = useState(getPlanningStageStatus()?.jobStatement); + const installationArgs = useAppSelector(selectInstallationArgs); + const jobStatementValue = useAppSelector(selectInitJobStatement); - const [locationsValidated, setLocationsValidated] = useState(getPlanningStageStatus()?.isLocationValid || false); - const [isLocationsUpdated, setIsLocationsUpdated] = useState(false); + // REVIEW: Instead of original redux + electron-store we use here component state (useState) + localStorage (getPlanningStageStatus) + redux (PlanningSlice) just as an intermediate storage + electron-store in some cases. + const [locationsValidated, setLocationsValidated] = useState(getPlanningStageStatus()?.isLocationValid); const [validationDetails, setValidationDetails] = useState(getPlanningValidationDetailsState()); + const jobHeaderSaved = useAppSelector(selectJobStatementValid); + const [showZosmfAttributes, setShowZosmfAttributes] = useState(true); - - const zoweVersion = useAppSelector(selectZoweVersion); - const [installationArgs, setInstArgs] = useState(useAppSelector(selectInstallationArgs)); - const [requiredSpace, setRequiredSpace] = useState(1300); //in megabytes - - const [contentType, setContentType] = useState('output'); - const [editorVisible, setEditorVisible] = useState(false); - const [editorContent, setEditorContent] = useState(''); - - const toggleEditorVisibility = (type?: any) => { - if (type) { - setContentType(type); - } - setEditorVisible(!editorVisible); - }; + const requiredSpace = 1300; //in megabytes useEffect(() => { - const nextPosition = document.getElementById('container-box-id'); - nextPosition.scrollIntoView({behavior: 'smooth', block: 'start'}); - - if(getPlanningStageStatus()?.isJobStatementValid) { - setJobHeaderSaved(true); - if(getPlanningStageStatus()?.isLocationValid) { - setStep(2); - } else { - setStep(1); - } + if (!installationArgs.dryRunMode) { // REVIEW: Does dry run even makes sense in this step? What do we want to get as a result? + // FIXME: getZoweVersion should be moved to InstallTypeSelection, makes no sense here anymore + window.electron.ipcRenderer.getZoweVersion().then((res: IResponse) => dispatch(setZoweVersion(res.status ? res.details : '' ))); + // REVIEW: Installation args are split into multiple storage locations, we can remove parts that are in yaml now and then it can be merged with connection data, to have single session/instance/instalaltion storage. + dispatch(setInstallationArgs({...installationArgs, installationType: getInstallationTypeStatus()?.installationType, userUploadedPaxPath: getInstallationTypeStatus()?.userUploadedPaxPath})); + dispatch(setJobStatementValid(getPlanningStageStatus()?.isJobStatementValid)); + window.electron.ipcRenderer.getConfig().then((res: IResponse) => { + if (res.status) { + let yaml = res.details; + // Pre-fill z/OSMF host with the host name we are connected to + if (!yaml?.zOSMF?.host || yaml?.zOSMF?.host === FALLBACK_YAML.zOSMF.host) { + yaml = updateAndReturnYaml('zOSMF.host', connectionArgs.host, yaml); + window.electron.ipcRenderer.setConfigByKeyNoValidate('zOSMF.host', connectionArgs.host); + } + dispatch(setYaml(yaml)); + } + }) } return () => { dispatch(setActiveStep({ activeStepIndex: STAGE_ID, isSubStep: SUB_STAGES, activeSubStepIndex: 0 })); } - }, []) - - useEffect(() => { - setPlanningState(getProgress('planningStatus')); - // FIXME: Add a popup warning in case failed to get config files - // FIXME: Save yaml and schema on disk to not to pull it each time? - // REVIEW: Replace JobStatement text area with set of text fields? - - dispatch(setJobStatementVal(jobStatementValue)); - - window.electron.ipcRenderer.getZoweVersion().then((res: IResponse) => dispatch(setZoweVersion(res.status ? res.details : '' ))); - - window.electron.ipcRenderer.getConfigByKey("installationArgs").then((res: IResponse) => { - if(res != undefined){ - setInstArgs((res as any)); - } - }) - - window.electron.ipcRenderer.getConfig().then((res: IResponse) => { - if (res.status) { - dispatch(setYaml(res.details)); - setLocalYaml(res.details); - // const schema = res.details.schema; - // Leaving this as a comment because the note about setting $ref properly is still valid i think - // FIXME: Link schema by $ref properly - https://jsonforms.io/docs/ref-resolving - // schema.properties.zowe.properties.setup.properties.dataset.properties.parmlibMembers.properties.zis = serverSchema.$defs.datasetMember; - // schema.properties.zowe.properties.setup.properties.certificate.properties.pkcs12.properties.directory = serverSchema.$defs.path; - // schema.$id = serverSchema.$id; - // if(schema.$defs?.networkSettings?.properties?.server?.properties?.listenAddresses?.items){ - // delete schema.$defs?.networkSettings?.properties?.server?.properties?.listenAddresses?.items?.ref; - // schema.$defs.networkSettings.properties.server.properties.listenAddresses.items = serverSchema.$defs.ipv4 - // } - // dispatch(setSchema(schema)); - let installationDir = ''; - if (res.details?.zowe?.runtimeDirectory && res.details?.zowe?.workspaceDirectory) { - const getParentDir = (path: string): string => path.split('/').filter((i: string, ind: number) => i || !ind).slice(0, -1).join('/'); - const runtimeParent = getParentDir(res.details?.zowe?.runtimeDirectory); - const workspaceParent = getParentDir(res.details?.zowe?.workspaceDirectory); - if (runtimeParent === workspaceParent) installationDir = runtimeParent; - } - dispatch(setInstallationArgs({...installationArgs, installationDir: res.details?.zowe?.runtimeDirectory ?? ''})); - } - }) - - window.electron.ipcRenderer.getSchema().then((res: IResponse) => { - if (res.status) { - dispatch(setSchema(res.details)); - } - }) - }, []); - + useEffect(() => { - setPlanningState(jobHeaderSaved && locationsValidated); + dispatch(setNextStepEnabled(jobHeaderSaved && locationsValidated)); + dispatch(setPlanningStatus(jobHeaderSaved && locationsValidated)); + !jobHeaderSaved ? setStep(0) : setStep(1); }, [jobHeaderSaved, locationsValidated]); useEffect(() => { @@ -159,34 +89,33 @@ const Planning = () => { nextPosition.scrollIntoView({behavior: 'smooth'}); }, [step]); - const setPlanningState = (status: boolean): void => { - dispatch(setNextStepEnabled(status)); - dispatch(setPlanningStatus(status)); - } - const setLocValidations = (status: boolean): void => { - setLocationsValidated(status); - dispatch(setIsLocationValid(status)); + setLocationsValidated(status); // This sets component state and uses it for rendering. + dispatch(setIsLocationValid(status)); // This is an odd usage of redux. It sets variable to the redux state but never uses it, doesn't even have a selector, instead, it obscurely sets it to the localStorage via setPlanningStageStatus for persistence; } - const setEditorContentAndType = (content: any, type: string): void => { - setEditorContent(content); - setContentType(type); + const setValDetails = (details: any): void => { // Created a similar function for duplicated setting + setValidationDetails(details); + setPlanningValidationDetailsState(details); } const getENVVars = () => { return window.electron.ipcRenderer.getENVVars(connectionArgs).then((res: IResponse) => { if (res.status) { try { + let updatedYaml = {...localYaml}; const lines = res.details.split('\n').map((l: string) => l.trim()).filter((l: string) => !l.includes("echo")); - let nodeHome, javaHome; lines.map((line: string) => { - if (line.includes('node')) nodeHome = installationArgs.nodeHome ? installationArgs.nodeHome : line; - if (line.includes('java')) javaHome = installationArgs.javaHome ? installationArgs.javaHome : line; + if (line.includes('java') && !localYaml?.java?.home) { + updatedYaml = updateAndReturnYaml('java.home', line, updatedYaml); + window.electron.ipcRenderer.setConfigByKeyNoValidate('java.home',line) + } + if (line.includes('node') && !localYaml?.node?.home) { + updatedYaml = updateAndReturnYaml('node.home', line, updatedYaml); + window.electron.ipcRenderer.setConfigByKeyNoValidate('node.home',line) + } }); - nodeHome && dispatch(setInstallationArgs({...installationArgs, nodeHome: nodeHome})) - javaHome && dispatch(setInstallationArgs({...installationArgs, javaHome: javaHome})) - + dispatch(setYaml(updatedYaml)); } catch (error) { return {status: false, details: error.message} } @@ -196,182 +125,161 @@ const Planning = () => { } const saveJobHeader = (e: any) => { - - if(jobStatementValid && !isJobStatementUpdated) { - setJobHeaderSaved(true); - setEditorContentAndType(jobStatementValidMsg, 'output'); - if (step < 1) { - setStep(1); - } - if(planningStatus && !isLocationsUpdated) { - validateLocations(null); - } - return; - } e.preventDefault(); + alertEmitter.emit('hideAlert'); dispatch(setLoading(true)); - window.electron.ipcRenderer.saveJobHeader(jobStatementValue) + + if (!installationArgs.dryRunMode) { + window.electron.ipcRenderer.saveJobHeader(jobStatementValue) .then(() => getENVVars()) .then((res: IResponse) => { - setEditorContentAndType(res.details, 'output'); + dispatch(setJobStatementValid(res.status)); if (!res.status) { // Failure case - dispatch(setJobStatementValidMsg(res.details)); - console.warn('Failed to verify job statement'); - alertEmitter.emit('showAlert', 'Failed to verify job statement', 'error'); - } else { // Success JCL case - dispatch(setJobStatementValid(true)); - alertEmitter.emit('hideAlert'); - if(locationsValidated) { - setPlanningState(true); - setStep(2); - } else if (step < 1) { - setStep(1); - } + console.warn('Failed to verify job statement', res.details); + // TODO: This more detailed reason, for why Job submission failed, may be large and should be opened in an Editor + alertEmitter.emit('showAlert', 'Failed to verify job statement ' + res.details, 'error'); } - setJobHeaderSaved(res.status); - dispatch(setLoading(false)); }) .catch((err: Error) => { - setEditorContentAndType(err.message, 'output'); console.warn(err); - dispatch(setJobStatementValidMsg(err.message)); dispatch(setJobStatementValid(false)); alertEmitter.emit('showAlert', err.message, 'error'); + }) + .finally(() => { dispatch(setLoading(false)); }); - } - - const validateLocations = (e: any, click?: boolean) => { - - if(planningStatus && !isLocationsUpdated && !click) { - setLocValidations(true); - setPlanningState(true); - setValidationDetails(locationValidationDetails); - setPlanningValidationDetailsState(locationValidationDetails); - setEditorContentAndType(jobStatementValidMsg, 'output'); - setStep(2); - return; + } else { + dispatch(setJobStatementValid(true)); + dispatch(setLoading(false)); } + } + + const validateLocations = (e: any) => { + // REVIEW: Four storages are used for these values, i've removed a pile of setters from here, but it still should be done better. + // On every form change we run formChangeHandler and setYaml to store config in the redux (1) for the UI - ok + // Also we set electron-storage (2) (window.electron.ipcRenderer.setConfigByKeyNoValidate) for persistence, which may be a bit heavy, persistence data can be saved after successful validation here in validateLocations. + // And as the same time here we have some metadata storage like setValDetails, which use the component state (3) setValidationDetails and the localStorage (4) setPlanningValidationDetailsState(details) e.preventDefault(); - setValidationDetails({...validationDetails, error: ''}); + alertEmitter.emit('hideAlert'); + setLocValidations(false); + setValDetails({...validationDetails, error: ''}); + if (!localYaml?.java?.home || !localYaml?.node?.home || !localYaml?.zowe?.runtimeDirectory) { console.warn('Please fill in all values'); alertEmitter.emit('showAlert', 'Please fill in all values', 'error'); - //showAlert('Please fill in all values', 'success', 5000); return; } + let invalidUSSPath = ''; + if (localYaml?.zowe?.logDirectory && !isValidUSSPath(localYaml.zowe.logDirectory)) { + invalidUSSPath = localYaml.zowe.logDirectory + " is not a valid z/OS Unix path" + } + if (localYaml?.zowe?.extensionDirectory && !isValidUSSPath(localYaml.zowe.extensionDirectory)) { + invalidUSSPath = localYaml.zowe.extensionDirectory + " is not a valid z/OS Unix path" + } + if (localYaml?.zowe?.workspaceDirectory && !isValidUSSPath(localYaml.zowe.workspaceDirectory)) { + invalidUSSPath = localYaml.zowe.workspaceDirectory + " is not a valid z/OS Unix path" + } + if (localYaml?.zowe?.runtimeDirectory && !isValidUSSPath(localYaml.zowe.runtimeDirectory)) { + invalidUSSPath = localYaml.zowe.runtimeDirectory + " is not a valid z/OS Unix path" + } + if (invalidUSSPath) { + alertEmitter.emit('showAlert', invalidUSSPath, 'error'); + return; + } + dispatch(setLoading(true)); // TODO: Possible feature for future: add to checkDir to see if existing Zowe install exists. - // Then give the user ability to use existing zowe.yaml to auto-fill in fields from Zen - Promise.all([ - window.electron.ipcRenderer.checkJava(connectionArgs, localYaml?.java?.home || installationArgs.javaHome), - window.electron.ipcRenderer.checkNode(connectionArgs, localYaml?.node?.home || installationArgs.nodeHome), - window.electron.ipcRenderer.checkDirOrCreate(connectionArgs, localYaml?.zowe?.runtimeDirectory || installationArgs.installationDir), - window.electron.ipcRenderer.checkDirOrCreate(connectionArgs, localYaml?.zowe?.workspaceDirectory || installationArgs.workspaceDir ), - window.electron.ipcRenderer.checkDirOrCreate(connectionArgs, localYaml?.zowe?.extensionDirectory || installationArgs.extensionDir), - window.electron.ipcRenderer.checkDirOrCreate(connectionArgs, localYaml?.zowe?.logDirectory || installationArgs.logDir), - ]).then((res: Array) => { - const details = {javaVersion: '', nodeVersion: '', spaceAvailableMb: '', error: ''}; - setEditorContent(res.map(item=>item?.details).join('\n')); - setContentType('output'); - - // If res[?] doesn't exist, ?-th window.electronc.ipcRender call failed... - try { - details.javaVersion = res[0].details.split('\n').filter((i: string) => i.trim().startsWith('java version'))[0].trim().slice(14, -1); - } catch (error) { - details.error = details.error + `Can't get Java version `; - console.warn(res[0].details); - } - try { - details.nodeVersion = res[1].details.split('\n').filter((i: string) => i.trim().startsWith('v'))[0].slice(1); - } catch (error) { - details.error = details.error + `Can't get Node.js version `; - console.warn(res[1].details); - } - if (res[2].status == false) { // Checking run-time directory existence or creating it failed? - details.error = details.error + res[2].details; - console.warn(res[2].details); - } - if (res[3].status == false) { // workspace directory - details.error = details.error + res[3].details; - console.warn(res[3].details); - } - if (res[4].status == false) { // extensions directory - details.error = details.error + res[4].details; - console.warn(res[4].details); - } - if (res[5].status == false) { // logs directory - details.error = details.error + res[5].details; - console.warn(res[5].details); - } - //Do not check space because space on ZFS is dynamic. you can have more space than USS thinks. - // try { - // const dfOut: string = res[2].details.split('\n').filter((i: string) => i.trim().startsWith(installationArgs.installationDir.slice(0, 3)))[0]; - // details.spaceAvailableMb = dfOut.match(/\d+\/\d+/g)[0].split('/')[0]; - // // FIXME: Space requirement is made up, Zowe 2.9.0 convenience build is 515Mb and growing per version. Make it double for extracted files. - // if (parseInt(details.spaceAvailableMb, 10) < requiredSpace) { - // details.error = details.error + `Not enough space, you need at least ${requiredSpace}MB; `; - // } - // } catch (error) { - // details.error = details.error + `Can't check space available; `; - // console.warn(res[2].details); - // } - setValidationDetails(details); - setPlanningValidationDetailsState(details); - dispatch(setLocationValidationDetails(details)) + // Then give the user ability to use existing zowe.yaml to auto-fill in fields from Wizard + if (!installationArgs.dryRunMode) { + + Promise.all([ + window.electron.ipcRenderer.checkJava(connectionArgs, localYaml?.java?.home), + window.electron.ipcRenderer.checkNode(connectionArgs, localYaml?.node?.home), + window.electron.ipcRenderer.checkDirOrCreate(connectionArgs, localYaml?.zowe?.runtimeDirectory), + window.electron.ipcRenderer.checkSpaceAndCreateDir(connectionArgs, localYaml?.zowe?.runtimeDirectory), + ]).then((res: Array) => { + const details = {javaVersion: '', nodeVersion: '', spaceAvailableMb: '', error: ''}; + // If res[?] doesn't exist, ?-th window.electronc.ipcRender call failed... + try { + details.javaVersion = res[0].details.split('\n').filter((i: string) => i.trim().startsWith('java version'))[0].trim().slice(14, -1); + } catch (error) { + details.error = details.error + `Can't get Java version `; + console.warn(res[0].details); + } + try { + details.nodeVersion = res[1].details.split('\n').filter((i: string) => i.trim().startsWith('v'))[0].slice(1); + } catch (error) { + details.error = details.error + `Can't get Node.js version `; + console.warn(res[1].details); + } + if (res[2] && res[2].status == false) { // Checking run-time directory existence or creating it failed? + details.error = details.error + res[2].details; + console.warn(res[2].details); + } + // Do not check space because space on ZFS is dynamic. you can have more space than USS thinks. + // REVIEW: We still can check it and show notification but allow to continue with the installation. However the requirement is different for conv / SMPE / PSWI so this logic should be moved to the next step. + try { + const dfOut: string = res[3].details.split('\n').filter((i: string) => i.trim().startsWith(localYaml?.zowe?.runtimeDirectory.slice(0, 3)))[0]; + details.spaceAvailableMb = dfOut.match(/\d+\/\d+/g)[0].split('/')[0]; + if (parseInt(details.spaceAvailableMb, 10) < requiredSpace) { + alertEmitter.emit('showAlert', `Can't validate available space, please make sure you have enough free space in ${localYaml?.zowe?.runtimeDirectory}`, 'info', 10000); + // details.error = details.error + `Not enough space, you need at least ${requiredSpace}MB; `; + } + } catch (error) { + // details.error = details.error + `Can't check space available; `; + alertEmitter.emit('showAlert', `Can't check space available: ${error}`, 'warning'); + console.warn(res[3].details); + } + setValDetails(details); + dispatch(setLoading(false)); + if (!details.error) { + setLocValidations(true); + // FIXME: Back port values from localYaml to installationArgs, remove later together with dependencies in actions, use single source of data for each value. + dispatch(setInstallationArgs({...installationArgs, installationDir: localYaml?.zowe?.runtimeDirectory, zosmfApplId: localYaml?.zOSMF?.applId, zosmfPort: localYaml?.zOSMF?.port, zosmfHost: localYaml?.zOSMF?.host, + nodeHome: localYaml?.node?.home, javaHome: localYaml?.java?.home, extensionDir: localYaml?.zowe?.extensionDirectory, logDir: localYaml?.zowe?.logDirectory, workspaceDir: localYaml?.zowe?.workspaceDirectory + })); + } else { + alertEmitter.emit('showAlert', details.error, 'error'); + } + }).finally(() => { + // TODO: Make it more smart, add these checks to the planning validation details and verify the input fields one by one with a status icon. + if (localYaml?.zowe?.logDirectory.startsWith(localYaml?.zowe?.runtimeDirectory) || + localYaml?.zowe?.workspaceDirectory.startsWith(localYaml?.zowe?.runtimeDirectory) || + localYaml?.zowe?.extensionDirectory.startsWith(localYaml?.zowe?.runtimeDirectory)) { + alertEmitter.emit('showAlert', `Some instance locations (workspace, logs or extensions) are defined inside the runtime directory ${localYaml?.zowe?.runtimeDirectory}. It is not recommended as the runtime directory ment to be read-only.`, 'warning', 20000); + } + }) + } + else { + setLocValidations(true); dispatch(setLoading(false)); - if (!details.error) { - alertEmitter.emit('hideAlert'); - setLocValidations(true); - setPlanningState(true); - setStep(2); - } else { - alertEmitter.emit('showAlert', details.error, 'error'); - } - }) + } } - + const onJobStatementChange = (newJobStatement: string) => { - setIsJobStatementUpdated(true); - setJobStatementValue(newJobStatement); - setJobHeaderSaved(false); - setJobStatementValidation(false); - dispatch(setJobStatement(newJobStatement)); + alertEmitter.emit('hideAlert'); dispatch(setJobStatementValid(false)); - setPlanningState(false); - setStep(0); + dispatch(setJobStatementVal(newJobStatement)); } - - const formChangeHandler = (key?: string, value?: (string | number), installationArg?: string) => { - setIsLocationsUpdated(true); - setPlanningStatus(false); - setLocationsValidated(false); - dispatch(setPlanningStatus(false)); - dispatch(setNextStepEnabled(false)); - setStep(1); + + const formChangeHandler = (key?: string, value?: (string | number)) => { + alertEmitter.emit('hideAlert'); + setLocValidations(false); + setValDetails({...validationDetails, javaVersion: '', nodeVersion: '', spaceAvailableMb: ''}); if (!key || !value) { - return; - } - - if(installationArg) { - const newInstallationArgs = { ...installationArgs, [installationArg]: value }; - dispatch(setInstallationArgs(newInstallationArgs)); - setInstArgs(newInstallationArgs); - window.electron.ipcRenderer.setConfigByKeyNoValidate("installationArgs", newInstallationArgs); + return; // REVIEW: This just does not allow to remove the last symbol in the input field which is odd, UI should handle that with red frame around the input or something similar. } - - const updatedYaml: any = updateAndReturnYaml(key, value) - - dispatch(setYaml(updatedYaml)); - setLocalYaml(updatedYaml); + dispatch(setYaml(updateAndReturnYaml(key, value))); } - const updateAndReturnYaml = (key: string, value: string | number) => { + const updateAndReturnYaml = (key: string, value: string | number, yaml?: any) => { + // REVIEW: Works for single element, but if you want to update several values in one function then the new yaml will not be dispatched yet and so the next value will overwrite the previous one. + // This either should be able to handle a set of values as input, or be able to work with modified yaml instead of localYaml. BTW so many names for yaml are confusing. const keys = key.split('.'); - const updatedYaml: any = { ...localYaml }; + let updatedYaml = !!yaml ? {...yaml} : { ...localYaml }; let nestedObject = updatedYaml; @@ -389,12 +297,7 @@ const Planning = () => {
- - - {/* TODO: Allow to choose Zowe version here by click here, support for other instalation types? */} - {zoweVersion ? `About to install latest Zowe version: ${zoweVersion} from the convenience build. Approximate required space: ${requiredSpace}MB` : ''} - {/* */} {`The basic role for the installation is the system programmer ( OMVS / z/OS ) @@ -406,7 +309,7 @@ For some stages, you may need additional permissions: Here is the most up to date, high-level installation overview for Zowe - {`Zen will run installation (zwe install) and initialization (zwe init) commands on the mainframe by submitting jobs through the FTP connection. + {`Wizard will run installation (zwe install) and initialization (zwe init) commands on the mainframe by submitting jobs through the FTP connection. Please customize the job statement below to match your system requirements. `} @@ -419,7 +322,7 @@ Please customize the job statement below to match your system requirements. multiline maxRows={6} value={jobStatementValue} - onChange={(e) => {dispatch(setConnectionArgs({...connectionArgs, jobStatement: e.target.value})); onJobStatementChange(e.target.value)}} + onChange={(e) => onJobStatementChange(e.target.value)} variant="standard" /> @@ -432,12 +335,15 @@ Please customize the job statement below to match your system requirements. {step > 0 ? - - {`Now let's define some properties like z/OS Unix locations, identifiers, and z/OSMF details (optional).`} + + {`Now let's define some properties like z/OS Unix locations, identifiers, and (optionally) z/OSMF details.`} -
+
+ { !!validationDetails.spaceAvailableMb &&
+ requiredSpace ? 'green' : '#eab240'}`, fontSize: '1rem', margin: '0 12px' }} /> +
}
{ - formChangeHandler("zowe.runtimeDirectory", e.target.value, "installationDir"); + formChangeHandler("zowe.runtimeDirectory", e.target.value); if(localYaml){ window.electron.ipcRenderer.setConfigByKeyNoValidate('zowe.runtimeDirectory', e.target.value).then((res: any) => { // console.log('updated zowe.runtimeDirectory') @@ -467,10 +373,10 @@ Please customize the job statement below to match your system requirements. style={{marginLeft: 0}} label="Workspace Directory" variant="standard" - value={localYaml?.zowe?.workspaceDirectory || installationArgs.workspaceDir || FALLBACK_YAML.zowe.workspaceDirectory} + value={localYaml?.zowe?.workspaceDirectory || FALLBACK_YAML.zowe.workspaceDirectory} inputProps={{ maxLength: JCL_UNIX_SCRIPT_CHARS }} onChange={(e) => { - formChangeHandler("zowe.workspaceDirectory", e.target.value, "workspaceDir"); + formChangeHandler("zowe.workspaceDirectory", e.target.value); if(localYaml){ window.electron.ipcRenderer.setConfigByKeyNoValidate('zowe.workspaceDirectory', e.target.value).then((res: any) => { // console.log('updated zowe.workspaceDirectory') @@ -489,10 +395,10 @@ Please customize the job statement below to match your system requirements. style={{marginLeft: 0}} label="Log Directory" variant="standard" - value={localYaml?.zowe?.logDirectory || installationArgs.logDir || FALLBACK_YAML.zowe.logDirectory} + value={localYaml?.zowe?.logDirectory || FALLBACK_YAML.zowe.logDirectory} inputProps={{ maxLength: JCL_UNIX_SCRIPT_CHARS }} onChange={(e) => { - formChangeHandler("zowe.logDirectory", e.target.value, "logDir"); + formChangeHandler("zowe.logDirectory", e.target.value); if(localYaml){ window.electron.ipcRenderer.setConfigByKeyNoValidate('zowe.logDirectory', e.target.value).then((res: any) => { // console.log('updated zowe.logDirectory') @@ -503,6 +409,8 @@ Please customize the job statement below to match your system requirements.

Read and writeable z/OS Unix location for Zowe's logs.

+
+
{ - formChangeHandler("zowe.extensionDirectory", e.target.value, "extensionDir"); + formChangeHandler("zowe.extensionDirectory", e.target.value); if(localYaml){ window.electron.ipcRenderer.setConfigByKeyNoValidate('zowe.extensionDirectory', e.target.value).then((res: any) => { // console.log('updated zowe.extensionDirectory') @@ -526,102 +434,19 @@ Please customize the job statement below to match your system requirements.
-
- { - formChangeHandler("zowe.rbacProfileIdentifier", e.target.value, "rbacProfile" ); - if(localYaml){ - window.electron.ipcRenderer.setConfigByKeyNoValidate('zowe.rbacProfileIdentifier', e.target.value).then((res: any) => { - // console.log('updated zowe.rbacProfileIdentifier') - }) - } - }} - /> -

ID used for determining resource names as used in RBAC authorization checks.

-
-
-
-
- -
- { - formChangeHandler("zowe.job.name", e.target.value, "jobName"); - if(localYaml){ - window.electron.ipcRenderer.setConfigByKeyNoValidate('zowe.job.name', e.target.value).then((res: any) => { - // console.log('updated zowe.job.name') - }) - } - }} - /> -

Job name of the Zowe primary ZWESLSTC started task.

-
-
- -
- { - formChangeHandler("zowe.job.prefix", e.target.value, "jobPrefix"); - if(localYaml){ - window.electron.ipcRenderer.setConfigByKeyNoValidate('zowe.job.prefix', e.target.value).then((res: any) => { - // console.log('updated zowe.job.prefi') - }) - } - }} - /> -

Short prefix to identify/customize address spaces created by the Zowe job.

-
-
- -
- { - formChangeHandler("zowe.cookieIdentifier", e.target.value, "cookieId"); - if(localYaml){ - window.electron.ipcRenderer.setConfigByKeyNoValidate('zowe.cookieIdentifier', e.target.value).then((res: any) => { - // console.log('updated zowe.cookieIdentifier') - }) - } - }} - /> -

ID that can be used by the servers to distinguish their cookies from unrelated Zowe installs.

-
-
- + { !!validationDetails.javaVersion &&
+ +
}
{ - formChangeHandler("java.home", e.target.value, "javaHome"); + formChangeHandler("java.home", e.target.value); if(localYaml){ window.electron.ipcRenderer.setConfigByKeyNoValidate('java.home', e.target.value).then((res: any) => { // console.log('updated zowe.java.home') @@ -629,20 +454,23 @@ Please customize the job statement below to match your system requirements. } }} /> -

z/OS Unix location of Java.

+

The z/OS Unix home directory for Java (JAVA_HOME).

+ { !!validationDetails.nodeVersion &&
+ +
}
{ - formChangeHandler("node.home", e.target.value, "nodeHome"); + formChangeHandler("node.home", e.target.value); if(localYaml){ window.electron.ipcRenderer.setConfigByKeyNoValidate('node.home', e.target.value).then((res: any) => { // console.log('updated zowe.node.home') @@ -650,24 +478,25 @@ Please customize the job statement below to match your system requirements. } }} /> -

z/OS Unix location of Node.js.

+

The z/OS Unix home directory for Node.js (NODE_HOME).

- { - setShowZosmfAttributes(e.target.checked); - formChangeHandler(); + // setShowZosmfAttributes(true); + // formChangeHandler(); }} /> } - label="Set z/OSMF Attributes (optional)" - /> - + label="Set z/OSMF Attributes (Recommended)" + /> */} {showZosmfAttributes && (
@@ -679,9 +508,9 @@ Please customize the job statement below to match your system requirements. style={{marginLeft: 0}} label="z/OSMF Host" variant="standard" - value={localYaml?.zOSMF?.host || installationArgs.zosmfHost || FALLBACK_YAML.zOSMF.host} + value={localYaml?.zOSMF?.host || FALLBACK_YAML.zOSMF.host} onChange={(e) => { - formChangeHandler("zOSMF.host", e.target.value, "zosmfHost"); + formChangeHandler("zOSMF.host", e.target.value); if(localYaml){ window.electron.ipcRenderer.setConfigByKeyNoValidate('zOSMF.host', e.target.value).then((res: any) => { // console.log('updated zowe.zOSMF.host') @@ -701,9 +530,9 @@ Please customize the job statement below to match your system requirements. label="z/OSMF Port" variant="standard" type="number" - value={localYaml?.zOSMF?.port || installationArgs.zosmfPort} + value={localYaml?.zOSMF?.port || FALLBACK_YAML.zOSMF.port} onChange={(e) => { - formChangeHandler("zOSMF.port", Number(e.target.value), "zosmfPort"); + formChangeHandler("zOSMF.port", Number(e.target.value)); if(localYaml){ window.electron.ipcRenderer.setConfigByKeyNoValidate('zOSMF.port', Number(e.target.value)).then((res: any) => { // console.log('updated zowe.zOSMF.port') @@ -724,9 +553,9 @@ Please customize the job statement below to match your system requirements. style={{marginLeft: 0}} label="z/OSMF Application Id" variant="standard" - value={localYaml?.zOSMF?.applId || installationArgs.zosmfApplId} + value={localYaml?.zOSMF?.applId || FALLBACK_YAML.zOSMF.applId} onChange={(e) => { - formChangeHandler("zOSMF.applId", e.target.value, "zosmfApplId"); + formChangeHandler("zOSMF.applId", e.target.value); if(localYaml){ window.electron.ipcRenderer.setConfigByKeyNoValidate('zOSMF.applId', e.target.value).then((res: any) => { // console.log('updated zowe.zOSMF.applId') @@ -735,29 +564,18 @@ Please customize the job statement below to match your system requirements. }} />

Application ID of your z/OSMF instance.

-
)} - + {locationsValidated ? : validationDetails.error ? null: null}
:
} - {/* 1 - ? - - {`Found Java version: ${validationDetails.javaVersion}, Node version: ${validationDetails.nodeVersion} - -All set, ready to proceed.` -} - - - :
} + {/* TODO: Add a checklist of components / settings user want to use, filter further steps accordingly */}
diff --git a/src/renderer/components/stages/ReviewInstallation.tsx b/src/renderer/components/stages/ReviewInstallation.tsx index 15550283..823166e4 100644 --- a/src/renderer/components/stages/ReviewInstallation.tsx +++ b/src/renderer/components/stages/ReviewInstallation.tsx @@ -8,7 +8,7 @@ * Copyright Contributors to the Zowe Project. */ -import React, {useEffect, useState} from "react"; +import React, {useEffect, useRef, useState} from "react"; import { useSelector } from 'react-redux'; import {Box, Button, Typography, Tooltip} from '@mui/material'; import CheckCircleIcon from '@mui/icons-material/CheckCircle'; @@ -17,14 +17,15 @@ import ContainerCard from '../common/ContainerCard'; import {stages} from "../configuration-wizard/Wizard"; import { selectConnectionArgs } from './connection/connectionSlice'; import { useAppSelector, useAppDispatch } from '../../hooks'; -import eventDispatcher from '../../../utils/eventDispatcher'; +import eventDispatcher from '../../../services/eventDispatcher'; import EditorDialog from "../common/EditorDialog"; import { createTheme } from '@mui/material/styles'; -import { selectConnectionStatus, selectPlanningStatus, selectInstallationTypeStatus, selectInitializationStatus, selectDatasetInstallationStatus, selectNetworkingStatus, selectApfAuthStatus, selectSecurityStatus, selectCertificateStatus, selectLaunchConfigStatus, setReviewStatus } from './progress/progressSlice'; +import { selectConnectionStatus, setReviewStatus } from './progress/progressSlice'; import { setActiveStep } from './progress/activeStepSlice'; import { setNextStepEnabled } from '../configuration-wizard/wizardSlice'; -import { getStageDetails, getSubStageDetails } from "../../../utils/StageDetails"; -import { getCompleteProgress } from "./progress/StageProgressStatus"; +import { getStageDetails } from "../../../services/StageDetails"; +import { TYPE_YAML, TYPE_OUTPUT } from '../common/Utils'; +import { getCompleteProgress, updateStepSkipStatus } from "./progress/StageProgressStatus"; import '../../styles/ReviewInstallation.css'; @@ -50,6 +51,7 @@ const ReviewInstallation = () => { useSelector(selectConnectionStatus), completeProgress.planningStatus, completeProgress.installationTypeStatus, + completeProgress.downloadUnpaxStatus, completeProgress.initializationStatus, ]; @@ -58,35 +60,21 @@ const ReviewInstallation = () => { completeProgress.networkingStatus, completeProgress.apfAuthStatus, completeProgress.securityStatus, + completeProgress.stcsStatus, completeProgress.certificateStatus, - completeProgress.vsamStatus, + completeProgress.cachingServiceStatus, completeProgress.launchConfigStatus ]; - const TYPE_YAML = "yaml"; - const TYPE_JCL = "jcl"; - const TYPE_OUTPUT = "output"; - useEffect(() => { const stageProgress = stageProgressStatus.every(status => status === true); const subStageProgress = subStageProgressStatus.every(status => status === true); - const setStageSkipStatus = (status: boolean) => { - stages[STAGE_ID].isSkipped = status; - } - - const setDsInstallStageStatus = (status: boolean) => { - dispatch(setNextStepEnabled(status)); - dispatch(setReviewStatus(status)); - } - if(stageProgress && subStageProgress) { - setStageSkipStatus(false); - setDsInstallStageStatus(true); + updateProgress(true); } else { - setStageSkipStatus(true); - setDsInstallStageStatus(false); + updateProgress(false); } return () => { @@ -94,6 +82,11 @@ const ReviewInstallation = () => { } }, []); + const updateProgress = (status: boolean) => { + dispatch(setNextStepEnabled(status)); + dispatch(setReviewStatus(status)); + } + const toggleEditorVisibility = (type: any) => { setContentType(type); setEditorVisible(!editorVisible); @@ -107,7 +100,7 @@ const ReviewInstallation = () => {
- + {/* */} @@ -147,7 +140,7 @@ const ReviewInstallation = () => { )} - {stage.id !== 0 && stage.id < 4 && ( + {stage.id !== 0 && stage.id < 5 && (
updateActiveStep(stage.id, false)}>{stage.label} diff --git a/src/renderer/components/stages/Security.tsx b/src/renderer/components/stages/Security.tsx index caada7b8..7dd0aedd 100644 --- a/src/renderer/components/stages/Security.tsx +++ b/src/renderer/components/stages/Security.tsx @@ -8,16 +8,14 @@ * Copyright Contributors to the Zowe Project. */ -import { useState, useEffect } from "react"; +import { useState, useEffect, useRef } from "react"; import { Box, Button, FormControl } from '@mui/material'; import { useAppSelector, useAppDispatch } from '../../hooks'; -import { selectYaml, selectSchema, setNextStepEnabled, setYaml, setSchema } from '../configuration-wizard/wizardSlice'; -import { setSecurityStatus, setInitializationStatus, selectSecurityStatus, selectInitializationStatus } from './progress/progressSlice'; +import { selectYaml, selectSchema, setNextStepEnabled, setYaml } from '../configuration-wizard/wizardSlice'; +import { setSecurityStatus, setInitializationStatus } from './progress/progressSlice'; import ContainerCard from '../common/ContainerCard'; import JsonForm from '../common/JsonForms'; import EditorDialog from "../common/EditorDialog"; -import Ajv from "ajv"; -import { selectInstallationArgs } from "./installation/installationSlice"; import { selectConnectionArgs } from "./connection/connectionSlice"; import { IResponse } from "../../../types/interfaces"; import ProgressCard from "../common/ProgressCard"; @@ -25,29 +23,27 @@ import React from "react"; import { createTheme } from '@mui/material/styles'; import { stages } from "../configuration-wizard/Wizard"; import { setActiveStep } from "./progress/activeStepSlice"; -import { getStageDetails, getSubStageDetails } from "../../../utils/StageDetails"; -import { setProgress, getProgress, setSecurityInitState, getSecurityInitState, mapAndSetSkipStatus, getInstallationArguments } from "./progress/StageProgressStatus"; +import { getStageDetails, getSubStageDetails } from "../../../services/StageDetails"; +import { setProgress, getProgress, setSecurityInitState, getSecurityInitState, updateSubStepSkipStatus, getInstallationArguments, isInitializationStageComplete } from "./progress/StageProgressStatus"; import { InitSubStepsState } from "../../../types/stateInterfaces"; -import { FALLBACK_SCHEMA, FALLBACK_YAML } from "../../../utils/yamlSchemaDefaults"; +import { JCL_UNIX_SCRIPT_OK, INIT_STAGE_LABEL, SECURITY_STAGE_LABEL, ajv, SERVER_COMMON } from '../common/Utils'; +import { alertEmitter } from "../Header"; const Security = () => { // TODO: Display granular details of installation - downloading - unpacking - running zwe command - const stageLabel = 'Initialization'; - const subStageLabel = 'Security'; + const [STAGE_ID] = useState(getStageDetails(INIT_STAGE_LABEL).id); + const [SUB_STAGES] = useState(!!getStageDetails(INIT_STAGE_LABEL).subStages); + const [SUB_STAGE_ID] = useState(SUB_STAGES ? getSubStageDetails(STAGE_ID, SECURITY_STAGE_LABEL).id : 0); - const STAGE_ID = getStageDetails(stageLabel).id; - const SUB_STAGES = !!getStageDetails(stageLabel).subStages; - const SUB_STAGE_ID = SUB_STAGES ? getSubStageDetails(STAGE_ID, subStageLabel).id : 0; - - const theme = createTheme(); + const [theme] = useState(createTheme()); const dispatch = useAppDispatch(); const [schema, setLocalSchema] = useState(useAppSelector(selectSchema)); - const [yaml, setLYaml] = useState(useAppSelector(selectYaml)); - const setupSchema = schema?.properties?.zowe?.properties?.setup?.properties?.security; - const [setupYaml, setSetupYaml] = useState(yaml?.zowe?.setup?.security ?? {product: 'RACF'}); + const [yaml, setLocalYaml] = useState(useAppSelector(selectYaml)); + const [setupSchema] = useState(schema?.properties?.zowe?.properties?.setup?.properties?.security); + const [setupYaml, setSetupYaml] = useState(yaml?.zowe?.setup?.security); const [showProgress, setShowProgress] = useState(getProgress('securityStatus')); const [init, setInit] = useState(false); const [editorVisible, setEditorVisible] = useState(false); @@ -57,55 +53,27 @@ const Security = () => { const [securityInitProgress, setSecurityInitProgress] = useState(getSecurityInitState()); const [stateUpdated, setStateUpdated] = useState(false); const [initClicked, setInitClicked] = useState(false); - const [reinit, setReinit] = useState(false); - - const installationArgs = getInstallationArguments(); - const connectionArgs = useAppSelector(selectConnectionArgs); - let timer: any; + const [stageStatus, setStageStatus] = useState(stages[STAGE_ID].subStages[SUB_STAGE_ID].isSkipped); + const stageStatusRef = useRef(stageStatus); - const section = 'security'; + const [installationArgs] = useState(getInstallationArguments()); + const [connectionArgs] = useState(useAppSelector(selectConnectionArgs)); - const ajv = new Ajv(); - ajv.addKeyword("$anchor"); - let securitySchema; - let validate: any; - if(schema) { - securitySchema = schema?.properties?.zowe?.properties?.setup?.properties?.security; - } - - if(securitySchema) { - validate = ajv.compile(securitySchema); - } + let timer: any; + const [validate] = useState(() => ajv.getSchema("https://zowe.org/schemas/v2/server-base") || ajv.compile(setupSchema)); useEffect(() => { + stageStatusRef.current = stageStatus; + }, [stageStatus]); - if(!yaml){ - window.electron.ipcRenderer.getConfig().then((res: IResponse) => { - if (res.status) { - dispatch(setYaml(res.details)); - setLYaml(res.details); - } else { - dispatch(setYaml(FALLBACK_YAML)); - setLYaml(FALLBACK_YAML); - } - }) - } - - if(!schema){ - window.electron.ipcRenderer.getSchema().then((res: IResponse) => { - if (res.status) { - dispatch(setSchema(res.details)); - } else { - dispatch(setSchema(FALLBACK_SCHEMA)); - setLocalSchema(FALLBACK_SCHEMA) - } - }) - } - - setShowProgress(initClicked || getProgress('securityStatus')); + useEffect(() => { let nextPosition; + const stepProgress = getProgress('securityStatus'); - if(getProgress('securityStatus')) { + dispatch(setInitializationStatus(isInitializationStageComplete())); + setShowProgress(initClicked || stepProgress); + + if(stepProgress) { nextPosition = document.getElementById('security-progress'); nextPosition?.scrollIntoView({ behavior: 'smooth', block: 'end' }); } else { @@ -113,10 +81,12 @@ const Security = () => { nextPosition?.scrollIntoView({behavior: 'smooth'}); } - updateProgress(getProgress('securityStatus')); + dispatch(setNextStepEnabled(stepProgress)); + setInit(true); return () => { + updateSubStepSkipStatus(SUB_STAGE_ID, stageStatusRef.current); dispatch(setActiveStep({ activeStepIndex: STAGE_ID, isSubStep: SUB_STAGES, activeSubStepIndex: SUB_STAGE_ID })); } }, []); @@ -127,8 +97,8 @@ const Security = () => { if(initClicked) { let nextPosition = document.getElementById('start-security-progress'); nextPosition?.scrollIntoView({ behavior: 'smooth', block: 'start' }); + dispatchActions(false); setStateUpdated(!stateUpdated); - dispatch(setSecurityStatus(false)); } }, [initClicked]); @@ -153,9 +123,8 @@ const Security = () => { useEffect(() => { const allAttributesTrue = Object.values(securityInitProgress).every(value => value === true); if(allAttributesTrue) { - dispatch(setSecurityStatus(true)); - dispatch(setNextStepEnabled(true)); setShowProgress(initClicked || getProgress('securityStatus')); + dispatchActions(true); } }, [securityInitProgress]); @@ -164,20 +133,18 @@ const Security = () => { setSecurityInitState(securityInitState); const allAttributesTrue = Object.values(securityInitState).every(value => value === true); if(allAttributesTrue) { - dispatch(setSecurityStatus(true)); - dispatch(setNextStepEnabled(true)); + dispatchActions(true); } } const setStageSkipStatus = (status: boolean) => { stages[STAGE_ID].subStages[SUB_STAGE_ID].isSkipped = status; - stages[STAGE_ID].isSkipped = status; - mapAndSetSkipStatus(SUB_STAGE_ID, status); + stages[STAGE_ID].isSkipped = !isInitializationStageComplete(); + setStageStatus(status); } const updateProgress = (status: boolean) => { setStateUpdated(!stateUpdated); - setStageSkipStatus(!status); if(!status) { for (let key in securityInitProgress) { securityInitProgress[key as keyof(InitSubStepsState)] = false; @@ -186,10 +153,15 @@ const Security = () => { } const allAttributesTrue = Object.values(securityInitProgress).every(value => value === true); status = allAttributesTrue ? true : false; - dispatch(setInitializationStatus(status)); + setSecurityInitializationProgress(getSecurityInitState()); + dispatchActions(status); + } + + const dispatchActions = (status: boolean) => { dispatch(setSecurityStatus(status)); + dispatch(setInitializationStatus(isInitializationStageComplete())); dispatch(setNextStepEnabled(status)); - setSecurityInitializationProgress(getSecurityInitState()); + setStageSkipStatus(!status); } const toggleEditorVisibility = (type: any) => { @@ -197,27 +169,50 @@ const Security = () => { setEditorVisible(!editorVisible); }; - const reinitialize = (event: any) => { - setReinit(true); - process(event); - } - const process = (event: any) => { + const process = async (event: any) => { setInitClicked(true); updateProgress(false); event.preventDefault(); - window.electron.ipcRenderer.initSecurityButtonOnClick(connectionArgs, installationArgs, yaml).then((res: IResponse) => { - updateProgress(res.status); + if(!installationArgs.dryRunMode){ + window.electron.ipcRenderer.initSecurityButtonOnClick(connectionArgs, installationArgs).then((res: IResponse) => { + // Some parts of Wizard pass the response as a string directly into the object + if (res.status == false && typeof res.details == "string") { + res.details = { 3: res.details }; + } + if (res?.details && res.details[3] && res.details[3].indexOf(JCL_UNIX_SCRIPT_OK) == -1) { // This check means we got an error during zwe init security + alertEmitter.emit('showAlert', 'Please view Job Output for more details', 'error'); + window.electron.ipcRenderer.setStandardOutput(res.details[3]).then((res: any) => { + toggleEditorVisibility("output"); + }) + updateProgress(false); clearInterval(timer); - }).catch((error: any) => { + } else { + updateProgress(res.status); clearInterval(timer); - updateProgress(false); - console.warn('zwe init security failed'); - }); + } + }).catch((err: any) => { + // TODO: Test this + //alertEmitter.emit('showAlert', err.toString(), 'error'); + updateProgress(false); + clearInterval(timer); + window.electron.ipcRenderer.setStandardOutput(`zwe init security failed: ${typeof err === "string" ? err : err.toString()}`).then((res: any) => { + toggleEditorVisibility("output"); + }) + }); + } + else{ + setSecurityInitState({ + writeYaml: true, + uploadYaml: true, + success: true + }); + updateProgress(true); + } } const handleFormChange = (data: any) => { - let newData = init ? (Object.keys(setupYaml).length > 0 ? setupYaml : data?.zowe?.setup?.security) : (data?.zowe?.setup?.security ? data?.zowe?.setup?.security : data); + let newData = (init && setupYaml) ? (Object.keys(setupYaml).length > 0 ? setupYaml : data?.zowe?.setup?.security) : (data?.zowe?.setup?.security ? data?.zowe?.setup?.security : data); setInit(false); if (newData) { @@ -245,11 +240,15 @@ const Security = () => {
- + {/* */} - {editorVisible && } + {editorVisible && { + const newData = init ? (Object.keys(setupYaml).length > 0 ? setupYaml : data?.zowe?.setup?.security) : (data?.zowe?.setup?.security ? data?.zowe?.setup?.security : data); + setStageConfig(true, '', newData); + } + }/> } dispatch(setYaml((await window.electron.ipcRenderer.getConfig()).details ?? yaml))}> {!isFormValid &&
{formError}
} handleFormChange(data)} formData={setupYaml}/> @@ -259,18 +258,18 @@ const Security = () => { : null} - + {!showProgress ? null : - - - - - + + + + + } - +
diff --git a/src/renderer/components/stages/Stcs.tsx b/src/renderer/components/stages/Stcs.tsx new file mode 100644 index 00000000..be4b0726 --- /dev/null +++ b/src/renderer/components/stages/Stcs.tsx @@ -0,0 +1,329 @@ +/* + * This program and the accompanying materials are made available under the terms of the + * Eclipse Public License v2.0 which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-v20.html + * + * SPDX-License-Identifier: EPL-2.0 + * + * Copyright Contributors to the Zowe Project. + */ + +import { useState, useEffect, useRef } from "react"; +import { Box, Button, FormControl, TextField, Typography } from '@mui/material'; +import { useAppSelector, useAppDispatch } from '../../hooks'; +import { selectYaml, selectSchema, setNextStepEnabled, setYaml } from '../configuration-wizard/wizardSlice'; +import { setStcsStatus, setInitializationStatus } from './progress/progressSlice'; +import ContainerCard from '../common/ContainerCard';import EditorDialog from "../common/EditorDialog"; +import { selectConnectionArgs } from "./connection/connectionSlice"; +import { IResponse } from "../../../types/interfaces"; +import ProgressCard from "../common/ProgressCard"; +import React from "react"; +import { createTheme } from '@mui/material/styles'; +import { stages } from "../configuration-wizard/Wizard"; +import { setActiveStep } from "./progress/activeStepSlice"; +import { getStageDetails, getSubStageDetails } from "../../../services/StageDetails"; +import { getProgress, setStcsInitState, getStcsInitState, updateSubStepSkipStatus, getInstallationArguments, isInitializationStageComplete } from "./progress/StageProgressStatus"; +import { InitSubStepsState } from "../../../types/stateInterfaces"; +import { alertEmitter } from "../Header"; +import { INIT_STAGE_LABEL, STC_STAGE_LABEL, ajv } from "../common/Utils"; + +const Stcs = () => { + + // TODO: Display granular details of installation - downloading - unpacking - running zwe command + const [subStageLabel] = useState(STC_STAGE_LABEL); + + const [STAGE_ID] = useState(getStageDetails(INIT_STAGE_LABEL).id); + const [SUB_STAGES] = useState(!!getStageDetails(INIT_STAGE_LABEL).subStages); + const [SUB_STAGE_ID] = useState(SUB_STAGES ? getSubStageDetails(STAGE_ID, subStageLabel).id : 0); + + const [theme] = useState(createTheme()); + + const dispatch = useAppDispatch(); + const [schema, setLocalSchema] = useState(useAppSelector(selectSchema)); + const [yaml, setLocalYaml] = useState(useAppSelector(selectYaml)); + const [setupYaml, setSetupYaml] = useState(yaml?.zowe?.setup?.security?.stcs); + const [setupDsYaml, setSetupDsYaml] = useState(yaml?.zowe?.setup?.dataset); + const [showProgress, setShowProgress] = useState(getProgress('stcsStatus')); + const [init, setInit] = useState(false); + const [editorVisible, setEditorVisible] = useState(false); + const [isFormValid, setIsFormValid] = useState(false); + const [formError, setFormError] = useState(''); + const [contentType, setContentType] = useState(''); + const [stcsInitProgress, setStcsInitProgress] = useState(getStcsInitState()); + const [stateUpdated, setStateUpdated] = useState(false); + const [initClicked, setInitClicked] = useState(false); + const [stageStatus, setStageStatus] = useState(stages[STAGE_ID].subStages[SUB_STAGE_ID].isSkipped); + const stageStatusRef = useRef(stageStatus); + + const [installationArgs] = useState(getInstallationArguments()); + const [connectionArgs] = useState(useAppSelector(selectConnectionArgs)); + let timer: any; + const [DEFAULT_ZOWE] = useState('ZWESLSTC'); + const [DEFAULT_ZIS] = useState('ZWESISTC'); + const [DEFAULT_AUX] = useState('ZWESASTC'); + + const [defaultErrorMessage] = useState("Please ensure that the values for security.stcs attributes and dataset.proclib are accurate."); + const [validate] = useState(() => ajv.getSchema("https://zowe.org/schemas/v2/server-base") || ajv.compile(schema?.properties?.zowe?.properties?.setup?.properties?.security?.properties?.stcs)) + + useEffect(() => { + stageStatusRef.current = stageStatus; + }, [stageStatus]); + + useEffect(() => { + let nextPosition; + const stepProgress = getProgress('stcsStatus'); + + dispatch(setInitializationStatus(isInitializationStageComplete())); + setShowProgress(initClicked || stepProgress); + + if(stepProgress) { + nextPosition = document.getElementById('stcs-progress'); + nextPosition?.scrollIntoView({ behavior: 'smooth', block: 'end' }); + } else { + nextPosition = document.getElementById('container-box-id'); + nextPosition?.scrollIntoView({behavior: 'smooth'}); + } + + setInit(true); + dispatch(setNextStepEnabled(stepProgress)); + + if(!setupYaml) { + const newYaml = {...yaml, zowe: {...yaml.zowe, setup: {...yaml.zowe.setup, security: {...yaml.zowe.setup.security, stcs: {zowe: DEFAULT_ZOWE, zis: DEFAULT_ZIS, aux: DEFAULT_AUX}}}}}; + window.electron.ipcRenderer.setConfig(newYaml); + setSetupYaml({zowe: DEFAULT_ZOWE, zis: DEFAULT_ZIS, aux: DEFAULT_AUX}); + setLocalYaml(newYaml); + dispatch(setYaml(newYaml)); + } + + return () => { + alertEmitter.emit('hideAlert'); + updateSubStepSkipStatus(SUB_STAGE_ID, stageStatusRef.current); + dispatch(setActiveStep({ activeStepIndex: STAGE_ID, isSubStep: SUB_STAGES, activeSubStepIndex: SUB_STAGE_ID })); + } + }, []); + + useEffect(() => { + setShowProgress(initClicked || getProgress('stcsStatus')); + + if(initClicked) { + let nextPosition = document.getElementById('start-stcs-progress'); + nextPosition?.scrollIntoView({ behavior: 'smooth', block: 'start' }); + dispatchActions(false); + setStateUpdated(!stateUpdated); + } + }, [initClicked]); + + useEffect(() => { + if(!getProgress('stcsStatus') && initClicked) { + timer = setInterval(() => { + window.electron.ipcRenderer.getInitStcsProgress().then((res: any) => { + setStcsInitializationProgress(res); + if(res.success){ + clearInterval(timer); + } + }) + }, 3000); + + if(showProgress) { + const nextPosition = document.getElementById('start-stcs-progress'); + nextPosition?.scrollIntoView({ behavior: 'smooth', block: 'start' }); + } + } + return () => { + clearInterval(timer); + }; + }, [showProgress, stateUpdated]); + + useEffect(() => { + const allAttributesTrue = Object.values(stcsInitProgress).every(value => value === true); + if(allAttributesTrue) { + dispatchActions(true); + setShowProgress(initClicked || getProgress('stcsStatus')); + } + }, [stcsInitProgress]); + + const setStcsInitializationProgress = (stcsInitState: InitSubStepsState) => { + setStcsInitProgress(stcsInitState); + setStcsInitState(stcsInitState); + const allAttributesTrue = Object.values(stcsInitState).every(value => value === true); + if(allAttributesTrue) { + dispatchActions(true); + } + } + + const setStageSkipStatus = (status: boolean) => { + stages[STAGE_ID].subStages[SUB_STAGE_ID].isSkipped = status; + stages[STAGE_ID].isSkipped = !isInitializationStageComplete(); + setStageStatus(status); + } + + const updateProgress = (status: boolean) => { + setStateUpdated(!stateUpdated); + if(!status) { + for (let key in stcsInitProgress) { + stcsInitProgress[key as keyof(InitSubStepsState)] = false; + setStcsInitState(stcsInitProgress); + } + } + const allAttributesTrue = Object.values(stcsInitProgress).every(value => value === true); + status = allAttributesTrue ? true : false; + setStcsInitializationProgress(getStcsInitState()); + dispatchActions(status); + } + + const dispatchActions = (status: boolean) => { + dispatch(setStcsStatus(status)); + dispatch(setInitializationStatus(isInitializationStageComplete())); + dispatch(setNextStepEnabled(status)); + setStageSkipStatus(!status); + } + + const toggleEditorVisibility = (type: any) => { + setContentType(type); + setEditorVisible(!editorVisible); + }; + + const reinitialize = (event: any) => { + process(event); + } + + const process = async (event: any) => { + alertEmitter.emit('hideAlert'); + + setInitClicked(true); + updateProgress(false); + event.preventDefault(); + + if(!installationArgs.dryRunMode){ + window.electron.ipcRenderer.initStcsButtonOnClick(connectionArgs, installationArgs).then((res: IResponse) => { + updateProgress(res.status); + if(res.error) { + alertEmitter.emit('showAlert', res.errorMsg+" "+defaultErrorMessage, 'error'); + } + clearInterval(timer); + }).catch((err: any) => { + clearInterval(timer); + updateProgress(false); + window.electron.ipcRenderer.setStandardOutput(`zwe init stc failed: ${typeof err === "string" ? err : err.toString()}`).then((res: any) => { + toggleEditorVisibility("output"); + }) + }); + } + else{ + setStcsInitState({ + writeYaml: true, + uploadYaml: true, + success: true + }); + updateProgress(true); + } + } + + const handleFormChange = (data: any) => { + let newData = init ? (Object.keys(setupYaml).length > 0 ? setupYaml : data?.zowe?.setup?.security?.stcs) : (data?.zowe?.setup?.security?.stcs ? data?.zowe?.setup?.security?.stcs : data); + setInit(false); + + if (newData) { + if(validate) { + validate(newData); + if(validate.errors) { + const errPath = validate.errors[0].schemaPath; + const errMsg = validate.errors[0].message; + setStageConfig(false, errPath+' '+errMsg, newData); + } else { + window.electron.ipcRenderer.setConfig({...yaml, zowe: {...yaml.zowe, setup: {...yaml.zowe.setup, security: {...yaml.zowe.setup.security, stcs: newData}}}}); + setStageConfig(true, '', newData); + } + } + } + }; + + const setStageConfig = (isValid: boolean, errorMsg: string, data: any) => { + setIsFormValid(isValid); + setFormError(errorMsg); + setSetupYaml(data); + } + + return ( +
+ + + {/* */} + + + + {editorVisible && { + const newData = init ? (Object.keys(setupYaml).length > 0 ? setupYaml : data?.zowe?.setup?.security?.stcs) : (data?.zowe?.setup?.security?.stcs ? data?.zowe?.setup?.security?.stcs : data); + setStageConfig(true, '', newData); + } + }/> } + + {`Please review the following started task (STC) configuration values from the security stage before initializing stcs.\n`} + + dispatch(setYaml((await window.electron.ipcRenderer.getConfig()).details ?? yaml))}> + {!isFormValid &&
{formError}
} + + + + + + + + + {!setupDsYaml?.proclib &&

The `dataset.proclib` is empty. Please ensure it contains the valid dataset name in the installation tab.

} + + {!showProgress ? + + : null} + + + + {!showProgress ? null : + + + + + + + } + +
+ +
+
+ ); +}; + +export default Stcs; \ No newline at end of file diff --git a/src/renderer/components/stages/Unpax.tsx b/src/renderer/components/stages/Unpax.tsx new file mode 100644 index 00000000..f091d420 --- /dev/null +++ b/src/renderer/components/stages/Unpax.tsx @@ -0,0 +1,329 @@ +/* + * This program and the accompanying materials are made available under the terms of the + * Eclipse Public License v2.0 which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-v20.html + * + * SPDX-License-Identifier: EPL-2.0 + * + * Copyright Contributors to the Zowe Project. + */ + +import {useEffect, useRef, useState} from "react"; +import { Box, Button, Link, Typography } from '@mui/material'; +import ContainerCard from '../common/ContainerCard'; +import { useAppSelector, useAppDispatch } from '../../hooks'; +import { selectYaml, setNextStepEnabled, setSchema, setYaml } from '../configuration-wizard/wizardSlice'; +import { selectZoweVersion} from './installation/installationSlice'; +import { selectConnectionArgs } from './connection/connectionSlice'; +import { setActiveStep } from "./progress/activeStepSlice"; +import { getStageDetails } from "../../../services/StageDetails"; +import { setDownloadUnpaxStatus } from './progress/progressSlice'; +import { downloadUnpaxStatus, getDownloadUnpaxState, getInstallationArguments, getInstallationTypeStatus, getProgress, setDownloadUnpaxState, setAndStoreZoweVersion, updateStepSkipStatus } from "./progress/StageProgressStatus"; +import React from "react"; +import ProgressCard from "../common/ProgressCard"; +import { alertEmitter } from "../Header"; +import { IResponse } from "../../../types/interfaces"; +import { UNPAX_STAGE_LABEL } from "../common/Utils"; +import { stages } from "../configuration-wizard/Wizard"; +import { DownloadUnpaxState } from "../../../../src/types/stateInterfaces"; +const Unpax = () => { + + // TODO: Display granular details of installation - downloading - unpacking - running zwe command + + const [stageLabel] = useState(UNPAX_STAGE_LABEL); + + const [STAGE_ID] = useState(getStageDetails(stageLabel).id); + const [SUB_STAGES] = useState(!!getStageDetails(stageLabel).subStages); + + const dispatch = useAppDispatch(); + const connectionArgs = useAppSelector(selectConnectionArgs); + const [installValue, setInstallValue] = useState(getInstallationTypeStatus()?.installationType || 'download'); + const [paxPath, setPaxPath] = useState(getInstallationTypeStatus()?.userUploadedPaxPath || ''); + const [showProgress, setShowProgress] = useState(getProgress('downloadUnpaxStatus')); + const [downloadUnpaxProgress, setDownloadUnpaxProgress] = useState(getDownloadUnpaxState()); + const [yaml, setLocalYaml] = useState(useAppSelector(selectYaml)); + const version = useAppSelector(selectZoweVersion); + + const [stateUpdated, setStateUpdated] = useState(false); + const [stageStatus, setStageStatus] = useState(stages[STAGE_ID].isSkipped); + const stageStatusRef = useRef(stageStatus); + const [isYamlFetched, setIsYamlFetched] = useState(false); + + const [installationArgs, setInstArgs] = useState(getInstallationArguments()); + let timer: any; + + useEffect(() => { + stageStatusRef.current = stageStatus; + }, [stageStatus]); + + useEffect(() => { + window.electron.ipcRenderer.getConfigByKey("installationArgs").then((res: IResponse) => { + if(res != undefined){ + setInstArgs((res as any)); + } + }) + + let nextPosition; + const stepProgress = getProgress('downloadUnpaxStatus') + + if(stepProgress) { + nextPosition = document.getElementById('download-progress-card'); + nextPosition?.scrollIntoView({ behavior: 'smooth', block: 'start' }); + } + + dispatch(setNextStepEnabled(stepProgress)); + + return () => { + updateStepSkipStatus(STAGE_ID, stageStatusRef.current); + dispatch(setActiveStep({ activeStepIndex: STAGE_ID, isSubStep: SUB_STAGES, activeSubStepIndex: 0 })); + } + }, []); + + useEffect(() => { + const stageComplete = downloadUnpaxProgress.uploadYaml && downloadUnpaxProgress.download && downloadUnpaxProgress.upload && downloadUnpaxProgress.unpax; + if(!stageComplete && showProgress && !(downloadUnpaxProgress.getExampleYaml && downloadUnpaxProgress.getSchemas)) { + timer = setInterval(() => { + window.electron.ipcRenderer.getDownloadUnpaxProgress().then((res: any) => { + let success; + setDownloadAndUnpaxProgress(res); + + if(isYamlFetched) { + success = res.getExampleYaml && res.getSchemas; + } else { + success = res.download && res.getExampleYaml && res.getSchemas && res.unpax && res.upload && res.uploadYaml; + } + + if(success){ + clearInterval(timer); + } + }) + }, 3000) + } + return () => { + clearInterval(timer); + }; + }, [showProgress, stateUpdated]); + + useEffect(() => { + const allAttributesTrue = Object.values(downloadUnpaxProgress).every(value => value === true); + if(allAttributesTrue) { + dispatchActions(true); + setShowProgress(getProgress('downloadUnpaxStatus')); + } + }, [downloadUnpaxProgress]); + + const setDownloadAndUnpaxProgress = (downloadUnpaxState: DownloadUnpaxState) => { + setDownloadUnpaxProgress(downloadUnpaxState); + setDownloadUnpaxState(downloadUnpaxState); + let allAttributesTrue = Object.values(downloadUnpaxState).every(value => value === true); + if(isYamlFetched) { + allAttributesTrue = downloadUnpaxState.getSchemas && downloadUnpaxState.getExampleYaml; + setIsYamlFetched(false); + } + if(allAttributesTrue) { + dispatchActions(true); + } + } + + const setStageSkipStatus = (status: boolean) => { + stages[STAGE_ID].isSkipped = status; + setStageStatus(status); + } + + const updateProgress = (status: boolean) => { + setStateUpdated(!stateUpdated); + setStageSkipStatus(!status); + if(!status) { + for (let key in downloadUnpaxProgress) { + downloadUnpaxProgress[key as keyof DownloadUnpaxState] = false; + setDownloadUnpaxState(downloadUnpaxProgress); + } + } + const allAttributesTrue = Object.values(downloadUnpaxProgress).every(value => value === true); + status = allAttributesTrue ? true : false; + setDownloadAndUnpaxProgress(getDownloadUnpaxState()); + dispatchActions(status); + } + + const dispatchActions = (status: boolean) => { + dispatch(setDownloadUnpaxStatus(status)); + dispatch(setNextStepEnabled(status)); + setStageSkipStatus(!status); + } + + const downloadUnpaxProgressAndStateTrue = { + uploadYaml: true, + download: true, + upload: true, + unpax: true, + getExampleYaml: true, + getSchemas: true, + }; + + const process = (event: any) => { + event.preventDefault(); + updateProgress(false); + setShowProgress(true); + + if(!installationArgs.dryRunMode){ + window.electron.ipcRenderer.downloadButtonOnClick(connectionArgs, {...installationArgs, userUploadedPaxPath: paxPath}, version).then((res: IResponse) => { + if(!res.status){ //errors during runInstallation() + alertEmitter.emit('showAlert', res.details, 'error'); + updateProgress(false); + } + + if(res.details?.manifestFile?.version) { + setZoweVersion(res.details?.manifestFile?.version); + } + + if(res.details?.mergedYaml != undefined){ + dispatch(setYaml(res.details.mergedYaml)); + window.electron.ipcRenderer.setConfig(res.details.mergedYaml); + } + window.electron.ipcRenderer.getSchema().then((res: IResponse) => { + if(res && res.details) { + dispatch(setSchema(res.details)); + } + }) + clearInterval(timer); + updateProgress(res.status); + }).catch(() => { + clearInterval(timer); + updateProgress(false); + }); + } else{ + setDownloadUnpaxProgress(downloadUnpaxProgressAndStateTrue); + setDownloadUnpaxState(downloadUnpaxProgressAndStateTrue); + dispatch(setNextStepEnabled(true)); + dispatch(setDownloadUnpaxStatus(true)); + } + } + + const setZoweVersion = (version: string): void => { + if(!version) { + return; + } + const versionString = version; + const majorVersion = parseInt(versionString.split('.')[0], 10); + setAndStoreZoweVersion(majorVersion); + } + + const fetchExampleYaml = (event: any) => { + setIsYamlFetched(true); + event.preventDefault(); + setShowProgress(true); + updateProgress(false); + + if(!installationArgs.dryRunMode){ + window.electron.ipcRenderer.fetchExampleYamlBtnOnClick(connectionArgs, installationArgs).then((res: IResponse) => { + setDownloadUnpaxProgress({ + ...downloadUnpaxProgress, + getExampleYaml: false, + getSchemas: false, + }); + if(!res.status){ //errors during runInstallation() + alertEmitter.emit('showAlert', res.details.message ? res.details.message : res.details, 'error'); + updateProgress(false); + } + if(res.details?.manifestFile?.version) { + setZoweVersion(res.details?.manifestFile?.version); + } + if(res.details?.mergedYaml != undefined){ + dispatch(setYaml(res.details.mergedYaml)); + window.electron.ipcRenderer.setConfig(res.details.mergedYaml); + } + window.electron.ipcRenderer.getSchema().then((res: IResponse) => { + if(res && res.details) { + dispatch(setSchema(res.details)); + } + }) + updateProgress(res.status); + clearInterval(timer); + }).catch((err: any) => { + clearInterval(timer); + alertEmitter.emit('showAlert', typeof err === "string" ? err : err.toString(), 'error'); + updateProgress(false); + }); + } + else{ + setDownloadUnpaxProgress(downloadUnpaxProgressAndStateTrue); + setDownloadUnpaxState(downloadUnpaxProgressAndStateTrue); + dispatch(setNextStepEnabled(true)); + dispatch(setDownloadUnpaxStatus(true)); + } + } + + return (<> + {installValue === "smpe" && + + {`The SMP/E process has already downloaded the required Zowe runtime files. Wizard will now retrieve the example-zowe.yaml and schemas for the yaml. Skip this step if you have already fetched these files.`} + + {!showProgress && + + } + {showProgress && + + + + + + } + } + {installValue === "download" && + + {`Wizard will download the latest Zowe convenience build in PAX archive format from `} + + {'https://www.zowe.org/download'} + + {`. Skip this step if you have already downloaded Zowe.`} + + {!showProgress && + + } + {showProgress && + + + + + + + + + + } + } + {installValue === "upload" && + + {`Wizard will upload and unpax the Zowe runtime files from ${paxPath}. Skip this step if you have already uploaded a Zowe pax.`} + + {!showProgress && + + } + {showProgress && + + + + + + + + + } + } + + ); +}; + +export default Unpax; diff --git a/src/renderer/components/stages/Vsam.tsx b/src/renderer/components/stages/Vsam.tsx deleted file mode 100644 index 32c0bb67..00000000 --- a/src/renderer/components/stages/Vsam.tsx +++ /dev/null @@ -1,351 +0,0 @@ -/* - * This program and the accompanying materials are made available under the terms of the - * Eclipse Public License v2.0 which accompanies this distribution, and is available at - * https://www.eclipse.org/legal/epl-v20.html - * - * SPDX-License-Identifier: EPL-2.0 - * - * Copyright Contributors to the Zowe Project. - */ - -import { useState, useEffect } from "react"; -import { Box, Button, FormControl, TextField } from '@mui/material'; -import { useAppSelector, useAppDispatch } from '../../hooks'; -import { selectYaml, selectSchema, setNextStepEnabled, setYaml } from '../configuration-wizard/wizardSlice'; -import { setInitializationStatus, setVsamStatus } from './progress/progressSlice'; -import ContainerCard from '../common/ContainerCard'; -import JsonForm from '../common/JsonForms'; -import EditorDialog from "../common/EditorDialog"; -import Ajv from "ajv"; -import { selectConnectionArgs } from "./connection/connectionSlice"; -import { IResponse } from "../../../types/interfaces"; -import ProgressCard from "../common/ProgressCard"; -import React from "react"; -import { createTheme } from '@mui/material/styles'; -import { stages } from "../configuration-wizard/Wizard"; -import { setActiveStep } from "./progress/activeStepSlice"; -import { getStageDetails, getSubStageDetails } from "../../../utils/StageDetails"; -import { setProgress, getProgress, setVsamInitState, mapAndSetSkipStatus, getInstallationArguments, getVsamInitState } from "./progress/StageProgressStatus"; -import { InitSubStepsState } from "../../../types/stateInterfaces"; -import { alertEmitter } from "../Header"; - -const Vsam = () => { - - // TODO: Display granular details of installation - downloading - unpacking - running zwe command - - const stageLabel = 'Initialization'; - const subStageLabel = 'Vsam'; - - const STAGE_ID = getStageDetails(stageLabel).id; - const SUB_STAGES = !!getStageDetails(stageLabel).subStages; - const SUB_STAGE_ID = SUB_STAGES ? getSubStageDetails(STAGE_ID, subStageLabel).id : 0; - - const theme = createTheme(); - - const dispatch = useAppDispatch(); - const schema = useAppSelector(selectSchema); - const [yaml, setLYaml] = useState(useAppSelector(selectYaml)); - const setupSchema = schema?.properties?.zowe?.properties?.setup?.properties?.vsam; - const [setupYaml, setSetupYaml] = useState(yaml?.zowe?.setup?.vsam); - const [showProgress, setShowProgress] = useState(getProgress('vsamStatus')); - const [init, setInit] = useState(false); - const [editorVisible, setEditorVisible] = useState(false); - const [isFormValid, setIsFormValid] = useState(false); - const [formError, setFormError] = useState(''); - const [contentType, setContentType] = useState(''); - const [vsamInitProgress, setVsamInitProgress] = useState(getVsamInitState()); - const [stateUpdated, setStateUpdated] = useState(false); - const [initClicked, setInitClicked] = useState(false); - const [reinit, setReinit] = useState(false); - - const [vsamDatasetName, setVsamDatasetName] = useState(""); - const [isDsNameValid, setIsDsNameValid] = useState(true); - const [initError, setInitError] = useState(false); - const [initErrorMsg, setInitErrorMsg] = useState(''); - - const installationArgs = getInstallationArguments(); - const connectionArgs = useAppSelector(selectConnectionArgs); - let timer: any; - - const defaultErrorMessage = "Please ensure that the volume, storage class & dataset values are accurate."; - - const ajv = new Ajv(); - ajv.addKeyword("$anchor"); - let vsamSchema; - let validate: any; - if(schema) { - vsamSchema = schema?.properties?.zowe?.properties?.setup?.properties?.vsam; - } - - if(vsamSchema) { - validate = ajv.compile(vsamSchema); - } - - useEffect(() => { - - setShowProgress(initClicked || getProgress('vsamStatus')); - let nextPosition; - - const vsamDatasetName = yaml?.components[`caching-service`]?.storage?.vsam?.name|| ''; - if(vsamDatasetName) { - datasetValidation(vsamDatasetName); - } - - if(getProgress('vsamStatus')) { - nextPosition = document.getElementById('vsam-progress'); - nextPosition?.scrollIntoView({ behavior: 'smooth', block: 'end' }); - } else { - nextPosition = document.getElementById('container-box-id'); - nextPosition?.scrollIntoView({behavior: 'smooth'}); - } - - updateProgress(getProgress('vsamStatus')); - setInit(true); - - return () => { - alertEmitter.emit('hideAlert'); - dispatch(setActiveStep({ activeStepIndex: STAGE_ID, isSubStep: SUB_STAGES, activeSubStepIndex: SUB_STAGE_ID })); - } - }, []); - - useEffect(() => { - setShowProgress(initClicked || getProgress('vsamStatus')); - - if(initClicked) { - let nextPosition = document.getElementById('start-vsam-progress'); - nextPosition?.scrollIntoView({ behavior: 'smooth', block: 'start' }); - setStateUpdated(!stateUpdated); - dispatch(setVsamStatus(false)); - } - }, [initClicked]); - - useEffect(() => { - if(!getProgress('vsamStatus') && initClicked) { - timer = setInterval(() => { - window.electron.ipcRenderer.getInitVsamProgress().then((res: any) => { - setVsamInitializationProgress(res); - }) - }, 3000); - - if(showProgress) { - const nextPosition = document.getElementById('start-vsam-progress'); - nextPosition?.scrollIntoView({ behavior: 'smooth', block: 'start' }); - } - } - return () => { - clearInterval(timer); - }; - }, [showProgress, stateUpdated]); - - useEffect(() => { - const allAttributesTrue = Object.values(vsamInitProgress).every(value => value === true); - if(allAttributesTrue) { - dispatch(setVsamStatus(true)); - dispatch(setNextStepEnabled(true)); - setShowProgress(initClicked || getProgress('vsamStatus')); - } - }, [vsamInitProgress]); - - const setVsamInitializationProgress = (vsamInitState: InitSubStepsState) => { - setVsamInitProgress(vsamInitState); - setVsamInitState(vsamInitState); - const allAttributesTrue = Object.values(vsamInitState).every(value => value === true); - if(allAttributesTrue) { - dispatch(setVsamStatus(true)); - dispatch(setNextStepEnabled(true)); - } - } - - const setStageSkipStatus = (status: boolean) => { - stages[STAGE_ID].subStages[SUB_STAGE_ID].isSkipped = status; - stages[STAGE_ID].isSkipped = status; - mapAndSetSkipStatus(SUB_STAGE_ID, status); - } - - const updateProgress = (status: boolean) => { - setStateUpdated(!stateUpdated); - setStageSkipStatus(!status); - if(!status) { - for (let key in vsamInitProgress) { - vsamInitProgress[key as keyof(InitSubStepsState)] = false; - setVsamInitState(vsamInitProgress); - } - } - const allAttributesTrue = Object.values(vsamInitProgress).every(value => value === true); - status = allAttributesTrue ? true : false; - dispatch(setInitializationStatus(status)); - dispatch(setVsamStatus(status)); - dispatch(setNextStepEnabled(status)); - setVsamInitializationProgress(getVsamInitState()); - } - - const toggleEditorVisibility = (type: any) => { - setContentType(type); - setEditorVisible(!editorVisible); - }; - - const reinitialize = (event: any) => { - setReinit(true); - process(event); - } - - const process = (event: any) => { - alertEmitter.emit('hideAlert'); - - setInitClicked(true); - updateProgress(false); - event.preventDefault(); - window.electron.ipcRenderer.initVsamButtonOnClick(connectionArgs, installationArgs, yaml).then((res: IResponse) => { - updateProgress(res.status); - if(res.error) { - setInitError(true); - setInitErrorMsg(`${res ? res.errorMsg : ''} ${defaultErrorMessage}`); - alertEmitter.emit('showAlert', res.errorMsg+" "+defaultErrorMessage, 'error'); - } - clearInterval(timer); - }).catch((error: any) => { - clearInterval(timer); - updateProgress(false); - console.warn('zwe init vsam failed'); - }); - } - - const handleFormChange = (data: any) => { - alertEmitter.emit('hideAlert'); - - let newData = init ? (Object.keys(setupYaml).length > 0 ? setupYaml : data?.zowe?.setup?.vsam) : (data?.zowe?.setup?.vsam ? data?.zowe?.setup?.vsam : data); - setInit(false); - - if (newData) { - if(validate) { - validate(newData); - if(validate.errors) { - const errPath = validate.errors[0].schemaPath; - const errMsg = validate.errors[0].message; - setStageConfig(false, errPath+' '+errMsg, newData, data); - } else { - window.electron.ipcRenderer.setConfig({...yaml, zowe: {...yaml.zowe, setup: {...yaml.zowe.setup, vsam: newData}}}); - setStageConfig(true, '', newData, data); - } - } - } - }; - - const setStageConfig = (isValid: boolean, errorMsg: string, data: any, updatedYaml?: any) => { - setIsFormValid(isValid); - setFormError(errorMsg); - setSetupYaml(data); - if(updatedYaml?.zowe) { - setLYaml(updatedYaml); - } - handleUpdateYaml(data, updatedYaml); - } - - const handleUpdateYaml = (data: any, newYaml: any) => { - const currentYaml = newYaml?.zowe ? newYaml : yaml; - const updatedYaml = { - ...currentYaml, - zowe: { - ...currentYaml.zowe, - setup: { - ...currentYaml.zowe.setup, - vsam: { - ...data, - } - } - } - }; - setLYaml(updatedYaml); - dispatch(setYaml(updatedYaml)); - } - - const handleUpdateVsamName = (newName: string) => { - const updatedYaml = { - ...yaml, - components: { - ...yaml.components, - 'caching-service': { - ...yaml.components['caching-service'], - storage: { - ...yaml.components['caching-service'].storage, - vsam: { - ...yaml.components['caching-service'].storage.vsam, - name: newName - } - } - } - } - }; - setLYaml(updatedYaml); - dispatch(setYaml(updatedYaml)); - }; - - const datasetValidation = (dsName: string) => { - const DsNamePattern = "^[a-zA-Z#$@][a-zA-Z0-9#$@-]{0,7}([.][a-zA-Z#$@][a-zA-Z0-9#$@-]{0,7}){0,21}$"; - const regEx = new RegExp(DsNamePattern); - setIsDsNameValid(regEx.test(dsName)); - } - - - const cachingServiceChangeHandler = (newValue: string) => { - alertEmitter.emit('hideAlert'); - datasetValidation(newValue); - handleUpdateVsamName(newValue); - } - - return ( -
- - - - - - - {editorVisible && } - - dispatch(setYaml((await window.electron.ipcRenderer.getConfig()).details.config ?? yaml))}> - {!isFormValid &&
{formError}
} - handleFormChange(data)} formData={setupYaml}/> - - -
- { - cachingServiceChangeHandler(e.target.value); - }} - /> - {isDsNameValid &&

Zowe Caching Service VSAM data set.

} - {!isDsNameValid &&

Invalid input. Please enter a valid VSAM dataset name.

} -
-
- - {!showProgress ? - - : null} - - - - {!showProgress ? null : - - - - - - - } - -
- - -
-
- ); -}; - -export default Vsam; \ No newline at end of file diff --git a/src/renderer/components/stages/connection/Connection.tsx b/src/renderer/components/stages/connection/Connection.tsx index 1763e5b2..0d6e6096 100644 --- a/src/renderer/components/stages/connection/Connection.tsx +++ b/src/renderer/components/stages/connection/Connection.tsx @@ -9,7 +9,6 @@ */ import React, { SyntheticEvent, useEffect, useState } from "react"; -import { useSelector } from 'react-redux'; import Accordion from '@mui/material/Accordion'; import AccordionSummary from '@mui/material/AccordionSummary'; import AccordionDetails from '@mui/material/AccordionDetails'; @@ -24,30 +23,23 @@ import FormControlLabel from '@mui/material/FormControlLabel'; import Typography from '@mui/material/Typography'; import secureIcon from '../../../assets/secure.png'; import CheckCircle from '@mui/icons-material/CheckCircle'; -import ArrowCircleRightIcon from '@mui/icons-material/ArrowCircleRight'; -import { Tooltip } from '@mui/material'; import ContainerCard from '../../common/ContainerCard'; import { useAppSelector, useAppDispatch } from '../../../hooks'; import { IResponse } from '../../../../types/interfaces'; -import { setConnectionArgs, setConnectionValidationDetails, setHost, setPort, - setUser, setPassword, setSecure, setSecureOptions, selectConnectionArgs, setAcceptCertificates, selectConnectionSecure, selectConnectionValidationDetails, selectAcceptCertificates, selectResumeProgress} from './connectionSlice'; -import { setYaml, setSchema, setLoading, setNextStepEnabled, selectZoweCLIVersion } from '../../configuration-wizard/wizardSlice'; +import { setConnectionValidationDetails, setHost, setPort, + setUser, setSecure, setSecureOptions, selectConnectionArgs, setAcceptAllCertificates, selectConnectionSecure, selectConnectionValidationDetails, selectAcceptAllCertificates, selectResumeProgress, setPassword} from './connectionSlice'; +import { setLoading, setNextStepEnabled, selectZoweCLIVersion} from '../../configuration-wizard/wizardSlice'; import { setConnectionStatus, selectConnectionStatus} from '../progress/progressSlice'; import { Container } from "@mui/material"; import { alertEmitter } from "../../Header"; -import { getStageDetails, initStageSkipStatus } from "../../../../utils/StageDetails"; +import { getStageDetails, initSubStageSkipStatus, initStageSkipStatus } from "../../../../services/StageDetails"; import { initializeProgress, getActiveStage } from "../progress/StageProgressStatus"; -import eventDispatcher from "../../../../utils/eventDispatcher"; -import { setZoweVersion, setInstallationArgs, selectInstallationArgs, selectZoweVersion } from '../installation/installationSlice'; -import { EXAMPLE_YAML, YAML_SCHEMA } from "../../../config/constants"; +import eventDispatcher from "../../../../services/eventDispatcher"; +import { setLocationValidationDetails } from "../PlanningSlice"; +import { selectInstallationArgs } from "../installation/installationSlice"; const Connection = () => { - const stageLabel = 'Connection'; - - const STAGE_ID = getStageDetails(stageLabel).id; - const SUB_STAGES = !!getStageDetails(stageLabel).subStages; - const dispatch = useAppDispatch(); const zoweCLIVersion = useAppSelector(selectZoweCLIVersion); const [expanded, setExpanded] = React.useState('FTPConn'); @@ -59,6 +51,19 @@ const Connection = () => { const connectionStatus = useAppSelector(selectConnectionStatus); useEffect(() => { + //This is a dirty hack to stop app from reloading to connection screen instead of home + const pageAccessedByReload = ( + (window.performance.navigation && window.performance.navigation.type === 1) || + window.performance + .getEntriesByType('navigation') + .map((nav: any) => nav.type) + .includes('reload') + ); + if(pageAccessedByReload){ + if(window.location.href.substring(0, window.location.href.lastIndexOf('/')) != window.location.origin) + window.location.assign(window.location.href.substring(0, window.location.href.lastIndexOf('/'))); + } + //End of dirty hack connectionStatus ? dispatch(setNextStepEnabled(true)) : dispatch(setNextStepEnabled(false)); }, []); @@ -118,13 +123,15 @@ const FTPConnectionForm = () => { const connectionArgs = useAppSelector(selectConnectionArgs); const connValidationDetails = useAppSelector(selectConnectionValidationDetails); const [isFtpConnection, setIsFtpConnection] = useState(useAppSelector(selectConnectionSecure)); - const [isCertificateAccepted, setIsCertificateAccepted] = useState(useAppSelector(selectAcceptCertificates)); + const [isAllCertificatesAccepted, setIsAllCertificatesAccepted] = useState(useAppSelector(selectAcceptAllCertificates)); const [formProcessed, toggleFormProcessed] = React.useState(false); const [validationDetails, setValidationDetails] = React.useState(''); const [isResume, setIsResume] = useState(useAppSelector(selectResumeProgress)); + const installationArgs = useAppSelector(selectInstallationArgs); + const handleFormChange = (ftpConnection?:boolean, acceptCerts?:boolean) => { dispatch(setConnectionStatus(false)); dispatch(setNextStepEnabled(false)); @@ -137,48 +144,50 @@ const FTPConnectionForm = () => { } alertEmitter.emit('hideAlert'); dispatch(setLoading(true)); - window.electron.ipcRenderer + + if(!installationArgs.dryRunMode){ + window.electron.ipcRenderer .connectionButtonOnClick(connectionArgs) .then((res: IResponse) => { dispatch(setConnectionStatus(res.status)); if(res.status) { dispatch(setNextStepEnabled(true)); - initializeProgress(connectionArgs.host, connectionArgs.user); + dispatch(setConnectionStatus(true)); + initializeProgress(connectionArgs.host, connectionArgs.user, isResume); initStageSkipStatus(); - setYamlAndConfig(); + initSubStageSkipStatus(); + setResume(); } toggleFormProcessed(true); setValidationDetails(res.details); dispatch(setConnectionValidationDetails(res.details)); dispatch(setLoading(false)); }); + } + else{ + dispatch(setConnectionStatus(true)); + toggleFormProcessed(true); + dispatch(setNextStepEnabled(true)); + dispatch(setLoading(false)); + } }; - const setYamlAndConfig = () => { - window.electron.ipcRenderer.getConfig().then((res: IResponse) => { - if (res && res.status && res.details) { - dispatch(setYaml(res.details.config)); - const schema = res.details.schema; - dispatch(setSchema(schema)); - } else { - dispatch(setYaml(EXAMPLE_YAML)); - dispatch(setSchema(YAML_SCHEMA)); - window.electron.ipcRenderer.setConfig(EXAMPLE_YAML).then((res: IResponse) => { - // yaml response - }); - window.electron.ipcRenderer.setSchema(YAML_SCHEMA).then((res: IResponse) => { - // schema response - }); - } - const { activeStepIndex, isSubStep, activeSubStepIndex } = getActiveStage(); + const setResume = () => { + const { activeStepIndex, isSubStep, activeSubStepIndex } = getActiveStage(); - if(isResume) { - eventDispatcher.emit('updateActiveStep', activeStepIndex, isSubStep, activeSubStepIndex); - setIsResume(false); - } - }) + if(isResume) { + eventDispatcher.emit('updateActiveStep', activeStepIndex, isSubStep, activeSubStepIndex); + setIsResume(false); + } } + useEffect(() => { // Set Wizard init to defaults - acceptAll -> false, rejectUnauth -> true + dispatch(setSecureOptions({...connectionArgs.secureOptions, rejectUnauthorized: true})); + dispatch(setAcceptAllCertificates(false)); + handleFormChange(); + setIsAllCertificatesAccepted(false); + }, []); + return ( {e.preventDefault(); processForm();}} @@ -203,7 +212,7 @@ const FTPConnectionForm = () => { type="number" InputLabelProps={{ shrink: true }} variant="standard" - helperText="FTP port number. If not specified, Zen will try to use a default service port." + helperText="FTP port number. If not specified, Wizard will try to use a default service port." value={connectionArgs.port} onChange={(e) => { dispatch(setPort(Number(e.target.value))); handleFormChange(); }} /> @@ -246,7 +255,7 @@ const FTPConnectionForm = () => { setIsFtpConnection(e.target.checked); }} />} - label="(Recommended, optional) Use FTP with TLS." + label="(Recommended) Use FTP with TLS." labelPlacement="start" /> @@ -298,16 +307,16 @@ const FTPConnectionForm = () => { { - dispatch(setSecureOptions({...connectionArgs.secureOptions, rejectUnauthorized: !e.target.value})); - dispatch(setAcceptCertificates(e.target.checked)); + dispatch(setSecureOptions({...connectionArgs.secureOptions, rejectUnauthorized: !e.target.checked})); + dispatch(setAcceptAllCertificates(e.target.checked)); handleFormChange(); - setIsCertificateAccepted(e.target.checked); + setIsAllCertificatesAccepted(e.target.checked); }} /> } - label="Accept all certificates." + label="(Not recommended) Accept all certificates." labelPlacement="start" /> diff --git a/src/renderer/components/stages/connection/connectionSlice.ts b/src/renderer/components/stages/connection/connectionSlice.ts index fbb4a1f8..950a81de 100644 --- a/src/renderer/components/stages/connection/connectionSlice.ts +++ b/src/renderer/components/stages/connection/connectionSlice.ts @@ -11,6 +11,7 @@ import { createSlice, PayloadAction } from '@reduxjs/toolkit'; import { RootState } from '../../../store'; import { IIpcConnectionArgs, IIpcConnectionArgsSecureOptions } from '../../../../types/interfaces'; +import { DEF_JOB_STATEMENT } from '../../common/Utils'; export interface ConnectionState { connectionArgs: IIpcConnectionArgs; @@ -27,7 +28,7 @@ const initialState: ConnectionState = { port: 21, user: '', password: '', - jobStatement: "//ZWEJOB01 JOB IZUACCT,'SYSPROG',CLASS=A,\n// MSGLEVEL=(1,1),MSGCLASS=A", + jobStatement: DEF_JOB_STATEMENT, secure: false, secureOptions: { enableTrace: false, @@ -75,7 +76,7 @@ export const connectionSlice = createSlice({ setConnectionValidationDetails: (state, action: PayloadAction) => { state.connectionValidationDetails = action.payload; }, - setAcceptCertificates: (state, action: PayloadAction) => { + setAcceptAllCertificates: (state, action: PayloadAction) => { state.acceptCertificates = action.payload; }, setResumeProgress: (state, action: PayloadAction) => { @@ -85,13 +86,13 @@ export const connectionSlice = createSlice({ }); export const { setConnectionArgs, setHost, setPort, - setUser, setPassword, setJobStatementVal, setSecure, setSecureOptions, setConnectionValidationDetails, setAcceptCertificates, setResumeProgress, + setUser, setPassword, setJobStatementVal, setSecure, setSecureOptions, setConnectionValidationDetails, setAcceptAllCertificates, setResumeProgress, } = connectionSlice.actions; export const selectConnectionArgs = (state: RootState) => state.connection.connectionArgs; export const selectConnectionSecure= (state: RootState) => state.connection.connectionArgs.secure; export const selectConnectionValidationDetails = (state: RootState) => state.connection.connectionValidationDetails; -export const selectAcceptCertificates = (state: RootState) => state.connection.acceptCertificates; +export const selectAcceptAllCertificates = (state: RootState) => state.connection.acceptCertificates; export const selectInitJobStatement = (state: RootState) => state.connection.connectionArgs.jobStatement; export const selectResumeProgress = (state: RootState) => state.connection.resumeProgress; diff --git a/src/renderer/components/stages/installation/InstallTypeSelection.tsx b/src/renderer/components/stages/installation/InstallTypeSelection.tsx index 69028763..69a74a40 100644 --- a/src/renderer/components/stages/installation/InstallTypeSelection.tsx +++ b/src/renderer/components/stages/installation/InstallTypeSelection.tsx @@ -8,29 +8,28 @@ * Copyright Contributors to the Zowe Project. */ -import {useEffect, useRef, useState} from "react"; +import {useEffect, useState} from "react"; import { Box, Button, FormControl, FormControlLabel, Link, Radio, RadioGroup, Typography } from '@mui/material'; import ContainerCard from '../../common/ContainerCard'; import { useAppSelector, useAppDispatch } from '../../../hooks'; import { setNextStepEnabled } from '../../configuration-wizard/wizardSlice'; -import { selectInstallationArgs, selectZoweVersion, setInstallationArgs, setInstallationType, setLicenseAgreement, setUserUploadedPaxPath, selectInstallationType, selectLicenseAgreement } from './installationSlice'; -import { setInstallationTypeStatus } from "../progress/progressSlice"; +import { selectInstallationArgs, setInstallationArgs, setInstallationType, setLicenseAgreement, setUserUploadedPaxPath } from './installationSlice'; +import { setDownloadUnpaxStatus, setInstallationTypeStatus } from "../progress/progressSlice"; import { selectConnectionArgs } from '../connection/connectionSlice'; import CheckCircle from '@mui/icons-material/CheckCircle'; import LicenseDialog from "./LicenseDialog"; import { setActiveStep } from "../progress/activeStepSlice"; -import { getStageDetails } from "../../../../utils/StageDetails"; -import { getInstallationTypeStatus } from "../progress/StageProgressStatus"; -import { connect } from "http2"; - +import { getStageDetails } from "../../../../services/StageDetails"; +import { getInstallationTypeStatus, downloadUnpaxStatus, setDownloadUnpaxState } from "../progress/StageProgressStatus"; +import { INSTALLATION_TYPE_STAGE_LABEL } from "../../common/Utils"; const InstallationType = () => { // TODO: Display granular details of installation - downloading - unpacking - running zwe command - const stageLabel = 'Installation Type'; + const [stageLabel] = useState(INSTALLATION_TYPE_STAGE_LABEL); - const STAGE_ID = getStageDetails(stageLabel).id; - const SUB_STAGES = !!getStageDetails(stageLabel).subStages; + const [STAGE_ID] = useState(getStageDetails(stageLabel).id); + const [SUB_STAGES] = useState(!!getStageDetails(stageLabel).subStages); const dispatch = useAppDispatch(); const connectionArgs = useAppSelector(selectConnectionArgs); @@ -55,7 +54,7 @@ const InstallationType = () => { } }, [installValue, paxPath, installationArgs, agreeLicense]); - + const updateProgress = (status: boolean): void => { dispatch(setInstallationTypeStatus(status)) dispatch(setNextStepEnabled(status)); @@ -82,6 +81,15 @@ const InstallationType = () => { } setInstallValue(type); updateProgress(false); + dispatch(setDownloadUnpaxStatus(false)); + setDownloadUnpaxState({ + uploadYaml: false, + download: false, + upload: false, + unpax: false, + getExampleYaml: false, + getSchemas: false, + }) } return ( @@ -96,6 +104,7 @@ const InstallationType = () => { name="radio-buttons-group" onChange={(e) => { dispatch(setInstallationArgs({...installationArgs, installationType: e.target.value})); + window.electron.ipcRenderer.setConfigByKeyNoValidate("installationArgs", {...installationArgs, installationType: e.target.value}); dispatch(setInstallationType(e.target.value)) installTypeChangeHandler(e.target.value) }} @@ -106,13 +115,16 @@ const InstallationType = () => { {installValue === "smpe" && - {`SMP/E installation must be done outside of ZEN. Return to ZEN and input the location Zowe was installed to before continuing.`} + {`SMP/E installation must be done outside of ZEN. Return to ZEN after completing the SMP/E installation process.`} } {installValue === "download" &&
- {`Zen will download the latest Zowe convenience build in PAX archive format from `} - {'https://zowe.org'} + Wizard will download the latest Zowe convenience build in PAX archive format from  + { !agreeLicense && <>
Please accept the license agreement to continue.
} + + {'https://www.zowe.org/download'} +
} - {installValue === "upload" && - {`Select a local Zowe PAX file (offline installation).`} - } - {installValue === "upload" && <> {`${paxPath === "" ? "No pax file selected." : paxPath}`} diff --git a/src/renderer/components/stages/installation/Installation.tsx b/src/renderer/components/stages/installation/Installation.tsx index b3019b74..90f9c36d 100644 --- a/src/renderer/components/stages/installation/Installation.tsx +++ b/src/renderer/components/stages/installation/Installation.tsx @@ -11,8 +11,8 @@ import React, {useCallback, useEffect, useRef, useState} from "react"; import { Box, Button, FormControl, Typography, debounce } from '@mui/material'; import { useAppSelector, useAppDispatch } from '../../../hooks'; -import { selectYaml, setYaml, selectSchema, setNextStepEnabled, setLoading, setSchema } from '../../configuration-wizard/wizardSlice'; -import { selectInstallationArgs, selectZoweVersion, selectInstallationType, setInstallationArgs } from './installationSlice'; +import { selectYaml, setYaml, selectSchema, setNextStepEnabled, setLoading} from '../../configuration-wizard/wizardSlice'; +import { selectZoweVersion, setInstallationArgs } from './installationSlice'; import { selectConnectionArgs } from '../connection/connectionSlice'; import { setDatasetInstallationStatus, setInitializationStatus } from "../progress/progressSlice"; import { IResponse } from '../../../../types/interfaces'; @@ -20,96 +20,72 @@ import ProgressCard from '../../common/ProgressCard'; import ContainerCard from '../../common/ContainerCard'; import JsonForm from '../../common/JsonForms'; import EditorDialog from "../../common/EditorDialog"; -import Ajv from "ajv"; import { alertEmitter } from "../../Header"; import { createTheme } from '@mui/material/styles'; import {stages} from "../../configuration-wizard/Wizard"; import { setActiveStep } from "../progress/activeStepSlice"; -import { getStageDetails, getSubStageDetails } from "../../../../utils/StageDetails"; -import { setProgress, getProgress, setDatasetInstallationState, getDatasetInstallationState, getInstallationTypeStatus, mapAndSetSkipStatus, getInstallationArguments } from "../progress/StageProgressStatus"; +import { TYPE_YAML, TYPE_OUTPUT, JCL_UNIX_SCRIPT_OK, FALLBACK_YAML, ajv, INIT_STAGE_LABEL, INSTALL_STAGE_LABEL} from '../../common/Utils'; +import { getStageDetails, getSubStageDetails } from "../../../../services/StageDetails"; +import { getProgress, setDatasetInstallationState, getDatasetInstallationState, getInstallationTypeStatus, updateSubStepSkipStatus, getInstallationArguments, datasetInstallationStatus, isInitializationStageComplete } from "../progress/StageProgressStatus"; import { DatasetInstallationState } from "../../../../types/stateInterfaces"; -import { FALLBACK_SCHEMA, FALLBACK_YAML } from "../../../../utils/yamlSchemaDefaults"; -import eventDispatcher from '../../../../utils/eventDispatcher'; +import { validateDatasetIterator } from '../../../../services/DatasetValidation'; const Installation = () => { - const stageLabel = 'Initialization'; - const subStageLabel = 'Installation'; + const [stageLabel] = useState(INIT_STAGE_LABEL); + const [subStageLabel] = useState(INSTALL_STAGE_LABEL); - const STAGE_ID = getStageDetails(stageLabel).id; - const SUB_STAGES = !!getStageDetails(stageLabel).subStages; - const SUB_STAGE_ID = SUB_STAGES ? getSubStageDetails(STAGE_ID, subStageLabel).id : 0; + const [STAGE_ID] = useState(getStageDetails(stageLabel).id); + const [SUB_STAGES] = useState(!!getStageDetails(stageLabel).subStages); + const [SUB_STAGE_ID]= useState(SUB_STAGES ? getSubStageDetails(STAGE_ID, subStageLabel).id : 0); - const theme = createTheme(); + const [theme] = useState(createTheme()); // TODO: Display granular details of installation - downloading - unpacking - running zwe command - - const stageId = 3; - const subStageId = 0; const dispatch = useAppDispatch(); // this schema will be used in the case where the user, for some reason, clicks "skip installation" without downloading or uploading a Zowe pax // Maybe we shouldnt allow the user to skip the installation stage?? - const reduxSchema = useAppSelector(selectSchema); - const [schema] = useState(typeof reduxSchema === "object" && Object.keys(reduxSchema).length > 0 ? reduxSchema : FALLBACK_SCHEMA); - const [yaml, setLYaml] = useState(useAppSelector(selectYaml)); - const connectionArgs = useAppSelector(selectConnectionArgs); - const [setupSchema, setSetupSchema] = useState(schema?.properties?.zowe?.properties?.setup?.properties?.dataset || FALLBACK_SCHEMA.properties?.zowe?.properties?.setup?.properties?.dataset); + const [schema] = useState(useAppSelector(selectSchema)); + const [yaml, setLocalYaml] = useState(useAppSelector(selectYaml)); + const [connectionArgs] = useState(useAppSelector(selectConnectionArgs)); + const [setupSchema, setSetupSchema] = useState(schema?.properties?.zowe?.properties?.setup?.properties?.dataset); const [setupYaml, setSetupYaml] = useState(yaml?.zowe?.setup?.dataset || FALLBACK_YAML?.zowe?.setup?.dataset); const [showProgress, setShowProgress] = useState(getProgress('datasetInstallationStatus')); const [isFormInit, setIsFormInit] = useState(false); const [editorVisible, setEditorVisible] = useState(false); - const [isFormValid, setIsFormValid] = useState(false); - const [formError, setFormError] = useState(''); const [contentType, setContentType] = useState(''); const [mvsDatasetInitProgress, setMvsDatasetInitProgress] = useState(getDatasetInstallationState()); const [stateUpdated, setStateUpdated] = useState(false); const [initClicked, setInitClicked] = useState(false); - const [installationArgs, setInstArgs] = useState(getInstallationArguments()); - const version = useAppSelector(selectZoweVersion); - let timer: any; - const installationType = getInstallationTypeStatus().installationType; - - const section = 'dataset'; - // const initConfig = getConfiguration(section); + const [version] = useState(useAppSelector(selectZoweVersion)); + const [stageStatus, setStageStatus] = useState(stages[STAGE_ID].subStages[SUB_STAGE_ID].isSkipped); + const stageStatusRef = useRef(stageStatus); - const TYPE_YAML = "yaml"; - const TYPE_JCL = "jcl"; - const TYPE_OUTPUT = "output"; + let timer: any; + const [installationType] = useState(getInstallationTypeStatus().installationType); - const ajv = new Ajv(); - ajv.addKeyword("$anchor"); - let datasetSchema; - let validate: any; - if(schema) { - datasetSchema = schema?.properties?.zowe?.properties?.setup?.properties?.dataset; - } + const [validate] = useState(() => ajv.getSchema("https://zowe.org/schemas/v2/server-base") || ajv.compile(setupSchema)); - if(datasetSchema) { - validate = ajv.compile(datasetSchema); - } + useEffect(() => { + stageStatusRef.current = stageStatus; + }, [stageStatus]); + const datasetPropertiesCount = setupSchema ? Object.keys(setupSchema.properties).length : 0; + useEffect(() => { + dispatch(setInitializationStatus(isInitializationStageComplete())); if(getProgress("datasetInstallationStatus")) { - if(installationType !== 'smpe') { - const nextPosition = document.getElementById('start-installation-progress'); - nextPosition.scrollIntoView({ behavior: 'smooth', block: 'start' }); - } else { - const nextPosition = document.getElementById('save-installation-progress'); - nextPosition.scrollIntoView({ behavior: 'smooth', block: 'start', inline: 'start' }); - } + const nextPosition = document.getElementById('save-installation-progress'); + if(nextPosition) nextPosition.scrollIntoView({ behavior: 'smooth', block: 'start' }); } else { const nextPosition = document.getElementById('container-box-id'); - nextPosition.scrollIntoView({behavior: 'smooth'}); + if(nextPosition) nextPosition.scrollIntoView({behavior: 'smooth'}); } - window.electron.ipcRenderer.getConfigByKey("installationArgs").then((res: IResponse) => { - if(res != undefined){ - // console.log("got installation args:", JSON.stringify(res)); - setInstArgs((res as any)); - } + if(installationArgs != undefined && !installationArgs.dryRunMode){ window.electron.ipcRenderer.getConfig().then((res: IResponse) => { function mergeInstallationArgsAndYaml(yaml: any){ let yamlObj = JSON.parse(JSON.stringify(yaml)); @@ -133,21 +109,30 @@ const Installation = () => { if (installationArgs.rbacProfile) { yamlObj.zowe.rbacProfileIdentifier = installationArgs.rbacProfile; } - if ((yamlObj.zowe.job.name === undefined || yamlObj.zowe.job.name === '') && installationArgs.jobName) { //this undefined check is necessary because InstallationStage.jobName has a defualt, and therefore this would always overwrite the value in the config - yamlObj.zowe.job.name = installationArgs.jobName; + if ((yamlObj.zowe.job?.name === undefined || yamlObj.zowe.job?.name === '') && installationArgs.jobName) { //this undefined check is necessary because InstallationStage.jobName has a defualt, and therefore this would always overwrite the value in the config + if(yamlObj.zowe.job === undefined){ + yamlObj.zowe.job = { + name: installationArgs.jobName + } + } else { + yamlObj.zowe.job.name = installationArgs.jobName; + } } - if ((yamlObj.zowe.job.prefix === undefined || yamlObj.zowe.job.prefix === '') && installationArgs.jobPrefix) { + if ((yamlObj.zowe.job?.prefix === undefined || yamlObj.zowe.job?.prefix === '') && installationArgs.jobPrefix) { yamlObj.zowe.job.prefix = installationArgs.jobPrefix; } if (installationArgs.cookieId) { yamlObj.zowe.cookieIdentifier = installationArgs.cookieId; } if (installationArgs.javaHome) { + if(yamlObj.java === undefined) yamlObj.java = {home: ""} yamlObj.java.home = installationArgs.javaHome; } if (installationArgs.nodeHome) { + if(yamlObj.node === undefined) yamlObj.node = {home: ""} yamlObj.node.home = installationArgs.nodeHome; } + if(yamlObj.zOSMF === undefined) yamlObj.zOSMF = {host: "", port: 443, applId: ""} if (installationArgs.zosmfHost) { yamlObj.zOSMF.host = installationArgs.zosmfHost; } @@ -160,16 +145,14 @@ const Installation = () => { return yamlObj; } if(res.details.zowe === undefined){ - //for fallback scenario where user does NOT download or upload a pax and clicks "skip" on the installation stage. sets in redux but not on disk + //for fallback scenario where user does NOT download or upload a pax and clicks "skip" on the installation stage. sets in redux but not on disk. This should never occur let yamlObj = mergeInstallationArgsAndYaml(FALLBACK_YAML); // console.log('setting yaml:', yamlObj); - setLYaml(yamlObj) + setLocalYaml(yamlObj) dispatch(setYaml(yamlObj)) } else { - // console.log('got config:', JSON.stringify(res.details)); let yamlObj = mergeInstallationArgsAndYaml(res.details); if(res.details.zowe?.setup?.dataset === undefined){ - // console.log('setting yaml:',{...yamlObj, zowe: {...yamlObj.zowe, setup: {...yamlObj.zowe.setup, dataset: FALLBACK_YAML.zowe.setup.dataset}} }); dispatch(setYaml({...yamlObj, zowe: {...yamlObj.zowe, setup: {...yamlObj.zowe.setup, dataset: FALLBACK_YAML.zowe.setup.dataset}} })); } else { dispatch(setYaml(yamlObj)); @@ -177,89 +160,78 @@ const Installation = () => { } } }) - }) + } setIsFormInit(true); - window.electron.ipcRenderer.getSchema().then((res: IResponse) => { - if(res.details === undefined){ - //for fallback scenario where user does NOT download or upload a pax and clicks "skip" on the installation stage. sets in redux - dispatch(setSchema(FALLBACK_SCHEMA)); - } - }) + dispatch(setNextStepEnabled(getProgress('datasetInstallationStatus'))); if(installationType === 'smpe') { const status = getProgress('datasetInstallationStatus'); setStageSkipStatus(!status); - setDsInstallStageStatus(status); - } else { - updateProgress(getProgress('datasetInstallationStatus')); + installProceedActions(status); } return () => { + updateSubStepSkipStatus(SUB_STAGE_ID, stageStatusRef.current); dispatch(setActiveStep({ activeStepIndex: STAGE_ID, isSubStep: SUB_STAGES, activeSubStepIndex: SUB_STAGE_ID })); + alertEmitter.emit('hideAlert'); } }, []); useEffect(() => { - setShowProgress(installationType!=='smpe' && (initClicked || getProgress('datasetInstallationStatus'))); + setShowProgress((initClicked || getProgress('datasetInstallationStatus'))); if(initClicked) { const nextPosition = document.getElementById('installation-progress'); - nextPosition.scrollIntoView({ behavior: 'smooth', block: 'end' }); + if(nextPosition) nextPosition.scrollIntoView({ behavior: 'smooth', block: 'end' }); + installProceedActions(false); setStateUpdated(!stateUpdated); - dispatch(setDatasetInstallationStatus(false)); } }, [initClicked]); useEffect(() => { const allAttributesTrue = Object.values(mvsDatasetInitProgress).every(value => value === true); if(allAttributesTrue) { - dispatch(setNextStepEnabled(true)); - dispatch(setDatasetInstallationStatus(true)); - setShowProgress(installationType!=='smpe' && (initClicked || getProgress('datasetInstallationStatus'))); + installProceedActions(true); + setStageSkipStatus(false); } }, [mvsDatasetInitProgress]); useEffect(() => { - if(!getProgress('datasetInstallationStatus') && initClicked) { + const stageComplete = mvsDatasetInitProgress.uploadYaml && mvsDatasetInitProgress.initMVS && mvsDatasetInitProgress.install; + if(!stageComplete && showProgress) { timer = setInterval(() => { window.electron.ipcRenderer.getInstallationProgress().then((res: any) => { setMvsDatasetInitializationProgress(res); + if(res.success){ + clearInterval(timer); + } }) }, 3000); } return () => { clearInterval(timer); }; - }, [showProgress, stateUpdated]); + }, [showProgress, stateUpdated, mvsDatasetInitProgress]); const setMvsDatasetInitializationProgress = (datasetInitState: DatasetInstallationState) => { setMvsDatasetInitProgress(datasetInitState); setDatasetInstallationState(datasetInitState); const allAttributesTrue = Object.values(datasetInitState).every(value => value === true); if(allAttributesTrue) { - dispatch(setNextStepEnabled(true)); - dispatch(setDatasetInstallationStatus(true)); - eventDispatcher.emit('initMvsComplete', true) + installProceedActions(true); } } const setStageSkipStatus = (status: boolean) => { - stages[stageId].subStages[subStageId].isSkipped = status; - stages[stageId].isSkipped = status; - mapAndSetSkipStatus(subStageId, status); - } - - const setDsInstallStageStatus = (status: boolean) => { - dispatch(setNextStepEnabled(status)); - dispatch(setInitializationStatus(status)); - dispatch(setDatasetInstallationStatus(status)); + stages[STAGE_ID].subStages[SUB_STAGE_ID].isSkipped = status; + stages[STAGE_ID].isSkipped = !isInitializationStageComplete(); + setStageStatus(status); } const updateProgress = (status: boolean) => { setStateUpdated(!stateUpdated); - setStageSkipStatus(!status); if(!status) { for (let key in mvsDatasetInitProgress) { mvsDatasetInitProgress[key as keyof(DatasetInstallationState)] = false; @@ -268,8 +240,16 @@ const Installation = () => { } const allAttributesTrue = Object.values(mvsDatasetInitProgress).every(value => value === true); status = allAttributesTrue ? true : false; - setDsInstallStageStatus(status); setMvsDatasetInitializationProgress(getDatasetInstallationState()); + installProceedActions(status); + } + + // True - a proceed, False - blocked + const installProceedActions = (status: boolean) => { + dispatch(setDatasetInstallationStatus(status)); + dispatch(setInitializationStatus(isInitializationStageComplete())); + dispatch(setNextStepEnabled(status)); + setStageSkipStatus(!status); } const toggleEditorVisibility = (type: any) => { @@ -277,42 +257,83 @@ const Installation = () => { setEditorVisible(!editorVisible); }; - const process = (event: any, skipDownload?: boolean) => { + const process = async (event: any) => { - if(!(installationType === 'smpe')) { - setInitClicked(true); - updateProgress(false); + const areDatasetsValid = validateDatasets(); + if (!areDatasetsValid){ + event.preventDefault(); + return; } + + alertEmitter.emit('hideAlert'); + setInitClicked(true); + updateProgress(false); event.preventDefault(); dispatch(setLoading(true)); // FIXME: runtime dir is hardcoded, fix there and in InstallActions.ts - Unpax and Install functions - - if(installationType === 'smpe'){ - setStageSkipStatus(false); - setDsInstallStageStatus(true); + if(!installationArgs.dryRunMode){ + Promise.all([ + window.electron.ipcRenderer.setConfigByKeyAndValidate('zowe.setup.dataset', setupYaml), + ]).then(async () => { dispatch(setLoading(false)); - setShowProgress(false); - } else { setYaml(window.electron.ipcRenderer.getConfig()); setShowProgress(true); - dispatch(setLoading(false)); - window.electron.ipcRenderer.installButtonOnClick(connectionArgs, installationArgs, version, yaml, skipDownload ?? false).then((res: IResponse) => { - if(!res.status){ //errors during runInstallation() - alertEmitter.emit('showAlert', res.details, 'error'); + dispatch(setLoading(false)); /* change skipDownload ?? false --> true to skip upload/download steps for quicker development */ + window.electron.ipcRenderer.installButtonOnClick(connectionArgs, installationArgs).then((res: IResponse) => { + // Some parts of Wizard pass the response as a string directly into the object + if (res.status == false && typeof res.details == "string") { + res.details = { 3: res.details }; } - if(res.details?.mergedYaml != undefined){ - dispatch(setYaml(res.details.mergedYaml)); - window.electron.ipcRenderer.setConfig(res.details.mergedYaml); + if (!res.status && res?.details && res.details[3] && res.details[3].indexOf(JCL_UNIX_SCRIPT_OK) == -1) { // This check means we got an error during zwe install + alertEmitter.emit('showAlert', 'Please view Job Output for more details', 'error'); + window.electron.ipcRenderer.setStandardOutput(JSON.stringify(res.details[3], null, 2).replace(/\\\\r\\\\n/gm, '\r\n')).then((res: any) => { + toggleEditorVisibility("output"); + }) + updateProgress(false); + clearInterval(timer); + } else { + updateProgress(res.status); + clearInterval(timer); } - updateProgress(true); - clearInterval(timer); - }).catch(() => { + }).catch((err: any) => { clearInterval(timer); updateProgress(false); + window.electron.ipcRenderer.setStandardOutput(`zwe init mvs failed: ${typeof err === "string" ? err : err.toString()}`).then((res: any) => { + toggleEditorVisibility("output"); + }) }); + }) + } + else{ + dispatch(setLoading(false)); + setMvsDatasetInitializationProgress({ + uploadYaml: true, + install: true, + initMVS: true + }) + updateProgress(true); } } + const validateDatasets = () => { + + if(Object.keys(setupYaml).length < datasetPropertiesCount) { + const errorMessage = `One or more required dataset values are missing. Please ensure all fields are filled in.`; + alertEmitter.emit('showAlert', errorMessage, 'error'); + return false; + } + + const {isValid, key} = validateDatasetIterator(setupYaml); + + if (!isValid) { + const errorMessage = `The dataset '${key.toUpperCase()}' is invalid. Please verify the dataset name and try again.`; + alertEmitter.emit('showAlert', errorMessage, 'error'); + return false; + } + + return true; + }; + const debouncedChange = useCallback( debounce((state: any)=>{handleFormChange(state)}, 1000), [] @@ -331,15 +352,17 @@ const Installation = () => { setStageConfig(false, errPath+' '+errMsg, updatedData); } else { const newYaml = {...yaml, zowe: {...yaml.zowe, setup: {...yaml.zowe.setup, dataset: updatedData}}}; - await window.electron.ipcRenderer.setConfig(newYaml) + setLocalYaml(newYaml); + window.electron.ipcRenderer.setConfig(newYaml) setStageConfig(true, '', updatedData); } } } const setStageConfig = (isValid: boolean, errorMsg: string, data: any) => { - setIsFormValid(isValid); - setFormError(errorMsg); + if(!isValid) { + alertEmitter.emit('showAlert', errorMsg, 'error'); + } setSetupYaml(data); } @@ -347,38 +370,38 @@ const Installation = () => {
- + {/* */} - {editorVisible && } + {editorVisible && { + const updatedData = isFormInit ? (Object.keys(setupYaml).length > 0 ? setupYaml : data.zowe.setup.dataset) : (data.zowe?.setup?.dataset ? data.zowe.setup.dataset : data); + setStageConfig(true, '', updatedData); + } + }/>} - {installationType === 'smpe' ? `Please input the corresponding values used during the SMPE installation process.` : `Ready to download Zowe ${version} and deploy it to the ${installationArgs.installationDir}\nThen we will install MVS data sets, please provide HLQ below\n`} + {installationType === 'smpe' ? `Please input the corresponding values used during the SMPE installation process.` : `Ready to download Zowe ${version} and deploy it to the ${installationArgs.installationDir}\nThen we will install the MVS data sets, please provide the HLQ below.\n`} dispatch(setYaml((await window.electron.ipcRenderer.getConfig()).details ?? yaml))}> - {!isFormValid && formError &&
{formError}
}
{!showProgress ? - + {/* */} : null} - + {!showProgress ? null : - - - - + } - +
); diff --git a/src/renderer/components/stages/installation/installationSlice.ts b/src/renderer/components/stages/installation/installationSlice.ts index c8a7a280..872c74b7 100644 --- a/src/renderer/components/stages/installation/installationSlice.ts +++ b/src/renderer/components/stages/installation/installationSlice.ts @@ -37,7 +37,8 @@ const initialState: InstallationState = { cookieId: '1', zosmfHost: '', zosmfPort: '443', - zosmfApplId: 'IZUDFLT' + zosmfApplId: 'IZUDFLT', + dryRunMode: false }, zoweVersion: '', licenseAgreement: getInstallationTypeStatus()?.licenseAgreement || false, diff --git a/src/renderer/components/stages/progress/StageProgressStatus.ts b/src/renderer/components/stages/progress/StageProgressStatus.ts index 73d31278..53b300b5 100644 --- a/src/renderer/components/stages/progress/StageProgressStatus.ts +++ b/src/renderer/components/stages/progress/StageProgressStatus.ts @@ -9,26 +9,37 @@ */ import { flatten, unflatten } from 'flat'; -import { ProgressState, PlanningState, InstallationType, ActiveState, DatasetInstallationState, InitSubStepsState, CertInitSubStepsState, PlanningValidationDetails, SkipState, InstallationArgs} from '../../../../types/stateInterfaces'; +import { ProgressState, PlanningState, InstallationType, ActiveState, DatasetInstallationState, InitSubStepsState, CertInitSubStepsState, PlanningValidationDetails, subStepState, stepSkipState, InstallationArgs, DownloadUnpaxState} from '../../../../types/stateInterfaces'; import { stages } from '../../configuration-wizard/Wizard'; const installationTypeStatus: InstallationType = { installationType: 'download', licenseAgreement: false, userUploadedPaxPath: '', -} +} + +export const downloadUnpaxStatus: DownloadUnpaxState = { + uploadYaml: false, + download: false, + upload: false, + unpax: false, + getExampleYaml: false, + getSchemas: false, +} const progressStatus: ProgressState = { connectionStatus: false, planningStatus: false, installationTypeStatus: false, + downloadUnpaxStatus: false, initializationStatus: false, datasetInstallationStatus: false, networkingStatus: false, apfAuthStatus: false, securityStatus: false, + stcsStatus: false, certificateStatus: false, - vsamStatus: false, + cachingServiceStatus: false, launchConfigStatus: false, reviewStatus: false, } @@ -45,11 +56,8 @@ const planningStageStatus: PlanningState = { isLocationValid: false, } -const datasetInstallationStatus: DatasetInstallationState = { +export const datasetInstallationStatus: DatasetInstallationState = { uploadYaml: false, - download: false, - upload: false, - unpax: false, install: false, initMVS: false } @@ -66,6 +74,12 @@ const securityInitStatus: InitSubStepsState = { success: false } +const stcsInitStatus: InitSubStepsState = { + writeYaml: false, + uploadYaml: false, + success: false +} + const certificateInitStatus: CertInitSubStepsState = { writeYaml: false, uploadYaml: false, @@ -85,16 +99,25 @@ const planningValidationDetailsStatus: PlanningValidationDetails = { error: '' } -const stepSkipStatus: SkipState = { +const subStepSkipStatus: subStepState = { datasetInstallation: false, networking: false, apfAuth: false, security: false, + stcs: false, certificate: false, - vsam: false, + cachingService: false, launchConfig: false } +const stepSkipStatus: stepSkipState = { + planning: false, + installationType: false, + unpax: false, + initialization: false, + reviewInstallation: false +} + const installationArgsStatus: InstallationArgs = { installationDir: '', workspaceDir: '', @@ -112,141 +135,186 @@ const installationArgsStatus: InstallationArgs = { cookieId: '1', zosmfHost: '', zosmfPort: '443', - zosmfApplId: 'IZUDFLT' + zosmfApplId: 'IZUDFLT', + dryRunMode:false } let progressStateKey = 'stage_progress'; let activeStateKey = 'active_state'; let planningStateKey = 'planning_stage'; let installationTypeKey = 'installation_type'; +let downloadUnpaxKey = 'download_unpax'; let datasetInstallationKey = 'dataset_installation'; let apfAuthKey = 'apf_auth'; let securityKey = 'security_init'; +let stcsKey = 'stcs_init'; let certificateKey = 'certificate_init'; let vsamKey = 'vsam_init'; let planningValidationDetailsKey = `planning_validation_details`; let prevInstallationKey = `prev_installation`; +let skipSubStateKey = `skip_sub_state`; let skipStateKey = `skip_state`; let installationArgsKey = `intallation_args`; +let paxVersionKey = `pax_version`; -let skipKeysArray: (keyof SkipState)[] = Object.keys(stepSkipStatus) as (keyof SkipState)[]; +let subStepSkipKeysArray: (keyof subStepState)[] = Object.keys(subStepSkipStatus) as (keyof subStepState)[]; +let stepSkipKeysArray: (keyof stepSkipState)[] = Object.keys(stepSkipStatus) as (keyof stepSkipState)[]; const setKeys = (id: string) => { progressStateKey = `${progressStateKey}_${id}`; activeStateKey = `${activeStateKey}_${id}`; planningStateKey = `${planningStateKey}_${id}`; installationTypeKey = `${installationTypeKey}_${id}`; + downloadUnpaxKey = `${downloadUnpaxKey}_${id}`; datasetInstallationKey = `${datasetInstallationKey}_${id}`; apfAuthKey = `${apfAuthKey}_${id}`; securityKey = `${securityKey}_${id}`; + stcsKey = `${stcsKey}_${id}`; certificateKey = `${certificateKey}_${id}`; vsamKey = `${vsamKey}_${id}`; planningValidationDetailsKey = `${planningValidationDetailsKey}_${id}`; + skipSubStateKey = `${skipSubStateKey}_${id}`; skipStateKey = `${skipStateKey}_${id}`; installationArgsKey = `${installationArgsKey}_${id}`; + paxVersionKey = `${paxVersionKey}_${id}`; } -export const initializeProgress = (host: string, user: string) => { +export const initializeProgress = (host: string, user: string, isResume: boolean) => { const id = `${host}_${user}`; setKeys(id); - + const progress = localStorage.getItem(progressStateKey); - if(!progress) { + if(!progress || !isResume) { const flattenedData = flatten(progressStatus); localStorage.setItem(progressStateKey, JSON.stringify(flattenedData)); } const activeStage = localStorage.getItem(activeStateKey); - if(!activeStage) { + if(!activeStage || !isResume) { const flattenedData = flatten(activeStatus); localStorage.setItem(activeStateKey, JSON.stringify(flattenedData)); } const planningState = localStorage.getItem(planningStateKey); - if(!planningState) { + if(!planningState || !isResume) { const flattenedData = flatten(planningStageStatus); localStorage.setItem(planningStateKey, JSON.stringify(flattenedData)); } const installationTypeState = localStorage.getItem(installationTypeKey); - if(!installationTypeState) { + if(!installationTypeState || !isResume) { const flattenedData = flatten(installationTypeStatus); localStorage.setItem(installationTypeKey, JSON.stringify(flattenedData)); } + const downloadUnpaxState = localStorage.getItem(downloadUnpaxKey); + if(!downloadUnpaxState || !isResume) { + const flattenedData = flatten(downloadUnpaxStatus); + localStorage.setItem(downloadUnpaxKey, JSON.stringify(flattenedData)); + } + const datasetInstallationState = localStorage.getItem(datasetInstallationKey); - if(!datasetInstallationState) { + if(!datasetInstallationState || !isResume) { const flattenedData = flatten(datasetInstallationStatus); localStorage.setItem(datasetInstallationKey, JSON.stringify(flattenedData)); } const apfAuthState = localStorage.getItem(apfAuthKey); - if(!apfAuthState) { + if(!apfAuthState || !isResume) { const flattenedData = flatten(apfAuthStatus); localStorage.setItem(apfAuthKey, JSON.stringify(flattenedData)); } const securityInitState = localStorage.getItem(securityKey); - if(!securityInitState) { + if(!securityInitState || !isResume) { const flattenedData = flatten(securityInitStatus); localStorage.setItem(securityKey, JSON.stringify(flattenedData)); } + const stcsInitState = localStorage.getItem(stcsKey); + if(!stcsInitState || !isResume) { + const flattenedData = flatten(stcsInitStatus); + localStorage.setItem(stcsKey, JSON.stringify(flattenedData)); + } + const certificateInitState = localStorage.getItem(certificateKey); - if(!certificateInitState) { + if(!certificateInitState || !isResume) { const flattenedData = flatten(certificateInitStatus); localStorage.setItem(certificateKey, JSON.stringify(flattenedData)); } const vsamInitState = localStorage.getItem(vsamKey); - if(!vsamInitState) { + if(!vsamInitState || !isResume) { const flattenedData = flatten(vsamInitStatus); localStorage.setItem(vsamKey, JSON.stringify(flattenedData)); } const planningValidationDetailsState = localStorage.getItem(certificateKey); - if(!planningValidationDetailsState) { + if(!planningValidationDetailsState || !isResume) { const flattenedData = flatten(planningValidationDetailsStatus); localStorage.setItem(planningValidationDetailsKey, JSON.stringify(flattenedData)); } + const subStepSkipStatusState = localStorage.getItem(skipSubStateKey); + if(!subStepSkipStatusState) { + const flattenedData = flatten(subStepSkipStatus); + localStorage.setItem(skipSubStateKey, JSON.stringify(flattenedData)); + } + const stepSkipStatusState = localStorage.getItem(skipStateKey); - if(!stepSkipStatusState) { + if(!stepSkipStatusState || !isResume) { const flattenedData = flatten(stepSkipStatus); localStorage.setItem(skipStateKey, JSON.stringify(flattenedData)); } const installationArgsState = localStorage.getItem(installationArgsKey); - if(!installationArgsState) { + if(!installationArgsState || !isResume) { const flattenedData = flatten(installationArgsStatus); localStorage.setItem(installationArgsKey, JSON.stringify(flattenedData)); } } -export const mapAndSetSkipStatus = (subStageId: number, value: boolean): void => { - setSubStageSkipStatus(skipKeysArray[subStageId], value); +export const updateSubStepSkipStatus = (subStageId: number, value: boolean): void => { + if(subStageId < 0 || subStageId > 7) { + return; + } + setSubStageSkipStatus(subStepSkipKeysArray[subStageId], value); } -export const mapAndGetSkipStatus = (subStageId: number): boolean => { - const skipStatus = getSubStageSkipStatus(); - const skipStatusArray = [ - skipStatus.datasetInstallation, - skipStatus.networking, - skipStatus.apfAuth, - skipStatus.security, - skipStatus.certificate, - skipStatus.vsam, - skipStatus.launchConfig - ] +export const updateStepSkipStatus = (stageId: number, value: boolean): void => { + if(stageId < 0 || stageId > 5) { + return; + } + setStageSkipStatus(stepSkipKeysArray[stageId-1], value); +} - return skipStatusArray[subStageId]; +export const setSubStageSkipStatus = (key: keyof subStepState, newValue: boolean): void => { + const skipStatus = localStorage.getItem(skipSubStateKey); + if (skipStatus) { + const flattenedData = JSON.parse(skipStatus); + const unFlattenedData = unflatten(flattenedData) as subStepState; + Object.assign(subStepSkipStatus, unFlattenedData); + } + subStepSkipStatus[key] = newValue; + const flattenedData = flatten(subStepSkipStatus); + localStorage.setItem(skipSubStateKey, JSON.stringify(flattenedData)); } -export const setSubStageSkipStatus = (key: keyof SkipState, newValue: boolean): void => { +export const getSubStageSkipStatus = () : subStepState => { + const skipStatus = localStorage.getItem(skipSubStateKey); + if(skipStatus) { + const flattenedData = JSON.parse(skipStatus); + return unflatten(flattenedData); + } else { + return subStepSkipStatus; + } +} + +export const setStageSkipStatus = (key: keyof stepSkipState, newValue: boolean): void => { const skipStatus = localStorage.getItem(skipStateKey); if (skipStatus) { const flattenedData = JSON.parse(skipStatus); - const unFlattenedData = unflatten(flattenedData) as SkipState; + const unFlattenedData = unflatten(flattenedData) as stepSkipState; Object.assign(stepSkipStatus, unFlattenedData); } stepSkipStatus[key] = newValue; @@ -254,7 +322,7 @@ export const setSubStageSkipStatus = (key: keyof SkipState, newValue: boolean): localStorage.setItem(skipStateKey, JSON.stringify(flattenedData)); } -export const getSubStageSkipStatus = () : SkipState => { +export const getStageSkipStatus = () : stepSkipState => { const skipStatus = localStorage.getItem(skipStateKey); if(skipStatus) { const flattenedData = JSON.parse(skipStatus); @@ -309,6 +377,21 @@ export const getSecurityInitState = (): InitSubStepsState => { } } +export const setStcsInitState = (stcsInitSteps: InitSubStepsState): void => { + Object.assign(stcsInitStatus, stcsInitSteps); + localStorage.setItem(stcsKey, JSON.stringify(stcsInitStatus)); +} + +export const getStcsInitState = (): InitSubStepsState => { + const stcsInitState = localStorage.getItem(stcsKey); + if(stcsInitState) { + const flattenedData = JSON.parse(stcsInitState); + return unflatten(flattenedData) + } else { + return stcsInitStatus; + } +} + export const setCertificateInitState = (certificateInitSteps: CertInitSubStepsState): void => { Object.assign(certificateInitStatus, certificateInitSteps); localStorage.setItem(certificateKey, JSON.stringify(certificateInitStatus)); @@ -376,6 +459,21 @@ export const getInstallationTypeStatus = (): InstallationType => { } } +export const setDownloadUnpaxState = (downloadUnpaxSteps: DownloadUnpaxState): void => { + Object.assign(downloadUnpaxStatus, downloadUnpaxSteps); + localStorage.setItem(downloadUnpaxKey, JSON.stringify(downloadUnpaxStatus)); +} + +export const getDownloadUnpaxState = (): DownloadUnpaxState => { + const downloadUnpaxState = localStorage.getItem(downloadUnpaxKey); + if(downloadUnpaxState) { + const flattenedData = JSON.parse(downloadUnpaxState); + return unflatten(flattenedData); + } else { + return downloadUnpaxStatus; + } +}; + export const setPlanningStageStatus = (key: K, newValue: PlanningState[K]): void => { const planningData = localStorage.getItem(planningStateKey); if (planningData) { @@ -447,6 +545,16 @@ export const getCompleteProgress = () : ProgressState => { } } +export const isInitializationStageComplete = (): boolean => { + const progress = localStorage.getItem(progressStateKey); + if(progress) { + const data:any = unflatten(JSON.parse(progress)); + return data.datasetInstallationStatus && data.networkingStatus && data.apfAuthStatus && data.securityStatus && data.stcsStatus && data.certificateStatus && data.cachingServiceStatus && data.launchConfigStatus; + } else { + return false; + } +} + export const setActiveStage = (stageId: number, isSubStage: boolean, date: string, subStageId?: number): void => { activeStatus.activeStepIndex = stageId; activeStatus.isSubStep = isSubStage; @@ -483,4 +591,13 @@ export const getPreviousInstallation = () : ActiveState => { } } +export const setAndStoreZoweVersion = (version: number): void => { + localStorage.setItem(paxVersionKey, version.toString()); +} + +export const getCachedZoweVersion = () : number => { + const version = localStorage.getItem(paxVersionKey); + return version ? Number(version) : NaN; +} + diff --git a/src/renderer/components/stages/progress/progressSlice.ts b/src/renderer/components/stages/progress/progressSlice.ts index 3ba8bf8d..155c6876 100644 --- a/src/renderer/components/stages/progress/progressSlice.ts +++ b/src/renderer/components/stages/progress/progressSlice.ts @@ -12,18 +12,21 @@ import { createSlice, PayloadAction } from '@reduxjs/toolkit'; import { RootState } from '../../../store'; import { setProgress, getProgress } from './StageProgressStatus'; import { ProgressState } from '../../../../types/stateInterfaces'; +import { stages } from '../../configuration-wizard/Wizard'; const initialState: ProgressState = { connectionStatus: getProgress('connectionStatus') || false, planningStatus: getProgress('planningStatus') || false, installationTypeStatus: getProgress('installationTypeStatus') || false, + downloadUnpaxStatus: getProgress('downloadUnpaxStatus') || false, initializationStatus: getProgress('initializationStatus') || false, datasetInstallationStatus: getProgress('datasetInstallationStatus') || false, networkingStatus: getProgress('networkingStatus') || false, apfAuthStatus: getProgress('apfAuthStatus') || false, securityStatus: getProgress('securityStatus') || false, + stcsStatus: getProgress('stcsStatus') || false, certificateStatus: getProgress('certificateStatus') || false, - vsamStatus: getProgress('vsamStatus') || false, + cachingServiceStatus: getProgress('cachingServiceStatus') || false, launchConfigStatus: getProgress('launchConfigStatus') || false, reviewStatus: getProgress('reviewStatus') || false } @@ -43,21 +46,13 @@ export const progressSlice = createSlice({ state.installationTypeStatus = action.payload; setProgress('installationTypeStatus', action.payload); }, + setDownloadUnpaxStatus: (state, action: PayloadAction) => { + state.downloadUnpaxStatus = action.payload; + setProgress('downloadUnpaxStatus', action.payload); + }, setInitializationStatus: (state, action: PayloadAction) => { - if ( - state.datasetInstallationStatus && - state.networkingStatus && - state.apfAuthStatus && - state.securityStatus && - state.certificateStatus && - state.launchConfigStatus - ) { - state.initializationStatus = true; - setProgress('initializationStatus', true); - } else { - state.initializationStatus = false; - setProgress('initializationStatus', false); - } + state.initializationStatus = action.payload; + setProgress('initializationStatus', action.payload); }, setDatasetInstallationStatus: (state, action: PayloadAction) => { state.datasetInstallationStatus = action.payload; @@ -75,13 +70,17 @@ export const progressSlice = createSlice({ state.securityStatus = action.payload; setProgress('securityStatus', action.payload); }, + setStcsStatus: (state, action: PayloadAction) => { + state.stcsStatus = action.payload; + setProgress('stcsStatus', action.payload); + }, setCertificateStatus: (state, action: PayloadAction) => { state.certificateStatus = action.payload; setProgress('certificateStatus', action.payload); }, - setVsamStatus: (state, action: PayloadAction) => { - state.vsamStatus = action.payload; - setProgress('vsamStatus', action.payload); + setCachingServiceStatus: (state, action: PayloadAction) => { + state.cachingServiceStatus = action.payload; + setProgress('cachingServiceStatus', action.payload); }, setLaunchConfigStatus: (state, action: PayloadAction) => { state.launchConfigStatus = action.payload; @@ -94,18 +93,20 @@ export const progressSlice = createSlice({ } }); -export const { setConnectionStatus, setPlanningStatus, setInstallationTypeStatus, setInitializationStatus, setDatasetInstallationStatus, setNetworkingStatus, setApfAuthStatus, setSecurityStatus, setCertificateStatus, setVsamStatus, setLaunchConfigStatus, setReviewStatus } = progressSlice.actions; +export const { setConnectionStatus, setPlanningStatus, setInstallationTypeStatus, setInitializationStatus, setDatasetInstallationStatus, setDownloadUnpaxStatus, setNetworkingStatus, setApfAuthStatus, setSecurityStatus, setStcsStatus, setCertificateStatus, setCachingServiceStatus, setLaunchConfigStatus, setReviewStatus } = progressSlice.actions; export const selectConnectionStatus = (state: RootState) => state.progress.connectionStatus; export const selectPlanningStatus = (state: RootState) => state.progress.planningStatus; export const selectInstallationTypeStatus = (state: RootState) => state.progress.installationTypeStatus; +export const selectIDownloadUnpaxStatus = (state: RootState) => state.progress.downloadUnpaxStatus; export const selectInitializationStatus = (state: RootState) => state.progress.initializationStatus; export const selectDatasetInstallationStatus= (state: RootState) => state.progress.datasetInstallationStatus; export const selectNetworkingStatus= (state: RootState) => state.progress.networkingStatus; export const selectApfAuthStatus = (state: RootState) => state.progress.apfAuthStatus; export const selectSecurityStatus = (state: RootState) => state.progress.securityStatus; +export const selectStcsStatus = (state: RootState) => state.progress.stcsStatus; export const selectCertificateStatus = (state: RootState) => state.progress.certificateStatus; -export const selectVsamStatus = (state: RootState) => state.progress.vsamStatus; +export const selectCachingServiceStatus = (state: RootState) => state.progress.cachingServiceStatus; export const selectLaunchConfigStatus = (state: RootState) => state.progress.launchConfigStatus; export const selectReviewStatus = (state: RootState) => state.progress.reviewStatus; diff --git a/src/renderer/config/constants.ts b/src/renderer/config/constants.ts deleted file mode 100644 index e915203b..00000000 --- a/src/renderer/config/constants.ts +++ /dev/null @@ -1,1193 +0,0 @@ -export const EXAMPLE_YAML = { - "node": { - "home": "" - }, - "java": { - "home": "" - }, - "zOSMF": { - "host": "dvipa.my-company.com", - "port": 443, - "applId": "IZUDFLT" - }, - "zowe": { - "rbacProfileIdentifier": "1", - "logDirectory": "/global/zowe/logs", - "job": { - "prefix": "ZWE1", - "name": "ZWE1SV" - }, - "sysMessages": [ - "ZWEL0021I", - "ZWEL0018I", - "ZWEL0006I", - "ZWES1601I", - "ZWEL0008I", - "ZWEL0022I", - "ZWEL0001I", - "ZWEL0002I", - "ZWEAM000I", - "ZWED0031I", - "ZWES1013I" - ], - "launchScript": { - "logLevel": "info", - "onComponentConfigureFail": "warn" - }, - "extensionDirectory": "/global/zowe/extensions", - "certificate": { - "keystore": { - "alias": "localhost", - "password": "password", - "type": "PKCS12", - "file": "/global/zowe/keystore/localhost/localhost.keystore.p12" - }, - "pem": { - "key": "/global/zowe/keystore/localhost/localhost.key", - "certificate": "/global/zowe/keystore/localhost/localhost.cer", - "certificateAuthorities": "/global/zowe/keystore/local_ca/local_ca.cer" - }, - "truststore": { - "password": "password", - "type": "PKCS12", - "file": "/global/zowe/keystore/localhost/localhost.truststore.p12" - } - }, - "cookieIdentifier": "1", - "verifyCertificates": "STRICT", - "setup": { - "dataset": { - "authLoadlib": "IBMUSER.ZWEV2.SZWEAUTH", - "proclib": "USER.PROCLIB", - "authPluginLib": "IBMUSER.ZWEV2.CUST.ZWESAPL", - "prefix": "IBMUSER.ZWEV2", - "parmlib": "IBMUSER.ZWEV2.CUST.PARMLIB", - "loadlib": "IBMUSER.ZWEV2.SZWELOAD", - "parmlibMembers": { - "zis": "ZWESIP00" - }, - "jcllib": "IBMUSER.ZWEV2.CUST.JCLLIB" - }, - "certificate": { - "type": "PKCS12", - "pkcs12": { - "directory": "/var/zowe/keystore" - } - }, - "vsam": { - "volume": "", - "mode": "NONRLS", - "storageClass": "" - } - }, - "externalDomains": [ - "sample-domain.com" - ], - "externalPort": 7554, - "configmgr": { - "validation": "COMPONENT-COMPAT" - }, - "workspaceDirectory": "/global/zowe/workspace", - "runtimeDirectory": "", - "useConfigmgr": true - }, - "components": { - "metrics-service": { - "debug": false, - "enabled": false, - "port": 7551 - }, - "zss": { - "tls": true, - "enabled": true, - "crossMemoryServerName": "ZWESIS_STD", - "port": 7557, - "agent": { - "jwt": { - "fallback": true - } - } - }, - "explorer-uss": { - "enabled": true - }, - "jobs-api": { - "debug": false, - "enabled": false, - "port": 7558 - }, - "files-api": { - "debug": false, - "enabled": false, - "port": 7559 - }, - "explorer-mvs": { - "enabled": true - }, - "cloud-gateway": { - "debug": false, - "enabled": false, - "port": 7563 - }, - "explorer-jes": { - "enabled": true - }, - "api-catalog": { - "debug": false, - "enabled": true, - "port": 7552 - }, - "gateway": { - "debug": false, - "enabled": true, - "port": 7554, - "apiml": { - "security": { - "x509": { - "enabled": false - }, - "auth": { - "zosmf": { - "jwtAutoconfiguration": "auto", - "serviceId": "zosmf" - }, - "provider": "zosmf" - }, - "authorization": { - "endpoint": { - "enabled": false - }, - "provider": "" - } - } - }, - "server": { - "internal": { - "ssl": { - "enabled": false - }, - "enabled": false, - "port": 7550 - } - } - }, - "app-server": { - "debug": false, - "enabled": true, - "port": 7556 - }, - "caching-service": { - "debug": false, - "enabled": true, - "storage": { - "evictionStrategy": "reject", - "size": 10000, - "infinispan": { - "jgroups": { - "port": 7600 - } - }, - "mode": "VSAM", - "vsam": { - "name": "" - } - }, - "port": 7555 - }, - "discovery": { - "debug": false, - "enabled": true, - "port": 7553 - } - } - } - - export const YAML_SCHEMA: any = { - "$schema": "https://json-schema.org/draft/2019-09/schema", - "$id": "https://zowe.org/schemas/v2/server-base", - "title": "Zowe configuration file", - "description": "Configuration file for Zowe (zowe.org) version 2.", - "type": "object", - "additionalProperties": false, - "properties": { - "zowe": { - "type": "object", - "additionalProperties": false, - "properties": { - "setup": { - "type": "object", - "additionalProperties": false, - "description": "Zowe setup configurations used by \"zwe install\" and \"zwe init\" commands.", - "properties": { - "dataset": { - "type": "object", - "additionalProperties": false, - "description": "MVS data set related configurations", - "properties": { - "prefix": { - "type": "string", - "description": "Where Zowe MVS data sets will be installed" - }, - "proclib": { - "type": "string", - "description": "PROCLIB where Zowe STCs will be copied over" - }, - "parmlib": { - "type": "string", - "description": "Zowe PARMLIB" - }, - "parmlibMembers": { - "type": "object", - "additionalProperties": false, - "description": "Holds Zowe PARMLIB members for plugins", - "properties": { - "zis": { - "description": "PARMLIB member used by ZIS", - "type": "string", - "pattern": "^([A-Z$#@]){1}([A-Z0-9$#@]){0,7}$", - "minLength": 1, - "maxLength": 8 - } - } - }, - "jcllib": { - "type": "string", - "description": "JCL library where Zowe will store temporary JCLs during initialization" - }, - "loadlib": { - "type": "string", - "description": "States the dataset where Zowe executable utilities are located", - "default": ".SZWELOAD" - }, - "authLoadlib": { - "type": "string", - "description": "The dataset that contains any Zowe core code that needs to run APF-authorized, such as ZIS", - "default": ".SZWEAUTH" - }, - "authPluginLib": { - "type": "string", - "description": "APF authorized LOADLIB for Zowe ZIS Plugins" - } - } - }, - "zis": { - "type": "object", - "additionalProperties": false, - "description": "ZIS related configurations. This setup is optional.", - "properties": { - "parmlib": { - "type": "object", - "additionalProperties": false, - "description": "ZIS related PARMLIB configurations. This setup is optional.", - "properties": { - "keys": { - "type": "object", - "additionalProperties": true, - "description": "Used to specify special ZIS key types with key-value pairs", - "examples": [ - "key.sample.1: list", - "key.sample.2: list" - ] - } - } - } - } - }, - "security": { - "type": "object", - "additionalProperties": false, - "description": "Security related configurations. This setup is optional.", - "properties": { - "product": { - "type": "string", - "description": "Security product name. Can be RACF, ACF2 or TSS", - "enum": ["RACF", "ACF2", "TSS"], - "default": "RACF" - }, - "groups": { - "type": "object", - "additionalProperties": false, - "description": "security group name", - "properties": { - "admin": { - "type": "string", - "description": "Zowe admin user group", - "default": "ZWEADMIN" - }, - "stc": { - "type": "string", - "description": "Zowe STC group", - "default": "ZWEADMIN" - }, - "sysProg": { - "type": "string", - "description": "Zowe SysProg group", - "default": "ZWEADMIN" - } - } - }, - "users": { - "type": "object", - "additionalProperties": false, - "description": "security user name", - "properties": { - "zowe": { - "type": "string", - "description": "Zowe runtime user name of main service", - "default": "ZWESVUSR" - }, - "zis": { - "type": "string", - "description": "Zowe runtime user name of ZIS", - "default": "ZWESIUSR" - } - } - }, - "stcs": { - "type": "object", - "additionalProperties": false, - "description": "STC names", - "properties": { - "zowe": { - "type": "string", - "description": "STC name of main service", - "default": "ZWESLSTC" - }, - "zis": { - "type": "string", - "description": "STC name of ZIS", - "default": "ZWESISTC" - }, - "aux": { - "type": "string", - "description": "STC name of Auxiliary Service", - "default": "ZWESASTC" - } - } - } - } - }, - "certificate": { - "type": "object", - "additionalProperties": false, - "if": { - "properties": { - "type": { - "const": "PKCS12" - } - } - }, - "then": { - "required": ["pkcs12"] - }, - "else": { - "required": ["keyring"] - }, - "description": "Certificate related configurations", - "properties": { - "type": { - "type": "string", - "description": "Type of certificate storage method.", - "enum": ["PKCS12", "JCEKS", "JCECCAKS", "JCERACFKS", "JCECCARACFKS", "JCEHYBRIDRACFKS"], - "default": "PKCS12" - }, - "pkcs12": { - "type": "object", - "additionalProperties": false, - "description": "PKCS#12 keystore settings", - "properties": { - "directory": { - "description": "Keystore directory", - "type": "string", - "pattern": "^([^\\0]){1,1024}$", - "minLength": 1, - "maxLength": 1024 - }, - "name": { - "type": "string", - "description": "Certificate alias name. Note: please use all lower cases as alias.", - "default": "localhost" - }, - "password": { - "type": "string", - "description": "Keystore password", - "default": "password" - }, - "caAlias": { - "type": "string", - "description": "Alias name of self-signed certificate authority. Note: please use all lower cases as alias.", - "default": "local_ca" - }, - "caPassword": { - "type": "string", - "description": "Password of keystore stored self-signed certificate authority.", - "default": "local_ca_password" - }, - "lock": { - "type": "boolean", - "description": "Whether to restrict the permissions of the keystore after creation" - }, - "import": { - "type": "object", - "additionalProperties": false, - "description": "Configure this section if you want to import certificate from another PKCS#12 keystore.", - "properties": { - "keystore": { - "type": "string", - "description": "Existing PKCS#12 keystore which holds the certificate issued by external CA." - }, - "password": { - "type": "string", - "description": "Password of the above keystore" - }, - "alias": { - "type": "string", - "description": "Certificate alias will be imported. Note: please use all lower cases as alias." - } - } - } - } - }, - "keyring": { - "type": "object", - "additionalProperties": false, - "description": "Configure this section if you are using z/OS keyring", - "properties": { - "owner": { - "type": "string", - "description": "keyring owner. If this is empty, Zowe will use the user ID defined as zowe.setup.security.users.zowe." - }, - "name": { - "type": "string", - "description": "keyring name" - }, - "label": { - "type": "string", - "description": "Label of Zowe certificate.", - "default": "localhost" - }, - "caLabel": { - "type": "string", - "description": "label of Zowe CA certificate.", - "default": "localca" - }, - "connect": { - "type": "object", - "additionalProperties": false, - "description": "Configure this section if you want to connect existing certificate in keyring to Zowe.", - "properties": { - "user": { - "type": "string", - "description": "Current owner of the existing certificate, can be SITE or an user ID." - }, - "label": { - "type": "string", - "description": "Label of the existing certificate will be connected to Zowe keyring." - } - } - }, - "import": { - "type": "object", - "additionalProperties": false, - "description": "Configure this section if you want to import existing certificate stored in data set to Zowe.", - "properties": { - "dsName": { - "type": "string", - "description": "Name of the data set holds the certificate issued by other CA. This data set should be in PKCS12 format and contain private key." - }, - "password": { - "type": "string", - "description": "Password for the PKCS12 data set." - } - } - }, - "zOSMF": { - "type": "object", - "additionalProperties": false, - "description": "Configure this section if you want to trust z/OSMF certificate authority in Zowe keyring.", - "properties": { - "ca": { - "type": "string", - "description": "z/OSMF certificate authority alias" - }, - "user": { - "type": "string", - "description": "z/OSMF user. Zowe initialization utility can detect alias of z/OSMF CA for RACF security system. The automated detection requires this z/OSMF user as input." - } - } - } - } - }, - "dname": { - "type": "object", - "additionalProperties": false, - "description": "Certificate distinguish name", - "properties": { - "caCommonName": { - "type": "string", - "description": "Common name of certificate authority generated by Zowe." - }, - "commonName": { - "type": "string", - "description": "Common name of certificate generated by Zowe." - }, - "orgUnit": { - "type": "string", - "description": "Organization unit of certificate generated by Zowe." - }, - "org": { - "type": "string", - "description": "Organization of certificate generated by Zowe." - }, - "locality": { - "type": "string", - "description": "Locality of certificate generated by Zowe. This is usually the city name." - }, - "state": { - "type": "string", - "description": "State of certificate generated by Zowe. You can also put province name here." - }, - "country": { - "type": "string", - "description": "2 letters country code of certificate generated by Zowe." - } - } - }, - "validity": { - "type": "integer", - "description": "Validity days for Zowe generated certificates", - "default": 3650 - }, - "san": { - "type": "array", - "description": "Domain names and IPs should be added into certificate SAN. If this field is not defined, `zwe init` command will use `zowe.externalDomains`.", - "items": { - "type": "string" - } - }, - "importCertificateAuthorities": { - "type": "array", - "description": "PEM format certificate authorities will also be imported and trusted. If you have other certificate authorities want to be trusted in Zowe keyring, list the certificate labels here. **NOTE**, due to the limitation of RACDCERT command, this field should contain maximum 2 entries.", - "items": { - "type": "string" - } - } - } - }, - "vsam": { - "type": "object", - "additionalProperties": false, - "description": "VSAM configurations if you are using VSAM as Caching Service storage", - "properties": { - "mode": { - "type": "string", - "description": "VSAM data set with Record-Level-Sharing enabled or not", - "enum": ["NONRLS", "RLS"], - "default": "NONRLS" - }, - "volume": { - "type": "string", - "description": "Volume name if you are using VSAM in NONRLS mode" - }, - "storageClass": { - "type": "string", - "description": "Storage class name if you are using VSAM in RLS mode" - } - } - } - } - }, - "runtimeDirectory": { - "$ref": "#/$defs/zowePath", - "description": "Path to where you installed Zowe." - }, - "logDirectory": { - "$ref": "#/$defs/zowePath", - "description": "Path to where you want to store Zowe log files." - }, - "workspaceDirectory": { - "$ref": "#/$defs/zowePath", - "description": "Path to where you want to store Zowe workspace files. Zowe workspace are used by Zowe component runtime to store temporary files." - }, - "extensionDirectory": { - "$ref": "#/$defs/zowePath", - "description": "Path to where you want to store Zowe extensions. \"zwe components install\" will install new extensions into this directory." - }, - "job": { - "type": "object", - "additionalProperties": false, - "description": "Customize your Zowe z/OS JES job.", - "properties": { - "name": { - "type": "string", - "description": "Job name of Zowe primary ZWESLSTC started task." - }, - "prefix": { - "type": "string", - "description": "A short prefix to customize address spaces created by Zowe job." - } - } - }, - "network": { - "$ref": "#/$defs/networkSettings" - }, - "extensionRegistry": { - "type": "object", - "description": "Defines optional configuration for downloading extensions from an online or offline registry", - "required": ["defaultHandler", "handlers"], - "properties": { - "defaultHandler": { - "type": "string", - "description": "The name of a handler specified in the handlers section. Will be used as the default for 'zwe components' commands" - }, - "handlers": { - "type": "object", - "patternProperties": { - "^.*$": { - "$ref": "#/$defs/registryHandler" - } - } - } - } - }, - "launcher": { - "type": "object", - "description": "Set default behaviors of how the Zowe launcher will handle components", - "additionalProperties": false, - "properties": { - "restartIntervals": { - "type": "array", - "description": "Intervals of seconds to wait before restarting a component if it fails before the minUptime value.", - "items": { - "type": "integer" - } - }, - "minUptime": { - "type": "integer", - "default": 90, - "description": "The minimum amount of seconds before a component is considered running and the restart counter is reset." - }, - "shareAs": { - "type": "string", - "description": "Determines which SHAREAS mode should be used when starting a component", - "enum": ["no", "yes", "must", ""], - "default": "yes" - }, - "unsafeDisableZosVersionCheck": { - "type": "boolean", - "description": "Used to allow Zowe to warn, instead of error, when running on a version of z/OS that this version of Zowe hasn't been verified as working with", - "default": false - } - } - }, - "rbacProfileIdentifier": { - "type": "string", - "description": "An ID used for determining resource names used in RBAC authorization checks" - }, - "cookieIdentifier": { - "type": "string", - "description": "An ID that can be used by servers that distinguish their cookies from unrelated Zowe installs" - }, - "externalDomains": { - "type": "array", - "description": "List of domain names of how you access Zowe from your local computer.", - "minItems": 1, - "uniqueItems": true, - "items": { - "type": ["string"] - } - }, - "externalPort": { - "$ref": "#/$defs/port", - "description": "Port number of how you access Zowe APIML Gateway from your local computer." - }, - "environments": { - "type": "object", - "description": "Global environment variables can be applied to all Zowe high availability instances." - }, - "launchScript": { - "type": "object", - "description": "Customize Zowe launch scripts (zwe commands) behavior.", - "properties": { - "logLevel": { - "type": "string", - "description": "Log level for Zowe launch scripts.", - "enum": ["", "info", "debug", "trace"] - }, - "onComponentConfigureFail": { - "type": "string", - "description": "Chooses how 'zwe start' behaves if a component configure script fails", - "enum": ["warn", "exit"], - "default": "warn" - } - } - }, - "certificate": { - "$ref": "#/$defs/certificate", - "description": "Zowe certificate setup." - }, - "verifyCertificates": { - "type": "string", - "description": "Customize how Zowe should validate certificates used by components or other services.", - "enum": ["STRICT", "NONSTRICT", "DISABLED"] - }, - "sysMessages": { - "type": "array", - "description": "List of Zowe message portions when matched will be additionally logged into the system's log (such as syslog on z/OS). Note: Some messages extremely early in the Zowe lifecycle may not be added to the system's log", - "uniqueItems": true, - "items": { - "type": "string" - } - }, - "useConfigmgr": { - "type": "boolean", - "default": false, - "description": "Determines whether or not to use the features of configmgr such as multi-config, parmlib config, config templates, and schema validation. This effects the zwe command." - }, - "configmgr": { - "type": "object", - "description": "Controls how configmgr will be used by zwe", - "required": ["validation"], - "properties": { - "validation": { - "type": "string", - "enum": ["STRICT", "COMPONENT-COMPAT"], - "description": "States how configmgr will do validation: Will it quit on any error (STRICT) or quit on any error except the case of a component not having a schema file (COMPONENT-COMPAT)" - } - } - } - } - }, - "java": { - "type": "object", - "properties": { - "home": { - "$ref": "#/$defs/zowePath", - "description": "Path to Java home directory." - } - } - }, - "node": { - "type": "object", - "properties": { - "home": { - "$ref": "#/$defs/zowePath", - "description": "Path to node.js home directory." - } - } - }, - "zOSMF": { - "type": "object", - "additionalProperties": false, - "properties": { - "host": { - "type": "string", - "description": "Host or domain name of your z/OSMF instance." - }, - "port": { - "$ref": "#/$defs/port", - "description": "Port number of your z/OSMF instance." - }, - "scheme": { - "$ref" : "#/$defs/scheme", - "description": "Scheme used to connect to z/OSMF instance. Optional for outbout AT-TLS, defaults to https" - }, - "applId": { - "type": "string", - "description": "Appl ID of your z/OSMF instance." - } - } - }, - "components": { - "type": "object", - "patternProperties": { - "^.*$": { - "$ref": "#/$defs/component" - } - } - }, - "haInstances": { - "type": "object", - "patternProperties": { - "^.*$": { - "type": "object", - "description": "Configuration of Zowe high availability instance.", - "required": ["hostname", "sysname"], - "properties": { - "hostname": { - "type": "string", - "description": "Host name of the Zowe high availability instance. This is hostname for internal communications." - }, - "sysname": { - "type": "string", - "description": "z/OS system name of the Zowe high availability instance. Some JES command will be routed to this system name." - }, - "components": { - "type": "object", - "patternProperties": { - "^.*$": { - "$ref": "#/$defs/component" - } - } - } - } - } - } - } - }, - "$defs": { - "port": { - "type": "integer", - "minimum": 0, - "maximum": 65535 - }, - "scheme": { - "type": "string", - "enum": [ - "http", - "https" - ], - "default": "https" - }, - "certificate": { - "oneOf": [ - { "$ref": "#/$defs/pkcs12-certificate" }, - { "$ref": "#/$defs/keyring-certificate" } - ] - }, - "pkcs12-certificate": { - "type": "object", - "additionalProperties": false, - "required": ["keystore", "truststore", "pem"], - "properties": { - "keystore": { - "type": "object", - "additionalProperties": false, - "description": "Certificate keystore.", - "required": ["type", "file", "alias"], - "properties": { - "type": { - "type": "string", - "description": "Keystore type.", - "const": "PKCS12" - }, - "file": { - "$ref": "#/$defs/zowePath", - "description": "Path to your PKCS#12 keystore." - }, - "password": { - "type": "string", - "description": "Password of your PKCS#12 keystore." - }, - "alias": { - "type": "string", - "description": "Certificate alias name of defined in your PKCS#12 keystore" - } - } - }, - "truststore": { - "type": "object", - "additionalProperties": false, - "description": "Certificate truststore.", - "required": ["type", "file"], - "properties": { - "type": { - "type": "string", - "description": "Truststore type.", - "const": "PKCS12" - }, - "file": { - "$ref": "#/$defs/zowePath", - "description": "Path to your PKCS#12 keystore." - }, - "password": { - "type": "string", - "description": "Password of your PKCS#12 keystore." - } - } - }, - "pem": { - "type": "object", - "additionalProperties": false, - "description": "Certificate in PEM format.", - "required": ["key", "certificate"], - "properties": { - "key": { - "$ref": "#/$defs/zowePath", - "description": "Path to the certificate private key stored in PEM format." - }, - "certificate": { - "$ref": "#/$defs/zowePath", - "description": "Path to the certificate stored in PEM format." - }, - "certificateAuthorities": { - "description": "List of paths to the certificate authorities stored in PEM format.", - "oneOf": [{ - "$ref": "#/$defs/zowePath", - "description": "Paths to the certificate authorities stored in PEM format. You can separate multiple certificate authorities by comma." - }, - { - "type": "array", - "description": "Path to the certificate authority stored in PEM format.", - "items": { - "$ref": "#/$defs/zowePath" - } - } - ] - } - } - } - } - }, - "keyring-certificate": { - "type": "object", - "additionalProperties": false, - "required": ["keystore", "truststore"], - "properties": { - "keystore": { - "type": "object", - "additionalProperties": false, - "description": "Certificate keystore.", - "required": ["type", "file", "alias"], - "properties": { - "type": { - "type": "string", - "description": "Keystore type.", - "enum": ["JCEKS", "JCECCAKS", "JCERACFKS", "JCECCARACFKS", "JCEHYBRIDRACFKS"] - }, - "file": { - "type": "string", - "description": "Path of your z/OS keyring, including ring owner and ring name. Case sensitivity and spaces matter.", - "pattern": "^safkeyring:\/\/.*" - }, - "password": { - "type": "string", - "description": "Literally 'password' may be needed when using keyrings for compatibility with java servers.", - "enum": ["", "password"] - }, - "alias": { - "type": "string", - "description": "Certificate label of z/OS keyring. Case sensitivity and spaces matter." - } - } - }, - "truststore": { - "type": "object", - "additionalProperties": false, - "description": "Certificate truststore.", - "required": ["type", "file"], - "properties": { - "type": { - "type": "string", - "description": "Truststore type.", - "enum": ["JCEKS", "JCECCAKS", "JCERACFKS", "JCECCARACFKS", "JCEHYBRIDRACFKS"] - }, - "file": { - "type": "string", - "description": "Path of your z/OS keyring, including ring owner and ring name. Case sensitivity and spaces matter.", - "pattern": "^safkeyring:\/\/.*" - }, - "password": { - "type": "string", - "description": "Literally 'password' may be needed when using keyrings for compatibility with java servers.", - "enum": ["", "password"] - } - } - }, - "pem": { - "type": "object", - "additionalProperties": false, - "description": "Certificate in PEM format.", - "properties": { - "key": { - "type": "string", - "description": "Path to the certificate private key stored in PEM format." - }, - "certificate": { - "type": "string", - "description": "Path to the certificate stored in PEM format." - }, - "certificateAuthorities": { - "description": "List of paths to the certificate authorities stored in PEM format.", - "oneOf": [{ - "type": "string", - "description": "Paths to the certificate authorities stored in PEM format. You can separate multiple certificate authorities by comma." - }, - { - "type": "array", - "description": "Path to the certificate authority stored in PEM format.", - "items": { - "type": "string" - } - } - ] - } - } - } - } - }, - "component": { - "$anchor": "zoweComponent", - "type": "object", - "properties": { - "enabled": { - "type": "boolean", - "description": "Whether to enable or disable this component", - "default": false - }, - "certificate": { - "$ref": "#/$defs/certificate", - "description": "Certificate for current component." - }, - "launcher": { - "type": "object", - "description": "Set behavior of how the Zowe launcher will handle this particular component", - "additionalProperties": true, - "properties": { - "restartIntervals": { - "type": "array", - "description": "Intervals of seconds to wait before restarting a component if it fails before the minUptime value.", - "items": { - "type": "integer" - } - }, - "minUptime": { - "type": "integer", - "default": 90, - "description": "The minimum amount of seconds before a component is considered running and the restart counter is reset." - }, - "shareAs": { - "type": "string", - "description": "Determines which SHAREAS mode should be used when starting a component", - "enum": ["no", "yes", "must", ""], - "default": "yes" - } - } - }, - "zowe": { - "type": "object", - "description": "Component level overrides for top level Zowe network configuration.", - "additionalProperties": true, - "properties": { - "network": { - "$ref": "#/$defs/networkSettings" - }, - "job": { - "$ref": "#/$defs/componentJobSettings" - } - } - } - } - }, - "componentJobSettings": { - "$anchor": "componentJobSettings", - "type": "object", - "description": "Component level overrides for job execution behavior", - "properties": { - "suffix": { - "type": "string", - "description": "Can be used by components to declare a jobname suffix to append to their job. This is not currently used by Zowe itself, it is up to components to use this value if desired. Zowe may use this value in the future." - } - } - }, - "tlsSettings": { - "$anchor": "tlsSettings", - "type": "object", - "properties": { - "ciphers": { - "type": "array", - "description": "Acceptable TLS cipher suites for network connections, in IANA format.", - "items": { - "type": "string" - } - }, - "curves": { - "type": "array", - "description": "Acceptable key exchange elliptic curves for network connections.", - "items": { - "type": "string" - } - }, - "maxTls": { - "type": "string", - "enum": ["TLSv1.2", "TLSv1.3"], - "default": "TLSv1.3", - "description": "Maximum TLS version allowed for network connections." - }, - "minTls": { - "type": "string", - "enum": ["TLSv1.2", "TLSv1.3"], - "default": "TLSv1.2", - "description": "Minimum TLS version allowed for network connections, and less than or equal to network.maxTls." - } - } - }, - "networkSettings": { - "type": "object", - "$anchor": "networkSettings", - "additionalProperties": false, - "description": "Optional, advanced network configuration parameters", - "properties": { - "server": { - "type": "object", - "additionalProperties": false, - "description": "Optional, advanced network configuration parameters for Zowe servers", - "properties": { - "tls": { - "$ref": "#/$defs/tlsSettings" - }, - "listenAddresses": { - "type": "array", - "description": "The IP addresses which all of the Zowe servers will be binding on and listening to. Some servers may only support listening on the first element.", - "items": { - "type": "string", - "pattern": "^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$" - } - }, - "vipaIp": { - "type": "string", - "description": "The IP address which all of the Zowe servers will be binding to. If you are using multiple DIPVA addresses, do not use this option." - }, - "validatePortFree": { - "type": "boolean", - "default": true, - "description": "Whether or not to ensure that the port a server is about to use is available. Usually, servers will know this when they attempt to bind to a port, so this option allows you to disable the additional verification step." - } - } - }, - "client": { - "type": "object", - "additionalProperties": false, - "description": "Optional, advanced network configuration parameters for Zowe servers when sending requests as clients.", - "properties": { - "tls": { - "$ref": "#/$defs/tlsSettings" - } - } - } - } - }, - "registryHandler": { - "$anchor": "registryHandler", - "type": "object", - "required": ["registry", "path"], - "properties": { - "registry": { - "type": "string", - "description": "The location of the default registry for this handler. It could be a URL, path, dataset, whatever this handler supports" - }, - "path": { - "$ref": "#/$defs/zowePath", - "description": "Unix file path to the configmgr-compatible JS file which implements the handler API" - } - } - }, - "zowePath": { - "$anchor": "zowePath", - "type": "string", - "pattern": "^([^\\0]){1,1024}$", - "minLength": 1, - "maxLength": 1024 - }, - } - } \ No newline at end of file diff --git a/src/renderer/global.css b/src/renderer/global.css index 8821c5fb..72d9d032 100644 --- a/src/renderer/global.css +++ b/src/renderer/global.css @@ -72,7 +72,7 @@ a:hover { height: 100%; position: fixed; background: #222; - z-index: 2; + z-index: 9000; opacity: 0.4; } diff --git a/src/renderer/index.html b/src/renderer/index.html index 07712fd7..77be82bd 100644 --- a/src/renderer/index.html +++ b/src/renderer/index.html @@ -2,7 +2,7 @@ - Zowe Enterprise Necessity + Zowe Server Install Wizard
diff --git a/src/renderer/preload.ts b/src/renderer/preload.ts index 93a05505..42010fd4 100644 --- a/src/renderer/preload.ts +++ b/src/renderer/preload.ts @@ -10,6 +10,7 @@ import { contextBridge, ipcRenderer } from 'electron'; import { IIpcConnectionArgs } from '../types/interfaces'; +import { InstallationArgs } from '../types/stateInterfaces'; contextBridge.exposeInMainWorld('electron', { ipcRenderer: { @@ -28,18 +29,39 @@ contextBridge.exposeInMainWorld('electron', { getConfig() { return ipcRenderer.invoke("get-config"); }, + uploadLatestYaml(connectionArgs: IIpcConnectionArgs, installationArgs: InstallationArgs) { + return ipcRenderer.invoke("upload-latest-yaml", connectionArgs, installationArgs); + }, getConfigByKey(key: string, value: any) { return ipcRenderer.invoke("get-config-by-key", key); }, setConfig(completeZoweYamlObj: any) { return ipcRenderer.invoke("set-config", completeZoweYamlObj); }, - setConfigByKey(key: string, value: any) { + setConfigByKeyAndValidate(key: string, value: any) { return ipcRenderer.invoke("set-config-by-key", key, value); }, setConfigByKeyNoValidate(key: string, value: any) { return ipcRenderer.invoke("set-config-by-key-no-validate", key, value); }, + getJCLOutput() { + return ipcRenderer.invoke("get-jcl-output"); + }, + setJCLOutput(value: any) { + return ipcRenderer.invoke("set-jcl-output", value); + }, + getYAMLOutput() { + return ipcRenderer.invoke("get-yaml-output"); + }, + setYAMLOutput(value: any) { + return ipcRenderer.invoke("set-yaml-output", value); + }, + getStandardOutput() { + return ipcRenderer.invoke("get-standard-output"); + }, + setStandardOutput(value: any) { + return ipcRenderer.invoke("set-standard-output", value); + }, setSchema(schema: any) { return ipcRenderer.invoke("set-schema", schema); }, @@ -71,19 +93,33 @@ contextBridge.exposeInMainWorld('electron', { return ipcRenderer.invoke("check-space-create-dir", connectionArgs, location); }, checkDirExists(connectionArgs: IIpcConnectionArgs, location: string) { - return ipcRenderer.invoke("check-dir-exists", connectionArgs, location); + try{ + return ipcRenderer.invoke("check-dir-exists", connectionArgs, location); + } catch (e){ + return {status: false, details: e.message} + } }, checkDirOrCreate(connectionArgs: IIpcConnectionArgs, location: string) { + try{ return ipcRenderer.invoke("check-dir-or-create", connectionArgs, location); + } catch (e) { + return {status: false, details: e.message} + } + }, + installButtonOnClick(connectionArgs: IIpcConnectionArgs, installationArgs: InstallationArgs, version: string) { + return ipcRenderer.invoke("install-mvs", connectionArgs, installationArgs, version); + }, + downloadButtonOnClick(connectionArgs: IIpcConnectionArgs, installationArgs: InstallationArgs, version: string) { + return ipcRenderer.invoke("download-unpax", connectionArgs, installationArgs, version); }, - installButtonOnClick(connectionArgs: IIpcConnectionArgs, installationArgs: {installDir: string, javaHome: string, nodeHome: string, installationType: string, userUploadedPaxPath: string}, version: string, zoweConfig: any, skipDownload: boolean) { - return ipcRenderer.invoke("install-mvs", connectionArgs, installationArgs, version, zoweConfig, skipDownload); + fetchExampleYamlBtnOnClick(connectionArgs: IIpcConnectionArgs, installationArgs: InstallationArgs) { + return ipcRenderer.invoke("get-yaml-schema", connectionArgs, installationArgs); }, - initCertsButtonOnClick(connectionArgs: IIpcConnectionArgs, installationArgs: {installDir: string}, zoweConfig: any) { - return ipcRenderer.invoke("init-certificates", connectionArgs, installationArgs, zoweConfig); + initCertsButtonOnClick(connectionArgs: IIpcConnectionArgs, installationArgs: {installDir: string}) { + return ipcRenderer.invoke("init-certificates", connectionArgs, installationArgs); }, - apfAuthButtonOnClick(connectionArgs: IIpcConnectionArgs, installationArgs: {installationDir: string, installationType: string, userUploadedPaxPath: string}, zoweConfig: any) { - return ipcRenderer.invoke("init-apf", connectionArgs, installationArgs, zoweConfig); + apfAuthButtonOnClick(connectionArgs: IIpcConnectionArgs, installationArgs: InstallationArgs) { + return ipcRenderer.invoke("init-apf", connectionArgs, installationArgs); }, getApfAuthProgress(){ return ipcRenderer.invoke("get-apf-auth-progress"); @@ -91,24 +127,33 @@ contextBridge.exposeInMainWorld('electron', { getInstallationProgress() { return ipcRenderer.invoke("get-installation-progress"); }, + getDownloadUnpaxProgress() { + return ipcRenderer.invoke("get-download-unpax-progress"); + }, getCertificateProgress() { return ipcRenderer.invoke("get-certificate-progress"); }, - initSecurityButtonOnClick(connectionArgs: IIpcConnectionArgs, installationArgs: {installDir: string}, zoweConfig: any) { - return ipcRenderer.invoke("init-security", connectionArgs, installationArgs, zoweConfig); + initSecurityButtonOnClick(connectionArgs: IIpcConnectionArgs, installationArgs: {installDir: string}) { + return ipcRenderer.invoke("init-security", connectionArgs, installationArgs); + }, + initStcsButtonOnClick(connectionArgs: IIpcConnectionArgs, installationArgs: {installDir: string}) { + return ipcRenderer.invoke("init-stcs", connectionArgs, installationArgs); }, - initVsamButtonOnClick(connectionArgs: IIpcConnectionArgs, installationArgs: {installDir: string}, zoweConfig: any) { - return ipcRenderer.invoke("init-vsam", connectionArgs, installationArgs, zoweConfig); + initVsamButtonOnClick(connectionArgs: IIpcConnectionArgs, installationArgs: {installDir: string}) { + return ipcRenderer.invoke("init-vsam", connectionArgs, installationArgs); }, getInitSecurityProgress(){ return ipcRenderer.invoke("get-init-security-progress"); }, + getInitStcsProgress(){ + return ipcRenderer.invoke("get-init-stcs-progress"); + }, getInitVsamProgress(){ return ipcRenderer.invoke("get-init-vsam-progress"); }, on(channel: string, func: any) { // REVIEW: Used to have channel validation with ipcRenderer.send, do we need something similar for ipcRenderer.invoke? - const validChannels = ['install-mvs', 'init-security', 'init-vsam']; + const validChannels = ['install-mvs', 'init-apf', 'init-certificates', 'init-security', 'init-vsam', 'init-stcs']; if (validChannels.includes(channel)) { ipcRenderer.on(channel, (event, ...args) => func(...args)); } diff --git a/src/services/CheckENV.ts b/src/services/CheckENV.ts index a24156ff..eb6a00da 100644 --- a/src/services/CheckENV.ts +++ b/src/services/CheckENV.ts @@ -10,23 +10,26 @@ import {IIpcConnectionArgs, IJobResults} from "../types/interfaces"; import {submitJcl} from "./SubmitJcl"; -import {startBPXBATCHAndShellSession} from "./utils"; +import {startBPXBATCHAndShellSession} from "./ServiceUtils"; export class CheckENV { public async run(connectionArgs: IIpcConnectionArgs) { const jcl = `${connectionArgs.jobStatement} ${startBPXBATCHAndShellSession("ZNCHKNV")} -echo $JAVA_HOME; +echo $JAVA_HOME && echo $NODE_HOME; /* ` const resp: IJobResults = await submitJcl(connectionArgs, jcl, ["STDOUT", "STDERR"]); - // REVIEW: Need to find better parsing option - if (resp.rc === 0 && resp.jobOutput && resp.jobOutput["3"]) { - return {status: true, details: resp.jobOutput["3"]}; - } else { - return {status: false, details: `${resp.rc}: ${resp.jobOutput}`}; + // REVIEW: Need to find better parsing option. For some responses, relevant info is in 4th element (3) or some in 3rd element (2) + if (resp.rc === 0 && resp.jobOutput) { // Success case + if (resp.jobOutput["3"]) { + return {status: true, details: resp.jobOutput["3"]}; + } + } else if (resp.jobOutput["2"]) { // Failure case, but do we have relevant info? + return {status: false, details: resp.jobOutput["2"]}; } + return {status: false, details: `${resp.rc}: ${resp.jobOutput}`}; // Failure case, just send whatever you can I suppose } } diff --git a/src/services/CheckJava.ts b/src/services/CheckJava.ts index cbfd8639..8e1ce497 100644 --- a/src/services/CheckJava.ts +++ b/src/services/CheckJava.ts @@ -8,9 +8,10 @@ * Copyright Contributors to the Zowe Project. */ +import { JCL_UNIX_SCRIPT_OK } from "../renderer/components/common/Utils"; import {IIpcConnectionArgs, IJobResults} from "../types/interfaces"; import {submitJcl} from "./SubmitJcl"; -import {startBPXBATCHAndShellSession} from "./utils"; +import { startBPXBATCHAndShellSession } from "./ServiceUtils"; export class CheckJava { @@ -18,8 +19,8 @@ export class CheckJava { const jcl = `${config.jobStatement} ${startBPXBATCHAndShellSession("ZNCHKJV")} -${java}/bin/java -version; -echo "Script finished." +${java}/bin/java -version && +echo "${JCL_UNIX_SCRIPT_OK}" /* ` const resp: IJobResults = await submitJcl(config, jcl, ["STDOUT", "STDERR"]) diff --git a/src/services/CheckNode.ts b/src/services/CheckNode.ts index 86fcbd78..5fffffd5 100644 --- a/src/services/CheckNode.ts +++ b/src/services/CheckNode.ts @@ -10,7 +10,8 @@ import {IIpcConnectionArgs, IJobResults} from "../types/interfaces"; import {submitJcl} from "./SubmitJcl"; -import { startBPXBATCHAndShellSession } from "./utils"; +import { startBPXBATCHAndShellSession } from "./ServiceUtils"; +import { JCL_UNIX_SCRIPT_OK } from "../renderer/components/common/Utils"; export class CheckNode { @@ -18,8 +19,8 @@ export class CheckNode { const jcl = `${config.jobStatement} ${startBPXBATCHAndShellSession("ZNCKNOD")} -${node}/bin/node -v; -echo "Script finished." +${node}/bin/node -v && +echo "${JCL_UNIX_SCRIPT_OK}" /* ` const resp: IJobResults = await submitJcl(config, jcl, ["STDOUT", "STDERR"]) diff --git a/src/services/CheckSpace.ts b/src/services/CheckSpace.ts index a7b1b848..f51f9303 100644 --- a/src/services/CheckSpace.ts +++ b/src/services/CheckSpace.ts @@ -10,7 +10,8 @@ import {IIpcConnectionArgs, IJobResults} from "../types/interfaces"; import {submitJcl} from "./SubmitJcl"; -import { startBPXBATCHAndShellSession } from "./utils"; +import { startBPXBATCHAndShellSession } from "./ServiceUtils"; +import { JCL_UNIX_SCRIPT_OK } from "../renderer/components/common/Utils"; export class CheckSpace { @@ -18,9 +19,9 @@ export class CheckSpace { const jcl = `${config.jobStatement} ${startBPXBATCHAndShellSession("ZNCHKSP")} -echo "SPACE in MB"; -df -m ${dir}; -echo "Script finished." +echo "SPACE in MB" && +df -m ${dir} && +echo "${JCL_UNIX_SCRIPT_OK}" /* ` const resp: IJobResults = await submitJcl(config, jcl, ["STDOUT", "STDERR"]) diff --git a/src/services/DatasetValidation.ts b/src/services/DatasetValidation.ts new file mode 100644 index 00000000..41dd8334 --- /dev/null +++ b/src/services/DatasetValidation.ts @@ -0,0 +1,30 @@ +/* + * This program and the accompanying materials are made available under the terms of the + * Eclipse Public License v2.0 which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-v20.html + * + * SPDX-License-Identifier: EPL-2.0 + * + * Copyright Contributors to the Zowe Project. + */ + +export const validateDatasetIterator = (schema: any) : { isValid: boolean, key: string } => { + for (const key of Object.keys(schema)) { + let value = schema[key]; + if (typeof value === 'object' && value !== null) { + const result = validateDatasetIterator(value); + if(!result.isValid) { + return {isValid: false, key: key}; + } + } else if(!isDatasetValid(value)) { + return {isValid: false, key: key}; + } + } + return {isValid: true, key: ''}; +} + +export const isDatasetValid = (dsName: string) : boolean => { + const DsNamePattern = "^[a-zA-Z#$@][a-zA-Z0-9#$@-]{0,7}([.][a-zA-Z#$@][a-zA-Z0-9#$@-]{0,7}){0,21}$"; + const regEx = new RegExp(DsNamePattern); + return regEx.test(dsName); +} \ No newline at end of file diff --git a/src/services/FileTransfer.ts b/src/services/FileTransfer.ts index a3ca4b5b..f76f5c3a 100644 --- a/src/services/FileTransfer.ts +++ b/src/services/FileTransfer.ts @@ -9,7 +9,7 @@ */ import {IncomingMessage} from "http"; -import {connectFTPServer} from "./utils"; +import {connectFTPServer} from "./ServiceUtils"; import {IIpcConnectionArgs, IResponse} from "../types/interfaces"; import * as fs from 'fs'; diff --git a/src/services/ResolveRef.ts b/src/services/ResolveRef.ts new file mode 100644 index 00000000..53c3bd20 --- /dev/null +++ b/src/services/ResolveRef.ts @@ -0,0 +1,92 @@ +let mainSchema: any; +let schemaMap: { [key: string]: any } = {}; + +export const updateSchemaReferences = (schemas: { [key: string]: string }, schemaObject: any): void => { + schemaMap = parseSchemas(schemas); + + // Traverse and resolve references in schemas other than zowe-yaml schema + Object.values(schemaMap).forEach((schema: any) => { + if(schema?.$id !== schemaObject?.$id) { + mainSchema = schema; + traverseAndResolveReferences(schema); + } + }) + + // Traverse and resolve references for the zowe-yaml schema + mainSchema = schemaObject; + traverseAndResolveReferences(schemaObject); +} + +// Parses all schemas and populates the schemaMap +const parseSchemas = (schemas: { [key: string]: string }): { [key: string]: any } => { + const schemaMap: { [key: string]: any } = {}; + Object.entries(schemas).forEach(([key, value]) => { + try { + const schemaObject = JSON.parse(value); + const id = schemaObject?.$id; + if (id) { + schemaMap[id] = schemaObject; + } + } catch (error: any) { + console.error(`Unable to parse schema for key ${key}:`, error.message); + } + }); + return schemaMap; +}; + +// Recursively traverse and resolve $ref references in the schema object +const traverseAndResolveReferences = (schemaObj: any) => { + if (schemaObj && typeof schemaObj === "object") { + Object.keys(schemaObj).forEach((key) => { + if (key === "$ref" && typeof schemaObj[key] === "string") { + try { + const refValue = resolveRef(schemaObj[key]); + Object.assign(schemaObj, refValue); + delete schemaObj['$ref']; + } catch(error){ + console.error("Error resolving reference:", error.message); + } + } else { + traverseAndResolveReferences(schemaObj[key]); + } + }) + } +} + +// Resolve a $ref string to its referenced schema object +const resolveRef = (ref: string) => { + let [refPath, anchorPart] = ref.split('#'); + const isRefPathEmpty = !refPath; + + let refSchema = isRefPathEmpty + ? mainSchema + : schemaMap[Object.keys(schemaMap).find((id) => id.endsWith(refPath))]; + + if (!refSchema) { + throw new Error(`Schema for reference path ${refPath} not found`); + } + + if (!refSchema.$defs) { + throw new Error(`No $defs found in schema ${refSchema.$id}`); + } + + const anchor = anchorPart?.split("/").pop(); + const refObject = isRefPathEmpty + ? refSchema.$defs[anchor] + : Object.values(refSchema.$defs).find((obj:any) => obj.$anchor === anchor); + + if (!refObject) { + throw new Error(`Reference ${ref} not found in schemaObject ${refSchema.$id}`); + } + + // Ensure pattern is a string and remove backslashes for ajv compatibility + if (refObject.pattern) { + const pattern = typeof refObject.pattern === 'string' ? refObject.pattern : String(refObject.pattern); + + if (pattern.includes("\\")) { + refObject.pattern = pattern.replace(/\\/g, ''); + } + } + + return refObject; +} \ No newline at end of file diff --git a/src/services/RunScript.ts b/src/services/RunScript.ts index e5cc9210..7dccb41d 100644 --- a/src/services/RunScript.ts +++ b/src/services/RunScript.ts @@ -10,17 +10,17 @@ import {IIpcConnectionArgs, IJobResults} from "../types/interfaces"; import {submitJcl} from "./SubmitJcl"; -import {parseUnixScriptByNumOfChars, startBPXBATCHAndShellSession} from "./utils"; +import { parseUnixScriptByNumOfChars, startBPXBATCHAndShellSession } from "./ServiceUtils"; +import { JCL_UNIX_SCRIPT_OK } from "../renderer/components/common/Utils"; export class Script { public async run(config: IIpcConnectionArgs, script: string) { - // TODO: Shouldn't we change ";" to "&&" to stop on first fail instead of keep going? const jcl = `${config.jobStatement} ${startBPXBATCHAndShellSession("ZNSCRPT")} -${parseUnixScriptByNumOfChars(script)}; -echo "Script finished." +${parseUnixScriptByNumOfChars(script)} +&& echo "${JCL_UNIX_SCRIPT_OK}" /* ` console.log(`JOB: ${jcl}`) const resp: IJobResults = await submitJcl(config, jcl, ["STDOUT", "STDERR"]) diff --git a/src/services/ServiceUtils.ts b/src/services/ServiceUtils.ts new file mode 100644 index 00000000..08c72a62 --- /dev/null +++ b/src/services/ServiceUtils.ts @@ -0,0 +1,151 @@ +/* + * This program and the accompanying materials are made available under the terms of the + * Eclipse Public License v2.0 which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-v20.html + * + * SPDX-License-Identifier: EPL-2.0 + * + * Copyright Contributors to the Zowe Project. + */ + +import {IIpcConnectionArgs} from "../types/interfaces"; +import Header from "../renderer/components/Header" +import { AlertColor } from "@mui/material/Alert"; +import zos from 'zos-node-accessor'; +import { isValidUSSPath } from "../renderer/components/common/Utils"; + +// Note: This file is not usable by the Renderer + +export const JCL_UNIX_SCRIPT_CHARS = 70; + +export const JCL_JOBNAME_DEFAULT = "ZENJOB"; + +export const MKDIR_ERROR_PARENT = "EDC5129I"; // when MKDIR tries to create top-level dir in a dir that doesn't exist + +export const MKDIR_ERROR_PERMISSIONS = "EDC5111I"; + +export const MKDIR_ERROR_EXISTS = "EDC5117I"; // when dir already exist + +export const MKDIR_ERROR_BADARGS= "EDC5134I"; // when func not implemented + +export const LIST_ERROR_NOTFOUND = "FSUM6785"; // when dir doesn't exist + +let stopMakeDir = false; + +export async function connectFTPServer(config: IIpcConnectionArgs): Promise { + + const client = new zos(); + //Config Doc: https://github.com/IBM/zos-node-accessor/blob/3e32cc8b8cbd74c6bc3c29c268338e23f173bebc/README.md?plain=1#L89 + await client.connect(config); + if (!client.connected) { + console.error('Failed to connect to', config.host); + } + return client; +} + +export async function checkDirExists(config: IIpcConnectionArgs, dir: string): Promise { + const client = await connectFTPServer(config); + try { + const list = await client.listDataset(dir); + return !!list; + } catch (error) { + if (error.toString().includes(LIST_ERROR_NOTFOUND) == false) { // List cmd returns an error for not found, so hide that one + console.warn(error); + } + return false; + } finally { + client.close(); + } +} + +/* Function's a little weird but basically +a) zos-node-accessor has no mkdir -p +b) we use a stopRecursion flag because sometimes we keep trying for a parent, and we reduce down until we *can* make it +but we won't know that we *cannot* until we hit the bad permissions error (ie reducePath has run its course) */ +export async function makeDir(config: IIpcConnectionArgs, dir: string, stopRecursionFlag = { stop: false }): Promise { + if (stopRecursionFlag.stop) { + return false; + } + if (!isValidUSSPath(dir)) { + console.warn("Attempted to create invalid Unix directory: " + dir); + return false; + } + const client = await connectFTPServer(config); + try { + await client.makeDirectory(dir); + return true; + } catch (error) { + if (error.toString().includes(MKDIR_ERROR_PERMISSIONS)) { // This is the error that tells us we should stop our parent search + console.warn("Wasn't able to create: '" + dir + "'. Bad permissions"); + stopRecursionFlag.stop = true; + return false; + } + if (error.toString().includes(MKDIR_ERROR_PARENT)) { // This is the error that tells us there's still a chance + let parentDir = reducePath(dir); + if (parentDir !== "/" && parentDir) { + console.info("Wasn't able to create: '" + dir + "'. Will attempt to create: " + parentDir); + const parentResult = await makeDir(config, parentDir, stopRecursionFlag); + if (parentResult && !stopRecursionFlag.stop) { + return await makeDir(config, dir, stopRecursionFlag); + } + return false; + } + } + if (error.toString().includes(MKDIR_ERROR_EXISTS)) { + return true; + } + if (error.toString().includes(MKDIR_ERROR_BADARGS)) { + console.warn("Wasn't able to create: '" + dir + "'. Problem with using mkdir. Method usage is not implemented (bad arguments?)"); + } else { + console.warn(error); + } + return false; + } finally { + client.close(); + } +} + +// /u/tsxxx/blaa --> /u/tsxxx, eventually goes down to "/" then empty +export function reducePath(path: string): string { + return path.substring(0, path.lastIndexOf('/')); +} + +// This adds a "\n" inside Unix commands separated by ";" if char limit reached +export function parseUnixScriptByNumOfChars(script: string, charCount: number = JCL_UNIX_SCRIPT_CHARS): string { + const parts: string[] = []; + let currentPart = ''; + let counter = 0; + + for (let i = 0; i < script.length; i++) { + if (counter >= charCount) { + const lastSpaceIndex = currentPart.lastIndexOf(' '); + + if (lastSpaceIndex !== -1) { + // If there's a space within the character limit, backtrack to the last encountered space + const backtrackedPart = currentPart.substring(0, lastSpaceIndex); + parts.push(backtrackedPart + '\n'); + currentPart = currentPart.substring(lastSpaceIndex + 1) + script[i]; // Include the current character + } else { + // If no space found, push the currentPart as is + parts.push(currentPart + '\n'); + currentPart = script[i]; // Don't forget the current char we are on + } + counter = currentPart.length; + } else { + currentPart += script[i]; + counter++; + } + } + if (currentPart.length > 0) { + parts.push(currentPart); + } + return parts.join(''); +} + + +export function startBPXBATCHAndShellSession(jobName: string = JCL_JOBNAME_DEFAULT): string { + return `//${jobName} EXEC PGM=BPXBATCH,REGION=0M +//STDOUT DD SYSOUT=* +//STDPARM DD * +sh set -x;`; +} diff --git a/src/utils/StageDetails.ts b/src/services/StageDetails.ts similarity index 68% rename from src/utils/StageDetails.ts rename to src/services/StageDetails.ts index b8afb6b8..620bea19 100644 --- a/src/utils/StageDetails.ts +++ b/src/services/StageDetails.ts @@ -8,7 +8,7 @@ * Copyright Contributors to the Zowe Project. */ -import { getSubStageSkipStatus } from '../renderer/components/stages/progress/StageProgressStatus'; +import { getStageSkipStatus, getSubStageSkipStatus } from '../renderer/components/stages/progress/StageProgressStatus'; import { stages } from '../renderer/components/configuration-wizard/Wizard'; export const getStageDetails = (stageLabel: string) => { @@ -25,6 +25,26 @@ export const getSubStageDetails = (stageId: number, subStageLabel: string) => { } export const initStageSkipStatus = (): void => { + const skipStatus = getStageSkipStatus(); + + const stageSkipStatus = [ + skipStatus.planning, + skipStatus.installationType, + skipStatus.unpax, + skipStatus.initialization, + skipStatus.reviewInstallation + ]; + + let iterator = 0; + stages.map(stage => { + if(stage.id !== 0) { + stage.isSkipped = stageSkipStatus[iterator]; + } + iterator++; + }) +} + +export const initSubStageSkipStatus = (): void => { const skipStatus = getSubStageSkipStatus(); const subStageSkipStatus = [ @@ -32,7 +52,9 @@ export const initStageSkipStatus = (): void => { skipStatus.networking, skipStatus.apfAuth, skipStatus.security, + skipStatus.stcs, skipStatus.certificate, + skipStatus.cachingService, skipStatus.launchConfig ]; diff --git a/src/services/SubmitJcl.ts b/src/services/SubmitJcl.ts index ab44bd14..abd787f3 100644 --- a/src/services/SubmitJcl.ts +++ b/src/services/SubmitJcl.ts @@ -8,7 +8,7 @@ * Copyright Contributors to the Zowe Project. */ -import {connectFTPServer} from "./utils"; +import {connectFTPServer} from "./ServiceUtils"; import {IIpcConnectionArgs, IJobResults, JobOutput} from "../types/interfaces"; export function submitJcl(config: IIpcConnectionArgs, jcl: string, returnDDs: string[]): Promise { diff --git a/src/utils/eventDispatcher.js b/src/services/eventDispatcher.js similarity index 100% rename from src/utils/eventDispatcher.js rename to src/services/eventDispatcher.js diff --git a/src/services/utils.ts b/src/services/utils.ts deleted file mode 100644 index 28511bb1..00000000 --- a/src/services/utils.ts +++ /dev/null @@ -1,91 +0,0 @@ -/* - * This program and the accompanying materials are made available under the terms of the - * Eclipse Public License v2.0 which accompanies this distribution, and is available at - * https://www.eclipse.org/legal/epl-v20.html - * - * SPDX-License-Identifier: EPL-2.0 - * - * Copyright Contributors to the Zowe Project. - */ - -import {IIpcConnectionArgs} from "../types/interfaces"; -import Header from "../renderer/components/Header" -import { AlertColor } from "@mui/material/Alert"; -import zos from 'zos-node-accessor'; - -export const JCL_UNIX_SCRIPT_CHARS = 70; - -export const JCL_JOBNAME_DEFAULT = "ZENJOB"; - -export async function connectFTPServer(config: IIpcConnectionArgs): Promise { - - const client = new zos(); - //Config Doc: https://github.com/IBM/zos-node-accessor/blob/3e32cc8b8cbd74c6bc3c29c268338e23f173bebc/README.md?plain=1#L89 - await client.connect(config); - if (!client.connected) { - console.error('Failed to connect to', config.host); - } - return client; -} - -export async function checkDirExists(config: IIpcConnectionArgs, dir: string): Promise { - const client = await connectFTPServer(config); - try { - const list = await client.listDataset(dir); - return !!list; - } catch (error) { - return false; - } finally { - client.close(); - } -} - -export async function makeDir(config: IIpcConnectionArgs, dir: string): Promise { - const client = await connectFTPServer(config); - try { - await client.makeDirectory(dir); - return true; - } catch (error) { - return false; - } finally { - client.close(); - } -} - -// This adds a "\n" inside Unix commands separated by ";" if char limit reached -export function parseUnixScriptByNumOfChars(script: string, charCount: number = JCL_UNIX_SCRIPT_CHARS): string { - const parts: string[] = []; - let currentPart = ''; - let counter = 0; - - for (let i = 0; i < script.length; i++) { - if (counter >= charCount) { - const lastSpaceIndex = currentPart.lastIndexOf(' '); - - if (lastSpaceIndex !== -1) { - // If there's a space within the character limit, backtrack to the last encountered space - const backtrackedPart = currentPart.substring(0, lastSpaceIndex); - parts.push(backtrackedPart); - currentPart = currentPart.substring(lastSpaceIndex + 1); - } - if (currentPart.length > 0) { - // Add the current part and reset the counter - parts.push('\n'); - counter = 0; - } - } - currentPart += script[i]; - counter++; - } - if (currentPart.length > 0) { - parts.push(currentPart); - } - return parts.join(''); -} - -export function startBPXBATCHAndShellSession(jobName: string = JCL_JOBNAME_DEFAULT): string { - return `//${jobName} EXEC PGM=BPXBATCH,REGION=0M -//STDOUT DD SYSOUT=* -//STDPARM DD * -sh set -x;`; -} diff --git a/src/storage/ConfigurationStore.ts b/src/storage/ConfigurationStore.ts index 7aea1328..6e7eec3d 100644 --- a/src/storage/ConfigurationStore.ts +++ b/src/storage/ConfigurationStore.ts @@ -9,59 +9,42 @@ */ import Store from 'electron-store'; +import { DefaultStore } from './DefaultStore'; -const store = new Store({cwd: 'zen-configuration-store'}); +const STORE_NAME = 'zen-configuration-store'; +const KEY_SCHEMA = 'schema' +const KEY_CONFIG = 'config' +const STORE_DEFAULT = {config: {}, schema: {}}; -export class ConfigurationStore { - static schema: any = {}; +export class ConfigurationStore extends DefaultStore { - private static validateWithSchema(key: string): boolean { - const keys = key.split('.'); - const schema = store.get('schema') as any; - if(schema && schema.properties){ - let schemaPart: any = schema?.properties || undefined; - for (const key of keys) { - if (schemaPart != undefined && !Object.prototype.hasOwnProperty.call(schemaPart, key)) { - return false; - } - if(schemaPart[key].properties){ - schemaPart = schemaPart[key]?.properties || undefined; - } else { - return true; - } - } - return true; - } - return true; + protected static getStore(): Store { + return new Store({cwd: STORE_NAME}); } - public static setSchema(schema: any) { - store.set('schema', schema); + public static setSchema(value: any): boolean { + return this.set(KEY_SCHEMA, value); } public static getSchema(): any { - return store.get('schema'); + return this.get(KEY_SCHEMA); } public static setConfig(value: any) { - store.set('config', value); + return this.set(KEY_CONFIG, value); } - public static getConfig() { - return store.get(`config`); + public static getConfig(): any { + return this.get(KEY_CONFIG); } public static getConfigByKey(key: string): any { - return store.get(`config.${key}`); - } - - public static getAll(): any { - return store.store; + return this.get(`${KEY_CONFIG}.${key}`); } - public static setConfigByKey(key: string, value: string | Array): boolean { - if (this.validateWithSchema(key)) { - store.set(`config.${key}`, value); + public static setConfigByKeyAndValidate(key: string, value: string | Array, schema?: any): boolean { + if (this.validateWithSchema(key, KEY_SCHEMA)) { + this.getStore().set(`config.${key}`, value); return true; } console.warn(`failed validate against schema config.${key}`); @@ -69,15 +52,15 @@ export class ConfigurationStore { } public static setConfigByKeyNoValidate(key: string, value: string | Array): boolean { - store.set(`config.${key}`, value); + this.getStore().set(`config.${key}`, value); return true; } public static deleteConfigByKey(key: any): void { - store.delete(`config.${key}`); + this.delete(`${KEY_CONFIG}.${key}`); } public static deleteAll(): void { - store.store = {config: {}, schema: {}}; + this.getStore().store = STORE_DEFAULT; } -} +} \ No newline at end of file diff --git a/src/storage/ConnectionStore.ts b/src/storage/ConnectionStore.ts index dce5995d..d34ff367 100644 --- a/src/storage/ConnectionStore.ts +++ b/src/storage/ConnectionStore.ts @@ -9,8 +9,11 @@ */ import Store from 'electron-store'; +import { DefaultStore } from './DefaultStore'; +import { DEF_JOB_STATEMENT } from '../renderer/components/common/Utils'; -const storeSchema = { +const STORE_NAME = 'zen-connection-store'; +const STORE_SCHEMA = { "connection-type": { "type": "string" }, @@ -66,7 +69,7 @@ const storeSchema = { } } as const; -const storeDefault = { +export const STORE_DEFAULT = { "connection-type": "ftp", "zowe-cli-version": "", "ftp-details": { @@ -80,52 +83,28 @@ const storeDefault = { "maxVersion": "TLSv1.3", "minVersion": "TLSv1.2" }, - "jobStatement": `//ZWEJOB01 JOB IZUACCT,'SYSPROG',CLASS=A, -// MSGLEVEL=(1,1),MSGCLASS=A` + "jobStatement": DEF_JOB_STATEMENT }, "cli-details": { "profile": "" } }; -const validateWithSchema = (key: string): boolean => { - const keys = key.split('.'); - let schemaPart: any = storeSchema; - for (const key of keys) { - if (!Object.prototype.hasOwnProperty.call(schemaPart, key)) { - return false; - } - schemaPart = schemaPart[key].properties; - } - return true; -} - -const store = new Store({cwd: 'zen-connection-store', schema: storeSchema}); -store.set({...storeDefault, ...store.store}); +const store = new Store({cwd: STORE_NAME, schema: STORE_SCHEMA}); +store.set({...STORE_DEFAULT, ...store.store}); -export class ConnectionStore { +export class ConnectionStore extends DefaultStore { - public static get(key: string): any { - return store.get(key); + protected static getStore(): Store { + return new Store({cwd: STORE_NAME}); } - public static getAll(): any { - return store.store; - } - - public static set(key: string, value: any): boolean { - if (validateWithSchema(key)) { - store.set(key, value); - return true; - } - return false; - } - - public static delete(key: any): void { - store.delete(key); + public static setAndValidate(key: string, value: any, schema?: any): boolean { + return super.setAndValidate(key, value, schema || STORE_SCHEMA); } public static deleteAll(): void { - store.store = storeDefault; + this.getStore().store = STORE_DEFAULT; } -} + +} \ No newline at end of file diff --git a/src/storage/DefaultStore.ts b/src/storage/DefaultStore.ts new file mode 100644 index 00000000..3764c8b5 --- /dev/null +++ b/src/storage/DefaultStore.ts @@ -0,0 +1,82 @@ +/* + * This program and the accompanying materials are made available under the terms of the + * Eclipse Public License v2.0 which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-v20.html + * + * SPDX-License-Identifier: EPL-2.0 + * + * Copyright Contributors to the Zowe Project. + */ + +import Store from 'electron-store'; + +const STORE_NAME = 'zen-default-store'; + +// This default class is for other Stores to inherit (this is not a Store for "defaults") +export class DefaultStore { + + /* Note: All Stores that inherit DefaultStore must: + a) override this method with store name + b) use only this method to reference store object */ + protected static getStore(): Store { + return new Store({cwd: STORE_NAME}); + } + + public static validateWithSchema(key: string, schemaKey: any): boolean { + const keys = key.split('.'); + const schema = this.getStore().get(schemaKey) as any; + if(schema && schema.properties){ + let schemaPart: any = schema?.properties || undefined; + for (const key of keys) { + if (schemaPart != undefined && !Object.prototype.hasOwnProperty.call(schemaPart, key)) { + return false; + } + if(schemaPart[key].properties){ + schemaPart = schemaPart[key]?.properties || undefined; + } else { + return true; + } + } + return true; + } + return true; + } + + public static get(key: string): any { + return this.getStore().get(key); + } + + public static getAll(): any { + return this.getStore().store; + } + + public static set(key: string, value: any): boolean { + try { + if (value === undefined || typeof value === 'function' || typeof value === 'symbol') { + console.warn(`Attempted to overwrite ${key} with undefined, function, or symbol. Value: ${value}`); + } else { + this.getStore().set(key, value); + } + return true; + } catch (err) { + console.warn(`Failed to add ${key} Error: `, err); + return false; + } + } + + public static setAndValidate(key: string, value: any, schema: any): boolean { + if (this.validateWithSchema(key, schema)) { + return this.set(key, value); + } + console.warn(`Failed to validate against schema config.${key}`); + return false; + } + + public static delete(key: any): void { + this.getStore().delete(key); + } + + public static deleteAll(): void { + this.getStore().clear(); + } +} \ No newline at end of file diff --git a/src/storage/EditorStore.ts b/src/storage/EditorStore.ts new file mode 100644 index 00000000..681f333b --- /dev/null +++ b/src/storage/EditorStore.ts @@ -0,0 +1,55 @@ +/* + * This program and the accompanying materials are made available under the terms of the + * Eclipse Public License v2.0 which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-v20.html + * + * SPDX-License-Identifier: EPL-2.0 + * + * Copyright Contributors to the Zowe Project. + */ + +import Store from 'electron-store'; +import { DefaultStore } from './DefaultStore'; +import { TYPE_JCL, TYPE_OUTPUT, TYPE_YAML } from '../renderer/components/common/Utils'; + +const STORE_DEFAULT = { + [TYPE_OUTPUT]: "", + [TYPE_JCL]: "", + [TYPE_YAML]: "" +}; +const STORE_NAME = 'zen-editor-store'; + +export class EditorStore extends DefaultStore { + + protected static getStore(): Store { + return new Store({cwd: STORE_NAME}); + } + + public static deleteAll(): void { + this.getStore().store = STORE_DEFAULT; + } + + public static getJCLOutput(): any { + return this.get(TYPE_JCL); + } + + public static setJCLOutput(output: string): boolean { + return this.set(TYPE_JCL, output); + } + + public static getStandardOutput(): any { + return this.get(TYPE_OUTPUT); + } + + public static setStandardOutput(output: string): boolean { + return this.set(TYPE_OUTPUT, output); + } + + public static getYAMLOutput(): any { + return this.get(TYPE_YAML); + } + + public static setYAMLOutput(output: string): boolean { + return this.set(TYPE_YAML, output); + } +} \ No newline at end of file diff --git a/src/storage/ProgressStore.ts b/src/storage/ProgressStore.ts index d73a8278..5e0255a6 100644 --- a/src/storage/ProgressStore.ts +++ b/src/storage/ProgressStore.ts @@ -9,15 +9,21 @@ */ import Store from 'electron-store'; +import { DefaultStore } from './DefaultStore'; // TODO: Store overall progress and restore up to last successful step -const storeDefault = { - "installation": { +const STORE_DEFAULT = { + "downloadUnpax": { "uploadYaml": false, "download": false, "upload": false, "unpax": false, + "getExampleYaml": false, + "getSchemas": false, + }, + "installation": { + "uploadYaml": false, "install": false, "initMVS": false }, @@ -31,27 +37,28 @@ const storeDefault = { "uploadYaml": false, "success": false }, + "initStcs": { + "writeYaml": false, + "uploadYaml": false, + "success": false + }, "certificate": { "writeYaml": false, "uploadYaml": false, "zweInitCertificate": false, } }; +const STORE_NAME = 'zen-progress-store'; +const store = new Store({cwd: STORE_NAME}); +store.set(STORE_DEFAULT); -const store = new Store({cwd: 'zen-progress-store'}); -store.set(storeDefault); - -export class ProgressStore { - - public static getAll(): any { - return store.store; - } +export class ProgressStore extends DefaultStore { - public static set(key: string, value: string | boolean) { - store.set(key, value); + protected static getStore(): Store { + return new Store({cwd: STORE_NAME}); } public static deleteAll(): void { - store.store = storeDefault; + this.getStore().store = STORE_DEFAULT; } -} +} \ No newline at end of file diff --git a/src/types/stateInterfaces.ts b/src/types/stateInterfaces.ts index 87b0cc36..50307213 100644 --- a/src/types/stateInterfaces.ts +++ b/src/types/stateInterfaces.ts @@ -12,13 +12,15 @@ export interface ProgressState { connectionStatus: boolean; planningStatus: boolean; installationTypeStatus: boolean; + downloadUnpaxStatus: boolean; initializationStatus: boolean; datasetInstallationStatus: boolean; networkingStatus: boolean; apfAuthStatus: boolean; securityStatus: boolean; + stcsStatus: boolean; certificateStatus: boolean; - vsamStatus: boolean; + cachingServiceStatus: boolean; launchConfigStatus: boolean; reviewStatus: boolean; } @@ -35,6 +37,15 @@ export interface InstallationType { userUploadedPaxPath: string; } +export interface DownloadUnpaxState { + uploadYaml: boolean; + download: boolean, + upload: boolean, + unpax: boolean, + getExampleYaml: boolean, + getSchemas: boolean +} + export interface ActiveState { activeStepIndex: number, isSubStep: boolean, @@ -46,9 +57,6 @@ export interface ActiveState { export interface DatasetInstallationState { uploadYaml: boolean, - download: boolean, - upload: boolean, - unpax: boolean, install: boolean, initMVS: boolean } @@ -72,13 +80,22 @@ export interface PlanningValidationDetails { error: string } -export interface SkipState { +export interface stepSkipState { + planning: boolean, + installationType: boolean, + unpax: boolean, + initialization: boolean, + reviewInstallation: boolean +} + +export interface subStepState { datasetInstallation: boolean, networking: boolean, apfAuth: boolean, security: boolean, + stcs: boolean, certificate: boolean, - vsam: boolean, + cachingService: boolean, launchConfig: boolean } @@ -99,8 +116,9 @@ export interface InstallationArgs { cookieId: string; zosmfHost: string, zosmfPort: string, - zosmfApplId: string -}; + zosmfApplId: string, + dryRunMode: boolean, +} diff --git a/src/utils/yamlSchemaDefaults.ts b/src/utils/yamlSchemaDefaults.ts deleted file mode 100644 index 64e2e523..00000000 --- a/src/utils/yamlSchemaDefaults.ts +++ /dev/null @@ -1,1193 +0,0 @@ -export const FALLBACK_SCHEMA = { - "$schema": "https://json-schema.org/draft/2019-09/schema", - "$id": "https://zowe.org/schemas/v2/server-base", - "title": "Zowe configuration file", - "description": "Configuration file for Zowe (zowe.org) version 2.", - "type": "object", - "additionalProperties": true, - "properties": { - "zowe": { - "type": "object", - "additionalProperties": false, - "properties": { - "setup": { - "type": "object", - "additionalProperties": false, - "description": "Zowe setup configurations used by \"zwe install\" and \"zwe init\" commands.", - "properties": { - "dataset": { - "type": "object", - "additionalProperties": false, - "description": "MVS data set related configurations", - "properties": { - "prefix": { - "type": "string", - "description": "Where Zowe MVS data sets will be installed" - }, - "proclib": { - "type": "string", - "description": "PROCLIB where Zowe STCs will be copied over" - }, - "parmlib": { - "type": "string", - "description": "Zowe PARMLIB" - }, - "parmlibMembers": { - "type": "object", - "additionalProperties": false, - "description": "Holds Zowe PARMLIB members for plugins", - "properties": { - "zis": { - "description": "PARMLIB member used by ZIS", - "type": "string", - "pattern": "^([A-Z$#@]){1}([A-Z0-9$#@]){0,7}$", - "minLength": 1, - "maxLength": 8 - } - } - }, - "jcllib": { - "type": "string", - "description": "JCL library where Zowe will store temporary JCLs during initialization" - }, - "loadlib": { - "type": "string", - "description": "States the dataset where Zowe executable utilities are located", - "default": ".SZWELOAD" - }, - "authLoadlib": { - "type": "string", - "description": "The dataset that contains any Zowe core code that needs to run APF-authorized, such as ZIS", - "default": ".SZWEAUTH" - }, - "authPluginLib": { - "type": "string", - "description": "APF authorized LOADLIB for Zowe ZIS Plugins" - } - } - }, - "zis": { - "type": "object", - "additionalProperties": false, - "description": "ZIS related configurations. This setup is optional.", - "properties": { - "parmlib": { - "type": "object", - "additionalProperties": false, - "description": "ZIS related PARMLIB configurations. This setup is optional.", - "properties": { - "keys": { - "type": "object", - "additionalProperties": true, - "description": "Used to specify special ZIS key types with key-value pairs", - "examples": [ - "key.sample.1: list", - "key.sample.2: list" - ] - } - } - } - } - }, - "security": { - "type": "object", - "additionalProperties": false, - "description": "Security related configurations. This setup is optional.", - "properties": { - "product": { - "type": "string", - "description": "Security product name. Can be RACF, ACF2 or TSS", - "enum": ["RACF", "ACF2", "TSS"], - "default": "RACF" - }, - "groups": { - "type": "object", - "additionalProperties": false, - "description": "security group name", - "properties": { - "admin": { - "type": "string", - "description": "Zowe admin user group", - "default": "ZWEADMIN" - }, - "stc": { - "type": "string", - "description": "Zowe STC group", - "default": "ZWEADMIN" - }, - "sysProg": { - "type": "string", - "description": "Zowe SysProg group", - "default": "ZWEADMIN" - } - } - }, - "users": { - "type": "object", - "additionalProperties": false, - "description": "security user name", - "properties": { - "zowe": { - "type": "string", - "description": "Zowe runtime user name of main service", - "default": "ZWESVUSR" - }, - "zis": { - "type": "string", - "description": "Zowe runtime user name of ZIS", - "default": "ZWESIUSR" - } - } - }, - "stcs": { - "type": "object", - "additionalProperties": false, - "description": "STC names", - "properties": { - "zowe": { - "type": "string", - "description": "STC name of main service", - "default": "ZWESLSTC" - }, - "zis": { - "type": "string", - "description": "STC name of ZIS", - "default": "ZWESISTC" - }, - "aux": { - "type": "string", - "description": "STC name of Auxiliary Service", - "default": "ZWESASTC" - } - } - } - } - }, - "certificate": { - "type": "object", - "additionalProperties": false, - "if": { - "properties": { - "type": { - "const": "PKCS12" - } - } - }, - "then": { - "required": ["pkcs12"] - }, - "else": { - "required": ["keyring"] - }, - "description": "Certificate related configurations", - "properties": { - "type": { - "type": "string", - "description": "Type of certificate storage method.", - "enum": ["PKCS12", "JCEKS", "JCECCAKS", "JCERACFKS", "JCECCARACFKS", "JCEHYBRIDRACFKS"], - "default": "PKCS12" - }, - "pkcs12": { - "type": "object", - "additionalProperties": false, - "description": "PKCS#12 keystore settings", - "properties": { - "directory": { - "description": "Keystore directory", - "type": "string", - "pattern": "^([^\\0]){1,1024}$", - "minLength": 1, - "maxLength": 1024 - }, - "name": { - "type": "string", - "description": "Certificate alias name. Note: please use all lower cases as alias.", - "default": "localhost" - }, - "password": { - "type": "string", - "description": "Keystore password", - "default": "password" - }, - "caAlias": { - "type": "string", - "description": "Alias name of self-signed certificate authority. Note: please use all lower cases as alias.", - "default": "local_ca" - }, - "caPassword": { - "type": "string", - "description": "Password of keystore stored self-signed certificate authority.", - "default": "local_ca_password" - }, - "lock": { - "type": "boolean", - "description": "Whether to restrict the permissions of the keystore after creation" - }, - "import": { - "type": "object", - "additionalProperties": false, - "description": "Configure this section if you want to import certificate from another PKCS#12 keystore.", - "properties": { - "keystore": { - "type": "string", - "description": "Existing PKCS#12 keystore which holds the certificate issued by external CA." - }, - "password": { - "type": "string", - "description": "Password of the above keystore" - }, - "alias": { - "type": "string", - "description": "Certificate alias will be imported. Note: please use all lower cases as alias." - } - } - } - } - }, - "keyring": { - "type": "object", - "additionalProperties": false, - "description": "Configure this section if you are using z/OS keyring", - "properties": { - "owner": { - "type": "string", - "description": "keyring owner. If this is empty, Zowe will use the user ID defined as zowe.setup.security.users.zowe." - }, - "name": { - "type": "string", - "description": "keyring name" - }, - "label": { - "type": "string", - "description": "Label of Zowe certificate.", - "default": "localhost" - }, - "caLabel": { - "type": "string", - "description": "label of Zowe CA certificate.", - "default": "localca" - }, - "connect": { - "type": "object", - "additionalProperties": false, - "description": "Configure this section if you want to connect existing certificate in keyring to Zowe.", - "properties": { - "user": { - "type": "string", - "description": "Current owner of the existing certificate, can be SITE or an user ID." - }, - "label": { - "type": "string", - "description": "Label of the existing certificate will be connected to Zowe keyring." - } - } - }, - "import": { - "type": "object", - "additionalProperties": false, - "description": "Configure this section if you want to import existing certificate stored in data set to Zowe.", - "properties": { - "dsName": { - "type": "string", - "description": "Name of the data set holds the certificate issued by other CA. This data set should be in PKCS12 format and contain private key." - }, - "password": { - "type": "string", - "description": "Password for the PKCS12 data set." - } - } - }, - "zOSMF": { - "type": "object", - "additionalProperties": false, - "description": "Configure this section if you want to trust z/OSMF certificate authority in Zowe keyring.", - "properties": { - "ca": { - "type": "string", - "description": "z/OSMF certificate authority alias" - }, - "user": { - "type": "string", - "description": "z/OSMF user. Zowe initialization utility can detect alias of z/OSMF CA for RACF security system. The automated detection requires this z/OSMF user as input." - } - } - } - } - }, - "dname": { - "type": "object", - "additionalProperties": false, - "description": "Certificate distinguish name", - "properties": { - "caCommonName": { - "type": "string", - "description": "Common name of certificate authority generated by Zowe." - }, - "commonName": { - "type": "string", - "description": "Common name of certificate generated by Zowe." - }, - "orgUnit": { - "type": "string", - "description": "Organization unit of certificate generated by Zowe." - }, - "org": { - "type": "string", - "description": "Organization of certificate generated by Zowe." - }, - "locality": { - "type": "string", - "description": "Locality of certificate generated by Zowe. This is usually the city name." - }, - "state": { - "type": "string", - "description": "State of certificate generated by Zowe. You can also put province name here." - }, - "country": { - "type": "string", - "description": "2 letters country code of certificate generated by Zowe." - } - } - }, - "validity": { - "type": "integer", - "description": "Validity days for Zowe generated certificates", - "default": 3650 - }, - "san": { - "type": "array", - "description": "Domain names and IPs should be added into certificate SAN. If this field is not defined, `zwe init` command will use `zowe.externalDomains`.", - "items": { - "type": "string" - } - }, - "importCertificateAuthorities": { - "type": "array", - "description": "PEM format certificate authorities will also be imported and trusted. If you have other certificate authorities want to be trusted in Zowe keyring, list the certificate labels here. **NOTE**, due to the limitation of RACDCERT command, this field should contain maximum 2 entries.", - "items": { - "type": "string" - } - } - } - }, - "vsam": { - "type": "object", - "additionalProperties": false, - "description": "VSAM configurations if you are using VSAM as Caching Service storage", - "properties": { - "mode": { - "type": "string", - "description": "VSAM data set with Record-Level-Sharing enabled or not", - "enum": ["NONRLS", "RLS"], - "default": "NONRLS" - }, - "volume": { - "type": "string", - "description": "Volume name if you are using VSAM in NONRLS mode" - }, - "storageClass": { - "type": "string", - "description": "Storage class name if you are using VSAM in RLS mode" - } - } - } - } - }, - "runtimeDirectory": { - "$ref": "#/$defs/zowePath", - "description": "Path to where you installed Zowe." - }, - "logDirectory": { - "$ref": "#/$defs/zowePath", - "description": "Path to where you want to store Zowe log files." - }, - "workspaceDirectory": { - "$ref": "#/$defs/zowePath", - "description": "Path to where you want to store Zowe workspace files. Zowe workspace are used by Zowe component runtime to store temporary files." - }, - "extensionDirectory": { - "$ref": "#/$defs/zowePath", - "description": "Path to where you want to store Zowe extensions. \"zwe components install\" will install new extensions into this directory." - }, - "job": { - "type": "object", - "additionalProperties": false, - "description": "Customize your Zowe z/OS JES job.", - "properties": { - "name": { - "type": "string", - "description": "Job name of Zowe primary ZWESLSTC started task." - }, - "prefix": { - "type": "string", - "description": "A short prefix to customize address spaces created by Zowe job." - } - } - }, - "network": { - "$ref": "#/$defs/networkSettings" - }, - "extensionRegistry": { - "type": "object", - "description": "Defines optional configuration for downloading extensions from an online or offline registry", - "required": ["defaultHandler", "handlers"], - "properties": { - "defaultHandler": { - "type": "string", - "description": "The name of a handler specified in the handlers section. Will be used as the default for 'zwe components' commands" - }, - "handlers": { - "type": "object", - "patternProperties": { - "^.*$": { - "$ref": "#/$defs/registryHandler" - } - } - } - } - }, - "launcher": { - "type": "object", - "description": "Set default behaviors of how the Zowe launcher will handle components", - "additionalProperties": false, - "properties": { - "restartIntervals": { - "type": "array", - "description": "Intervals of seconds to wait before restarting a component if it fails before the minUptime value.", - "items": { - "type": "integer" - } - }, - "minUptime": { - "type": "integer", - "default": 90, - "description": "The minimum amount of seconds before a component is considered running and the restart counter is reset." - }, - "shareAs": { - "type": "string", - "description": "Determines which SHAREAS mode should be used when starting a component", - "enum": ["no", "yes", "must", ""], - "default": "yes" - }, - "unsafeDisableZosVersionCheck": { - "type": "boolean", - "description": "Used to allow Zowe to warn, instead of error, when running on a version of z/OS that this version of Zowe hasn't been verified as working with", - "default": false - } - } - }, - "rbacProfileIdentifier": { - "type": "string", - "description": "An ID used for determining resource names used in RBAC authorization checks" - }, - "cookieIdentifier": { - "type": "string", - "description": "An ID that can be used by servers that distinguish their cookies from unrelated Zowe installs" - }, - "externalDomains": { - "type": "array", - "description": "List of domain names of how you access Zowe from your local computer.", - "minItems": 1, - "uniqueItems": true, - "items": { - "type": ["string"] - } - }, - "externalPort": { - "$ref": "#/$defs/port", - "description": "Port number of how you access Zowe APIML Gateway from your local computer." - }, - "environments": { - "type": "object", - "description": "Global environment variables can be applied to all Zowe high availability instances." - }, - "launchScript": { - "type": "object", - "description": "Customize Zowe launch scripts (zwe commands) behavior.", - "properties": { - "logLevel": { - "type": "string", - "description": "Log level for Zowe launch scripts.", - "enum": ["", "info", "debug", "trace"] - }, - "onComponentConfigureFail": { - "type": "string", - "description": "Chooses how 'zwe start' behaves if a component configure script fails", - "enum": ["warn", "exit"], - "default": "warn" - } - } - }, - "certificate": { - "$ref": "#/$defs/certificate", - "description": "Zowe certificate setup." - }, - "verifyCertificates": { - "type": "string", - "description": "Customize how Zowe should validate certificates used by components or other services.", - "enum": ["STRICT", "NONSTRICT", "DISABLED"] - }, - "sysMessages": { - "type": "array", - "description": "List of Zowe message portions when matched will be additionally logged into the system's log (such as syslog on z/OS). Note: Some messages extremely early in the Zowe lifecycle may not be added to the system's log", - "uniqueItems": true, - "items": { - "type": "string" - } - }, - "useConfigmgr": { - "type": "boolean", - "default": false, - "description": "Determines whether or not to use the features of configmgr such as multi-config, parmlib config, config templates, and schema validation. This effects the zwe command." - }, - "configmgr": { - "type": "object", - "description": "Controls how configmgr will be used by zwe", - "required": ["validation"], - "properties": { - "validation": { - "type": "string", - "enum": ["STRICT", "COMPONENT-COMPAT"], - "description": "States how configmgr will do validation: Will it quit on any error (STRICT) or quit on any error except the case of a component not having a schema file (COMPONENT-COMPAT)" - } - } - } - } - }, - "java": { - "type": "object", - "properties": { - "home": { - "$ref": "#/$defs/zowePath", - "description": "Path to Java home directory." - } - } - }, - "node": { - "type": "object", - "properties": { - "home": { - "$ref": "#/$defs/zowePath", - "description": "Path to node.js home directory." - } - } - }, - "zOSMF": { - "type": "object", - "additionalProperties": false, - "properties": { - "host": { - "type": "string", - "description": "Host or domain name of your z/OSMF instance." - }, - "port": { - "$ref": "#/$defs/port", - "description": "Port number of your z/OSMF instance." - }, - "scheme": { - "$ref" : "#/$defs/scheme", - "description": "Scheme used to connect to z/OSMF instance. Optional for outbout AT-TLS, defaults to https" - }, - "applId": { - "type": "string", - "description": "Appl ID of your z/OSMF instance." - } - } - }, - "components": { - "type": "object", - "patternProperties": { - "^.*$": { - "$ref": "#/$defs/component" - } - } - }, - "haInstances": { - "type": "object", - "patternProperties": { - "^.*$": { - "type": "object", - "description": "Configuration of Zowe high availability instance.", - "required": ["hostname", "sysname"], - "properties": { - "hostname": { - "type": "string", - "description": "Host name of the Zowe high availability instance. This is hostname for internal communications." - }, - "sysname": { - "type": "string", - "description": "z/OS system name of the Zowe high availability instance. Some JES command will be routed to this system name." - }, - "components": { - "type": "object", - "patternProperties": { - "^.*$": { - "$ref": "#/$defs/component" - } - } - } - } - } - } - } - }, - "$defs": { - "port": { - "type": "integer", - "minimum": 0, - "maximum": 65535 - }, - "scheme": { - "type": "string", - "enum": [ - "http", - "https" - ], - "default": "https" - }, - "certificate": { - "oneOf": [ - { "$ref": "#/$defs/pkcs12-certificate" }, - { "$ref": "#/$defs/keyring-certificate" } - ] - }, - "pkcs12-certificate": { - "type": "object", - "additionalProperties": false, - "required": ["keystore", "truststore", "pem"], - "properties": { - "keystore": { - "type": "object", - "additionalProperties": false, - "description": "Certificate keystore.", - "required": ["type", "file", "alias"], - "properties": { - "type": { - "type": "string", - "description": "Keystore type.", - "const": "PKCS12" - }, - "file": { - "$ref": "#/$defs/zowePath", - "description": "Path to your PKCS#12 keystore." - }, - "password": { - "type": "string", - "description": "Password of your PKCS#12 keystore." - }, - "alias": { - "type": "string", - "description": "Certificate alias name of defined in your PKCS#12 keystore" - } - } - }, - "truststore": { - "type": "object", - "additionalProperties": false, - "description": "Certificate truststore.", - "required": ["type", "file"], - "properties": { - "type": { - "type": "string", - "description": "Truststore type.", - "const": "PKCS12" - }, - "file": { - "$ref": "#/$defs/zowePath", - "description": "Path to your PKCS#12 keystore." - }, - "password": { - "type": "string", - "description": "Password of your PKCS#12 keystore." - } - } - }, - "pem": { - "type": "object", - "additionalProperties": false, - "description": "Certificate in PEM format.", - "required": ["key", "certificate"], - "properties": { - "key": { - "$ref": "#/$defs/zowePath", - "description": "Path to the certificate private key stored in PEM format." - }, - "certificate": { - "$ref": "#/$defs/zowePath", - "description": "Path to the certificate stored in PEM format." - }, - "certificateAuthorities": { - "description": "List of paths to the certificate authorities stored in PEM format.", - "oneOf": [{ - "$ref": "#/$defs/zowePath", - "description": "Paths to the certificate authorities stored in PEM format. You can separate multiple certificate authorities by comma." - }, - { - "type": "array", - "description": "Path to the certificate authority stored in PEM format.", - "items": { - "$ref": "#/$defs/zowePath" - } - } - ] - } - } - } - } - }, - "keyring-certificate": { - "type": "object", - "additionalProperties": false, - "required": ["keystore", "truststore"], - "properties": { - "keystore": { - "type": "object", - "additionalProperties": false, - "description": "Certificate keystore.", - "required": ["type", "file", "alias"], - "properties": { - "type": { - "type": "string", - "description": "Keystore type.", - "enum": ["JCEKS", "JCECCAKS", "JCERACFKS", "JCECCARACFKS", "JCEHYBRIDRACFKS"] - }, - "file": { - "type": "string", - "description": "Path of your z/OS keyring, including ring owner and ring name. Case sensitivity and spaces matter.", - "pattern": "^safkeyring:\/\/.*" - }, - "password": { - "type": "string", - "description": "Literally 'password' may be needed when using keyrings for compatibility with java servers.", - "enum": ["", "password"] - }, - "alias": { - "type": "string", - "description": "Certificate label of z/OS keyring. Case sensitivity and spaces matter." - } - } - }, - "truststore": { - "type": "object", - "additionalProperties": false, - "description": "Certificate truststore.", - "required": ["type", "file"], - "properties": { - "type": { - "type": "string", - "description": "Truststore type.", - "enum": ["JCEKS", "JCECCAKS", "JCERACFKS", "JCECCARACFKS", "JCEHYBRIDRACFKS"] - }, - "file": { - "type": "string", - "description": "Path of your z/OS keyring, including ring owner and ring name. Case sensitivity and spaces matter.", - "pattern": "^safkeyring:\/\/.*" - }, - "password": { - "type": "string", - "description": "Literally 'password' may be needed when using keyrings for compatibility with java servers.", - "enum": ["", "password"] - } - } - }, - "pem": { - "type": "object", - "additionalProperties": false, - "description": "Certificate in PEM format.", - "properties": { - "key": { - "type": "string", - "description": "Path to the certificate private key stored in PEM format." - }, - "certificate": { - "type": "string", - "description": "Path to the certificate stored in PEM format." - }, - "certificateAuthorities": { - "description": "List of paths to the certificate authorities stored in PEM format.", - "oneOf": [{ - "type": "string", - "description": "Paths to the certificate authorities stored in PEM format. You can separate multiple certificate authorities by comma." - }, - { - "type": "array", - "description": "Path to the certificate authority stored in PEM format.", - "items": { - "type": "string" - } - } - ] - } - } - } - } - }, - "component": { - "$anchor": "zoweComponent", - "type": "object", - "properties": { - "enabled": { - "type": "boolean", - "description": "Whether to enable or disable this component", - "default": false - }, - "certificate": { - "$ref": "#/$defs/certificate", - "description": "Certificate for current component." - }, - "launcher": { - "type": "object", - "description": "Set behavior of how the Zowe launcher will handle this particular component", - "additionalProperties": true, - "properties": { - "restartIntervals": { - "type": "array", - "description": "Intervals of seconds to wait before restarting a component if it fails before the minUptime value.", - "items": { - "type": "integer" - } - }, - "minUptime": { - "type": "integer", - "default": 90, - "description": "The minimum amount of seconds before a component is considered running and the restart counter is reset." - }, - "shareAs": { - "type": "string", - "description": "Determines which SHAREAS mode should be used when starting a component", - "enum": ["no", "yes", "must", ""], - "default": "yes" - } - } - }, - "zowe": { - "type": "object", - "description": "Component level overrides for top level Zowe network configuration.", - "additionalProperties": true, - "properties": { - "network": { - "$ref": "#/$defs/networkSettings" - }, - "job": { - "$ref": "#/$defs/componentJobSettings" - } - } - } - } - }, - "componentJobSettings": { - "$anchor": "componentJobSettings", - "type": "object", - "description": "Component level overrides for job execution behavior", - "properties": { - "suffix": { - "type": "string", - "description": "Can be used by components to declare a jobname suffix to append to their job. This is not currently used by Zowe itself, it is up to components to use this value if desired. Zowe may use this value in the future." - } - } - }, - "tlsSettings": { - "$anchor": "tlsSettings", - "type": "object", - "properties": { - "ciphers": { - "type": "array", - "description": "Acceptable TLS cipher suites for network connections, in IANA format.", - "items": { - "type": "string" - } - }, - "curves": { - "type": "array", - "description": "Acceptable key exchange elliptic curves for network connections.", - "items": { - "type": "string" - } - }, - "maxTls": { - "type": "string", - "enum": ["TLSv1.2", "TLSv1.3"], - "default": "TLSv1.3", - "description": "Maximum TLS version allowed for network connections." - }, - "minTls": { - "type": "string", - "enum": ["TLSv1.2", "TLSv1.3"], - "default": "TLSv1.2", - "description": "Minimum TLS version allowed for network connections, and less than or equal to network.maxTls." - } - } - }, - "networkSettings": { - "type": "object", - "$anchor": "networkSettings", - "additionalProperties": false, - "description": "Optional, advanced network configuration parameters", - "properties": { - "server": { - "type": "object", - "additionalProperties": false, - "description": "Optional, advanced network configuration parameters for Zowe servers", - "properties": { - "tls": { - "$ref": "#/$defs/tlsSettings" - }, - "listenAddresses": { - "type": "array", - "description": "The IP addresses which all of the Zowe servers will be binding on and listening to. Some servers may only support listening on the first element.", - "items": { - "type": "string", - "pattern": "^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$" - } - }, - "vipaIp": { - "type": "string", - "description": "The IP address which all of the Zowe servers will be binding to. If you are using multiple DIPVA addresses, do not use this option." - }, - "validatePortFree": { - "type": "boolean", - "default": true, - "description": "Whether or not to ensure that the port a server is about to use is available. Usually, servers will know this when they attempt to bind to a port, so this option allows you to disable the additional verification step." - } - } - }, - "client": { - "type": "object", - "additionalProperties": false, - "description": "Optional, advanced network configuration parameters for Zowe servers when sending requests as clients.", - "properties": { - "tls": { - "$ref": "#/$defs/tlsSettings" - } - } - } - } - }, - "registryHandler": { - "$anchor": "registryHandler", - "type": "object", - "required": ["registry", "path"], - "properties": { - "registry": { - "type": "string", - "description": "The location of the default registry for this handler. It could be a URL, path, dataset, whatever this handler supports" - }, - "path": { - "$ref": "#/$defs/zowePath", - "description": "Unix file path to the configmgr-compatible JS file which implements the handler API" - } - } - }, - "zowePath": { - "$anchor": "zowePath", - "type": "string", - "pattern": "^([^\\0]){1,1024}$", - "minLength": 1, - "maxLength": 1024 - }, - } -} - -export const FALLBACK_YAML = { - "node": { - "home": "" - }, - "java": { - "home": "" - }, - "zOSMF": { - "host": "dvipa.my-company.com", - "port": 443, - "applId": "IZUDFLT" - }, - "zowe": { - "rbacProfileIdentifier": "1", - "logDirectory": "/global/zowe/logs", - "job": { - "prefix": "ZWE1", - "name": "ZWE1SV" - }, - "sysMessages": [ - "ZWEL0021I", - "ZWEL0018I", - "ZWEL0006I", - "ZWES1601I", - "ZWEL0008I", - "ZWEL0022I", - "ZWEL0001I", - "ZWEL0002I", - "ZWEAM000I", - "ZWED0031I", - "ZWES1013I" - ], - "launchScript": { - "logLevel": "info", - "onComponentConfigureFail": "warn" - }, - "extensionDirectory": "/global/zowe/extensions", - "certificate": { - "keystore": { - "alias": "localhost", - "password": "password", - "type": "PKCS12", - "file": "/global/zowe/keystore/localhost/localhost.keystore.p12" - }, - "pem": { - "key": "/global/zowe/keystore/localhost/localhost.key", - "certificate": "/global/zowe/keystore/localhost/localhost.cer", - "certificateAuthorities": "/global/zowe/keystore/local_ca/local_ca.cer" - }, - "truststore": { - "password": "password", - "type": "PKCS12", - "file": "/global/zowe/keystore/localhost/localhost.truststore.p12" - } - }, - "cookieIdentifier": "1", - "verifyCertificates": "STRICT", - "setup": { - "dataset": { - "authLoadlib": "IBMUSER.ZWEV2.SZWEAUTH", - "proclib": "USER.PROCLIB", - "authPluginLib": "IBMUSER.ZWEV2.CUST.ZWESAPL", - "prefix": "IBMUSER.ZWEV2", - "parmlib": "IBMUSER.ZWEV2.CUST.PARMLIB", - "loadlib": "IBMUSER.ZWEV2.SZWELOAD", - "parmlibMembers": { - "zis": "ZWESIP00" - }, - "jcllib": "IBMUSER.ZWEV2.CUST.JCLLIB" - }, - "certificate": { - "type": "PKCS12", - "pkcs12": { - "directory": "/var/zowe/keystore" - } - }, - "vsam": { - "volume": "", - "mode": "NONRLS", - "storageClass": "" - } - }, - "externalDomains": [ - "sample-domain.com" - ], - "externalPort": 7554, - "configmgr": { - "validation": "COMPONENT-COMPAT" - }, - "workspaceDirectory": "/global/zowe/workspace", - "runtimeDirectory": "", - "useConfigmgr": true - }, - "components": { - "metrics-service": { - "debug": false, - "enabled": false, - "port": 7551 - }, - "zss": { - "tls": true, - "enabled": true, - "crossMemoryServerName": "ZWESIS_STD", - "port": 7557, - "agent": { - "jwt": { - "fallback": true - } - } - }, - "explorer-uss": { - "enabled": true - }, - "jobs-api": { - "debug": false, - "enabled": false, - "port": 7558 - }, - "files-api": { - "debug": false, - "enabled": false, - "port": 7559 - }, - "explorer-mvs": { - "enabled": true - }, - "cloud-gateway": { - "debug": false, - "enabled": false, - "port": 7563 - }, - "explorer-jes": { - "enabled": true - }, - "api-catalog": { - "debug": false, - "enabled": true, - "port": 7552 - }, - "gateway": { - "debug": false, - "enabled": true, - "port": 7554, - "apiml": { - "security": { - "x509": { - "enabled": false - }, - "auth": { - "zosmf": { - "jwtAutoconfiguration": "auto", - "serviceId": "zosmf" - }, - "provider": "zosmf" - }, - "authorization": { - "endpoint": { - "enabled": false - }, - "provider": "" - } - } - }, - "server": { - "internal": { - "ssl": { - "enabled": false - }, - "enabled": false, - "port": 7550 - } - } - }, - "app-server": { - "debug": false, - "enabled": true, - "port": 7556 - }, - "caching-service": { - "debug": false, - "enabled": true, - "storage": { - "evictionStrategy": "reject", - "size": 10000, - "infinispan": { - "jgroups": { - "port": 7600 - } - }, - "mode": "VSAM", - "vsam": { - "name": "" - } - }, - "port": 7555 - }, - "discovery": { - "debug": false, - "enabled": true, - "port": 7553 - } - } -} \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json index 4064e523..e29e1b36 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,7 +1,7 @@ { "compilerOptions": { "jsx": "react-jsx", - "target": "ES6", + "target": "es2021", "allowJs": true, "module": "commonjs", "skipLibCheck": true,