diff --git a/.browserslistrc b/.browserslistrc deleted file mode 100644 index 4f9ac26980..0000000000 --- a/.browserslistrc +++ /dev/null @@ -1,16 +0,0 @@ -# This file is used by the build system to adjust CSS and JS output to support the specified browsers below. -# For additional information regarding the format and rule options, please see: -# https://github.com/browserslist/browserslist#queries - -# For the full list of supported browsers by the Angular framework, please see: -# https://angular.io/guide/browser-support - -# You can see what browsers were selected by your queries by running: -# npx browserslist - -last 1 Chrome version -last 1 Firefox version -last 2 Edge major versions -last 2 Safari major versions -last 2 iOS major versions -Firefox ESR diff --git a/.circleci/config.yml b/.circleci/config.yml index 73463e5f87..c0b0cf9a31 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -3,7 +3,7 @@ orbs: aws-s3: circleci/aws-s3@3.0.0 aws-cli: circleci/aws-cli@3.1.1 slack: circleci/slack@4.4.4 - browser-tools: circleci/browser-tools@1.4.7 + browser-tools: circleci/browser-tools@1.4.8 executors: integration_test_exec: # declares a reusable executor docker: @@ -13,7 +13,7 @@ executors: password: $DOCKERHUB_PASSWORD environment: JAVA_TOOL_OPTIONS: -Xmx2g # Java can read cgroup. Sadly the cgroup in CircleCI is wrong. Have to manually set. Using 1/2 memory as heap. - - image: cimg/postgres:13.3 + - image: cimg/postgres:<< pipeline.parameters.postgres-tag >> command: postgres -c max_connections=200 -c jit=off auth: username: dockstoretestuser @@ -80,6 +80,10 @@ jobs: password: $DOCKERHUB_PASSWORD steps: - setup_nightly_tests + - run: + name: Reset dockstoretestuser4's resources + # Reset user dockstoretestuser4's resources such that it has no registered tools and published workflows + command: bash scripts/reset-dockstoretestuser4-resources.sh << parameters.stack >> - run: name: Run remote verification test against << parameters.stack >> (with auth) command: bash -i -c 'npm run test-<< parameters.stack >>-auth' @@ -89,6 +93,8 @@ jobs: name: Reset dockstoretestuser4's resources # Reset user dockstoretestuser4's resources such that it has no registered tools and published workflows command: bash scripts/reset-dockstoretestuser4-resources.sh << parameters.stack >> + # Reset even if the tests failed + when: always - upload_nightly_artifacts - slack/notify: channel: $<< parameters.stack >>_id @@ -131,6 +137,13 @@ jobs: command: | bash -i -c 'npm run circle-ci-license-test-file' bash scripts/detect-package-json-changes.sh + # Override the use_snapshot in package.json to instead build against develop webservice + - when: + condition: << pipeline.parameters.sanity-check-against-develop >> + steps: + - run: + name: set use_snapshot to true (grab snapshot artifacts) + command: bash -i -c 'npm config set dockstore-ui2:use_snapshot true' - build_ui - run: name: Install codecov @@ -211,7 +224,7 @@ jobs: auth: username: dockstoretestuser password: $DOCKERHUB_PASSWORD - - image: cimg/python:3.11 + - image: cimg/python:<< pipeline.parameters.python-tag >> auth: username: dockstoretestuser password: $DOCKERHUB_PASSWORD @@ -256,17 +269,25 @@ jobs: auth: username: dockstoretestuser password: $DOCKERHUB_PASSWORD - - image: cimg/python:3.11 + - image: cimg/python:<< pipeline.parameters.python-tag >> auth: username: dockstoretestuser password: $DOCKERHUB_PASSWORD steps: - - get_workspace - # Override the webservice version in package.json to instead build against develop webservice - - run: - name: set webservice to develop - command: bash -i -c 'npm config set dockstore-ui2:webservice_version develop' - - build_ui + - run: # should not need this, but circle ci does not like it when a condition wipes out a whole job https://discuss.circleci.com/t/pipeline-parameters-in-steps-when-conditions-seems-to-have-no-value-using-dynamic-configuration/50524/2 + name: Java/Maven/Python versions + command: | + java -version + npm --version + - when: + condition: + not: << pipeline.parameters.sanity-check-against-develop >> + steps: + - get_workspace + - run: + name: set use_snapshot to true + command: bash -i -c 'npm config set dockstore-ui2:use_snapshot true' + - build_ui parameters: run_nightly_auth: @@ -278,6 +299,15 @@ parameters: java-tag: type: string default: "17.0.4-browsers" + postgres-tag: + type: string + default: "16.1" + python-tag: + type: string + default: "3.11" + sanity-check-against-develop: + type: boolean + default: false workflows: version: 2 diff --git a/.eslintrc.json b/.eslintrc.json index 1e4624e68a..dd3eb9c9f3 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -19,6 +19,9 @@ "plugin:@angular-eslint/recommended", "plugin:@angular-eslint/template/process-inline-templates" ], + "plugins": [ + "@typescript-eslint" + ], "rules": { "@angular-eslint/component-selector": [ "error", diff --git a/.github/snapshot-mvn-settings.xml b/.github/snapshot-mvn-settings.xml new file mode 100644 index 0000000000..dae0332e48 --- /dev/null +++ b/.github/snapshot-mvn-settings.xml @@ -0,0 +1,31 @@ + + + + + github-packages + DockstoreTestUser + ${env.GITHUB_TOKEN} + + + + + + github-packages + + + + + github-packages + + + github-packages + https://maven.pkg.github.com/dockstore/dockstore + + true + + + + + + + diff --git a/.github/workflows/accessibility_test.yml b/.github/workflows/accessibility_test.yml index 012295aff1..e2f7b0bc7c 100644 --- a/.github/workflows/accessibility_test.yml +++ b/.github/workflows/accessibility_test.yml @@ -12,11 +12,11 @@ jobs: # Uses if/else expression evaluation workaround from https://github.com/actions/runner/issues/409#issuecomment-752775072 # 'matrix.branch == github.base_ref' is the condition, 'base' is the true value and 'current' is the false value name: Accessibility test (${{ matrix.branch == github.base_ref && 'base' || 'current' }} branch) - + runs-on: ubuntu-20.04 services: postgres: - image: postgres:13.3 + image: postgres:16.1 env: POSTGRES_USER: postgres POSTGRES_DB: postgres @@ -56,7 +56,7 @@ jobs: - name: Cache dependencies id: cache-dependencies - uses: actions/cache@v3 + uses: actions/cache@v4 env: cache-version: version1 with: @@ -97,17 +97,17 @@ jobs: if [[ "${{ matrix.branch }}" == "$GITHUB_BASE_REF" ]]; then echo "Running accessibility test for base branch" npm run accessibility-test -- -RB - else + else echo "Running accessibility test for current branch" npm run accessibility-test -- -R fi - + - name: Save accessibility results - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: - name: accessibility-results + name: accessibility-results-${{ matrix.branch == github.base_ref && 'base' || 'current' }} path: accessibility-results/ - + compare_accessibility_results: needs: run-accessibility-test runs-on: ubuntu-20.04 @@ -120,12 +120,12 @@ jobs: node-version-file: '.nvmrc' - name: Download accessibility results - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 with: - name: accessibility-results # Download to this directory because this is the directory that the accessibility script looks at for the results - path: accessibility-results - + path: accessibility-results + pattern: accessibility-results-* + merge-multiple: true + - name: Compare accessibility results run: npm run accessibility-test -- -A - \ No newline at end of file diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 4a784118a8..ba752490f4 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -40,7 +40,7 @@ jobs: # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@v2 + uses: github/codeql-action/init@v3 with: languages: ${{ matrix.language }} # If you wish to specify custom queries, you can do so here or in a config file. @@ -54,7 +54,7 @@ jobs: # Autobuild attempts to build any compiled languages (C/C++, C#, Go, or Java). # If this step fails, then you should remove it and run the build manually (see below) - name: Autobuild - uses: github/codeql-action/autobuild@v2 + uses: github/codeql-action/autobuild@v3 # ℹī¸ Command-line programs to run using the OS shell. # 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun @@ -67,6 +67,6 @@ jobs: # ./location_of_script_within_repo/buildscript.sh - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v2 + uses: github/codeql-action/analyze@v3 with: category: "/language:${{matrix.language}}" diff --git a/README.md b/README.md index 994c3498f8..bed4f6c06e 100644 --- a/README.md +++ b/README.md @@ -139,7 +139,33 @@ Run `ng g component component-name` to generate a new component. You can also us ## Build +When building against artifactory, the build should use the latest SNAPSHOT. In this scenario, the package.json will look like +``` + "config": { + "webservice_version_prefix": "1.16.0", + "webservice_version": "1.16.0-alpha.10", + "use_snapshot": true +``` + Optionally override the webservice version using `npm config set dockstore-ui2:webservice_version ${WEBSERVICE_VERSION}` + +For example, to build against a specific branch, edit the package.json with +``` + "config": { + "webservice_version_prefix": "1.16.0", + "webservice_version": "feature/seab-6420/modify-endpoint-description-for-new-health-checks", + "use_snapshot": false + }, +``` +For example, to build against a specific commit, edit the package.json with +``` + "config": { + "webservice_version_prefix": "1.16.0", + "webservice_version": "1550b549c45b2f4ba7f205e2f64502d523417dcd", + "use_snapshot": false + }, +``` + Run `npm run build` to build the project. The build artifacts will be stored in the `dist/` directory. ### Angular Production Build diff --git a/SECURITY.md b/SECURITY.md deleted file mode 100644 index a813608382..0000000000 --- a/SECURITY.md +++ /dev/null @@ -1,21 +0,0 @@ -# Security Policy - -## Supported Versions - -The Dockstore system routinely receives security updates to the most recently -released tagged minor version. All previous versions are unsupported. - -## Reporting a Vulnerability - -Users are able to open helpdesk tickets on [Discourse](https://discuss.dockstore.org/). Users can create helpdesk tickets in case of privacy complaints, security vulnerabilities, or any other urgent matter related to Dockstore. Helpdesk tickets will be addressed by Dockstore administrators. - -The following steps can be taken to create a helpdesk ticket (also shown [here](https://discuss.dockstore.org/t/opening-helpdesk-tickets/1506)). - -1. Navigate to [Discourse](https://discuss.dockstore.org/) and login. -2. Select your profile icon, located in the top right corner of the screen. -3. Select the `mail` icon, located in the dropdown. -4. Send a message to the `dockstore_admins` group. - -Note - -> If you are unable to see a New Message button on the mail page, you may be considered a new user and have insufficient privileges. Entering 5 topics and viewing 30 posts over a minimum of 10 minutes will raise your privileges. You will be notified of any privilege changes to your account via the mailbox. diff --git a/THIRD-PARTY-LICENSES.csv b/THIRD-PARTY-LICENSES.csv index 50b95e0e43..e2aac73b2c 100644 --- a/THIRD-PARTY-LICENSES.csv +++ b/THIRD-PARTY-LICENSES.csv @@ -1,30 +1,80 @@ "module name","license","repository" "@angular-devkit/core@8.3.29","MIT","https://github.com/angular/angular-cli" "@angular-devkit/schematics@8.3.29","MIT","https://github.com/angular/angular-cli" -"@angular/animations@14.2.8","MIT","https://github.com/angular/angular" -"@angular/cdk@14.2.6","MIT","https://github.com/angular/components" -"@angular/common@14.2.8","MIT","https://github.com/angular/angular" -"@angular/compiler@14.2.8","MIT","https://github.com/angular/angular" -"@angular/core@14.2.8","MIT","https://github.com/angular/angular" -"@angular/flex-layout@14.0.0-beta.41","MIT","https://github.com/angular/flex-layout" -"@angular/forms@14.2.8","MIT","https://github.com/angular/angular" -"@angular/material@14.2.6","MIT","https://github.com/angular/components" -"@angular/platform-browser-dynamic@14.2.8","MIT","https://github.com/angular/angular" -"@angular/platform-browser@14.2.8","MIT","https://github.com/angular/angular" -"@angular/router@14.2.8","MIT","https://github.com/angular/angular" +"@angular/animations@16.2.12","MIT","https://github.com/angular/angular" +"@angular/cdk@16.2.14","MIT","https://github.com/angular/components" +"@angular/common@16.2.12","MIT","https://github.com/angular/angular" +"@angular/compiler@16.2.12","MIT","https://github.com/angular/angular" +"@angular/core@16.2.12","MIT","https://github.com/angular/angular" +"@angular/forms@16.2.12","MIT","https://github.com/angular/angular" +"@angular/material@16.2.14","MIT","https://github.com/angular/components" +"@angular/platform-browser-dynamic@16.2.12","MIT","https://github.com/angular/angular" +"@angular/platform-browser@16.2.12","MIT","https://github.com/angular/angular" +"@angular/router@16.2.12","MIT","https://github.com/angular/angular" "@braintree/sanitize-url@6.0.2","MIT","https://github.com/braintree/sanitize-url" "@datorama/akita@7.1.1","Apache-2.0","https://github.com/datorama/akita" -"@fortawesome/angular-fontawesome@0.11.1","MIT","https://github.com/FortAwesome/angular-fontawesome" +"@fortawesome/angular-fontawesome@0.13.0","MIT","https://github.com/FortAwesome/angular-fontawesome" "@fortawesome/fontawesome-common-types@0.3.0","MIT","https://github.com/FortAwesome/Font-Awesome" "@fortawesome/fontawesome-common-types@6.2.0","MIT","https://github.com/FortAwesome/Font-Awesome" "@fortawesome/fontawesome-svg-core@6.2.0","MIT","https://github.com/FortAwesome/Font-Awesome" "@fortawesome/free-brands-svg-icons@6.0.0","(CC-BY-4.0 AND MIT)","https://github.com/FortAwesome/Font-Awesome" "@fortawesome/free-solid-svg-icons@6.0.0","(CC-BY-4.0 AND MIT)","https://github.com/FortAwesome/Font-Awesome" +"@material/animation@15.0.0-canary.bc9ae6c9c.0","MIT","https://github.com/material-components/material-components-web" +"@material/auto-init@15.0.0-canary.bc9ae6c9c.0","MIT","https://github.com/material-components/material-components-web" +"@material/banner@15.0.0-canary.bc9ae6c9c.0","MIT","https://github.com/material-components/material-components-web" +"@material/base@15.0.0-canary.bc9ae6c9c.0","MIT","https://github.com/material-components/material-components-web" +"@material/button@15.0.0-canary.bc9ae6c9c.0","MIT","https://github.com/material-components/material-components-web" +"@material/card@15.0.0-canary.bc9ae6c9c.0","MIT","https://github.com/material-components/material-components-web" +"@material/checkbox@15.0.0-canary.bc9ae6c9c.0","MIT","https://github.com/material-components/material-components-web" +"@material/chips@15.0.0-canary.bc9ae6c9c.0","MIT","https://github.com/material-components/material-components-web" +"@material/circular-progress@15.0.0-canary.bc9ae6c9c.0","MIT","https://github.com/material-components/material-components-web" +"@material/data-table@15.0.0-canary.bc9ae6c9c.0","MIT","https://github.com/material-components/material-components-web" +"@material/density@15.0.0-canary.bc9ae6c9c.0","MIT","https://github.com/material-components/material-components-web" +"@material/dialog@15.0.0-canary.bc9ae6c9c.0","MIT","https://github.com/material-components/material-components-web" +"@material/dom@15.0.0-canary.bc9ae6c9c.0","MIT","https://github.com/material-components/material-components-web" +"@material/drawer@15.0.0-canary.bc9ae6c9c.0","MIT","https://github.com/material-components/material-components-web" +"@material/elevation@15.0.0-canary.bc9ae6c9c.0","MIT","https://github.com/material-components/material-components-web" +"@material/fab@15.0.0-canary.bc9ae6c9c.0","MIT","https://github.com/material-components/material-components-web" +"@material/feature-targeting@15.0.0-canary.bc9ae6c9c.0","MIT","https://github.com/material-components/material-components-web" +"@material/floating-label@15.0.0-canary.bc9ae6c9c.0","MIT","https://github.com/material-components/material-components-web" +"@material/focus-ring@15.0.0-canary.bc9ae6c9c.0","MIT","https://github.com/material-components/material-components-web" +"@material/form-field@15.0.0-canary.bc9ae6c9c.0","MIT","https://github.com/material-components/material-components-web" +"@material/icon-button@15.0.0-canary.bc9ae6c9c.0","MIT","https://github.com/material-components/material-components-web" +"@material/image-list@15.0.0-canary.bc9ae6c9c.0","MIT","https://github.com/material-components/material-components-web" +"@material/layout-grid@15.0.0-canary.bc9ae6c9c.0","MIT","https://github.com/material-components/material-components-web" +"@material/line-ripple@15.0.0-canary.bc9ae6c9c.0","MIT","https://github.com/material-components/material-components-web" +"@material/linear-progress@15.0.0-canary.bc9ae6c9c.0","MIT","https://github.com/material-components/material-components-web" +"@material/list@15.0.0-canary.bc9ae6c9c.0","MIT","https://github.com/material-components/material-components-web" +"@material/menu-surface@15.0.0-canary.bc9ae6c9c.0","MIT","https://github.com/material-components/material-components-web" +"@material/menu@15.0.0-canary.bc9ae6c9c.0","MIT","https://github.com/material-components/material-components-web" +"@material/notched-outline@15.0.0-canary.bc9ae6c9c.0","MIT","https://github.com/material-components/material-components-web" +"@material/progress-indicator@15.0.0-canary.bc9ae6c9c.0","MIT","https://github.com/material-components/material-components-web" +"@material/radio@15.0.0-canary.bc9ae6c9c.0","MIT","https://github.com/material-components/material-components-web" +"@material/ripple@15.0.0-canary.bc9ae6c9c.0","MIT","https://github.com/material-components/material-components-web" +"@material/rtl@15.0.0-canary.bc9ae6c9c.0","MIT","https://github.com/material-components/material-components-web" +"@material/segmented-button@15.0.0-canary.bc9ae6c9c.0","MIT","https://github.com/material-components/material-components-web" +"@material/select@15.0.0-canary.bc9ae6c9c.0","MIT","https://github.com/material-components/material-components-web" +"@material/shape@15.0.0-canary.bc9ae6c9c.0","MIT","https://github.com/material-components/material-components-web" +"@material/slider@15.0.0-canary.bc9ae6c9c.0","MIT","https://github.com/material-components/material-components-web" +"@material/snackbar@15.0.0-canary.bc9ae6c9c.0","MIT","https://github.com/material-components/material-components-web" +"@material/switch@15.0.0-canary.bc9ae6c9c.0","MIT","https://github.com/material-components/material-components-web" +"@material/tab-bar@15.0.0-canary.bc9ae6c9c.0","MIT","https://github.com/material-components/material-components-web" +"@material/tab-indicator@15.0.0-canary.bc9ae6c9c.0","MIT","https://github.com/material-components/material-components-web" +"@material/tab-scroller@15.0.0-canary.bc9ae6c9c.0","MIT","https://github.com/material-components/material-components-web" +"@material/tab@15.0.0-canary.bc9ae6c9c.0","MIT","https://github.com/material-components/material-components-web" +"@material/textfield@15.0.0-canary.bc9ae6c9c.0","MIT","https://github.com/material-components/material-components-web" +"@material/theme@15.0.0-canary.bc9ae6c9c.0","MIT","https://github.com/material-components/material-components-web" +"@material/tokens@15.0.0-canary.bc9ae6c9c.0","MIT","https://github.com/material-components/material-components-web" +"@material/tooltip@15.0.0-canary.bc9ae6c9c.0","MIT","https://github.com/material-components/material-components-web" +"@material/top-app-bar@15.0.0-canary.bc9ae6c9c.0","MIT","https://github.com/material-components/material-components-web" +"@material/touch-target@15.0.0-canary.bc9ae6c9c.0","MIT","https://github.com/material-components/material-components-web" +"@material/typography@15.0.0-canary.bc9ae6c9c.0","MIT","https://github.com/material-components/material-components-web" +"@ngbracket/ngx-layout@15.1.3","MIT","https://github.com/ngbracket/ngx-layout" "@ngneat/forms-manager@2.5.0","MIT","" "@popperjs/core@2.11.2","MIT","https://github.com/popperjs/popper-core" "@schematics/angular@8.3.29","MIT","https://github.com/angular/angular-cli" "@schematics/update@0.803.29","MIT","https://github.com/angular/angular-cli" -"@types/marked@4.0.7","MIT","https://github.com/DefinitelyTyped/DefinitelyTyped" +"@types/marked@4.3.2","MIT","https://github.com/DefinitelyTyped/DefinitelyTyped" "@yarnpkg/lockfile@1.1.0","BSD-2-Clause","https://github.com/yarnpkg/yarn/blob/master/packages/lockfile" "JSONStream@1.3.5","(MIT OR Apache-2.0)","https://github.com/dominictarr/JSONStream" "academicons@1.9.1","OFL-1.1","https://github.com/jpswalsh/academicons" @@ -33,8 +83,9 @@ "agent-base@4.3.0","MIT","https://github.com/TooTallNate/node-agent-base" "agentkeepalive@3.5.2","MIT","https://github.com/node-modules/agentkeepalive" "ajv@6.12.3","MIT","https://github.com/ajv-validator/ajv" -"angular-tag-cloud-module@14.0.0","MIT*","https://github.com/d-koppenhagen/angular-tag-cloud-module" +"angular-tag-cloud-module@16.0.0","MIT","https://github.com/d-koppenhagen/angular-tag-cloud-module" "aproba@1.2.0","ISC","https://github.com/iarna/aproba" +"assign-symbols@1.0.0","MIT","https://github.com/jonschlinkert/assign-symbols" "balanced-match@1.0.2","MIT","https://github.com/juliangruber/balanced-match" "bluebird@3.7.2","MIT","https://github.com/petkaantonov/bluebird" "bodybuilder@2.4.0","MIT","https://github.com/danpaz/bodybuilder" @@ -92,13 +143,16 @@ "delaunator@5.0.0","ISC","https://github.com/mapbox/delaunator" "delegate@3.2.0","MIT","https://github.com/zenorocha/delegate" "dompurify@2.4.1","(MPL-2.0 OR Apache-2.0)","https://github.com/cure53/DOMPurify" +"dompurify@2.5.4","(MPL-2.0 OR Apache-2.0)","https://github.com/cure53/DOMPurify" "duplexify@3.7.1","MIT","https://github.com/mafintosh/duplexify" -"emoji-toolkit@6.6.0","MIT","https://github.com/joypixels/emoji-toolkit" +"emoji-toolkit@7.0.1","MIT","https://github.com/joypixels/emoji-toolkit" "encoding@0.1.13","MIT","https://github.com/andris9/encoding" "end-of-stream@1.4.4","MIT","https://github.com/mafintosh/end-of-stream" +"entities@4.5.0","BSD-2-Clause","https://github.com/fb55/entities" "err-code@1.1.2","MIT","https://github.com/IndigoUnited/js-err-code" "es6-promise@4.2.8","MIT","https://github.com/stefanpenner/es6-promise" "es6-promisify@5.0.0","MIT","https://github.com/digitaldesignlabs/es6-promisify" +"extend-shallow@3.0.2","MIT","https://github.com/jonschlinkert/extend-shallow" "fast-deep-equal@3.1.3","MIT","https://github.com/epoberezkin/fast-deep-equal" "fast-json-stable-stringify@2.0.0","MIT","https://github.com/epoberezkin/fast-json-stable-stringify" "figgy-pudding@3.5.2","ISC","https://github.com/npm/figgy-pudding" @@ -108,12 +162,12 @@ "fs-minipass@1.2.7","ISC","https://github.com/npm/fs-minipass" "fs-write-stream-atomic@1.0.10","ISC","https://github.com/npm/fs-write-stream-atomic" "fs.realpath@1.0.0","ISC","https://github.com/isaacs/fs.realpath" -"function-bind@1.1.1","MIT","https://github.com/Raynos/function-bind" +"function-bind@1.1.2","MIT","https://github.com/Raynos/function-bind" "genfun@5.0.0","MIT","https://github.com/zkat/genfun" "get-stream@4.1.0","MIT","https://github.com/sindresorhus/get-stream" "glob@7.2.0","ISC","https://github.com/isaacs/node-glob" "good-listener@1.2.2","MIT","https://github.com/zenorocha/good-listener" -"graceful-fs@4.2.9","ISC","https://github.com/isaacs/node-graceful-fs" +"graceful-fs@4.2.11","ISC","https://github.com/isaacs/node-graceful-fs" "graphlib@2.1.8","MIT","https://github.com/dagrejs/graphlib" "has@1.0.3","MIT","https://github.com/tarruda/has" "heap@0.2.7","MIT","https://github.com/qiao/heap.js" @@ -134,13 +188,16 @@ "internmap@2.0.3","ISC","https://github.com/mbostock/internmap" "ip@1.1.5","MIT","https://github.com/indutny/node-ip" "is-core-module@2.11.0","MIT","https://github.com/inspect-js/is-core-module" +"is-extendable@1.0.1","MIT","https://github.com/jonschlinkert/is-extendable" +"is-plain-object@2.0.4","MIT","https://github.com/jonschlinkert/is-plain-object" "isarray@1.0.0","MIT","https://github.com/juliangruber/isarray" "isexe@2.0.0","ISC","https://github.com/isaacs/isexe" +"isobject@3.0.1","MIT","https://github.com/jonschlinkert/isobject" "jquery@3.6.0","MIT","https://github.com/jquery/jquery" "json-parse-better-errors@1.0.2","MIT","https://github.com/zkat/json-parse-better-errors" "json-schema-traverse@0.4.1","MIT","https://github.com/epoberezkin/json-schema-traverse" "jsonparse@1.3.1","MIT","https://github.com/creationix/jsonparse" -"katex@0.16.4","MIT","https://github.com/KaTeX/KaTeX" +"katex@0.16.10","MIT","https://github.com/KaTeX/KaTeX" "khroma@2.0.0","MIT*","https://github.com/fabiospampinato/khroma" "lodash-es@4.17.21","MIT","https://github.com/lodash/lodash" "lodash.debounce@4.0.8","MIT","https://github.com/lodash/lodash" @@ -151,12 +208,12 @@ "lru-cache@5.1.1","ISC","https://github.com/isaacs/node-lru-cache" "magic-string@0.25.3","MIT","https://github.com/rich-harris/magic-string" "make-fetch-happen@5.0.2","ISC","https://github.com/zkat/make-fetch-happen" -"marked@4.2.3","MIT","https://github.com/markedjs/marked" +"marked@4.3.0","MIT","https://github.com/markedjs/marked" "material-design-icons-iconfont@6.1.1","Apache-2.0","https://github.com/jossef/material-design-icons-iconfont" "mathjax@3.2.2","Apache-2.0","https://github.com/mathjax/MathJax" "mermaid@9.3.0","MIT","https://github.com/mermaid-js/mermaid" "minimatch@3.1.2","ISC","https://github.com/isaacs/minimatch" -"minimist@1.2.6","MIT","https://github.com/substack/minimist" +"minimist@1.2.8","MIT","https://github.com/minimistjs/minimist" "minipass@2.9.0","ISC","https://github.com/isaacs/minipass" "minizlib@1.3.3","MIT","https://github.com/isaacs/minizlib" "mississippi@3.0.0","BSD-2-Clause","https://github.com/maxogden/mississippi" @@ -165,9 +222,8 @@ "move-concurrently@1.0.1","ISC","https://github.com/npm/move-concurrently" "ms@2.0.0","MIT","https://github.com/zeit/ms" "ms@2.1.2","MIT","https://github.com/zeit/ms" -"ng2-ui-auth@10.0.1","UNKNOWN","" -"ngx-markdown@14.0.1","MIT","https://github.com/jfcere/ngx-markdown" -"ngx-mat-select-search@5.0.0","MIT","https://github.com/bithost-gmbh/ngx-mat-select-search" +"ngx-markdown@16.0.0","MIT","https://github.com/jfcere/ngx-markdown" +"ngx-mat-select-search@6.0.0","MIT","https://github.com/bithost-gmbh/ngx-mat-select-search" "ngx-sharebuttons@8.1.0","MIT","https://github.com/murhafsousli/ngx-sharebuttons" "node-fetch-npm@2.0.4","MIT","https://github.com/npm/node-fetch-npm" "non-layered-tidy-tree-layout@2.0.2","MIT","https://github.com/stetrevor/non-layered-tidy-tree-layout" @@ -185,6 +241,7 @@ "pacote@9.5.5","MIT","https://github.com/npm/pacote" "parallel-transform@1.2.0","MIT","https://github.com/mafintosh/parallel-transform" "parse5@5.1.1","MIT","https://github.com/inikulin/parse5" +"parse5@7.1.2","MIT","https://github.com/inikulin/parse5" "path-is-absolute@1.0.1","MIT","https://github.com/sindresorhus/path-is-absolute" "path-parse@1.0.7","MIT","https://github.com/jbgutierrez/path-parse" "prismjs@1.29.0","MIT","https://github.com/PrismJS/prism" @@ -197,7 +254,7 @@ "pumpify@1.5.1","MIT","https://github.com/mafintosh/pumpify" "punycode@2.1.1","MIT","https://github.com/bestiejs/punycode.js" "readable-stream@2.3.7","MIT","https://github.com/nodejs/readable-stream" -"resolve@1.22.1","MIT","https://github.com/browserify/resolve" +"resolve@1.22.2","MIT","https://github.com/browserify/resolve" "retry@0.10.1","MIT","https://github.com/tim-kos/node-retry" "rimraf@2.7.1","ISC","https://github.com/isaacs/rimraf" "robust-predicates@3.0.1","Unlicense","https://github.com/mourner/robust-predicates" @@ -208,6 +265,7 @@ "safe-buffer@5.1.2","MIT","https://github.com/feross/safe-buffer" "safe-buffer@5.2.1","MIT","https://github.com/feross/safe-buffer" "safer-buffer@2.1.2","MIT","https://github.com/ChALkeR/safer-buffer" +"safevalues@0.3.4","Apache-2.0","https://github.com/google/safevalues" "schematics-utilities@2.0.3","MIT","https://github.com/nitayneeman/schematics-utilities" "select@1.1.2","MIT","https://github.com/zenorocha/select" "semver-intersect@1.4.0","MIT","https://github.com/snyamathi/semver-intersect" @@ -222,6 +280,7 @@ "spdx-exceptions@2.3.0","CC-BY-3.0","https://github.com/kemitchell/spdx-exceptions.json" "spdx-expression-parse@3.0.1","MIT","https://github.com/jslicense/spdx-expression-parse.js" "spdx-license-ids@3.0.11","CC0-1.0","https://github.com/jslicense/spdx-license-ids" +"split-string@3.1.0","MIT","https://github.com/jonschlinkert/split-string" "ssri@6.0.2","ISC","https://github.com/zkat/ssri" "stream-each@1.2.3","MIT","https://github.com/mafintosh/stream-each" "stream-shift@1.0.1","MIT","https://github.com/mafintosh/stream-shift" @@ -234,7 +293,7 @@ "tiny-emitter@2.1.0","MIT","https://github.com/scottcorgan/tiny-emitter" "ts-md5@1.2.11","MIT","https://github.com/cotag/ts-md5" "tslib@1.14.1","0BSD","https://github.com/Microsoft/tslib" -"tslib@2.4.0","0BSD","https://github.com/Microsoft/tslib" +"tslib@2.6.1","0BSD","https://github.com/Microsoft/tslib" "typedarray@0.0.6","MIT","https://github.com/substack/typedarray" "typescript@3.9.10","Apache-2.0","https://github.com/Microsoft/TypeScript" "unique-filename@1.1.1","ISC","https://github.com/iarna/unique-filename" @@ -250,4 +309,4 @@ "xtend@4.0.2","MIT","https://github.com/Raynos/xtend" "y18n@4.0.3","ISC","https://github.com/yargs/y18n" "yallist@3.1.1","ISC","https://github.com/isaacs/yallist" -"zone.js@0.11.4","MIT","https://github.com/angular/angular" +"zone.js@0.13.3","MIT","https://github.com/angular/angular" diff --git a/angular.json b/angular.json index 15e74b26cf..512bed1fdc 100644 --- a/angular.json +++ b/angular.json @@ -51,6 +51,15 @@ "node_modules/ace-builds/src-min-noconflict/theme-idle_fingers.js", "node_modules/ace-builds/src-min-noconflict/ext-searchbox.js", "node_modules/bootstrap/dist/js/bootstrap.js" + ], + "allowedCommonJsDependencies": [ + "ts-md5", + "bodybuilder", + "file-saver", + "dompurify", + "cytoscape", + "cytoscape-dagre", + "cytoscape-popper" ] }, "configurations": { @@ -108,9 +117,8 @@ "builder": "@angular-devkit/build-angular:karma", "options": { "codeCoverage": true, - "main": "src/test.ts", "karmaConfig": "./karma.conf.js", - "polyfills": "src/polyfills.ts", + "polyfills": ["zone.js", "zone.js/testing"], "tsConfig": "src/tsconfig.spec.json", "scripts": [ "node_modules/jquery/dist/jquery.js", diff --git a/cypress.config.ts b/cypress.config.ts index c9cea186bd..1c682b7662 100644 --- a/cypress.config.ts +++ b/cypress.config.ts @@ -2,10 +2,11 @@ import { defineConfig } from 'cypress' export default defineConfig({ projectId: '1ya4vj', - viewportHeight: 900, - viewportWidth: 1440, + viewportHeight: 1080, + viewportWidth: 1920, defaultCommandTimeout: 30000, requestTimeout: 30000, + experimentalMemoryManagement: true, retries: { runMode: 3, openMode: 0, diff --git a/cypress/e2e/group1/checkerWorkflowFromTools.ts b/cypress/e2e/group1/checkerWorkflowFromTools.ts index ad89bea71a..eb69ce7ca4 100644 --- a/cypress/e2e/group1/checkerWorkflowFromTools.ts +++ b/cypress/e2e/group1/checkerWorkflowFromTools.ts @@ -19,6 +19,7 @@ describe('Checker workflow test from my-tools', () => { resetDB(); setTokenUserViewPort(); beforeEach(() => { + cy.intercept('api/containers/*?include=validations').as('getTool'); // Visit my-tools page cy.visit('/my-tools'); }); @@ -34,7 +35,6 @@ describe('Checker workflow test from my-tools', () => { describe('Should be able to register and publish a checker workflow from a tool', () => { it('visit a tool and have the correct buttons and be able to register a checker workflow', () => { - cy.intercept('api/containers/*?include=validations').as('getTool'); cy.wait('@getTool'); goToB3(); @@ -43,9 +43,9 @@ describe('Checker workflow test from my-tools', () => { cy.get('#launchCheckerWorkflow').should('not.exist'); cy.get('#addCheckerWorkflowButton').should('be.visible').click(); - cy.get('#checkerWorkflowPath').type('/Dockstore.cwl'); + cy.get('#checkerWorkflowPath').should('be.visible').type('/Dockstore.cwl'); - cy.get('#checkerWorkflowTestParameterFilePath').type('/test.json'); + cy.get('#checkerWorkflowTestParameterFilePath').should('be.visible').type('/test.json'); cy.get('#submitButton').click(); @@ -89,15 +89,17 @@ describe('Checker workflow test from my-tools', () => { }); it('visit the tool and have its publish/unpublish reflected in the checker workflow', () => { cy.intercept('api/containers/*?include=validations').as('getTool'); + cy.intercept('api/containers/4/publish').as('unpublishTool'); cy.wait('@getTool'); goToB3(); // In the parent tool right now // Didn't change the tool path upon entry or select // cy.url().should('eq','/my-tools/quay.io/A2/b3') cy.get('#publishToolButton').should('be.visible').should('contain', 'Unpublish').click(); + cy.wait('@unpublishTool'); goToTab('Versions'); - cy.contains('button', 'Actions').should('be.visible').click(); + cy.contains('button', 'Actions').click(); // Clicking it should scroll it into view cy.get('[data-cy=set-default-version-button]').should('be.visible').click(); goToTab('Info'); diff --git a/cypress/e2e/group1/checkerWorkflowFromWorkflow.ts b/cypress/e2e/group1/checkerWorkflowFromWorkflow.ts index a20344e021..3fac473eef 100644 --- a/cypress/e2e/group1/checkerWorkflowFromWorkflow.ts +++ b/cypress/e2e/group1/checkerWorkflowFromWorkflow.ts @@ -46,8 +46,8 @@ describe('Checker workflow test from my-workflows', () => { cy.get('#launchCheckerWorkflow').should('not.exist'); goToTab('Info'); cy.get('#addCheckerWorkflowButton').should('be.visible').click(); - cy.get('#checkerWorkflowPath').type('/Dockstore.cwl'); - cy.get('#checkerWorkflowTestParameterFilePath').type('/test.json'); + cy.get('#checkerWorkflowPath').should('be.visible').type('/Dockstore.cwl'); + cy.get('#checkerWorkflowTestParameterFilePath').should('be.visible').type('/test.json'); cy.fixture('refreshedChecker').then((json) => { cy.intercept('GET', '/api/workflows/*/refresh', { body: json, @@ -123,7 +123,7 @@ describe('Checker workflow test from my-workflows', () => { cy.url().should('eq', Cypress.config().baseUrl + '/my-workflows/github.com/A/l'); goToTab('Versions'); - cy.contains('button', 'Actions').should('be.visible').click(); + cy.contains('button', 'Actions').click(); cy.get('[data-cy=set-default-version-button]').should('be.visible').click(); goToTab('Info'); diff --git a/cypress/e2e/group1/dashboard.ts b/cypress/e2e/group1/dashboard.ts index 6c8c4badf1..234d65e71b 100644 --- a/cypress/e2e/group1/dashboard.ts +++ b/cypress/e2e/group1/dashboard.ts @@ -20,7 +20,7 @@ import { verifyGithubLinkDashboard, checkFeaturedContent, checkNewsAndUpdates, - checkMastodonFeedOrTwitterFeed, + checkMastodonFeed, } from '../../support/commands'; describe('Dockstore dashboard', () => { @@ -71,7 +71,7 @@ describe('Dockstore dashboard', () => { it('mastodon feed should be visible', () => { cy.visit('/dashboard'); - checkMastodonFeedOrTwitterFeed(); + checkMastodonFeed(); }); }); diff --git a/cypress/e2e/group2/myworkflows.ts b/cypress/e2e/group2/myworkflows.ts index 41daedd608..bc1dbb5a24 100644 --- a/cypress/e2e/group2/myworkflows.ts +++ b/cypress/e2e/group2/myworkflows.ts @@ -18,6 +18,7 @@ import { Repository } from '../../../src/app/shared/openapi/model/repository'; import { goToTab, insertAuthors, + invokeSql, isActiveTab, resetDB, setTokenUserViewPort, @@ -43,7 +44,7 @@ describe('Dockstore my workflows', () => { cy.contains('No matching workflows'); }); - it('have action buttons which work', () => { + it('should have discover existing workflows button', () => { cy.fixture('myWorkflows.json').then((json) => { cy.intercept('PATCH', '/api/users/1/workflows', { body: json, @@ -53,14 +54,21 @@ describe('Dockstore my workflows', () => { cy.visit('/my-workflows'); cy.get('[data-cy=myWorkflowsMoreActionButtons]').should('be.visible').click(); + cy.fixture('myWorkflows.json').then((json) => { + cy.intercept('GET', '/api/users/1/workflows', { + body: json, + statusCode: 200, + }).as('getWorkflows'); + }); cy.get('[data-cy=addToExistingWorkflows]').should('be.visible').click(); + cy.wait('@getWorkflows'); cy.contains('addedthisworkflowviasync'); }); describe('Should contain extended Workflow properties', () => { // Flaky test, see https://github.com/dockstore/dockstore/issues/5696 - it('visit another page then come back', () => { + it('Should show GitHub App logs', () => { cy.visit('/my-workflows'); cy.contains('github.com/A/l'); @@ -69,14 +77,16 @@ describe('Dockstore my workflows', () => { cy.contains('Close').click(); cy.intercept('GET', '/api/lambdaEvents/**', { body: [], - }).as('refreshWorkflow'); + }).as('No lambda events'); cy.contains('Apps Logs').click(); cy.contains('There are no GitHub App logs for this organization.'); cy.contains('Close').click(); + const entry1 = 'entry1'; + const entry2 = 'entry2'; const realResponse = [ { deliveryId: '1', - entryName: 'entry1', + entryName: entry1, eventDate: 1582165220000, githubUsername: 'boil', id: 1, @@ -89,7 +99,7 @@ describe('Dockstore my workflows', () => { }, { deliveryId: '2', - entryName: 'entry2', + entryName: entry2, eventDate: 1591368041850, githubUsername: 'em', id: 2, @@ -101,15 +111,29 @@ describe('Dockstore my workflows', () => { type: 'PUSH', }, ]; - cy.intercept('GET', '/api/lambdaEvents/**', { + const sortedAsc = [...realResponse].sort((a, b) => a.entryName.toLowerCase().localeCompare(b.entryName.toLowerCase())); + const sortedDesc = [...realResponse].sort((a, b) => b.entryName.toLowerCase().localeCompare(a.entryName.toLowerCase())); + cy.intercept('GET', '/api/lambdaEvents/**sortCol=entryName&sortOrder=asc', { + body: sortedAsc, + headers: { + 'X-total-count': '2', + }, + }).as('Sorted by entryName asc'); + cy.intercept('GET', '/api/lambdaEvents/**sortCol=entryName&sortOrder=desc', { + body: sortedDesc, + headers: { + 'X-total-count': '2', + }, + }).as('Sorted by entryName desc'); + cy.intercept('GET', '/api/lambdaEvents/A?offset=0&limit=10&sortOrder=desc', { body: realResponse, headers: { 'X-total-count': '2', }, - }).as('refreshWorkflow'); + }).as('Default sort'); cy.contains('Apps Logs').click(); // Check that app logs contain the correct columns - const appLogColumns = ['Date', 'GitHub Username', 'Entry Name', 'Delivery ID', 'Repository', 'Reference', 'Success', 'Type']; + const appLogColumns = ['Date', 'GitHub Username', 'Entry Name', 'Delivery ID', 'Repository', 'Reference', 'Status', 'Type']; appLogColumns.forEach((column) => cy.contains(column)); // These next 2 values work on Circle CI (UTC?) I would have thought East Coast time, but there's an 8 hour diff with West Coast time. Confused cy.contains('2020-02-20T02:20'); @@ -117,13 +141,22 @@ describe('Dockstore my workflows', () => { // These next 2 values only work on the West Coast // cy.contains('2020-02-19T18:20'); // cy.contains('2020-06-05T07:40'); + + // Sort by entry name ascending, entry1 should be first row + cy.contains('th', 'Entry Name').click(); + cy.get('[data-cy=entry-name').first().should('have.text', entry1); + + // Sort by entry name descending, entry2 should be first row + cy.contains('th', 'Entry Name').click(); + cy.get('[data-cy=entry-name').first().should('have.text', entry2); + cy.contains('1 – 2 of 2'); //Filtering const filteredResponse: LambdaEvent[] = [ { deliveryId: '1', - entryName: 'entry1', + entryName: entry1, eventDate: 1582165220000, githubUsername: 'boil', id: 1, @@ -141,12 +174,13 @@ describe('Dockstore my workflows', () => { 'X-total-count': '1', }, }); - cy.get('[data-cy=apps-logs-filter]').type('entry1'); + cy.get('[data-cy=apps-logs-filter]').type(entry1); cy.contains('2020-02-20T02:20'); cy.contains('1 – 1 of 1'); cy.contains('Close').click(); }); it('Should contain the extended properties and be able to edit the info tab', () => { + cy.intercept('PUT', 'api/workflows/*').as('updateWorkflow'); // The seemingly unnecessary visits are due to a detached-from-dom error even using cy.get().click(); cy.visit('/my-workflows/github.com/A/l'); cy.contains('github.com'); @@ -158,6 +192,7 @@ describe('Dockstore my workflows', () => { const workflowPathInput = '[data-cy=workflowPathInput]'; cy.get(workflowPathInput).clear().type('/Dockstore2.cwl'); cy.contains('button', ' Save ').click(); + cy.wait('@updateWorkflow'); cy.visit('/my-workflows/github.com/A/g'); cy.contains('/Dockstore2.cwl'); // Change the file path back @@ -165,6 +200,7 @@ describe('Dockstore my workflows', () => { const dockstoreCwlPath = '/Dockstore.cwl'; cy.get(workflowPathInput).clear().type(dockstoreCwlPath); cy.contains('button', ' Save ').click(); + cy.wait('@updateWorkflow'); cy.visit('/my-workflows/github.com/A/g'); const workflowPathSpan = '[data-cy=workflowPathSpan]'; cy.get(workflowPathSpan).contains(dockstoreCwlPath); @@ -182,25 +218,66 @@ describe('Dockstore my workflows', () => { // Topic Editing const privateEntryURI = '/my-workflows/github.com/A/l'; cy.visit(privateEntryURI); + // Modify the manual topic, but don't save it cy.get('[data-cy=topicEditButton]').click(); - cy.get('[data-cy=topicInput]').clear().type('badTopic'); + cy.get('[data-cy=topicInput]').clear(); // Unsafe to chain clear() + cy.get('[data-cy=topicInput]').type('badTopic'); cy.get('[data-cy=topicCancelButton]').click(); - cy.contains('badTopic').should('not.exist'); + cy.get('[data-cy=selected-topic]').should('not.contain.text', 'badTopic'); + // Modify the manual topic and save it cy.get('[data-cy=topicEditButton]').click(); - cy.get('[data-cy=topicInput]').clear().type('goodTopic'); + cy.get('[data-cy=topicInput]').clear(); // Unsafe to chain clear() + cy.get('[data-cy=topicInput]').type('goodTopic'); cy.get('[data-cy=topicSaveButton]').click(); - cy.contains('goodTopic').should('exist'); + cy.wait('@updateWorkflow'); + // Check that the manual topic is saved + cy.get('[data-cy=topicEditButton]').click(); + cy.get('[data-cy=topicInput]').should('have.value', 'goodTopic'); + cy.get('[data-cy=topicCancelButton]').click(); - // Check public view - cy.visit(privateEntryURI); + // Check public view. Manual topic should not be displayed because it's not the selected topic cy.get('[data-cy=viewPublicWorkflowButton]').should('be.visible').click(); - cy.contains('goodTopic').should('not.exist'); + cy.get('[data-cy=selected-topic]').should('not.contain.text', 'goodTopic'); + // Select the manual topic and verify that it's displayed publicly cy.visit(privateEntryURI); + cy.get('[data-cy=topicEditButton]').click(); cy.get('.mat-radio-label').contains('Manual').click(); + cy.get('[data-cy=topicSaveButton]').click(); + cy.wait('@updateWorkflow'); + cy.get('[data-cy=selected-topic]').should('contain.text', 'goodTopic'); + // Topic selection bubble should be visible on private page + cy.get('[data-cy=topic-selection-bubble]').should('be.visible'); + // Topic selection bubble should not exist on public page + cy.get('[data-cy=viewPublicWorkflowButton]').should('be.visible').click(); + cy.get('[data-cy=selected-topic]').should('contain.text', 'goodTopic'); + cy.get('[data-cy=topic-selection-bubble]').should('not.exist'); + + // Add an AI topic for testing and set topic selection to AI. The user has not approved of this topic. + invokeSql("update workflow set topicai = 'test AI topic sentence' where id = 11"); + invokeSql("update workflow set topicselection = 'AI' where id = 11"); + cy.visit(privateEntryURI); + cy.get('[data-cy=topicEditButton]').click(); + cy.get('[data-cy=unapprovedAITopicCard]').should('be.visible'); + cy.get('[data-cy=topicCancelButton]').click(); + // AI topic on public page should have an AI bubble because it wasn't approved by the user + cy.get('[data-cy=viewPublicWorkflowButton]').should('be.visible').click(); + cy.get('[data-cy=ai-bubble]').should('be.visible'); + + // Select the AI topic and verify that it's displayed publicly without an AI bubble cy.visit(privateEntryURI); + cy.get('[data-cy=topicEditButton]').click(); + cy.get('.mat-radio-label').contains('AI').click(); + cy.get('[data-cy=topicSaveButton]').click(); + cy.get('[data-cy=confirmAISelectionPrompt').should('be.visible'); + cy.get('[data-cy=topicConfirmButton]').click(); + cy.wait('@updateWorkflow'); + cy.get('[data-cy=selected-topic]').should('contain.text', 'test AI topic sentence'); + cy.get('[data-cy=ai-bubble]').should('be.visible'); // AI bubble is displayed privately to indicate the topic selection + // AI bubble should not be displayed on public page because the user selected it and thus approves of it cy.get('[data-cy=viewPublicWorkflowButton]').should('be.visible').click(); - cy.contains('goodTopic').should('exist'); + cy.get('[data-cy=selected-topic]').should('contain.text', 'test AI topic sentence'); + cy.get('[data-cy=ai-bubble]').should('not.exist'); }); it('should have mode tooltip', () => { cy.visit('/my-workflows/github.com/A/g'); @@ -324,12 +401,17 @@ describe('Dockstore my workflows part 2', () => { statusCode: 200, }); }); - // doiResponse.json has a workflow version with a DOI - cy.fixture('doiResponse.json').then((json) => { - cy.intercept('PUT', '/api/**/requestDOI/*', { + // Return a 200 for requestDOI. The response is not used. + cy.intercept('PUT', '/api/**/requestDOI/*', { + statusCode: 200, + }); + // getWorkflowWithDoi.json has a workflow version with a DOI. + // This endpoint is called after a DOI is requested. + cy.fixture('getWorkflowWithDoi.json').then((json) => { + cy.intercept('GET', '/api/workflows/11?include=versions', { body: json, statusCode: 200, - }); + }).as('getWorkflowAfterRequestDoi'); }); // orcidExportResponse.json has a workflow version with an ORCID put code cy.fixture('orcidExportResponse.json').then((json) => { @@ -339,13 +421,18 @@ describe('Dockstore my workflows part 2', () => { }); }); - cy.get('[data-cy=workflow-version-DOI-badge]').should('not.exist'); // Make sure there are no existing Zenodo badges + // Make sure there are no existing Zenodo badges + cy.get('[data-cy=concept-DOI-badge]').should('not.exist'); + cy.get('[data-cy=version-DOI-badge]').should('not.exist'); gotoVersionsAndClickActions(); // Request DOI cy.get('[data-cy=dockstore-request-doi-button]').click(); cy.get('[data-cy=export-button').should('be.enabled'); cy.get('[data-cy=export-button').click(); - cy.get('[data-cy=workflow-version-DOI-badge]').its('length').should('be.gt', 0); // Should have a DOI badge now + // Should have DOI badges now + cy.get('[data-cy=user-DOI-icon]').should('be.visible'); + cy.get('[data-cy=concept-DOI-badge]').should('be.visible'); + cy.get('[data-cy=version-DOI-badge]').should('be.visible'); cy.get('td').contains('Actions').click(); cy.get('[data-cy=dockstore-request-doi-button').should('not.exist'); // Should not be able to request another DOI @@ -371,7 +458,7 @@ describe('Dockstore my workflows part 2', () => { // Should not be able to refresh a dockstore.yml workflow version goToTab('Versions'); - cy.contains('button', 'Actions').should('be.visible').click(); + cy.contains('button', 'Actions').click(); cy.contains('button', 'Refresh Version').should('be.disabled'); cy.get('body').type('{esc}'); @@ -398,7 +485,7 @@ describe('Dockstore my workflows part 2', () => { cy.visit('/my-workflows/github.com/A/l'); cy.url().should('eq', Cypress.config().baseUrl + '/my-workflows/github.com/A/l'); goToTab('Versions'); - cy.contains('button', 'Actions').should('be.visible').click(); + cy.contains('button', 'Actions').click(); cy.contains('button', 'Refresh Version').should('not.be.disabled'); }); @@ -546,7 +633,7 @@ describe('Dockstore my workflows part 3', () => { cy.get('#publishButton').should('contain', 'Publish').should('be.visible'); goToTab('Versions'); - cy.contains('button', 'Actions').should('be.visible').click(); + cy.contains('button', 'Actions').click(); cy.get('[data-cy=set-default-version-button]').should('be.visible').click(); cy.wait(1000); cy.get('#publishButton').should('contain', 'Publish').should('be.visible').click(); @@ -618,3 +705,25 @@ describe('Should handle no workflows correctly', () => { cy.contains('Register a Workflow'); }); }); +describe('GitHub App installation', () => { + resetDB(); + setTokenUserViewPort(); + it('Should display a warning when the GitHub app is not installed', () => { + invokeSql("update workflow set mode='DOCKSTORE_YML'"); + // Warning should not appear on private page if not uninstalled + cy.intercept('GET', '/api/entries/*/syncStatus', { + body: { gitHubAppInstalled: true }, + }); + cy.visit('/my-workflows/github.com/A/l'); + cy.get('mat-card').should('not.contain', 'uninstalled'); + // Warning should appear on private page if uninstalled + cy.intercept('GET', '/api/entries/*/syncStatus', { + body: { gitHubAppInstalled: false }, + }); + cy.reload(); + cy.get('mat-card').should('contain', 'uninstalled'); + // Warning should not appear on public page + cy.visit('/workflows/github.com/A/l'); + cy.get('mat-card').should('not.contain', 'uninstalled'); + }); +}); diff --git a/cypress/e2e/group2/notebooks.ts b/cypress/e2e/group2/notebooks.ts index 36fac82a9d..7792823c52 100644 --- a/cypress/e2e/group2/notebooks.ts +++ b/cypress/e2e/group2/notebooks.ts @@ -131,6 +131,29 @@ describe('Dockstore notebooks', () => { cy.get('td').contains('Actions').click(); snapshot(); }); + + it('should have discover existing notebooks button', () => { + cy.fixture('myWorkflows.json').then((json) => { + cy.intercept('PATCH', '/api/users/1/workflows', { + body: json, + statusCode: 200, + }); + }); + + cy.visit('/my-notebooks'); + cy.get('[data-cy=myWorkflowsMoreActionButtons]').should('be.visible').click(); + cy.fixture('myNotebooks.json').then((json) => { + cy.intercept('GET', '/api/users/1/notebooks', { + body: json, + statusCode: 200, + }).as('getNotebooks'); + }); + cy.get('[data-cy=addToExistingWorkflows]').should('be.visible').click(); + + cy.wait('@getNotebooks'); + cy.contains('addedthisnotebookviasync'); + }); + it('should have Preview tab with highlighted syntax', () => { substituteNotebookContent(['{ "cell_type": "code", "source": [ "import xyz;" ] }']); cy.visit('/notebooks/' + name); @@ -167,6 +190,7 @@ describe('Dockstore notebooks', () => { { path: '/notebook.ipynb', content: '{ "nbformat_major": 4, "nbformat_minor": 0, "cells": [' + cells.join(',') + '] }', + state: 'COMPLETE', }, ]); } diff --git a/cypress/e2e/group2/organizations.ts b/cypress/e2e/group2/organizations.ts index 6ac088b544..deddba8abf 100644 --- a/cypress/e2e/group2/organizations.ts +++ b/cypress/e2e/group2/organizations.ts @@ -23,6 +23,8 @@ import { addToCollection, insertNotebooks, resetDBWithService, + createOrganization, + invokeSql, } from '../../support/commands'; import { TokenSource } from '../../../src/app/shared/enum/token-source.enum'; @@ -278,6 +280,7 @@ describe('Dockstore Organizations', () => { cy.url().should('include', url); cy.get('[data-cy=cancel-remove-entry-from-org]').click(); cy.url().should('include', url); + cy.get('app-collection-entry-confirm-remove').should('not.exist'); cy.get('#removeEntryButton').click(); cy.url().should('include', url); cy.get('[data-cy=accept-remove-entry-from-org]').click(); @@ -291,7 +294,6 @@ describe('Dockstore Organizations', () => { cy.contains('This collection has no associated entries'); cy.visit('/organizations/Potatoe'); cy.contains('Members').should('be.visible'); - approvePotatoOrganization(); for (const url of ['/organizations', '/organizations/Potatoe', '/organizations/Potatoe/collections/veryFakeCollectionName']) { cy.visit(url); @@ -476,4 +478,24 @@ describe('Dockstore Organizations', () => { cy.contains('No collections with the alias incorrectAlias found'); }); }); + + describe('Sort organizations', () => { + it('Sort by name', () => { + cy.visit('/organizations'); + createOrganization('Apple', 'Apple', 'Keeps the doctor away', 'OICR', 'https://www.google.com', 'abcd@abcd.com'); + invokeSql("update organization set status='APPROVED' where name like 'Apple'"); + cy.visit('/organizations'); + createOrganization('grapes', 'grapes', 'Walked up to the lemonade stand', 'Toronto', 'https://www.google.com', '123@123.com'); + invokeSql("update organization set status='APPROVED' where name like 'grapes'"); + cy.visit('/organizations'); + cy.contains('Potatoe'); + cy.contains('Apple'); + cy.contains('grapes'); + cy.get('mat-select[formControlName=sort]').click(); + cy.get('mat-option').contains('Name').click(); + cy.get('mat-card').eq(0).contains('Apple'); + cy.get('mat-card').eq(1).contains('grapes'); + cy.get('mat-card').eq(2).contains('Potatoe'); + }); + }); }); diff --git a/cypress/e2e/group2/sharedWorkflows.ts b/cypress/e2e/group2/sharedWorkflows.ts index b84acdf2d4..e3a51eb8a6 100644 --- a/cypress/e2e/group2/sharedWorkflows.ts +++ b/cypress/e2e/group2/sharedWorkflows.ts @@ -21,7 +21,7 @@ import { resetDB, setTokenUserViewPort, } from '../../support/commands'; - +import { workflowEntryTypeMetadata } from '../../../src/app/test/mocked-objects'; import { BioWorkflow } from '../../../src/app/shared/openapi/model/bioWorkflow'; describe('Shared with me workflow test from my-workflows', () => { resetDB(); @@ -74,6 +74,7 @@ describe('Shared with me workflow test from my-workflows', () => { return { aliases: undefined, authors: [], + conceptDois: {}, checker_id: undefined, dbCreateDate: 1530729459942, dbUpdateDate: 1530729459942, @@ -82,6 +83,7 @@ describe('Shared with me workflow test from my-workflows', () => { description: undefined, descriptorType: 'WDL', email: undefined, + entryTypeMetadata: workflowEntryTypeMetadata, full_workflow_path: 'dockstore.org/user_B/' + name, gitUrl: '', has_checker: false, @@ -123,6 +125,7 @@ describe('Shared with me workflow test from my-workflows', () => { dirtyBit: false, doiStatus: 'NOT_REQUESTED', doiURL: undefined, + dois: {}, hidden: false, id: 1, input_file_formats: [], @@ -163,6 +166,7 @@ describe('Shared with me workflow test from my-workflows', () => { dirtyBit: false, doiStatus: 'NOT_REQUESTED', doiURL: undefined, + dois: {}, hidden: false, id: 2, input_file_formats: [], diff --git a/cypress/e2e/group3/archival.ts b/cypress/e2e/group3/archival.ts index 6b76713e31..758822c332 100644 --- a/cypress/e2e/group3/archival.ts +++ b/cypress/e2e/group3/archival.ts @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { resetDB, setTokenUserViewPort, insertNotebooks, insertAppTools, invokeSql, goToTab } from '../../support/commands'; +import { resetDB, setTokenUserViewPort, insertNotebooks, insertAppTools, invokeSql } from '../../support/commands'; describe('Entry Archival', () => { resetDB(); diff --git a/cypress/e2e/group3/githubAppTools.ts b/cypress/e2e/group3/githubAppTools.ts index 39d12c1bf5..653a93d054 100644 --- a/cypress/e2e/group3/githubAppTools.ts +++ b/cypress/e2e/group3/githubAppTools.ts @@ -98,14 +98,17 @@ describe('GitHub App Tools', () => { cy.contains('Tool storage type').click(); cy.contains('Close').click(); + cy.intercept('GET', '/api/lambdaEvents/**').as('lambdaEvents1'); // GitHub App Logs cy.contains('Apps Logs').click(); + cy.wait('@lambdaEvents1'); cy.contains('There were problems retrieving the GitHub App logs for this organization.'); cy.contains('Close').click(); cy.intercept('GET', '/api/lambdaEvents/**', { body: [], - }).as('lambdaEvents'); + }).as('lambdaEvents2'); cy.contains('Apps Logs').click(); + cy.wait('@lambdaEvents2'); cy.contains('There are no GitHub App logs for this organization.'); cy.contains('Close').click(); @@ -142,7 +145,7 @@ describe('GitHub App Tools', () => { 'Organization', 'Repository', 'Reference', - 'Success', + 'Status', 'Type', ]; appLogColumns.forEach((column) => cy.contains(column)); @@ -166,7 +169,7 @@ describe('GitHub App Tools', () => { goToTab('Versions'); isActiveTab('Versions'); cy.get('table>tbody>tr').should('have.length', 1); - cy.contains('button', 'Actions').should('be.visible').click(); + cy.contains('button', 'Actions').click(); cy.contains('button', 'Refresh Version').should('be.disabled'); // Fix hiding a version. You have to refresh the page to see that it was hidden in the table @@ -177,7 +180,7 @@ describe('GitHub App Tools', () => { cy.get('[data-cy=save-version]').click(); cy.get('[data-cy=valid').should('exist'); cy.get('[data-cy=hidden').should('exist'); - cy.contains('button', 'Actions').should('be.visible').click(); + cy.contains('button', 'Actions').click(); cy.contains('Edit Info').click(); cy.get('[type="checkbox"]').uncheck(); cy.get('[data-cy=save-version]').click(); @@ -206,7 +209,7 @@ describe('GitHub App Tools', () => { cy.contains('Default Version Required'); cy.get('[data-cy=close-dialog-button]').click(); goToTab('Versions'); - cy.contains('button', 'Actions').should('be.visible').click(); + cy.contains('button', 'Actions').click(); cy.contains('button', 'Set as Default Version').should('be.visible').click(); cy.wait(500); cy.get('#publishButton').should('not.be.disabled'); diff --git a/cypress/e2e/group3/mytools.ts b/cypress/e2e/group3/mytools.ts index 9bf0a2fdd2..45f2a8c884 100644 --- a/cypress/e2e/group3/mytools.ts +++ b/cypress/e2e/group3/mytools.ts @@ -49,10 +49,7 @@ describe('Dockstore my tools', () => { }); }); - // The "discover existing tools" functionality was removed in: - // https://github.com/dockstore/dockstore-ui2/pull/1919 - // TODO Unskip this test when we add it back. - it.skip('Should have discover existing tools button', () => { + it('Should have discover existing tools button', () => { cy.fixture('myWorkflows.json').then((json) => { cy.intercept('PATCH', '/api/users/1/workflows', { body: json, @@ -61,14 +58,28 @@ describe('Dockstore my tools', () => { }); cy.get('[data-cy=myToolsMoreActionButtons]').should('be.visible').click(); + cy.fixture('myTools.json').then((json) => { + cy.intercept('GET', '/api/users/1/containers', { + body: json, + statusCode: 200, + }).as('getContainers'); + }); + cy.intercept('GET', '/api/users/1/appTools', { + body: {}, + statusCode: 200, + }).as('getAppTools'); cy.get('[data-cy=addToExistingTools]').should('be.visible').click(); - cy.contains('addedthisworkflowviasync'); + + cy.wait('@getContainers'); + cy.wait('@getAppTools'); + cy.contains('addedthistoolviasync'); }); describe('Should contain extended DockstoreTool properties', () => { it('visit another page then come back', () => { // The seemingly unnecessary visits are due to a detached-from-dom error even using cy.get().click(); cy.intercept('api/containers/*?include=validations').as('getTool'); + cy.intercept('PUT', 'api/containers/*').as('updateTool'); cy.visit('/my-tools'); cy.wait('@getTool'); selectUnpublishedTab('A2'); @@ -86,6 +97,7 @@ describe('Dockstore my tools', () => { cy.contains('button', ' Edit ').click(); cy.get('input').first().should('be.visible').clear().type('/thing/Dockerfile'); cy.contains('button', ' Save ').click(); + cy.wait('@updateTool'); cy.visit('/my-tools/quay.io/A2/b1'); cy.contains('/thing/Dockerfile'); // Change the dockerfile path back @@ -95,28 +107,38 @@ describe('Dockstore my tools', () => { cy.visit('/my-tools/quay.io/A2/b1'); cy.contains('/Dockerfile'); - // // Topic Editing + // Topic Editing let privateEntryURI = '/my-tools/github.com/A2/a'; cy.visit(privateEntryURI); + // Modify the manual topic, but don't save it cy.get('[data-cy=topicEditButton]').click(); - cy.get('[data-cy=topicInput]').clear().type('badTopic'); + cy.get('[data-cy=topicInput]').clear(); // Unsafe to chain commands after clear() + cy.get('[data-cy=topicInput]').type('badTopic'); cy.get('[data-cy=topicCancelButton]').click(); - cy.contains('badTopic').should('not.exist'); + cy.get('[data-cy=selected-topic]').should('not.contain.text', 'badTopic'); + // Modify the manual topic and save it cy.get('[data-cy=topicEditButton]').click(); - cy.get('[data-cy=topicInput]').clear().type('goodTopic'); + cy.get('[data-cy=topicInput]').clear(); // Unsafe to chain commands after clear() + cy.get('[data-cy=topicInput]').type('goodTopic'); + cy.get('[data-cy=topicSaveButton]').click(); + cy.wait('@updateTool'); + // Check that the manual topic is saved cy.get('[data-cy=topicEditButton]').click(); - cy.contains('goodTopic').should('exist'); + cy.get('[data-cy=topicInput]').should('have.value', 'goodTopic'); + cy.get('[data-cy=topicCancelButton]').click(); - // Check public view - cy.visit(privateEntryURI); + // Check public view. Manual topic should not be displayed because it's not the selected topic cy.get('[data-cy=viewPublicToolButton]').should('be.visible').click(); - cy.contains('goodTopic').should('not.exist'); + cy.get('[data-cy=selected-topic]').should('not.contain.text', 'goodTopic'); + // Select the manual topic and verify that it's displayed publicly cy.visit(privateEntryURI); + cy.get('[data-cy=topicEditButton]').click(); cy.get('.mat-radio-label').contains('Manual').click(); - cy.visit(privateEntryURI); + cy.get('[data-cy=topicSaveButton]').click(); + cy.wait('@updateTool'); cy.get('[data-cy=viewPublicToolButton]').should('be.visible').click(); - cy.contains('goodTopic').should('exist'); + cy.get('[data-cy=selected-topic]').should('contain.text', 'goodTopic'); }); it('should be able to add labels', () => { cy.contains('quay.io/A2/a:latest'); @@ -134,7 +156,7 @@ describe('Dockstore my tools', () => { selectTool('b1'); cy.contains('Versions').click(); cy.contains('button', 'Actions').should('be.visible').click(); - cy.contains('button:visible', 'Edit').should('be.visible').click(); + cy.get('[data-cy=editTagButton]').should('be.visible').click(); // For some unknown reason, Cypress likes to type '/test.wdl.json' in the wrong place cy.wait(5000); cy.get('input[data-cy=addWDLField]').should('be.visible').should('have.value', '').type('/test.wdl.json'); @@ -142,7 +164,7 @@ describe('Dockstore my tools', () => { cy.get('#saveVersionModal').click(); cy.get('#saveVersionModal').should('not.exist'); cy.contains('button', 'Actions').should('be.visible').click(); - cy.contains('button:visible', 'Edit').should('be.visible').click(); + cy.get('[data-cy=editTagButton]').should('be.visible').click(); cy.get('#removeCWLTestParameterFileButton').click(); cy.get('#removeWDLTestParameterFileButton').click(); cy.get('#saveVersionModal').click(); @@ -219,11 +241,9 @@ describe('Dockstore my tools', () => { it('register tool', () => { const toolObject: DockstoreTool = { id: 40000, - author: undefined, description: undefined, labels: [], users: [{ id: 1, username: 'user_A', isAdmin: false, name: 'user_A' }], - email: undefined, defaultVersion: undefined, lastUpdated: 1482334377743, gitUrl: 'git@github.com:testnamespace/testname.git', @@ -289,11 +309,9 @@ describe('Dockstore my tools', () => { it('register tool', () => { const toolObject: DockstoreTool = { id: 40000, - author: undefined, description: undefined, labels: [], users: [{ id: 1, username: 'user_A', isAdmin: false, name: 'user_A' }], - email: undefined, defaultVersion: undefined, lastUpdated: 1482334377743, gitUrl: 'git@github.com:testnamespace/testname.git', @@ -540,7 +558,8 @@ describe('Dockstore my tools', () => { cy.visit('/containers/quay.io/A2/a'); goToTab('Versions'); cy.get('[data-cy=actionsButton]').should('be.visible').first().click(); - cy.get('[data-cy=ok-dialog-close-button]').scrollIntoView().should('be.visible').click(); + cy.get('[data-cy=ok-dialog-close-button]').scrollIntoView().should('be.visible'); + cy.get('[data-cy=ok-dialog-close-button]').click(); }); }); }); diff --git a/cypress/e2e/group3/starErrorMessage.ts b/cypress/e2e/group3/starErrorMessage.ts index 48ed4e6df7..acd93a7e48 100644 --- a/cypress/e2e/group3/starErrorMessage.ts +++ b/cypress/e2e/group3/starErrorMessage.ts @@ -39,6 +39,7 @@ describe('Tool and workflow starring error messages', () => { cy.visit(url); cy.get('#starringButtonIcon').click(); + cy.get('#starCountButton').should('contain', 1); cy.intercept('PUT', routePath, { body: 'You cannot unstar the ' + type + ' ' + name + ' because you have not starred it.', diff --git a/cypress/e2e/immutableDatabaseTests/app-spec.ts b/cypress/e2e/immutableDatabaseTests/app-spec.ts index ed834ccf79..813091625c 100644 --- a/cypress/e2e/immutableDatabaseTests/app-spec.ts +++ b/cypress/e2e/immutableDatabaseTests/app-spec.ts @@ -27,26 +27,10 @@ describe('Logged in Dockstore Home', () => { // expect(browser.getLocationAbsUrl()).toMatch("/"); }); - it('should have the mastodon or twitter timeline', () => { + it('should have the mastodon timeline', () => { cy.scrollTo('bottom'); - cy.get('[data-cy=mt-toot],.twitter-timeline').should('be.visible'); + cy.get('[data-cy=mt-toot]').should('be.visible'); }); - - function starColumn(url: string, type: string) { - if (type === 'workflow') { - cy.get('[data-cy=workflows-tab]').click(); - } - cy.get('.mat-icon.star-icon').should('not.exist'); - cy.visit(url); - cy.get('#starringButton').click(); - cy.visit(''); - if (type === 'workflow') { - cy.get('[data-cy=workflows-tab]').click(); - } - cy.get('.mat-icon.star-icon').should('exist'); - cy.visit(url); - cy.get('#starringButton').click(); - } }); describe('Logged out Dockstore Home', () => { diff --git a/cypress/e2e/immutableDatabaseTests/dropdown.ts b/cypress/e2e/immutableDatabaseTests/dropdown.ts index 027007816c..25a35bf798 100644 --- a/cypress/e2e/immutableDatabaseTests/dropdown.ts +++ b/cypress/e2e/immutableDatabaseTests/dropdown.ts @@ -294,7 +294,7 @@ describe('Dropdown test', () => { // Route all DELETE API calls to organizations respond with with an empty JSON object cy.intercept('DELETE', '*/organizations/*', { body: [], - }); + }).as('delete'); // Route GET API call to user/membership with the mocked membership JSON object after first deletion cy.intercept('GET', '*/users/user/memberships', { @@ -307,6 +307,7 @@ describe('Dropdown test', () => { cy.contains('div', 'Delete Organization').within(() => { cy.contains('button', 'Delete').click(); }); + cy.wait('@delete'); cy.get('#my-pending-org-card-0').should('be.visible'); cy.get('#my-rejected-org-card-0').should('not.exist'); diff --git a/cypress/e2e/immutableDatabaseTests/jsonld.ts b/cypress/e2e/immutableDatabaseTests/jsonld.ts index 1eb6bd02f8..8d32975016 100644 --- a/cypress/e2e/immutableDatabaseTests/jsonld.ts +++ b/cypress/e2e/immutableDatabaseTests/jsonld.ts @@ -22,7 +22,7 @@ describe('JSON-LD', () => { cy.visit(''); // Two json-lds cy.get('[type="application/ld+json"]').should('have.length', 2); - cy.get('[type="application/ld+json"]').should('contain.text', '"description": "Dockstore, developed'); + cy.get('[type="application/ld+json"]').should('contain.text', '"description": "Dockstore is an open platform'); cy.get('[type="application/ld+json"]').should('contain.text', '"audience": "Bioinformaticians"'); }); }); diff --git a/cypress/e2e/immutableDatabaseTests/linkCheck.ts b/cypress/e2e/immutableDatabaseTests/linkCheck.ts new file mode 100644 index 0000000000..7b36c7e8f3 --- /dev/null +++ b/cypress/e2e/immutableDatabaseTests/linkCheck.ts @@ -0,0 +1,121 @@ +import { setTokenUserViewPort } from '../../support/commands'; + +// Formats paths to be displayed in an error log +function formatPaths(paths: string[]): string { + let formattedPaths = ''; + paths.forEach((path) => { + formattedPaths += '\n- ' + path; + }); + return formattedPaths; +} + +describe('Find broken anchor links', () => { + setTokenUserViewPort(); + + // These links should be intentionally skipped + const skippedUrls: string[] = [ + 'https://twitter.com/DockstoreOrg', // Test only fails because it redirects to login page if not logged in + ]; + + let visitedUrls: string[] = []; + + function isDynamicUrl(url: string): boolean { + return url.includes('/my-workflows/') || url.includes('/my-tools/') || url.includes('/my-notebooks/'); + } + + function checkUrls(path: string) { + let brokenUrls = []; + cy.visit(path).wait(1000); // Temporary solution to ensure the page loads entirely + cy.get('a') + .each((anchor) => { + cy.get(anchor).then((anchor) => { + const href = anchor.prop('href'); + // Send requests to non-dynamic URLs that haven't yet been visited and shouldn't be skipped + if (href && !skippedUrls.includes(href) && !visitedUrls.includes(href) && !isDynamicUrl(href)) { + cy.request({ + url: href, + failOnStatusCode: false, + }).then((result) => { + if (result.status != 200) { + brokenUrls.push(href); + cy.log(`${result.status}: ${href}`); + } else { + visitedUrls.push(href); // Add successful links to visitedUrls so that they won't be visited again + } + }); + } + }); + }) + .then(() => { + if (brokenUrls.length) { + throw new Error(`Broken links at "${path}":` + formatPaths(brokenUrls)); + } + }); + } + + const urlPages: string = ['/', '/sitemap', '/about', '/funding', '/docs', '/dashboard', '/quick-start']; + + urlPages.forEach((urlPage) => { + it(`anchor links at "${urlPage}" should work`, () => { + checkUrls(urlPage); + }); + }); +}); + +describe('Find broken image links', () => { + setTokenUserViewPort(); + + const skippedImages: string = [ + 'http://localhost:4200/', // Failing stock avatar image in navbar + ]; + + let visitedImages: string = []; + + function checkImages(path: string, selector: string) { + let brokenImages = []; + cy.visit(path).wait(1000); + cy.get('app-root').should('be.visible'); + cy.get('img') + .each((image) => { + cy.get(image).then((image) => { + const src = image.prop('src'); + if (!skippedImages.includes(src) && !visitedImages.includes(src)) { + if (image.prop('naturalWidth') === 0) { + brokenImages.push(src); + cy.log(`image not visible: ${src}`); + } else { + visitedImages.push(src); + } + } + }); + }) + .then(() => { + if (brokenImages.length) { + throw new Error(`Broken images at "${path}":` + formatPaths(brokenImages)); + } + }); + } + + const imagePages: string = [ + '/', + '/about', + '/funding', + '/docs', + '/dashboard', + '/workflows', + '/notebooks', + '/services', + '/apptools', + '/search-workflows', + '/tools', + '/containers', + '/search-containers', + '/accounts', + ]; + + imagePages.forEach((imagePage) => { + it(`images at "${imagePage}" should work`, () => { + checkImages(imagePage); + }); + }); +}); diff --git a/cypress/e2e/immutableDatabaseTests/notfound.ts b/cypress/e2e/immutableDatabaseTests/notfound.ts index f226c6b15c..99671e2b4a 100644 --- a/cypress/e2e/immutableDatabaseTests/notfound.ts +++ b/cypress/e2e/immutableDatabaseTests/notfound.ts @@ -22,5 +22,37 @@ describe('Dockstore not found page', () => { cy.visit('/bewareoftheleopard'); cy.contains("Don't panic."); cy.contains('Page Not Found'); + cy.url().should('eq', Cypress.config().baseUrl + '/bewareoftheleopard'); + + cy.visit('/workflows/asdf'); + cy.contains('Page Not Found'); + cy.url().should('eq', Cypress.config().baseUrl + '/workflows/asdf'); + + cy.visit('/organizations/abcdefg'); + cy.url().should('eq', Cypress.config().baseUrl + '/organizations/abcdefg'); + + cy.visit('/users/notarealuser'); + cy.contains('Page Not Found'); + cy.url().should('eq', Cypress.config().baseUrl + '/users/notarealuser'); + + cy.visit('/notebooks/github.con/entrywithtypo'); + cy.contains('Page Not Found'); + cy.url().should('eq', Cypress.config().baseUrl + '/notebooks/github.con/entrywithtypo'); + + cy.visit('/services/github.com/invalidentrypath'); + cy.contains('Page Not Found'); + cy.url().should('eq', Cypress.config().baseUrl + '/services/github.com/invalidentrypath'); + + cy.visit('/apptools/ghjkl'); + cy.contains('Page Not Found'); + cy.url().should('eq', Cypress.config().baseUrl + '/apptools/ghjkl'); + + cy.visit('/containers/thistooldoesnotexist'); + cy.contains('Page Not Found'); + cy.url().should('eq', Cypress.config().baseUrl + '/containers/thistooldoesnotexist'); + + cy.visit('/tools/lmnop'); + cy.contains('Page Not Found'); + cy.url().should('eq', Cypress.config().baseUrl + '/tools/lmnop'); }); }); diff --git a/cypress/e2e/immutableDatabaseTests/platform-partner.ts b/cypress/e2e/immutableDatabaseTests/platform-partner.ts index 0d47708209..f092702289 100644 --- a/cypress/e2e/immutableDatabaseTests/platform-partner.ts +++ b/cypress/e2e/immutableDatabaseTests/platform-partner.ts @@ -19,15 +19,14 @@ import { setTokenUserViewPortPlatformPartner, setPlatformPartnerRole } from '../ describe('Platform Partner UI', () => { setTokenUserViewPortPlatformPartner(); beforeEach(() => { + setPlatformPartnerRole(); cy.visit(''); - // Select dropdown cy.get('[data-cy=dropdown-main]:visible').click(); }); describe('Profile', () => { it('Platform Partner status indicated on profile page', () => { - setPlatformPartnerRole(); cy.get('#dropdown-accounts').click(); cy.get('[data-cy=account-is-platform-partner]').should('exist'); }); diff --git a/cypress/e2e/immutableDatabaseTests/searchTable.ts b/cypress/e2e/immutableDatabaseTests/searchTable.ts index 8b7ca4d8bc..e71196d1ef 100644 --- a/cypress/e2e/immutableDatabaseTests/searchTable.ts +++ b/cypress/e2e/immutableDatabaseTests/searchTable.ts @@ -394,28 +394,32 @@ describe('search table items per page', () => { cy.get('[data-cy=advanced-search]').click(); cy.get('[data-cy=dropdown]').click(); - cy.get('[data-cy=file_select').should('not.exist'); - cy.get('[data-cy=desc_select').should('be.visible').click(); + cy.get('[data-cy=file_select]').should('not.exist'); + cy.get('[data-cy=desc_select]').should('be.visible').click(); cy.get('[data-cy=NOTFilter]').click().type('garyluu'); cy.get('[data-cy=confirm-search]').click(); + // Check that the advanced search dialog box has been closed + cy.get('app-advancedsearch').should('not.exist'); cy.get('[data-cy=advanced-search]').click(); cy.get('[data-cy=clear-advanced-search]').click(); + cy.get('app-advancedsearch').should('not.exist'); cy.get('[data-cy=advanced-search]').click(); cy.get('[data-cy=dropdown]').click(); - cy.get('[data-cy=desc_select').should('be.visible').click(); + cy.get('[data-cy=desc_select]').should('be.visible').click(); cy.get('[data-cy=dropdown]').click(); - cy.get('[data-cy=desc_select').should('not.exist'); - cy.get('[data-cy=file_select').should('be.visible').click(); + cy.get('[data-cy=desc_select]').should('not.exist'); + cy.get('[data-cy=file_select]').should('be.visible').click(); cy.get('[data-cy=ANDNoSplitFilter]').click().type('gary'); cy.get('[data-cy=ORFilter]').click().type('A2'); cy.get('[data-cy=NOTFilter]').click().type('b3'); cy.get('[data-cy=confirm-search]').click(); + cy.get('app-advancedsearch').should('not.exist'); cy.get('[data-cy=advanced-search]').click(); cy.get('[data-cy=clear-advanced-search]').click(); diff --git a/cypress/e2e/immutableDatabaseTests/services.ts b/cypress/e2e/immutableDatabaseTests/services.ts index 7ab4d6511a..705f62b6d7 100644 --- a/cypress/e2e/immutableDatabaseTests/services.ts +++ b/cypress/e2e/immutableDatabaseTests/services.ts @@ -27,21 +27,28 @@ import { describe('Dockstore Home', () => { describe('GitHub App Callback Routing', () => { setTokenUserViewPort(); + beforeEach(() => { + cy.intercept('GET', '/api/metadata/entryTypeMetadataList').as('getMetadata'); + }); it('Redirects to my-tools', () => { cy.visit('/githubCallback?state=/my-tools/quay.io/A2/b1'); - cy.url().should('contain', '/my-tools/quay.io/A2/b1'); + cy.wait('@getMetadata'); + cy.url().should('contain', '%2Fmy-tools%2Fquay.io%2FA2%2Fb1'); }); it('Redirects to my-workflows', () => { cy.visit('/githubCallback?state=/my-workflows/github.com/A/l'); - cy.url().should('contain', '/my-workflows/github.com/A/l'); + cy.wait('@getMetadata'); + cy.url().should('contain', '%2Fmy-workflows%2Fgithub.com%2FA%2Fl'); }); it('Redirects to my-services', () => { cy.visit('/githubCallback?state=/services/github.com/garyluu/another-test-service'); - cy.url().should('contain', '/services/github.com/garyluu/another-test-service'); + cy.wait('@getMetadata'); + cy.url().should('contain', '%2Fservices%2Fgithub.com%2Fgaryluu%2Fanother-test-service'); }); it('Redirects to dashboard', () => { cy.visit('githubCallback?state=/dashboard'); - cy.url().should('contain', '/dashboard'); + cy.wait('@getMetadata'); + cy.url().should('contain', '%2Fdashboard'); }); }); @@ -50,6 +57,7 @@ describe('Dockstore Home', () => { cy.visit('/services'); cy.url().should('contain', 'services'); cy.get('[data-cy=header]').contains('h3', 'Services'); + cy.get('mat-header-cell').contains('Format').should('not.exist'); cy.contains('Search services'); cy.contains('garyluu/another-test-service'); }); diff --git a/cypress/e2e/immutableDatabaseTests/toolDetails.ts b/cypress/e2e/immutableDatabaseTests/toolDetails.ts index e53908723d..befd544b78 100644 --- a/cypress/e2e/immutableDatabaseTests/toolDetails.ts +++ b/cypress/e2e/immutableDatabaseTests/toolDetails.ts @@ -35,15 +35,15 @@ describe('Variations of URL', () => { }); it('Should redirect to canonical url (tab)', () => { cy.visit('/containers/quay.io/A2/a?tab=files'); - cy.url().should('eq', Cypress.config().baseUrl + '/containers/quay.io/A2/a:latest?tab=files'); + cy.url().should('contain', Cypress.config().baseUrl + '/containers/quay.io/A2/a:latest?tab=files'); }); it('Should redirect to canonical url (tab + version)', () => { cy.visit('/containers/quay.io/A2/a:latest?tab=files'); - cy.url().should('eq', Cypress.config().baseUrl + '/containers/quay.io/A2/a:latest?tab=files'); + cy.url().should('contain', Cypress.config().baseUrl + '/containers/quay.io/A2/a:latest?tab=files'); }); it('Should redirect to canonical url (tools + encoding + tab + version)', () => { cy.visit('/tools/quay.io%2FA2%2Fa:latest?tab=files'); - cy.url().should('eq', Cypress.config().baseUrl + '/containers/quay.io/A2/a:latest?tab=files'); + cy.url().should('contain', Cypress.config().baseUrl + '/containers/quay.io/A2/a:latest?tab=files'); }); }); @@ -74,7 +74,7 @@ describe('Dockstore Tool Details of quay.io/A2/a', () => { describe('Change tab to files', () => { beforeEach(() => { goToTab('Files'); - cy.url().should('eq', Cypress.config().baseUrl + '/containers/quay.io/A2/a:latest?tab=files'); + cy.url().should('contain', Cypress.config().baseUrl + '/containers/quay.io/A2/a:latest?tab=files'); }); it('Should have Dockerfile tab selected', () => { diff --git a/cypress/e2e/immutableDatabaseTests/workflowDetails.ts b/cypress/e2e/immutableDatabaseTests/workflowDetails.ts index bb3fe5e26a..398189bcf3 100644 --- a/cypress/e2e/immutableDatabaseTests/workflowDetails.ts +++ b/cypress/e2e/immutableDatabaseTests/workflowDetails.ts @@ -27,15 +27,15 @@ describe('Variations of URL', () => { }); it('Should redirect to canonical url (tab)', () => { cy.visit('/workflows/github.com/A/l?tab=files'); - cy.url().should('eq', Cypress.config().baseUrl + '/workflows/github.com/A/l:master?tab=files'); + cy.url().should('contain', Cypress.config().baseUrl + '/workflows/github.com/A/l:master?tab=files'); }); it('Should redirect to canonical url (version + tab)', () => { cy.visit('/workflows/github.com/A/l:master?tab=files'); - cy.url().should('eq', Cypress.config().baseUrl + '/workflows/github.com/A/l:master?tab=files'); + cy.url().should('contain', Cypress.config().baseUrl + '/workflows/github.com/A/l:master?tab=files'); }); it('Should redirect to canonical url (encoding + version + tab)', () => { cy.visit('/workflows/github.com%2FA%2Fl:master?tab=files'); - cy.url().should('eq', Cypress.config().baseUrl + '/workflows/github.com/A/l:master?tab=files'); + cy.url().should('contain', Cypress.config().baseUrl + '/workflows/github.com/A/l:master?tab=files'); }); }); @@ -74,7 +74,7 @@ describe('Dockstore Workflow Details', () => { describe('Change tab to files', () => { beforeEach(() => { goToTab('Files'); - cy.url().should('eq', Cypress.config().baseUrl + '/workflows/github.com/A/l:master?tab=files'); + cy.url().should('contain', Cypress.config().baseUrl + '/workflows/github.com/A/l:master?tab=files'); }); it('Should have Descriptor files tab selected', () => { @@ -168,3 +168,26 @@ describe('Test engine versions', () => { cy.get('[data-cy=engine-versions]').should('be.visible'); }); }); + +describe('Test sourcefile links', () => { + it('Should change the Dockstore URL to include the source file path', () => { + cy.visit('/workflows/github.com/A/l?tab=files'); + cy.url().should('contain', 'file=%2F1st-workflow.cwl'); + goToTab('Configuration'); + cy.url().should('not.contain', 'file='); + }); + + it('Should be able to reference a specific source file in a Dockstore URL', () => { + cy.visit('/workflows/github.com/A/l?tab=files&file=%2Fnonexistent.txt'); + cy.contains('Could not find the specified file'); + cy.url().should('contain', 'file=%2F1st-workflow.cwl'); + cy.visit('/workflows/github.com/A/l?tab=files&file=%2F1st-workflow.cwl'); + cy.contains('1st-workflow.cwl'); + cy.contains('Workflow'); + cy.url().should('contain', 'file=%2F1st-workflow.cwl'); + cy.visit('/workflows/github.com/A/l?tab=files&file=%2Farguments.cwl'); + cy.contains('arguments.cwl'); + cy.contains('CommandLineTool'); + cy.url().should('contain', 'file=%2Farguments.cwl'); + }); +}); diff --git a/cypress/e2e/smokeTests/sharedTests/auth-tests.ts b/cypress/e2e/smokeTests/sharedTests/auth-tests.ts index 786e25458c..60db4cbea7 100644 --- a/cypress/e2e/smokeTests/sharedTests/auth-tests.ts +++ b/cypress/e2e/smokeTests/sharedTests/auth-tests.ts @@ -18,7 +18,6 @@ const username = 'dockstoretestuser4'; // tuples of registry, repo namespace (username), and entry-name (repo name) const toolName = 'dockstore-tool-md5sum'; const toolTuple = ['github.com', username, toolName]; -const workflowTuple = ['github.com', username, 'hello-dockstore-workflow']; // tuple of organization name, collection name const collectionTuple = ['DockstoreAuthTestOrg', 'SimpleCollection']; const hardcodedWaitTime = 4000; @@ -41,6 +40,11 @@ function storeToken() { } } +function hasSandboxZenodo() { + const baseUrl = Cypress.config('baseUrl'); + return baseUrl === 'https://qa.dockstore.org' || baseUrl === 'https://staging.dockstore.org' || baseUrl === 'https://dev.dockstore.net'; +} + function unpublishTool() { it('unpublish the tool', () => { storeToken(); @@ -179,7 +183,9 @@ function toggleHiddenToolVersion() { } function toggleHiddenWorkflowVersion() { - cy.get('[data-cy=versionRow]').last().scrollIntoView().contains('button', 'Actions').should('be.visible').click(); + cy.get('[data-cy=versionRow]').last().scrollIntoView().contains('button', 'Actions').should('be.visible'); + cy.get('[data-cy=versionRow]').last().contains('button', 'Actions').click(); + cy.contains('button', 'Edit').scrollIntoView(); cy.contains('button', 'Edit').click(); // TODO: Use [data-cy=hiddenCheck] -- do after 1.14 deployed cy.contains('div', 'Hidden:').within(() => { @@ -226,7 +232,7 @@ function testTool(registry: string, repo: string, name: string) { }); } -function testWorkflow(registry: string, repo: string, name: string) { +function testWorkflow() { describe('Refresh, publish, unpublish, and restub a workflow', () => { it('refresh and publish', () => { storeToken(); @@ -265,8 +271,22 @@ function testWorkflow(registry: string, repo: string, name: string) { cy.get('#publishButton').contains('Unpublish').click({ force: true }); goToTab('Info'); - cy.contains('button', 'Restub').click(); - cy.contains('button', 'Publish').should('be.disabled'); + + // For now, only restub the workflow in environments that use the sandbox zenodo, + // to avoid the subsequent creation of new versions and auto-generation of real + // zenodo DOIs, which will accumulate over time because they are effectively + // undeletable. + // See https://ucsc-cgl.atlassian.net/browse/SEAB-6508 + if (hasSandboxZenodo()) { + cy.intercept('**/restub').as('restub'); + cy.contains('button', 'Restub').click(); + // Wait for the restub request to complete, so that it does not overlap + // with the subsequent refresh and occasionally trigger a db error on + // the webservice. + // See https://ucsc-cgl.atlassian.net/browse/SEAB-6535 + cy.wait('@restub'); + cy.contains('button', 'Publish').should('be.disabled'); + } cy.get('[data-cy=refreshButton]').click(); goToTab('Versions'); @@ -322,4 +342,4 @@ function testCollection(org: string, collection: string, registry: string, repo: testCollection(collectionTuple[0], collectionTuple[1], toolTuple[0], toolTuple[1], toolTuple[2]); testTool(toolTuple[0], toolTuple[1], toolTuple[2]); -testWorkflow(workflowTuple[0], workflowTuple[1], workflowTuple[2]); +testWorkflow(); diff --git a/cypress/e2e/smokeTests/sharedTests/basic-enduser.ts b/cypress/e2e/smokeTests/sharedTests/basic-enduser.ts index 55875522fe..cdd5a217a7 100644 --- a/cypress/e2e/smokeTests/sharedTests/basic-enduser.ts +++ b/cypress/e2e/smokeTests/sharedTests/basic-enduser.ts @@ -1,6 +1,6 @@ import { ga4ghPath } from '../../../../src/app/shared/constants'; import { ToolDescriptor } from '../../../../src/app/shared/openapi'; -import { goToTab, checkFeaturedContent, checkNewsAndUpdates, checkMastodonFeedOrTwitterFeed } from '../../../support/commands'; +import { goToTab, checkFeaturedContent, checkNewsAndUpdates, checkMastodonFeed } from '../../../support/commands'; // Test an entry, these should be ambiguous between tools, workflows, and notebooks. describe('run stochastic smoke test', () => { @@ -10,18 +10,6 @@ describe('run stochastic smoke test', () => { }); function testEntry(tab: string) { function goToRandomEntry() { - // Notebooks search is not functional in staging or prod in 1.14. - // TODO after 1.15 release: remove the following code path - if (tab === 'Notebooks' && isStagingOrProd()) { - cy.visit('/notebooks'); - cy.get('[data-cy=entry-link]') - .eq(0) - .then((el) => { - cy.log(el.prop('href')); // log the href in case a test fails - cy.visit(el.prop('href')); - }); - return; - } cy.visit('/search'); cy.get('[data-cy=workflowColumn] a'); goToTab(tab); @@ -85,7 +73,6 @@ function isStagingOrProd() { return baseUrl === 'https://staging.dockstore.org' || baseUrl === 'https://dockstore.org'; } -const organizations = [['Broad Institute']]; describe('Check organizations page', () => { it('has multiple organizations and org with content', () => { cy.visit('/'); @@ -154,9 +141,6 @@ describe('Test search page functionality', () => { cy.url().should('contain', 'verified=1'); cy.get('[data-cy=workflowColumn] a'); cy.contains('mat-checkbox', /^[ ]*verified/); - cy.get('[data-cy=verificationStatus] a').each(($el, index, $list) => { - cy.wrap($el).contains('done'); - }); }); }); @@ -374,7 +358,7 @@ describe('Check extra content', () => { it('mastodon feed should be visible', () => { cy.visit('/'); - checkMastodonFeedOrTwitterFeed(); + checkMastodonFeed(); }); }); diff --git a/cypress/e2e/smokeTests/sharedTests/waf.ts b/cypress/e2e/smokeTests/sharedTests/waf.ts index 4948f134e4..5140901117 100644 --- a/cypress/e2e/smokeTests/sharedTests/waf.ts +++ b/cypress/e2e/smokeTests/sharedTests/waf.ts @@ -54,13 +54,6 @@ describe('Test AWS Managed Common Rule Set', () => { expect(resp.status).to.eq(403); }); }); - // EC2MetaDataSSRF_URIPATH Inspects for attempts to exfiltrate Amazon EC2 metadata from the request URI path. - it('Try a URL that SHOULD be blocked if EC2MetaDataSSRF_URIPATH were turned on', () => { - const uglyUrl = '/PARAM=127.0.0.1+-c+0%3B+cat+%2Fetc%2Fpasswd&DIAGNOSIS=PING'; - cy.request({ url: uglyUrl, failOnStatusCode: false }).then((resp) => { - expect(resp.status).to.eq(403); - }); - }); // GenericLFI_URIPATH Inspects for the presence of Local File Inclusion (LFI) exploits in the URI path. // Examples include path traversal attempts using techniques like ../../. // We definitely want URLs like this to work diff --git a/cypress/e2e/smokeTests/sharedTests/zenodo.ts b/cypress/e2e/smokeTests/sharedTests/zenodo.ts index 1cda904567..44be9f06be 100644 --- a/cypress/e2e/smokeTests/sharedTests/zenodo.ts +++ b/cypress/e2e/smokeTests/sharedTests/zenodo.ts @@ -186,12 +186,8 @@ describe('Create Zenodo DOI for workflow version', () => { cy.get('[data-cy=confirm-dialog-button]').click(); cy.get('[data-cy=confirm-dialog-button]', { timeout: 20000 }).should('not.exist'); - cy.get('[data-cy=workflow-version-DOI-badge]').should('be.visible'); - - goToTab('Info'); - cy.get('[class=mat-card-header]').should('contain', 'Workflow Version Information'); - - // Check that the DOI appears on the Info page for the new version - cy.get('[data-cy=info-tab-DOI-badge]').should('be.visible'); + // Check that the DOI appears for the new version + cy.get('[data-cy=user-DOI-icon]').should('be.visible'); + cy.get('[data-cy=version-DOI-badge]').should('be.visible'); }); }); diff --git a/cypress/fixtures/doiResponse.json b/cypress/fixtures/doiResponse.json deleted file mode 100644 index 1983b771a7..0000000000 --- a/cypress/fixtures/doiResponse.json +++ /dev/null @@ -1,78 +0,0 @@ -[ - { - "aliases": null, - "author": null, - "commitID": null, - "dbUpdateDate": 1622246514895, - "description": null, - "descriptionSource": null, - "dirtyBit": false, - "doiStatus": "CREATED", - "doiURL": "10.5072/zenodo.841014", - "email": null, - "frozen": true, - "hidden": false, - "id": 13, - "images": null, - "input_file_formats": [], - "last_modified": 1480374117003, - "legacyVersion": true, - "name": "master", - "output_file_formats": [], - "reference": "master", - "referenceType": "UNSET", - "subClass": null, - "synced": false, - "valid": true, - "validations": null, - "verified": false, - "verifiedSource": null, - "verifiedSources": [], - "versionEditor": null, - "versionMetadata": { - "id": 13, - "userIdToOrcidPutCode": {}, - "parsedInformationSet": [] - }, - "workflow_path": "/1st-workflow.cwl", - "workingDirectory": "" - }, - { - "aliases": null, - "author": null, - "commitID": null, - "dbUpdateDate": 1480374117003, - "description": null, - "descriptionSource": null, - "dirtyBit": false, - "doiStatus": "NOT_REQUESTED", - "doiURL": null, - "email": null, - "frozen": false, - "hidden": true, - "id": 14, - "images": null, - "input_file_formats": [], - "last_modified": 1480374117003, - "legacyVersion": true, - "name": "test", - "output_file_formats": [], - "reference": "test", - "referenceType": "UNSET", - "subClass": null, - "synced": true, - "valid": true, - "validations": null, - "verified": false, - "verifiedSource": null, - "verifiedSources": [], - "versionEditor": null, - "versionMetadata": { - "id": 14, - "userIdToOrcidPutCode": {}, - "parsedInformationSet": [] - }, - "workflow_path": "/1st-workflow.cwl", - "workingDirectory": "" - } -] diff --git a/cypress/fixtures/getWorkflowWithDoi.json b/cypress/fixtures/getWorkflowWithDoi.json new file mode 100644 index 0000000000..6f6f54d60e --- /dev/null +++ b/cypress/fixtures/getWorkflowWithDoi.json @@ -0,0 +1,201 @@ +{ + "type": "BioWorkflow", + "descriptorType": "CWL", + "aliases": {}, + "archived": false, + "authors": [], + "checker_id": null, + "conceptDoi": null, + "conceptDois": { + "USER": { + "type": "CONCEPT", + "name": "10.5072/zenodo.841013", + "initiator": "USER" + } + }, + "dbCreateDate": 1465394796000, + "dbUpdateDate": 1465394796000, + "defaultTestParameterFilePath": "/test.json", + "defaultVersion": null, + "deletable": false, + "description": null, + "descriptorTypeSubclass": "n/a", + "doiSelection": "USER", + "entryType": "WORKFLOW", + "entryTypeMetadata": { + "searchEntryType": "workflows", + "searchSupported": true, + "sitePath": "workflows", + "term": "workflow", + "termPlural": "workflows", + "trsPrefix": "#workflow/", + "trsSupported": true, + "type": "WORKFLOW" + }, + "forumUrl": null, + "full_workflow_path": "github.com/A/l", + "gitUrl": "git@github.com:A/l.git", + "has_checker": false, + "id": 11, + "input_file_formats": [], + "isChecker": false, + "is_published": true, + "labels": [], + "lastUpdated": 1480345257688, + "last_modified": null, + "last_modified_date": null, + "licenseInformation": { + "licenseName": null + }, + "mode": "FULL", + "orcidAuthors": [], + "organization": "A", + "output_file_formats": [], + "parent_id": null, + "path": "github.com/A/l", + "repository": "l", + "sourceControl": "github.com", + "source_control_provider": "GITHUB", + "starredUsers": [], + "topic": null, + "topicAI": null, + "topicAutomatic": null, + "topicId": null, + "topicManual": null, + "topicSelection": "AUTOMATIC", + "userIdToOrcidPutCode": null, + "users": [ + { + "avatarUrl": null, + "curator": true, + "id": 1, + "isAdmin": true, + "name": "user_A", + "orcid": null, + "platformPartner": null, + "privacyPolicyVersion": "PRIVACY_POLICY_VERSION_2_5", + "privacyPolicyVersionAcceptanceDate": null, + "setupComplete": false, + "tosacceptanceDate": null, + "tosversion": "TOS_VERSION_2", + "userProfiles": null, + "username": "user_A", + "usernameChangeRequired": false + } + ], + "workflowName": null, + "workflowVersions": [ + { + "aiTopicProcessed": false, + "aliases": null, + "author": "Muhammed Lee", + "authors": [ + { + "affiliation": null, + "email": "Muhammad.Lee@oicr.on.ca", + "name": "Muhammed Lee", + "role": null + } + ], + "commitID": null, + "dbUpdateDate": 1722026014356, + "descriptionSource": null, + "dirtyBit": false, + "doiStatus": "NOT_REQUESTED", + "doiURL": null, + "dois": { + "USER": { + "type": "VERSION", + "name": "10.5072/zenodo.841014", + "initiator": "USER" + } + }, + "email": "Muhammad.Lee@oicr.on.ca", + "frozen": true, + "hidden": false, + "id": 13, + "images": null, + "input_file_formats": [], + "kernelImagePath": null, + "last_modified": 1480345317003, + "legacyVersion": true, + "metricsByPlatform": null, + "name": "master", + "orcidAuthors": null, + "output_file_formats": [], + "readMePath": null, + "reference": "master", + "referenceType": "UNSET", + "synced": false, + "userFiles": [], + "valid": true, + "validations": null, + "verified": false, + "verifiedPlatforms": [], + "verifiedSource": null, + "verifiedSources": [], + "versionEditor": null, + "versionMetadata": { + "descriptorTypeVersions": [], + "dois": {}, + "engineVersions": [], + "id": 13, + "parsedInformationSet": [], + "publicAccessibleTestParameterFile": null, + "userIdToOrcidPutCode": {} + }, + "workflow_path": "/1st-workflow.cwl", + "workingDirectory": "" + }, + { + "aiTopicProcessed": false, + "aliases": null, + "author": null, + "authors": [], + "commitID": null, + "dbUpdateDate": 1480345317003, + "descriptionSource": null, + "dirtyBit": false, + "doiStatus": "NOT_REQUESTED", + "doiURL": null, + "dois": {}, + "email": null, + "frozen": false, + "hidden": true, + "id": 14, + "images": null, + "input_file_formats": [], + "kernelImagePath": null, + "last_modified": 1480345317003, + "legacyVersion": true, + "metricsByPlatform": null, + "name": "test", + "orcidAuthors": null, + "output_file_formats": [], + "readMePath": null, + "reference": "test", + "referenceType": "UNSET", + "synced": true, + "userFiles": [], + "valid": true, + "validations": null, + "verified": false, + "verifiedPlatforms": [], + "verifiedSource": null, + "verifiedSources": [], + "versionEditor": null, + "versionMetadata": { + "descriptorTypeVersions": [], + "dois": {}, + "engineVersions": [], + "id": 14, + "parsedInformationSet": [], + "publicAccessibleTestParameterFile": null, + "userIdToOrcidPutCode": {} + }, + "workflow_path": "/1st-workflow.cwl", + "workingDirectory": "" + } + ], + "workflow_path": "/1st-workflow.cwl" + } \ No newline at end of file diff --git a/cypress/fixtures/myNotebooks.json b/cypress/fixtures/myNotebooks.json new file mode 100644 index 0000000000..8a54e4d907 --- /dev/null +++ b/cypress/fixtures/myNotebooks.json @@ -0,0 +1,84 @@ +[ + { + "type": "Notebook", + "descriptorType": "jupyter", + "aliases": null, + "author": null, + "checker_id": null, + "conceptDoi": null, + "conceptDois": {}, + "dbCreateDate": 1465409196000, + "dbUpdateDate": 1465409196000, + "defaultTestParameterFilePath": "/test.json", + "defaultVersion": null, + "description": null, + "descriptorTypeSubclass": "Python", + "email": null, + "full_workflow_path": "github.com/dockstore-testing/addedthisnotebooksviasync", + "gitUrl": "git@github.com:dockstore-testing/addedthisnotebookviasync", + "has_checker": false, + "id": 15, + "input_file_formats": [], + "isChecker": false, + "is_published": true, + "labels": [], + "lastUpdated": 1480363257688, + "last_modified": null, + "last_modified_date": null, + "mode": "FULL", + "organization": "dockstore-testing", + "output_file_formats": [], + "parent_id": null, + "path": "github.com/dockstore-testing/addedthisnotebookviasync", + "repository":"addedthisnotebookviasync", + "sourceControl": "github.com", + "source_control_provider": "GITHUB", + "starredUsers": [], + "topicId": null, + "users": null, + "workflowName": null, + "workflowVersions": [], + "workflow_path": "/Dockstore.yml" + }, + { + "type": "Notebook", + "descriptorType": "Jupyter", + "aliases": null, + "author": null, + "checker_id": null, + "conceptDoi": null, + "conceptDois": {}, + "dbCreateDate": 1678999094926, + "dbUpdateDate": 1678999094994, + "defaultTestParameterFilePath": "/test.json", + "defaultVersion": null, + "description": null, + "descriptorTypeSubclass": "Python", + "email": null, + "full_workflow_path": "github.com/dockstore-testing/simple-notebook", + "gitUrl": "git@github.com:dockstore-testing/simple-notebook.git", + "has_checker": false, + "id": 1000, + "input_file_formats": [], + "isChecker": false, + "is_published": true, + "labels": [], + "lastUpdated": 1678999093800, + "last_modified": 1366549560, + "last_modified_date": 1676403795000, + "mode": "DOCKSTORE_YML", + "organization": "dockstore-testing", + "output_file_formats": [], + "parent_id": null, + "path": "github.com/dockstore-testing/simple-notebook", + "repository": "simple-notebook", + "sourceControl": "github.com", + "source_control_provider": "GITHUB", + "starredUsers": [], + "topicId": null, + "users": null, + "workflowName": null, + "workflowVersions": [], + "workflow_path": "/Dockstore.cwl" + } +] diff --git a/cypress/fixtures/myTools.json b/cypress/fixtures/myTools.json new file mode 100644 index 0000000000..11fef8e911 --- /dev/null +++ b/cypress/fixtures/myTools.json @@ -0,0 +1,289 @@ +[ + { + "aliases": null, + "author": null, + "checker_id": null, + "conceptDoi": null, + "conceptDois": {}, + "custom_docker_registry_path": "quay.io", + "dbCreateDate": 1465409196000, + "dbUpdateDate": 1465409196000, + "defaultCWLTestParameterFile": "/test.json", + "defaultVersion": null, + "defaultWDLTestParameterFile": "/test.json", + "default_cwl_path": "/Dockstore.cwl", + "default_dockerfile_path": "/Dockerfile", + "default_wdl_path": "/Dockstore.wdl", + "description": null, + "descriptorType": ["CWL"], + "entryType": "TOOL", + "email": null, + "gitUrl": "git@github.com:A2/addedthistoolviasync.git", + "has_checker": false, + "id": 18, + "input_file_formats": [], + "is_published": true, + "labels": [], + "lastUpdated": 1480363257688, + "last_modified": null, + "last_modified_date": null, + "mode": "AUTO_DETECT_QUAY_TAGS_AUTOMATED_BUILDS", + "name": "addedthistoolviasync", + "namespace": "A2", + "output_file_formats": [], + "path": "quay.io/A2/addedthistoolviasync", + "registry": "QUAY_IO", + "registry_string": "quay.io", + "starredUsers": [], + "tool_path": "quay.io/A2/addedthistoolviasync", + "topicId": null, + "users": null, + "workflowVersions": [] + }, + { + "aliases": null, + "author": null, + "checker_id": null, + "conceptDoi": null, + "conceptDois": {}, + "custom_docker_registry_path": "quay.io", + "dbCreateDate": 1465409196000, + "dbUpdateDate": 1465409196000, + "defaultCWLTestParameterFile": "/test.json", + "defaultVersion": null, + "defaultWDLTestParameterFile": "/test.json", + "default_cwl_path": "/Dockstore.cwl", + "default_dockerfile_path": "/Dockerfile", + "default_wdl_path": "/Dockstore.wdl", + "description": null, + "descriptorType": ["CWL"], + "entryType": "TOOL", + "email": null, + "gitUrl": "git@github.com:A2/b1.git", + "has_checker": false, + "id": 2, + "input_file_formats": [], + "is_published": false, + "labels": [], + "lastUpdated": 1480363243873, + "last_modified": null, + "last_modified_date": null, + "mode": "AUTO_DETECT_QUAY_TAGS_AUTOMATED_BUILDS", + "name": "b1", + "namespace": "A2", + "output_file_formats": [], + "path": "quay.io/A2/b1", + "registry": "QUAY_IO", + "registry_string": "quay.io", + "starredUsers": [], + "tool_path": "quay.io/A2/b1", + "topicId": null, + "users": null, + "workflowVersions": [] + }, + { + "aliases": null, + "author": null, + "checker_id": null, + "conceptDoi": null, + "conceptDois": {}, + "custom_docker_registry_path": "quay.io", + "dbCreateDate": 1465409196000, + "dbUpdateDate": 1465409196000, + "defaultCWLTestParameterFile": "/test.json", + "defaultVersion": null, + "defaultWDLTestParameterFile": "/test.json", + "default_cwl_path": "/Dockstore.cwl", + "default_dockerfile_path": "/Dockerfile", + "default_wdl_path": "/Dockstore.wdl", + "description": null, + "descriptorType": ["CWL"], + "entryType": "TOOL", + "email": null, + "gitUrl": "git@github.com:A2/a.git", + "has_checker": false, + "id": 5, + "input_file_formats": [], + "is_published": true, + "labels": [], + "lastUpdated": 1480363243873, + "last_modified": null, + "last_modified_date": null, + "mode": "AUTO_DETECT_QUAY_TAGS_AUTOMATED_BUILDS", + "name": "a", + "namespace": "A2", + "output_file_formats": [], + "path": "quay.io/A2/a", + "registry": "QUAY_IO", + "registry_string": "quay.io", + "starredUsers": [], + "tool_path": "quay.io/A2/a", + "topicId": null, + "users": null, + "workflowVersions": [] + }, + { + "aliases": null, + "author": null, + "checker_id": null, + "conceptDoi": null, + "conceptDois": {}, + "custom_docker_registry_path": "quay.io", + "dbCreateDate": 1465409196000, + "dbUpdateDate": 1465409196000, + "defaultCWLTestParameterFile": "/test.json", + "defaultVersion": null, + "defaultWDLTestParameterFile": "/test.json", + "default_cwl_path": "/Dockstore.cwl", + "default_dockerfile_path": "/Dockerfile", + "default_wdl_path": "/Dockstore.wdl", + "description": null, + "descriptorType": ["WDL"], + "entryType": "TOOL", + "email": null, + "gitUrl": "git@github.com:A2/b3.git", + "has_checker": false, + "id": 4, + "input_file_formats": [], + "is_published": true, + "labels": [], + "lastUpdated": 1480363243873, + "last_modified": null, + "last_modified_date": null, + "mode": "AUTO_DETECT_QUAY_TAGS_AUTOMATED_BUILDS", + "name": "b3", + "namespace": "A2", + "output_file_formats": [], + "path": "quay.io/A2/b3", + "registry": "QUAY_IO", + "registry_string": "quay.io", + "starredUsers": [], + "tool_path": "quay.io/A2/b3", + "topicId": null, + "users": null, + "workflowVersions": [] + }, + { + "aliases": null, + "author": null, + "checker_id": null, + "conceptDoi": null, + "conceptDois": {}, + "custom_docker_registry_path": "amazon.dkr.ecr.test.amazonaws.com", + "dbCreateDate": 1465409196000, + "dbUpdateDate": 1465409196000, + "defaultCWLTestParameterFile": "/test.json", + "defaultVersion": null, + "defaultWDLTestParameterFile": "/test.json", + "default_cwl_path": "/Dockstore.cwl", + "default_dockerfile_path": "/Dockerfile", + "default_wdl_path": "/Dockstore.wdl", + "description": null, + "descriptorType": ["CWL","WDL"], + "entryType": "TOOL", + "email": null, + "gitUrl": "git@github.com:A/a.git", + "has_checker": false, + "id": 1, + "input_file_formats": [], + "is_published": false, + "labels": [], + "lastUpdated": 1480363243873, + "last_modified": null, + "last_modified_date": null, + "mode": "MANUAL_IMAGE_PATH", + "name": "a", + "namespace": "A", + "output_file_formats": [], + "path": "amazon.dkr.ecr.test.amazonaws.com/A/a", + "registry": "AMAZON_ECR", + "registry_string": "amazon.dkr.ecr.test.amazonaws.com", + "starredUsers": [], + "tool_path": "amazon.dkr.ecr.test.amazonaws.com/A/a", + "topicId": null, + "users": null, + "workflowVersions": [] + }, + { + "aliases": null, + "author": null, + "checker_id": null, + "conceptDoi": null, + "conceptDois": {}, + "custom_docker_registry_path": "quay.io", + "dbCreateDate": 1465409196000, + "dbUpdateDate": 1465409196000, + "defaultCWLTestParameterFile": "/test.json", + "defaultVersion": null, + "defaultWDLTestParameterFile": "/test.json", + "default_cwl_path": "/Dockstore.cwl", + "default_dockerfile_path": "/testDir/Dockerfile", + "default_wdl_path": "/Dockstore.wdl", + "description": null, + "descriptorType": ["CWL"], + "entryType": "TOOL", + "email": null, + "gitUrl": "git@github.com:A2/b2.git", + "has_checker": false, + "id": 3, + "input_file_formats": [], + "is_published": false, + "labels": [], + "lastUpdated": 1480363368557, + "last_modified": null, + "last_modified_date": null, + "mode": "AUTO_DETECT_QUAY_TAGS_AUTOMATED_BUILDS", + "name": "b2", + "namespace": "A2", + "output_file_formats": [], + "path": "quay.io/A2/b2", + "registry": "QUAY_IO", + "registry_string": "quay.io", + "starredUsers": [], + "tool_path": "quay.io/A2/b2", + "topicId": null, + "users": null, + "workflowVersions": [] + }, + { + "aliases": null, + "author": null, + "checker_id": null, + "conceptDoi": null, + "conceptDois": {}, + "custom_docker_registry_path": "quay.io", + "dbCreateDate": 1465409196000, + "dbUpdateDate": 1465409196000, + "defaultCWLTestParameterFile": "/test.json", + "defaultVersion": null, + "defaultWDLTestParameterFile": "/test.json", + "default_cwl_path": "/Dockstore.cwl", + "default_dockerfile_path": "/Dockerfile", + "default_wdl_path": "/Dockstore.wdl", + "description": null, + "descriptorType": ["CWL"], + "entryType": "TOOL", + "email": null, + "gitUrl": "git@dockstore.org:quay.io/hosted-tool/ht.git", + "has_checker": false, + "id": 100, + "input_file_formats": [], + "is_published": false, + "labels": [], + "lastUpdated": 1480363243873, + "last_modified": null, + "last_modified_date": null, + "mode": "HOSTED", + "name": "ht", + "namespace": "hosted-tool", + "output_file_formats": [], + "path": "quay.io/hosted-tool/ht", + "registry": "QUAY_IO", + "registry_string": "quay.io", + "starredUsers": [], + "tool_path": "quay.io/hosted-tool/ht", + "topicId": null, + "users": null, + "workflowVersions": [] + } +] diff --git a/cypress/fixtures/myWorkflows.json b/cypress/fixtures/myWorkflows.json index c8de2386f9..b2f0d3c5a5 100644 --- a/cypress/fixtures/myWorkflows.json +++ b/cypress/fixtures/myWorkflows.json @@ -1 +1 @@ -[{"type":"BioWorkflow","descriptorType":"CWL","aliases":null,"author":null,"checker_id":null,"conceptDoi":null,"dbCreateDate":1465409196000,"dbUpdateDate":1465409196000,"defaultTestParameterFilePath":"/test.json","defaultVersion":null,"description":null,"descriptorTypeSubclass":"NOT_APPLICABLE","email":null,"full_workflow_path":"github.com/A/l","gitUrl":"git@github.com:A/l.git","has_checker":false,"id":11,"input_file_formats":[],"isChecker":false,"is_published":true,"labels":[],"lastUpdated":1480363257688,"last_modified":null,"last_modified_date":null,"mode":"FULL","organization":"A","output_file_formats":[],"parent_id":null,"path":"github.com/A/l","repository":"l","sourceControl":"github.com","source_control_provider":"GITHUB","starredUsers":[],"topicId":null,"users":null,"workflowName":null,"workflowVersions":[],"workflow_path":"/1st-workflow.cwl"},{"type":"BioWorkflow","descriptorType":"CWL","aliases":null,"author":null,"checker_id":null,"conceptDoi":null,"dbCreateDate":1465409196000,"dbUpdateDate":1465409196000,"defaultTestParameterFilePath":"/test.json","defaultVersion":null,"description":null,"descriptorTypeSubclass":"NOT_APPLICABLE","email":null,"full_workflow_path":"github.com/A/addedthisworkflowviasync","gitUrl":"git@github.com:A/addedthisworkflowviasync.git","has_checker":false,"id":11,"input_file_formats":[],"isChecker":false,"is_published":true,"labels":[],"lastUpdated":1480363257688,"last_modified":null,"last_modified_date":null,"mode":"FULL","organization":"A","output_file_formats":[],"parent_id":null,"path":"github.com/A/addedthisworkflowviasync","repository":"addedthisworkflowviasync","sourceControl":"github.com","source_control_provider":"GITHUB","starredUsers":[],"topicId":null,"users":null,"workflowName":null,"workflowVersions":[],"workflow_path":"/1st-workflow.cwl"},{"type":"BioWorkflow","descriptorType":"CWL","aliases":null,"author":null,"checker_id":null,"conceptDoi":null,"dbCreateDate":1578510396000,"dbUpdateDate":1578510396000,"defaultTestParameterFilePath":"/test.json","defaultVersion":null,"description":null,"descriptorTypeSubclass":"NOT_APPLICABLE","email":null,"full_workflow_path":"github.com/B/z","gitUrl":"git@github.com:B/z.git","has_checker":false,"id":30,"input_file_formats":[],"isChecker":false,"is_published":false,"labels":[],"lastUpdated":1580241657315,"last_modified":null,"last_modified_date":null,"mode":"DOCKSTORE_YML","organization":"B","output_file_formats":[],"parent_id":null,"path":"github.com/B/z","repository":"z","sourceControl":"github.com","source_control_provider":"GITHUB","starredUsers":[],"topicId":null,"users":null,"workflowName":null,"workflowVersions":[],"workflow_path":"/Dockstore.cwl"},{"type":"BioWorkflow","descriptorType":"WDL","aliases":null,"author":null,"checker_id":null,"conceptDoi":null,"dbCreateDate":1465409196000,"dbUpdateDate":1465409196000,"defaultTestParameterFilePath":"/test.json","defaultVersion":null,"description":null,"descriptorTypeSubclass":"NOT_APPLICABLE","email":null,"full_workflow_path":"dockstore.org/A2/hosted-workflow","gitUrl":"git@dockstore.org:workflows/dockstore.org/A2/hosted-workflow.git","has_checker":false,"id":21,"input_file_formats":[],"isChecker":false,"is_published":false,"labels":[],"lastUpdated":1480363257315,"last_modified":null,"last_modified_date":null,"mode":"HOSTED","organization":"A","output_file_formats":[],"parent_id":null,"path":"dockstore.org/A2/hosted-workflow","repository":"hosted-workflow","sourceControl":"dockstore.org","source_control_provider":"DOCKSTORE","starredUsers":[],"topicId":null,"users":null,"workflowName":null,"workflowVersions":[],"workflow_path":"/Dockstore.wdl"}] +[{"type":"BioWorkflow","descriptorType":"CWL","aliases":null,"author":null,"checker_id":null,"conceptDoi":null,"conceptDois":{},"dbCreateDate":1465409196000,"dbUpdateDate":1465409196000,"defaultTestParameterFilePath":"/test.json","defaultVersion":null,"description":null,"descriptorTypeSubclass":"NOT_APPLICABLE","email":null,"full_workflow_path":"github.com/A/l","gitUrl":"git@github.com:A/l.git","has_checker":false,"id":11,"input_file_formats":[],"isChecker":false,"is_published":true,"labels":[],"lastUpdated":1480363257688,"last_modified":null,"last_modified_date":null,"mode":"FULL","organization":"A","output_file_formats":[],"parent_id":null,"path":"github.com/A/l","repository":"l","sourceControl":"github.com","source_control_provider":"GITHUB","starredUsers":[],"topicId":null,"users":null,"workflowName":null,"workflowVersions":[],"workflow_path":"/1st-workflow.cwl"},{"type":"BioWorkflow","descriptorType":"CWL","aliases":null,"author":null,"checker_id":null,"conceptDoi":null,"conceptDois":{},"dbCreateDate":1465409196000,"dbUpdateDate":1465409196000,"defaultTestParameterFilePath":"/test.json","defaultVersion":null,"description":null,"descriptorTypeSubclass":"NOT_APPLICABLE","email":null,"full_workflow_path":"github.com/A/addedthisworkflowviasync","gitUrl":"git@github.com:A/addedthisworkflowviasync.git","has_checker":false,"id":11,"input_file_formats":[],"isChecker":false,"is_published":true,"labels":[],"lastUpdated":1480363257688,"last_modified":null,"last_modified_date":null,"mode":"FULL","organization":"A","output_file_formats":[],"parent_id":null,"path":"github.com/A/addedthisworkflowviasync","repository":"addedthisworkflowviasync","sourceControl":"github.com","source_control_provider":"GITHUB","starredUsers":[],"topicId":null,"users":null,"workflowName":null,"workflowVersions":[],"workflow_path":"/1st-workflow.cwl"},{"type":"BioWorkflow","descriptorType":"CWL","aliases":null,"author":null,"checker_id":null,"conceptDoi":null,"conceptDois":{},"dbCreateDate":1578510396000,"dbUpdateDate":1578510396000,"defaultTestParameterFilePath":"/test.json","defaultVersion":null,"description":null,"descriptorTypeSubclass":"NOT_APPLICABLE","email":null,"full_workflow_path":"github.com/B/z","gitUrl":"git@github.com:B/z.git","has_checker":false,"id":30,"input_file_formats":[],"isChecker":false,"is_published":false,"labels":[],"lastUpdated":1580241657315,"last_modified":null,"last_modified_date":null,"mode":"DOCKSTORE_YML","organization":"B","output_file_formats":[],"parent_id":null,"path":"github.com/B/z","repository":"z","sourceControl":"github.com","source_control_provider":"GITHUB","starredUsers":[],"topicId":null,"users":null,"workflowName":null,"workflowVersions":[],"workflow_path":"/Dockstore.cwl"},{"type":"BioWorkflow","descriptorType":"WDL","aliases":null,"author":null,"checker_id":null,"conceptDoi":null,"conceptDois":{},"dbCreateDate":1465409196000,"dbUpdateDate":1465409196000,"defaultTestParameterFilePath":"/test.json","defaultVersion":null,"description":null,"descriptorTypeSubclass":"NOT_APPLICABLE","email":null,"full_workflow_path":"dockstore.org/A2/hosted-workflow","gitUrl":"git@dockstore.org:workflows/dockstore.org/A2/hosted-workflow.git","has_checker":false,"id":21,"input_file_formats":[],"isChecker":false,"is_published":false,"labels":[],"lastUpdated":1480363257315,"last_modified":null,"last_modified_date":null,"mode":"HOSTED","organization":"A","output_file_formats":[],"parent_id":null,"path":"dockstore.org/A2/hosted-workflow","repository":"hosted-workflow","sourceControl":"dockstore.org","source_control_provider":"DOCKSTORE","starredUsers":[],"topicId":null,"users":null,"workflowName":null,"workflowVersions":[],"workflow_path":"/Dockstore.wdl"}] diff --git a/cypress/fixtures/orcidExportResponse.json b/cypress/fixtures/orcidExportResponse.json index bc2f5d4533..072c20d65c 100644 --- a/cypress/fixtures/orcidExportResponse.json +++ b/cypress/fixtures/orcidExportResponse.json @@ -5,6 +5,13 @@ "author": null, "checker_id": null, "conceptDoi": "10.5072/zenodo.841013", + "conceptDois": { + "USER": { + "type": "CONCEPT", + "name": "10.5072/zenodo.841013", + "initiator": "USER" + } + }, "dbCreateDate": 1465409196000, "dbUpdateDate": 1465409196000, "defaultTestParameterFilePath": "/test.json", @@ -52,6 +59,13 @@ "dirtyBit": false, "doiStatus": "CREATED", "doiURL": "10.5072/zenodo.841014", + "dois": { + "USER": { + "type": "VERSION", + "name": "10.5072/zenodo.841014", + "initiator": "USER" + } + }, "email": null, "frozen": true, "hidden": false, @@ -96,6 +110,7 @@ "dirtyBit": false, "doiStatus": "NOT_REQUESTED", "doiURL": null, + "dois": {}, "email": null, "frozen": false, "hidden": true, diff --git a/cypress/fixtures/refreshedAslashl.json b/cypress/fixtures/refreshedAslashl.json index 4d5eac529f..070a9b36d6 100644 --- a/cypress/fixtures/refreshedAslashl.json +++ b/cypress/fixtures/refreshedAslashl.json @@ -5,6 +5,7 @@ "author": null, "checker_id": null, "conceptDoi": null, + "conceptDois": {}, "dbCreateDate": 1465419996000, "dbUpdateDate": 1465419996000, "defaultTestParameterFilePath": "/test.json", @@ -62,6 +63,7 @@ "dirtyBit": false, "doiStatus": "NOT_REQUESTED", "doiURL": null, + "dois": {}, "email": null, "frozen": false, "hidden": false, diff --git a/cypress/fixtures/refreshedTool5.json b/cypress/fixtures/refreshedTool5.json index 304a06f5e4..5816b2b27e 100644 --- a/cypress/fixtures/refreshedTool5.json +++ b/cypress/fixtures/refreshedTool5.json @@ -3,6 +3,7 @@ "author": "", "checker_id": null, "conceptDoi": null, + "conceptDois": {}, "custom_docker_registry_path": "quay.io", "dbCreateDate": 1540931203177, "dbUpdateDate": 1540931206733, diff --git a/cypress/fixtures/sampleNotebook.json b/cypress/fixtures/sampleNotebook.json index 551db0e3e5..cab5e49307 100644 --- a/cypress/fixtures/sampleNotebook.json +++ b/cypress/fixtures/sampleNotebook.json @@ -5,6 +5,7 @@ "author": null, "checker_id": null, "conceptDoi": null, + "conceptDois": {}, "dbCreateDate": 1678804799542, "dbUpdateDate": 1678804799613, "defaultTestParameterFilePath": "/test.json", diff --git a/cypress/support/commands.ts b/cypress/support/commands.ts index 468cca99cd..afd66d01d2 100644 --- a/cypress/support/commands.ts +++ b/cypress/support/commands.ts @@ -61,7 +61,7 @@ export function resetDB() { cy.exec('java -jar dockstore-webservice.jar db drop-all --confirm-delete-everything test/web.yml'); cy.exec(psqlInvocation + ' -h localhost webservice_test -U dockstore < test/db_dump.sql'); cy.exec( - 'java -jar dockstore-webservice.jar db migrate -i 1.5.0,1.6.0,1.7.0,1.8.0,1.9.0,1.10.0,alter_test_user_1.10.2,1.11.0,1.12.0,1.13.0,1.14.0,1.15.0 test/web.yml' + 'java -jar dockstore-webservice.jar db migrate -i 1.5.0,1.6.0,1.7.0,1.8.0,1.9.0,1.10.0,alter_test_user_1.10.2,1.11.0,1.12.0,1.13.0,1.14.0,1.15.0,1.16.0 test/web.yml' ); }); } @@ -71,7 +71,7 @@ export function resetDBWithService() { cy.exec('java -jar dockstore-webservice.jar db drop-all --confirm-delete-everything test/web.yml'); cy.exec(psqlInvocation + ' -h localhost webservice_test -U dockstore < test/db_dump.sql'); cy.exec( - 'java -jar dockstore-webservice.jar db migrate -i 1.5.0,1.6.0,1.7.0,add_service_1.7.0,1.8.0,1.9.0,1.10.0,alter_test_user_1.10.2,1.11.0,1.12.0,1.13.0,1.14.0,1.15.0 test/web.yml' + 'java -jar dockstore-webservice.jar db migrate -i 1.5.0,1.6.0,1.7.0,add_service_1.7.0,1.8.0,1.9.0,1.10.0,alter_test_user_1.10.2,1.11.0,1.12.0,1.13.0,1.14.0,1.15.0,1.16.0 test/web.yml' ); }); } @@ -193,7 +193,7 @@ export function verifyGithubLinkDashboard(entryType: string) { cy.get('[data-cy=register-entry-btn]').contains(entryType).should('be.visible').click(); cy.get('[data-cy=storage-type-choice]').contains('GitHub').click(); cy.contains('button', 'Next').should('be.visible').click(); - cy.contains('a', 'Manage Dockstore installations on GitHub').click(); + cy.contains('button', 'Manage Dockstore installations on GitHub').click(); } export function testNoGithubEntriesText(entryType: string, repository: string) { @@ -276,6 +276,6 @@ export function checkNewsAndUpdates() { }); } -export function checkMastodonFeedOrTwitterFeed() { - cy.get('[data-cy=mt-toot],.twitter-timeline').should('exist'); +export function checkMastodonFeed() { + cy.get('[data-cy=mt-toot]').should('exist'); } diff --git a/package-lock.json b/package-lock.json index 2e5834c754..e4b1589b27 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,67 +1,67 @@ -{ +{ "name": "dockstore-ui2", - "version": "2.10.0", + "version": "2.13.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "dockstore-ui2", - "version": "2.10.0", + "version": "2.13.0", "hasInstallScript": true, "license": "Apache License 2.0", "dependencies": { - "@angular/animations": "^14.2.7", - "@angular/cdk": "^14.2.5", - "@angular/common": "^14.2.7", - "@angular/compiler": "^14.2.7", - "@angular/core": "^14.2.7", - "@angular/flex-layout": "^14.0.0-beta.41", - "@angular/forms": "^14.2.7", - "@angular/material": "^14.2.5", - "@angular/platform-browser": "^14.2.7", - "@angular/platform-browser-dynamic": "^14.2.7", - "@angular/router": "^14.2.7", + "@angular/animations": "^16.2.12", + "@angular/cdk": "^16.2.14", + "@angular/common": "^16.2.12", + "@angular/compiler": "^16.2.12", + "@angular/core": "^16.2.12", + "@angular/forms": "^16.2.12", + "@angular/material": "^16.2.14", + "@angular/platform-browser": "^16.2.12", + "@angular/platform-browser-dynamic": "^16.2.12", + "@angular/router": "^16.2.12", "@datorama/akita": "^7.0.0", - "@fortawesome/angular-fontawesome": "^0.11.1", + "@fortawesome/angular-fontawesome": "^0.13.0", "@fortawesome/fontawesome-svg-core": "^6.2.0", "@fortawesome/free-brands-svg-icons": "^6.0.0", "@fortawesome/free-solid-svg-icons": "^6.0.0", + "@ngbracket/ngx-layout": "^15.1.3", "@ngneat/forms-manager": "^2.3.0", "academicons": "^1.8.6", "ace-builds": "^1.4.12", - "angular-tag-cloud-module": "^14.0.0", + "angular-tag-cloud-module": "^16.0.0", "bodybuilder": "^2.4.0", "bootstrap": "^3.4.1", "cytoscape": "^3.19.0", "cytoscape-dagre": "^2.3.2", "cytoscape-popper": "^2.0.0", - "dompurify": "^2.2.9", + "dompurify": "^2.5.4", "file-saver": "^2.0.5", "ini": "^4.1.1", "jquery": "^3.6.0", "material-design-icons-iconfont": "^6.1.0", "mathjax": "^3.2.2", - "ng2-ui-auth": "^10.0.1", - "ngx-markdown": "^14.0.1", - "ngx-mat-select-search": "^5.0.0", + "ngx-markdown": "^16.0.0", + "ngx-mat-select-search": "^6.0.0", "ngx-sharebuttons": "^8.0.5", "prismjs": "^1.29.0", "rxjs": "^6.6.7", + "split-string": "^3.1.0", "ts-md5": "^1.2.8", "tslib": "^2.3.0", "uuid": "^8.3.2", - "zone.js": "~0.11.4" + "zone.js": "~0.13.3" }, "devDependencies": { - "@angular-devkit/build-angular": "^14.2.6", - "@angular-eslint/builder": "^14.0.1", - "@angular-eslint/eslint-plugin": "^14.0.1", - "@angular-eslint/eslint-plugin-template": "^14.0.1", - "@angular-eslint/schematics": "14.0.1", - "@angular-eslint/template-parser": "^14.0.1", - "@angular/cli": "^14.2.6", - "@angular/compiler-cli": "^14.2.7", - "@angular/language-service": "^14.2.7", + "@angular-devkit/build-angular": "^16.2.16", + "@angular-eslint/builder": "^16.3.1", + "@angular-eslint/eslint-plugin": "^16.3.1", + "@angular-eslint/eslint-plugin-template": "^16.3.1", + "@angular-eslint/schematics": "^16.3.1", + "@angular-eslint/template-parser": "^15.2.1", + "@angular/cli": "^16.2.14", + "@angular/compiler-cli": "^16.2.12", + "@angular/language-service": "^16.2.12", "@cypress/webpack-batteries-included-preprocessor": "^2.4.1", "@cypress/webpack-preprocessor": "^5.17.1", "@datorama/akita-ngdevtools": "^7.0.0", @@ -69,10 +69,10 @@ "@types/elasticsearch": "^5.0.37", "@types/jasmine": "^3.7.7", "@types/jquery": "^3.5.5", - "@types/node": "^15.12.2", + "@types/node": "^18.19.39", "@typescript-eslint/eslint-plugin": "5.3.0", "@typescript-eslint/parser": "5.3.0", - "cypress": "^12.3.0", + "cypress": "^13.7.2", "eslint": "^8.2.0", "husky": "^7.0.0", "jasmine-core": "^3.7.1", @@ -86,22 +86,16 @@ "pa11y-ci": "^3.0.1", "prettier": "^2.3.1", "ts-node": "^10.9.1", - "typescript": "^4.8.4" + "typescript": "^4.9.5" } }, - "node_modules/@adobe/css-tools": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.3.2.tgz", - "integrity": "sha512-DA5a1C0gD/pLOvhv33YMrbf2FK3oUzwNl9oOJqE4XVjuEtt6XIakRcsd7eLiOSPkp1kTRQGICTA8cKra/vFbjw==", - "dev": true - }, "node_modules/@ampproject/remapping": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", - "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", "dev": true, "dependencies": { - "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/gen-mapping": "^0.3.0", "@jridgewell/trace-mapping": "^0.3.9" }, "engines": { @@ -109,114 +103,137 @@ } }, "node_modules/@angular-devkit/architect": { - "version": "0.1402.7", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1402.7.tgz", - "integrity": "sha512-YZchteri2iUq5JICSH0BQjOU3ehE57+CMU8PBigcJZiaLa/GPiCuwD9QOsnwSzHJNYYx5C94uhtZUjPwUtIAIw==", + "version": "0.1602.14", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1602.14.tgz", + "integrity": "sha512-eSdONEV5dbtLNiOMBy9Ue9DdJ1ct6dH9RdZfYiedq6VZn0lejePAjY36MYVXgq2jTE+v/uIiaNy7caea5pt55A==", "dev": true, "dependencies": { - "@angular-devkit/core": "14.2.7", - "rxjs": "6.6.7" + "@angular-devkit/core": "16.2.14", + "rxjs": "7.8.1" }, "engines": { - "node": "^14.15.0 || >=16.10.0", + "node": "^16.14.0 || >=18.10.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" } }, + "node_modules/@angular-devkit/architect/node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dev": true, + "dependencies": { + "tslib": "^2.1.0" + } + }, "node_modules/@angular-devkit/build-angular": { - "version": "14.2.7", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-14.2.7.tgz", - "integrity": "sha512-Y58kcEmy8bSFyODtUFQzkuoZHNCji3fzRwGCiQYdAh/mkBf53CuVWoT9q7MrvGOc7Nmo2JiuwR/b7c543eVgfw==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "2.2.0", - "@angular-devkit/architect": "0.1402.7", - "@angular-devkit/build-webpack": "0.1402.7", - "@angular-devkit/core": "14.2.7", - "@babel/core": "7.18.10", - "@babel/generator": "7.18.12", - "@babel/helper-annotate-as-pure": "7.18.6", - "@babel/plugin-proposal-async-generator-functions": "7.18.10", - "@babel/plugin-transform-async-to-generator": "7.18.6", - "@babel/plugin-transform-runtime": "7.18.10", - "@babel/preset-env": "7.18.10", - "@babel/runtime": "7.18.9", - "@babel/template": "7.18.10", + "version": "16.2.16", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-16.2.16.tgz", + "integrity": "sha512-gEni21kza41xaRnVWP1sMuiWHS/rdoym5FEEGDo9PG60LwRC4lekIgT09GpTlmMu007UEfo0ccQnGroD6+MqWg==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "2.2.1", + "@angular-devkit/architect": "0.1602.16", + "@angular-devkit/build-webpack": "0.1602.16", + "@angular-devkit/core": "16.2.16", + "@babel/core": "7.22.9", + "@babel/generator": "7.22.9", + "@babel/helper-annotate-as-pure": "7.22.5", + "@babel/helper-split-export-declaration": "7.22.6", + "@babel/plugin-proposal-async-generator-functions": "7.20.7", + "@babel/plugin-transform-async-to-generator": "7.22.5", + "@babel/plugin-transform-runtime": "7.22.9", + "@babel/preset-env": "7.22.9", + "@babel/runtime": "7.22.6", + "@babel/template": "7.22.5", "@discoveryjs/json-ext": "0.5.7", - "@ngtools/webpack": "14.2.7", + "@ngtools/webpack": "16.2.16", + "@vitejs/plugin-basic-ssl": "1.0.1", "ansi-colors": "4.1.3", - "babel-loader": "8.2.5", + "autoprefixer": "10.4.14", + "babel-loader": "9.1.3", "babel-plugin-istanbul": "6.1.1", - "browserslist": "^4.9.1", - "cacache": "16.1.2", + "browserslist": "^4.21.5", + "chokidar": "3.5.3", "copy-webpack-plugin": "11.0.0", - "critters": "0.0.16", - "css-loader": "6.7.1", - "esbuild-wasm": "0.15.5", - "glob": "8.0.3", + "critters": "0.0.20", + "css-loader": "6.8.1", + "esbuild-wasm": "0.18.17", + "fast-glob": "3.3.1", + "guess-parser": "0.4.22", "https-proxy-agent": "5.0.1", "inquirer": "8.2.4", - "jsonc-parser": "3.1.0", + "jsonc-parser": "3.2.0", "karma-source-map-support": "1.4.0", "less": "4.1.3", - "less-loader": "11.0.0", + "less-loader": "11.1.0", "license-webpack-plugin": "4.0.2", - "loader-utils": "3.2.0", - "mini-css-extract-plugin": "2.6.1", - "minimatch": "5.1.0", - "open": "8.4.0", + "loader-utils": "3.2.1", + "magic-string": "0.30.1", + "mini-css-extract-plugin": "2.7.6", + "mrmime": "1.0.1", + "open": "8.4.2", "ora": "5.4.1", - "parse5-html-rewriting-stream": "6.0.1", - "piscina": "3.2.0", - "postcss": "8.4.16", - "postcss-import": "15.0.0", - "postcss-loader": "7.0.1", - "postcss-preset-env": "7.8.0", - "regenerator-runtime": "0.13.9", + "parse5-html-rewriting-stream": "7.0.0", + "picomatch": "2.3.1", + "piscina": "4.0.0", + "postcss": "8.4.31", + "postcss-loader": "7.3.3", "resolve-url-loader": "5.0.0", - "rxjs": "6.6.7", - "sass": "1.54.4", - "sass-loader": "13.0.2", - "semver": "7.3.7", - "source-map-loader": "4.0.0", + "rxjs": "7.8.1", + "sass": "1.64.1", + "sass-loader": "13.3.2", + "semver": "7.5.4", + "source-map-loader": "4.0.1", "source-map-support": "0.5.21", - "stylus": "0.59.0", - "stylus-loader": "7.0.0", - "terser": "5.14.2", + "terser": "5.19.2", "text-table": "0.2.0", "tree-kill": "1.2.2", - "tslib": "2.4.0", - "webpack": "5.74.0", - "webpack-dev-middleware": "5.3.3", - "webpack-dev-server": "4.11.0", - "webpack-merge": "5.8.0", + "tslib": "2.6.1", + "vite": "4.5.5", + "webpack": "5.94.0", + "webpack-dev-middleware": "6.1.2", + "webpack-dev-server": "4.15.1", + "webpack-merge": "5.9.0", "webpack-subresource-integrity": "5.1.0" }, "engines": { - "node": "^14.15.0 || >=16.10.0", + "node": "^16.14.0 || >=18.10.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" }, "optionalDependencies": { - "esbuild": "0.15.5" + "esbuild": "0.18.17" }, "peerDependencies": { - "@angular/compiler-cli": "^14.0.0", - "@angular/localize": "^14.0.0", - "@angular/service-worker": "^14.0.0", + "@angular/compiler-cli": "^16.0.0", + "@angular/localize": "^16.0.0", + "@angular/platform-server": "^16.0.0", + "@angular/service-worker": "^16.0.0", + "jest": "^29.5.0", + "jest-environment-jsdom": "^29.5.0", "karma": "^6.3.0", - "ng-packagr": "^14.0.0", + "ng-packagr": "^16.0.0", "protractor": "^7.0.0", "tailwindcss": "^2.0.0 || ^3.0.0", - "typescript": ">=4.6.2 <4.9" + "typescript": ">=4.9.3 <5.2" }, "peerDependenciesMeta": { "@angular/localize": { "optional": true }, + "@angular/platform-server": { + "optional": true + }, "@angular/service-worker": { "optional": true }, + "jest": { + "optional": true + }, + "jest-environment-jsdom": { + "optional": true + }, "karma": { "optional": true }, @@ -231,57 +248,318 @@ } } }, - "node_modules/@angular-devkit/build-angular/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "node_modules/@angular-devkit/build-angular/node_modules/@angular-devkit/architect": { + "version": "0.1602.16", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1602.16.tgz", + "integrity": "sha512-aWEeGU4UlbrSKpcAZsldVNxNXAWEeu9hM2BPk77GftbRC8PBMWpgYyrJWTz2ryn8aSmGKT3T8OyBH4gZA/667w==", "dev": true, "dependencies": { - "balanced-match": "^1.0.0" + "@angular-devkit/core": "16.2.16", + "rxjs": "7.8.1" + }, + "engines": { + "node": "^16.14.0 || >=18.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" } }, - "node_modules/@angular-devkit/build-angular/node_modules/glob": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz", - "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", + "node_modules/@angular-devkit/build-angular/node_modules/@angular-devkit/core": { + "version": "16.2.16", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-16.2.16.tgz", + "integrity": "sha512-5xHs9JFmp78sydrOAg0UGErxfMVv5c2f3RXoikS7eBOOXTWEi5pmnOkOvSJ3loQFGVs3Y7i+u02G3VrF5ZxOrA==", "dev": true, "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" + "ajv": "8.12.0", + "ajv-formats": "2.1.1", + "jsonc-parser": "3.2.0", + "picomatch": "2.3.1", + "rxjs": "7.8.1", + "source-map": "0.7.4" }, "engines": { - "node": ">=12" + "node": "^16.14.0 || >=18.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "chokidar": "^3.5.2" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@angular-devkit/core/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@babel/core": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.9.tgz", + "integrity": "sha512-G2EgeufBcYw27U4hhoIwFcgc1XU7TlXJ3mv04oOv1WCuo900U/anZSPzEqNjwdjgffkk2Gs0AN0dW1CKVLcG7w==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.5", + "@babel/generator": "^7.22.9", + "@babel/helper-compilation-targets": "^7.22.9", + "@babel/helper-module-transforms": "^7.22.9", + "@babel/helpers": "^7.22.6", + "@babel/parser": "^7.22.7", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.8", + "@babel/types": "^7.22.5", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.2", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/ajv": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.16.0.tgz", + "integrity": "sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.4.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/@angular-devkit/build-angular/node_modules/minimatch": { + "node_modules/@angular-devkit/build-angular/node_modules/ajv-keywords": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", - "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", "dev": true, "dependencies": { - "brace-expansion": "^2.0.1" + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/babel-loader": { + "version": "9.1.3", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.3.tgz", + "integrity": "sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw==", + "dev": true, + "dependencies": { + "find-cache-dir": "^4.0.0", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 14.15.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0", + "webpack": ">=5" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/find-cache-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz", + "integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==", + "dev": true, + "dependencies": { + "common-path-prefix": "^3.0.0", + "pkg-dir": "^7.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/find-up": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", + "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", + "dev": true, + "dependencies": { + "locate-path": "^7.1.0", + "path-exists": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/@angular-devkit/build-angular/node_modules/locate-path": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", + "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", + "dev": true, + "dependencies": { + "p-locate": "^6.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/p-locate": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "dev": true, + "dependencies": { + "p-limit": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/path-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/pkg-dir": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", + "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==", + "dev": true, + "dependencies": { + "find-up": "^6.3.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dev": true, + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/schema-utils": { + "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.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" }, "engines": { "node": ">=10" } }, + "node_modules/@angular-devkit/build-angular/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/@angular-devkit/build-webpack": { - "version": "0.1402.7", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1402.7.tgz", - "integrity": "sha512-aDhS/ODt8BwgtnNN73R7SuMC1GgoT5Pajn1nnIWvvpGj8XchLUbguptyl2v7D2QeYXXsd34Gtx8cDOr9PxYFTA==", + "version": "0.1602.16", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1602.16.tgz", + "integrity": "sha512-b99Sj0btI0C2GIfzoyP8epDMIOLqSTqXOxw6klGtBLaGZfM5KAxqFzekXh8cAnHxWCj20WdNhezS1eUTLOkaIA==", "dev": true, "dependencies": { - "@angular-devkit/architect": "0.1402.7", - "rxjs": "6.6.7" + "@angular-devkit/architect": "0.1602.16", + "rxjs": "7.8.1" }, "engines": { - "node": "^14.15.0 || >=16.10.0", + "node": "^16.14.0 || >=18.10.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" }, @@ -290,20 +568,36 @@ "webpack-dev-server": "^4.0.0" } }, - "node_modules/@angular-devkit/core": { - "version": "14.2.7", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-14.2.7.tgz", - "integrity": "sha512-83SCYP3h6fglWMgAXFDc8HfOxk9t3ugK0onATXchctvA7blW4Vx8BSg3/DgbqCv+fF380SN8bYqqLJl8fQFdzg==", + "node_modules/@angular-devkit/build-webpack/node_modules/@angular-devkit/architect": { + "version": "0.1602.16", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1602.16.tgz", + "integrity": "sha512-aWEeGU4UlbrSKpcAZsldVNxNXAWEeu9hM2BPk77GftbRC8PBMWpgYyrJWTz2ryn8aSmGKT3T8OyBH4gZA/667w==", + "dev": true, + "dependencies": { + "@angular-devkit/core": "16.2.16", + "rxjs": "7.8.1" + }, + "engines": { + "node": "^16.14.0 || >=18.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular-devkit/build-webpack/node_modules/@angular-devkit/core": { + "version": "16.2.16", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-16.2.16.tgz", + "integrity": "sha512-5xHs9JFmp78sydrOAg0UGErxfMVv5c2f3RXoikS7eBOOXTWEi5pmnOkOvSJ3loQFGVs3Y7i+u02G3VrF5ZxOrA==", "dev": true, "dependencies": { - "ajv": "8.11.0", + "ajv": "8.12.0", "ajv-formats": "2.1.1", - "jsonc-parser": "3.1.0", - "rxjs": "6.6.7", + "jsonc-parser": "3.2.0", + "picomatch": "2.3.1", + "rxjs": "7.8.1", "source-map": "0.7.4" }, "engines": { - "node": "^14.15.0 || >=16.10.0", + "node": "^16.14.0 || >=18.10.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" }, @@ -316,10 +610,10 @@ } } }, - "node_modules/@angular-devkit/core/node_modules/ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "node_modules/@angular-devkit/build-webpack/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", "dev": true, "dependencies": { "fast-deep-equal": "^3.1.1", @@ -332,13 +626,22 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/@angular-devkit/core/node_modules/json-schema-traverse": { + "node_modules/@angular-devkit/build-webpack/node_modules/json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true }, - "node_modules/@angular-devkit/core/node_modules/source-map": { + "node_modules/@angular-devkit/build-webpack/node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dev": true, + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/@angular-devkit/build-webpack/node_modules/source-map": { "version": "0.7.4", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", @@ -347,389 +650,353 @@ "node": ">= 8" } }, - "node_modules/@angular-devkit/schematics": { - "version": "14.2.7", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-14.2.7.tgz", - "integrity": "sha512-3e2dpFXWl2Z4Gfm+KgY3gAeqsyu8utJMcDIg5sWRAXDeJJdAPc5LweCa8YZEn33Zr9cl8oK+FxlOr15RCyWLcA==", + "node_modules/@angular-devkit/core": { + "version": "16.2.14", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-16.2.14.tgz", + "integrity": "sha512-Ui14/d2+p7lnmXlK/AX2ieQEGInBV75lonNtPQgwrYgskF8ufCuN0DyVZQUy9fJDkC+xQxbJyYrby/BS0R0e7w==", "dev": true, "dependencies": { - "@angular-devkit/core": "14.2.7", - "jsonc-parser": "3.1.0", - "magic-string": "0.26.2", - "ora": "5.4.1", - "rxjs": "6.6.7" + "ajv": "8.12.0", + "ajv-formats": "2.1.1", + "jsonc-parser": "3.2.0", + "picomatch": "2.3.1", + "rxjs": "7.8.1", + "source-map": "0.7.4" }, "engines": { - "node": "^14.15.0 || >=16.10.0", + "node": "^16.14.0 || >=18.10.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "chokidar": "^3.5.2" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } } }, - "node_modules/@angular-eslint/builder": { - "version": "14.1.2", - "resolved": "https://registry.npmjs.org/@angular-eslint/builder/-/builder-14.1.2.tgz", - "integrity": "sha512-J+LRidjlJOGfRNXJwUyOhz5TnasEBK+kL3QkkCE4ZSt/dH40QqT+3q9qV5zc45wdaAeJM4/jp1IhI6kPwWI5Yw==", + "node_modules/@angular-devkit/core/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", "dev": true, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0", - "typescript": "*" + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/@angular-eslint/bundled-angular-compiler": { - "version": "14.1.2", - "resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-14.1.2.tgz", - "integrity": "sha512-d5/jTKXP+t9hNSucj3m8zZYBl62fZ2xFMVNbAOArYAkA7WwwX3D7Gae57BNW54cd2fl2/is7Dn6UgYhu1wqkSQ==", + "node_modules/@angular-devkit/core/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true }, - "node_modules/@angular-eslint/eslint-plugin": { - "version": "14.1.2", - "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-14.1.2.tgz", - "integrity": "sha512-5pJaTcFfM7yDHNtMxw3uNTpBTLjNYH9mlOLX5FFQ9EahAuycwCtV8VJkIntK2ZiOTdRVJYA9/PEdD/xVxX02rw==", + "node_modules/@angular-devkit/core/node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", "dev": true, "dependencies": { - "@angular-eslint/utils": "14.1.2", - "@typescript-eslint/utils": "5.37.0" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0", - "typescript": "*" + "tslib": "^2.1.0" } }, - "node_modules/@angular-eslint/eslint-plugin-template": { - "version": "14.1.2", - "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-14.1.2.tgz", - "integrity": "sha512-gMgYJ8ZwPvq2H/YEzPztVRAK2NYs2cJFUDZD4iGjSRtDgYq9OHjyTo+r6tkcyjcK2qvesy0RccHQKh+x3hYMTA==", + "node_modules/@angular-devkit/core/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, - "dependencies": { - "@angular-eslint/bundled-angular-compiler": "14.1.2", - "@typescript-eslint/type-utils": "5.37.0", - "@typescript-eslint/utils": "5.37.0", - "aria-query": "5.0.2", - "axobject-query": "3.0.1" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0", - "typescript": "*" + "engines": { + "node": ">= 8" } }, - "node_modules/@angular-eslint/schematics": { - "version": "14.0.1", - "resolved": "https://registry.npmjs.org/@angular-eslint/schematics/-/schematics-14.0.1.tgz", - "integrity": "sha512-TlsqLZ/QpUeHFm2U5xxxIFdAYiQe57FDcAVSVkscpV+YzCd177XPYD37Zk/NUBH3eFQ+uDmlVMZbfPl5CUaUVA==", + "node_modules/@angular-devkit/schematics": { + "version": "16.2.14", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-16.2.14.tgz", + "integrity": "sha512-B6LQKInCT8w5zx5Pbroext5eFFRTCJdTwHN8GhcVS8IeKCnkeqVTQLjB4lBUg7LEm8Y7UHXwzrVxmk+f+MBXhw==", "dev": true, "dependencies": { - "@angular-eslint/eslint-plugin": "14.0.1", - "@angular-eslint/eslint-plugin-template": "14.0.1", - "ignore": "5.2.0", - "strip-json-comments": "3.1.1", - "tmp": "0.2.1" + "@angular-devkit/core": "16.2.14", + "jsonc-parser": "3.2.0", + "magic-string": "0.30.1", + "ora": "5.4.1", + "rxjs": "7.8.1" }, - "peerDependencies": { - "@angular/cli": ">= 14.0.0 < 15.0.0" + "engines": { + "node": "^16.14.0 || >=18.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" } }, - "node_modules/@angular-eslint/schematics/node_modules/@angular-eslint/bundled-angular-compiler": { - "version": "14.0.1", - "resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-14.0.1.tgz", - "integrity": "sha512-DOED3Y74k3tv63Io/4Rg43/HPGjR16CyKhX/OviFl8dxxPYTp53bIIgYwoQG6dLDx33ZYjzxP5iufvDvfhHlWg==", - "dev": true - }, - "node_modules/@angular-eslint/schematics/node_modules/@angular-eslint/eslint-plugin": { - "version": "14.0.1", - "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-14.0.1.tgz", - "integrity": "sha512-QJ8GN1PmCDnDNlGNz5QCUSKjcGYhxt5Hz1xe+vSU5BZDr9SA3FfF9yYisFW+DjI9+GfgzWVqhxT9/ueIdJpZzg==", + "node_modules/@angular-devkit/schematics/node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", "dev": true, "dependencies": { - "@angular-eslint/utils": "14.0.1", - "@typescript-eslint/utils": "5.29.0" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0", - "typescript": "*" + "tslib": "^2.1.0" } }, - "node_modules/@angular-eslint/schematics/node_modules/@angular-eslint/eslint-plugin-template": { - "version": "14.0.1", - "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-14.0.1.tgz", - "integrity": "sha512-/D6kzmzzFJKDPd+PmJ3N7tZiahbnDZndndcKFP9FiiYXLRM8knhpLc92jGahJk3pZvxh04GOPKgg4FhkNa3XYQ==", + "node_modules/@angular-eslint/builder": { + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/builder/-/builder-16.3.1.tgz", + "integrity": "sha512-PmIOnRwqdOW1bvZtpTGBTDcOq/Czm3D+IPC/k90yIMs1VsAtcxqUmUtELje+ylJeb2LPeEZavekSnEpcatM4HQ==", "dev": true, "dependencies": { - "@angular-eslint/bundled-angular-compiler": "14.0.1", - "@typescript-eslint/utils": "5.29.0", - "aria-query": "5.0.0", - "axobject-query": "3.0.1" + "@nx/devkit": "16.5.1", + "nx": "16.5.1" }, "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0", + "eslint": "^7.20.0 || ^8.0.0", "typescript": "*" } }, - "node_modules/@angular-eslint/schematics/node_modules/@angular-eslint/utils": { - "version": "14.0.1", - "resolved": "https://registry.npmjs.org/@angular-eslint/utils/-/utils-14.0.1.tgz", - "integrity": "sha512-nPipaVEi8fL6EylmqPyMh+U30LqPcFOa+rN3akfe1T+z/Pdrg+hxH7qE+4ZG6jS0TuDOKycc7gniu0Ol1KmhXA==", + "node_modules/@angular-eslint/bundled-angular-compiler": { + "version": "15.2.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-15.2.1.tgz", + "integrity": "sha512-LO7Am8eVCr7oh6a0VmKSL7K03CnQEQhFO7Wt/YtbfYOxVjrbwmYLwJn+wZPOT7A02t/BttOD/WXuDrOWtSMQ/Q==", + "dev": true + }, + "node_modules/@angular-eslint/eslint-plugin": { + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-16.3.1.tgz", + "integrity": "sha512-kSc8ESfoy8TUSthbq0Lpq9e17I+3Smy4rHoNpKCFEGuJgPs0+OssZMxB6a5EawGbv2EKTPEtrxzFm1WsLR0U9Q==", "dev": true, "dependencies": { - "@angular-eslint/bundled-angular-compiler": "14.0.1", - "@typescript-eslint/utils": "5.29.0" + "@angular-eslint/utils": "16.3.1", + "@typescript-eslint/utils": "5.62.0" }, "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0", + "eslint": "^7.20.0 || ^8.0.0", "typescript": "*" } }, - "node_modules/@angular-eslint/schematics/node_modules/@typescript-eslint/scope-manager": { - "version": "5.29.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.29.0.tgz", - "integrity": "sha512-etbXUT0FygFi2ihcxDZjz21LtC+Eps9V2xVx09zFoN44RRHPrkMflidGMI+2dUs821zR1tDS6Oc9IXxIjOUZwA==", + "node_modules/@angular-eslint/eslint-plugin-template": { + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-16.3.1.tgz", + "integrity": "sha512-+RcFEWqNiRt3+5jXvmlIDlXtP9+vjdmgmVL6tt8yDbqdjBOewtyMu4pE4YaR4sFboyxgME9PbO2WrOyPXh6xjg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.29.0", - "@typescript-eslint/visitor-keys": "5.29.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "@angular-eslint/bundled-angular-compiler": "16.3.1", + "@angular-eslint/utils": "16.3.1", + "@typescript-eslint/type-utils": "5.62.0", + "@typescript-eslint/utils": "5.62.0", + "aria-query": "5.3.0", + "axobject-query": "4.0.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "peerDependencies": { + "eslint": "^7.20.0 || ^8.0.0", + "typescript": "*" } }, - "node_modules/@angular-eslint/schematics/node_modules/@typescript-eslint/types": { - "version": "5.29.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.29.0.tgz", - "integrity": "sha512-X99VbqvAXOMdVyfFmksMy3u8p8yoRGITgU1joBJPzeYa0rhdf5ok9S56/itRoUSh99fiDoMtarSIJXo7H/SnOg==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } + "node_modules/@angular-eslint/eslint-plugin-template/node_modules/@angular-eslint/bundled-angular-compiler": { + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-16.3.1.tgz", + "integrity": "sha512-m4WP1xwS9XLcC/3n6lIcG5HZoai/5eb5W3xm48GVcv//0qE2p7S96RSgKPgGHvif5pF8O9xAqEWs3gDEG45+7A==", + "dev": true }, - "node_modules/@angular-eslint/schematics/node_modules/@typescript-eslint/typescript-estree": { - "version": "5.29.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.29.0.tgz", - "integrity": "sha512-mQvSUJ/JjGBdvo+1LwC+GY2XmSYjK1nAaVw2emp/E61wEVYEyibRHCqm1I1vEKbXCpUKuW4G7u9ZCaZhJbLoNQ==", + "node_modules/@angular-eslint/schematics": { + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/schematics/-/schematics-16.3.1.tgz", + "integrity": "sha512-cqrdobdtRY2XjLa6PhuGOQ7UhTRk2AvWS01sKeGjZ94nQJm5NUtEUyf6u3deIPYllW7gSAWjYzKUObKcTW/R+g==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.29.0", - "@typescript-eslint/visitor-keys": "5.29.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "@angular-eslint/eslint-plugin": "16.3.1", + "@angular-eslint/eslint-plugin-template": "16.3.1", + "@nx/devkit": "16.5.1", + "ignore": "5.2.4", + "nx": "16.5.1", + "strip-json-comments": "3.1.1", + "tmp": "0.2.1" }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "peerDependencies": { + "@angular/cli": ">= 16.0.0 < 17.0.0" } }, - "node_modules/@angular-eslint/schematics/node_modules/@typescript-eslint/utils": { - "version": "5.29.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.29.0.tgz", - "integrity": "sha512-3Eos6uP1nyLOBayc/VUdKZikV90HahXE5Dx9L5YlSd/7ylQPXhLk1BYb29SDgnBnTp+jmSZUU0QxUiyHgW4p7A==", + "node_modules/@angular-eslint/template-parser": { + "version": "15.2.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/template-parser/-/template-parser-15.2.1.tgz", + "integrity": "sha512-ViCi79gC2aKJecmYLkOT+QlT5WMRNXeYz0Dr9Pr8qXzIbY0oAWE7nOT5jkXwQ9oUk+ybtGCWHma5JVJWVJsIog==", "dev": true, "dependencies": { - "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.29.0", - "@typescript-eslint/types": "5.29.0", - "@typescript-eslint/typescript-estree": "5.29.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "@angular-eslint/bundled-angular-compiler": "15.2.1", + "eslint-scope": "^7.0.0" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "eslint": "^7.20.0 || ^8.0.0", + "typescript": "*" } }, - "node_modules/@angular-eslint/schematics/node_modules/@typescript-eslint/visitor-keys": { - "version": "5.29.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.29.0.tgz", - "integrity": "sha512-Hpb/mCWsjILvikMQoZIE3voc9wtQcS0A9FUw3h8bhr9UxBdtI/tw1ZDZUOXHXLOVMedKCH5NxyzATwnU78bWCQ==", + "node_modules/@angular-eslint/template-parser/node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.29.0", - "eslint-visitor-keys": "^3.3.0" + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@angular-eslint/schematics/node_modules/aria-query": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.0.0.tgz", - "integrity": "sha512-V+SM7AbUwJ+EBnB8+DXs0hPZHO0W6pqBcc0dW90OwtVG02PswOu/teuARoLQjdDOH+t9pJgGnW5/Qmouf3gPJg==", - "dev": true, - "engines": { - "node": ">=6.0" + "url": "https://opencollective.com/eslint" } }, - "node_modules/@angular-eslint/schematics/node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "node_modules/@angular-eslint/template-parser/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, "engines": { - "node": ">=10" - } - }, - "node_modules/@angular-eslint/template-parser": { - "version": "14.1.2", - "resolved": "https://registry.npmjs.org/@angular-eslint/template-parser/-/template-parser-14.1.2.tgz", - "integrity": "sha512-bQI+poQDIyR3OU9EQzJeLYRtmsvjFGtV5dc+4XPJ6eIyRAc8baCG/0V/cOrpofIdSf7e/sCV8H7rXcFg6tSdUw==", - "dev": true, - "dependencies": { - "@angular-eslint/bundled-angular-compiler": "14.1.2", - "eslint-scope": "^5.1.0" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0", - "typescript": "*" + "node": ">=4.0" } }, "node_modules/@angular-eslint/utils": { - "version": "14.1.2", - "resolved": "https://registry.npmjs.org/@angular-eslint/utils/-/utils-14.1.2.tgz", - "integrity": "sha512-EtblG9zO0+kWG9EHsoEshFKvsH5DMSK1DqwQsNOVGAF0Aa5DFOqrwouJUyBNJ0d4fSWI9QcuzVkZ1x9JyLIeXQ==", + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/utils/-/utils-16.3.1.tgz", + "integrity": "sha512-tEBcce0rG+DmcPO8jhRffUFDioGw3G4cUAE15XlRctY1J3QzOBH9HdUOTDt0mMjBgpWCzh0YVT1Moh2bPXU9Xg==", "dev": true, "dependencies": { - "@angular-eslint/bundled-angular-compiler": "14.1.2", - "@typescript-eslint/utils": "5.37.0" + "@angular-eslint/bundled-angular-compiler": "16.3.1", + "@typescript-eslint/utils": "5.62.0" }, "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0", + "eslint": "^7.20.0 || ^8.0.0", "typescript": "*" } }, + "node_modules/@angular-eslint/utils/node_modules/@angular-eslint/bundled-angular-compiler": { + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-16.3.1.tgz", + "integrity": "sha512-m4WP1xwS9XLcC/3n6lIcG5HZoai/5eb5W3xm48GVcv//0qE2p7S96RSgKPgGHvif5pF8O9xAqEWs3gDEG45+7A==", + "dev": true + }, "node_modules/@angular/animations": { - "version": "14.2.8", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-14.2.8.tgz", - "integrity": "sha512-9YKmaebHW1F/N63TS1EboBQ5Gniq1ogWQ2XEypy057LfcnoPtVkRbAsl2pUJWbUjDZK9f2BpWfXXm9i5ZxIW3A==", + "version": "16.2.12", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-16.2.12.tgz", + "integrity": "sha512-MD0ElviEfAJY8qMOd6/jjSSvtqER2RDAi0lxe6EtUacC1DHCYkaPrKW4vLqY+tmZBg1yf+6n+uS77pXcHHcA3w==", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^14.15.0 || >=16.10.0" + "node": "^16.14.0 || >=18.10.0" }, "peerDependencies": { - "@angular/core": "14.2.8" + "@angular/core": "16.2.12" } }, "node_modules/@angular/cdk": { - "version": "14.2.6", - "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-14.2.6.tgz", - "integrity": "sha512-sihrwk/0emYbE2X+DOIlan7mohED9pKiH2gQh2hk3Ud8jjeW6VmbaGtTCkjs+HRbFc9/44uDHasizxrKnjseyw==", + "version": "16.2.14", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-16.2.14.tgz", + "integrity": "sha512-n6PrGdiVeSTEmM/HEiwIyg6YQUUymZrb5afaNLGFRM5YL0Y8OBqd+XhCjb0OfD/AfgCUtedVEPwNqrfW8KzgGw==", "dependencies": { "tslib": "^2.3.0" }, "optionalDependencies": { - "parse5": "^5.0.0" + "parse5": "^7.1.2" }, "peerDependencies": { - "@angular/common": "^14.0.0 || ^15.0.0", - "@angular/core": "^14.0.0 || ^15.0.0", + "@angular/common": "^16.0.0 || ^17.0.0", + "@angular/core": "^16.0.0 || ^17.0.0", "rxjs": "^6.5.3 || ^7.4.0" } }, + "node_modules/@angular/cdk/node_modules/parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "optional": true, + "dependencies": { + "entities": "^4.4.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, "node_modules/@angular/cli": { - "version": "14.2.7", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-14.2.7.tgz", - "integrity": "sha512-RM4CJwtqD7cKFQ7hNGJ56s9YMeJxYqCN5Ss0SzsKN1nXYqz8HykMW8fhUbZQ9HFVy/Ml3LGoh1yGo/tXywAWcA==", + "version": "16.2.14", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-16.2.14.tgz", + "integrity": "sha512-0y71jtitigVolm4Rim1b8xPQ+B22cGp4Spef2Wunpqj67UowN6tsZaVuWBEQh4u5xauX8LAHKqsvy37ZPWCc4A==", "dev": true, "dependencies": { - "@angular-devkit/architect": "0.1402.7", - "@angular-devkit/core": "14.2.7", - "@angular-devkit/schematics": "14.2.7", - "@schematics/angular": "14.2.7", + "@angular-devkit/architect": "0.1602.14", + "@angular-devkit/core": "16.2.14", + "@angular-devkit/schematics": "16.2.14", + "@schematics/angular": "16.2.14", "@yarnpkg/lockfile": "1.1.0", "ansi-colors": "4.1.3", - "debug": "4.3.4", - "ini": "3.0.0", + "ini": "4.1.1", "inquirer": "8.2.4", - "jsonc-parser": "3.1.0", - "npm-package-arg": "9.1.0", - "npm-pick-manifest": "7.0.1", - "open": "8.4.0", + "jsonc-parser": "3.2.0", + "npm-package-arg": "10.1.0", + "npm-pick-manifest": "8.0.1", + "open": "8.4.2", "ora": "5.4.1", - "pacote": "13.6.2", - "resolve": "1.22.1", - "semver": "7.3.7", + "pacote": "15.2.0", + "resolve": "1.22.2", + "semver": "7.5.4", "symbol-observable": "4.0.0", - "uuid": "8.3.2", - "yargs": "17.5.1" + "yargs": "17.7.2" }, "bin": { "ng": "bin/ng.js" }, "engines": { - "node": "^14.15.0 || >=16.10.0", + "node": "^16.14.0 || >=18.10.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" } }, - "node_modules/@angular/cli/node_modules/ini": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-3.0.0.tgz", - "integrity": "sha512-TxYQaeNW/N8ymDvwAxPyRbhMBtnEwuvaTYpOQkFx1nSeusgezHniEc/l35Vo4iCq/mMiTJbpD7oYxN98hFlfmw==", + "node_modules/@angular/cli/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=10" } }, "node_modules/@angular/common": { - "version": "14.2.8", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-14.2.8.tgz", - "integrity": "sha512-JSPN2h1EcyWjHWtOzRQmoX48ZacTjLAYwW9ZRmBpYs6Ptw5xZ39ARTJfQNcNnJleqYju2E6BNkGnLpbtWQjNDA==", + "version": "16.2.12", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-16.2.12.tgz", + "integrity": "sha512-B+WY/cT2VgEaz9HfJitBmgdk4I333XG/ybC98CMC4Wz8E49T8yzivmmxXB3OD6qvjcOB6ftuicl6WBqLbZNg2w==", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^14.15.0 || >=16.10.0" + "node": "^16.14.0 || >=18.10.0" }, "peerDependencies": { - "@angular/core": "14.2.8", + "@angular/core": "16.2.12", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/compiler": { - "version": "14.2.8", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-14.2.8.tgz", - "integrity": "sha512-lKwp3B4ZKNLgk/25Iyur8bjAwRL20auRoB4EuHrBf+928ftsjYUXTgi+0++DUjPENbpi59k6GcvMCNa6qccvIw==", + "version": "16.2.12", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-16.2.12.tgz", + "integrity": "sha512-6SMXUgSVekGM7R6l1Z9rCtUGtlg58GFmgbpMCsGf+VXxP468Njw8rjT2YZkf5aEPxEuRpSHhDYjqz7n14cwCXQ==", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^14.15.0 || >=16.10.0" + "node": "^16.14.0 || >=18.10.0" }, "peerDependencies": { - "@angular/core": "14.2.8" + "@angular/core": "16.2.12" }, "peerDependenciesMeta": { "@angular/core": { @@ -738,123 +1005,152 @@ } }, "node_modules/@angular/compiler-cli": { - "version": "14.2.8", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-14.2.8.tgz", - "integrity": "sha512-QTftNrAyXOWzKFGY6/i9jh0LB2cOxmykepG4c53wH9LblGvWFztlVOhcoU8tpQSSH8t3EYvGs2r8oUuxcYm5Cw==", + "version": "16.2.12", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-16.2.12.tgz", + "integrity": "sha512-pWSrr152562ujh6lsFZR8NfNc5Ljj+zSTQO44DsuB0tZjwEpnRcjJEgzuhGXr+CoiBf+jTSPZKemtSktDk5aaA==", "dev": true, "dependencies": { - "@babel/core": "^7.17.2", + "@babel/core": "7.23.2", + "@jridgewell/sourcemap-codec": "^1.4.14", "chokidar": "^3.0.0", "convert-source-map": "^1.5.1", - "dependency-graph": "^0.11.0", - "magic-string": "^0.26.0", "reflect-metadata": "^0.1.2", "semver": "^7.0.0", - "sourcemap-codec": "^1.4.8", "tslib": "^2.3.0", "yargs": "^17.2.1" }, "bin": { "ng-xi18n": "bundles/src/bin/ng_xi18n.js", "ngc": "bundles/src/bin/ngc.js", - "ngcc": "bundles/ngcc/main-ngcc.js" + "ngcc": "bundles/ngcc/index.js" }, "engines": { - "node": "^14.15.0 || >=16.10.0" + "node": "^16.14.0 || >=18.10.0" }, "peerDependencies": { - "@angular/compiler": "14.2.8", - "typescript": ">=4.6.2 <4.9" + "@angular/compiler": "16.2.12", + "typescript": ">=4.9.3 <5.2" } }, "node_modules/@angular/core": { - "version": "14.2.8", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-14.2.8.tgz", - "integrity": "sha512-cgnII9vJGJDLsfr7KsBfU2l+QQUmQIRIP3ImKhBxicw2IHKCSb2mYwoeLV46jaLyHyUMTLRHKUYUR4XtSPnb8A==", + "version": "16.2.12", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-16.2.12.tgz", + "integrity": "sha512-GLLlDeke/NjroaLYOks0uyzFVo6HyLl7VOm0K1QpLXnYvW63W9Ql/T3yguRZa7tRkOAeFZ3jw+1wnBD4O8MoUA==", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^14.15.0 || >=16.10.0" + "node": "^16.14.0 || >=18.10.0" }, "peerDependencies": { "rxjs": "^6.5.3 || ^7.4.0", - "zone.js": "~0.11.4" - } - }, - "node_modules/@angular/flex-layout": { - "version": "14.0.0-beta.41", - "resolved": "https://registry.npmjs.org/@angular/flex-layout/-/flex-layout-14.0.0-beta.41.tgz", - "integrity": "sha512-x1YcxqkdFlcbVXEy9ebCgW/F+7n/MXkEkwEcVEIPf5v5qn7HZsjQxgIj35Lf0amvMyF7h35prpoxO1uX5+ntFg==", - "deprecated": "This package has been deprecated. Please see https://blog.angular.io/modern-css-in-angular-layouts-4a259dca9127", - "dependencies": { - "tslib": "^2.3.0" - }, - "peerDependencies": { - "@angular/cdk": "^14.0.0", - "@angular/common": "^14.0.0", - "@angular/core": "^14.0.0", - "@angular/platform-browser": "^14.0.0", - "rxjs": "^6.5.3 || ^7.4.0" + "zone.js": "~0.13.0" } }, "node_modules/@angular/forms": { - "version": "14.2.8", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-14.2.8.tgz", - "integrity": "sha512-OaL7Gi6STxJza7yn0qgmh6+hV6NVbtGmunpzrn9cR1k5TeE4ZtXu1z7VZesbZ9kZ3F6U9CmygFt0csf7j1d+Ow==", + "version": "16.2.12", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-16.2.12.tgz", + "integrity": "sha512-1Eao89hlBgLR3v8tU91vccn21BBKL06WWxl7zLpQmG6Hun+2jrThgOE4Pf3os4fkkbH4Apj0tWL2fNIWe/blbw==", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^14.15.0 || >=16.10.0" + "node": "^16.14.0 || >=18.10.0" }, "peerDependencies": { - "@angular/common": "14.2.8", - "@angular/core": "14.2.8", - "@angular/platform-browser": "14.2.8", + "@angular/common": "16.2.12", + "@angular/core": "16.2.12", + "@angular/platform-browser": "16.2.12", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/language-service": { - "version": "14.2.8", - "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-14.2.8.tgz", - "integrity": "sha512-XvLmZB2RbawDjJSwU41XoZvmkHGnKTZ4gM6LyNnER2rSaEQVHmADh39UF/hAHeEosHVeau/PKAvwIcxyPW6YxA==", + "version": "16.2.12", + "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-16.2.12.tgz", + "integrity": "sha512-sZwB+ZEjChx9EYcqPaS4OnhC/q5RcedZjIdM9mCxuU/MtseURRYRI/8Hnm1RHo9qyc5PmsQpg7p9Vp/5hXLUjw==", "dev": true, "engines": { - "node": "^14.15.0 || >=16.10.0" + "node": "^16.14.0 || >=18.10.0" } }, "node_modules/@angular/material": { - "version": "14.2.6", - "resolved": "https://registry.npmjs.org/@angular/material/-/material-14.2.6.tgz", - "integrity": "sha512-HykrjDdDoH03oJkV6REW4cx8mVku38LPAagnfJVtqaKsNxG2KtF+LkSlkumeL2cqacFGen/Pf3QV8hxo4FLWhQ==", - "dependencies": { + "version": "16.2.14", + "resolved": "https://registry.npmjs.org/@angular/material/-/material-16.2.14.tgz", + "integrity": "sha512-zQIxUb23elPfiIvddqkIDYqQhAHa9ZwMblfbv+ug8bxr4D0Dw360jIarxCgMjAcLj7Ccl3GBqZMUnVeM6cjthw==", + "dependencies": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/auto-init": "15.0.0-canary.bc9ae6c9c.0", + "@material/banner": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/button": "15.0.0-canary.bc9ae6c9c.0", + "@material/card": "15.0.0-canary.bc9ae6c9c.0", + "@material/checkbox": "15.0.0-canary.bc9ae6c9c.0", + "@material/chips": "15.0.0-canary.bc9ae6c9c.0", + "@material/circular-progress": "15.0.0-canary.bc9ae6c9c.0", + "@material/data-table": "15.0.0-canary.bc9ae6c9c.0", + "@material/density": "15.0.0-canary.bc9ae6c9c.0", + "@material/dialog": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/drawer": "15.0.0-canary.bc9ae6c9c.0", + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0", + "@material/fab": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/floating-label": "15.0.0-canary.bc9ae6c9c.0", + "@material/form-field": "15.0.0-canary.bc9ae6c9c.0", + "@material/icon-button": "15.0.0-canary.bc9ae6c9c.0", + "@material/image-list": "15.0.0-canary.bc9ae6c9c.0", + "@material/layout-grid": "15.0.0-canary.bc9ae6c9c.0", + "@material/line-ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/linear-progress": "15.0.0-canary.bc9ae6c9c.0", + "@material/list": "15.0.0-canary.bc9ae6c9c.0", + "@material/menu": "15.0.0-canary.bc9ae6c9c.0", + "@material/menu-surface": "15.0.0-canary.bc9ae6c9c.0", + "@material/notched-outline": "15.0.0-canary.bc9ae6c9c.0", + "@material/radio": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/segmented-button": "15.0.0-canary.bc9ae6c9c.0", + "@material/select": "15.0.0-canary.bc9ae6c9c.0", + "@material/shape": "15.0.0-canary.bc9ae6c9c.0", + "@material/slider": "15.0.0-canary.bc9ae6c9c.0", + "@material/snackbar": "15.0.0-canary.bc9ae6c9c.0", + "@material/switch": "15.0.0-canary.bc9ae6c9c.0", + "@material/tab": "15.0.0-canary.bc9ae6c9c.0", + "@material/tab-bar": "15.0.0-canary.bc9ae6c9c.0", + "@material/tab-indicator": "15.0.0-canary.bc9ae6c9c.0", + "@material/tab-scroller": "15.0.0-canary.bc9ae6c9c.0", + "@material/textfield": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/tooltip": "15.0.0-canary.bc9ae6c9c.0", + "@material/top-app-bar": "15.0.0-canary.bc9ae6c9c.0", + "@material/touch-target": "15.0.0-canary.bc9ae6c9c.0", + "@material/typography": "15.0.0-canary.bc9ae6c9c.0", "tslib": "^2.3.0" }, "peerDependencies": { - "@angular/animations": "^14.0.0 || ^15.0.0", - "@angular/cdk": "14.2.6", - "@angular/common": "^14.0.0 || ^15.0.0", - "@angular/core": "^14.0.0 || ^15.0.0", - "@angular/forms": "^14.0.0 || ^15.0.0", - "@angular/platform-browser": "^14.0.0 || ^15.0.0", + "@angular/animations": "^16.0.0 || ^17.0.0", + "@angular/cdk": "16.2.14", + "@angular/common": "^16.0.0 || ^17.0.0", + "@angular/core": "^16.0.0 || ^17.0.0", + "@angular/forms": "^16.0.0 || ^17.0.0", + "@angular/platform-browser": "^16.0.0 || ^17.0.0", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/platform-browser": { - "version": "14.2.8", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-14.2.8.tgz", - "integrity": "sha512-tSASBLXoBE0/Gt6d2nC6BJ1DvbGY5wo2Lb+8WCLSvkfsgVqOh4uRuJ2a0wwjeLFd0ZNmpjG42Ijba4btmCpIjg==", + "version": "16.2.12", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-16.2.12.tgz", + "integrity": "sha512-NnH7ju1iirmVEsUq432DTm0nZBGQsBrU40M3ZeVHMQ2subnGiyUs3QyzDz8+VWLL/T5xTxWLt9BkDn65vgzlIQ==", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^14.15.0 || >=16.10.0" + "node": "^16.14.0 || >=18.10.0" }, "peerDependencies": { - "@angular/animations": "14.2.8", - "@angular/common": "14.2.8", - "@angular/core": "14.2.8" + "@angular/animations": "16.2.12", + "@angular/common": "16.2.12", + "@angular/core": "16.2.12" }, "peerDependenciesMeta": { "@angular/animations": { @@ -863,36 +1159,36 @@ } }, "node_modules/@angular/platform-browser-dynamic": { - "version": "14.2.8", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-14.2.8.tgz", - "integrity": "sha512-CPK8wHnKke8AUKR92XrFuanaKNXDzDm3uVI3DD0NxBo+fLAkiuVaDVIGgO6n6SxQVtwjXJtMXqQuNdzUg4Q9uQ==", + "version": "16.2.12", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-16.2.12.tgz", + "integrity": "sha512-ya54jerNgreCVAR278wZavwjrUWImMr2F8yM5n9HBvsMBbFaAQ83anwbOEiHEF2BlR+gJiEBLfpuPRMw20pHqw==", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^14.15.0 || >=16.10.0" + "node": "^16.14.0 || >=18.10.0" }, "peerDependencies": { - "@angular/common": "14.2.8", - "@angular/compiler": "14.2.8", - "@angular/core": "14.2.8", - "@angular/platform-browser": "14.2.8" + "@angular/common": "16.2.12", + "@angular/compiler": "16.2.12", + "@angular/core": "16.2.12", + "@angular/platform-browser": "16.2.12" } }, "node_modules/@angular/router": { - "version": "14.2.8", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-14.2.8.tgz", - "integrity": "sha512-rbKLsa4/scPP8AxaDRQfkLqfg8CbZ163dPqHMixou90uK/dx00LjCyUeS38/otdAYNZhrD0i5nu+k65qwhLX8w==", + "version": "16.2.12", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-16.2.12.tgz", + "integrity": "sha512-aU6QnYSza005V9P3W6PpkieL56O0IHps96DjqI1RS8yOJUl3THmokqYN4Fm5+HXy4f390FN9i6ftadYQDKeWmA==", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^14.15.0 || >=16.10.0" + "node": "^16.14.0 || >=18.10.0" }, "peerDependencies": { - "@angular/common": "14.2.8", - "@angular/core": "14.2.8", - "@angular/platform-browser": "14.2.8", + "@angular/common": "16.2.12", + "@angular/core": "16.2.12", + "@angular/platform-browser": "16.2.12", "rxjs": "^6.5.3 || ^7.4.0" } }, @@ -903,48 +1199,48 @@ "dev": true }, "node_modules/@babel/code-frame": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", - "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", + "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==", "dev": true, "dependencies": { - "@babel/highlight": "^7.23.4", - "chalk": "^2.4.2" + "@babel/highlight": "^7.24.7", + "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/compat-data": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.0.tgz", - "integrity": "sha512-Gt9jszFJYq7qzXVK4slhc6NzJXnOVmRECWcVjF/T23rNXD9NtWQ0W3qxdg+p9wWIB+VQw3GYV/U2Ha9bRTfs4w==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.7.tgz", + "integrity": "sha512-qJzAIcv03PyaWqxRgO4mSU3lihncDT296vnyuE2O8uA4w3UHWI4S3hgeZd1L8W1Bft40w9JxJ2b412iDUFFRhw==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.10.tgz", - "integrity": "sha512-JQM6k6ENcBFKVtWvLavlvi/mPcpYZ3+R+2EySDEMSMbp7Mn4FexlbbJVrx2R7Ijhr01T8gyqrOaABWIOgxeUyw==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.18.10", - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-module-transforms": "^7.18.9", - "@babel/helpers": "^7.18.9", - "@babel/parser": "^7.18.10", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.18.10", - "@babel/types": "^7.18.10", - "convert-source-map": "^1.7.0", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.2.tgz", + "integrity": "sha512-n7s51eWdaWZ3vGT2tD4T7J6eJs3QoBXydv7vkUM06Bf1cbVD2Kc2UrkzhiQwobfV7NwOnQXYL7UBJ5VPU+RGoQ==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.0", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-module-transforms": "^7.23.0", + "@babel/helpers": "^7.23.2", + "@babel/parser": "^7.23.0", + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.2", + "@babel/types": "^7.23.0", + "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", - "json5": "^2.2.1", - "semver": "^6.3.0" + "json5": "^2.2.3", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -954,6 +1250,41 @@ "url": "https://opencollective.com/babel" } }, + "node_modules/@babel/core/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==", + "dev": true, + "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/core/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==", + "dev": true, + "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/core/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, "node_modules/@babel/core/node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -964,74 +1295,68 @@ } }, "node_modules/@babel/generator": { - "version": "7.18.12", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.12.tgz", - "integrity": "sha512-dfQ8ebCN98SvyL7IxNMCUtZQSq5R7kxgN+r8qYTGDmmSion1hX2C0zq2yo1bsCDhXixokv1SAWTZUMYbO/V5zg==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.9.tgz", + "integrity": "sha512-KtLMbmicyuK2Ak/FTCJVbDnkN1SlT8/kceFTiuDiiRUUSMnHMidxSCdG4ndkTOHHpoomWe/4xkvHkEOncwjYIw==", "dev": true, "dependencies": { - "@babel/types": "^7.18.10", + "@babel/types": "^7.22.5", "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/generator/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, - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", - "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", + "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", "dev": true, "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz", - "integrity": "sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.24.7.tgz", + "integrity": "sha512-xZeCVVdwb4MsDBkkyZ64tReWYrLRHlMN72vP7Bdm3OUOuyFZExhsHUUnuWnm2/XOlAJzR0LfPpB56WXZn0X/lA==", "dev": true, "dependencies": { - "@babel/helper-explode-assignable-expression": "^7.18.6", - "@babel/types": "^7.18.9" + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.0.tgz", - "integrity": "sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.7.tgz", + "integrity": "sha512-ctSdRHBi20qWOfy27RUb4Fhp07KSJ3sXcuSvTrXrc4aG8NSYDo1ici3Vhg9bg69y5bj0Mr1lh0aeEgTvc12rMg==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.20.0", - "@babel/helper-validator-option": "^7.18.6", - "browserslist": "^4.21.3", - "semver": "^6.3.0" + "@babel/compat-data": "^7.24.7", + "@babel/helper-validator-option": "^7.24.7", + "browserslist": "^4.22.2", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" } }, "node_modules/@babel/helper-compilation-targets/node_modules/semver": { @@ -1043,19 +1368,27 @@ "semver": "bin/semver.js" } }, + "node_modules/@babel/helper-compilation-targets/node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.19.0.tgz", - "integrity": "sha512-NRz8DwF4jT3UfrmUoZjd0Uph9HQnP30t7Ash+weACcyNkiYTywpIjDBgReJMKgr+n86sn2nPVVmJ28Dm053Kqw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.7.tgz", + "integrity": "sha512-kTkaDl7c9vO80zeX1rJxnuRpEsD5tA81yh11X1gQo+PhSti3JS+7qeZo9U4RHobKRiFPKaGK3svUAeb8D0Q7eg==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.19.0", - "@babel/helper-member-expression-to-functions": "^7.18.9", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-replace-supers": "^7.18.9", - "@babel/helper-split-export-declaration": "^7.18.6" + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-function-name": "^7.24.7", + "@babel/helper-member-expression-to-functions": "^7.24.7", + "@babel/helper-optimise-call-expression": "^7.24.7", + "@babel/helper-replace-supers": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", + "@babel/helper-split-export-declaration": "^7.24.7", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -1064,40 +1397,31 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.19.0.tgz", - "integrity": "sha512-htnV+mHX32DF81amCDrwIDr8nrp1PTm+3wfBN9/v8QJOLEioOCOG7qNyq0nHeFiWbT3Eb7gsPwEmV64UCQ1jzw==", + "node_modules/@babel/helper-create-class-features-plugin/node_modules/@babel/helper-annotate-as-pure": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz", + "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "regexpu-core": "^5.1.0" + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz", - "integrity": "sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==", + "node_modules/@babel/helper-create-class-features-plugin/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==", "dev": true, "dependencies": { - "@babel/helper-compilation-targets": "^7.17.7", - "@babel/helper-plugin-utils": "^7.16.7", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2", - "semver": "^6.1.2" + "@babel/types": "^7.24.7" }, - "peerDependencies": { - "@babel/core": "^7.4.0-0" + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/helper-define-polyfill-provider/node_modules/semver": { + "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", @@ -1106,140 +1430,148 @@ "semver": "bin/semver.js" } }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.24.7.tgz", + "integrity": "sha512-03TCmXy2FtXJEZfbXDTSqq1fRJArk7lX9DOFC/47VthYcxyIOx+eXQmdo6DOQvrbpIix+KfXwvuXdFDZHxt+rA==", "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.7", + "regexpu-core": "^5.3.1", + "semver": "^6.3.1" + }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-explode-assignable-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz", - "integrity": "sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==", + "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/@babel/helper-annotate-as-pure": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz", + "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==", "dev": true, "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, - "dependencies": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" - }, - "engines": { - "node": ">=6.9.0" + "bin": { + "semver": "bin/semver.js" } }, - "node_modules/@babel/helper-function-name/node_modules/@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz", + "integrity": "sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" }, - "engines": { - "node": ">=6.9.0" + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "node_modules/@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==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.9.tgz", - "integrity": "sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg==", + "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==", "dev": true, "dependencies": { - "@babel/types": "^7.18.9" + "@babel/template": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-module-imports": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz", - "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==", + "node_modules/@babel/helper-function-name/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==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/code-frame": "^7.24.7", + "@babel/parser": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.19.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.19.6.tgz", - "integrity": "sha512-fCmcfQo/KYr/VXXDIyd3CBGZ6AFhPFy1TfSEJ+PilGVlQT6jcbqtHAM4C1EciRqMza7/TpOUZliuSH+U6HAhJw==", + "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==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.19.4", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.19.1", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.19.6", - "@babel/types": "^7.19.4" + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz", - "integrity": "sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==", + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.7.tgz", + "integrity": "sha512-LGeMaf5JN4hAT471eJdBs/GK1DoYIJ5GCtZN/EsL6KUiiDZOvO/eKE11AMZJa2zP4zk4qe9V2O/hxAmkRc8p6w==", "dev": true, "dependencies": { - "@babel/types": "^7.18.6" + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "node_modules/@babel/helper-module-imports": { + "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==", "dev": true, + "dependencies": { + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" + }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz", - "integrity": "sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==", + "node_modules/@babel/helper-module-transforms": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.7.tgz", + "integrity": "sha512-1fuJEwIrp+97rM4RWdO+qrRsZlAeL1lQJoPqtCYWv0NL115XM93hIH4CSRln2w52SqvmY5hqdtauB6QFCDiZNQ==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-wrap-function": "^7.18.9", - "@babel/types": "^7.18.9" + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-simple-access": "^7.24.7", + "@babel/helper-split-export-declaration": "^7.24.7", + "@babel/helper-validator-identifier": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1248,346 +1580,277 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-replace-supers": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.19.1.tgz", - "integrity": "sha512-T7ahH7wV0Hfs46SFh5Jz3s0B6+o8g3c+7TMxu7xKfmHikg7EAZ3I2Qk9LFhjxXq8sL7UkP5JflezNwoZa8WvWw==", + "node_modules/@babel/helper-module-transforms/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==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-member-expression-to-functions": "^7.18.9", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/traverse": "^7.19.1", - "@babel/types": "^7.19.0" + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-simple-access": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.19.4.tgz", - "integrity": "sha512-f9Xq6WqBFqaDfbCzn2w85hwklswz5qsKlh7f08w4Y9yhJHpnNC0QemtSkK5YyOY8kPGvyiwdzZksGUhnGdaUIg==", + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.24.7.tgz", + "integrity": "sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A==", "dev": true, "dependencies": { - "@babel/types": "^7.19.4" + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz", - "integrity": "sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==", + "node_modules/@babel/helper-plugin-utils": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.7.tgz", + "integrity": "sha512-Rq76wjt7yz9AAc1KnlRKNAi/dMSVWgDRx43FHoJEbcYU6xOWaE2dVPwcdTukJrjxS65GITyfbvEYHvkirZ6uEg==", "dev": true, - "dependencies": { - "@babel/types": "^7.20.0" - }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.24.7.tgz", + "integrity": "sha512-9pKLcTlZ92hNZMQfGCHImUpDOlAgkkpqalWEeftW5FBya75k8Li2ilerxkM/uBEj01iBZXcCIB/bwvDYgWyibA==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-wrap-function": "^7.24.7" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-string-parser": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", - "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz", - "integrity": "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-wrap-function": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.19.0.tgz", - "integrity": "sha512-txX8aN8CZyYGTwcLhlk87KRqncAzhh5TpQamZUa0/u3an36NtDpUP6bQgBCBcLeBs09R/OwQu3OjK0k/HwfNDg==", + "node_modules/@babel/helper-remap-async-to-generator/node_modules/@babel/helper-annotate-as-pure": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz", + "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==", "dev": true, "dependencies": { - "@babel/helper-function-name": "^7.19.0", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.19.0", - "@babel/types": "^7.19.0" + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helpers": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.0.tgz", - "integrity": "sha512-aGMjYraN0zosCEthoGLdqot1oRsmxVTQRHadsUPz5QM44Zej2PYRz7XiDE7GqnkZnNtLbOuxqoZw42vkU7+XEQ==", + "node_modules/@babel/helper-replace-supers": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.24.7.tgz", + "integrity": "sha512-qTAxxBM81VEyoAY0TtLrx1oAEJc09ZK67Q9ljQToqCnA+55eNwCORaxlKyu+rNfX86o8OXRUSNUnrtsAZXM9sg==", "dev": true, "dependencies": { - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.20.0", - "@babel/types": "^7.20.0" + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-member-expression-to-functions": "^7.24.7", + "@babel/helper-optimise-call-expression": "^7.24.7" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/highlight": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", - "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", + "node_modules/@babel/helper-simple-access": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz", + "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/parser": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.5.tgz", - "integrity": "sha512-hOOqoiNXrmGdFbhgCzu6GiURxUgM27Xwd/aPuu8RfHEZPBzL1Z54okAHAQjXfcQNwvrlkAmAp4SlRTZ45vlthQ==", + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.24.7.tgz", + "integrity": "sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ==", "dev": true, - "bin": { - "parser": "bin/babel-parser.js" + "dependencies": { + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { - "node": ">=6.0.0" + "node": ">=6.9.0" } }, - "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz", - "integrity": "sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==", + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.18.9.tgz", - "integrity": "sha512-AHrP9jadvH7qlOj6PINbgSuphjQUAK7AOT7DPjBo9EHoLhQTnnK5u45e1Hd4DbSQEO9nqPWtQ89r+XEOWFScKg==", + "node_modules/@babel/helper-string-parser": { + "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==", "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9", - "@babel/plugin-proposal-optional-chaining": "^7.18.9" - }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.13.0" } }, - "node_modules/@babel/plugin-proposal-async-generator-functions": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.18.10.tgz", - "integrity": "sha512-1mFuY2TOsR1hxbjCo4QL+qlIjV07p4H4EUYw2J/WCqsvFV6V9X9z9YhXbWndc/4fw+hYGlDT7egYxliMp5O6Ew==", + "node_modules/@babel/helper-validator-identifier": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", + "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/helper-remap-async-to-generator": "^7.18.9", - "@babel/plugin-syntax-async-generators": "^7.8.4" - }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-class-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", - "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", + "node_modules/@babel/helper-validator-option": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.7.tgz", + "integrity": "sha512-yy1/KvjhV/ZCL+SM7hBrvnZJ3ZuT9OuZgIJAGpPEToANvc3iM6iDvBnRjtElWibHU6n8/LPR/EjX9EtIEYO3pw==", "dev": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-class-static-block": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.6.tgz", - "integrity": "sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw==", + "node_modules/@babel/helper-wrap-function": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.24.7.tgz", + "integrity": "sha512-N9JIYk3TD+1vq/wn77YnJOqMtfWhNewNE+DJV4puD2X7Ew9J4JvrzrFDfTfyv5EgEXVy9/Wt8QiOErzEmv5Ifw==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-class-static-block": "^7.14.5" + "@babel/helper-function-name": "^7.24.7", + "@babel/template": "^7.24.7", + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.12.0" } }, - "node_modules/@babel/plugin-proposal-dynamic-import": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz", - "integrity": "sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==", + "node_modules/@babel/helper-wrap-function/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==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" + "@babel/code-frame": "^7.24.7", + "@babel/parser": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-export-namespace-from": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz", - "integrity": "sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==", + "node_modules/@babel/helpers": { + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.9.tgz", + "integrity": "sha512-87ICKgU5t5SzOT7sBMfCOZQ2rHjRU+Pcb9BoILMYz600W6DkVRLFBPwQ18gwUVvggqXivaUakpnxWQGbpywbBQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + "@babel/template": "^7.23.9", + "@babel/traverse": "^7.23.9", + "@babel/types": "^7.23.9" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-json-strings": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz", - "integrity": "sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==", + "node_modules/@babel/helpers/node_modules/@babel/template": { + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.23.9.tgz", + "integrity": "sha512-+xrD2BWLpvHKNmX2QbpdpsBaWnRxahMwJjO+KZk2JOElj5nSmKezyS1B4u+QbHMTX69t4ukm6hh9lsYQ7GHCKA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-json-strings": "^7.8.3" + "@babel/code-frame": "^7.23.5", + "@babel/parser": "^7.23.9", + "@babel/types": "^7.23.9" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.18.9.tgz", - "integrity": "sha512-128YbMpjCrP35IOExw2Fq+x55LMP42DzhOhX2aNNIdI9avSWl2PI0yuBWarr3RYpZBSPtabfadkH2yeRiMD61Q==", + "node_modules/@babel/highlight": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", + "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + "@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" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", - "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", + "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==", "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + "bin": { + "parser": "bin/babel-parser.js" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=6.0.0" } }, - "node_modules/@babel/plugin-proposal-numeric-separator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", - "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.7.tgz", + "integrity": "sha512-unaQgZ/iRu/By6tsjMZzpeBZjChYfLYry6HrEXPoz3KmfF0sVBQ1l8zKMQ4xRGLWVsjuvB8nQfjNP/DcfEOCsg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-proposal-object-rest-spread": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.19.4.tgz", - "integrity": "sha512-wHmj6LDxVDnL+3WhXteUBaoM1aVILZODAUjg11kHqG4cOlfgMQGxw6aCgvrXrmaJR3Bn14oZhImyCPZzRpC93Q==", + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.7.tgz", + "integrity": "sha512-+izXIbke1T33mY4MSNnrqhPXDz01WYhEf3yF5NbnUtkiNnm+XBZJl3kNfoK6NKmYlz/D07+l2GWVK/QfDkNCuQ==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.19.4", - "@babel/helper-compilation-targets": "^7.19.3", - "@babel/helper-plugin-utils": "^7.19.0", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.18.8" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", + "@babel/plugin-transform-optional-chaining": "^7.24.7" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.13.0" } }, - "node_modules/@babel/plugin-proposal-optional-catch-binding": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz", - "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==", + "node_modules/@babel/plugin-proposal-async-generator-functions": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz", + "integrity": "sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-async-generator-functions instead.", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-remap-async-to-generator": "^7.18.9", + "@babel/plugin-syntax-async-generators": "^7.8.4" }, "engines": { "node": ">=6.9.0" @@ -1596,15 +1859,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-optional-chaining": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.18.9.tgz", - "integrity": "sha512-v5nwt4IqBXihxGsW2QmCWMDS3B3bzGIk/EQVZz2ei7f3NJl8NzAJVvUmpDW5q1CRNY+Beb/k58UAH1Km1N411w==", + "node_modules/@babel/plugin-proposal-class-properties": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", + "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -1613,14 +1875,18 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-private-methods": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", - "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", + "node_modules/@babel/plugin-proposal-object-rest-spread": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz", + "integrity": "sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-object-rest-spread instead.", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/compat-data": "^7.20.5", + "@babel/helper-compilation-targets": "^7.20.7", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.20.7" }, "engines": { "node": ">=6.9.0" @@ -1630,16 +1896,10 @@ } }, "node_modules/@babel/plugin-proposal-private-property-in-object": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.18.6.tgz", - "integrity": "sha512-9Rysx7FOctvT5ouj5JODjAFAkgGoudQuLPamZb0v1TGLpapdNaftzifU8NTWQm0IRjqoYypdrSmyWgkocDQ8Dw==", + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" - }, "engines": { "node": ">=6.9.0" }, @@ -1727,12 +1987,12 @@ } }, "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz", - "integrity": "sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.7.tgz", + "integrity": "sha512-Ec3NRUMoi8gskrkBe3fNmEQfxDvY8bgfQpz6jlk/41kX9eUjvpyqWU7PBP/pLAvMaSQjbMNKJmvX57jP+M6bPg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.19.0" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1741,6 +2001,33 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.7.tgz", + "integrity": "sha512-hbX+lKKeUMGihnK8nvKqmXBInriT3GVjzXKFriV3YC6APGxMbP8RZNFwy91+hocLXq90Mta+HshoB31802bb8A==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/plugin-syntax-json-strings": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", @@ -1870,30 +2157,64 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-arrow-functions": { + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.18.6.tgz", - "integrity": "sha512-9S9X9RUefzrsHZmKMbDXxweEH+YlE8JJEuat9FdvW9Qh1cw7W64jELCtWNkPBPX5En45uy28KGvA/AySqUh8CQ==", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", "dev": true, "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.7.tgz", + "integrity": "sha512-Dt9LQs6iEY++gXUwY03DNFat5C2NbO48jj+j/bSAz6b3HgPs39qcPiYt77fDObIcFwj3/C2ICX9YMwGflUoSHQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.7.tgz", + "integrity": "sha512-o+iF77e3u7ZS4AoAuJvapz9Fm001PuD2V3Lp6OSE4FYQke+cSewYtnek+THqGRWyQloRCyvWL1OkyfNEl9vr/g==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-remap-async-to-generator": "^7.24.7", + "@babel/plugin-syntax-async-generators": "^7.8.4" + }, + "engines": { + "node": ">=6.9.0" + }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.18.6.tgz", - "integrity": "sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.22.5.tgz", + "integrity": "sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ==", "dev": true, "dependencies": { - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-remap-async-to-generator": "^7.18.6" + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1903,12 +2224,12 @@ } }, "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz", - "integrity": "sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.7.tgz", + "integrity": "sha512-yO7RAz6EsVQDaBH18IDJcMB1HnrUn2FJ/Jslc/WtPPWcjhpUJXU/rjbwmluzp7v/ZzWcEhTMXELnnsz8djWDwQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1918,12 +2239,28 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.20.0.tgz", - "integrity": "sha512-sXOohbpHZSk7GjxK9b3dKB7CfqUD5DwOH+DggKzOQ7TXYP+RCSbRykfjQmn/zq+rBjycVRtLf9pYhAaEJA786w==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.4.tgz", + "integrity": "sha512-0QqbP6B6HOh7/8iNR4CQU2Th/bbRtBp4KS9vcaZd1fZ0wSh5Fyssg0UCIHwxh+ka+pNDREbVLQnHCMHKZfPwfw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.7.tgz", + "integrity": "sha512-vKbfawVYayKcSeSR5YYzzyXvsDFWU2mD8U5TFeXtbCPLFUqe7GyCgvO6XDHzje862ODrOwy6WCPmKeWHbCFJ4w==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.19.0" + "@babel/helper-create-class-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1932,20 +2269,36 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.7.tgz", + "integrity": "sha512-HMXK3WbBPpZQufbMG4B46A90PkuuhN9vBCb5T8+VAHqvAqvcLi+2cKoukcpmUYkszLhScU3l1iudhrks3DggRQ==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.19.0.tgz", - "integrity": "sha512-YfeEE9kCjqTS9IitkgfJuxjcEtLUHMqa8yUJ6zdz8vR7hKuo6mOy2C05P0F1tdMmDCeuyidKnlrw/iTppHcr2A==", + "version": "7.23.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.23.8.tgz", + "integrity": "sha512-yAYslGsY1bX6Knmg46RjiCiNSwJKv2IUC8qOdYKqMMr0491SXFhcHqOdRDeCRohOOIzwN/90C6mQ9qAKgrP7dg==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-compilation-targets": "^7.19.0", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.19.0", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-plugin-utils": "^7.19.0", - "@babel/helper-replace-supers": "^7.18.9", - "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.20", + "@babel/helper-split-export-declaration": "^7.22.6", "globals": "^11.1.0" }, "engines": { @@ -1956,12 +2309,13 @@ } }, "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.18.9.tgz", - "integrity": "sha512-+i0ZU1bCDymKakLxn5srGHrsAPRELC2WIbzwjLhHW9SIE1cPYkLCL0NlnXMZaM1vhfgA2+M7hySk42VBvrkBRw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.7.tgz", + "integrity": "sha512-25cS7v+707Gu6Ds2oY6tCkUwsJ9YIDbggd9+cu9jzzDgiNq7hR/8dkzxWfKWnTic26vsI3EsCXNd4iEB6e8esQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/template": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1970,13 +2324,27 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-computed-properties/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==", + "dev": true, + "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/plugin-transform-destructuring": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.20.0.tgz", - "integrity": "sha512-1dIhvZfkDVx/zn2S1aFwlruspTt4189j7fEkH0Y0VyuDM6bQt7bD6kLcz3l4IlLG+e5OReaBz9ROAbttRtUHqA==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.3.tgz", + "integrity": "sha512-n225npDqjDIr967cMScVKHXJs7rout1q+tt50inyBCPkyZ8KxeI6d+GIbSBTT/w/9WdlWDOej3V9HE5Lgk57gw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.19.0" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1986,13 +2354,13 @@ } }, "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz", - "integrity": "sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.7.tgz", + "integrity": "sha512-ZOA3W+1RRTSWvyqcMJDLqbchh7U4NRGqwRfFSVbOLS/ePIP4vHB5e8T8eXcuqyN1QkgKyj5wuW0lcS85v4CrSw==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -2002,12 +2370,28 @@ } }, "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz", - "integrity": "sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.7.tgz", + "integrity": "sha512-JdYfXyCRihAe46jUIliuL2/s0x0wObgwwiGxw/UbgJBr20gQBThrokO4nYKgWkD7uBaqM7+9x5TU7NkExZJyzw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.7.tgz", + "integrity": "sha512-sc3X26PhZQDb3JhORmakcbvkeInvxz+A8oda99lj7J60QRuPZvNAk9wQlTBS1ZynelDrDmTU4pw1tyc5d5ZMUg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" }, "engines": { "node": ">=6.9.0" @@ -2017,13 +2401,29 @@ } }, "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz", - "integrity": "sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.7.tgz", + "integrity": "sha512-Rqe/vSc9OYgDajNIK35u7ot+KeCoetqQYFXM4Epf7M7ez3lWlOjrDjrwMei6caCVhfdw+mIKD4cgdGNy5JQotQ==", "dev": true, "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.7.tgz", + "integrity": "sha512-v0K9uNYsPL3oXZ/7F9NNIbAj2jv1whUEtyA6aujhekLs56R++JDQuzRcP2/z4WX5Vg/c5lE9uWZA0/iUoFhLTA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" }, "engines": { "node": ">=6.9.0" @@ -2033,12 +2433,13 @@ } }, "node_modules/@babel/plugin-transform-for-of": { - "version": "7.18.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.8.tgz", - "integrity": "sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.7.tgz", + "integrity": "sha512-wo9ogrDG1ITTTBsy46oGiN1dS9A7MROBTcYsfS8DtsImMkHk9JXJ3EWQM6X2SUw4x80uGPlwj0o00Uoc6nEE3g==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -2048,14 +2449,30 @@ } }, "node_modules/@babel/plugin-transform-function-name": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz", - "integrity": "sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.7.tgz", + "integrity": "sha512-U9FcnA821YoILngSmYkW6FjyQe2TyZD5pHt4EVIhmcTkrJw/3KqcrRSxuOo5tFZJi7TE19iDyI1u+weTI7bn2w==", "dev": true, "dependencies": { - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-function-name": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-compilation-targets": "^7.24.7", + "@babel/helper-function-name": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.7.tgz", + "integrity": "sha512-2yFnBGDvRuxAaE/f0vfBKvtnvvqU8tGpMHqMNpTN2oWMKIR3NqFkjaAgGwawhqK/pIN2T3XdjGPdaG0vDhOBGw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-json-strings": "^7.8.3" }, "engines": { "node": ">=6.9.0" @@ -2065,12 +2482,28 @@ } }, "node_modules/@babel/plugin-transform-literals": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz", - "integrity": "sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.7.tgz", + "integrity": "sha512-vcwCbb4HDH+hWi8Pqenwnjy+UiklO4Kt1vfspcQYFhJdpthSnW8XvWGyDZWKNVrVbVViI/S7K9PDJZiUmP2fYQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.7.tgz", + "integrity": "sha512-4D2tpwlQ1odXmTEIFWy9ELJcZHqrStlzK/dAOWYyxX3zT0iXQB6banjgeOJQXzEc4S0E0a5A+hahxPaEFYftsw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" }, "engines": { "node": ">=6.9.0" @@ -2080,12 +2513,12 @@ } }, "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz", - "integrity": "sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.7.tgz", + "integrity": "sha512-T/hRC1uqrzXMKLQ6UCwMT85S3EvqaBXDGf0FaMf4446Qx9vKwlghvee0+uuZcDUCZU5RuNi4781UQ7R308zzBw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -2095,13 +2528,13 @@ } }, "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.19.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.19.6.tgz", - "integrity": "sha512-uG3od2mXvAtIFQIh0xrpLH6r5fpSQN04gIVovl+ODLdUMANokxQLZnPBHcjmv3GxRjnqwLuHvppjjcelqUFZvg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.7.tgz", + "integrity": "sha512-9+pB1qxV3vs/8Hdmz/CulFB8w2tuu6EB94JZFsjdqxQokwGa9Unap7Bo2gGBGIvPmDIVvQrom7r5m/TCDMURhg==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.19.6", - "@babel/helper-plugin-utils": "^7.19.0" + "@babel/helper-module-transforms": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -2111,14 +2544,14 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.19.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.19.6.tgz", - "integrity": "sha512-8PIa1ym4XRTKuSsOUXqDG0YaOlEuTVvHMe5JCfgBMOtHvJKw/4NGovEGN33viISshG/rZNVrACiBmPQLvWN8xQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.7.tgz", + "integrity": "sha512-iFI8GDxtevHJ/Z22J5xQpVqFLlMNstcLXh994xifFwxxGslr2ZXXLWgtBeLctOD63UFDArdvN6Tg8RFw+aEmjQ==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.19.6", - "@babel/helper-plugin-utils": "^7.19.0", - "@babel/helper-simple-access": "^7.19.4" + "@babel/helper-module-transforms": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-simple-access": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -2128,15 +2561,15 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.19.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.19.6.tgz", - "integrity": "sha512-fqGLBepcc3kErfR9R3DnVpURmckXP7gj7bAlrTQyBxrigFqszZCkFkcoxzCp2v32XmwXLvbw+8Yq9/b+QqksjQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.7.tgz", + "integrity": "sha512-GYQE0tW7YoaN13qFh3O1NCY4MPkUiAH3fiF7UcV/I3ajmDKEdG3l+UOcbAm4zUE3gnvUU+Eni7XrVKo9eO9auw==", "dev": true, "dependencies": { - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-module-transforms": "^7.19.6", - "@babel/helper-plugin-utils": "^7.19.0", - "@babel/helper-validator-identifier": "^7.19.1" + "@babel/helper-hoist-variables": "^7.24.7", + "@babel/helper-module-transforms": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-validator-identifier": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -2146,13 +2579,13 @@ } }, "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz", - "integrity": "sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.7.tgz", + "integrity": "sha512-3aytQvqJ/h9z4g8AsKPLvD4Zqi2qT+L3j7XoFFu1XBlZWEl2/1kWnhmAbxpLgPrHSY0M6UA02jyTiwUVtiKR6A==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-module-transforms": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -2162,13 +2595,13 @@ } }, "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.19.1.tgz", - "integrity": "sha512-oWk9l9WItWBQYS4FgXD4Uyy5kq898lvkXpXQxoJEY1RnvPk4R/Dvu2ebXU9q8lP+rlMwUQTFf2Ok6d78ODa0kw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.24.7.tgz", + "integrity": "sha512-/jr7h/EWeJtk1U/uz2jlsCioHkZk1JJZVcc8oQsJ1dUlaJD83f4/6Zeh2aHt9BIFokHIsSeDfhUmju0+1GPd6g==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.19.0", - "@babel/helper-plugin-utils": "^7.19.0" + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -2178,12 +2611,62 @@ } }, "node_modules/@babel/plugin-transform-new-target": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz", - "integrity": "sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.7.tgz", + "integrity": "sha512-RNKwfRIXg4Ls/8mMTza5oPF5RkOW8Wy/WgMAp1/F1yZ8mMbtwXW+HDoJiOsagWrAhI5f57Vncrmr9XeT4CVapA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.7.tgz", + "integrity": "sha512-Ts7xQVk1OEocqzm8rHMXHlxvsfZ0cEF2yomUqpKENHWMF4zKk175Y4q8H5knJes6PgYad50uuRmt3UJuhBw8pQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.7.tgz", + "integrity": "sha512-e6q1TiVUzvH9KRvicuxdBTUj4AdKSRwzIyFFnfnezpCfP2/7Qmbb8qbU2j7GODbl4JMkblitCQjKYUaX/qkkwA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.7.tgz", + "integrity": "sha512-4QrHAr0aXQCEFni2q4DqKLD31n2DL+RxcwnNjDFkSG0eNQ/xCavnRkfCUjsyqGC2OviNJvZOF/mQqZBw7i2C5Q==", + "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -2193,13 +2676,46 @@ } }, "node_modules/@babel/plugin-transform-object-super": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz", - "integrity": "sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.7.tgz", + "integrity": "sha512-A/vVLwN6lBrMFmMDmPPz0jnE6ZGx7Jq7d6sT/Ev4H65RER6pZ+kczlf1DthF5N0qaPHBsI7UXiE8Zy66nmAovg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-replace-supers": "^7.18.6" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-replace-supers": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.7.tgz", + "integrity": "sha512-uLEndKqP5BfBbC/5jTwPxLh9kqPWWgzN/f8w6UwAIirAEqiIVJWWY312X72Eub09g5KF9+Zn7+hT7sDxmhRuKA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.7.tgz", + "integrity": "sha512-tK+0N9yd4j+x/4hxF3F0e0fu/VdcxU18y5SevtyM/PCFlQvXbR0Zmlo2eBrKtVipGNFzpq56o8WsIIKcJFUCRQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" }, "engines": { "node": ">=6.9.0" @@ -2209,12 +2725,46 @@ } }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.18.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.18.8.tgz", - "integrity": "sha512-ivfbE3X2Ss+Fj8nnXvKJS6sjRG4gzwPMsP+taZC+ZzEGjAYlvENixmt1sZ5Ca6tWls+BlKSGKPJ6OOXvXCbkFg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.7.tgz", + "integrity": "sha512-yGWW5Rr+sQOhK0Ot8hjDJuxU3XLRQGflvT4lhlSY0DFvdb3TwKaY26CJzHtYllU0vT9j58hc37ndFPsqT1SrzA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.7.tgz", + "integrity": "sha512-COTCOkG2hn4JKGEKBADkA8WNb35TGkkRbI5iT845dB+NyqgO8Hn+ajPbSnIQznneJTa3d30scb6iz/DhH8GsJQ==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.7.tgz", + "integrity": "sha512-9z76mxwnwFxMyxZWEgdgECQglF2Q7cFLm0kMf8pGwt+GSJsY0cONKj/UuO4bOH0w/uAel3ekS4ra5CEAyJRmDA==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-create-class-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" }, "engines": { "node": ">=6.9.0" @@ -2223,13 +2773,25 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-private-property-in-object/node_modules/@babel/helper-annotate-as-pure": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz", + "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz", - "integrity": "sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.7.tgz", + "integrity": "sha512-EMi4MLQSHfd2nrCqQEWxFdha2gBCqU4ZcCng4WBGZ5CJL4bBRW0ptdqqDdeirGZcpALazVVNJqRmsO8/+oNCBA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -2287,18 +2849,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-react-jsx/node_modules/@babel/helper-annotate-as-pure": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", - "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-transform-react-pure-annotations": { "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.22.5.tgz", @@ -2315,26 +2865,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-react-pure-annotations/node_modules/@babel/helper-annotate-as-pure": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", - "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.18.6.tgz", - "integrity": "sha512-poqRI2+qiSdeldcz4wTSTXBRryoq3Gc70ye7m7UD5Ww0nE29IXqMl6r7Nd15WBgRd74vloEMlShtH6CKxVzfmQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.7.tgz", + "integrity": "sha512-lq3fvXPdimDrlg6LWBoqj+r/DEWgONuwjuOuQCSYgRroXDH/IdM1C0IZf59fL5cHLpjEH/O6opIRBbqv7ELnuA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "regenerator-transform": "^0.15.0" + "@babel/helper-plugin-utils": "^7.24.7", + "regenerator-transform": "^0.15.2" }, "engines": { "node": ">=6.9.0" @@ -2344,12 +2882,12 @@ } }, "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz", - "integrity": "sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.7.tgz", + "integrity": "sha512-0DUq0pHcPKbjFZCfTss/pGkYMfy3vFWydkUBd9r0GHpIyfs2eCDENvqadMycRS9wZCXR41wucAfJHJmwA0UmoQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -2359,17 +2897,17 @@ } }, "node_modules/@babel/plugin-transform-runtime": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.18.10.tgz", - "integrity": "sha512-q5mMeYAdfEbpBAgzl7tBre/la3LeCxmDO1+wMXRdPWbcoMjR3GiXlCLk7JBZVVye0bqTGNMbt0yYVXX1B1jEWQ==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.22.9.tgz", + "integrity": "sha512-9KjBH61AGJetCPYp/IEyLEp47SyybZb0nDRpBvmtEkm+rUIwxdlKpyNHI1TmsGkeuLclJdleQHRZ8XLBnnh8CQ==", "dev": true, "dependencies": { - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.9", - "babel-plugin-polyfill-corejs2": "^0.3.2", - "babel-plugin-polyfill-corejs3": "^0.5.3", - "babel-plugin-polyfill-regenerator": "^0.4.0", - "semver": "^6.3.0" + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "babel-plugin-polyfill-corejs2": "^0.4.4", + "babel-plugin-polyfill-corejs3": "^0.8.2", + "babel-plugin-polyfill-regenerator": "^0.5.1", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -2388,12 +2926,12 @@ } }, "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz", - "integrity": "sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.7.tgz", + "integrity": "sha512-KsDsevZMDsigzbA09+vacnLpmPH4aWjcZjXdyFKGzpplxhbeB4wYtury3vglQkg6KM/xEPKt73eCjPPf1PgXBA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -2403,13 +2941,13 @@ } }, "node_modules/@babel/plugin-transform-spread": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.19.0.tgz", - "integrity": "sha512-RsuMk7j6n+r752EtzyScnWkQyuJdli6LdO5Klv8Yx0OfPVTcQkIUfS8clx5e9yHXzlnhOZF3CbQ8C2uP5j074w==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.7.tgz", + "integrity": "sha512-x96oO0I09dgMDxJaANcRyD4ellXFLLiWhuwDxKZX5g2rWP1bTPkBSwCYv96VDXVT1bD9aPj8tppr5ITIh8hBng==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.19.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -2419,12 +2957,12 @@ } }, "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz", - "integrity": "sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.7.tgz", + "integrity": "sha512-kHPSIJc9v24zEml5geKg9Mjx5ULpfncj0wRpYtxbvKyTtHCYDkVE3aHQ03FrpEo4gEe2vrJJS1Y9CJTaThA52g==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -2434,12 +2972,12 @@ } }, "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz", - "integrity": "sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.7.tgz", + "integrity": "sha512-AfDTQmClklHCOLxtGoP7HkeMw56k1/bTQjwsfhL6pppo/M4TOBSq+jjBUBLmV/4oeFg4GWMavIl44ZeCtmmZTw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -2449,12 +2987,12 @@ } }, "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz", - "integrity": "sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.7.tgz", + "integrity": "sha512-VtR8hDy7YLB7+Pet9IarXjg/zgCMSF+1mNS/EQEiEaUPoFXCVsHG64SIxcaaI2zJgRiv+YmgaQESUfWAdbjzgg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -2464,12 +3002,28 @@ } }, "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz", - "integrity": "sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.7.tgz", + "integrity": "sha512-U3ap1gm5+4edc2Q/P+9VrBNhGkfnf+8ZqppY71Bo/pzZmXhhLdqgaUl6cuB07O1+AQJtCLfaOmswiNbSQ9ivhw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.7.tgz", + "integrity": "sha512-uH2O4OV5M9FZYQrwc7NdVmMxQJOCCzFeYudlZSzUAHRFeOujQefa92E74TQDVskNHCzOXoigEuoyzHDhaEaK5w==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -2479,13 +3033,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz", - "integrity": "sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.7.tgz", + "integrity": "sha512-hlQ96MBZSAXUq7ltkjtu3FJCCSMx/j629ns3hA3pXnBXjanNP0LHi+JpPeA81zaWgVK1VGH95Xuy7u0RyQ8kMg==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -2494,39 +3048,43 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.7.tgz", + "integrity": "sha512-2G8aAvF4wy1w/AGZkemprdGMRg5o6zPNhbHVImRz3lss55TYCBd6xStN19rt8XJHq20sqV0JbyWjOWwQRwV/wg==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, "node_modules/@babel/preset-env": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.18.10.tgz", - "integrity": "sha512-wVxs1yjFdW3Z/XkNfXKoblxoHgbtUF7/l3PvvP4m02Qz9TZ6uZGxRVYjSQeR87oQmHco9zWitW5J82DJ7sCjvA==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.18.8", - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/helper-validator-option": "^7.18.6", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.9", - "@babel/plugin-proposal-async-generator-functions": "^7.18.10", - "@babel/plugin-proposal-class-properties": "^7.18.6", - "@babel/plugin-proposal-class-static-block": "^7.18.6", - "@babel/plugin-proposal-dynamic-import": "^7.18.6", - "@babel/plugin-proposal-export-namespace-from": "^7.18.9", - "@babel/plugin-proposal-json-strings": "^7.18.6", - "@babel/plugin-proposal-logical-assignment-operators": "^7.18.9", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", - "@babel/plugin-proposal-numeric-separator": "^7.18.6", - "@babel/plugin-proposal-object-rest-spread": "^7.18.9", - "@babel/plugin-proposal-optional-catch-binding": "^7.18.6", - "@babel/plugin-proposal-optional-chaining": "^7.18.9", - "@babel/plugin-proposal-private-methods": "^7.18.6", - "@babel/plugin-proposal-private-property-in-object": "^7.18.6", - "@babel/plugin-proposal-unicode-property-regex": "^7.18.6", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.22.9.tgz", + "integrity": "sha512-wNi5H/Emkhll/bqPjsjQorSykrlfY5OWakd6AulLvMEytpKasMVUpVy8RL4qBIBs5Ac6/5i0/Rv0b/Fg6Eag/g==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.22.9", + "@babel/helper-compilation-targets": "^7.22.9", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-option": "^7.22.5", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.22.5", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.22.5", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-class-properties": "^7.12.13", "@babel/plugin-syntax-class-static-block": "^7.14.5", "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.18.6", + "@babel/plugin-syntax-import-assertions": "^7.22.5", + "@babel/plugin-syntax-import-attributes": "^7.22.5", + "@babel/plugin-syntax-import-meta": "^7.10.4", "@babel/plugin-syntax-json-strings": "^7.8.3", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", @@ -2536,45 +3094,62 @@ "@babel/plugin-syntax-optional-chaining": "^7.8.3", "@babel/plugin-syntax-private-property-in-object": "^7.14.5", "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-transform-arrow-functions": "^7.18.6", - "@babel/plugin-transform-async-to-generator": "^7.18.6", - "@babel/plugin-transform-block-scoped-functions": "^7.18.6", - "@babel/plugin-transform-block-scoping": "^7.18.9", - "@babel/plugin-transform-classes": "^7.18.9", - "@babel/plugin-transform-computed-properties": "^7.18.9", - "@babel/plugin-transform-destructuring": "^7.18.9", - "@babel/plugin-transform-dotall-regex": "^7.18.6", - "@babel/plugin-transform-duplicate-keys": "^7.18.9", - "@babel/plugin-transform-exponentiation-operator": "^7.18.6", - "@babel/plugin-transform-for-of": "^7.18.8", - "@babel/plugin-transform-function-name": "^7.18.9", - "@babel/plugin-transform-literals": "^7.18.9", - "@babel/plugin-transform-member-expression-literals": "^7.18.6", - "@babel/plugin-transform-modules-amd": "^7.18.6", - "@babel/plugin-transform-modules-commonjs": "^7.18.6", - "@babel/plugin-transform-modules-systemjs": "^7.18.9", - "@babel/plugin-transform-modules-umd": "^7.18.6", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.18.6", - "@babel/plugin-transform-new-target": "^7.18.6", - "@babel/plugin-transform-object-super": "^7.18.6", - "@babel/plugin-transform-parameters": "^7.18.8", - "@babel/plugin-transform-property-literals": "^7.18.6", - "@babel/plugin-transform-regenerator": "^7.18.6", - "@babel/plugin-transform-reserved-words": "^7.18.6", - "@babel/plugin-transform-shorthand-properties": "^7.18.6", - "@babel/plugin-transform-spread": "^7.18.9", - "@babel/plugin-transform-sticky-regex": "^7.18.6", - "@babel/plugin-transform-template-literals": "^7.18.9", - "@babel/plugin-transform-typeof-symbol": "^7.18.9", - "@babel/plugin-transform-unicode-escapes": "^7.18.10", - "@babel/plugin-transform-unicode-regex": "^7.18.6", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.22.5", + "@babel/plugin-transform-async-generator-functions": "^7.22.7", + "@babel/plugin-transform-async-to-generator": "^7.22.5", + "@babel/plugin-transform-block-scoped-functions": "^7.22.5", + "@babel/plugin-transform-block-scoping": "^7.22.5", + "@babel/plugin-transform-class-properties": "^7.22.5", + "@babel/plugin-transform-class-static-block": "^7.22.5", + "@babel/plugin-transform-classes": "^7.22.6", + "@babel/plugin-transform-computed-properties": "^7.22.5", + "@babel/plugin-transform-destructuring": "^7.22.5", + "@babel/plugin-transform-dotall-regex": "^7.22.5", + "@babel/plugin-transform-duplicate-keys": "^7.22.5", + "@babel/plugin-transform-dynamic-import": "^7.22.5", + "@babel/plugin-transform-exponentiation-operator": "^7.22.5", + "@babel/plugin-transform-export-namespace-from": "^7.22.5", + "@babel/plugin-transform-for-of": "^7.22.5", + "@babel/plugin-transform-function-name": "^7.22.5", + "@babel/plugin-transform-json-strings": "^7.22.5", + "@babel/plugin-transform-literals": "^7.22.5", + "@babel/plugin-transform-logical-assignment-operators": "^7.22.5", + "@babel/plugin-transform-member-expression-literals": "^7.22.5", + "@babel/plugin-transform-modules-amd": "^7.22.5", + "@babel/plugin-transform-modules-commonjs": "^7.22.5", + "@babel/plugin-transform-modules-systemjs": "^7.22.5", + "@babel/plugin-transform-modules-umd": "^7.22.5", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", + "@babel/plugin-transform-new-target": "^7.22.5", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.22.5", + "@babel/plugin-transform-numeric-separator": "^7.22.5", + "@babel/plugin-transform-object-rest-spread": "^7.22.5", + "@babel/plugin-transform-object-super": "^7.22.5", + "@babel/plugin-transform-optional-catch-binding": "^7.22.5", + "@babel/plugin-transform-optional-chaining": "^7.22.6", + "@babel/plugin-transform-parameters": "^7.22.5", + "@babel/plugin-transform-private-methods": "^7.22.5", + "@babel/plugin-transform-private-property-in-object": "^7.22.5", + "@babel/plugin-transform-property-literals": "^7.22.5", + "@babel/plugin-transform-regenerator": "^7.22.5", + "@babel/plugin-transform-reserved-words": "^7.22.5", + "@babel/plugin-transform-shorthand-properties": "^7.22.5", + "@babel/plugin-transform-spread": "^7.22.5", + "@babel/plugin-transform-sticky-regex": "^7.22.5", + "@babel/plugin-transform-template-literals": "^7.22.5", + "@babel/plugin-transform-typeof-symbol": "^7.22.5", + "@babel/plugin-transform-unicode-escapes": "^7.22.5", + "@babel/plugin-transform-unicode-property-regex": "^7.22.5", + "@babel/plugin-transform-unicode-regex": "^7.22.5", + "@babel/plugin-transform-unicode-sets-regex": "^7.22.5", "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.18.10", - "babel-plugin-polyfill-corejs2": "^0.3.2", - "babel-plugin-polyfill-corejs3": "^0.5.3", - "babel-plugin-polyfill-regenerator": "^0.4.0", - "core-js-compat": "^3.22.1", - "semver": "^6.3.0" + "@babel/types": "^7.22.5", + "babel-plugin-polyfill-corejs2": "^0.4.4", + "babel-plugin-polyfill-corejs3": "^0.8.2", + "babel-plugin-polyfill-regenerator": "^0.5.1", + "core-js-compat": "^3.31.0", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -2628,47 +3203,53 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==", + "dev": true + }, "node_modules/@babel/runtime": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.9.tgz", - "integrity": "sha512-lkqXDcvlFT5rvEjiu6+QYO+1GXrEHRo2LOtS7E4GtX5ESIZOgepqsZBVIj6Pv+a6zqsya9VCgiK1KAK4BvJDAw==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.6.tgz", + "integrity": "sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ==", "dev": true, "dependencies": { - "regenerator-runtime": "^0.13.4" + "regenerator-runtime": "^0.13.11" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/template": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", - "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", + "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.18.10", - "@babel/types": "^7.18.10" + "@babel/code-frame": "^7.22.5", + "@babel/parser": "^7.22.5", + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.5.tgz", - "integrity": "sha512-czx7Xy5a6sapWWRx61m1Ke1Ra4vczu1mCTtJam5zRTBOonfdJ+S/B6HYmGYu3fJtr8GGET3si6IhgWVBhJ/m8w==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.23.5", - "@babel/generator": "^7.23.5", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.5", - "@babel/types": "^7.23.5", - "debug": "^4.1.0", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.7.tgz", + "integrity": "sha512-yb65Ed5S/QAcewNPh0nZczy9JdYXkkAbIsEo+P7BE7yO3txAY30Y/oPa3QkQ5It3xVG2kpKMg9MsdxZaO31uKA==", + "dev": true, + "dependencies": { + "@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": { @@ -2676,42 +3257,40 @@ } }, "node_modules/@babel/traverse/node_modules/@babel/generator": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.5.tgz", - "integrity": "sha512-BPssCHrBD+0YrxviOa3QzpqwhNIXKEtOa2jQrm4FlmkC2apYgRnQcmPWiGZDlGxiNtltnUFolMe8497Esry+jA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.7.tgz", + "integrity": "sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA==", "dev": true, "dependencies": { - "@babel/types": "^7.23.5", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", + "@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/traverse/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "node_modules/@babel/traverse/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==", "dev": true, "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" + "@babel/types": "^7.24.7" }, "engines": { - "node": ">=6.0.0" + "node": ">=6.9.0" } }, "node_modules/@babel/types": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.5.tgz", - "integrity": "sha512-ON5kSOJwVO6xXVRTvOI0eOnWe7VdUcIpsovGo9U/Br4Ie4UVFQTboO2cYnDhAGU6Fp+UxSiT+pMft0SMHfuq6w==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.7.tgz", + "integrity": "sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==", "dev": true, "dependencies": { - "@babel/helper-string-parser": "^7.23.4", - "@babel/helper-validator-identifier": "^7.22.20", + "@babel/helper-string-parser": "^7.24.7", + "@babel/helper-validator-identifier": "^7.24.7", "to-fast-properties": "^2.0.0" }, "engines": { @@ -2721,7 +3300,8 @@ "node_modules/@braintree/sanitize-url": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-6.0.2.tgz", - "integrity": "sha512-Tbsj02wXCbqGmzdnXNk0SOF19ChhRU70BsroIi4Pm6Ehp56in6vch94mfbdQ17DozxkL3BAVjbZ4Qc1a0HFRAg==" + "integrity": "sha512-Tbsj02wXCbqGmzdnXNk0SOF19ChhRU70BsroIi4Pm6Ehp56in6vch94mfbdQ17DozxkL3BAVjbZ4Qc1a0HFRAg==", + "optional": true }, "node_modules/@cspotcode/source-map-support": { "version": "0.8.1", @@ -2745,291 +3325,10 @@ "@jridgewell/sourcemap-codec": "^1.4.10" } }, - "node_modules/@csstools/postcss-cascade-layers": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-1.1.1.tgz", - "integrity": "sha512-+KdYrpKC5TgomQr2DlZF4lDEpHcoxnj5IGddYYfBWJAKfj1JtuHUIqMa+E1pJJ+z3kvDViWMqyqPlG4Ja7amQA==", - "dev": true, - "dependencies": { - "@csstools/selector-specificity": "^2.0.2", - "postcss-selector-parser": "^6.0.10" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/@csstools/postcss-color-function": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-1.1.1.tgz", - "integrity": "sha512-Bc0f62WmHdtRDjf5f3e2STwRAl89N2CLb+9iAwzrv4L2hncrbDwnQD9PCq0gtAt7pOI2leIV08HIBUd4jxD8cw==", - "dev": true, - "dependencies": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/@csstools/postcss-font-format-keywords": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-1.0.1.tgz", - "integrity": "sha512-ZgrlzuUAjXIOc2JueK0X5sZDjCtgimVp/O5CEqTcs5ShWBa6smhWYbS0x5cVc/+rycTDbjjzoP0KTDnUneZGOg==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/@csstools/postcss-hwb-function": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-1.0.2.tgz", - "integrity": "sha512-YHdEru4o3Rsbjmu6vHy4UKOXZD+Rn2zmkAmLRfPet6+Jz4Ojw8cbWxe1n42VaXQhD3CQUXXTooIy8OkVbUcL+w==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/@csstools/postcss-ic-unit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-1.0.1.tgz", - "integrity": "sha512-Ot1rcwRAaRHNKC9tAqoqNZhjdYBzKk1POgWfhN4uCOE47ebGcLRqXjKkApVDpjifL6u2/55ekkpnFcp+s/OZUw==", - "dev": true, - "dependencies": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/@csstools/postcss-is-pseudo-class": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-2.0.7.tgz", - "integrity": "sha512-7JPeVVZHd+jxYdULl87lvjgvWldYu+Bc62s9vD/ED6/QTGjy0jy0US/f6BG53sVMTBJ1lzKZFpYmofBN9eaRiA==", - "dev": true, - "dependencies": { - "@csstools/selector-specificity": "^2.0.0", - "postcss-selector-parser": "^6.0.10" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/@csstools/postcss-nested-calc": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-nested-calc/-/postcss-nested-calc-1.0.0.tgz", - "integrity": "sha512-JCsQsw1wjYwv1bJmgjKSoZNvf7R6+wuHDAbi5f/7MbFhl2d/+v+TvBTU4BJH3G1X1H87dHl0mh6TfYogbT/dJQ==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/@csstools/postcss-normalize-display-values": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-1.0.1.tgz", - "integrity": "sha512-jcOanIbv55OFKQ3sYeFD/T0Ti7AMXc9nM1hZWu8m/2722gOTxFg7xYu4RDLJLeZmPUVQlGzo4jhzvTUq3x4ZUw==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/@csstools/postcss-oklab-function": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-1.1.1.tgz", - "integrity": "sha512-nJpJgsdA3dA9y5pgyb/UfEzE7W5Ka7u0CX0/HIMVBNWzWemdcTH3XwANECU6anWv/ao4vVNLTMxhiPNZsTK6iA==", - "dev": true, - "dependencies": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/@csstools/postcss-progressive-custom-properties": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-1.3.0.tgz", - "integrity": "sha512-ASA9W1aIy5ygskZYuWams4BzafD12ULvSypmaLJT2jvQ8G0M3I8PRQhC0h7mG0Z3LI05+agZjqSR9+K9yaQQjA==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.3" - } - }, - "node_modules/@csstools/postcss-stepped-value-functions": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-1.0.1.tgz", - "integrity": "sha512-dz0LNoo3ijpTOQqEJLY8nyaapl6umbmDcgj4AD0lgVQ572b2eqA1iGZYTTWhrcrHztWDDRAX2DGYyw2VBjvCvQ==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/@csstools/postcss-text-decoration-shorthand": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-1.0.0.tgz", - "integrity": "sha512-c1XwKJ2eMIWrzQenN0XbcfzckOLLJiczqy+YvfGmzoVXd7pT9FfObiSEfzs84bpE/VqfpEuAZ9tCRbZkZxxbdw==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/@csstools/postcss-trigonometric-functions": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-1.0.2.tgz", - "integrity": "sha512-woKaLO///4bb+zZC2s80l+7cm07M7268MsyG3M0ActXXEFi6SuhvriQYcb58iiKGbjwwIU7n45iRLEHypB47Og==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/@csstools/postcss-unset-value": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-unset-value/-/postcss-unset-value-1.0.2.tgz", - "integrity": "sha512-c8J4roPBILnelAsdLr4XOAR/GsTm0GJi4XpcfvoWk3U6KiTCqiFYc63KhRMQQX35jYMp4Ao8Ij9+IZRgMfJp1g==", - "dev": true, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/@csstools/selector-specificity": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.0.2.tgz", - "integrity": "sha512-IkpVW/ehM1hWKln4fCA3NzJU8KwD+kIOvPZA4cqxoJHtE21CCzjyp+Kxbu0i5I4tBNOlXPL9mjwnWlL0VEG4Fg==", - "dev": true, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2", - "postcss-selector-parser": "^6.0.10" - } - }, "node_modules/@cypress/request": { - "version": "2.88.12", - "resolved": "https://registry.npmjs.org/@cypress/request/-/request-2.88.12.tgz", - "integrity": "sha512-tOn+0mDZxASFM+cuAP9szGUGPI1HwWVSvdzm7V4cCsPdFTx6qMj29CwaQmRAMIEhORIUBFBsYROYJcveK4uOjA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@cypress/request/-/request-3.0.1.tgz", + "integrity": "sha512-TWivJlJi8ZDx2wGOw1dbLuHJKUYX7bWySw377nlnGOW3hP9/MUKIsEdXT/YngWxVdgNCHRBmFlBipE+5/2ZZlQ==", "dev": true, "dependencies": { "aws-sign2": "~0.7.0", @@ -3045,7 +3344,7 @@ "json-stringify-safe": "~5.0.1", "mime-types": "~2.1.19", "performance-now": "^2.1.0", - "qs": "~6.10.3", + "qs": "6.10.4", "safe-buffer": "^5.1.2", "tough-cookie": "^4.1.3", "tunnel-agent": "^0.6.0", @@ -3739,9 +4038,9 @@ } }, "node_modules/@cypress/webpack-batteries-included-preprocessor/node_modules/webpack": { - "version": "4.46.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.46.0.tgz", - "integrity": "sha512-6jJuJjg8znb/xRItk7bkT0+Q7AHCYjjFnvKIWQPkNIOyRqoCGvkOs0ipeQzrqz4l5FtN5ZI/ukEHroeX/o1/5Q==", + "version": "4.47.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.47.0.tgz", + "integrity": "sha512-td7fYwgLSrky3fI1EuU5cneU4+pbH6GgOfuKNS1tNPcfdGinGELAqsb/BP4nnvZyKSG2i/xFGU7+n2PvZA8HJQ==", "dev": true, "dependencies": { "@webassemblyjs/ast": "1.9.0", @@ -3885,10 +4184,170 @@ "node": ">=10.0.0" } }, + "node_modules/@esbuild/android-arm": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.17.tgz", + "integrity": "sha512-wHsmJG/dnL3OkpAcwbgoBTTMHVi4Uyou3F5mf58ZtmUyIKfcdA7TROav/6tCzET4A3QW2Q2FC+eFneMU+iyOxg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.17.tgz", + "integrity": "sha512-9np+YYdNDed5+Jgr1TdWBsozZ85U1Oa3xW0c7TWqH0y2aGghXtZsuT8nYRbzOMcl0bXZXjOGbksoTtVOlWrRZg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.17.tgz", + "integrity": "sha512-O+FeWB/+xya0aLg23hHEM2E3hbfwZzjqumKMSIqcHbNvDa+dza2D0yLuymRBQQnC34CWrsJUXyH2MG5VnLd6uw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.17.tgz", + "integrity": "sha512-M9uJ9VSB1oli2BE/dJs3zVr9kcCBBsE883prage1NWz6pBS++1oNn/7soPNS3+1DGj0FrkSvnED4Bmlu1VAE9g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.17.tgz", + "integrity": "sha512-XDre+J5YeIJDMfp3n0279DFNrGCXlxOuGsWIkRb1NThMZ0BsrWXoTg23Jer7fEXQ9Ye5QjrvXpxnhzl3bHtk0g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.17.tgz", + "integrity": "sha512-cjTzGa3QlNfERa0+ptykyxs5A6FEUQQF0MuilYXYBGdBxD3vxJcKnzDlhDCa1VAJCmAxed6mYhA2KaJIbtiNuQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.17.tgz", + "integrity": "sha512-sOxEvR8d7V7Kw8QqzxWc7bFfnWnGdaFBut1dRUYtu+EIRXefBc/eIsiUiShnW0hM3FmQ5Zf27suDuHsKgZ5QrA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.17.tgz", + "integrity": "sha512-2d3Lw6wkwgSLC2fIvXKoMNGVaeY8qdN0IC3rfuVxJp89CRfA3e3VqWifGDfuakPmp90+ZirmTfye1n4ncjv2lg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.17.tgz", + "integrity": "sha512-c9w3tE7qA3CYWjT+M3BMbwMt+0JYOp3vCMKgVBrCl1nwjAlOMYzEo+gG7QaZ9AtqZFj5MbUc885wuBBmu6aADQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.17.tgz", + "integrity": "sha512-1DS9F966pn5pPnqXYz16dQqWIB0dmDfAQZd6jSSpiT9eX1NzKh07J6VKR3AoXXXEk6CqZMojiVDSZi1SlmKVdg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, "node_modules/@esbuild/linux-loong64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.5.tgz", - "integrity": "sha512-UHkDFCfSGTuXq08oQltXxSZmH1TXyWsL+4QhZDWvvLl6mEJQqk3u7/wq1LjhrrAXYIllaTtRSzUXl4Olkf2J8A==", + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.17.tgz", + "integrity": "sha512-EvLsxCk6ZF0fpCB6w6eOI2Fc8KW5N6sHlIovNe8uOFObL2O+Mr0bflPHyHwLT6rwMg9r77WOAWb2FqCQrVnwFg==", "cpu": [ "loong64" ], @@ -3901,6 +4360,197 @@ "node": ">=12" } }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.17.tgz", + "integrity": "sha512-e0bIdHA5p6l+lwqTE36NAW5hHtw2tNRmHlGBygZC14QObsA3bD4C6sXLJjvnDIjSKhW1/0S3eDy+QmX/uZWEYQ==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.17.tgz", + "integrity": "sha512-BAAilJ0M5O2uMxHYGjFKn4nJKF6fNCdP1E0o5t5fvMYYzeIqy2JdAP88Az5LHt9qBoUa4tDaRpfWt21ep5/WqQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.17.tgz", + "integrity": "sha512-Wh/HW2MPnC3b8BqRSIme/9Zhab36PPH+3zam5pqGRH4pE+4xTrVLx2+XdGp6fVS3L2x+DrsIcsbMleex8fbE6g==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.17.tgz", + "integrity": "sha512-j/34jAl3ul3PNcK3pfI0NSlBANduT2UO5kZ7FCaK33XFv3chDhICLY8wJJWIhiQ+YNdQ9dxqQctRg2bvrMlYgg==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.17.tgz", + "integrity": "sha512-QM50vJ/y+8I60qEmFxMoxIx4de03pGo2HwxdBeFd4nMh364X6TIBZ6VQ5UQmPbQWUVWHWws5MmJXlHAXvJEmpQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.17.tgz", + "integrity": "sha512-/jGlhWR7Sj9JPZHzXyyMZ1RFMkNPjC6QIAan0sDOtIo2TYk3tZn5UDrkE0XgsTQCxWTTOcMPf9p6Rh2hXtl5TQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.17.tgz", + "integrity": "sha512-rSEeYaGgyGGf4qZM2NonMhMOP/5EHp4u9ehFiBrg7stH6BYEEjlkVREuDEcQ0LfIl53OXLxNbfuIj7mr5m29TA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.17.tgz", + "integrity": "sha512-Y7ZBbkLqlSgn4+zot4KUNYst0bFoO68tRgI6mY2FIM+b7ZbyNVtNbDP5y8qlu4/knZZ73fgJDlXID+ohY5zt5g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.17.tgz", + "integrity": "sha512-bwPmTJsEQcbZk26oYpc4c/8PvTY3J5/QK8jM19DVlEsAB41M39aWovWoHtNm78sd6ip6prilxeHosPADXtEJFw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.17.tgz", + "integrity": "sha512-H/XaPtPKli2MhW+3CQueo6Ni3Avggi6hP/YvgkEe1aSaxw+AeO8MFjq8DlgfTd9Iz4Yih3QCZI6YLMoyccnPRg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.17.tgz", + "integrity": "sha512-fGEb8f2BSA3CW7riJVurug65ACLuQAzKq0SSqkY2b2yHHH0MzDfbLyKIGzHwOI/gkHcxM/leuSW6D5w/LMNitA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "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/eslintrc": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.0.5.tgz", @@ -3976,14 +4626,14 @@ } }, "node_modules/@fortawesome/angular-fontawesome": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/@fortawesome/angular-fontawesome/-/angular-fontawesome-0.11.1.tgz", - "integrity": "sha512-Ngzm5MVxk76ZhYpPTNOI/mpYNz9bzwfBXC5L9mktLgOONjBuYBPVt+bH8lny8hNtDk0ppZzXsMN6CO7hckdfnw==", + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@fortawesome/angular-fontawesome/-/angular-fontawesome-0.13.0.tgz", + "integrity": "sha512-gzSPRdveOXNO7NIiMgTyB46aiHG0i98KinnAEqHXi8qzraM/kCcHn/0y3f4MhemX6kftwsFli0IU8RyHmtXlSQ==", "dependencies": { - "tslib": "^2.4.0" + "tslib": "^2.4.1" }, "peerDependencies": { - "@angular/core": "^14.0.0", + "@angular/core": "^16.0.0", "@fortawesome/fontawesome-svg-core": "~1.2.27 || ~1.3.0-beta2 || ^6.1.0" } }, @@ -4068,6 +4718,102 @@ "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", "dev": true }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", @@ -4094,13 +4840,14 @@ } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", - "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", "dev": true, "dependencies": { - "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10" + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { "node": ">=6.0.0" @@ -4116,60 +4863,813 @@ } }, "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "dev": true, "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==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "node_modules/@jridgewell/source-map/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==", + "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/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" + "@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==", + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", "dev": true }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.17", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", - "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dev": true, "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/@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/@material/animation": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/animation/-/animation-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-leRf+BcZTfC/iSigLXnYgcHAGvFVQveoJT5+2PIRdyPI/bIG7hhciRgacHRsCKC0sGya81dDblLgdkjSUemYLw==", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/@material/auto-init": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/auto-init/-/auto-init-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-uxzDq7q3c0Bu1pAsMugc1Ik9ftQYQqZY+5e2ybNplT8gTImJhNt4M2mMiMHbMANk2l3UgICmUyRSomgPBWCPIA==", + "dependencies": { + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/banner": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/banner/-/banner-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-SHeVoidCUFVhXANN6MNWxK9SZoTSgpIP8GZB7kAl52BywLxtV+FirTtLXkg/8RUkxZRyRWl7HvQ0ZFZa7QQAyA==", + "dependencies": { + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/button": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/shape": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/tokens": "15.0.0-canary.bc9ae6c9c.0", + "@material/typography": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/base": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/base/-/base-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-Fc3vGuOf+duGo22HTRP6dHdc+MUe0VqQfWOuKrn/wXKD62m0QQR2TqJd3rRhCumH557T5QUyheW943M3E+IGfg==", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/@material/button": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/button/-/button-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-3AQgwrPZCTWHDJvwgKq7Cj+BurQ4wTjDdGL+FEnIGUAjJDskwi1yzx5tW2Wf/NxIi7IoPFyOY3UB41jwMiOrnw==", + "dependencies": { + "@material/density": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/focus-ring": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/shape": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/tokens": "15.0.0-canary.bc9ae6c9c.0", + "@material/touch-target": "15.0.0-canary.bc9ae6c9c.0", + "@material/typography": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/card": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/card/-/card-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-nPlhiWvbLmooTnBmV5gmzB0eLWSgLKsSRBYAbIBmO76Okgz1y+fQNLag+lpm/TDaHVsn5fmQJH8e0zIg0rYsQA==", + "dependencies": { + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/shape": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/tokens": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/checkbox": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/checkbox/-/checkbox-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-4tpNnO1L0IppoMF3oeQn8F17t2n0WHB0D7mdJK9rhrujen/fLbekkIC82APB3fdGtLGg3qeNqDqPsJm1YnmrwA==", + "dependencies": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/density": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/focus-ring": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/touch-target": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/chips": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/chips/-/chips-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-fqHKvE5bSWK0bXVkf57MWxZtytGqYBZvvHIOs4JI9HPHEhaJy4CpSw562BEtbm3yFxxALoQknvPW2KYzvADnmA==", + "dependencies": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/checkbox": "15.0.0-canary.bc9ae6c9c.0", + "@material/density": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/focus-ring": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/shape": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/tokens": "15.0.0-canary.bc9ae6c9c.0", + "@material/touch-target": "15.0.0-canary.bc9ae6c9c.0", + "@material/typography": "15.0.0-canary.bc9ae6c9c.0", + "safevalues": "^0.3.4", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/circular-progress": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/circular-progress/-/circular-progress-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-Lxe8BGAxQwCQqrLhrYrIP0Uok10h7aYS3RBXP41ph+5GmwJd5zdyE2t93qm2dyThvU6qKuXw9726Dtq/N+wvZQ==", + "dependencies": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/progress-indicator": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/data-table": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/data-table/-/data-table-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-j/7qplT9+sUpfe4pyWhPbl01qJA+OoNAG3VMJruBBR461ZBKyTi7ssKH9yksFGZ8eCEPkOsk/+kDxsiZvRWkeQ==", + "dependencies": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/checkbox": "15.0.0-canary.bc9ae6c9c.0", + "@material/density": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/icon-button": "15.0.0-canary.bc9ae6c9c.0", + "@material/linear-progress": "15.0.0-canary.bc9ae6c9c.0", + "@material/list": "15.0.0-canary.bc9ae6c9c.0", + "@material/menu": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/select": "15.0.0-canary.bc9ae6c9c.0", + "@material/shape": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/tokens": "15.0.0-canary.bc9ae6c9c.0", + "@material/touch-target": "15.0.0-canary.bc9ae6c9c.0", + "@material/typography": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/density": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/density/-/density-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-Zt3u07fXrBWLW06Tl5fgvjicxNQMkFdawLyNTzZ5TvbXfVkErILLePwwGaw8LNcvzqJP6ABLA8jiR+sKNoJQCg==", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/@material/dialog": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/dialog/-/dialog-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-o+9a/fmwJ9+gY3Z/uhj/PMVJDq7it1NTWKJn2GwAKdB+fDkT4hb9qEdcxMPyvJJ5ups+XiKZo03+tZrD+38c1w==", + "dependencies": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/button": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/icon-button": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/shape": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/tokens": "15.0.0-canary.bc9ae6c9c.0", + "@material/touch-target": "15.0.0-canary.bc9ae6c9c.0", + "@material/typography": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/dom": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/dom/-/dom-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-ly78R7aoCJtundSUu0UROU+5pQD5Piae0Y1MkN6bs0724azeazX1KeXFeaf06JOXnlr5/41ol+fSUPowjoqnOg==", + "dependencies": { + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/drawer": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/drawer/-/drawer-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-PFL4cEFnt7VTxDsuspFVNhsFDYyumjU0VWfj3PWB7XudsEfQ3lo85D3HCEtTTbRsCainGN8bgYNDNafLBqiigw==", + "dependencies": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/list": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/shape": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/typography": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/elevation": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/elevation/-/elevation-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-Ro+Pk8jFuap+T0B0shA3xI1hs2b89dNQ2EIPCNjNMp87emHKAzJfhKb7EZGIwv3+gFLlVaLyIVkb94I89KLsyg==", + "dependencies": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/fab": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/fab/-/fab-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-dvU0KWMRglwJEQwmQtFAmJcAjzg9VFF6Aqj78bJYu/DAIGFJ1VTTTSgoXM/XCm1YyQEZ7kZRvxBO37CH54rSDg==", + "dependencies": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/focus-ring": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/shape": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/tokens": "15.0.0-canary.bc9ae6c9c.0", + "@material/touch-target": "15.0.0-canary.bc9ae6c9c.0", + "@material/typography": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/feature-targeting": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/feature-targeting/-/feature-targeting-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-wkDjVcoVEYYaJvun28IXdln/foLgPD7n9ZC9TY76GErGCwTq+HWpU6wBAAk+ePmpRFDayw4vI4wBlaWGxLtysQ==", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/@material/floating-label": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/floating-label/-/floating-label-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-bUWPtXzZITOD/2mkvLkEPO1ngDWmb74y0Kgbz6llHLOQBtycyJIpuoQJ1q2Ez0NM/tFLwPphhAgRqmL3YQ/Kzw==", + "dependencies": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/typography": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/focus-ring": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/focus-ring/-/focus-ring-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-cZHThVose3GvAlJzpJoBI1iqL6d1/Jj9hXrR+r8Mwtb1hBIUEG3hxfsRd4vGREuzROPlf0OgNf/V+YHoSwgR5w==", + "dependencies": { + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0" + } + }, + "node_modules/@material/form-field": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/form-field/-/form-field-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-+JFXy5X44Gue1CbZZAQ6YejnI203lebYwL0i6k0ylDpWHEOdD5xkF2PyHR28r9/65Ebcbwbff6q7kI1SGoT7MA==", + "dependencies": { + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/typography": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/icon-button": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/icon-button/-/icon-button-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-1a0MHgyIwOs4RzxrVljsqSizGYFlM1zY2AZaLDsgT4G3kzsplTx8HZQ022GpUCjAygW+WLvg4z1qAhQHvsbqlw==", + "dependencies": { + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/density": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/focus-ring": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/touch-target": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/image-list": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/image-list/-/image-list-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-WKWmiYap2iu4QdqmeUSliLlN4O2Ueqa0OuVAYHn/TCzmQ2xmnhZ1pvDLbs6TplpOmlki7vFfe+aSt5SU9gwfOQ==", + "dependencies": { + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/shape": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/typography": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/layout-grid": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/layout-grid/-/layout-grid-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-5GqmT6oTZhUGWIb+CLD0ZNyDyTiJsr/rm9oRIi3+vCujACwxFkON9tzBlZohdtFS16nuzUusthN6Jt9UrJcN6Q==", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/@material/line-ripple": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/line-ripple/-/line-ripple-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-8S30WXEuUdgDdBulzUDlPXD6qMzwCX9SxYb5mGDYLwl199cpSGdXHtGgEcCjokvnpLhdZhcT1Dsxeo1g2Evh5Q==", + "dependencies": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/linear-progress": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/linear-progress/-/linear-progress-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-6EJpjrz6aoH2/gXLg9iMe0yF2C42hpQyZoHpmcgTLKeci85ktDvJIjwup8tnk8ULQyFiGiIrhXw2v2RSsiFjvQ==", + "dependencies": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/progress-indicator": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/list": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/list/-/list-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-TQ1ppqiCMQj/P7bGD4edbIIv4goczZUoiUAaPq/feb1dflvrFMzYqJ7tQRRCyBL8nRhJoI2x99tk8Q2RXvlGUQ==", + "dependencies": { + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/density": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/shape": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/tokens": "15.0.0-canary.bc9ae6c9c.0", + "@material/typography": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/menu": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/menu/-/menu-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-IlAh61xzrzxXs38QZlt74UYt8J431zGznSzDtB1Fqs6YFNd11QPKoiRXn1J2Qu/lUxbFV7i8NBKMCKtia0n6/Q==", + "dependencies": { + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/list": "15.0.0-canary.bc9ae6c9c.0", + "@material/menu-surface": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/shape": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/tokens": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/menu-surface": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/menu-surface/-/menu-surface-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-dMtSPN+olTWE+08M5qe4ea1IZOhVryYqzK0Gyb2u1G75rSArUxCOB5rr6OC/ST3Mq3RS6zGuYo7srZt4534K9Q==", + "dependencies": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/shape": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/notched-outline": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/notched-outline/-/notched-outline-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-WuurMg44xexkvLTBTnsO0A+qnzFjpcPdvgWBGstBepYozsvSF9zJGdb1x7Zv1MmqbpYh/Ohnuxtb/Y3jOh6irg==", + "dependencies": { + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/floating-label": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/shape": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/progress-indicator": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/progress-indicator/-/progress-indicator-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-uOnsvqw5F2fkeTnTl4MrYzjI7KCLmmLyZaM0cgLNuLsWVlddQE+SGMl28tENx7DUK3HebWq0FxCP8f25LuDD+w==", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/@material/radio": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/radio/-/radio-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-ehzOK+U1IxQN+OQjgD2lsnf1t7t7RAwQzeO6Czkiuid29ookYbQynWuLWk7NW8H8ohl7lnmfqTP1xSNkkL/F0g==", + "dependencies": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/density": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/focus-ring": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/touch-target": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/ripple": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/ripple/-/ripple-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-JfLW+g3GMVDv4cruQ19+HUxpKVdWCldFlIPw1UYezz2h3WTNDy05S3uP2zUdXzZ01C3dkBFviv4nqZ0GCT16MA==", + "dependencies": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/rtl": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/rtl/-/rtl-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-SkKLNLFp5QtG7/JEFg9R92qq4MzTcZ5As6sWbH7rRg6ahTHoJEuqE+pOb9Vrtbj84k5gtX+vCYPvCILtSlr2uw==", + "dependencies": { + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/segmented-button": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/segmented-button/-/segmented-button-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-YDwkCWP9l5mIZJ7pZJZ2hMDxfBlIGVJ+deNzr8O+Z7/xC5LGXbl4R5aPtUVHygvXAXxpf5096ZD+dSXzYzvWlw==", + "dependencies": { + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/touch-target": "15.0.0-canary.bc9ae6c9c.0", + "@material/typography": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/select": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/select/-/select-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-unfOWVf7T0sixVG+3k3RTuATfzqvCF6QAzA6J9rlCh/Tq4HuIBNDdV4z19IVu4zwmgWYxY0iSvqWUvdJJYwakQ==", + "dependencies": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/density": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/floating-label": "15.0.0-canary.bc9ae6c9c.0", + "@material/line-ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/list": "15.0.0-canary.bc9ae6c9c.0", + "@material/menu": "15.0.0-canary.bc9ae6c9c.0", + "@material/menu-surface": "15.0.0-canary.bc9ae6c9c.0", + "@material/notched-outline": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/shape": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/tokens": "15.0.0-canary.bc9ae6c9c.0", + "@material/typography": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/shape": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/shape/-/shape-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-Dsvr771ZKC46ODzoixLdGwlLEQLfxfLrtnRojXABoZf5G3o9KtJU+J+5Ld5aa960OAsCzzANuaub4iR88b1guA==", + "dependencies": { + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/slider": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/slider/-/slider-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-3AEu+7PwW4DSNLndue47dh2u7ga4hDJRYmuu7wnJCIWJBnLCkp6C92kNc4Rj5iQY2ftJio5aj1gqryluh5tlYg==", + "dependencies": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/tokens": "15.0.0-canary.bc9ae6c9c.0", + "@material/typography": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/snackbar": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/snackbar/-/snackbar-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-TwwQSYxfGK6mc03/rdDamycND6o+1p61WNd7ElZv1F1CLxB4ihRjbCoH7Qo+oVDaP8CTpjeclka+24RLhQq0mA==", + "dependencies": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/button": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/icon-button": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/shape": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/tokens": "15.0.0-canary.bc9ae6c9c.0", + "@material/typography": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/switch": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/switch/-/switch-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-OjUjtT0kRz1ASAsOS+dNzwMwvsjmqy5edK57692qmrP6bL4GblFfBDoiNJ6t0AN4OaKcmL5Hy/xNrTdOZW7Qqw==", + "dependencies": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/density": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/focus-ring": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/shape": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/tokens": "15.0.0-canary.bc9ae6c9c.0", + "safevalues": "^0.3.4", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/tab": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/tab/-/tab-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-s/L9otAwn/pZwVQZBRQJmPqYeNbjoEbzbjMpDQf/VBG/6dJ+aP03ilIBEkqo8NVnCoChqcdtVCoDNRtbU+yp6w==", + "dependencies": { + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/focus-ring": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/tab-indicator": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/tokens": "15.0.0-canary.bc9ae6c9c.0", + "@material/typography": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/tab-bar": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/tab-bar/-/tab-bar-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-Xmtq0wJGfu5k+zQeFeNsr4bUKv7L+feCmUp/gsapJ655LQKMXOUQZtSv9ZqWOfrCMy55hoF1CzGFV+oN3tyWWQ==", + "dependencies": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/density": "15.0.0-canary.bc9ae6c9c.0", + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/tab": "15.0.0-canary.bc9ae6c9c.0", + "@material/tab-indicator": "15.0.0-canary.bc9ae6c9c.0", + "@material/tab-scroller": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/tokens": "15.0.0-canary.bc9ae6c9c.0", + "@material/typography": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/tab-indicator": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/tab-indicator/-/tab-indicator-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-despCJYi1GrDDq7F2hvLQkObHnSLZPPDxnOzU16zJ6FNYvIdszgfzn2HgAZ6pl5hLOexQ8cla6cAqjTDuaJBhQ==", + "dependencies": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/tab-scroller": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/tab-scroller/-/tab-scroller-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-QWHG/EWxirj4V9u2IHz+OSY9XCWrnNrPnNgEufxAJVUKV/A8ma1DYeFSQqxhX709R8wKGdycJksg0Flkl7Gq7w==", + "dependencies": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/tab": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/textfield": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/textfield/-/textfield-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-R3qRex9kCaZIAK8DuxPnVC42R0OaW7AB7fsFknDKeTeVQvRcbnV8E+iWSdqTiGdsi6QQHifX8idUrXw+O45zPw==", + "dependencies": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/density": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/floating-label": "15.0.0-canary.bc9ae6c9c.0", + "@material/line-ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/notched-outline": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/shape": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/tokens": "15.0.0-canary.bc9ae6c9c.0", + "@material/typography": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/theme": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/theme/-/theme-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-CpUwXGE0dbhxQ45Hu9r9wbJtO/MAlv5ER4tBHA9tp/K+SU+lDgurBE2touFMg5INmdfVNtdumxb0nPPLaNQcUg==", + "dependencies": { + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/tokens": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/tokens/-/tokens-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-nbEuGj05txWz6ZMUanpM47SaAD7soyjKILR+XwDell9Zg3bGhsnexCNXPEz2fD+YgomS+jM5XmIcaJJHg/H93Q==", + "dependencies": { + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0" + } + }, + "node_modules/@material/tooltip": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/tooltip/-/tooltip-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-UzuXp0b9NuWuYLYpPguxrjbJnCmT/Cco8CkjI/6JajxaeA3o2XEBbQfRMTq8PTafuBjCHTc0b0mQY7rtxUp1Gg==", + "dependencies": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/button": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/shape": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/tokens": "15.0.0-canary.bc9ae6c9c.0", + "@material/typography": "15.0.0-canary.bc9ae6c9c.0", + "safevalues": "^0.3.4", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/top-app-bar": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/top-app-bar/-/top-app-bar-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-vJWjsvqtdSD5+yQ/9vgoBtBSCvPJ5uF/DVssv8Hdhgs1PYaAcODUi77kdi0+sy/TaWyOsTkQixqmwnFS16zesA==", + "dependencies": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/shape": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/typography": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/touch-target": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/touch-target/-/touch-target-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-AqYh9fjt+tv4ZE0C6MeYHblS2H+XwLbDl2mtyrK0DOEnCVQk5/l5ImKDfhrUdFWHvS4a5nBM4AA+sa7KaroLoA==", + "dependencies": { + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@material/typography": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/typography/-/typography-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-CKsG1zyv34AKPNyZC8olER2OdPII64iR2SzQjpqh1UUvmIFiMPk23LvQ1OnC5aCB14pOXzmVgvJt31r9eNdZ6Q==", + "dependencies": { + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "node_modules/@ngbracket/ngx-layout": { + "version": "15.1.3", + "resolved": "https://registry.npmjs.org/@ngbracket/ngx-layout/-/ngx-layout-15.1.3.tgz", + "integrity": "sha512-0fPiJ/DLNEWfyn/71IHuJ3SWpNFGLKMrEE79AIBczWStQ9I1t2IrOANKYi3r+7gcojisHbdfUc4q/6vjVfKt8w==", + "dependencies": { + "tslib": "^2.5.0" + }, + "peerDependencies": { + "@angular/cdk": ">=15.0.0", + "@angular/common": ">=15.0.2", + "@angular/core": ">=15.0.2", + "@angular/platform-browser": ">=15.0.2", + "rxjs": "^6.5.3 || ^7.8.0" + } + }, "node_modules/@ngneat/forms-manager": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/@ngneat/forms-manager/-/forms-manager-2.5.0.tgz", @@ -4184,18 +5684,18 @@ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, "node_modules/@ngtools/webpack": { - "version": "14.2.7", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-14.2.7.tgz", - "integrity": "sha512-I47BdEybpzjfFFMFB691o9C+69RexLTgSm/VCyDn4M8DrGrZpgYNhxN+AEr1uA6Bi6MaPG6w+TMac5tNIaO4Yw==", + "version": "16.2.16", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-16.2.16.tgz", + "integrity": "sha512-4gm2allK0Pjy/Lxb9IGRnhEZNEOJSOTWwy09VOdHouV2ODRK7Tto2LgteaFJUUSLkuvWRsI7pfuA6yrz8KDfHw==", "dev": true, "engines": { - "node": "^14.15.0 || >=16.10.0", + "node": "^16.14.0 || >=18.10.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" }, "peerDependencies": { - "@angular/compiler-cli": "^14.0.0", - "typescript": ">=4.6.2 <4.9", + "@angular/compiler-cli": "^16.0.0", + "typescript": ">=4.9.3 <5.2", "webpack": "^5.54.0" } }, @@ -4235,67 +5735,102 @@ } }, "node_modules/@npmcli/fs": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.2.tgz", - "integrity": "sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.1.tgz", + "integrity": "sha512-q9CRWjpHCMIh5sVyefoD1cA7PkvILqCZsnSOEUUivORLjxCO/Irmue2DprETiNgEqktDBZaM1Bi+jrarx1XdCg==", "dev": true, "dependencies": { - "@gar/promisify": "^1.1.3", "semver": "^7.3.5" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/@npmcli/git": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-3.0.2.tgz", - "integrity": "sha512-CAcd08y3DWBJqJDpfuVL0uijlq5oaXaOJEKHKc4wqrjd00gkvTZB+nFuLn+doOOKddaQS9JfqtNoFCO2LCvA3w==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-4.1.0.tgz", + "integrity": "sha512-9hwoB3gStVfa0N31ymBmrX+GuDGdVA/QWShZVqE0HK2Af+7QGGrCTbZia/SW0ImUTjTne7SP91qxDmtXvDHRPQ==", "dev": true, "dependencies": { - "@npmcli/promise-spawn": "^3.0.0", + "@npmcli/promise-spawn": "^6.0.0", "lru-cache": "^7.4.4", - "mkdirp": "^1.0.4", - "npm-pick-manifest": "^7.0.0", - "proc-log": "^2.0.0", + "npm-pick-manifest": "^8.0.0", + "proc-log": "^3.0.0", "promise-inflight": "^1.0.1", "promise-retry": "^2.0.1", "semver": "^7.3.5", - "which": "^2.0.2" + "which": "^3.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/@npmcli/git/node_modules/lru-cache": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.14.0.tgz", - "integrity": "sha512-EIRtP1GrSJny0dqb50QXRUNBxHJhcpxHC++M5tD7RYbvLLn5KVWKsbyswSSqDuU15UFi3bgTQIY8nhDMeF6aDQ==", + "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/@npmcli/git/node_modules/which": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", + "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, "node_modules/@npmcli/installed-package-contents": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-1.0.7.tgz", - "integrity": "sha512-9rufe0wnJusCQoLpV9ZPKIVP55itrM5BxOXs10DmdbRfgWtHy1LDyskbwRnBghuB0PrF7pNPOqREVtpz4HqzKw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-2.1.0.tgz", + "integrity": "sha512-c8UuGLeZpm69BryRykLuKRyKFZYJsZSCT4aVY5ds4omyZqJ172ApzgfKJ5eV/r3HgLdUYgFVe54KSFVjKoe27w==", "dev": true, "dependencies": { - "npm-bundled": "^1.1.1", - "npm-normalize-package-bin": "^1.0.1" + "npm-bundled": "^3.0.0", + "npm-normalize-package-bin": "^3.0.0" }, "bin": { - "installed-package-contents": "index.js" + "installed-package-contents": "bin/index.js" }, "engines": { - "node": ">= 10" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/installed-package-contents/node_modules/npm-bundled": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-3.0.1.tgz", + "integrity": "sha512-+AvaheE/ww1JEwRHOrn4WHNzOxGtVp+adrg2AeZS/7KuxGUYFuBta98wYpfHBbJp6Tg6j1NKSEVHNcfZzJHQwQ==", + "dev": true, + "dependencies": { + "npm-normalize-package-bin": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/installed-package-contents/node_modules/npm-normalize-package-bin": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz", + "integrity": "sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/@npmcli/move-file": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.1.tgz", "integrity": "sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==", + "deprecated": "This functionality has been moved to @npmcli/fs", "dev": true, "dependencies": { "mkdirp": "^1.0.4", @@ -4306,40 +5841,311 @@ } }, "node_modules/@npmcli/node-gyp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-2.0.0.tgz", - "integrity": "sha512-doNI35wIe3bBaEgrlPfdJPaCpUR89pJWep4Hq3aRdh6gKazIVWfs0jHttvSSoq47ZXgC7h73kDsUl8AoIQUB+A==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-3.0.0.tgz", + "integrity": "sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA==", "dev": true, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/@npmcli/promise-spawn": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-3.0.0.tgz", - "integrity": "sha512-s9SgS+p3a9Eohe68cSI3fi+hpcZUmXq5P7w0kMlAsWVtR7XbK3ptkZqKT2cK1zLDObJ3sR+8P59sJE0w/KTL1g==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-6.0.2.tgz", + "integrity": "sha512-gGq0NJkIGSwdbUt4yhdF8ZrmkGKVz9vAdVzpOfnom+V8PLSmSOVhZwbNvZZS1EYcJN5hzzKBxmmVVAInM6HQLg==", "dev": true, "dependencies": { - "infer-owner": "^1.0.4" + "which": "^3.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/promise-spawn/node_modules/which": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", + "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/@npmcli/run-script": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-4.2.1.tgz", - "integrity": "sha512-7dqywvVudPSrRCW5nTHpHgeWnbBtz8cFkOuKrecm6ih+oO9ciydhWt6OF7HlqupRRmB8Q/gECVdB9LMfToJbRg==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-6.0.2.tgz", + "integrity": "sha512-NCcr1uQo1k5U+SYlnIrbAh3cxy+OQT1VtqiAbxdymSlptbzBb62AjH2xXgjNCoP073hoa1CfCAcwoZ8k96C4nA==", "dev": true, "dependencies": { - "@npmcli/node-gyp": "^2.0.0", - "@npmcli/promise-spawn": "^3.0.0", + "@npmcli/node-gyp": "^3.0.0", + "@npmcli/promise-spawn": "^6.0.0", "node-gyp": "^9.0.0", - "read-package-json-fast": "^2.0.3", - "which": "^2.0.2" + "read-package-json-fast": "^3.0.0", + "which": "^3.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/run-script/node_modules/which": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", + "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@nrwl/devkit": { + "version": "16.5.1", + "resolved": "https://registry.npmjs.org/@nrwl/devkit/-/devkit-16.5.1.tgz", + "integrity": "sha512-NB+DE/+AFJ7lKH/WBFyatJEhcZGj25F24ncDkwjZ6MzEiSOGOJS0LaV/R+VUsmS5EHTPXYOpn3zHWWAcJhyOmA==", + "dev": true, + "dependencies": { + "@nx/devkit": "16.5.1" + } + }, + "node_modules/@nrwl/tao": { + "version": "16.5.1", + "resolved": "https://registry.npmjs.org/@nrwl/tao/-/tao-16.5.1.tgz", + "integrity": "sha512-x+gi/fKdM6uQNIti9exFlm3V5LBP3Y8vOEziO42HdOigyrXa0S0HD2WMpccmp6PclYKhwEDUjKJ39xh5sdh4Ig==", + "dev": true, + "dependencies": { + "nx": "16.5.1" + }, + "bin": { + "tao": "index.js" + } + }, + "node_modules/@nx/devkit": { + "version": "16.5.1", + "resolved": "https://registry.npmjs.org/@nx/devkit/-/devkit-16.5.1.tgz", + "integrity": "sha512-T1acZrVVmJw/sJ4PIGidCBYBiBqlg/jT9e8nIGXLSDS20xcLvfo4zBQf8UZLrmHglnwwpDpOWuVJCp2rYA5aDg==", + "dev": true, + "dependencies": { + "@nrwl/devkit": "16.5.1", + "ejs": "^3.1.7", + "ignore": "^5.0.4", + "semver": "7.5.3", + "tmp": "~0.2.1", + "tslib": "^2.3.0" + }, + "peerDependencies": { + "nx": ">= 15 <= 17" + } + }, + "node_modules/@nx/devkit/node_modules/semver": { + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", + "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@nx/nx-darwin-arm64": { + "version": "16.5.1", + "resolved": "https://registry.npmjs.org/@nx/nx-darwin-arm64/-/nx-darwin-arm64-16.5.1.tgz", + "integrity": "sha512-q98TFI4B/9N9PmKUr1jcbtD4yAFs1HfYd9jUXXTQOlfO9SbDjnrYJgZ4Fp9rMNfrBhgIQ4x1qx0AukZccKmH9Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-darwin-x64": { + "version": "16.5.1", + "resolved": "https://registry.npmjs.org/@nx/nx-darwin-x64/-/nx-darwin-x64-16.5.1.tgz", + "integrity": "sha512-j9HmL1l8k7EVJ3eOM5y8COF93gqrydpxCDoz23ZEtsY+JHY77VAiRQsmqBgEx9GGA2dXi9VEdS67B0+1vKariw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-freebsd-x64": { + "version": "16.5.1", + "resolved": "https://registry.npmjs.org/@nx/nx-freebsd-x64/-/nx-freebsd-x64-16.5.1.tgz", + "integrity": "sha512-CXSPT01aVS869tvCCF2tZ7LnCa8l41wJ3mTVtWBkjmRde68E5Up093hklRMyXb3kfiDYlfIKWGwrV4r0eH6x1A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-linux-arm-gnueabihf": { + "version": "16.5.1", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-16.5.1.tgz", + "integrity": "sha512-BhrumqJSZCWFfLFUKl4CAUwR0Y0G2H5EfFVGKivVecEQbb+INAek1aa6c89evg2/OvetQYsJ+51QknskwqvLsA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-linux-arm64-gnu": { + "version": "16.5.1", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-16.5.1.tgz", + "integrity": "sha512-x7MsSG0W+X43WVv7JhiSq2eKvH2suNKdlUHEG09Yt0vm3z0bhtym1UCMUg3IUAK7jy9hhLeDaFVFkC6zo+H/XQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-linux-arm64-musl": { + "version": "16.5.1", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-16.5.1.tgz", + "integrity": "sha512-J+/v/mFjOm74I0PNtH5Ka+fDd+/dWbKhpcZ2R1/6b9agzZk+Ff/SrwJcSYFXXWKbPX+uQ4RcJoytT06Zs3s0ow==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-linux-x64-gnu": { + "version": "16.5.1", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-16.5.1.tgz", + "integrity": "sha512-igooWJ5YxQ94Zft7IqgL+Lw0qHaY15Btw4gfK756g/YTYLZEt4tTvR1y6RnK/wdpE3sa68bFTLVBNCGTyiTiDQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-linux-x64-musl": { + "version": "16.5.1", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-16.5.1.tgz", + "integrity": "sha512-zF/exnPqFYbrLAduGhTmZ7zNEyADid2bzNQiIjJkh8Y6NpDwrQIwVIyvIxqynsjMrIs51kBH+8TUjKjj2Jgf5A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-win32-arm64-msvc": { + "version": "16.5.1", + "resolved": "https://registry.npmjs.org/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-16.5.1.tgz", + "integrity": "sha512-qtqiLS9Y9TYyAbbpq58kRoOroko4ZXg5oWVqIWFHoxc5bGPweQSJCROEqd1AOl2ZDC6BxfuVHfhDDop1kK05WA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-win32-x64-msvc": { + "version": "16.5.1", + "resolved": "https://registry.npmjs.org/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-16.5.1.tgz", + "integrity": "sha512-kUJBLakK7iyA9WfsGGQBVennA4jwf5XIgm0lu35oMOphtZIluvzItMt0EYBmylEROpmpEIhHq0P6J9FA+WH0Rg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@parcel/watcher": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.0.4.tgz", + "integrity": "sha512-cTDi+FUDBIUOBKEtj+nhiJ71AZVlkAsQFuGQTun5tV9mwQBQgZvhCzG+URPQc8myeN32yRVZEfVAPCs1RW+Jvg==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "node-addon-api": "^3.2.1", + "node-gyp-build": "^4.3.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "optional": true, + "engines": { + "node": ">=14" } }, "node_modules/@popperjs/core": { @@ -4352,17 +6158,17 @@ } }, "node_modules/@schematics/angular": { - "version": "14.2.7", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-14.2.7.tgz", - "integrity": "sha512-ujtLu0gWARtJsRbN+P+McDO0Y0ygJjUN5016SdbmYDMcDJkwi+GYHU8Yvh/UONtmNor3JdV8AnZ8OmWTlswTDA==", + "version": "16.2.14", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-16.2.14.tgz", + "integrity": "sha512-YqIv727l9Qze8/OL6H9mBHc2jVXzAGRNBYnxYWqWhLbfvuVbbldo6NNIIjgv6lrl2LJSdPAAMNOD5m/f6210ug==", "dev": true, "dependencies": { - "@angular-devkit/core": "14.2.7", - "@angular-devkit/schematics": "14.2.7", - "jsonc-parser": "3.1.0" + "@angular-devkit/core": "16.2.14", + "@angular-devkit/schematics": "16.2.14", + "jsonc-parser": "3.2.0" }, "engines": { - "node": "^14.15.0 || >=16.10.0", + "node": "^16.14.0 || >=18.10.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" } @@ -4891,13 +6697,42 @@ "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" }, - "node_modules/@socket.io/component-emitter": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz", - "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==", - "dev": true + "node_modules/@sigstore/bundle": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-1.1.0.tgz", + "integrity": "sha512-PFutXEy0SmQxYI4texPw3dd2KewuNqv7OuK1ZFtY2fM754yhvG2KdgwIhRnoEE2uHdtdGNQ8s0lb94dW9sELog==", + "dev": true, + "dependencies": { + "@sigstore/protobuf-specs": "^0.2.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } }, - "node_modules/@tootallnate/once": { + "node_modules/@sigstore/protobuf-specs": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.2.1.tgz", + "integrity": "sha512-XTWVxnWJu+c1oCshMLwnKvz8ZQJJDVOlciMfgpJBQbThVjKTCG8dwyhgLngBD2KN0ap9F/gOV8rFDEx8uh7R2A==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@sigstore/sign": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-1.0.0.tgz", + "integrity": "sha512-INxFVNQteLtcfGmcoldzV6Je0sbbfh9I16DM4yJPw3j5+TFP8X6uIiA18mvpEa9yyeycAKgPmOA3X9hVdVTPUA==", + "dev": true, + "dependencies": { + "@sigstore/bundle": "^1.1.0", + "@sigstore/protobuf-specs": "^0.2.0", + "make-fetch-happen": "^11.0.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@sigstore/sign/node_modules/@tootallnate/once": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", @@ -4906,6 +6741,109 @@ "node": ">= 10" } }, + "node_modules/@sigstore/sign/node_modules/http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@sigstore/sign/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@sigstore/sign/node_modules/make-fetch-happen": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", + "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", + "dev": true, + "dependencies": { + "agentkeepalive": "^4.2.1", + "cacache": "^17.0.0", + "http-cache-semantics": "^4.1.1", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.7.1", + "minipass": "^5.0.0", + "minipass-fetch": "^3.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^7.0.0", + "ssri": "^10.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@sigstore/sign/node_modules/minipass-fetch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.5.tgz", + "integrity": "sha512-2N8elDQAtSnFV0Dk7gt15KHsS0Fyz6CbYZ360h0WTYV1Ty46li3rAXVOQj1THMNLdmrD9Vt5pBPtWtVkpwGBqg==", + "dev": true, + "dependencies": { + "minipass": "^7.0.3", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, + "node_modules/@sigstore/sign/node_modules/minipass-fetch/node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/@sigstore/tuf": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-1.0.3.tgz", + "integrity": "sha512-2bRovzs0nJZFlCN3rXirE4gwxCn97JNjMmwpecqlbgV9WcxX7WRuIrgzx/X7Ib7MYRbyUTpBYE0s2x6AmZXnlg==", + "dev": true, + "dependencies": { + "@sigstore/protobuf-specs": "^0.2.0", + "tuf-js": "^1.1.7" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@socket.io/component-emitter": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", + "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==", + "dev": true + }, + "node_modules/@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, "node_modules/@tsconfig/node10": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.8.tgz", @@ -4930,10 +6868,56 @@ "integrity": "sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==", "dev": true }, + "node_modules/@tufjs/canonical-json": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@tufjs/canonical-json/-/canonical-json-1.0.0.tgz", + "integrity": "sha512-QTnf++uxunWvG2z3UFNzAoQPHxnSXOwtaI3iJ+AohhV+5vONuArPjJE7aPXPVXfXJsqrVbZBu9b81AJoSd09IQ==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@tufjs/models": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-1.0.4.tgz", + "integrity": "sha512-qaGV9ltJP0EO25YfFUPhxRVK0evXFIAGicsVXuRim4Ed9cjPxYhNnNJ49SFmbeLgtxpslIkX317IgpfcHPVj/A==", + "dev": true, + "dependencies": { + "@tufjs/canonical-json": "1.0.0", + "minimatch": "^9.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@tufjs/models/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@tufjs/models/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "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": "*", @@ -4941,27 +6925,27 @@ } }, "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": "*" } }, "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": "*", @@ -4975,9 +6959,9 @@ "dev": true }, "node_modules/@types/cors": { - "version": "2.8.13", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.13.tgz", - "integrity": "sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA==", + "version": "2.8.17", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.17.tgz", + "integrity": "sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==", "dev": true, "dependencies": { "@types/node": "*" @@ -4995,59 +6979,46 @@ "integrity": "sha512-lhnbkC0XorAD7Dt7X+94cXUSHEdDNnEVk/DgFLHgIZQNhixV631Lj4+KpXunTT5rCHyj9RqK3TfO7QrOiwEeUQ==", "dev": true }, - "node_modules/@types/eslint": { - "version": "8.4.8", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.8.tgz", - "integrity": "sha512-zUCKQI1bUCTi+0kQs5ZQzQ/XILWRLIlh15FXWNykJ+NG3TMKMVvwwC6GP3DR1Ylga15fB7iAExSzc4PNlR5i3w==", - "dev": true, - "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "node_modules/@types/eslint-scope": { - "version": "3.7.4", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", - "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", - "dev": true, - "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, "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.14", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.14.tgz", - "integrity": "sha512-TEbt+vaPFQ+xpxFLFssxUDXj5cWCxZJjIcB7Yg0k0GMHGtgtQgpvx/MUQUeAkNbA9AAGrwkAsoeItdTgS7FMyg==", + "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": "*", - "@types/express-serve-static-core": "^4.17.18", + "@types/express-serve-static-core": "^4.17.33", "@types/qs": "*", "@types/serve-static": "*" } }, "node_modules/@types/express-serve-static-core": { - "version": "4.17.31", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.31.tgz", - "integrity": "sha512-DxMhY+NAsTwMMFHBTtJFNp5qiHKJ7TeqOo23zVEM9alT1Ml27Q3xcTH0xwxn7Q0BbMcVEJOs/7aQtUWupUQN3Q==", + "version": "4.19.5", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.5.tgz", + "integrity": "sha512-y6W03tvrACO72aijJ5uF02FRq5cgDR9lUxddQ8vyF+GvmjJQqbzDcJngEjURc+ZsG31VI3hODNZJ2URj86pzmg==", "dev": true, "dependencies": { "@types/node": "*", "@types/qs": "*", - "@types/range-parser": "*" + "@types/range-parser": "*", + "@types/send": "*" } }, + "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.15", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.15.tgz", + "integrity": "sha512-25g5atgiVNTIv0LBDTg1H74Hvayx0ajtJPLLcYE3whFv75J0pWNtOBzaXJQgDTmrX1bx5U9YC2w/n65BN1HwRQ==", "dev": true, "dependencies": { "@types/node": "*" @@ -5081,21 +7052,34 @@ "dev": true }, "node_modules/@types/marked": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/@types/marked/-/marked-4.0.7.tgz", - "integrity": "sha512-eEAhnz21CwvKVW+YvRvcTuFKNU9CV1qH+opcgVK3pIMI6YZzDm6gc8o2vHjldFk6MGKt5pueSB7IOpvpx5Qekw==" + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@types/marked/-/marked-4.3.2.tgz", + "integrity": "sha512-a79Yc3TOk6dGdituy8hmTTJXjOkZ7zsFYV10L337ttq/rec8lRMDBpV7fL3uLx6TgbFCa5DU/h8FmIBQPSbU0w==", + "peer": true }, "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/node": { - "version": "15.14.9", - "resolved": "https://registry.npmjs.org/@types/node/-/node-15.14.9.tgz", - "integrity": "sha512-qjd88DrCxupx/kJD5yQgZdcYKZKSIGBVDIBE1/LTGcNm3d2Np/jxojkdePDdfnBHJc5W7vSMpbJ1aB7p/Py69A==", - "dev": true + "version": "18.19.39", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.39.tgz", + "integrity": "sha512-nPwTRDKUctxw3di5b4TfT3I0sWDiWoPQCZjXhvdkINntwr8lcoVCKsTgnXeRubKIlfnV+eN/HYk6Jb40tbcEAQ==", + "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", @@ -5104,15 +7088,15 @@ "dev": true }, "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.16", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.16.tgz", + "integrity": "sha512-7i+zxXdPD0T4cKDuxCUXJ4wHcsJLwENa6Z3dCu8cfCK743OGy5Nu1RmAGqDPsoTDINVEcdXKRvR/zre+P2Ku1A==", "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/retry": { @@ -5121,23 +7105,40 @@ "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", "dev": true }, + "node_modules/@types/semver": { + "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/sinonjs__fake-timers": { @@ -5153,9 +7154,9 @@ "dev": true }, "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": "*" @@ -5174,9 +7175,9 @@ "dev": true }, "node_modules/@types/ws": { - "version": "8.5.3", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.3.tgz", - "integrity": "sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==", + "version": "8.5.12", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.12.tgz", + "integrity": "sha512-3tPRkv1EtkDpzlgyKyI8pGsGZAGPEaXeu0DOj5DI25Ja91bdAYddYHbADRYVrZMRbfW+1l5YwXVDKohDJNQxkQ==", "dev": true, "dependencies": { "@types/node": "*" @@ -5293,13 +7294,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.37.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.37.0.tgz", - "integrity": "sha512-BSx/O0Z0SXOF5tY0bNTBcDEKz2Ec20GVYvq/H/XNKiUorUFilH7NPbFUuiiyzWaSdN3PA8JV0OvYx0gH/5aFAQ==", + "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.37.0", - "@typescript-eslint/utils": "5.37.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "@typescript-eslint/utils": "5.62.0", "debug": "^4.3.4", "tsutils": "^3.21.0" }, @@ -5320,9 +7321,9 @@ } }, "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { - "version": "5.37.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.37.0.tgz", - "integrity": "sha512-3frIJiTa5+tCb2iqR/bf7XwU20lnU05r/sgPJnRpwvfZaqCJBrl8Q/mw9vr3NrNdB/XtVyMA0eppRMMBqdJ1bA==", + "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" @@ -5333,13 +7334,13 @@ } }, "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "5.37.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.37.0.tgz", - "integrity": "sha512-JkFoFIt/cx59iqEDSgIGnQpCTRv96MQnXCYvJi7QhBC24uyuzbD8wVbajMB1b9x4I0octYFJ3OwjAwNqk1AjDA==", + "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.37.0", - "@typescript-eslint/visitor-keys": "5.37.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", @@ -5360,12 +7361,12 @@ } }, "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "5.37.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.37.0.tgz", - "integrity": "sha512-Hp7rT4cENBPIzMwrlehLW/28EVCOcE9U1Z1BQTc8EA8v5qpr7GRGuG+U58V5tTY48zvUOA3KHvw3rA8tY9fbdA==", + "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.37.0", + "@typescript-eslint/types": "5.62.0", "eslint-visitor-keys": "^3.3.0" }, "engines": { @@ -5376,21 +7377,6 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/type-utils/node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/@typescript-eslint/types": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.3.0.tgz", @@ -5432,17 +7418,19 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "5.37.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.37.0.tgz", - "integrity": "sha512-jUEJoQrWbZhmikbcWSMDuUSxEE7ID2W/QCV/uz10WtQqfOuKZUqFGjqLJ+qhDd17rjgp+QJPqTdPIBWwoob2NQ==", + "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", - "@typescript-eslint/scope-manager": "5.37.0", - "@typescript-eslint/types": "5.37.0", - "@typescript-eslint/typescript-estree": "5.37.0", + "@types/semver": "^7.3.12", + "@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": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -5456,13 +7444,13 @@ } }, "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager": { - "version": "5.37.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.37.0.tgz", - "integrity": "sha512-F67MqrmSXGd/eZnujjtkPgBQzgespu/iCZ+54Ok9X5tALb9L2v3G+QBSoWkXG0p3lcTJsL+iXz5eLUEdSiJU9Q==", + "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.37.0", - "@typescript-eslint/visitor-keys": "5.37.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" @@ -5473,9 +7461,9 @@ } }, "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": { - "version": "5.37.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.37.0.tgz", - "integrity": "sha512-3frIJiTa5+tCb2iqR/bf7XwU20lnU05r/sgPJnRpwvfZaqCJBrl8Q/mw9vr3NrNdB/XtVyMA0eppRMMBqdJ1bA==", + "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" @@ -5486,13 +7474,13 @@ } }, "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "5.37.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.37.0.tgz", - "integrity": "sha512-JkFoFIt/cx59iqEDSgIGnQpCTRv96MQnXCYvJi7QhBC24uyuzbD8wVbajMB1b9x4I0octYFJ3OwjAwNqk1AjDA==", + "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.37.0", - "@typescript-eslint/visitor-keys": "5.37.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", @@ -5513,12 +7501,12 @@ } }, "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "5.37.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.37.0.tgz", - "integrity": "sha512-Hp7rT4cENBPIzMwrlehLW/28EVCOcE9U1Z1BQTc8EA8v5qpr7GRGuG+U58V5tTY48zvUOA3KHvw3rA8tY9fbdA==", + "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.37.0", + "@typescript-eslint/types": "5.62.0", "eslint-visitor-keys": "^3.3.0" }, "engines": { @@ -5529,21 +7517,6 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/utils/node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/@typescript-eslint/visitor-keys": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.3.0.tgz", @@ -5561,32 +7534,44 @@ "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@vitejs/plugin-basic-ssl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-1.0.1.tgz", + "integrity": "sha512-pcub+YbFtFhaGRTo1832FQHQSHvMrlb43974e2eS8EKleR3p1cDdkJFPci1UhwkEf1J9Bz+wKBSzqpKp7nNj2A==", + "dev": true, + "engines": { + "node": ">=14.6.0" + }, + "peerDependencies": { + "vite": "^3.0.0 || ^4.0.0" + } + }, "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-code-frame": { @@ -5659,111 +7644,111 @@ "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-parser": { @@ -5810,15 +7795,108 @@ "dev": true }, "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/@wessberg/ts-evaluator": { + "version": "0.0.27", + "resolved": "https://registry.npmjs.org/@wessberg/ts-evaluator/-/ts-evaluator-0.0.27.tgz", + "integrity": "sha512-7gOpVm3yYojUp/Yn7F4ZybJRxyqfMNf0LXK5KJiawbPfL0XTsJV+0mgrEDjOIR6Bi0OYk2Cyg4tjFu1r8MCZaA==", + "deprecated": "this package has been renamed to ts-evaluator. Please install ts-evaluator instead", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "jsdom": "^16.4.0", + "object-path": "^0.11.5", + "tslib": "^2.0.3" + }, + "engines": { + "node": ">=10.1.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/wessberg/ts-evaluator?sponsor=1" + }, + "peerDependencies": { + "typescript": ">=3.2.x || >= 4.x" + } + }, + "node_modules/@wessberg/ts-evaluator/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/@wessberg/ts-evaluator/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@wessberg/ts-evaluator/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@wessberg/ts-evaluator/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/@wessberg/ts-evaluator/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@wessberg/ts-evaluator/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/@xtuc/ieee754": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", @@ -5836,10 +7914,42 @@ "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==" }, + "node_modules/@yarnpkg/parsers": { + "version": "3.0.0-rc.46", + "resolved": "https://registry.npmjs.org/@yarnpkg/parsers/-/parsers-3.0.0-rc.46.tgz", + "integrity": "sha512-aiATs7pSutzda/rq8fnuPwTglyVwjM22bNnK2ZgjrpAjQHSSl3lztd2f9evst1W/qnC58DRz7T7QndUDumAR4Q==", + "dev": true, + "dependencies": { + "js-yaml": "^3.10.0", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=14.15.0" + } + }, + "node_modules/@zkochan/js-yaml": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/@zkochan/js-yaml/-/js-yaml-0.0.6.tgz", + "integrity": "sha512-nzvgl3VfhcELQ8LyVrYOru+UtAy1nrygk2+AGbTm8a5YcO6o8lSjAT+pfg3vJWxIoZKOUhrK6UU7xW/+00kQrg==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@zkochan/js-yaml/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, "node_modules/abab": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", + "deprecated": "Use your platform's native atob() and btoa() methods instead", "dev": true }, "node_modules/abbrev": { @@ -5872,9 +7982,9 @@ "integrity": "sha512-NBOQlm9+7RBqRqZwimpgquaLeTJFayqb9UEPtTkpC3TkkwDnlsT/TwsCC0svjt9kEZ6G9mH5AEOHSz6Q/HrzQQ==" }, "node_modules/acorn": { - "version": "8.8.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", - "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.0.tgz", + "integrity": "sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -5883,10 +7993,41 @@ "node": ">=0.4.0" } }, - "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==", + "node_modules/acorn-globals": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", + "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", + "dev": true, + "dependencies": { + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1" + } + }, + "node_modules/acorn-globals/node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-globals/node_modules/acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-attributes": { + "version": "1.9.5", + "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", + "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", "dev": true, "peerDependencies": { "acorn": "^8" @@ -5950,13 +8091,11 @@ } }, "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": { @@ -6050,15 +8189,15 @@ } }, "node_modules/angular-tag-cloud-module": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/angular-tag-cloud-module/-/angular-tag-cloud-module-14.0.0.tgz", - "integrity": "sha512-H1NU9C2nKT0WzKITZ0gP/T9QoXYpFxYHcUW9snFJOXnwmLLVo6VmXQ0KbI+0pVa5Tu/OxzNWiy1R61PtjBigKA==", + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/angular-tag-cloud-module/-/angular-tag-cloud-module-16.0.0.tgz", + "integrity": "sha512-xEKt+56bdQ6uWsQF3gL+MsmEdvhWJLM0KKOEumC04RVBdfsFwJyZpBC1vHzDbvgmMtvydITGk5UdXc039tFiDw==", "dependencies": { "tslib": "^2.3.0" }, "peerDependencies": { - "@angular/common": "^14.0.0 || ^15.0.0-0", - "@angular/core": "^14.0.0 || ^15.0.0-0" + "@angular/common": "^16.0.0 || ^17.0.0-0", + "@angular/core": "^16.0.0 || ^17.0.0-0" } }, "node_modules/ansi-colors": { @@ -6161,6 +8300,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", @@ -6186,12 +8326,12 @@ } }, "node_modules/aria-query": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.0.2.tgz", - "integrity": "sha512-eigU3vhqSO+Z8BKDnVLN/ompjhf3pYzecKXz8+whRy+9gZu8n1TCGfwzQUUPnqdHl9ax1Hr9031orZ+UOEYr7Q==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", "dev": true, - "engines": { - "node": ">=6.0" + "dependencies": { + "dequal": "^2.0.3" } }, "node_modules/arr-diff": { @@ -6231,9 +8371,9 @@ } }, "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==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", "dev": true }, "node_modules/array-union": { @@ -6309,7 +8449,7 @@ "node_modules/assert-plus": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", "dev": true, "engines": { "node": ">=0.8" @@ -6334,7 +8474,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", "integrity": "sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -6370,7 +8509,7 @@ "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", "dev": true }, "node_modules/at-least-node": { @@ -6395,9 +8534,9 @@ } }, "node_modules/autoprefixer": { - "version": "10.4.13", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.13.tgz", - "integrity": "sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg==", + "version": "10.4.14", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.14.tgz", + "integrity": "sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==", "dev": true, "funding": [ { @@ -6410,8 +8549,8 @@ } ], "dependencies": { - "browserslist": "^4.21.4", - "caniuse-lite": "^1.0.30001426", + "browserslist": "^4.21.5", + "caniuse-lite": "^1.0.30001464", "fraction.js": "^4.2.0", "normalize-range": "^0.1.2", "picocolors": "^1.0.0", @@ -6430,16 +8569,16 @@ "node_modules/aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", "dev": true, "engines": { "node": "*" } }, "node_modules/aws4": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", - "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", + "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==", "dev": true }, "node_modules/axe-core": { @@ -6451,13 +8590,44 @@ "node": ">=4" } }, - "node_modules/axobject-query": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.0.1.tgz", - "integrity": "sha512-vy5JPSOibF9yAeC2PoemRdA1MuSXX7vX5osdoxKf/6OUeppAWekZ3JIJVNWFMH6wgj7uHYyqZUSqE/b/3JLV1A==", + "node_modules/axios": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.4.tgz", + "integrity": "sha512-DukmaFRnY6AzAALSH4J2M3k6PkaC+MfaAGdEERRWcC9q3/TWQwLpHR8ZRLKTdQ3aBDL64EdluRDjJqKw+BPZEw==", "dev": true, + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/axios/node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, "engines": { - "node": ">=6.0" + "node": ">= 6" + } + }, + "node_modules/axios/node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "dev": true + }, + "node_modules/axobject-query": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.0.0.tgz", + "integrity": "sha512-+60uv1hiVFhHZeO+Lz0RYzsVHy5Wr1ayX0mwda9KPDVLNJgZ1T9Ny7VmFbLDzxsH0D87I86vgj3gFrjTJUYznw==", + "dev": true, + "dependencies": { + "dequal": "^2.0.3" } }, "node_modules/babel-loader": { @@ -6516,17 +8686,17 @@ } }, "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz", - "integrity": "sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==", + "version": "0.4.11", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz", + "integrity": "sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.17.7", - "@babel/helper-define-polyfill-provider": "^0.3.3", - "semver": "^6.1.1" + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.6.2", + "semver": "^6.3.1" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { @@ -6539,28 +8709,60 @@ } }, "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.3.tgz", - "integrity": "sha512-zKsXDh0XjnrUEW0mxIHLfjBfnXSMr5Q/goMe/fxpQnLm07mcOZiIZHBNWCMx60HmdvjxfXcalac0tfFg0wqxyw==", + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.7.tgz", + "integrity": "sha512-KyDvZYxAzkC0Aj2dAPyDzi2Ym15e5JKZSK+maI7NAwSqofvuFglbSsxE7wUOvTg9oFVnHMzVzBKcqEb4PJgtOA==", "dev": true, "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.3.2", - "core-js-compat": "^3.21.0" + "@babel/helper-define-polyfill-provider": "^0.4.4", + "core-js-compat": "^3.33.1" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs3/node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.4.tgz", + "integrity": "sha512-QcJMILQCu2jm5TFPGA3lCpJJTeEP+mqeXooG/NZbg/h5FTFi6V0+99ahlRsW8/kRLyb24LZVCCiclDedhLKcBA==", + "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz", - "integrity": "sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==", + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.5.tgz", + "integrity": "sha512-OJGYZlhLqBh2DDHeqAxWB1XIvr49CxiJ2gIt61/PU55CQK4Z58OzMqjDe1zwQdQk+rBYsRc+1rJmdajM3gimHg==", "dev": true, "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.3.3" + "@babel/helper-define-polyfill-provider": "^0.5.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator/node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.5.0.tgz", + "integrity": "sha512-NovQquuQLAQ5HuyjCz7WQP9MjRj7dx++yspwiyUiGl9ZyadHRSql1HZh5ogRd8W8w6YM6EQ/NTB8rgjLt5W65Q==", + "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "node_modules/balanced-match": { @@ -6636,7 +8838,7 @@ "node_modules/bcrypt-pbkdf": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", "dev": true, "dependencies": { "tweetnacl": "^0.14.3" @@ -6714,21 +8916,21 @@ "dev": true }, "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.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", "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", "http-errors": "2.0.0", "iconv-lite": "0.4.24", "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.1", + "qs": "6.13.0", + "raw-body": "2.5.2", "type-is": "~1.6.18", "unpipe": "1.0.0" }, @@ -6746,15 +8948,6 @@ "ms": "2.0.0" } }, - "node_modules/body-parser/node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/body-parser/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -6774,12 +8967,12 @@ } }, "node_modules/body-parser/node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", "dev": true, "dependencies": { - "side-channel": "^1.0.4" + "side-channel": "^1.0.6" }, "engines": { "node": ">=0.6" @@ -6797,13 +8990,11 @@ } }, "node_modules/bonjour-service": { - "version": "1.0.14", - "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.0.14.tgz", - "integrity": "sha512-HIMbgLnk1Vqvs6B4Wq5ep7mxvj9sGz5d1JJyDNSGNIdA/w2MCz6GTjWTdjqOJV1bEPj+6IkxDvWNFKEBxNt4kQ==", + "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" } @@ -6849,6 +9040,12 @@ "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", "dev": true }, + "node_modules/browser-process-hrtime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", + "dev": true + }, "node_modules/browserify-aes": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", @@ -6897,20 +9094,23 @@ } }, "node_modules/browserify-sign": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", - "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.2.tgz", + "integrity": "sha512-1rudGyeYY42Dk6texmv7c4VcQ0EsvVbLwZkA+AQB7SxvXxmcD93jcHie8bzecJ+ChDlmAm2Qyu0+Ccg5uhZXCg==", "dev": true, "dependencies": { - "bn.js": "^5.1.1", - "browserify-rsa": "^4.0.1", + "bn.js": "^5.2.1", + "browserify-rsa": "^4.1.0", "create-hash": "^1.2.0", "create-hmac": "^1.1.7", - "elliptic": "^6.5.3", + "elliptic": "^6.5.4", "inherits": "^2.0.4", - "parse-asn1": "^5.1.5", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" + "parse-asn1": "^5.1.6", + "readable-stream": "^3.6.2", + "safe-buffer": "^5.2.1" + }, + "engines": { + "node": ">= 4" } }, "node_modules/browserify-sign/node_modules/safe-buffer": { @@ -6943,9 +9143,9 @@ } }, "node_modules/browserslist": { - "version": "4.21.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", - "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", + "version": "4.23.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.1.tgz", + "integrity": "sha512-TUfofFo/KsK/bWZ9TWQ5O26tsWW4Uhmt8IYklbnUa70udB6P2wA7w7o4PY4muaEPBQaAX+CEnmmIA41NVHtPVw==", "dev": true, "funding": [ { @@ -6955,13 +9155,17 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "dependencies": { - "caniuse-lite": "^1.0.30001400", - "electron-to-chromium": "^1.4.251", - "node-releases": "^2.0.6", - "update-browserslist-db": "^1.0.9" + "caniuse-lite": "^1.0.30001629", + "electron-to-chromium": "^1.4.796", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.16" }, "bin": { "browserslist": "cli.js" @@ -7035,32 +9239,26 @@ } }, "node_modules/cacache": { - "version": "16.1.2", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.1.2.tgz", - "integrity": "sha512-Xx+xPlfCZIUHagysjjOAje9nRo8pRDczQCcXb4J2O0BLtH+xeVue6ba4y1kfJfQMAnM2mkcoMIAyOctlaRGWYA==", + "version": "17.1.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-17.1.4.tgz", + "integrity": "sha512-/aJwG2l3ZMJ1xNAnqbMpA40of9dj/pIH3QfiuQSqjfPJF747VR0J/bHn+/KdNnHKc6XQcWt/AfRSBft82W1d2A==", "dev": true, "dependencies": { - "@npmcli/fs": "^2.1.0", - "@npmcli/move-file": "^2.0.0", - "chownr": "^2.0.0", - "fs-minipass": "^2.1.0", - "glob": "^8.0.1", - "infer-owner": "^1.0.4", + "@npmcli/fs": "^3.1.0", + "fs-minipass": "^3.0.0", + "glob": "^10.2.2", "lru-cache": "^7.7.1", - "minipass": "^3.1.6", + "minipass": "^7.0.3", "minipass-collect": "^1.0.2", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", - "mkdirp": "^1.0.4", "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^9.0.0", + "ssri": "^10.0.0", "tar": "^6.1.11", - "unique-filename": "^1.1.1" + "unique-filename": "^3.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/cacache/node_modules/brace-expansion": { @@ -7073,43 +9271,83 @@ } }, "node_modules/cacache/node_modules/glob": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz", - "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", + "version": "10.4.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.2.tgz", + "integrity": "sha512-GwMlUF6PkPo3Gk21UxkCohOv0PLcIXVtKyLlpEI28R/cO/4eNOdmLk3CMW1wROV/WR/EsZOWAfBbBOqYvs88/w==", "dev": true, "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" }, "engines": { - "node": ">=12" + "node": ">=16 || 14 >=14.18" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/cacache/node_modules/lru-cache": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.14.0.tgz", - "integrity": "sha512-EIRtP1GrSJny0dqb50QXRUNBxHJhcpxHC++M5tD7RYbvLLn5KVWKsbyswSSqDuU15UFi3bgTQIY8nhDMeF6aDQ==", + "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/cacache/node_modules/minimatch": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", - "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, "dependencies": { "brace-expansion": "^2.0.1" }, "engines": { - "node": ">=10" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/cacache/node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/cacache/node_modules/unique-filename": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz", + "integrity": "sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==", + "dev": true, + "dependencies": { + "unique-slug": "^4.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/cacache/node_modules/unique-slug": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-4.0.0.tgz", + "integrity": "sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/cache-base": { @@ -7142,13 +9380,19 @@ } }, "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" @@ -7173,9 +9417,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001426", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001426.tgz", - "integrity": "sha512-n7cosrHLl8AWt0wwZw/PJZgUg3lV0gk9LMI7ikGJwhyhgsd2Nb65vKvmSexCqq/J7rbH3mFG6yZZiPR5dLPW5A==", + "version": "1.0.30001639", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001639.tgz", + "integrity": "sha512-eFHflNTBIlFwP2AIKaYuBQN/apnUoKNhBdza8ZnW/h2di4LCZ4xFqYlxUxo+LQ76KFI1PGcC1QDxMbxTZpSCAg==", "dev": true, "funding": [ { @@ -7185,13 +9429,17 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ] }, "node_modules/caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", "dev": true }, "node_modules/chalk": { @@ -7267,144 +9515,6 @@ "url": "https://github.com/sponsors/fb55" } }, - "node_modules/cheerio-select/node_modules/css-select": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", - "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", - "dev": true, - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.1.0", - "domhandler": "^5.0.2", - "domutils": "^3.0.1", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/cheerio-select/node_modules/css-what": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", - "dev": true, - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/cheerio-select/node_modules/dom-serializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", - "dev": true, - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/cheerio-select/node_modules/domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "dev": true, - "dependencies": { - "domelementtype": "^2.3.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/cheerio-select/node_modules/domutils": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz", - "integrity": "sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==", - "dev": true, - "dependencies": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.1" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/cheerio-select/node_modules/entities": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.3.1.tgz", - "integrity": "sha512-o4q/dYJlmyjP2zfnaWDUC6A3BQFmVTX+tZPezK7k0GLSU9QYCauscf5Y+qcEPzKL+EixVouYDgLQK5H9GrLpkg==", - "dev": true, - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/cheerio/node_modules/dom-serializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", - "dev": true, - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/cheerio/node_modules/domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "dev": true, - "dependencies": { - "domelementtype": "^2.3.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/cheerio/node_modules/domutils": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz", - "integrity": "sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==", - "dev": true, - "dependencies": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.1" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/cheerio/node_modules/entities": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.3.1.tgz", - "integrity": "sha512-o4q/dYJlmyjP2zfnaWDUC6A3BQFmVTX+tZPezK7k0GLSU9QYCauscf5Y+qcEPzKL+EixVouYDgLQK5H9GrLpkg==", - "dev": true, - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, "node_modules/cheerio/node_modules/parse5": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.0.0.tgz", @@ -7666,6 +9776,7 @@ "version": "2.0.11", "resolved": "https://registry.npmjs.org/clipboard/-/clipboard-2.0.11.tgz", "integrity": "sha512-C+0bbOqkezLIsmWSvlsXS0Q0bmkugu7jcfMIACB+RDEntIzQIkdr148we28AfSloQLRdZlYL/QYyrq05j/3Faw==", + "optional": true, "dependencies": { "good-listener": "^1.2.2", "select": "^1.1.2", @@ -7822,14 +9933,20 @@ } }, "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": "6.2.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", + "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", "dev": true, "engines": { "node": ">= 6" } }, + "node_modules/common-path-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", + "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==", + "dev": true + }, "node_modules/common-tags": { "version": "1.8.2", "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", @@ -8036,9 +10153,9 @@ ] }, "node_modules/content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", "dev": true, "engines": { "node": ">= 0.6" @@ -8250,12 +10367,12 @@ } }, "node_modules/core-js-compat": { - "version": "3.26.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.26.0.tgz", - "integrity": "sha512-piOX9Go+Z4f9ZiBFLnZ5VrOpBl0h7IGCkiFUN11QTe6LjAvOT3ifL/5TdoizMh99hcGy5SoLyWbapIY/PIb/3A==", + "version": "3.37.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.37.1.tgz", + "integrity": "sha512-9TNiImhKvQqSUkOvk/mMRZzOANTiEVC7WaBNhHcKM7x+/5E1l5NvsysR19zuDQScE8k+kfQXWRN3AtS/eOSHpg==", "dev": true, "dependencies": { - "browserslist": "^4.21.4" + "browserslist": "^4.23.0" }, "funding": { "type": "opencollective", @@ -8346,16 +10463,17 @@ "dev": true }, "node_modules/critters": { - "version": "0.0.16", - "resolved": "https://registry.npmjs.org/critters/-/critters-0.0.16.tgz", - "integrity": "sha512-JwjgmO6i3y6RWtLYmXwO5jMd+maZt8Tnfu7VVISmEWyQqfLpB8soBswf8/2bu6SBXxtKA68Al3c+qIG1ApT68A==", + "version": "0.0.20", + "resolved": "https://registry.npmjs.org/critters/-/critters-0.0.20.tgz", + "integrity": "sha512-CImNRorKOl5d8TWcnAz5n5izQ6HFsvz29k327/ELy6UFcmbiZNOsinaKvzv16WZR0P6etfSWYzE47C4/56B3Uw==", "dev": true, "dependencies": { "chalk": "^4.1.0", - "css-select": "^4.2.0", - "parse5": "^6.0.1", - "parse5-htmlparser2-tree-adapter": "^6.0.1", - "postcss": "^8.3.7", + "css-select": "^5.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.2", + "htmlparser2": "^8.0.2", + "postcss": "^8.4.23", "pretty-bytes": "^5.3.0" } }, @@ -8417,12 +10535,6 @@ "node": ">=8" } }, - "node_modules/critters/node_modules/parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", - "dev": true - }, "node_modules/critters/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -8471,56 +10583,20 @@ "node": "*" } }, - "node_modules/css-blank-pseudo": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-3.0.3.tgz", - "integrity": "sha512-VS90XWtsHGqoM0t4KpH053c4ehxZ2E6HtGI7x68YFV0pTo/QmkV/YFA+NnlvK8guxZVNWGQhVNJGC39Q8XF4OQ==", - "dev": true, - "dependencies": { - "postcss-selector-parser": "^6.0.9" - }, - "bin": { - "css-blank-pseudo": "dist/cli.cjs" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/css-has-pseudo": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-3.0.4.tgz", - "integrity": "sha512-Vse0xpR1K9MNlp2j5w1pgWIJtm1a8qS0JwS9goFYcImjlHEmywP9VUF05aGBXzGpDJF86QXk4L0ypBmwPhGArw==", - "dev": true, - "dependencies": { - "postcss-selector-parser": "^6.0.9" - }, - "bin": { - "css-has-pseudo": "dist/cli.cjs" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, "node_modules/css-loader": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.7.1.tgz", - "integrity": "sha512-yB5CNFa14MbPJcomwNh3wLThtkZgcNyI2bNMRt8iE5Z8Vwl7f8vQXFAzn2HDOJvtDq2NTZBUGMSUNNyrv3/+cw==", + "version": "6.8.1", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.8.1.tgz", + "integrity": "sha512-xDAXtEVGlD0gJ07iclwWVkLoZOpEvAWaSyf6W18S2pOC//K8+qUDIx8IIT3D+HjnmkJPQeesOPv5aiUaJsCM2g==", "dev": true, "dependencies": { "icss-utils": "^5.1.0", - "postcss": "^8.4.7", + "postcss": "^8.4.21", "postcss-modules-extract-imports": "^3.0.0", - "postcss-modules-local-by-default": "^4.0.0", + "postcss-modules-local-by-default": "^4.0.3", "postcss-modules-scope": "^3.0.0", "postcss-modules-values": "^4.0.0", "postcss-value-parser": "^4.2.0", - "semver": "^7.3.5" + "semver": "^7.3.8" }, "engines": { "node": ">= 12.13.0" @@ -8533,31 +10609,28 @@ "webpack": "^5.0.0" } }, - "node_modules/css-prefers-color-scheme": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-6.0.3.tgz", - "integrity": "sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA==", + "node_modules/css-loader/node_modules/semver": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", + "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", "dev": true, "bin": { - "css-prefers-color-scheme": "dist/cli.cjs" + "semver": "bin/semver.js" }, "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" + "node": ">=10" } }, "node_modules/css-select": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.2.1.tgz", - "integrity": "sha512-/aUslKhzkTNCQUB2qTX84lVmfia9NyjP3WpDGtj/WxhwBzWBYUV3DgUpurHTme8UTPcPlAD1DJ+b0nN/t50zDQ==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", "dev": true, "dependencies": { "boolbase": "^1.0.0", - "css-what": "^5.1.0", - "domhandler": "^4.3.0", - "domutils": "^2.8.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", "nth-check": "^2.0.1" }, "funding": { @@ -8565,9 +10638,9 @@ } }, "node_modules/css-what": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.1.0.tgz", - "integrity": "sha512-arSMRWIIFY0hV8pIxZMEfmMI47Wj3R/aWpZDDxWYCPEiOMv6tfOrnpDtgxBYPEQD4V0Y/958+1TdC3iWTFcUPw==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", "dev": true, "engines": { "node": ">= 6" @@ -8576,16 +10649,6 @@ "url": "https://github.com/sponsors/fb55" } }, - "node_modules/cssdb": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-7.0.2.tgz", - "integrity": "sha512-Vm4b6P/PifADu0a76H0DKRNVWq3Rq9xa/Nx6oEMUBJlwTUuZoZ3dkZxo8Gob3UEL53Cq+Ma1GBgISed6XEBs3w==", - "dev": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - }, "node_modules/cssesc": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", @@ -8598,6 +10661,30 @@ "node": ">=4" } }, + "node_modules/cssom": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", + "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", + "dev": true + }, + "node_modules/cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "dev": true, + "dependencies": { + "cssom": "~0.3.6" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cssstyle/node_modules/cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "dev": true + }, "node_modules/custom-event": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", @@ -8610,30 +10697,29 @@ "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=" }, "node_modules/cypress": { - "version": "12.3.0", - "resolved": "https://registry.npmjs.org/cypress/-/cypress-12.3.0.tgz", - "integrity": "sha512-ZQNebibi6NBt51TRxRMYKeFvIiQZ01t50HSy7z/JMgRVqBUey3cdjog5MYEbzG6Ktti5ckDt1tfcC47lmFwXkw==", + "version": "13.7.2", + "resolved": "https://registry.npmjs.org/cypress/-/cypress-13.7.2.tgz", + "integrity": "sha512-FF5hFI5wlRIHY8urLZjJjj/YvfCBrRpglbZCLr/cYcL9MdDe0+5usa8kTIrDHthlEc9lwihbkb5dmwqBDNS2yw==", "dev": true, "hasInstallScript": true, "dependencies": { - "@cypress/request": "^2.88.10", + "@cypress/request": "^3.0.0", "@cypress/xvfb": "^1.2.4", - "@types/node": "^14.14.31", "@types/sinonjs__fake-timers": "8.1.1", "@types/sizzle": "^2.3.2", "arch": "^2.2.0", "blob-util": "^2.0.2", "bluebird": "^3.7.2", - "buffer": "^5.6.0", + "buffer": "^5.7.1", "cachedir": "^2.3.0", "chalk": "^4.1.0", "check-more-types": "^2.24.0", "cli-cursor": "^3.1.0", "cli-table3": "~0.6.1", - "commander": "^5.1.0", + "commander": "^6.2.1", "common-tags": "^1.8.0", "dayjs": "^1.10.4", - "debug": "^4.3.2", + "debug": "^4.3.4", "enquirer": "^2.3.6", "eventemitter2": "6.4.7", "execa": "4.1.0", @@ -8642,18 +10728,19 @@ "figures": "^3.2.0", "fs-extra": "^9.1.0", "getos": "^3.2.1", - "is-ci": "^3.0.0", + "is-ci": "^3.0.1", "is-installed-globally": "~0.4.0", "lazy-ass": "^1.6.0", "listr2": "^3.8.3", "lodash": "^4.17.21", "log-symbols": "^4.0.0", - "minimist": "^1.2.6", + "minimist": "^1.2.8", "ospath": "^1.2.2", "pretty-bytes": "^5.6.0", + "process": "^0.11.10", "proxy-from-env": "1.0.0", "request-progress": "^3.0.0", - "semver": "^7.3.2", + "semver": "^7.5.3", "supports-color": "^8.1.1", "tmp": "~0.2.1", "untildify": "^4.0.0", @@ -8663,15 +10750,9 @@ "cypress": "bin/cypress" }, "engines": { - "node": "^14.0.0 || ^16.0.0 || >=18.0.0" + "node": "^16.0.0 || ^18.0.0 || >=20.0.0" } }, - "node_modules/cypress/node_modules/@types/node": { - "version": "14.18.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.10.tgz", - "integrity": "sha512-6iihJ/Pp5fsFJ/aEDGyvT4pHGmCpq7ToQ/yf4bl5SbVAvwpspYJ+v3jO7n8UyjhQVHTy+KNszOozDdv+O6sovQ==", - "dev": true - }, "node_modules/cypress/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -8742,6 +10823,21 @@ "node": ">=8" } }, + "node_modules/cypress/node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/cypress/node_modules/supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", @@ -8798,6 +10894,7 @@ "version": "7.8.0", "resolved": "https://registry.npmjs.org/d3/-/d3-7.8.0.tgz", "integrity": "sha512-a5rNemRadWkEfqnY5NsD4RdCP9vn8EIJ4I5Rl14U0uKH1SXqcNmk/h9aGaAF1O98lz6L9M0IeUcuPa9GUYbI5A==", + "optional": true, "dependencies": { "d3-array": "3", "d3-axis": "3", @@ -8838,6 +10935,7 @@ "version": "3.2.1", "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.1.tgz", "integrity": "sha512-gUY/qeHq/yNqqoCKNq4vtpFLdoCdvyNpWoC/KNjhGbhDuQpAM9sIQQKkXSNpXa9h5KySs/gzm7R88WkUutgwWQ==", + "optional": true, "dependencies": { "internmap": "1 - 2" }, @@ -8849,6 +10947,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz", "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==", + "optional": true, "engines": { "node": ">=12" } @@ -8857,6 +10956,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz", "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==", + "optional": true, "dependencies": { "d3-dispatch": "1 - 3", "d3-drag": "2 - 3", @@ -8872,6 +10972,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz", "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==", + "optional": true, "dependencies": { "d3-path": "1 - 3" }, @@ -8883,6 +10984,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "optional": true, "engines": { "node": ">=12" } @@ -8891,6 +10993,7 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-4.0.1.tgz", "integrity": "sha512-CMSllVHhBsqw3xrOCMXn5PCRZbLIMmsVj922YdqTiVMxi5jLHwg5y3mnZAC1Cm4xKgmx3sLjaSkuBKfZwx8LEQ==", + "optional": true, "dependencies": { "d3-array": "^3.2.0" }, @@ -8902,6 +11005,7 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.2.tgz", "integrity": "sha512-IMLNldruDQScrcfT+MWnazhHbDJhcRJyOEBAJfwQnHle1RPh6WDuLvxNArUju2VSMSUuKlY5BGHRJ2cYyoFLQQ==", + "optional": true, "dependencies": { "delaunator": "5" }, @@ -8913,6 +11017,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", + "optional": true, "engines": { "node": ">=12" } @@ -8921,6 +11026,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", + "optional": true, "dependencies": { "d3-dispatch": "1 - 3", "d3-selection": "3" @@ -8933,6 +11039,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz", "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", + "optional": true, "dependencies": { "commander": "7", "iconv-lite": "0.6", @@ -8957,6 +11064,7 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "optional": true, "engines": { "node": ">= 10" } @@ -8965,6 +11073,7 @@ "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "optional": true, "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" }, @@ -8976,6 +11085,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + "optional": true, "engines": { "node": ">=12" } @@ -8984,6 +11094,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz", "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==", + "optional": true, "dependencies": { "d3-dsv": "1 - 3" }, @@ -8995,6 +11106,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", + "optional": true, "dependencies": { "d3-dispatch": "1 - 3", "d3-quadtree": "1 - 3", @@ -9008,6 +11120,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==", + "optional": true, "engines": { "node": ">=12" } @@ -9016,6 +11129,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.0.tgz", "integrity": "sha512-JEo5HxXDdDYXCaWdwLRt79y7giK8SbhZJbFWXqbRTolCHFI5jRqteLzCsq51NKbUoX0PjBVSohxrx+NoOUujYA==", + "optional": true, "dependencies": { "d3-array": "2.5.0 - 3" }, @@ -9027,6 +11141,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==", + "optional": true, "engines": { "node": ">=12" } @@ -9035,6 +11150,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "optional": true, "dependencies": { "d3-color": "1 - 3" }, @@ -9046,6 +11162,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", + "optional": true, "engines": { "node": ">=12" } @@ -9054,6 +11171,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz", "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==", + "optional": true, "engines": { "node": ">=12" } @@ -9062,6 +11180,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==", + "optional": true, "engines": { "node": ">=12" } @@ -9070,6 +11189,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz", "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==", + "optional": true, "engines": { "node": ">=12" } @@ -9078,6 +11198,7 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", + "optional": true, "dependencies": { "d3-array": "2.10.0 - 3", "d3-format": "1 - 3", @@ -9093,6 +11214,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.0.0.tgz", "integrity": "sha512-Lx9thtxAKrO2Pq6OO2Ua474opeziKr279P/TKZsMAhYyNDD3EnCffdbgeSYN5O7m2ByQsxtuP2CSDczNUIZ22g==", + "optional": true, "dependencies": { "d3-color": "1 - 3", "d3-interpolate": "1 - 3" @@ -9105,6 +11227,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", + "optional": true, "engines": { "node": ">=12" } @@ -9113,6 +11236,7 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", + "optional": true, "dependencies": { "d3-path": "^3.1.0" }, @@ -9124,6 +11248,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", + "optional": true, "dependencies": { "d3-array": "2 - 3" }, @@ -9135,6 +11260,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", + "optional": true, "dependencies": { "d3-time": "1 - 3" }, @@ -9146,6 +11272,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "optional": true, "engines": { "node": ">=12" } @@ -9154,6 +11281,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", + "optional": true, "dependencies": { "d3-color": "1 - 3", "d3-dispatch": "1 - 3", @@ -9172,6 +11300,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", + "optional": true, "dependencies": { "d3-dispatch": "1 - 3", "d3-drag": "2 - 3", @@ -9196,6 +11325,7 @@ "version": "7.0.6", "resolved": "https://registry.npmjs.org/dagre-d3-es/-/dagre-d3-es-7.0.6.tgz", "integrity": "sha512-CaaE/nZh205ix+Up4xsnlGmpog5GGm81Upi2+/SBHxwNwrccBb3K51LzjZ1U6hgvOlAEUsVWf1xSTzCyKpJ6+Q==", + "optional": true, "dependencies": { "d3": "^7.7.0", "lodash-es": "^4.17.21" @@ -9204,7 +11334,7 @@ "node_modules/dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", "dev": true, "dependencies": { "assert-plus": "^1.0.0" @@ -9213,6 +11343,55 @@ "node": ">=0.10" } }, + "node_modules/data-urls": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", + "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", + "dev": true, + "dependencies": { + "abab": "^2.0.3", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/data-urls/node_modules/tr46": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", + "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", + "dev": true, + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/data-urls/node_modules/webidl-conversions": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", + "dev": true, + "engines": { + "node": ">=10.4" + } + }, + "node_modules/data-urls/node_modules/whatwg-url": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", + "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", + "dev": true, + "dependencies": { + "lodash": "^4.7.0", + "tr46": "^2.1.0", + "webidl-conversions": "^6.1.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/date-format": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.3.tgz", @@ -9254,6 +11433,12 @@ "node": "*" } }, + "node_modules/decimal.js": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", + "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", + "dev": true + }, "node_modules/decode-uri-component": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", @@ -9334,6 +11519,23 @@ "clone": "^1.0.2" } }, + "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", @@ -9360,6 +11562,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.0.tgz", "integrity": "sha512-AyLvtyJdbv/U1GkiS6gUUzclRoAY4Gs75qkMygJJhU75LW4DNuSF2RMzpxs9jw9Oz1BobHjTdkG3zdP55VxAqw==", + "optional": true, "dependencies": { "robust-predicates": "^3.0.0" } @@ -9367,7 +11570,7 @@ "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", "dev": true, "engines": { "node": ">=0.4.0" @@ -9376,7 +11579,8 @@ "node_modules/delegate": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/delegate/-/delegate-3.2.0.tgz", - "integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==" + "integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==", + "optional": true }, "node_modules/delegates": { "version": "1.0.0", @@ -9385,21 +11589,21 @@ "dev": true }, "node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "dev": true, "engines": { - "node": ">= 0.6" + "node": ">= 0.8" } }, - "node_modules/dependency-graph": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.11.0.tgz", - "integrity": "sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg==", + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", "dev": true, "engines": { - "node": ">= 0.6.0" + "node": ">=6" } }, "node_modules/des.js": { @@ -9488,16 +11692,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" @@ -9531,14 +11729,14 @@ } }, "node_modules/dom-serializer": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", - "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", "dev": true, "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" }, "funding": { "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" @@ -9566,13 +11764,35 @@ } ] }, + "node_modules/domexception": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", + "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", + "deprecated": "Use your platform's native DOMException instead", + "dev": true, + "dependencies": { + "webidl-conversions": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/domexception/node_modules/webidl-conversions": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", + "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/domhandler": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.0.tgz", - "integrity": "sha512-fC0aXNQXqKSFTr2wDNZDhsEYjCiYsDWl3D01kwt25hm1YIPyDGHvvi3rw+PLqHAl/m71MaiF7d5zvBr0p5UB2g==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", "dev": true, "dependencies": { - "domelementtype": "^2.2.0" + "domelementtype": "^2.3.0" }, "engines": { "node": ">= 4" @@ -9582,24 +11802,39 @@ } }, "node_modules/dompurify": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.4.1.tgz", - "integrity": "sha512-ewwFzHzrrneRjxzmK6oVz/rZn9VWspGFRDb4/rRtIsM1n36t9AKma/ye8syCpcw+XJ25kOK/hOG7t1j2I2yBqA==" + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.5.4.tgz", + "integrity": "sha512-l5NNozANzaLPPe0XaAwvg3uZcHtDBnziX/HjsY1UcDj1MxTK8Dd0Kv096jyPK5HRzs/XM5IMj20dW8Fk+HnbUA==" }, "node_modules/domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", "dev": true, "dependencies": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" }, "funding": { "url": "https://github.com/fb55/domutils?sponsor=1" } }, + "node_modules/dotenv": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", + "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", + "dev": true + }, "node_modules/duplexify": { "version": "3.7.1", "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", @@ -9633,10 +11868,16 @@ "safe-buffer": "~5.1.0" } }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, "node_modules/ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", "dev": true, "dependencies": { "jsbn": "~0.1.0", @@ -9649,16 +11890,31 @@ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", "dev": true }, + "node_modules/ejs": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", + "dev": true, + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/electron-to-chromium": { - "version": "1.4.284", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", - "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==", + "version": "1.4.816", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.816.tgz", + "integrity": "sha512-EKH5X5oqC6hLmiS7/vYtZHZFTNdhsYG5NVPRN6Yn0kQHNBlT59+xSM8HBy66P5fxWpKgZbPqb+diC64ng295Jw==", "dev": true }, "node_modules/elliptic": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", - "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "version": "6.5.7", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.7.tgz", + "integrity": "sha512-ESVCtTwiA+XhY3wyh24QqRGBoP3rEdDUl3EDUUo9tft074fi19IrdpH7hLCMMP3CIj7jb3W96rn8lt/BqIlt5Q==", "dev": true, "dependencies": { "bn.js": "^4.11.9", @@ -9683,9 +11939,10 @@ "dev": true }, "node_modules/emoji-toolkit": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/emoji-toolkit/-/emoji-toolkit-6.6.0.tgz", - "integrity": "sha512-pEu0kow2p1N8zCKnn/L6H0F3rWUBB3P3hVjr/O5yl1fK7N9jU4vO4G7EFapC5Y3XwZLUCY0FZbOPyTkH+4V2eQ==" + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/emoji-toolkit/-/emoji-toolkit-7.0.1.tgz", + "integrity": "sha512-l5aJyAhpC5s4mDuoVuqt4SzVjwIsIvakPh4ZGJJE4KWuWFCEHaXacQFkStVdD9zbRR+/BbRXob7u99o0lQFr8A==", + "optional": true }, "node_modules/emojis-list": { "version": "3.0.0", @@ -9733,9 +11990,9 @@ } }, "node_modules/engine.io": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.4.2.tgz", - "integrity": "sha512-FKn/3oMiJjrOEOeUub2WCox6JhxBXq/Zn3fZOMCBxKnNYtsdKjxhl7yR3fZhM9PV+rdE75SU5SYMc+2PGzo+Tg==", + "version": "6.5.5", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.5.5.tgz", + "integrity": "sha512-C5Pn8Wk+1vKBoHghJODM63yk8MvrO9EWZUfkAt5HAqIgPE4/8FF0PEGHXtEd40l223+cE5ABWuPzm38PHFXfMA==", "dev": true, "dependencies": { "@types/cookie": "^0.4.1", @@ -9746,26 +12003,47 @@ "cookie": "~0.4.1", "cors": "~2.8.5", "debug": "~4.3.1", - "engine.io-parser": "~5.0.3", - "ws": "~8.11.0" + "engine.io-parser": "~5.2.1", + "ws": "~8.17.1" }, "engines": { - "node": ">=10.0.0" + "node": ">=10.2.0" } }, "node_modules/engine.io-parser": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.6.tgz", - "integrity": "sha512-tjuoZDMAdEhVnSFleYPCtdL2GXwVTGtNjoeJd9IhIG3C1xs9uwxqRNEu5WpnDZCaozwVlK/nuQhpodhXSIMaxw==", + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz", + "integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==", + "dev": true, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/engine.io/node_modules/ws": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", + "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", "dev": true, "engines": { "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } } }, "node_modules/enhanced-resolve": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz", - "integrity": "sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ==", + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", + "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", "dev": true, "dependencies": { "graceful-fs": "^4.2.4", @@ -9794,10 +12072,13 @@ "dev": true }, "node_modules/entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "dev": true, + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "devOptional": true, + "engines": { + "node": ">=0.12" + }, "funding": { "url": "https://github.com/fb55/entities?sponsor=1" } @@ -9850,10 +12131,31 @@ "is-arrayish": "^0.2.1" } }, + "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.4", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", + "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==", "dev": true }, "node_modules/es6-promise": { @@ -9870,12 +12172,11 @@ } }, "node_modules/esbuild": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.5.tgz", - "integrity": "sha512-VSf6S1QVqvxfIsSKb3UKr3VhUCis7wgDbtF4Vd9z84UJr05/Sp2fRKmzC+CSPG/dNAPPJZ0BTBLTT1Fhd6N9Gg==", + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.17.tgz", + "integrity": "sha512-1GJtYnUxsJreHYA0Y+iQz2UEykonY66HNWOb0yXYZi9/kNrORUEHVg87eQsCtqh59PEJ5YVZJO98JHznMJSWjg==", "dev": true, "hasInstallScript": true, - "optional": true, "bin": { "esbuild": "bin/esbuild" }, @@ -9883,305 +12184,34 @@ "node": ">=12" }, "optionalDependencies": { - "@esbuild/linux-loong64": "0.15.5", - "esbuild-android-64": "0.15.5", - "esbuild-android-arm64": "0.15.5", - "esbuild-darwin-64": "0.15.5", - "esbuild-darwin-arm64": "0.15.5", - "esbuild-freebsd-64": "0.15.5", - "esbuild-freebsd-arm64": "0.15.5", - "esbuild-linux-32": "0.15.5", - "esbuild-linux-64": "0.15.5", - "esbuild-linux-arm": "0.15.5", - "esbuild-linux-arm64": "0.15.5", - "esbuild-linux-mips64le": "0.15.5", - "esbuild-linux-ppc64le": "0.15.5", - "esbuild-linux-riscv64": "0.15.5", - "esbuild-linux-s390x": "0.15.5", - "esbuild-netbsd-64": "0.15.5", - "esbuild-openbsd-64": "0.15.5", - "esbuild-sunos-64": "0.15.5", - "esbuild-windows-32": "0.15.5", - "esbuild-windows-64": "0.15.5", - "esbuild-windows-arm64": "0.15.5" - } - }, - "node_modules/esbuild-android-64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.5.tgz", - "integrity": "sha512-dYPPkiGNskvZqmIK29OPxolyY3tp+c47+Fsc2WYSOVjEPWNCHNyqhtFqQadcXMJDQt8eN0NMDukbyQgFcHquXg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-android-arm64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.5.tgz", - "integrity": "sha512-YyEkaQl08ze3cBzI/4Cm1S+rVh8HMOpCdq8B78JLbNFHhzi4NixVN93xDrHZLztlocEYqi45rHHCgA8kZFidFg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-darwin-64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.5.tgz", - "integrity": "sha512-Cr0iIqnWKx3ZTvDUAzG0H/u9dWjLE4c2gTtRLz4pqOBGjfjqdcZSfAObFzKTInLLSmD0ZV1I/mshhPoYSBMMCQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-darwin-arm64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.5.tgz", - "integrity": "sha512-WIfQkocGtFrz7vCu44ypY5YmiFXpsxvz2xqwe688jFfSVCnUsCn2qkEVDo7gT8EpsLOz1J/OmqjExePL1dr1Kg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-freebsd-64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.5.tgz", - "integrity": "sha512-M5/EfzV2RsMd/wqwR18CELcenZ8+fFxQAAEO7TJKDmP3knhWSbD72ILzrXFMMwshlPAS1ShCZ90jsxkm+8FlaA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-freebsd-arm64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.5.tgz", - "integrity": "sha512-2JQQ5Qs9J0440F/n/aUBNvY6lTo4XP/4lt1TwDfHuo0DY3w5++anw+jTjfouLzbJmFFiwmX7SmUhMnysocx96w==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-32": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.5.tgz", - "integrity": "sha512-gO9vNnIN0FTUGjvTFucIXtBSr1Woymmx/aHQtuU+2OllGU6YFLs99960UD4Dib1kFovVgs59MTXwpFdVoSMZoQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.5.tgz", - "integrity": "sha512-ne0GFdNLsm4veXbTnYAWjbx3shpNKZJUd6XpNbKNUZaNllDZfYQt0/zRqOg0sc7O8GQ+PjSMv9IpIEULXVTVmg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-arm": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.5.tgz", - "integrity": "sha512-wvAoHEN+gJ/22gnvhZnS/+2H14HyAxM07m59RSLn3iXrQsdS518jnEWRBnJz3fR6BJa+VUTo0NxYjGaNt7RA7Q==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-arm64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.5.tgz", - "integrity": "sha512-7EgFyP2zjO065XTfdCxiXVEk+f83RQ1JsryN1X/VSX2li9rnHAt2swRbpoz5Vlrl6qjHrCmq5b6yxD13z6RheA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-mips64le": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.5.tgz", - "integrity": "sha512-KdnSkHxWrJ6Y40ABu+ipTZeRhFtc8dowGyFsZY5prsmMSr1ZTG9zQawguN4/tunJ0wy3+kD54GaGwdcpwWAvZQ==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-ppc64le": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.5.tgz", - "integrity": "sha512-QdRHGeZ2ykl5P0KRmfGBZIHmqcwIsUKWmmpZTOq573jRWwmpfRmS7xOhmDHBj9pxv+6qRMH8tLr2fe+ZKQvCYw==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-riscv64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.5.tgz", - "integrity": "sha512-p+WE6RX+jNILsf+exR29DwgV6B73khEQV0qWUbzxaycxawZ8NE0wA6HnnTxbiw5f4Gx9sJDUBemh9v49lKOORA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-s390x": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.5.tgz", - "integrity": "sha512-J2ngOB4cNzmqLHh6TYMM/ips8aoZIuzxJnDdWutBw5482jGXiOzsPoEF4j2WJ2mGnm7FBCO4StGcwzOgic70JQ==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-netbsd-64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.5.tgz", - "integrity": "sha512-MmKUYGDizYjFia0Rwt8oOgmiFH7zaYlsoQ3tIOfPxOqLssAsEgG0MUdRDm5lliqjiuoog8LyDu9srQk5YwWF3w==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-openbsd-64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.5.tgz", - "integrity": "sha512-2mMFfkLk3oPWfopA9Plj4hyhqHNuGyp5KQyTT9Rc8hFd8wAn5ZrbJg+gNcLMo2yzf8Uiu0RT6G9B15YN9WQyMA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-sunos-64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.5.tgz", - "integrity": "sha512-2sIzhMUfLNoD+rdmV6AacilCHSxZIoGAU2oT7XmJ0lXcZWnCvCtObvO6D4puxX9YRE97GodciRGDLBaiC6x1SA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" + "@esbuild/android-arm": "0.18.17", + "@esbuild/android-arm64": "0.18.17", + "@esbuild/android-x64": "0.18.17", + "@esbuild/darwin-arm64": "0.18.17", + "@esbuild/darwin-x64": "0.18.17", + "@esbuild/freebsd-arm64": "0.18.17", + "@esbuild/freebsd-x64": "0.18.17", + "@esbuild/linux-arm": "0.18.17", + "@esbuild/linux-arm64": "0.18.17", + "@esbuild/linux-ia32": "0.18.17", + "@esbuild/linux-loong64": "0.18.17", + "@esbuild/linux-mips64el": "0.18.17", + "@esbuild/linux-ppc64": "0.18.17", + "@esbuild/linux-riscv64": "0.18.17", + "@esbuild/linux-s390x": "0.18.17", + "@esbuild/linux-x64": "0.18.17", + "@esbuild/netbsd-x64": "0.18.17", + "@esbuild/openbsd-x64": "0.18.17", + "@esbuild/sunos-x64": "0.18.17", + "@esbuild/win32-arm64": "0.18.17", + "@esbuild/win32-ia32": "0.18.17", + "@esbuild/win32-x64": "0.18.17" } }, "node_modules/esbuild-wasm": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.15.5.tgz", - "integrity": "sha512-lTJOEKekN/4JI/eOEq0wLcx53co2N6vaT/XjBz46D1tvIVoUEyM0o2K6txW6gEotf31szFD/J1PbxmnbkGlK9A==", + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.18.17.tgz", + "integrity": "sha512-9OHGcuRzy+I8ziF9FzjfKLWAPbvi0e/metACVg9k6bK+SI4FFxeV6PcZsz8RIVaMD4YNehw+qj6UMR3+qj/EuQ==", "dev": true, "bin": { "esbuild": "bin/esbuild" @@ -10190,58 +12220,10 @@ "node": ">=12" } }, - "node_modules/esbuild-windows-32": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.5.tgz", - "integrity": "sha512-e+duNED9UBop7Vnlap6XKedA/53lIi12xv2ebeNS4gFmu7aKyTrok7DPIZyU5w/ftHD4MUDs5PJUkQPP9xJRzg==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-windows-64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.5.tgz", - "integrity": "sha512-v+PjvNtSASHOjPDMIai9Yi+aP+Vwox+3WVdg2JB8N9aivJ7lyhp4NVU+J0MV2OkWFPnVO8AE/7xH+72ibUUEnw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-windows-arm64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.5.tgz", - "integrity": "sha512-Yz8w/D8CUPYstvVQujByu6mlf48lKmXkq6bkeSZZxTA626efQOJb26aDGLzmFWx6eg/FwrXgt6SZs9V8Pwy/aA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, "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" @@ -10262,6 +12244,46 @@ "node": ">=0.8.0" } }, + "node_modules/escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "dev": true, + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/escodegen/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/escodegen/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, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/eslint": { "version": "8.8.0", "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.8.0.tgz", @@ -10829,38 +12851,44 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, + "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.21.0", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.0.tgz", + "integrity": "sha512-VqcNGcj/Id5ZT1LZ/cfihi3ttTn+NJmkli2eZADigjq29qTlWi/hAQ43t/VLPq8+UX06FCEx3ByOYet6ZFblng==", "dev": true, "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.20.1", + "body-parser": "1.20.3", "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", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "1.2.0", + "finalhandler": "1.3.1", "fresh": "0.5.2", "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", + "merge-descriptors": "1.0.3", "methods": "~1.1.2", "on-finished": "2.4.1", "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", + "path-to-regexp": "0.1.10", "proxy-addr": "~2.0.7", - "qs": "6.11.0", + "qs": "6.13.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", + "send": "0.19.0", + "serve-static": "1.16.2", "setprototypeof": "1.2.0", "statuses": "2.0.1", "type-is": "~1.6.18", @@ -10871,16 +12899,10 @@ "node": ">= 0.10.0" } }, - "node_modules/express/node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", - "dev": true - }, "node_modules/express/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" @@ -10895,23 +12917,23 @@ "ms": "2.0.0" } }, - "node_modules/express/node_modules/depd": { + "node_modules/express/node_modules/encodeurl": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", "dev": true, "engines": { "node": ">= 0.8" } }, "node_modules/express/node_modules/finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", "dev": true, "dependencies": { "debug": "2.6.9", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "on-finished": "2.4.1", "parseurl": "~1.3.3", @@ -10941,12 +12963,12 @@ } }, "node_modules/express/node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", "dev": true, "dependencies": { - "side-channel": "^1.0.4" + "side-channel": "^1.0.6" }, "engines": { "node": ">=0.6" @@ -10994,7 +13016,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", - "dev": true, "dependencies": { "assign-symbols": "^1.0.0", "is-extendable": "^1.0.1" @@ -11104,7 +13125,7 @@ "node_modules/extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", "dev": true, "engines": [ "node >=0.6.0" @@ -11116,9 +13137,9 @@ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, "node_modules/fast-glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", - "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", @@ -11143,6 +13164,12 @@ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", "dev": true }, + "node_modules/fast-uri": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.1.tgz", + "integrity": "sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw==", + "dev": true + }, "node_modules/fastq": { "version": "1.13.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", @@ -11226,6 +13253,36 @@ "node": ">=8" } }, + "node_modules/filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "dev": true, + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -11301,6 +13358,15 @@ "node": ">=8" } }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "bin": { + "flat": "cli.js" + } + }, "node_modules/flat-cache": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", @@ -11352,9 +13418,9 @@ } }, "node_modules/follow-redirects": { - "version": "1.14.8", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.8.tgz", - "integrity": "sha512-1x0S9UVJHsQprFcEC/qnNzBLcIxsjAV905f/UkQxbclCsoTWlacCNOpQa/anodLl2uaEKFhfWOvM2Qg77+15zA==", + "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": [ { @@ -11380,10 +13446,38 @@ "node": ">=0.10.0" } }, + "node_modules/foreground-child": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.2.1.tgz", + "integrity": "sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/foreground-child/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", "dev": true, "engines": { "node": "*" @@ -11413,16 +13507,16 @@ } }, "node_modules/fraction.js": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", - "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", "dev": true, "engines": { "node": "*" }, "funding": { "type": "patreon", - "url": "https://www.patreon.com/infusion" + "url": "https://github.com/sponsors/rawify" } }, "node_modules/fragment-cache": { @@ -11499,21 +13593,30 @@ } }, "node_modules/fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", + "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==", "dev": true, "dependencies": { - "minipass": "^3.0.0" + "minipass": "^7.0.3" }, "engines": { - "node": ">= 8" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/fs-minipass/node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" } }, "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-write-stream-atomic": { @@ -11569,9 +13672,12 @@ } }, "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/functional-red-black-tree": { "version": "1.0.1", @@ -11583,6 +13689,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", @@ -11622,14 +13729,19 @@ } }, "node_modules/get-intrinsic": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", - "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", + "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" @@ -11686,7 +13798,7 @@ "node_modules/getpass": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", "dev": true, "dependencies": { "assert-plus": "^1.0.0" @@ -11786,14 +13898,27 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/good-listener/-/good-listener-1.2.2.tgz", "integrity": "sha512-goW1b+d9q/HIwbVYZzZ6SsTr4IgE+WA44A0GmPIQstuOrgsFcT7VEJ48nmr9GaRtNu0XTKacFLGnBPAM6Afouw==", + "optional": true, "dependencies": { "delegate": "^3.1.2" } }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/graceful-fs": { - "version": "4.2.9", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", - "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==" + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" }, "node_modules/graphlib": { "version": "2.1.8", @@ -11803,6 +13928,18 @@ "lodash": "^4.17.15" } }, + "node_modules/guess-parser": { + "version": "0.4.22", + "resolved": "https://registry.npmjs.org/guess-parser/-/guess-parser-0.4.22.tgz", + "integrity": "sha512-KcUWZ5ACGaBM69SbqwVIuWGoSAgD+9iJnchR9j/IarVI1jHVeXv+bUXBIMeqVMSKt3zrn0Dgf9UpcOEpPBLbSg==", + "dev": true, + "dependencies": { + "@wessberg/ts-evaluator": "0.0.27" + }, + "peerDependencies": { + "typescript": ">=3.7.5" + } + }, "node_modules/handle-thing": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", @@ -11829,6 +13966,30 @@ "node": ">=4" } }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "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" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/has-symbols": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", @@ -11954,6 +14115,18 @@ "minimalistic-assert": "^1.0.1" } }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/hdr-histogram-js": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/hdr-histogram-js/-/hdr-histogram-js-2.0.3.tgz", @@ -12035,21 +14208,21 @@ } }, "node_modules/hosted-git-info": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-5.2.1.tgz", - "integrity": "sha512-xIcQYMnhcx2Nr4JTjsFmwwnr9vldugPy9uVm0o87bjqqWMv9GaqsTeT+i99wTl0mk1uLxJtHxLb8kymqTENQsw==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.1.tgz", + "integrity": "sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==", "dev": true, "dependencies": { "lru-cache": "^7.5.1" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/hosted-git-info/node_modules/lru-cache": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.14.0.tgz", - "integrity": "sha512-EIRtP1GrSJny0dqb50QXRUNBxHJhcpxHC++M5tD7RYbvLLn5KVWKsbyswSSqDuU15UFi3bgTQIY8nhDMeF6aDQ==", + "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" @@ -12068,9 +14241,9 @@ } }, "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", @@ -12100,11 +14273,33 @@ "node": ">=6" } }, + "node_modules/html-encoding-sniffer": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", + "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", + "dev": true, + "dependencies": { + "whatwg-encoding": "^1.0.5" + }, + "engines": { + "node": ">=10" + } + }, "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 + "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-escaper": { "version": "2.0.2", @@ -12113,9 +14308,9 @@ "dev": true }, "node_modules/htmlparser2": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.1.tgz", - "integrity": "sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA==", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", + "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", "dev": true, "funding": [ "https://github.com/fb55/htmlparser2?sponsor=1", @@ -12126,70 +14321,15 @@ ], "dependencies": { "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", + "domhandler": "^5.0.3", "domutils": "^3.0.1", - "entities": "^4.3.0" - } - }, - "node_modules/htmlparser2/node_modules/dom-serializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", - "dev": true, - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/htmlparser2/node_modules/domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "dev": true, - "dependencies": { - "domelementtype": "^2.3.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/htmlparser2/node_modules/domutils": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz", - "integrity": "sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==", - "dev": true, - "dependencies": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.1" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/htmlparser2/node_modules/entities": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.3.1.tgz", - "integrity": "sha512-o4q/dYJlmyjP2zfnaWDUC6A3BQFmVTX+tZPezK7k0GLSU9QYCauscf5Y+qcEPzKL+EixVouYDgLQK5H9GrLpkg==", - "dev": true, - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" + "entities": "^4.4.0" } }, "node_modules/http-cache-semantics": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", "dev": true }, "node_modules/http-deceiver": { @@ -12214,15 +14354,6 @@ "node": ">= 0.8" } }, - "node_modules/http-errors/node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/http-errors/node_modules/statuses": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", @@ -12253,12 +14384,12 @@ } }, "node_modules/http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", "dev": true, "dependencies": { - "@tootallnate/once": "2", + "@tootallnate/once": "1", "agent-base": "6", "debug": "4" }, @@ -12405,24 +14536,24 @@ "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=" }, "node_modules/ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", "dev": true, "engines": { "node": ">= 4" } }, "node_modules/ignore-walk": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-5.0.1.tgz", - "integrity": "sha512-yemi4pMf51WKT7khInJqAvsIGzoqYXblnsz0ql8tM+yi1EKYTY1evX4NAbJrLL/Aanr2HyZeluqU+Oi7MGHokw==", + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-6.0.5.tgz", + "integrity": "sha512-VuuG0wCnjhnylG1ABXT3dAuIpTNDs/G8jlpmwXY03fXoXy/8ZK8/T+hMzt8L4WnrLCJgdybqgPagnF/f97cg3A==", "dev": true, "dependencies": { - "minimatch": "^5.0.1" + "minimatch": "^9.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/ignore-walk/node_modules/brace-expansion": { @@ -12435,15 +14566,18 @@ } }, "node_modules/ignore-walk/node_modules/minimatch": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", - "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, "dependencies": { "brace-expansion": "^2.0.1" }, "engines": { - "node": ">=10" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/image-size": { @@ -12460,9 +14594,9 @@ } }, "node_modules/immutable": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.1.0.tgz", - "integrity": "sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ==", + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.6.tgz", + "integrity": "sha512-Ju0+lEMyzMVZarkTn/gqRpdqd5dOPaz1mCZ0SH3JV6iFw81PldE/PEB1hWVEA288HPt4WXW8O7AWxB10M+03QQ==", "dev": true }, "node_modules/import-fresh": { @@ -12643,6 +14777,7 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", + "optional": true, "engines": { "node": ">=12" } @@ -12652,10 +14787,35 @@ "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" }, + "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/ip-address/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/ip-address/node_modules/sprintf-js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", + "dev": true + }, "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" @@ -12774,7 +14934,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, "dependencies": { "is-plain-object": "^2.0.4" }, @@ -12886,7 +15045,6 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, "dependencies": { "isobject": "^3.0.1" }, @@ -12894,6 +15052,12 @@ "node": ">=0.10.0" } }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "dev": true + }, "node_modules/is-regexp": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", @@ -12918,7 +15082,7 @@ "node_modules/is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", "dev": true }, "node_modules/is-unicode-supported": { @@ -12986,7 +15150,6 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -12994,7 +15157,7 @@ "node_modules/isstream": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", "dev": true }, "node_modules/istanbul-lib-coverage": { @@ -13079,6 +15242,112 @@ "node": ">=8" } }, + "node_modules/jackspeak": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.0.tgz", + "integrity": "sha512-JVYhQnN59LVPFCEcVa2C3CrEKYacvjRfqIQl+h8oi91aLYQVWRYbxjPcv1bUiUy/kLmQaANrYfNMCO3kuEDHfw==", + "dev": true, + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jake": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.1.tgz", + "integrity": "sha512-61btcOHNnLnsOdtLgA5efqQWjnSi/vow5HbI7HMdKKWqvrKR1bLK3BPlJn9gcSaP2ewuamUSMB5XEy76KUIS2w==", + "dev": true, + "dependencies": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.4", + "minimatch": "^3.1.2" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jake/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jake/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jake/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jake/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jake/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jake/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/jasmine-core": { "version": "3.99.0", "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-3.99.0.tgz", @@ -13123,6 +15392,15 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, + "node_modules/jiti": { + "version": "1.21.6", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.6.tgz", + "integrity": "sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==", + "dev": true, + "bin": { + "jiti": "bin/jiti.js" + } + }, "node_modules/jquery": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.0.tgz", @@ -13150,9 +15428,131 @@ "node_modules/jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", + "dev": true + }, + "node_modules/jsdom": { + "version": "16.7.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", + "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", + "dev": true, + "dependencies": { + "abab": "^2.0.5", + "acorn": "^8.2.4", + "acorn-globals": "^6.0.0", + "cssom": "^0.4.4", + "cssstyle": "^2.3.0", + "data-urls": "^2.0.0", + "decimal.js": "^10.2.1", + "domexception": "^2.0.1", + "escodegen": "^2.0.0", + "form-data": "^3.0.0", + "html-encoding-sniffer": "^2.0.1", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.0", + "parse5": "6.0.1", + "saxes": "^5.0.1", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.0.0", + "w3c-hr-time": "^1.0.2", + "w3c-xmlserializer": "^2.0.0", + "webidl-conversions": "^6.1.0", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.5.0", + "ws": "^7.4.6", + "xml-name-validator": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jsdom/node_modules/form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/jsdom/node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", "dev": true }, + "node_modules/jsdom/node_modules/tr46": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", + "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", + "dev": true, + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jsdom/node_modules/webidl-conversions": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", + "dev": true, + "engines": { + "node": ">=10.4" + } + }, + "node_modules/jsdom/node_modules/whatwg-url": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", + "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", + "dev": true, + "dependencies": { + "lodash": "^4.7.0", + "tr46": "^2.1.0", + "webidl-conversions": "^6.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jsdom/node_modules/ws": { + "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" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", @@ -13196,7 +15596,7 @@ "node_modules/json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", "dev": true }, "node_modules/json5": { @@ -13212,9 +15612,9 @@ } }, "node_modules/jsonc-parser": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.1.0.tgz", - "integrity": "sha512-DRf0QjnNeCUds3xTjKlQQ3DpJD51GvDjJfnxUVWg6PZTo2otSm+slzNAxU/35hF8/oJIKoG9slq30JYOsF2azg==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", "dev": true }, "node_modules/jsonfile": { @@ -13474,15 +15874,16 @@ } }, "node_modules/katex": { - "version": "0.16.4", - "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.4.tgz", - "integrity": "sha512-WudRKUj8yyBeVDI4aYMNxhx5Vhh2PjpzQw1GRu/LVGqL4m1AxwD1GcUp0IMbdJaf5zsjtj8ghP0DOQRYhroNkw==", + "version": "0.16.10", + "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.10.tgz", + "integrity": "sha512-ZiqaC04tp2O5utMsl2TEZTXxa6WSC4yo0fv5ML++D3QZv/vx2Mct0mTlRx3O+uUkjfuAgOkzsCmq5MiUEsDDdA==", "funding": [ "https://opencollective.com/katex", "https://github.com/sponsors/katex" ], + "optional": true, "dependencies": { - "commander": "^8.0.0" + "commander": "^8.3.0" }, "bin": { "katex": "cli.js" @@ -13492,6 +15893,7 @@ "version": "8.3.0", "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "optional": true, "engines": { "node": ">= 12" } @@ -13499,7 +15901,8 @@ "node_modules/khroma": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/khroma/-/khroma-2.0.0.tgz", - "integrity": "sha512-2J8rDNlQWbtiNYThZRvmMv5yt44ZakX+Tz5ZIp/mN1pt4snn+m030Va5Z4v8xA0cQFDXBwO/8i42xL4QPsVk3g==" + "integrity": "sha512-2J8rDNlQWbtiNYThZRvmMv5yt44ZakX+Tz5ZIp/mN1pt4snn+m030Va5Z4v8xA0cQFDXBwO/8i42xL4QPsVk3g==", + "optional": true }, "node_modules/kind-of": { "version": "6.0.3", @@ -13520,14 +15923,24 @@ } }, "node_modules/klona": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.5.tgz", - "integrity": "sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", + "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", "dev": true, "engines": { "node": ">= 8" } }, + "node_modules/launch-editor": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.9.1.tgz", + "integrity": "sha512-Gcnl4Bd+hRO9P9icCP/RVVT2o8SFlPXofuCxvA2SaZuH45whSvf5p8x5oih5ftLiVhEI4sp5xDY+R+b3zJBh5w==", + "dev": true, + "dependencies": { + "picocolors": "^1.0.0", + "shell-quote": "^1.8.1" + } + }, "node_modules/lazy-ass": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/lazy-ass/-/lazy-ass-1.6.0.tgz", @@ -13564,9 +15977,9 @@ } }, "node_modules/less-loader": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-11.0.0.tgz", - "integrity": "sha512-9+LOWWjuoectIEx3zrfN83NAGxSUB5pWEabbbidVQVgZhN+wN68pOvuyirVlH1IK4VT1f3TmlyvAnCXh8O5KEw==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-11.1.0.tgz", + "integrity": "sha512-C+uDBV7kS7W5fJlUjq5mPBeBVhYpTIm5gB09APT9o3n/ILeaXVsiSFTbZpTJCJwQ/Crczfn3DmfQFwxYusWFug==", "dev": true, "dependencies": { "klona": "^2.0.4" @@ -13884,9 +16297,9 @@ } }, "node_modules/loader-utils": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.0.tgz", - "integrity": "sha512-HVl9ZqccQihZ7JM85dco1MvO9G+ONvxoGa9rkhzFsneGLKSUg1gJf9bWzhRhcvm2qChhWpebQhP44qxjKIUCaQ==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.1.tgz", + "integrity": "sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==", "dev": true, "engines": { "node": ">= 12.13.0" @@ -13912,7 +16325,8 @@ "node_modules/lodash-es": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", - "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", + "optional": true }, "node_modules/lodash.debounce": { "version": "4.0.8", @@ -14143,12 +16557,12 @@ } }, "node_modules/magic-string": { - "version": "0.26.2", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.26.2.tgz", - "integrity": "sha512-NzzlXpclt5zAbmo6h6jNc8zl2gNRGHvmsZW4IvZhTC4W7k4OlLP+S5YLussa/r3ixNT66KOQfNORlXHSOy/X4A==", + "version": "0.30.1", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.1.tgz", + "integrity": "sha512-mbVKXPmS0z0G4XqFDCTllmDQ6coZzn94aMlb0o/A4HEHJCKcanlDZwYJgwnkmgD3jyWhUgj9VsPrfd972yPffA==", "dev": true, "dependencies": { - "sourcemap-codec": "^1.4.8" + "@jridgewell/sourcemap-codec": "^1.4.15" }, "engines": { "node": ">=12" @@ -14211,15 +16625,181 @@ "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, + "node_modules/make-fetch-happen/node_modules/@npmcli/fs": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.2.tgz", + "integrity": "sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==", + "dev": true, + "dependencies": { + "@gar/promisify": "^1.1.3", + "semver": "^7.3.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/make-fetch-happen/node_modules/@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/make-fetch-happen/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/make-fetch-happen/node_modules/cacache": { + "version": "16.1.3", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.1.3.tgz", + "integrity": "sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==", + "dev": true, + "dependencies": { + "@npmcli/fs": "^2.1.0", + "@npmcli/move-file": "^2.0.0", + "chownr": "^2.0.0", + "fs-minipass": "^2.1.0", + "glob": "^8.0.1", + "infer-owner": "^1.0.4", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "mkdirp": "^1.0.4", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^9.0.0", + "tar": "^6.1.11", + "unique-filename": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/make-fetch-happen/node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/make-fetch-happen/node_modules/glob": { + "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", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/make-fetch-happen/node_modules/http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/make-fetch-happen/node_modules/lru-cache": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.14.0.tgz", - "integrity": "sha512-EIRtP1GrSJny0dqb50QXRUNBxHJhcpxHC++M5tD7RYbvLLn5KVWKsbyswSSqDuU15UFi3bgTQIY8nhDMeF6aDQ==", + "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/make-fetch-happen/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-fetch-happen/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/make-fetch-happen/node_modules/ssri": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz", + "integrity": "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==", + "dev": true, + "dependencies": { + "minipass": "^3.1.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/make-fetch-happen/node_modules/unique-filename": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-2.0.1.tgz", + "integrity": "sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==", + "dev": true, + "dependencies": { + "unique-slug": "^3.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/make-fetch-happen/node_modules/unique-slug": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-3.0.0.tgz", + "integrity": "sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, "node_modules/map-cache": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", @@ -14242,9 +16822,10 @@ } }, "node_modules/marked": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/marked/-/marked-4.2.3.tgz", - "integrity": "sha512-slWRdJkbTZ+PjkyJnE30Uid64eHwbwa1Q25INCAYfZlK4o6ylagBy/Le9eWntqJFoFT93ikUKMv47GZ4gTwHkw==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", + "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", + "peer": true, "bin": { "marked": "bin/marked.js" }, @@ -14283,12 +16864,12 @@ } }, "node_modules/memfs": { - "version": "3.4.7", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.7.tgz", - "integrity": "sha512-ygaiUSNalBX85388uskeCyhSAoOSgzBbtVCr9jA2RROssFL9Q19/ZXFqS+2Th2sr1ewNIWgFdLzLC3Yl1Zv+lw==", + "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" @@ -14329,10 +16910,13 @@ } }, "node_modules/merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", - "dev": true + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, "node_modules/merge-stream": { "version": "2.0.0", @@ -14353,6 +16937,7 @@ "version": "9.3.0", "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-9.3.0.tgz", "integrity": "sha512-mGl0BM19TD/HbU/LmlaZbjBi//tojelg8P/mxD6pPZTAYaI+VawcyBdqRsoUHSc7j71PrMdJ3HBadoQNdvP5cg==", + "optional": true, "dependencies": { "@braintree/sanitize-url": "^6.0.0", "d3": "^7.0.0", @@ -14366,10 +16951,17 @@ "uuid": "^9.0.0" } }, + "node_modules/mermaid/node_modules/dompurify": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.4.1.tgz", + "integrity": "sha512-ewwFzHzrrneRjxzmK6oVz/rZn9VWspGFRDb4/rRtIsM1n36t9AKma/ye8syCpcw+XJ25kOK/hOG7t1j2I2yBqA==", + "optional": true + }, "node_modules/mermaid/node_modules/uuid": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", + "optional": true, "bin": { "uuid": "dist/bin/uuid" } @@ -14458,9 +17050,9 @@ } }, "node_modules/mini-css-extract-plugin": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.6.1.tgz", - "integrity": "sha512-wd+SD57/K6DiV7jIR34P+s3uckTRuQvx0tKPcvjFlrEylk6P4mQ2KSWk1hblj1Kxaqok7LogKOieygXqBczNlg==", + "version": "2.7.6", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.6.tgz", + "integrity": "sha512-Qk7HcgaPkGG6eD77mLvZS1nmxlao3j+9PkrT9Uc7HAE1id3F41+DdBRYRYkbyfNRGzm8/YWtzhw7nVPmwhqTQw==", "dev": true, "dependencies": { "schema-utils": "^4.0.0" @@ -14477,15 +17069,15 @@ } }, "node_modules/mini-css-extract-plugin/node_modules/ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.16.0.tgz", + "integrity": "sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw==", "dev": true, "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", @@ -14511,15 +17103,15 @@ "dev": true }, "node_modules/mini-css-extract-plugin/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" @@ -14553,18 +17145,18 @@ } }, "node_modules/minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/minipass": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.4.tgz", - "integrity": "sha512-I9WPbWHCGu8W+6k1ZiGpPu0GkoKBeorkfKNuAFBNS1HNFJvke82sxvI5bzcCNpWPorkOO5QQ+zomzzwRxejXiw==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, "engines": { "node": ">=8" } @@ -14581,6 +17173,18 @@ "node": ">= 8" } }, + "node_modules/minipass-collect/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/minipass-fetch": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.2.tgz", @@ -14598,6 +17202,18 @@ "encoding": "^0.1.13" } }, + "node_modules/minipass-fetch/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/minipass-flush": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", @@ -14610,6 +17226,18 @@ "node": ">= 8" } }, + "node_modules/minipass-flush/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/minipass-json-stream": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz", @@ -14620,6 +17248,18 @@ "minipass": "^3.0.0" } }, + "node_modules/minipass-json-stream/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/minipass-pipeline": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", @@ -14632,6 +17272,18 @@ "node": ">=8" } }, + "node_modules/minipass-pipeline/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/minipass-sized": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", @@ -14644,6 +17296,18 @@ "node": ">=8" } }, + "node_modules/minipass-sized/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/minizlib": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", @@ -14657,6 +17321,18 @@ "node": ">= 8" } }, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/mississippi": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", @@ -14711,7 +17387,8 @@ "node_modules/moment-mini": { "version": "2.29.4", "resolved": "https://registry.npmjs.org/moment-mini/-/moment-mini-2.29.4.tgz", - "integrity": "sha512-uhXpYwHFeiTbY9KSgPPRoo1nt8OxNVdMVoTBYHfSEKeRkIkwGpO+gERmhuhBtzfaeOyTkykSrm2+noJBgqt3Hg==" + "integrity": "sha512-uhXpYwHFeiTbY9KSgPPRoo1nt8OxNVdMVoTBYHfSEKeRkIkwGpO+gERmhuhBtzfaeOyTkykSrm2+noJBgqt3Hg==", + "optional": true }, "node_modules/move-concurrently": { "version": "1.0.1", @@ -14753,6 +17430,15 @@ "rimraf": "bin.js" } }, + "node_modules/mrmime": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz", + "integrity": "sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -14785,10 +17471,16 @@ "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" }, @@ -14825,13 +17517,12 @@ "dev": true }, "node_modules/needle": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/needle/-/needle-3.1.0.tgz", - "integrity": "sha512-gCE9weDhjVGCRqS8dwDR/D3GTAeyXLXuqp7I8EzH6DllZGXSUyxuqqLh+YX9rMAWaaTFyVAg6rHGL25dqvczKw==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/needle/-/needle-3.3.1.tgz", + "integrity": "sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q==", "dev": true, "optional": true, "dependencies": { - "debug": "^3.2.6", "iconv-lite": "^0.6.3", "sax": "^1.2.4" }, @@ -14842,16 +17533,6 @@ "node": ">= 4.4.x" } }, - "node_modules/needle/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "optional": true, - "dependencies": { - "ms": "^2.1.1" - } - }, "node_modules/needle/node_modules/iconv-lite": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", @@ -14880,55 +17561,39 @@ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "dev": true }, - "node_modules/ng2-ui-auth": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/ng2-ui-auth/-/ng2-ui-auth-10.0.1.tgz", - "integrity": "sha512-7LqWdH4/9Id21Ced5LCSIA9aUTPQU0DPwhtQhBMxHRCFx9P4bpCAUwTgJ0XLt2pczusdnGpmBxeDFILZnwupmA==", - "dependencies": { - "tslib": "^1.9.0" - }, - "peerDependencies": { - "@angular/common": "^8.0.0", - "@angular/core": "^8.0.0", - "rxjs": "^6.0.0" - } - }, - "node_modules/ng2-ui-auth/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, "node_modules/ngx-markdown": { - "version": "14.0.1", - "resolved": "https://registry.npmjs.org/ngx-markdown/-/ngx-markdown-14.0.1.tgz", - "integrity": "sha512-y5CY4e0QM0uR6+MvU1rnh1Ks+rku14309kVVojyXLcWl4zlrt8VAYCcf/+A+8z/IDOaz38yTrxNBnvYDJzNzYA==", + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/ngx-markdown/-/ngx-markdown-16.0.0.tgz", + "integrity": "sha512-/rlbXi+HBscJCDdwaTWIUrRkvwJicPnuAgeugOCZa0UbZ4VCWV3U0+uB1Zv6krRDF6FXJNXNLTUrMZV7yH8I6A==", "dependencies": { - "@types/marked": "^4.0.3", + "tslib": "^2.3.0" + }, + "optionalDependencies": { "clipboard": "^2.0.11", - "emoji-toolkit": "^6.6.0", + "emoji-toolkit": "^7.0.0", "katex": "^0.16.0", - "marked": "^4.0.17", "mermaid": "^9.1.2", - "prismjs": "^1.28.0", - "tslib": "^2.3.0" + "prismjs": "^1.28.0" }, "peerDependencies": { - "@angular/common": "^14.0.0", - "@angular/core": "^14.0.0", - "@angular/platform-browser": "^14.0.0", + "@angular/common": "^16.0.0", + "@angular/core": "^16.0.0", + "@angular/platform-browser": "^16.0.0", + "@types/marked": "^4.3.0", + "marked": "^4.3.0", "rxjs": "^6.5.3 || ^7.4.0", - "zone.js": "^0.11.4" + "zone.js": "~0.13.0" } }, "node_modules/ngx-mat-select-search": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ngx-mat-select-search/-/ngx-mat-select-search-5.0.0.tgz", - "integrity": "sha512-w9NLIhN/b6aDpvwdrvxttNm6eYbcnalyCIOPaFPTpK8Ub8graHmL6qQdWzIw54Qxyzlr7A0DvpMgywcs4eGSYA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/ngx-mat-select-search/-/ngx-mat-select-search-6.0.0.tgz", + "integrity": "sha512-arrWZg2N/Pv3hCE2EV0qj3rqEUKImntmhW8qvo/aYxeN9iWPsseOpokcfMeC9I/SrLrqQFdfyPgHOgB9DqF2Hw==", "dependencies": { "tslib": "^2.4.0" }, "peerDependencies": { - "@angular/material": "^12.0.0 || ^13.0.0 || ^14.0.0" + "@angular/material": "^15.0.0" } }, "node_modules/ngx-sharebuttons": { @@ -14964,8 +17629,7 @@ "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, - "optional": true + "dev": true }, "node_modules/node-fetch": { "version": "2.6.7", @@ -15011,12 +17675,13 @@ } }, "node_modules/node-gyp": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.3.0.tgz", - "integrity": "sha512-A6rJWfXFz7TQNjpldJ915WFb1LnhO4lIve3ANPbWreuEoLoKlFT3sxIepPBkLhM27crW8YmN+pjlgbasH6cH/Q==", + "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", @@ -15031,15 +17696,14 @@ "node-gyp": "bin/node-gyp.js" }, "engines": { - "node": "^12.22 || ^14.13 || >=16" + "node": "^12.13 || ^14.13 || >=16" } }, "node_modules/node-gyp-build": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.3.0.tgz", - "integrity": "sha512-iWjXZvmboq0ja1pUGULQBexmxq8CV4xBhX7VDOTbL7ZR4FOowwY/VOtRxBN/yKxmdGoIp4j5ysNT4u3S2pDQ3Q==", + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.1.tgz", + "integrity": "sha512-OSs33Z9yWr148JZcbZd5WiAXhh/n9z8TxQcdMhIOlpN9AhWpLfvVFO73+m77bBABQMaY9XSvIa+qk0jlI7Gcaw==", "dev": true, - "optional": true, "bin": { "node-gyp-build": "bin.js", "node-gyp-build-optional": "optional.js", @@ -15134,9 +17798,9 @@ } }, "node_modules/node-releases": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", - "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", + "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/node.extend": { @@ -15155,7 +17819,8 @@ "node_modules/non-layered-tidy-tree-layout": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/non-layered-tidy-tree-layout/-/non-layered-tidy-tree-layout-2.0.2.tgz", - "integrity": "sha512-gkXMxRzUH+PB0ax9dUN0yYF0S25BqeAYqhgMaLUFmpXLEk7Fcu8f4emJuOAY0V8kjDICxROIKsTAKsV/v355xw==" + "integrity": "sha512-gkXMxRzUH+PB0ax9dUN0yYF0S25BqeAYqhgMaLUFmpXLEk7Fcu8f4emJuOAY0V8kjDICxROIKsTAKsV/v355xw==", + "optional": true }, "node_modules/nopt": { "version": "4.0.3", @@ -15221,15 +17886,15 @@ } }, "node_modules/npm-install-checks": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-5.0.0.tgz", - "integrity": "sha512-65lUsMI8ztHCxFz5ckCEC44DRvEGdZX5usQFriauxHEwt7upv1FKaQEmAtU0YnOAdwuNWCmk64xYiQABNrEyLA==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-6.3.0.tgz", + "integrity": "sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw==", "dev": true, "dependencies": { "semver": "^7.1.1" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/npm-normalize-package-bin": { @@ -15238,151 +17903,165 @@ "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==" }, "node_modules/npm-package-arg": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-9.1.0.tgz", - "integrity": "sha512-4J0GL+u2Nh6OnhvUKXRr2ZMG4lR8qtLp+kv7UiV00Y+nGiSxtttCyIRHCt5L5BNkXQld/RceYItau3MDOoGiBw==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-10.1.0.tgz", + "integrity": "sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA==", "dev": true, "dependencies": { - "hosted-git-info": "^5.0.0", - "proc-log": "^2.0.1", + "hosted-git-info": "^6.0.0", + "proc-log": "^3.0.0", "semver": "^7.3.5", - "validate-npm-package-name": "^4.0.0" + "validate-npm-package-name": "^5.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/npm-package-arg/node_modules/builtins": { + "node_modules/npm-package-arg/node_modules/validate-npm-package-name": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", - "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.1.tgz", + "integrity": "sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==", "dev": true, - "dependencies": { - "semver": "^7.0.0" + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/npm-package-arg/node_modules/validate-npm-package-name": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-4.0.0.tgz", - "integrity": "sha512-mzR0L8ZDktZjpX4OB46KT+56MAhl4EIazWP/+G/HPGuvfdaqg4YsCdtOm6U9+LOFyYDoh4dpnpxZRB9MQQns5Q==", + "node_modules/npm-packlist": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-7.0.4.tgz", + "integrity": "sha512-d6RGEuRrNS5/N84iglPivjaJPxhDbZmlbTwTDX2IbcRHG5bZCdtysYMhwiPvcF4GisXHGn7xsxv+GQ7T/02M5Q==", "dev": true, "dependencies": { - "builtins": "^5.0.0" + "ignore-walk": "^6.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/npm-packlist": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-5.1.3.tgz", - "integrity": "sha512-263/0NGrn32YFYi4J533qzrQ/krmmrWwhKkzwTuM4f/07ug51odoaNjUexxO4vxlzURHcmYMH1QjvHjsNDKLVg==", + "node_modules/npm-pick-manifest": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-8.0.1.tgz", + "integrity": "sha512-mRtvlBjTsJvfCCdmPtiu2bdlx8d/KXtF7yNXNWe7G0Z36qWA9Ny5zXsI2PfBZEv7SXgoxTmNaTzGSbbzDZChoA==", "dev": true, "dependencies": { - "glob": "^8.0.1", - "ignore-walk": "^5.0.1", - "npm-bundled": "^2.0.0", - "npm-normalize-package-bin": "^2.0.0" - }, - "bin": { - "npm-packlist": "bin/index.js" + "npm-install-checks": "^6.0.0", + "npm-normalize-package-bin": "^3.0.0", + "npm-package-arg": "^10.0.0", + "semver": "^7.3.5" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/npm-packlist/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "node_modules/npm-pick-manifest/node_modules/npm-normalize-package-bin": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz", + "integrity": "sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==", "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/npm-packlist/node_modules/glob": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz", - "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", + "node_modules/npm-registry-fetch": { + "version": "14.0.5", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-14.0.5.tgz", + "integrity": "sha512-kIDMIo4aBm6xg7jOttupWZamsZRkAqMqwqqbVXnUqstY5+tapvv6bkH/qMR76jdgV+YljEUCyWx3hRYMrJiAgA==", "dev": true, "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" + "make-fetch-happen": "^11.0.0", + "minipass": "^5.0.0", + "minipass-fetch": "^3.0.0", + "minipass-json-stream": "^1.0.1", + "minizlib": "^2.1.2", + "npm-package-arg": "^10.0.0", + "proc-log": "^3.0.0" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/npm-packlist/node_modules/minimatch": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", - "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", + "node_modules/npm-registry-fetch/node_modules/@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, "engines": { - "node": ">=10" + "node": ">= 10" } }, - "node_modules/npm-packlist/node_modules/npm-bundled": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-2.0.1.tgz", - "integrity": "sha512-gZLxXdjEzE/+mOstGDqR6b0EkhJ+kM6fxM6vUuckuctuVPh80Q6pw/rSZj9s4Gex9GxWtIicO1pc8DB9KZWudw==", + "node_modules/npm-registry-fetch/node_modules/http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", "dev": true, "dependencies": { - "npm-normalize-package-bin": "^2.0.0" + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">= 6" } }, - "node_modules/npm-packlist/node_modules/npm-normalize-package-bin": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-2.0.0.tgz", - "integrity": "sha512-awzfKUO7v0FscrSpRoogyNm0sajikhBWpU0QMrW09AMi9n1PoKU6WaIqUzuJSQnpciZZmJ/jMZ2Egfmb/9LiWQ==", + "node_modules/npm-registry-fetch/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "dev": true, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=12" } }, - "node_modules/npm-pick-manifest": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-7.0.1.tgz", - "integrity": "sha512-IA8+tuv8KujbsbLQvselW2XQgmXWS47t3CB0ZrzsRZ82DbDfkcFunOaPm4X7qNuhMfq+FmV7hQT4iFVpHqV7mg==", + "node_modules/npm-registry-fetch/node_modules/make-fetch-happen": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", + "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", "dev": true, "dependencies": { - "npm-install-checks": "^5.0.0", - "npm-normalize-package-bin": "^1.0.1", - "npm-package-arg": "^9.0.0", - "semver": "^7.3.5" + "agentkeepalive": "^4.2.1", + "cacache": "^17.0.0", + "http-cache-semantics": "^4.1.1", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.7.1", + "minipass": "^5.0.0", + "minipass-fetch": "^3.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^7.0.0", + "ssri": "^10.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/npm-registry-fetch": { - "version": "13.3.1", - "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-13.3.1.tgz", - "integrity": "sha512-eukJPi++DKRTjSBRcDZSDDsGqRK3ehbxfFUcgaRd0Yp6kRwOwh2WVn0r+8rMB4nnuzvAk6rQVzl6K5CkYOmnvw==", + "node_modules/npm-registry-fetch/node_modules/minipass-fetch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.5.tgz", + "integrity": "sha512-2N8elDQAtSnFV0Dk7gt15KHsS0Fyz6CbYZ360h0WTYV1Ty46li3rAXVOQj1THMNLdmrD9Vt5pBPtWtVkpwGBqg==", "dev": true, "dependencies": { - "make-fetch-happen": "^10.0.6", - "minipass": "^3.1.6", - "minipass-fetch": "^2.0.3", - "minipass-json-stream": "^1.0.1", - "minizlib": "^2.1.2", - "npm-package-arg": "^9.0.1", - "proc-log": "^2.0.0" + "minipass": "^7.0.3", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, + "node_modules/npm-registry-fetch/node_modules/minipass-fetch/node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" } }, "node_modules/npm-run-path": { @@ -15401,6 +18080,7 @@ "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", @@ -15424,6 +18104,268 @@ "url": "https://github.com/fb55/nth-check?sponsor=1" } }, + "node_modules/nwsapi": { + "version": "2.2.10", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.10.tgz", + "integrity": "sha512-QK0sRs7MKv0tKe1+5uZIQk/C8XGza4DAnztJG8iD+TpJIORARrCxczA738awHrZoHeTjSSoHqao2teO0dC/gFQ==", + "dev": true + }, + "node_modules/nx": { + "version": "16.5.1", + "resolved": "https://registry.npmjs.org/nx/-/nx-16.5.1.tgz", + "integrity": "sha512-I3hJRE4hG7JWAtncWwDEO3GVeGPpN0TtM8xH5ArZXyDuVeTth/i3TtJzdDzqXO1HHtIoAQN0xeq4n9cLuMil5g==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "@nrwl/tao": "16.5.1", + "@parcel/watcher": "2.0.4", + "@yarnpkg/lockfile": "^1.1.0", + "@yarnpkg/parsers": "3.0.0-rc.46", + "@zkochan/js-yaml": "0.0.6", + "axios": "^1.0.0", + "chalk": "^4.1.0", + "cli-cursor": "3.1.0", + "cli-spinners": "2.6.1", + "cliui": "^7.0.2", + "dotenv": "~10.0.0", + "enquirer": "~2.3.6", + "fast-glob": "3.2.7", + "figures": "3.2.0", + "flat": "^5.0.2", + "fs-extra": "^11.1.0", + "glob": "7.1.4", + "ignore": "^5.0.4", + "js-yaml": "4.1.0", + "jsonc-parser": "3.2.0", + "lines-and-columns": "~2.0.3", + "minimatch": "3.0.5", + "npm-run-path": "^4.0.1", + "open": "^8.4.0", + "semver": "7.5.3", + "string-width": "^4.2.3", + "strong-log-transformer": "^2.1.0", + "tar-stream": "~2.2.0", + "tmp": "~0.2.1", + "tsconfig-paths": "^4.1.2", + "tslib": "^2.3.0", + "v8-compile-cache": "2.3.0", + "yargs": "^17.6.2", + "yargs-parser": "21.1.1" + }, + "bin": { + "nx": "bin/nx.js" + }, + "optionalDependencies": { + "@nx/nx-darwin-arm64": "16.5.1", + "@nx/nx-darwin-x64": "16.5.1", + "@nx/nx-freebsd-x64": "16.5.1", + "@nx/nx-linux-arm-gnueabihf": "16.5.1", + "@nx/nx-linux-arm64-gnu": "16.5.1", + "@nx/nx-linux-arm64-musl": "16.5.1", + "@nx/nx-linux-x64-gnu": "16.5.1", + "@nx/nx-linux-x64-musl": "16.5.1", + "@nx/nx-win32-arm64-msvc": "16.5.1", + "@nx/nx-win32-x64-msvc": "16.5.1" + }, + "peerDependencies": { + "@swc-node/register": "^1.4.2", + "@swc/core": "^1.2.173" + }, + "peerDependenciesMeta": { + "@swc-node/register": { + "optional": true + }, + "@swc/core": { + "optional": true + } + } + }, + "node_modules/nx/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/nx/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/nx/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/nx/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/nx/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/nx/node_modules/fast-glob": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", + "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nx/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, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/nx/node_modules/glob": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/nx/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/nx/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/nx/node_modules/lines-and-columns": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-2.0.4.tgz", + "integrity": "sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/nx/node_modules/minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/nx/node_modules/semver": { + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", + "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/nx/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nx/node_modules/tsconfig-paths": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", + "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", + "dev": true, + "dependencies": { + "json5": "^2.2.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -15519,14 +18461,26 @@ } }, "node_modules/object-inspect": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", - "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", + "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", "dev": true, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/object-path": { + "version": "0.11.8", + "resolved": "https://registry.npmjs.org/object-path/-/object-path-0.11.8.tgz", + "integrity": "sha512-YJjNZrlXJFM42wTBn6zgOJVar9KFJvzx6sTWDte8sWZF//cnjl0BxHNpfZx+ZffXX63A9q0b1zsFiBX4g4X5KA==", + "dev": true, + "engines": { + "node": ">= 10.12.0" + } + }, "node_modules/object-visit": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", @@ -15602,9 +18556,9 @@ } }, "node_modules/open": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", - "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", + "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", @@ -15918,15 +18872,6 @@ "lodash": "^4.17.14" } }, - "node_modules/pa11y-ci/node_modules/commander": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", - "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, "node_modules/pa11y-ci/node_modules/globby": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", @@ -15952,39 +18897,42 @@ "node": ">= 12" } }, + "node_modules/package-json-from-dist": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", + "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==", + "dev": true + }, "node_modules/pacote": { - "version": "13.6.2", - "resolved": "https://registry.npmjs.org/pacote/-/pacote-13.6.2.tgz", - "integrity": "sha512-Gu8fU3GsvOPkak2CkbojR7vjs3k3P9cA6uazKTHdsdV0gpCEQq2opelnEv30KRQWgVzP5Vd/5umjcedma3MKtg==", - "dev": true, - "dependencies": { - "@npmcli/git": "^3.0.0", - "@npmcli/installed-package-contents": "^1.0.7", - "@npmcli/promise-spawn": "^3.0.0", - "@npmcli/run-script": "^4.1.0", - "cacache": "^16.0.0", - "chownr": "^2.0.0", - "fs-minipass": "^2.1.0", - "infer-owner": "^1.0.4", - "minipass": "^3.1.6", - "mkdirp": "^1.0.4", - "npm-package-arg": "^9.0.0", - "npm-packlist": "^5.1.0", - "npm-pick-manifest": "^7.0.0", - "npm-registry-fetch": "^13.0.1", - "proc-log": "^2.0.0", + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-15.2.0.tgz", + "integrity": "sha512-rJVZeIwHTUta23sIZgEIM62WYwbmGbThdbnkt81ravBplQv+HjyroqnLRNH2+sLJHcGZmLRmhPwACqhfTcOmnA==", + "dev": true, + "dependencies": { + "@npmcli/git": "^4.0.0", + "@npmcli/installed-package-contents": "^2.0.1", + "@npmcli/promise-spawn": "^6.0.1", + "@npmcli/run-script": "^6.0.0", + "cacache": "^17.0.0", + "fs-minipass": "^3.0.0", + "minipass": "^5.0.0", + "npm-package-arg": "^10.0.0", + "npm-packlist": "^7.0.0", + "npm-pick-manifest": "^8.0.0", + "npm-registry-fetch": "^14.0.0", + "proc-log": "^3.0.0", "promise-retry": "^2.0.1", - "read-package-json": "^5.0.0", - "read-package-json-fast": "^2.0.3", - "rimraf": "^3.0.2", - "ssri": "^9.0.0", + "read-package-json": "^6.0.0", + "read-package-json-fast": "^3.0.0", + "sigstore": "^1.3.0", + "ssri": "^10.0.0", "tar": "^6.1.11" }, "bin": { "pacote": "lib/bin.js" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/pacote/node_modules/brace-expansion": { @@ -15997,73 +18945,99 @@ } }, "node_modules/pacote/node_modules/glob": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz", - "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", + "version": "10.4.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.2.tgz", + "integrity": "sha512-GwMlUF6PkPo3Gk21UxkCohOv0PLcIXVtKyLlpEI28R/cO/4eNOdmLk3CMW1wROV/WR/EsZOWAfBbBOqYvs88/w==", "dev": true, "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" }, "engines": { - "node": ">=12" + "node": ">=16 || 14 >=14.18" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/pacote/node_modules/glob/node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/pacote/node_modules/json-parse-even-better-errors": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.2.tgz", + "integrity": "sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, "node_modules/pacote/node_modules/minimatch": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", - "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, "dependencies": { "brace-expansion": "^2.0.1" }, "engines": { - "node": ">=10" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/pacote/node_modules/normalize-package-data": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-4.0.1.tgz", - "integrity": "sha512-EBk5QKKuocMJhB3BILuKhmaPjI8vNRSpIfO9woLC6NyHVkKKdVEdAO1mrT0ZfxNR1lKwCcTkuZfmGIFdizZ8Pg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-5.0.0.tgz", + "integrity": "sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q==", "dev": true, "dependencies": { - "hosted-git-info": "^5.0.0", + "hosted-git-info": "^6.0.0", "is-core-module": "^2.8.1", "semver": "^7.3.5", "validate-npm-package-license": "^3.0.4" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/pacote/node_modules/npm-normalize-package-bin": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-2.0.0.tgz", - "integrity": "sha512-awzfKUO7v0FscrSpRoogyNm0sajikhBWpU0QMrW09AMi9n1PoKU6WaIqUzuJSQnpciZZmJ/jMZ2Egfmb/9LiWQ==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz", + "integrity": "sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==", "dev": true, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/pacote/node_modules/read-package-json": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-5.0.2.tgz", - "integrity": "sha512-BSzugrt4kQ/Z0krro8zhTwV1Kd79ue25IhNN/VtHFy1mG/6Tluyi+msc0UpwaoQzxSHa28mntAjIZY6kEgfR9Q==", + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-6.0.4.tgz", + "integrity": "sha512-AEtWXYfopBj2z5N5PbkAOeNHRPUg5q+Nen7QLxV8M2zJq1ym6/lCz3fYNTCXe19puu2d06jfHhrP7v/S2PtMMw==", + "deprecated": "This package is no longer supported. Please use @npmcli/package-json instead.", "dev": true, "dependencies": { - "glob": "^8.0.1", - "json-parse-even-better-errors": "^2.3.1", - "normalize-package-data": "^4.0.0", - "npm-normalize-package-bin": "^2.0.0" + "glob": "^10.2.2", + "json-parse-even-better-errors": "^3.0.0", + "normalize-package-data": "^5.0.0", + "npm-normalize-package-bin": "^3.0.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/pako": { @@ -16163,50 +19137,54 @@ "optional": true }, "node_modules/parse5-html-rewriting-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5-html-rewriting-stream/-/parse5-html-rewriting-stream-6.0.1.tgz", - "integrity": "sha512-vwLQzynJVEfUlURxgnf51yAJDQTtVpNyGD8tKi2Za7m+akukNHxCcUQMAa/mUGLhCeicFdpy7Tlvj8ZNKadprg==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse5-html-rewriting-stream/-/parse5-html-rewriting-stream-7.0.0.tgz", + "integrity": "sha512-mazCyGWkmCRWDI15Zp+UiCqMp/0dgEmkZRvhlsqqKYr4SsVm/TvnSpD9fCvqCA2zoWJcfRym846ejWBBHRiYEg==", "dev": true, "dependencies": { - "parse5": "^6.0.1", - "parse5-sax-parser": "^6.0.1" + "entities": "^4.3.0", + "parse5": "^7.0.0", + "parse5-sax-parser": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" } }, "node_modules/parse5-html-rewriting-stream/node_modules/parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", - "dev": true - }, - "node_modules/parse5-htmlparser2-tree-adapter": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", - "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", "dev": true, "dependencies": { - "parse5": "^6.0.1" + "entities": "^4.4.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" } }, - "node_modules/parse5-htmlparser2-tree-adapter/node_modules/parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", - "dev": true - }, "node_modules/parse5-sax-parser": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5-sax-parser/-/parse5-sax-parser-6.0.1.tgz", - "integrity": "sha512-kXX+5S81lgESA0LsDuGjAlBybImAChYRMT+/uKCEXFBFOeEhS52qUCydGhU3qLRD8D9DVjaUo821WK7DM4iCeg==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse5-sax-parser/-/parse5-sax-parser-7.0.0.tgz", + "integrity": "sha512-5A+v2SNsq8T6/mG3ahcz8ZtQ0OUFTatxPbeidoMB7tkJSGDY3tdfl4MHovtLQHkEn5CGxijNWRQHhRQ6IRpXKg==", "dev": true, "dependencies": { - "parse5": "^6.0.1" + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" } }, "node_modules/parse5-sax-parser/node_modules/parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", - "dev": true + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "dev": true, + "dependencies": { + "entities": "^4.4.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } }, "node_modules/parseurl": { "version": "1.3.3", @@ -16270,10 +19248,35 @@ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.3.0.tgz", + "integrity": "sha512-CQl19J/g+Hbjbv4Y3mFNNXFEL/5t/KCg8POCuUqd4rMKjGG+j1ybER83hxV58zL+dFI1PTkt3GNFSHRt+d8qEQ==", + "dev": true, + "engines": { + "node": "14 || >=16.14" + } + }, "node_modules/path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.10.tgz", + "integrity": "sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==", "dev": true }, "node_modules/path-type": { @@ -16310,13 +19313,13 @@ "node_modules/performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", "dev": true }, "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", "dev": true }, "node_modules/picomatch": { @@ -16362,9 +19365,9 @@ } }, "node_modules/piscina": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/piscina/-/piscina-3.2.0.tgz", - "integrity": "sha512-yn/jMdHRw+q2ZJhFhyqsmANcbF6V2QwmD84c6xRau+QpQOmtrBCoRGdvTfeuFDYXB5W2m6MfLkjkvQa9lUSmIA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/piscina/-/piscina-4.0.0.tgz", + "integrity": "sha512-641nAmJS4k4iqpNUqfggqUBUMmlw0ZoM5VZKdQkV2e970Inn3Tk9kroCc1wpsYLD07vCwpys5iY0d3xI/9WkTg==", "dev": true, "dependencies": { "eventemitter-asyncresource": "^1.0.0", @@ -16418,9 +19421,9 @@ } }, "node_modules/postcss": { - "version": "8.4.16", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.16.tgz", - "integrity": "sha512-ipHE1XBvKzm5xI7hiHCZJCSugxvsdq2mPnsq5+UF+VHCjiBvtDrlxJfMBToWaP9D5XlgNmcFGqoHmUn0EYEaRQ==", + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", "dev": true, "funding": [ { @@ -16430,10 +19433,14 @@ { "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.6", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" }, @@ -16441,358 +19448,77 @@ "node": "^10 || ^12 || >=14" } }, - "node_modules/postcss-attribute-case-insensitive": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-5.0.2.tgz", - "integrity": "sha512-XIidXV8fDr0kKt28vqki84fRK8VW8eTuIa4PChv2MqKuT6C9UjmSKzen6KaWhWEoYvwxFCa7n/tC1SZ3tyq4SQ==", - "dev": true, - "dependencies": { - "postcss-selector-parser": "^6.0.10" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/postcss-clamp": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/postcss-clamp/-/postcss-clamp-4.1.0.tgz", - "integrity": "sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": ">=7.6.0" - }, - "peerDependencies": { - "postcss": "^8.4.6" - } - }, - "node_modules/postcss-color-functional-notation": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.4.tgz", - "integrity": "sha512-2yrTAUZUab9s6CpxkxC4rVgFEVaR6/2Pipvi6qcgvnYiVqZcbDHEoBDhrXzyb7Efh2CCfHQNtcqWcIruDTIUeg==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/postcss-color-hex-alpha": { - "version": "8.0.4", - "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-8.0.4.tgz", - "integrity": "sha512-nLo2DCRC9eE4w2JmuKgVA3fGL3d01kGq752pVALF68qpGLmx2Qrk91QTKkdUqqp45T1K1XV8IhQpcu1hoAQflQ==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-color-rebeccapurple": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-7.1.1.tgz", - "integrity": "sha512-pGxkuVEInwLHgkNxUc4sdg4g3py7zUeCQ9sMfwyHAT+Ezk8a4OaaVZ8lIY5+oNqA/BXXgLyXv0+5wHP68R79hg==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/postcss-custom-media": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-8.0.2.tgz", - "integrity": "sha512-7yi25vDAoHAkbhAzX9dHx2yc6ntS4jQvejrNcC+csQJAXjj15e7VcWfMgLqBNAbOvqi5uIa9huOVwdHbf+sKqg==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.3" - } - }, - "node_modules/postcss-custom-properties": { - "version": "12.1.10", - "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-12.1.10.tgz", - "integrity": "sha512-U3BHdgrYhCrwTVcByFHs9EOBoqcKq4Lf3kXwbTi4hhq0qWhl/pDWq2THbv/ICX/Fl9KqeHBb8OVrTf2OaYF07A==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/postcss-custom-selectors": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-6.0.3.tgz", - "integrity": "sha512-fgVkmyiWDwmD3JbpCmB45SvvlCD6z9CG6Ie6Iere22W5aHea6oWa7EM2bpnv2Fj3I94L3VbtvX9KqwSi5aFzSg==", - "dev": true, - "dependencies": { - "postcss-selector-parser": "^6.0.4" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.3" - } - }, - "node_modules/postcss-dir-pseudo-class": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-6.0.5.tgz", - "integrity": "sha512-eqn4m70P031PF7ZQIvSgy9RSJ5uI2171O/OO/zcRNYpJbvaeKFUlar1aJ7rmgiQtbm0FSPsRewjpdS0Oew7MPA==", - "dev": true, - "dependencies": { - "postcss-selector-parser": "^6.0.10" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/postcss-double-position-gradients": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-3.1.2.tgz", - "integrity": "sha512-GX+FuE/uBR6eskOK+4vkXgT6pDkexLokPaz/AbJna9s5Kzp/yl488pKPjhy0obB475ovfT1Wv8ho7U/cHNaRgQ==", + "node_modules/postcss-loader": { + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.3.3.tgz", + "integrity": "sha512-YgO/yhtevGO/vJePCQmTxiaEwER94LABZN0ZMT4A0vsak9TpO+RvKRs7EmJ8peIlB9xfXCsS7M8LjqncsUZ5HA==", "dev": true, "dependencies": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" + "cosmiconfig": "^8.2.0", + "jiti": "^1.18.2", + "semver": "^7.3.8" }, "engines": { - "node": "^12 || ^14 || >=16" + "node": ">= 14.15.0" }, "funding": { "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/postcss-env-function": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-4.0.6.tgz", - "integrity": "sha512-kpA6FsLra+NqcFnL81TnsU+Z7orGtDTxcOhl6pwXeEq1yFPpRMkCDpHhrz8CFQDr/Wfm0jLiNQ1OsGGPjlqPwA==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-focus-visible": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-6.0.4.tgz", - "integrity": "sha512-QcKuUU/dgNsstIK6HELFRT5Y3lbrMLEOwG+A4s5cA+fx3A3y/JTq3X9LaOj3OC3ALH0XqyrgQIgey/MIZ8Wczw==", - "dev": true, - "dependencies": { - "postcss-selector-parser": "^6.0.9" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-focus-within": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-5.0.4.tgz", - "integrity": "sha512-vvjDN++C0mu8jz4af5d52CB184ogg/sSxAFS+oUJQq2SuCe7T5U2iIsVJtsCp2d6R4j0jr5+q3rPkBVZkXD9fQ==", - "dev": true, - "dependencies": { - "postcss-selector-parser": "^6.0.9" - }, - "engines": { - "node": "^12 || ^14 || >=16" + "url": "https://opencollective.com/webpack" }, "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-font-variant": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz", - "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==", - "dev": true, - "peerDependencies": { - "postcss": "^8.1.0" + "postcss": "^7.0.0 || ^8.0.1", + "webpack": "^5.0.0" } }, - "node_modules/postcss-gap-properties": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-3.0.5.tgz", - "integrity": "sha512-IuE6gKSdoUNcvkGIqdtjtcMtZIFyXZhmFd5RUlg97iVEvp1BZKV5ngsAjCjrVy+14uhGBQl9tzmi1Qwq4kqVOg==", - "dev": true, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } + "node_modules/postcss-loader/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true }, - "node_modules/postcss-image-set-function": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-4.0.7.tgz", - "integrity": "sha512-9T2r9rsvYzm5ndsBE8WgtrMlIT7VbtTfE7b3BQnudUqnBcBo7L758oc+o+pdj/dUV0l5wjwSdjeOH2DZtfv8qw==", + "node_modules/postcss-loader/node_modules/cosmiconfig": { + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", + "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", "dev": true, "dependencies": { - "postcss-value-parser": "^4.2.0" + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0", + "path-type": "^4.0.0" }, "engines": { - "node": "^12 || ^14 || >=16" + "node": ">=14" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" + "url": "https://github.com/sponsors/d-fischer" }, "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/postcss-import": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.0.0.tgz", - "integrity": "sha512-Y20shPQ07RitgBGv2zvkEAu9bqvrD77C9axhj/aA1BQj4czape2MdClCExvB27EwYEJdGgKZBpKanb0t1rK2Kg==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.0.0", - "read-cache": "^1.0.0", - "resolve": "^1.1.7" - }, - "engines": { - "node": ">=14.0.0" + "typescript": ">=4.9.5" }, - "peerDependencies": { - "postcss": "^8.0.0" - } - }, - "node_modules/postcss-initial": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-4.0.1.tgz", - "integrity": "sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==", - "dev": true, - "peerDependencies": { - "postcss": "^8.0.0" - } - }, - "node_modules/postcss-lab-function": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-4.2.1.tgz", - "integrity": "sha512-xuXll4isR03CrQsmxyz92LJB2xX9n+pZJ5jE9JgcnmsCammLyKdlzrBin+25dy6wIjfhJpKBAN80gsTlCgRk2w==", - "dev": true, - "dependencies": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/postcss-loader": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.0.1.tgz", - "integrity": "sha512-VRviFEyYlLjctSM93gAZtcJJ/iSkPZ79zWbN/1fSH+NisBByEiVLqpdVDrPLVSi8DX0oJo12kL/GppTBdKVXiQ==", + "node_modules/postcss-loader/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, "dependencies": { - "cosmiconfig": "^7.0.0", - "klona": "^2.0.5", - "semver": "^7.3.7" - }, - "engines": { - "node": ">= 14.15.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "argparse": "^2.0.1" }, - "peerDependencies": { - "postcss": "^7.0.0 || ^8.0.1", - "webpack": "^5.0.0" + "bin": { + "js-yaml": "bin/js-yaml.js" } }, "node_modules/postcss-loader/node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", + "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, "bin": { "semver": "bin/semver.js" }, @@ -16800,34 +19526,10 @@ "node": ">=10" } }, - "node_modules/postcss-logical": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-5.0.4.tgz", - "integrity": "sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g==", - "dev": true, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "peerDependencies": { - "postcss": "^8.4" - } - }, - "node_modules/postcss-media-minmax": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-5.0.0.tgz", - "integrity": "sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ==", - "dev": true, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, "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" @@ -16837,9 +19539,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", @@ -16854,9 +19556,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" @@ -16883,210 +19585,10 @@ "postcss": "^8.1.0" } }, - "node_modules/postcss-nesting": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-10.2.0.tgz", - "integrity": "sha512-EwMkYchxiDiKUhlJGzWsD9b2zvq/r2SSubcRrgP+jujMXFzqvANLt16lJANC+5uZ6hjI7lpRmI6O8JIl+8l1KA==", - "dev": true, - "dependencies": { - "@csstools/selector-specificity": "^2.0.0", - "postcss-selector-parser": "^6.0.10" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/postcss-opacity-percentage": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/postcss-opacity-percentage/-/postcss-opacity-percentage-1.1.2.tgz", - "integrity": "sha512-lyUfF7miG+yewZ8EAk9XUBIlrHyUE6fijnesuz+Mj5zrIHIEw6KcIZSOk/elVMqzLvREmXB83Zi/5QpNRYd47w==", - "dev": true, - "funding": [ - { - "type": "kofi", - "url": "https://ko-fi.com/mrcgrtz" - }, - { - "type": "liberapay", - "url": "https://liberapay.com/mrcgrtz" - } - ], - "engines": { - "node": "^12 || ^14 || >=16" - } - }, - "node_modules/postcss-overflow-shorthand": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-3.0.4.tgz", - "integrity": "sha512-otYl/ylHK8Y9bcBnPLo3foYFLL6a6Ak+3EQBPOTR7luMYCOsiVTUk1iLvNf6tVPNGXcoL9Hoz37kpfriRIFb4A==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/postcss-page-break": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz", - "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==", - "dev": true, - "peerDependencies": { - "postcss": "^8" - } - }, - "node_modules/postcss-place": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-7.0.5.tgz", - "integrity": "sha512-wR8igaZROA6Z4pv0d+bvVrvGY4GVHihBCBQieXFY3kuSuMyOmEnnfFzHl/tQuqHZkfkIVBEbDvYcFfHmpSet9g==", - "dev": true, - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/postcss-preset-env": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-7.8.0.tgz", - "integrity": "sha512-leqiqLOellpLKfbHkD06E04P6d9ZQ24mat6hu4NSqun7WG0UhspHR5Myiv/510qouCjoo4+YJtNOqg5xHaFnCA==", - "dev": true, - "dependencies": { - "@csstools/postcss-cascade-layers": "^1.0.5", - "@csstools/postcss-color-function": "^1.1.1", - "@csstools/postcss-font-format-keywords": "^1.0.1", - "@csstools/postcss-hwb-function": "^1.0.2", - "@csstools/postcss-ic-unit": "^1.0.1", - "@csstools/postcss-is-pseudo-class": "^2.0.7", - "@csstools/postcss-nested-calc": "^1.0.0", - "@csstools/postcss-normalize-display-values": "^1.0.1", - "@csstools/postcss-oklab-function": "^1.1.1", - "@csstools/postcss-progressive-custom-properties": "^1.3.0", - "@csstools/postcss-stepped-value-functions": "^1.0.1", - "@csstools/postcss-text-decoration-shorthand": "^1.0.0", - "@csstools/postcss-trigonometric-functions": "^1.0.2", - "@csstools/postcss-unset-value": "^1.0.2", - "autoprefixer": "^10.4.8", - "browserslist": "^4.21.3", - "css-blank-pseudo": "^3.0.3", - "css-has-pseudo": "^3.0.4", - "css-prefers-color-scheme": "^6.0.3", - "cssdb": "^7.0.0", - "postcss-attribute-case-insensitive": "^5.0.2", - "postcss-clamp": "^4.1.0", - "postcss-color-functional-notation": "^4.2.4", - "postcss-color-hex-alpha": "^8.0.4", - "postcss-color-rebeccapurple": "^7.1.1", - "postcss-custom-media": "^8.0.2", - "postcss-custom-properties": "^12.1.8", - "postcss-custom-selectors": "^6.0.3", - "postcss-dir-pseudo-class": "^6.0.5", - "postcss-double-position-gradients": "^3.1.2", - "postcss-env-function": "^4.0.6", - "postcss-focus-visible": "^6.0.4", - "postcss-focus-within": "^5.0.4", - "postcss-font-variant": "^5.0.0", - "postcss-gap-properties": "^3.0.5", - "postcss-image-set-function": "^4.0.7", - "postcss-initial": "^4.0.1", - "postcss-lab-function": "^4.2.1", - "postcss-logical": "^5.0.4", - "postcss-media-minmax": "^5.0.0", - "postcss-nesting": "^10.1.10", - "postcss-opacity-percentage": "^1.1.2", - "postcss-overflow-shorthand": "^3.0.4", - "postcss-page-break": "^3.0.4", - "postcss-place": "^7.0.5", - "postcss-pseudo-class-any-link": "^7.1.6", - "postcss-replace-overflow-wrap": "^4.0.0", - "postcss-selector-not": "^6.0.1", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/postcss-pseudo-class-any-link": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.1.6.tgz", - "integrity": "sha512-9sCtZkO6f/5ML9WcTLcIyV1yz9D1rf0tWc+ulKcvV30s0iZKS/ONyETvoWsr6vnrmW+X+KmuK3gV/w5EWnT37w==", - "dev": true, - "dependencies": { - "postcss-selector-parser": "^6.0.10" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, - "node_modules/postcss-replace-overflow-wrap": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz", - "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==", - "dev": true, - "peerDependencies": { - "postcss": "^8.0.3" - } - }, - "node_modules/postcss-selector-not": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-6.0.1.tgz", - "integrity": "sha512-1i9affjAe9xu/y9uqWH+tD4r6/hDaXJruk8xn2x1vzxC2U3J3LKO3zJW4CyxlNhA56pADJ/djpEwpH1RClI2rQ==", - "dev": true, - "dependencies": { - "postcss-selector-parser": "^6.0.10" - }, - "engines": { - "node": "^12 || ^14 || >=16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.2" - } - }, "node_modules/postcss-selector-parser": { - "version": "6.0.10", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", - "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", + "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", @@ -17153,12 +19655,12 @@ } }, "node_modules/proc-log": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-2.0.1.tgz", - "integrity": "sha512-Kcmo2FhfDTXdcbfDH76N7uBYHINxc/8GW7UAVuVP9I+Va3uHSerrnKV6dLooga/gh7GlgzuCCr/eoldnL1muGw==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-3.0.0.tgz", + "integrity": "sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==", "dev": true, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/process": { @@ -17351,9 +19853,9 @@ "dev": true }, "node_modules/puppeteer/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" @@ -17459,9 +19961,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", @@ -17473,15 +19975,6 @@ "node": ">= 0.8" } }, - "node_modules/read-cache": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", - "dev": true, - "dependencies": { - "pify": "^2.3.0" - } - }, "node_modules/read-installed": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/read-installed/-/read-installed-4.0.3.tgz", @@ -17521,22 +20014,40 @@ } }, "node_modules/read-package-json-fast": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-2.0.3.tgz", - "integrity": "sha512-W/BKtbL+dUjTuRL2vziuYhp76s5HZ9qQhd/dKfWIZveD0O40453QNyZhC0e63lqZrAQ4jiOapVoeJ7JrszenQQ==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-3.0.2.tgz", + "integrity": "sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==", "dev": true, "dependencies": { - "json-parse-even-better-errors": "^2.3.0", - "npm-normalize-package-bin": "^1.0.1" + "json-parse-even-better-errors": "^3.0.0", + "npm-normalize-package-bin": "^3.0.0" }, "engines": { - "node": ">=10" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/read-package-json-fast/node_modules/json-parse-even-better-errors": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.2.tgz", + "integrity": "sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/read-package-json-fast/node_modules/npm-normalize-package-bin": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz", + "integrity": "sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "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", @@ -17572,9 +20083,9 @@ } }, "node_modules/reflect-metadata": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", - "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==", + "version": "0.1.14", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.14.tgz", + "integrity": "sha512-ZhYeb6nRaXCfhnndflDK8qI6ZQ/YcWZCISRAWICW9XYqMUwjZM9Z0DveWX/ABN01oxSHwVxKQmxeYZSsm0jh5A==", "dev": true }, "node_modules/regenerate": { @@ -17584,9 +20095,9 @@ "dev": true }, "node_modules/regenerate-unicode-properties": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz", - "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==", + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", + "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", "dev": true, "dependencies": { "regenerate": "^1.4.2" @@ -17596,15 +20107,15 @@ } }, "node_modules/regenerator-runtime": { - "version": "0.13.9", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", - "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==", + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", "dev": true }, "node_modules/regenerator-transform": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.0.tgz", - "integrity": "sha512-LsrGtPmbYg19bcPHwdtmXwbW+TqNvtY4riE3P83foeHRroMbH6/2ddFBfab3t7kbzc7v7p4wbkIecHImqt0QNg==", + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", + "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", "dev": true, "dependencies": { "@babel/runtime": "^7.8.4" @@ -17642,28 +20153,22 @@ } }, "node_modules/regexpu-core": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.2.1.tgz", - "integrity": "sha512-HrnlNtpvqP1Xkb28tMhBUO2EbyUHdQlsnlAhzWcwHy8WJR53UWr7/MAvqrsQKMbV4qdpv03oTMG8iIhfsPFktQ==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", + "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", "dev": true, "dependencies": { + "@babel/regjsgen": "^0.8.0", "regenerate": "^1.4.2", "regenerate-unicode-properties": "^10.1.0", - "regjsgen": "^0.7.1", "regjsparser": "^0.9.1", "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.0.0" + "unicode-match-property-value-ecmascript": "^2.1.0" }, "engines": { "node": ">=4" } }, - "node_modules/regjsgen": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.7.1.tgz", - "integrity": "sha512-RAt+8H2ZEzHeYWxZ3H2z6tF18zyyOnlcdaafLrm21Bguj7uZy6ULibiAFdXEtKQY4Sy7wDTwDiOazasMLc4KPA==", - "dev": true - }, "node_modules/regjsparser": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", @@ -17744,11 +20249,11 @@ "dev": true }, "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.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", "dependencies": { - "is-core-module": "^2.9.0", + "is-core-module": "^2.11.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -17889,7 +20394,24 @@ "node_modules/robust-predicates": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.1.tgz", - "integrity": "sha512-ndEIpszUHiG4HtDsQLeIuMvRsDnn8c8rYStabochtUeCvfuvNptb5TUbVD68LRAILPX7p9nqQGh4xJgn3EHS/g==" + "integrity": "sha512-ndEIpszUHiG4HtDsQLeIuMvRsDnn8c8rYStabochtUeCvfuvNptb5TUbVD68LRAILPX7p9nqQGh4xJgn3EHS/g==", + "optional": true + }, + "node_modules/rollup": { + "version": "3.29.5", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.5.tgz", + "integrity": "sha512-GVsDdsbJzzy4S/v3dqWPJ7EfvZJfCHiDqe80IyrF59LYuP+e6U1LJoUqeuqRbwAWoMNoXivMNeNAOf5E22VA1w==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=14.18.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } }, "node_modules/run-async": { "version": "2.4.1", @@ -17939,7 +20461,8 @@ "node_modules/rw": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", - "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==" + "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==", + "optional": true }, "node_modules/rxjs": { "version": "6.6.7", @@ -17976,10 +20499,15 @@ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, + "node_modules/safevalues": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/safevalues/-/safevalues-0.3.4.tgz", + "integrity": "sha512-LRneZZRXNgjzwG4bDQdOTSbze3fHm1EAKN/8bePxnlEZiBmkYEDggaHbuvHI9/hoqHbGfsEA7tWS9GhYHZBBsw==" + }, "node_modules/sass": { - "version": "1.54.4", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.54.4.tgz", - "integrity": "sha512-3tmF16yvnBwtlPrNBHw/H907j8MlOX8aTBnlNX1yrKx24RKcJGPyLhFUwkoKBKesR3unP93/2z14Ll8NicwQUA==", + "version": "1.64.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.64.1.tgz", + "integrity": "sha512-16rRACSOFEE8VN7SCgBu1MpYCyN7urj9At898tyzdXFhC+a+yOX5dXwAR7L8/IdPJ1NB8OYoXmD55DM30B2kEQ==", "dev": true, "dependencies": { "chokidar": ">=3.0.0 <4.0.0", @@ -17990,16 +20518,15 @@ "sass": "sass.js" }, "engines": { - "node": ">=12.0.0" + "node": ">=14.0.0" } }, "node_modules/sass-loader": { - "version": "13.0.2", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-13.0.2.tgz", - "integrity": "sha512-BbiqbVmbfJaWVeOOAu2o7DhYWtcNmTfvroVgFXa6k2hHheMxNAeDHLNoDy/Q5aoaVlz0LH+MbMktKwm9vN/j8Q==", + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-13.3.2.tgz", + "integrity": "sha512-CQbKl57kdEv+KDLquhC+gE3pXt74LEAzm+tzywcA0/aHZuub8wTErbjAoNI57rPUWRYRNC5WUnNl8eGJNbDdwg==", "dev": true, "dependencies": { - "klona": "^2.0.4", "neo-async": "^2.6.2" }, "engines": { @@ -18011,7 +20538,7 @@ }, "peerDependencies": { "fibers": ">= 3.1.0", - "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0", + "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0", "sass": "^1.3.0", "sass-embedded": "*", "webpack": "^5.0.0" @@ -18032,10 +20559,23 @@ } }, "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 + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.3.0.tgz", + "integrity": "sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==", + "dev": true, + "optional": true + }, + "node_modules/saxes": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "dev": true, + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=10" + } }, "node_modules/schema-utils": { "version": "2.7.1", @@ -18172,7 +20712,8 @@ "node_modules/select": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/select/-/select-1.1.2.tgz", - "integrity": "sha512-OwpTSOfy6xSs1+pwcNrv0RBMOzI39Lp3qQKUTPVVPRjCdNa5JH/oPRiqsesIskK8TVgmRiHwO4KXlV2Li9dANA==" + "integrity": "sha512-OwpTSOfy6xSs1+pwcNrv0RBMOzI39Lp3qQKUTPVVPRjCdNa5JH/oPRiqsesIskK8TVgmRiHwO4KXlV2Li9dANA==", + "optional": true }, "node_modules/select-hose": { "version": "2.0.0", @@ -18181,11 +20722,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": { @@ -18230,9 +20772,9 @@ } }, "node_modules/send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", "dev": true, "dependencies": { "debug": "2.6.9", @@ -18268,15 +20810,6 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, - "node_modules/send/node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/send/node_modules/mime": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", @@ -18317,9 +20850,9 @@ } }, "node_modules/serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "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" @@ -18352,6 +20885,15 @@ "ms": "2.0.0" } }, + "node_modules/serve-index/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/serve-index/node_modules/http-errors": { "version": "1.6.3", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", @@ -18386,26 +20928,52 @@ "dev": true }, "node_modules/serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", "dev": true, "dependencies": { - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.18.0" + "send": "0.19.0" }, "engines": { "node": ">= 0.8.0" } }, + "node_modules/serve-static/node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", "dev": true }, + "node_modules/set-function-length": { + "version": "1.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-value": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", @@ -18500,15 +21068,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" @@ -18520,6 +21101,109 @@ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true }, + "node_modules/sigstore": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-1.9.0.tgz", + "integrity": "sha512-0Zjz0oe37d08VeOtBIuB6cRriqXse2e8w+7yIy2XSXjshRKxbc2KkhXjL229jXSxEm7UbcjS76wcJDGQddVI9A==", + "dev": true, + "dependencies": { + "@sigstore/bundle": "^1.1.0", + "@sigstore/protobuf-specs": "^0.2.0", + "@sigstore/sign": "^1.0.0", + "@sigstore/tuf": "^1.0.3", + "make-fetch-happen": "^11.0.1" + }, + "bin": { + "sigstore": "bin/sigstore.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/sigstore/node_modules/@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/sigstore/node_modules/http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/sigstore/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/sigstore/node_modules/make-fetch-happen": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", + "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", + "dev": true, + "dependencies": { + "agentkeepalive": "^4.2.1", + "cacache": "^17.0.0", + "http-cache-semantics": "^4.1.1", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.7.1", + "minipass": "^5.0.0", + "minipass-fetch": "^3.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^7.0.0", + "ssri": "^10.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/sigstore/node_modules/minipass-fetch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.5.tgz", + "integrity": "sha512-2N8elDQAtSnFV0Dk7gt15KHsS0Fyz6CbYZ360h0WTYV1Ty46li3rAXVOQj1THMNLdmrD9Vt5pBPtWtVkpwGBqg==", + "dev": true, + "dependencies": { + "minipass": "^7.0.3", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, + "node_modules/sigstore/node_modules/minipass-fetch/node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -18792,20 +21476,21 @@ } }, "node_modules/socket.io": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.6.1.tgz", - "integrity": "sha512-KMcaAi4l/8+xEjkRICl6ak8ySoxsYG+gG6/XfRCPJPQ/haCRIJBTL4wIl8YCsmtaBovcAXGLOShyVWQ/FG8GZA==", + "version": "4.7.5", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.7.5.tgz", + "integrity": "sha512-DmeAkF6cwM9jSfmp6Dr/5/mfMwb5Z5qRrSXLpo3Fq5SqyU8CMF15jIN4ZhfSwu35ksM1qmHZDQ/DK5XTccSTvA==", "dev": true, "dependencies": { "accepts": "~1.3.4", "base64id": "~2.0.0", + "cors": "~2.8.5", "debug": "~4.3.2", - "engine.io": "~6.4.1", + "engine.io": "~6.5.2", "socket.io-adapter": "~2.5.2", - "socket.io-parser": "~4.2.1" + "socket.io-parser": "~4.2.4" }, "engines": { - "node": ">=10.0.0" + "node": ">=10.2.0" } }, "node_modules/socket.io-adapter": { @@ -18818,9 +21503,9 @@ } }, "node_modules/socket.io-parser": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.3.tgz", - "integrity": "sha512-JMafRntWVO2DCJimKsRTh/wnqVvO4hrfwOqtO7f+uzwsQMuxO6VwImtYxaQ+ieoyshWOTJyV0fA21lccEXRPpQ==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", + "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", "dev": true, "dependencies": { "@socket.io/component-emitter": "~3.1.0", @@ -18842,16 +21527,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" } }, @@ -18869,12 +21554,6 @@ "node": ">= 10" } }, - "node_modules/socks/node_modules/ip": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", - "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==", - "dev": true - }, "node_modules/source-list-map": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", @@ -18899,9 +21578,9 @@ } }, "node_modules/source-map-loader": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-4.0.0.tgz", - "integrity": "sha512-i3KVgM3+QPAHNbGavK+VBq03YoJl24m9JWNbLgsjTj8aJzXG9M61bantBTNBt7CNwY2FYf+RJRYJ3pzalKjIrw==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-4.0.1.tgz", + "integrity": "sha512-oqXpzDIByKONVY8g1NUPOTQhe0UTU5bWUl32GSkqK2LjJj0HmwTMVKxcUip0RgAYhY1mqgOxjbQM48a0mmeNfA==", "dev": true, "dependencies": { "abab": "^2.0.6", @@ -19066,7 +21745,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "dev": true, "dependencies": { "extend-shallow": "^3.0.0" }, @@ -19081,9 +21759,9 @@ "dev": true }, "node_modules/sshpk": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", - "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz", + "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==", "dev": true, "dependencies": { "asn1": "~0.2.3", @@ -19106,15 +21784,24 @@ } }, "node_modules/ssri": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz", - "integrity": "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==", + "version": "10.0.6", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.6.tgz", + "integrity": "sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ==", "dev": true, "dependencies": { - "minipass": "^3.1.1" + "minipass": "^7.0.3" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/ssri/node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" } }, "node_modules/static-extend": { @@ -19387,6 +22074,21 @@ "node": ">=8" } }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/stringify-object": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", @@ -19413,6 +22115,19 @@ "node": ">=8" } }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", @@ -19443,54 +22158,28 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/stylis": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.1.3.tgz", - "integrity": "sha512-GP6WDNWf+o403jrEp9c5jibKavrtLW+/qYGhFxFrG8maXhwTBI7gLLhiBb0o7uFccWN+EOS9aMO6cGHWAO07OA==" - }, - "node_modules/stylus": { - "version": "0.59.0", - "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.59.0.tgz", - "integrity": "sha512-lQ9w/XIOH5ZHVNuNbWW8D822r+/wBSO/d6XvtyHLF7LW4KaCIDeVbvn5DF8fGCJAUCwVhVi/h6J0NUcnylUEjg==", + "node_modules/strong-log-transformer": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/strong-log-transformer/-/strong-log-transformer-2.1.0.tgz", + "integrity": "sha512-B3Hgul+z0L9a236FAUC9iZsL+nVHgoCJnqCbN588DjYxvGXaXaaFbfmQ/JhvKjZwsOukuR72XbHv71Qkug0HxA==", "dev": true, "dependencies": { - "@adobe/css-tools": "^4.0.1", - "debug": "^4.3.2", - "glob": "^7.1.6", - "sax": "~1.2.4", - "source-map": "^0.7.3" + "duplexer": "^0.1.1", + "minimist": "^1.2.0", + "through": "^2.3.4" }, "bin": { - "stylus": "bin/stylus" + "sl-log-transformer": "bin/sl-log-transformer.js" }, "engines": { - "node": "*" - }, - "funding": { - "url": "https://opencollective.com/stylus" + "node": ">=4" } }, - "node_modules/stylus-loader": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/stylus-loader/-/stylus-loader-7.0.0.tgz", - "integrity": "sha512-WTbtLrNfOfLgzTaR9Lj/BPhQroKk/LC1hfTXSUbrxmxgfUo3Y3LpmKRVA2R1XbjvTAvOfaian9vOyfv1z99E+A==", - "dev": true, - "dependencies": { - "fast-glob": "^3.2.11", - "klona": "^2.0.5", - "normalize-path": "^3.0.0" - }, - "engines": { - "node": ">= 14.15.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "stylus": ">=0.52.4", - "webpack": "^5.0.0" - } + "node_modules/stylis": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.1.3.tgz", + "integrity": "sha512-GP6WDNWf+o403jrEp9c5jibKavrtLW+/qYGhFxFrG8maXhwTBI7gLLhiBb0o7uFccWN+EOS9aMO6cGHWAO07OA==", + "optional": true }, "node_modules/supports-color": { "version": "5.5.0", @@ -19524,6 +22213,12 @@ "node": ">=0.10" } }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true + }, "node_modules/tapable": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", @@ -19534,20 +22229,20 @@ } }, "node_modules/tar": { - "version": "6.1.11", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", - "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", + "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": "^3.0.0", + "minipass": "^5.0.0", "minizlib": "^2.1.1", "mkdirp": "^1.0.3", "yallist": "^4.0.0" }, "engines": { - "node": ">= 10" + "node": ">=10" } }, "node_modules/tar-fs": { @@ -19584,14 +22279,38 @@ "node": ">=6" } }, + "node_modules/tar/node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/tar/node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/terser": { - "version": "5.14.2", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.14.2.tgz", - "integrity": "sha512-oL0rGeM/WFQCUd0y2QrWxYnq7tfSuKBiqTjRPWrRgB46WD/kiwHwF8T23z78H6Q6kGCuuHcPB+KULHRdxvVGQA==", + "version": "5.19.2", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.19.2.tgz", + "integrity": "sha512-qC5+dmecKJA4cpYxRa5aVkKehYsQKc+AHeKl0Oe62aYjBL8ZA33tTljktDHJSaxxMnbI5ZYw+o/S2DxxLu8OfA==", "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" }, @@ -19603,16 +22322,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" @@ -19636,10 +22355,16 @@ } } }, + "node_modules/terser-webpack-plugin/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, "node_modules/terser-webpack-plugin/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", @@ -19654,6 +22379,24 @@ "url": "https://opencollective.com/webpack" } }, + "node_modules/terser-webpack-plugin/node_modules/terser": { + "version": "5.31.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.31.1.tgz", + "integrity": "sha512-37upzU1+viGvuFtBo9NPufCb9dwM0+l9hMxYyWfBA+fbwrPqNJAhbZ6W47bBFnZHKHTUBnMvi87434qq+qnxOg==", + "dev": true, + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/terser/node_modules/commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", @@ -19743,7 +22486,8 @@ "node_modules/tiny-emitter": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz", - "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==" + "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==", + "optional": true }, "node_modules/tmp": { "version": "0.2.1", @@ -20240,9 +22984,9 @@ } }, "node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==" }, "node_modules/tsutils": { "version": "3.21.0", @@ -20271,10 +23015,108 @@ "integrity": "sha512-JVa5ijo+j/sOoHGjw0sxw734b1LhBkQ3bvUGNdxnVXDCX81Yx7TFgnZygxrIIWn23hbfTaMYLwRmAxFyDuFmIw==", "dev": true }, + "node_modules/tuf-js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-1.1.7.tgz", + "integrity": "sha512-i3P9Kgw3ytjELUfpuKVDNBJvk4u5bXL6gskv572mcevPbSKCV3zt3djhmlEQ65yERjIbOSncy7U4cQJaB1CBCg==", + "dev": true, + "dependencies": { + "@tufjs/models": "1.0.4", + "debug": "^4.3.4", + "make-fetch-happen": "^11.1.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/tuf-js/node_modules/@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/tuf-js/node_modules/http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/tuf-js/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/tuf-js/node_modules/make-fetch-happen": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", + "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", + "dev": true, + "dependencies": { + "agentkeepalive": "^4.2.1", + "cacache": "^17.0.0", + "http-cache-semantics": "^4.1.1", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.7.1", + "minipass": "^5.0.0", + "minipass-fetch": "^3.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^7.0.0", + "ssri": "^10.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/tuf-js/node_modules/minipass-fetch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.5.tgz", + "integrity": "sha512-2N8elDQAtSnFV0Dk7gt15KHsS0Fyz6CbYZ360h0WTYV1Ty46li3rAXVOQj1THMNLdmrD9Vt5pBPtWtVkpwGBqg==", + "dev": true, + "dependencies": { + "minipass": "^7.0.3", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, + "node_modules/tuf-js/node_modules/minipass-fetch/node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, "node_modules/tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", "dev": true, "dependencies": { "safe-buffer": "^5.0.1" @@ -20286,7 +23128,7 @@ "node_modules/tweetnacl": { "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", "dev": true }, "node_modules/type-check": { @@ -20338,9 +23180,9 @@ "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" }, "node_modules/typescript": { - "version": "4.8.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz", - "integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==", + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -20379,6 +23221,12 @@ "through": "^2.3.8" } }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true + }, "node_modules/unicode-canonical-property-names-ecmascript": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", @@ -20402,9 +23250,9 @@ } }, "node_modules/unicode-match-property-value-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz", - "integrity": "sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", + "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", "dev": true, "engines": { "node": ">=4" @@ -20546,9 +23394,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": [ { @@ -20558,14 +23406,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" @@ -20720,7 +23572,7 @@ "node_modules/verror": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", "dev": true, "engines": [ "node >=0.6.0" @@ -20731,6 +23583,61 @@ "extsprintf": "^1.2.0" } }, + "node_modules/vite": { + "version": "4.5.5", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.5.tgz", + "integrity": "sha512-ifW3Lb2sMdX+WU91s3R0FyQlAyLxOzCSCP37ujw0+r5POeHPwe6udWVIElKQq8gk3t7b8rkmvqC6IHBpCff4GQ==", + "dev": true, + "dependencies": { + "esbuild": "^0.18.10", + "postcss": "^8.4.27", + "rollup": "^3.27.1" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "@types/node": ">= 14", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, "node_modules/vm-browserify": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", @@ -20746,10 +23653,32 @@ "node": ">=0.10.0" } }, + "node_modules/w3c-hr-time": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + "deprecated": "Use your platform's native performance.now() and performance.timeOrigin.", + "dev": true, + "dependencies": { + "browser-process-hrtime": "^1.0.0" + } + }, + "node_modules/w3c-xmlserializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", + "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", + "dev": true, + "dependencies": { + "xml-name-validator": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/watchpack": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", - "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", + "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==", "dev": true, "dependencies": { "glob-to-regexp": "^0.4.1", @@ -21088,34 +24017,33 @@ "dev": true }, "node_modules/webpack": { - "version": "5.74.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.74.0.tgz", - "integrity": "sha512-A2InDwnhhGN4LYctJj6M1JEaGL7Luj6LOmyBHjcI8529cm5p6VXiTIW2sn6ffvEAKmveLzvu4jrihwXtPojlAA==", + "version": "5.94.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.94.0.tgz", + "integrity": "sha512-KcsGn50VT+06JH/iunZJedYGUJS5FGjow8wb9c0v5n1Om8O1g4L6LjtfxwlXIATopoQu+vOXXa7gYisWxCoPyg==", "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-attributes": "^1.9.5", + "browserslist": "^4.21.10", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.10.0", - "es-module-lexer": "^0.9.0", + "enhanced-resolve": "^5.17.1", + "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", + "graceful-fs": "^4.2.11", "json-parse-even-better-errors": "^2.3.1", "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", - "schema-utils": "^3.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": { @@ -21135,38 +24063,43 @@ } }, "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": "6.1.2", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-6.1.2.tgz", + "integrity": "sha512-Wu+EHmX326YPYUpQLKmKbTyZZJIB8/n6R09pTmB03kJmnMsVPTo9COzHZFr01txwaCAuZvfBJE4ZCHRcKs5JaQ==", "dev": true, "dependencies": { "colorette": "^2.0.10", - "memfs": "^3.4.3", + "memfs": "^3.4.12", "mime-types": "^2.1.31", "range-parser": "^1.2.1", "schema-utils": "^4.0.0" }, "engines": { - "node": ">= 12.13.0" + "node": ">= 14.15.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" }, "peerDependencies": { - "webpack": "^4.0.0 || ^5.0.0" + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + } } }, "node_modules/webpack-dev-middleware/node_modules/ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.16.0.tgz", + "integrity": "sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw==", "dev": true, "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", @@ -21186,9 +24119,9 @@ } }, "node_modules/webpack-dev-middleware/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/webpack-dev-middleware/node_modules/json-schema-traverse": { @@ -21198,15 +24131,15 @@ "dev": true }, "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" @@ -21217,9 +24150,9 @@ } }, "node_modules/webpack-dev-server": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.11.0.tgz", - "integrity": "sha512-L5S4Q2zT57SK7tazgzjMiSMBdsw+rGYIX27MgPgx7LDhWO0lViPrHKoLS7jo5In06PWYAhlYu3PbyoC6yAThbw==", + "version": "4.15.1", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.1.tgz", + "integrity": "sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA==", "dev": true, "dependencies": { "@types/bonjour": "^3.5.9", @@ -21228,7 +24161,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", @@ -21241,16 +24174,17 @@ "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", "schema-utils": "^4.0.0", - "selfsigned": "^2.0.1", + "selfsigned": "^2.1.1", "serve-index": "^1.9.1", "sockjs": "^0.3.24", "spdy": "^4.0.2", "webpack-dev-middleware": "^5.3.1", - "ws": "^8.4.2" + "ws": "^8.13.0" }, "bin": { "webpack-dev-server": "bin/webpack-dev-server.js" @@ -21266,21 +24200,24 @@ "webpack": "^4.37.0 || ^5.0.0" }, "peerDependenciesMeta": { + "webpack": { + "optional": true + }, "webpack-cli": { "optional": true } } }, "node_modules/webpack-dev-server/node_modules/ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "dev": true, "dependencies": { - "fast-deep-equal": "^3.1.1", + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "require-from-string": "^2.0.2" }, "funding": { "type": "github", @@ -21300,9 +24237,9 @@ } }, "node_modules/webpack-dev-server/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/webpack-dev-server/node_modules/json-schema-traverse": { @@ -21312,15 +24249,15 @@ "dev": true }, "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" @@ -21330,10 +24267,54 @@ "url": "https://opencollective.com/webpack" } }, + "node_modules/webpack-dev-server/node_modules/webpack-dev-middleware": { + "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", + "memfs": "^3.4.3", + "mime-types": "^2.1.31", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/webpack-dev-server/node_modules/ws": { + "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" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "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.9.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.9.0.tgz", + "integrity": "sha512-6NbRQw4+Sy50vYNTw7EyOn41OZItPiXB8GNv3INSoe3PSFaHJEz3SHTrYVaRm2LilNGnFUzh0FAwqPEmU/CwDg==", "dev": true, "dependencies": { "clone-deep": "^4.0.1", @@ -21374,9 +24355,9 @@ } }, "node_modules/webpack/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", @@ -21414,6 +24395,21 @@ "node": ">=0.8.0" } }, + "node_modules/whatwg-encoding": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "dev": true, + "dependencies": { + "iconv-lite": "0.4.24" + } + }, + "node_modules/whatwg-mimetype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", + "dev": true + }, "node_modules/whatwg-url": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", @@ -21449,9 +24445,9 @@ } }, "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": { @@ -21495,6 +24491,57 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, "node_modules/wrap-ansi/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -21554,6 +24601,18 @@ } } }, + "node_modules/xml-name-validator": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", + "dev": true + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true + }, "node_modules/xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", @@ -21587,28 +24646,42 @@ } }, "node_modules/yargs": { - "version": "17.5.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.5.1.tgz", - "integrity": "sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA==", + "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": "^7.0.2", + "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", - "yargs-parser": "^21.0.0" + "yargs-parser": "^21.1.1" }, "engines": { "node": ">=12" } }, - "node_modules/yargs/node_modules/yargs-parser": { - "version": "21.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.0.tgz", - "integrity": "sha512-z9kApYUOCwoeZ78rfRYYWdiU/iNL6mwwYlkkZfJoyMR1xps+NEBX5X7XmRpxkZHhXJ6+Ey00IwKxBBSW9FIjyA==", + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs/node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, "engines": { "node": ">=12" } @@ -21632,173 +24705,425 @@ "node": ">=6" } }, + "node_modules/yocto-queue": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.1.1.tgz", + "integrity": "sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==", + "dev": true, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/zone.js": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.11.4.tgz", - "integrity": "sha512-DDh2Ab+A/B+9mJyajPjHFPWfYU1H+pdun4wnnk0OcQTNjem1XQSZ2CDW+rfZEUDjv5M19SBqAkjZi0x5wuB5Qw==", + "version": "0.13.3", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.13.3.tgz", + "integrity": "sha512-MKPbmZie6fASC/ps4dkmIhaT5eonHkEt6eAy80K42tAm0G2W+AahLJjbfi6X9NPdciOE9GRFTTM8u2IiF6O3ww==", "dependencies": { - "tslib": "^2.0.0" + "tslib": "^2.3.0" } } }, "dependencies": { - "@adobe/css-tools": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.3.2.tgz", - "integrity": "sha512-DA5a1C0gD/pLOvhv33YMrbf2FK3oUzwNl9oOJqE4XVjuEtt6XIakRcsd7eLiOSPkp1kTRQGICTA8cKra/vFbjw==", - "dev": true - }, "@ampproject/remapping": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", - "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", "dev": true, "requires": { - "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/gen-mapping": "^0.3.0", "@jridgewell/trace-mapping": "^0.3.9" } }, "@angular-devkit/architect": { - "version": "0.1402.7", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1402.7.tgz", - "integrity": "sha512-YZchteri2iUq5JICSH0BQjOU3ehE57+CMU8PBigcJZiaLa/GPiCuwD9QOsnwSzHJNYYx5C94uhtZUjPwUtIAIw==", + "version": "0.1602.14", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1602.14.tgz", + "integrity": "sha512-eSdONEV5dbtLNiOMBy9Ue9DdJ1ct6dH9RdZfYiedq6VZn0lejePAjY36MYVXgq2jTE+v/uIiaNy7caea5pt55A==", "dev": true, "requires": { - "@angular-devkit/core": "14.2.7", - "rxjs": "6.6.7" + "@angular-devkit/core": "16.2.14", + "rxjs": "7.8.1" + }, + "dependencies": { + "rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dev": true, + "requires": { + "tslib": "^2.1.0" + } + } } }, "@angular-devkit/build-angular": { - "version": "14.2.7", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-14.2.7.tgz", - "integrity": "sha512-Y58kcEmy8bSFyODtUFQzkuoZHNCji3fzRwGCiQYdAh/mkBf53CuVWoT9q7MrvGOc7Nmo2JiuwR/b7c543eVgfw==", - "dev": true, - "requires": { - "@ampproject/remapping": "2.2.0", - "@angular-devkit/architect": "0.1402.7", - "@angular-devkit/build-webpack": "0.1402.7", - "@angular-devkit/core": "14.2.7", - "@babel/core": "7.18.10", - "@babel/generator": "7.18.12", - "@babel/helper-annotate-as-pure": "7.18.6", - "@babel/plugin-proposal-async-generator-functions": "7.18.10", - "@babel/plugin-transform-async-to-generator": "7.18.6", - "@babel/plugin-transform-runtime": "7.18.10", - "@babel/preset-env": "7.18.10", - "@babel/runtime": "7.18.9", - "@babel/template": "7.18.10", + "version": "16.2.16", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-16.2.16.tgz", + "integrity": "sha512-gEni21kza41xaRnVWP1sMuiWHS/rdoym5FEEGDo9PG60LwRC4lekIgT09GpTlmMu007UEfo0ccQnGroD6+MqWg==", + "dev": true, + "requires": { + "@ampproject/remapping": "2.2.1", + "@angular-devkit/architect": "0.1602.16", + "@angular-devkit/build-webpack": "0.1602.16", + "@angular-devkit/core": "16.2.16", + "@babel/core": "7.22.9", + "@babel/generator": "7.22.9", + "@babel/helper-annotate-as-pure": "7.22.5", + "@babel/helper-split-export-declaration": "7.22.6", + "@babel/plugin-proposal-async-generator-functions": "7.20.7", + "@babel/plugin-transform-async-to-generator": "7.22.5", + "@babel/plugin-transform-runtime": "7.22.9", + "@babel/preset-env": "7.22.9", + "@babel/runtime": "7.22.6", + "@babel/template": "7.22.5", "@discoveryjs/json-ext": "0.5.7", - "@ngtools/webpack": "14.2.7", + "@ngtools/webpack": "16.2.16", + "@vitejs/plugin-basic-ssl": "1.0.1", "ansi-colors": "4.1.3", - "babel-loader": "8.2.5", + "autoprefixer": "10.4.14", + "babel-loader": "9.1.3", "babel-plugin-istanbul": "6.1.1", - "browserslist": "^4.9.1", - "cacache": "16.1.2", + "browserslist": "^4.21.5", + "chokidar": "3.5.3", "copy-webpack-plugin": "11.0.0", - "critters": "0.0.16", - "css-loader": "6.7.1", - "esbuild": "0.15.5", - "esbuild-wasm": "0.15.5", - "glob": "8.0.3", + "critters": "0.0.20", + "css-loader": "6.8.1", + "esbuild": "0.18.17", + "esbuild-wasm": "0.18.17", + "fast-glob": "3.3.1", + "guess-parser": "0.4.22", "https-proxy-agent": "5.0.1", "inquirer": "8.2.4", - "jsonc-parser": "3.1.0", + "jsonc-parser": "3.2.0", "karma-source-map-support": "1.4.0", "less": "4.1.3", - "less-loader": "11.0.0", + "less-loader": "11.1.0", "license-webpack-plugin": "4.0.2", - "loader-utils": "3.2.0", - "mini-css-extract-plugin": "2.6.1", - "minimatch": "5.1.0", - "open": "8.4.0", + "loader-utils": "3.2.1", + "magic-string": "0.30.1", + "mini-css-extract-plugin": "2.7.6", + "mrmime": "1.0.1", + "open": "8.4.2", "ora": "5.4.1", - "parse5-html-rewriting-stream": "6.0.1", - "piscina": "3.2.0", - "postcss": "8.4.16", - "postcss-import": "15.0.0", - "postcss-loader": "7.0.1", - "postcss-preset-env": "7.8.0", - "regenerator-runtime": "0.13.9", + "parse5-html-rewriting-stream": "7.0.0", + "picomatch": "2.3.1", + "piscina": "4.0.0", + "postcss": "8.4.31", + "postcss-loader": "7.3.3", "resolve-url-loader": "5.0.0", - "rxjs": "6.6.7", - "sass": "1.54.4", - "sass-loader": "13.0.2", - "semver": "7.3.7", - "source-map-loader": "4.0.0", + "rxjs": "7.8.1", + "sass": "1.64.1", + "sass-loader": "13.3.2", + "semver": "7.5.4", + "source-map-loader": "4.0.1", "source-map-support": "0.5.21", - "stylus": "0.59.0", - "stylus-loader": "7.0.0", - "terser": "5.14.2", + "terser": "5.19.2", "text-table": "0.2.0", "tree-kill": "1.2.2", - "tslib": "2.4.0", - "webpack": "5.74.0", - "webpack-dev-middleware": "5.3.3", - "webpack-dev-server": "4.11.0", - "webpack-merge": "5.8.0", + "tslib": "2.6.1", + "vite": "4.5.5", + "webpack": "5.94.0", + "webpack-dev-middleware": "6.1.2", + "webpack-dev-server": "4.15.1", + "webpack-merge": "5.9.0", "webpack-subresource-integrity": "5.1.0" }, "dependencies": { - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "@angular-devkit/architect": { + "version": "0.1602.16", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1602.16.tgz", + "integrity": "sha512-aWEeGU4UlbrSKpcAZsldVNxNXAWEeu9hM2BPk77GftbRC8PBMWpgYyrJWTz2ryn8aSmGKT3T8OyBH4gZA/667w==", "dev": true, "requires": { - "balanced-match": "^1.0.0" + "@angular-devkit/core": "16.2.16", + "rxjs": "7.8.1" } }, - "glob": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz", - "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", + "@angular-devkit/core": { + "version": "16.2.16", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-16.2.16.tgz", + "integrity": "sha512-5xHs9JFmp78sydrOAg0UGErxfMVv5c2f3RXoikS7eBOOXTWEi5pmnOkOvSJ3loQFGVs3Y7i+u02G3VrF5ZxOrA==", "dev": true, "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" + "ajv": "8.12.0", + "ajv-formats": "2.1.1", + "jsonc-parser": "3.2.0", + "picomatch": "2.3.1", + "rxjs": "7.8.1", + "source-map": "0.7.4" + }, + "dependencies": { + "ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + } } }, - "minimatch": { + "@babel/core": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.9.tgz", + "integrity": "sha512-G2EgeufBcYw27U4hhoIwFcgc1XU7TlXJ3mv04oOv1WCuo900U/anZSPzEqNjwdjgffkk2Gs0AN0dW1CKVLcG7w==", + "dev": true, + "requires": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.5", + "@babel/generator": "^7.22.9", + "@babel/helper-compilation-targets": "^7.22.9", + "@babel/helper-module-transforms": "^7.22.9", + "@babel/helpers": "^7.22.6", + "@babel/parser": "^7.22.7", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.8", + "@babel/types": "^7.22.5", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.2", + "semver": "^6.3.1" + }, + "dependencies": { + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + } + } + }, + "ajv": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.16.0.tgz", + "integrity": "sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.3", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.4.1" + } + }, + "ajv-keywords": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", - "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", "dev": true, "requires": { - "brace-expansion": "^2.0.1" + "fast-deep-equal": "^3.1.3" + } + }, + "babel-loader": { + "version": "9.1.3", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.3.tgz", + "integrity": "sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw==", + "dev": true, + "requires": { + "find-cache-dir": "^4.0.0", + "schema-utils": "^4.0.0" + } + }, + "find-cache-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz", + "integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==", + "dev": true, + "requires": { + "common-path-prefix": "^3.0.0", + "pkg-dir": "^7.0.0" + } + }, + "find-up": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", + "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", + "dev": true, + "requires": { + "locate-path": "^7.1.0", + "path-exists": "^5.0.0" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "locate-path": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", + "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", + "dev": true, + "requires": { + "p-locate": "^6.0.0" + } + }, + "p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "dev": true, + "requires": { + "yocto-queue": "^1.0.0" + } + }, + "p-locate": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "dev": true, + "requires": { + "p-limit": "^4.0.0" + } + }, + "path-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "dev": true + }, + "pkg-dir": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", + "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==", + "dev": true, + "requires": { + "find-up": "^6.3.0" + } + }, + "rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dev": true, + "requires": { + "tslib": "^2.1.0" + } + }, + "schema-utils": { + "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, + "requires": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + } + }, + "semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" } + }, + "source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "dev": true } } }, "@angular-devkit/build-webpack": { - "version": "0.1402.7", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1402.7.tgz", - "integrity": "sha512-aDhS/ODt8BwgtnNN73R7SuMC1GgoT5Pajn1nnIWvvpGj8XchLUbguptyl2v7D2QeYXXsd34Gtx8cDOr9PxYFTA==", + "version": "0.1602.16", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1602.16.tgz", + "integrity": "sha512-b99Sj0btI0C2GIfzoyP8epDMIOLqSTqXOxw6klGtBLaGZfM5KAxqFzekXh8cAnHxWCj20WdNhezS1eUTLOkaIA==", "dev": true, "requires": { - "@angular-devkit/architect": "0.1402.7", - "rxjs": "6.6.7" + "@angular-devkit/architect": "0.1602.16", + "rxjs": "7.8.1" + }, + "dependencies": { + "@angular-devkit/architect": { + "version": "0.1602.16", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1602.16.tgz", + "integrity": "sha512-aWEeGU4UlbrSKpcAZsldVNxNXAWEeu9hM2BPk77GftbRC8PBMWpgYyrJWTz2ryn8aSmGKT3T8OyBH4gZA/667w==", + "dev": true, + "requires": { + "@angular-devkit/core": "16.2.16", + "rxjs": "7.8.1" + } + }, + "@angular-devkit/core": { + "version": "16.2.16", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-16.2.16.tgz", + "integrity": "sha512-5xHs9JFmp78sydrOAg0UGErxfMVv5c2f3RXoikS7eBOOXTWEi5pmnOkOvSJ3loQFGVs3Y7i+u02G3VrF5ZxOrA==", + "dev": true, + "requires": { + "ajv": "8.12.0", + "ajv-formats": "2.1.1", + "jsonc-parser": "3.2.0", + "picomatch": "2.3.1", + "rxjs": "7.8.1", + "source-map": "0.7.4" + } + }, + "ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dev": true, + "requires": { + "tslib": "^2.1.0" + } + }, + "source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "dev": true + } } }, "@angular-devkit/core": { - "version": "14.2.7", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-14.2.7.tgz", - "integrity": "sha512-83SCYP3h6fglWMgAXFDc8HfOxk9t3ugK0onATXchctvA7blW4Vx8BSg3/DgbqCv+fF380SN8bYqqLJl8fQFdzg==", + "version": "16.2.14", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-16.2.14.tgz", + "integrity": "sha512-Ui14/d2+p7lnmXlK/AX2ieQEGInBV75lonNtPQgwrYgskF8ufCuN0DyVZQUy9fJDkC+xQxbJyYrby/BS0R0e7w==", "dev": true, "requires": { - "ajv": "8.11.0", + "ajv": "8.12.0", "ajv-formats": "2.1.1", - "jsonc-parser": "3.1.0", - "rxjs": "6.6.7", + "jsonc-parser": "3.2.0", + "picomatch": "2.3.1", + "rxjs": "7.8.1", "source-map": "0.7.4" }, "dependencies": { "ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", @@ -21813,6 +25138,15 @@ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true }, + "rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dev": true, + "requires": { + "tslib": "^2.1.0" + } + }, "source-map": { "version": "0.7.4", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", @@ -21822,342 +25156,332 @@ } }, "@angular-devkit/schematics": { - "version": "14.2.7", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-14.2.7.tgz", - "integrity": "sha512-3e2dpFXWl2Z4Gfm+KgY3gAeqsyu8utJMcDIg5sWRAXDeJJdAPc5LweCa8YZEn33Zr9cl8oK+FxlOr15RCyWLcA==", + "version": "16.2.14", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-16.2.14.tgz", + "integrity": "sha512-B6LQKInCT8w5zx5Pbroext5eFFRTCJdTwHN8GhcVS8IeKCnkeqVTQLjB4lBUg7LEm8Y7UHXwzrVxmk+f+MBXhw==", "dev": true, "requires": { - "@angular-devkit/core": "14.2.7", - "jsonc-parser": "3.1.0", - "magic-string": "0.26.2", + "@angular-devkit/core": "16.2.14", + "jsonc-parser": "3.2.0", + "magic-string": "0.30.1", "ora": "5.4.1", - "rxjs": "6.6.7" + "rxjs": "7.8.1" + }, + "dependencies": { + "rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dev": true, + "requires": { + "tslib": "^2.1.0" + } + } } }, "@angular-eslint/builder": { - "version": "14.1.2", - "resolved": "https://registry.npmjs.org/@angular-eslint/builder/-/builder-14.1.2.tgz", - "integrity": "sha512-J+LRidjlJOGfRNXJwUyOhz5TnasEBK+kL3QkkCE4ZSt/dH40QqT+3q9qV5zc45wdaAeJM4/jp1IhI6kPwWI5Yw==", + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/builder/-/builder-16.3.1.tgz", + "integrity": "sha512-PmIOnRwqdOW1bvZtpTGBTDcOq/Czm3D+IPC/k90yIMs1VsAtcxqUmUtELje+ylJeb2LPeEZavekSnEpcatM4HQ==", "dev": true, - "requires": {} + "requires": { + "@nx/devkit": "16.5.1", + "nx": "16.5.1" + } }, "@angular-eslint/bundled-angular-compiler": { - "version": "14.1.2", - "resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-14.1.2.tgz", - "integrity": "sha512-d5/jTKXP+t9hNSucj3m8zZYBl62fZ2xFMVNbAOArYAkA7WwwX3D7Gae57BNW54cd2fl2/is7Dn6UgYhu1wqkSQ==", + "version": "15.2.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-15.2.1.tgz", + "integrity": "sha512-LO7Am8eVCr7oh6a0VmKSL7K03CnQEQhFO7Wt/YtbfYOxVjrbwmYLwJn+wZPOT7A02t/BttOD/WXuDrOWtSMQ/Q==", "dev": true }, "@angular-eslint/eslint-plugin": { - "version": "14.1.2", - "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-14.1.2.tgz", - "integrity": "sha512-5pJaTcFfM7yDHNtMxw3uNTpBTLjNYH9mlOLX5FFQ9EahAuycwCtV8VJkIntK2ZiOTdRVJYA9/PEdD/xVxX02rw==", + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-16.3.1.tgz", + "integrity": "sha512-kSc8ESfoy8TUSthbq0Lpq9e17I+3Smy4rHoNpKCFEGuJgPs0+OssZMxB6a5EawGbv2EKTPEtrxzFm1WsLR0U9Q==", "dev": true, "requires": { - "@angular-eslint/utils": "14.1.2", - "@typescript-eslint/utils": "5.37.0" + "@angular-eslint/utils": "16.3.1", + "@typescript-eslint/utils": "5.62.0" } }, "@angular-eslint/eslint-plugin-template": { - "version": "14.1.2", - "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-14.1.2.tgz", - "integrity": "sha512-gMgYJ8ZwPvq2H/YEzPztVRAK2NYs2cJFUDZD4iGjSRtDgYq9OHjyTo+r6tkcyjcK2qvesy0RccHQKh+x3hYMTA==", + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-16.3.1.tgz", + "integrity": "sha512-+RcFEWqNiRt3+5jXvmlIDlXtP9+vjdmgmVL6tt8yDbqdjBOewtyMu4pE4YaR4sFboyxgME9PbO2WrOyPXh6xjg==", "dev": true, "requires": { - "@angular-eslint/bundled-angular-compiler": "14.1.2", - "@typescript-eslint/type-utils": "5.37.0", - "@typescript-eslint/utils": "5.37.0", - "aria-query": "5.0.2", - "axobject-query": "3.0.1" + "@angular-eslint/bundled-angular-compiler": "16.3.1", + "@angular-eslint/utils": "16.3.1", + "@typescript-eslint/type-utils": "5.62.0", + "@typescript-eslint/utils": "5.62.0", + "aria-query": "5.3.0", + "axobject-query": "4.0.0" + }, + "dependencies": { + "@angular-eslint/bundled-angular-compiler": { + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-16.3.1.tgz", + "integrity": "sha512-m4WP1xwS9XLcC/3n6lIcG5HZoai/5eb5W3xm48GVcv//0qE2p7S96RSgKPgGHvif5pF8O9xAqEWs3gDEG45+7A==", + "dev": true + } } }, "@angular-eslint/schematics": { - "version": "14.0.1", - "resolved": "https://registry.npmjs.org/@angular-eslint/schematics/-/schematics-14.0.1.tgz", - "integrity": "sha512-TlsqLZ/QpUeHFm2U5xxxIFdAYiQe57FDcAVSVkscpV+YzCd177XPYD37Zk/NUBH3eFQ+uDmlVMZbfPl5CUaUVA==", + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/schematics/-/schematics-16.3.1.tgz", + "integrity": "sha512-cqrdobdtRY2XjLa6PhuGOQ7UhTRk2AvWS01sKeGjZ94nQJm5NUtEUyf6u3deIPYllW7gSAWjYzKUObKcTW/R+g==", "dev": true, "requires": { - "@angular-eslint/eslint-plugin": "14.0.1", - "@angular-eslint/eslint-plugin-template": "14.0.1", - "ignore": "5.2.0", + "@angular-eslint/eslint-plugin": "16.3.1", + "@angular-eslint/eslint-plugin-template": "16.3.1", + "@nx/devkit": "16.5.1", + "ignore": "5.2.4", + "nx": "16.5.1", "strip-json-comments": "3.1.1", "tmp": "0.2.1" + } + }, + "@angular-eslint/template-parser": { + "version": "15.2.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/template-parser/-/template-parser-15.2.1.tgz", + "integrity": "sha512-ViCi79gC2aKJecmYLkOT+QlT5WMRNXeYz0Dr9Pr8qXzIbY0oAWE7nOT5jkXwQ9oUk+ybtGCWHma5JVJWVJsIog==", + "dev": true, + "requires": { + "@angular-eslint/bundled-angular-compiler": "15.2.1", + "eslint-scope": "^7.0.0" }, "dependencies": { - "@angular-eslint/bundled-angular-compiler": { - "version": "14.0.1", - "resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-14.0.1.tgz", - "integrity": "sha512-DOED3Y74k3tv63Io/4Rg43/HPGjR16CyKhX/OviFl8dxxPYTp53bIIgYwoQG6dLDx33ZYjzxP5iufvDvfhHlWg==", - "dev": true - }, - "@angular-eslint/eslint-plugin": { - "version": "14.0.1", - "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-14.0.1.tgz", - "integrity": "sha512-QJ8GN1PmCDnDNlGNz5QCUSKjcGYhxt5Hz1xe+vSU5BZDr9SA3FfF9yYisFW+DjI9+GfgzWVqhxT9/ueIdJpZzg==", - "dev": true, - "requires": { - "@angular-eslint/utils": "14.0.1", - "@typescript-eslint/utils": "5.29.0" - } - }, - "@angular-eslint/eslint-plugin-template": { - "version": "14.0.1", - "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-14.0.1.tgz", - "integrity": "sha512-/D6kzmzzFJKDPd+PmJ3N7tZiahbnDZndndcKFP9FiiYXLRM8knhpLc92jGahJk3pZvxh04GOPKgg4FhkNa3XYQ==", - "dev": true, - "requires": { - "@angular-eslint/bundled-angular-compiler": "14.0.1", - "@typescript-eslint/utils": "5.29.0", - "aria-query": "5.0.0", - "axobject-query": "3.0.1" - } - }, - "@angular-eslint/utils": { - "version": "14.0.1", - "resolved": "https://registry.npmjs.org/@angular-eslint/utils/-/utils-14.0.1.tgz", - "integrity": "sha512-nPipaVEi8fL6EylmqPyMh+U30LqPcFOa+rN3akfe1T+z/Pdrg+hxH7qE+4ZG6jS0TuDOKycc7gniu0Ol1KmhXA==", - "dev": true, - "requires": { - "@angular-eslint/bundled-angular-compiler": "14.0.1", - "@typescript-eslint/utils": "5.29.0" - } - }, - "@typescript-eslint/scope-manager": { - "version": "5.29.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.29.0.tgz", - "integrity": "sha512-etbXUT0FygFi2ihcxDZjz21LtC+Eps9V2xVx09zFoN44RRHPrkMflidGMI+2dUs821zR1tDS6Oc9IXxIjOUZwA==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.29.0", - "@typescript-eslint/visitor-keys": "5.29.0" - } - }, - "@typescript-eslint/types": { - "version": "5.29.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.29.0.tgz", - "integrity": "sha512-X99VbqvAXOMdVyfFmksMy3u8p8yoRGITgU1joBJPzeYa0rhdf5ok9S56/itRoUSh99fiDoMtarSIJXo7H/SnOg==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "5.29.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.29.0.tgz", - "integrity": "sha512-mQvSUJ/JjGBdvo+1LwC+GY2XmSYjK1nAaVw2emp/E61wEVYEyibRHCqm1I1vEKbXCpUKuW4G7u9ZCaZhJbLoNQ==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.29.0", - "@typescript-eslint/visitor-keys": "5.29.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/utils": { - "version": "5.29.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.29.0.tgz", - "integrity": "sha512-3Eos6uP1nyLOBayc/VUdKZikV90HahXE5Dx9L5YlSd/7ylQPXhLk1BYb29SDgnBnTp+jmSZUU0QxUiyHgW4p7A==", - "dev": true, - "requires": { - "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.29.0", - "@typescript-eslint/types": "5.29.0", - "@typescript-eslint/typescript-estree": "5.29.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0" - } - }, - "@typescript-eslint/visitor-keys": { - "version": "5.29.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.29.0.tgz", - "integrity": "sha512-Hpb/mCWsjILvikMQoZIE3voc9wtQcS0A9FUw3h8bhr9UxBdtI/tw1ZDZUOXHXLOVMedKCH5NxyzATwnU78bWCQ==", + "eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, "requires": { - "@typescript-eslint/types": "5.29.0", - "eslint-visitor-keys": "^3.3.0" + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" } }, - "aria-query": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.0.0.tgz", - "integrity": "sha512-V+SM7AbUwJ+EBnB8+DXs0hPZHO0W6pqBcc0dW90OwtVG02PswOu/teuARoLQjdDOH+t9pJgGnW5/Qmouf3gPJg==", + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true - }, - "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } } } }, - "@angular-eslint/template-parser": { - "version": "14.1.2", - "resolved": "https://registry.npmjs.org/@angular-eslint/template-parser/-/template-parser-14.1.2.tgz", - "integrity": "sha512-bQI+poQDIyR3OU9EQzJeLYRtmsvjFGtV5dc+4XPJ6eIyRAc8baCG/0V/cOrpofIdSf7e/sCV8H7rXcFg6tSdUw==", - "dev": true, - "requires": { - "@angular-eslint/bundled-angular-compiler": "14.1.2", - "eslint-scope": "^5.1.0" - } - }, "@angular-eslint/utils": { - "version": "14.1.2", - "resolved": "https://registry.npmjs.org/@angular-eslint/utils/-/utils-14.1.2.tgz", - "integrity": "sha512-EtblG9zO0+kWG9EHsoEshFKvsH5DMSK1DqwQsNOVGAF0Aa5DFOqrwouJUyBNJ0d4fSWI9QcuzVkZ1x9JyLIeXQ==", + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/utils/-/utils-16.3.1.tgz", + "integrity": "sha512-tEBcce0rG+DmcPO8jhRffUFDioGw3G4cUAE15XlRctY1J3QzOBH9HdUOTDt0mMjBgpWCzh0YVT1Moh2bPXU9Xg==", "dev": true, "requires": { - "@angular-eslint/bundled-angular-compiler": "14.1.2", - "@typescript-eslint/utils": "5.37.0" + "@angular-eslint/bundled-angular-compiler": "16.3.1", + "@typescript-eslint/utils": "5.62.0" + }, + "dependencies": { + "@angular-eslint/bundled-angular-compiler": { + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-16.3.1.tgz", + "integrity": "sha512-m4WP1xwS9XLcC/3n6lIcG5HZoai/5eb5W3xm48GVcv//0qE2p7S96RSgKPgGHvif5pF8O9xAqEWs3gDEG45+7A==", + "dev": true + } } }, "@angular/animations": { - "version": "14.2.8", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-14.2.8.tgz", - "integrity": "sha512-9YKmaebHW1F/N63TS1EboBQ5Gniq1ogWQ2XEypy057LfcnoPtVkRbAsl2pUJWbUjDZK9f2BpWfXXm9i5ZxIW3A==", + "version": "16.2.12", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-16.2.12.tgz", + "integrity": "sha512-MD0ElviEfAJY8qMOd6/jjSSvtqER2RDAi0lxe6EtUacC1DHCYkaPrKW4vLqY+tmZBg1yf+6n+uS77pXcHHcA3w==", "requires": { "tslib": "^2.3.0" } }, "@angular/cdk": { - "version": "14.2.6", - "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-14.2.6.tgz", - "integrity": "sha512-sihrwk/0emYbE2X+DOIlan7mohED9pKiH2gQh2hk3Ud8jjeW6VmbaGtTCkjs+HRbFc9/44uDHasizxrKnjseyw==", + "version": "16.2.14", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-16.2.14.tgz", + "integrity": "sha512-n6PrGdiVeSTEmM/HEiwIyg6YQUUymZrb5afaNLGFRM5YL0Y8OBqd+XhCjb0OfD/AfgCUtedVEPwNqrfW8KzgGw==", "requires": { - "parse5": "^5.0.0", + "parse5": "^7.1.2", "tslib": "^2.3.0" + }, + "dependencies": { + "parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "optional": true, + "requires": { + "entities": "^4.4.0" + } + } } }, "@angular/cli": { - "version": "14.2.7", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-14.2.7.tgz", - "integrity": "sha512-RM4CJwtqD7cKFQ7hNGJ56s9YMeJxYqCN5Ss0SzsKN1nXYqz8HykMW8fhUbZQ9HFVy/Ml3LGoh1yGo/tXywAWcA==", + "version": "16.2.14", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-16.2.14.tgz", + "integrity": "sha512-0y71jtitigVolm4Rim1b8xPQ+B22cGp4Spef2Wunpqj67UowN6tsZaVuWBEQh4u5xauX8LAHKqsvy37ZPWCc4A==", "dev": true, "requires": { - "@angular-devkit/architect": "0.1402.7", - "@angular-devkit/core": "14.2.7", - "@angular-devkit/schematics": "14.2.7", - "@schematics/angular": "14.2.7", + "@angular-devkit/architect": "0.1602.14", + "@angular-devkit/core": "16.2.14", + "@angular-devkit/schematics": "16.2.14", + "@schematics/angular": "16.2.14", "@yarnpkg/lockfile": "1.1.0", "ansi-colors": "4.1.3", - "debug": "4.3.4", - "ini": "3.0.0", + "ini": "4.1.1", "inquirer": "8.2.4", - "jsonc-parser": "3.1.0", - "npm-package-arg": "9.1.0", - "npm-pick-manifest": "7.0.1", - "open": "8.4.0", + "jsonc-parser": "3.2.0", + "npm-package-arg": "10.1.0", + "npm-pick-manifest": "8.0.1", + "open": "8.4.2", "ora": "5.4.1", - "pacote": "13.6.2", - "resolve": "1.22.1", - "semver": "7.3.7", + "pacote": "15.2.0", + "resolve": "1.22.2", + "semver": "7.5.4", "symbol-observable": "4.0.0", - "uuid": "8.3.2", - "yargs": "17.5.1" + "yargs": "17.7.2" }, "dependencies": { - "ini": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-3.0.0.tgz", - "integrity": "sha512-TxYQaeNW/N8ymDvwAxPyRbhMBtnEwuvaTYpOQkFx1nSeusgezHniEc/l35Vo4iCq/mMiTJbpD7oYxN98hFlfmw==", - "dev": true + "semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } } } }, "@angular/common": { - "version": "14.2.8", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-14.2.8.tgz", - "integrity": "sha512-JSPN2h1EcyWjHWtOzRQmoX48ZacTjLAYwW9ZRmBpYs6Ptw5xZ39ARTJfQNcNnJleqYju2E6BNkGnLpbtWQjNDA==", + "version": "16.2.12", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-16.2.12.tgz", + "integrity": "sha512-B+WY/cT2VgEaz9HfJitBmgdk4I333XG/ybC98CMC4Wz8E49T8yzivmmxXB3OD6qvjcOB6ftuicl6WBqLbZNg2w==", "requires": { "tslib": "^2.3.0" } }, "@angular/compiler": { - "version": "14.2.8", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-14.2.8.tgz", - "integrity": "sha512-lKwp3B4ZKNLgk/25Iyur8bjAwRL20auRoB4EuHrBf+928ftsjYUXTgi+0++DUjPENbpi59k6GcvMCNa6qccvIw==", + "version": "16.2.12", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-16.2.12.tgz", + "integrity": "sha512-6SMXUgSVekGM7R6l1Z9rCtUGtlg58GFmgbpMCsGf+VXxP468Njw8rjT2YZkf5aEPxEuRpSHhDYjqz7n14cwCXQ==", "requires": { "tslib": "^2.3.0" } }, "@angular/compiler-cli": { - "version": "14.2.8", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-14.2.8.tgz", - "integrity": "sha512-QTftNrAyXOWzKFGY6/i9jh0LB2cOxmykepG4c53wH9LblGvWFztlVOhcoU8tpQSSH8t3EYvGs2r8oUuxcYm5Cw==", + "version": "16.2.12", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-16.2.12.tgz", + "integrity": "sha512-pWSrr152562ujh6lsFZR8NfNc5Ljj+zSTQO44DsuB0tZjwEpnRcjJEgzuhGXr+CoiBf+jTSPZKemtSktDk5aaA==", "dev": true, "requires": { - "@babel/core": "^7.17.2", + "@babel/core": "7.23.2", + "@jridgewell/sourcemap-codec": "^1.4.14", "chokidar": "^3.0.0", "convert-source-map": "^1.5.1", - "dependency-graph": "^0.11.0", - "magic-string": "^0.26.0", "reflect-metadata": "^0.1.2", "semver": "^7.0.0", - "sourcemap-codec": "^1.4.8", "tslib": "^2.3.0", "yargs": "^17.2.1" } }, "@angular/core": { - "version": "14.2.8", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-14.2.8.tgz", - "integrity": "sha512-cgnII9vJGJDLsfr7KsBfU2l+QQUmQIRIP3ImKhBxicw2IHKCSb2mYwoeLV46jaLyHyUMTLRHKUYUR4XtSPnb8A==", - "requires": { - "tslib": "^2.3.0" - } - }, - "@angular/flex-layout": { - "version": "14.0.0-beta.41", - "resolved": "https://registry.npmjs.org/@angular/flex-layout/-/flex-layout-14.0.0-beta.41.tgz", - "integrity": "sha512-x1YcxqkdFlcbVXEy9ebCgW/F+7n/MXkEkwEcVEIPf5v5qn7HZsjQxgIj35Lf0amvMyF7h35prpoxO1uX5+ntFg==", + "version": "16.2.12", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-16.2.12.tgz", + "integrity": "sha512-GLLlDeke/NjroaLYOks0uyzFVo6HyLl7VOm0K1QpLXnYvW63W9Ql/T3yguRZa7tRkOAeFZ3jw+1wnBD4O8MoUA==", "requires": { "tslib": "^2.3.0" } }, "@angular/forms": { - "version": "14.2.8", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-14.2.8.tgz", - "integrity": "sha512-OaL7Gi6STxJza7yn0qgmh6+hV6NVbtGmunpzrn9cR1k5TeE4ZtXu1z7VZesbZ9kZ3F6U9CmygFt0csf7j1d+Ow==", + "version": "16.2.12", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-16.2.12.tgz", + "integrity": "sha512-1Eao89hlBgLR3v8tU91vccn21BBKL06WWxl7zLpQmG6Hun+2jrThgOE4Pf3os4fkkbH4Apj0tWL2fNIWe/blbw==", "requires": { "tslib": "^2.3.0" } }, "@angular/language-service": { - "version": "14.2.8", - "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-14.2.8.tgz", - "integrity": "sha512-XvLmZB2RbawDjJSwU41XoZvmkHGnKTZ4gM6LyNnER2rSaEQVHmADh39UF/hAHeEosHVeau/PKAvwIcxyPW6YxA==", + "version": "16.2.12", + "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-16.2.12.tgz", + "integrity": "sha512-sZwB+ZEjChx9EYcqPaS4OnhC/q5RcedZjIdM9mCxuU/MtseURRYRI/8Hnm1RHo9qyc5PmsQpg7p9Vp/5hXLUjw==", "dev": true }, "@angular/material": { - "version": "14.2.6", - "resolved": "https://registry.npmjs.org/@angular/material/-/material-14.2.6.tgz", - "integrity": "sha512-HykrjDdDoH03oJkV6REW4cx8mVku38LPAagnfJVtqaKsNxG2KtF+LkSlkumeL2cqacFGen/Pf3QV8hxo4FLWhQ==", - "requires": { + "version": "16.2.14", + "resolved": "https://registry.npmjs.org/@angular/material/-/material-16.2.14.tgz", + "integrity": "sha512-zQIxUb23elPfiIvddqkIDYqQhAHa9ZwMblfbv+ug8bxr4D0Dw360jIarxCgMjAcLj7Ccl3GBqZMUnVeM6cjthw==", + "requires": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/auto-init": "15.0.0-canary.bc9ae6c9c.0", + "@material/banner": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/button": "15.0.0-canary.bc9ae6c9c.0", + "@material/card": "15.0.0-canary.bc9ae6c9c.0", + "@material/checkbox": "15.0.0-canary.bc9ae6c9c.0", + "@material/chips": "15.0.0-canary.bc9ae6c9c.0", + "@material/circular-progress": "15.0.0-canary.bc9ae6c9c.0", + "@material/data-table": "15.0.0-canary.bc9ae6c9c.0", + "@material/density": "15.0.0-canary.bc9ae6c9c.0", + "@material/dialog": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/drawer": "15.0.0-canary.bc9ae6c9c.0", + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0", + "@material/fab": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/floating-label": "15.0.0-canary.bc9ae6c9c.0", + "@material/form-field": "15.0.0-canary.bc9ae6c9c.0", + "@material/icon-button": "15.0.0-canary.bc9ae6c9c.0", + "@material/image-list": "15.0.0-canary.bc9ae6c9c.0", + "@material/layout-grid": "15.0.0-canary.bc9ae6c9c.0", + "@material/line-ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/linear-progress": "15.0.0-canary.bc9ae6c9c.0", + "@material/list": "15.0.0-canary.bc9ae6c9c.0", + "@material/menu": "15.0.0-canary.bc9ae6c9c.0", + "@material/menu-surface": "15.0.0-canary.bc9ae6c9c.0", + "@material/notched-outline": "15.0.0-canary.bc9ae6c9c.0", + "@material/radio": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/segmented-button": "15.0.0-canary.bc9ae6c9c.0", + "@material/select": "15.0.0-canary.bc9ae6c9c.0", + "@material/shape": "15.0.0-canary.bc9ae6c9c.0", + "@material/slider": "15.0.0-canary.bc9ae6c9c.0", + "@material/snackbar": "15.0.0-canary.bc9ae6c9c.0", + "@material/switch": "15.0.0-canary.bc9ae6c9c.0", + "@material/tab": "15.0.0-canary.bc9ae6c9c.0", + "@material/tab-bar": "15.0.0-canary.bc9ae6c9c.0", + "@material/tab-indicator": "15.0.0-canary.bc9ae6c9c.0", + "@material/tab-scroller": "15.0.0-canary.bc9ae6c9c.0", + "@material/textfield": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/tooltip": "15.0.0-canary.bc9ae6c9c.0", + "@material/top-app-bar": "15.0.0-canary.bc9ae6c9c.0", + "@material/touch-target": "15.0.0-canary.bc9ae6c9c.0", + "@material/typography": "15.0.0-canary.bc9ae6c9c.0", "tslib": "^2.3.0" } }, "@angular/platform-browser": { - "version": "14.2.8", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-14.2.8.tgz", - "integrity": "sha512-tSASBLXoBE0/Gt6d2nC6BJ1DvbGY5wo2Lb+8WCLSvkfsgVqOh4uRuJ2a0wwjeLFd0ZNmpjG42Ijba4btmCpIjg==", + "version": "16.2.12", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-16.2.12.tgz", + "integrity": "sha512-NnH7ju1iirmVEsUq432DTm0nZBGQsBrU40M3ZeVHMQ2subnGiyUs3QyzDz8+VWLL/T5xTxWLt9BkDn65vgzlIQ==", "requires": { "tslib": "^2.3.0" } }, "@angular/platform-browser-dynamic": { - "version": "14.2.8", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-14.2.8.tgz", - "integrity": "sha512-CPK8wHnKke8AUKR92XrFuanaKNXDzDm3uVI3DD0NxBo+fLAkiuVaDVIGgO6n6SxQVtwjXJtMXqQuNdzUg4Q9uQ==", + "version": "16.2.12", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-16.2.12.tgz", + "integrity": "sha512-ya54jerNgreCVAR278wZavwjrUWImMr2F8yM5n9HBvsMBbFaAQ83anwbOEiHEF2BlR+gJiEBLfpuPRMw20pHqw==", "requires": { "tslib": "^2.3.0" } }, "@angular/router": { - "version": "14.2.8", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-14.2.8.tgz", - "integrity": "sha512-rbKLsa4/scPP8AxaDRQfkLqfg8CbZ163dPqHMixou90uK/dx00LjCyUeS38/otdAYNZhrD0i5nu+k65qwhLX8w==", + "version": "16.2.12", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-16.2.12.tgz", + "integrity": "sha512-aU6QnYSza005V9P3W6PpkieL56O0IHps96DjqI1RS8yOJUl3THmokqYN4Fm5+HXy4f390FN9i6ftadYQDKeWmA==", "requires": { "tslib": "^2.3.0" } @@ -22169,44 +25493,73 @@ "dev": true }, "@babel/code-frame": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", - "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", + "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==", "dev": true, "requires": { - "@babel/highlight": "^7.23.4", - "chalk": "^2.4.2" + "@babel/highlight": "^7.24.7", + "picocolors": "^1.0.0" } }, "@babel/compat-data": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.0.tgz", - "integrity": "sha512-Gt9jszFJYq7qzXVK4slhc6NzJXnOVmRECWcVjF/T23rNXD9NtWQ0W3qxdg+p9wWIB+VQw3GYV/U2Ha9bRTfs4w==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.7.tgz", + "integrity": "sha512-qJzAIcv03PyaWqxRgO4mSU3lihncDT296vnyuE2O8uA4w3UHWI4S3hgeZd1L8W1Bft40w9JxJ2b412iDUFFRhw==", "dev": true }, "@babel/core": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.10.tgz", - "integrity": "sha512-JQM6k6ENcBFKVtWvLavlvi/mPcpYZ3+R+2EySDEMSMbp7Mn4FexlbbJVrx2R7Ijhr01T8gyqrOaABWIOgxeUyw==", - "dev": true, - "requires": { - "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.18.10", - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-module-transforms": "^7.18.9", - "@babel/helpers": "^7.18.9", - "@babel/parser": "^7.18.10", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.18.10", - "@babel/types": "^7.18.10", - "convert-source-map": "^1.7.0", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.2.tgz", + "integrity": "sha512-n7s51eWdaWZ3vGT2tD4T7J6eJs3QoBXydv7vkUM06Bf1cbVD2Kc2UrkzhiQwobfV7NwOnQXYL7UBJ5VPU+RGoQ==", + "dev": true, + "requires": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.0", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-module-transforms": "^7.23.0", + "@babel/helpers": "^7.23.2", + "@babel/parser": "^7.23.0", + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.2", + "@babel/types": "^7.23.0", + "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", - "json5": "^2.2.1", - "semver": "^6.3.0" + "json5": "^2.2.3", + "semver": "^6.3.1" }, "dependencies": { + "@babel/generator": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.7.tgz", + "integrity": "sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA==", + "dev": true, + "requires": { + "@babel/types": "^7.24.7", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^2.5.1" + } + }, + "@babel/template": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.7.tgz", + "integrity": "sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.24.7", + "@babel/parser": "^7.24.7", + "@babel/types": "^7.24.7" + } + }, + "convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, "semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -22216,107 +25569,135 @@ } }, "@babel/generator": { - "version": "7.18.12", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.12.tgz", - "integrity": "sha512-dfQ8ebCN98SvyL7IxNMCUtZQSq5R7kxgN+r8qYTGDmmSion1hX2C0zq2yo1bsCDhXixokv1SAWTZUMYbO/V5zg==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.9.tgz", + "integrity": "sha512-KtLMbmicyuK2Ak/FTCJVbDnkN1SlT8/kceFTiuDiiRUUSMnHMidxSCdG4ndkTOHHpoomWe/4xkvHkEOncwjYIw==", "dev": true, "requires": { - "@babel/types": "^7.18.10", + "@babel/types": "^7.22.5", "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" - }, - "dependencies": { - "@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, - "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - } - } } }, "@babel/helper-annotate-as-pure": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", - "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", + "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", "dev": true, "requires": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" } }, "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz", - "integrity": "sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.24.7.tgz", + "integrity": "sha512-xZeCVVdwb4MsDBkkyZ64tReWYrLRHlMN72vP7Bdm3OUOuyFZExhsHUUnuWnm2/XOlAJzR0LfPpB56WXZn0X/lA==", "dev": true, "requires": { - "@babel/helper-explode-assignable-expression": "^7.18.6", - "@babel/types": "^7.18.9" + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" } }, "@babel/helper-compilation-targets": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.0.tgz", - "integrity": "sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.7.tgz", + "integrity": "sha512-ctSdRHBi20qWOfy27RUb4Fhp07KSJ3sXcuSvTrXrc4aG8NSYDo1ici3Vhg9bg69y5bj0Mr1lh0aeEgTvc12rMg==", "dev": true, "requires": { - "@babel/compat-data": "^7.20.0", - "@babel/helper-validator-option": "^7.18.6", - "browserslist": "^4.21.3", - "semver": "^6.3.0" + "@babel/compat-data": "^7.24.7", + "@babel/helper-validator-option": "^7.24.7", + "browserslist": "^4.22.2", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" }, "dependencies": { + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, "semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true } } }, "@babel/helper-create-class-features-plugin": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.19.0.tgz", - "integrity": "sha512-NRz8DwF4jT3UfrmUoZjd0Uph9HQnP30t7Ash+weACcyNkiYTywpIjDBgReJMKgr+n86sn2nPVVmJ28Dm053Kqw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.7.tgz", + "integrity": "sha512-kTkaDl7c9vO80zeX1rJxnuRpEsD5tA81yh11X1gQo+PhSti3JS+7qeZo9U4RHobKRiFPKaGK3svUAeb8D0Q7eg==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.19.0", - "@babel/helper-member-expression-to-functions": "^7.18.9", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-replace-supers": "^7.18.9", - "@babel/helper-split-export-declaration": "^7.18.6" + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-function-name": "^7.24.7", + "@babel/helper-member-expression-to-functions": "^7.24.7", + "@babel/helper-optimise-call-expression": "^7.24.7", + "@babel/helper-replace-supers": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", + "@babel/helper-split-export-declaration": "^7.24.7", + "semver": "^6.3.1" + }, + "dependencies": { + "@babel/helper-annotate-as-pure": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz", + "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==", + "dev": true, + "requires": { + "@babel/types": "^7.24.7" + } + }, + "@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==", + "dev": true, + "requires": { + "@babel/types": "^7.24.7" + } + }, + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + } } }, "@babel/helper-create-regexp-features-plugin": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.19.0.tgz", - "integrity": "sha512-htnV+mHX32DF81amCDrwIDr8nrp1PTm+3wfBN9/v8QJOLEioOCOG7qNyq0nHeFiWbT3Eb7gsPwEmV64UCQ1jzw==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "regexpu-core": "^5.1.0" - } - }, - "@babel/helper-define-polyfill-provider": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz", - "integrity": "sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.24.7.tgz", + "integrity": "sha512-03TCmXy2FtXJEZfbXDTSqq1fRJArk7lX9DOFC/47VthYcxyIOx+eXQmdo6DOQvrbpIix+KfXwvuXdFDZHxt+rA==", "dev": true, "requires": { - "@babel/helper-compilation-targets": "^7.17.7", - "@babel/helper-plugin-utils": "^7.16.7", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2", - "semver": "^6.1.2" + "@babel/helper-annotate-as-pure": "^7.24.7", + "regexpu-core": "^5.3.1", + "semver": "^6.3.1" }, "dependencies": { + "@babel/helper-annotate-as-pure": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz", + "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==", + "dev": true, + "requires": { + "@babel/types": "^7.24.7" + } + }, "semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -22325,143 +25706,170 @@ } } }, - "@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", - "dev": true + "@babel/helper-define-polyfill-provider": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz", + "integrity": "sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==", + "dev": true, + "requires": { + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" + } }, - "@babel/helper-explode-assignable-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz", - "integrity": "sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==", + "@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==", "dev": true, "requires": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.24.7" } }, "@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "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==", "dev": true, "requires": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" + "@babel/template": "^7.24.7", + "@babel/types": "^7.24.7" }, "dependencies": { "@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.7.tgz", + "integrity": "sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==", "dev": true, "requires": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" + "@babel/code-frame": "^7.24.7", + "@babel/parser": "^7.24.7", + "@babel/types": "^7.24.7" } } } }, "@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "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==", "dev": true, "requires": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.7" } }, "@babel/helper-member-expression-to-functions": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.9.tgz", - "integrity": "sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.7.tgz", + "integrity": "sha512-LGeMaf5JN4hAT471eJdBs/GK1DoYIJ5GCtZN/EsL6KUiiDZOvO/eKE11AMZJa2zP4zk4qe9V2O/hxAmkRc8p6w==", "dev": true, "requires": { - "@babel/types": "^7.18.9" + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" } }, "@babel/helper-module-imports": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz", - "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==", + "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==", "dev": true, "requires": { - "@babel/types": "^7.22.5" + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" } }, "@babel/helper-module-transforms": { - "version": "7.19.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.19.6.tgz", - "integrity": "sha512-fCmcfQo/KYr/VXXDIyd3CBGZ6AFhPFy1TfSEJ+PilGVlQT6jcbqtHAM4C1EciRqMza7/TpOUZliuSH+U6HAhJw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.7.tgz", + "integrity": "sha512-1fuJEwIrp+97rM4RWdO+qrRsZlAeL1lQJoPqtCYWv0NL115XM93hIH4CSRln2w52SqvmY5hqdtauB6QFCDiZNQ==", "dev": true, "requires": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.19.4", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.19.1", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.19.6", - "@babel/types": "^7.19.4" + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-simple-access": "^7.24.7", + "@babel/helper-split-export-declaration": "^7.24.7", + "@babel/helper-validator-identifier": "^7.24.7" + }, + "dependencies": { + "@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==", + "dev": true, + "requires": { + "@babel/types": "^7.24.7" + } + } } }, "@babel/helper-optimise-call-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz", - "integrity": "sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.24.7.tgz", + "integrity": "sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A==", "dev": true, "requires": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.24.7" } }, "@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.7.tgz", + "integrity": "sha512-Rq76wjt7yz9AAc1KnlRKNAi/dMSVWgDRx43FHoJEbcYU6xOWaE2dVPwcdTukJrjxS65GITyfbvEYHvkirZ6uEg==", "dev": true }, "@babel/helper-remap-async-to-generator": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz", - "integrity": "sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.24.7.tgz", + "integrity": "sha512-9pKLcTlZ92hNZMQfGCHImUpDOlAgkkpqalWEeftW5FBya75k8Li2ilerxkM/uBEj01iBZXcCIB/bwvDYgWyibA==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-wrap-function": "^7.18.9", - "@babel/types": "^7.18.9" + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-wrap-function": "^7.24.7" + }, + "dependencies": { + "@babel/helper-annotate-as-pure": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz", + "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==", + "dev": true, + "requires": { + "@babel/types": "^7.24.7" + } + } } }, "@babel/helper-replace-supers": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.19.1.tgz", - "integrity": "sha512-T7ahH7wV0Hfs46SFh5Jz3s0B6+o8g3c+7TMxu7xKfmHikg7EAZ3I2Qk9LFhjxXq8sL7UkP5JflezNwoZa8WvWw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.24.7.tgz", + "integrity": "sha512-qTAxxBM81VEyoAY0TtLrx1oAEJc09ZK67Q9ljQToqCnA+55eNwCORaxlKyu+rNfX86o8OXRUSNUnrtsAZXM9sg==", "dev": true, "requires": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-member-expression-to-functions": "^7.18.9", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/traverse": "^7.19.1", - "@babel/types": "^7.19.0" + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-member-expression-to-functions": "^7.24.7", + "@babel/helper-optimise-call-expression": "^7.24.7" } }, "@babel/helper-simple-access": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.19.4.tgz", - "integrity": "sha512-f9Xq6WqBFqaDfbCzn2w85hwklswz5qsKlh7f08w4Y9yhJHpnNC0QemtSkK5YyOY8kPGvyiwdzZksGUhnGdaUIg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz", + "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==", "dev": true, "requires": { - "@babel/types": "^7.19.4" + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" } }, "@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz", - "integrity": "sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.24.7.tgz", + "integrity": "sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ==", "dev": true, "requires": { - "@babel/types": "^7.20.0" + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" } }, "@babel/helper-split-export-declaration": { @@ -22474,91 +25882,118 @@ } }, "@babel/helper-string-parser": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", - "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", + "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==", "dev": true }, "@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", + "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", "dev": true }, "@babel/helper-validator-option": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz", - "integrity": "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.7.tgz", + "integrity": "sha512-yy1/KvjhV/ZCL+SM7hBrvnZJ3ZuT9OuZgIJAGpPEToANvc3iM6iDvBnRjtElWibHU6n8/LPR/EjX9EtIEYO3pw==", "dev": true }, "@babel/helper-wrap-function": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.19.0.tgz", - "integrity": "sha512-txX8aN8CZyYGTwcLhlk87KRqncAzhh5TpQamZUa0/u3an36NtDpUP6bQgBCBcLeBs09R/OwQu3OjK0k/HwfNDg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.24.7.tgz", + "integrity": "sha512-N9JIYk3TD+1vq/wn77YnJOqMtfWhNewNE+DJV4puD2X7Ew9J4JvrzrFDfTfyv5EgEXVy9/Wt8QiOErzEmv5Ifw==", "dev": true, "requires": { - "@babel/helper-function-name": "^7.19.0", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.19.0", - "@babel/types": "^7.19.0" + "@babel/helper-function-name": "^7.24.7", + "@babel/template": "^7.24.7", + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "dependencies": { + "@babel/template": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.7.tgz", + "integrity": "sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.24.7", + "@babel/parser": "^7.24.7", + "@babel/types": "^7.24.7" + } + } } }, "@babel/helpers": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.0.tgz", - "integrity": "sha512-aGMjYraN0zosCEthoGLdqot1oRsmxVTQRHadsUPz5QM44Zej2PYRz7XiDE7GqnkZnNtLbOuxqoZw42vkU7+XEQ==", + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.9.tgz", + "integrity": "sha512-87ICKgU5t5SzOT7sBMfCOZQ2rHjRU+Pcb9BoILMYz600W6DkVRLFBPwQ18gwUVvggqXivaUakpnxWQGbpywbBQ==", "dev": true, "requires": { - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.20.0", - "@babel/types": "^7.20.0" + "@babel/template": "^7.23.9", + "@babel/traverse": "^7.23.9", + "@babel/types": "^7.23.9" + }, + "dependencies": { + "@babel/template": { + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.23.9.tgz", + "integrity": "sha512-+xrD2BWLpvHKNmX2QbpdpsBaWnRxahMwJjO+KZk2JOElj5nSmKezyS1B4u+QbHMTX69t4ukm6hh9lsYQ7GHCKA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.23.5", + "@babel/parser": "^7.23.9", + "@babel/types": "^7.23.9" + } + } } }, "@babel/highlight": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", - "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", + "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.22.20", + "@babel/helper-validator-identifier": "^7.24.7", "chalk": "^2.4.2", - "js-tokens": "^4.0.0" + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" } }, "@babel/parser": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.5.tgz", - "integrity": "sha512-hOOqoiNXrmGdFbhgCzu6GiURxUgM27Xwd/aPuu8RfHEZPBzL1Z54okAHAQjXfcQNwvrlkAmAp4SlRTZ45vlthQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.7.tgz", + "integrity": "sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw==", "dev": true }, "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz", - "integrity": "sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.7.tgz", + "integrity": "sha512-unaQgZ/iRu/By6tsjMZzpeBZjChYfLYry6HrEXPoz3KmfF0sVBQ1l8zKMQ4xRGLWVsjuvB8nQfjNP/DcfEOCsg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.24.7" } }, "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.18.9.tgz", - "integrity": "sha512-AHrP9jadvH7qlOj6PINbgSuphjQUAK7AOT7DPjBo9EHoLhQTnnK5u45e1Hd4DbSQEO9nqPWtQ89r+XEOWFScKg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.7.tgz", + "integrity": "sha512-+izXIbke1T33mY4MSNnrqhPXDz01WYhEf3yF5NbnUtkiNnm+XBZJl3kNfoK6NKmYlz/D07+l2GWVK/QfDkNCuQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9", - "@babel/plugin-proposal-optional-chaining": "^7.18.9" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", + "@babel/plugin-transform-optional-chaining": "^7.24.7" } }, "@babel/plugin-proposal-async-generator-functions": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.18.10.tgz", - "integrity": "sha512-1mFuY2TOsR1hxbjCo4QL+qlIjV07p4H4EUYw2J/WCqsvFV6V9X9z9YhXbWndc/4fw+hYGlDT7egYxliMp5O6Ew==", + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz", + "integrity": "sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==", "dev": true, "requires": { "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9", + "@babel/helper-plugin-utils": "^7.20.2", "@babel/helper-remap-async-to-generator": "^7.18.9", "@babel/plugin-syntax-async-generators": "^7.8.4" } @@ -22573,132 +26008,25 @@ "@babel/helper-plugin-utils": "^7.18.6" } }, - "@babel/plugin-proposal-class-static-block": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.6.tgz", - "integrity": "sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-class-static-block": "^7.14.5" - } - }, - "@babel/plugin-proposal-dynamic-import": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz", - "integrity": "sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" - } - }, - "@babel/plugin-proposal-export-namespace-from": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz", - "integrity": "sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" - } - }, - "@babel/plugin-proposal-json-strings": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz", - "integrity": "sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-json-strings": "^7.8.3" - } - }, - "@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.18.9.tgz", - "integrity": "sha512-128YbMpjCrP35IOExw2Fq+x55LMP42DzhOhX2aNNIdI9avSWl2PI0yuBWarr3RYpZBSPtabfadkH2yeRiMD61Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" - } - }, - "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", - "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" - } - }, - "@babel/plugin-proposal-numeric-separator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", - "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - } - }, "@babel/plugin-proposal-object-rest-spread": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.19.4.tgz", - "integrity": "sha512-wHmj6LDxVDnL+3WhXteUBaoM1aVILZODAUjg11kHqG4cOlfgMQGxw6aCgvrXrmaJR3Bn14oZhImyCPZzRpC93Q==", + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz", + "integrity": "sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==", "dev": true, "requires": { - "@babel/compat-data": "^7.19.4", - "@babel/helper-compilation-targets": "^7.19.3", - "@babel/helper-plugin-utils": "^7.19.0", + "@babel/compat-data": "^7.20.5", + "@babel/helper-compilation-targets": "^7.20.7", + "@babel/helper-plugin-utils": "^7.20.2", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.18.8" - } - }, - "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz", - "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" - } - }, - "@babel/plugin-proposal-optional-chaining": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.18.9.tgz", - "integrity": "sha512-v5nwt4IqBXihxGsW2QmCWMDS3B3bzGIk/EQVZz2ei7f3NJl8NzAJVvUmpDW5q1CRNY+Beb/k58UAH1Km1N411w==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" - } - }, - "@babel/plugin-proposal-private-methods": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", - "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/plugin-transform-parameters": "^7.20.7" } }, "@babel/plugin-proposal-private-property-in-object": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.18.6.tgz", - "integrity": "sha512-9Rysx7FOctvT5ouj5JODjAFAkgGoudQuLPamZb0v1TGLpapdNaftzifU8NTWQm0IRjqoYypdrSmyWgkocDQ8Dw==", + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" - } + "requires": {} }, "@babel/plugin-proposal-unicode-property-regex": { "version": "7.18.6", @@ -22756,12 +26084,30 @@ } }, "@babel/plugin-syntax-import-assertions": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz", - "integrity": "sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.7.tgz", + "integrity": "sha512-Ec3NRUMoi8gskrkBe3fNmEQfxDvY8bgfQpz6jlk/41kX9eUjvpyqWU7PBP/pLAvMaSQjbMNKJmvX57jP+M6bPg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.24.7" + } + }, + "@babel/plugin-syntax-import-attributes": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.7.tgz", + "integrity": "sha512-hbX+lKKeUMGihnK8nvKqmXBInriT3GVjzXKFriV3YC6APGxMbP8RZNFwy91+hocLXq90Mta+HshoB31802bb8A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.24.7" + } + }, + "@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.19.0" + "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-syntax-json-strings": { @@ -22854,234 +26200,417 @@ "@babel/helper-plugin-utils": "^7.14.5" } }, - "@babel/plugin-transform-arrow-functions": { + "@babel/plugin-syntax-unicode-sets-regex": { "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.18.6.tgz", - "integrity": "sha512-9S9X9RUefzrsHZmKMbDXxweEH+YlE8JJEuat9FdvW9Qh1cw7W64jELCtWNkPBPX5En45uy28KGvA/AySqUh8CQ==", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", "dev": true, "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" } }, + "@babel/plugin-transform-arrow-functions": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.7.tgz", + "integrity": "sha512-Dt9LQs6iEY++gXUwY03DNFat5C2NbO48jj+j/bSAz6b3HgPs39qcPiYt77fDObIcFwj3/C2ICX9YMwGflUoSHQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.24.7" + } + }, + "@babel/plugin-transform-async-generator-functions": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.7.tgz", + "integrity": "sha512-o+iF77e3u7ZS4AoAuJvapz9Fm001PuD2V3Lp6OSE4FYQke+cSewYtnek+THqGRWyQloRCyvWL1OkyfNEl9vr/g==", + "dev": true, + "requires": { + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-remap-async-to-generator": "^7.24.7", + "@babel/plugin-syntax-async-generators": "^7.8.4" + } + }, "@babel/plugin-transform-async-to-generator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.18.6.tgz", - "integrity": "sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.22.5.tgz", + "integrity": "sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-remap-async-to-generator": "^7.18.6" + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.5" } }, "@babel/plugin-transform-block-scoped-functions": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz", - "integrity": "sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.7.tgz", + "integrity": "sha512-yO7RAz6EsVQDaBH18IDJcMB1HnrUn2FJ/Jslc/WtPPWcjhpUJXU/rjbwmluzp7v/ZzWcEhTMXELnnsz8djWDwQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.24.7" } }, "@babel/plugin-transform-block-scoping": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.20.0.tgz", - "integrity": "sha512-sXOohbpHZSk7GjxK9b3dKB7CfqUD5DwOH+DggKzOQ7TXYP+RCSbRykfjQmn/zq+rBjycVRtLf9pYhAaEJA786w==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.4.tgz", + "integrity": "sha512-0QqbP6B6HOh7/8iNR4CQU2Th/bbRtBp4KS9vcaZd1fZ0wSh5Fyssg0UCIHwxh+ka+pNDREbVLQnHCMHKZfPwfw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.22.5" + } + }, + "@babel/plugin-transform-class-properties": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.7.tgz", + "integrity": "sha512-vKbfawVYayKcSeSR5YYzzyXvsDFWU2mD8U5TFeXtbCPLFUqe7GyCgvO6XDHzje862ODrOwy6WCPmKeWHbCFJ4w==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + } + }, + "@babel/plugin-transform-class-static-block": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.7.tgz", + "integrity": "sha512-HMXK3WbBPpZQufbMG4B46A90PkuuhN9vBCb5T8+VAHqvAqvcLi+2cKoukcpmUYkszLhScU3l1iudhrks3DggRQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.19.0" + "@babel/helper-create-class-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-class-static-block": "^7.14.5" } }, "@babel/plugin-transform-classes": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.19.0.tgz", - "integrity": "sha512-YfeEE9kCjqTS9IitkgfJuxjcEtLUHMqa8yUJ6zdz8vR7hKuo6mOy2C05P0F1tdMmDCeuyidKnlrw/iTppHcr2A==", + "version": "7.23.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.23.8.tgz", + "integrity": "sha512-yAYslGsY1bX6Knmg46RjiCiNSwJKv2IUC8qOdYKqMMr0491SXFhcHqOdRDeCRohOOIzwN/90C6mQ9qAKgrP7dg==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-compilation-targets": "^7.19.0", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.19.0", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-plugin-utils": "^7.19.0", - "@babel/helper-replace-supers": "^7.18.9", - "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.20", + "@babel/helper-split-export-declaration": "^7.22.6", "globals": "^11.1.0" } }, "@babel/plugin-transform-computed-properties": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.18.9.tgz", - "integrity": "sha512-+i0ZU1bCDymKakLxn5srGHrsAPRELC2WIbzwjLhHW9SIE1cPYkLCL0NlnXMZaM1vhfgA2+M7hySk42VBvrkBRw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.7.tgz", + "integrity": "sha512-25cS7v+707Gu6Ds2oY6tCkUwsJ9YIDbggd9+cu9jzzDgiNq7hR/8dkzxWfKWnTic26vsI3EsCXNd4iEB6e8esQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/template": "^7.24.7" + }, + "dependencies": { + "@babel/template": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.7.tgz", + "integrity": "sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.24.7", + "@babel/parser": "^7.24.7", + "@babel/types": "^7.24.7" + } + } } }, "@babel/plugin-transform-destructuring": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.20.0.tgz", - "integrity": "sha512-1dIhvZfkDVx/zn2S1aFwlruspTt4189j7fEkH0Y0VyuDM6bQt7bD6kLcz3l4IlLG+e5OReaBz9ROAbttRtUHqA==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.3.tgz", + "integrity": "sha512-n225npDqjDIr967cMScVKHXJs7rout1q+tt50inyBCPkyZ8KxeI6d+GIbSBTT/w/9WdlWDOej3V9HE5Lgk57gw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.19.0" + "@babel/helper-plugin-utils": "^7.22.5" } }, "@babel/plugin-transform-dotall-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz", - "integrity": "sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.7.tgz", + "integrity": "sha512-ZOA3W+1RRTSWvyqcMJDLqbchh7U4NRGqwRfFSVbOLS/ePIP4vHB5e8T8eXcuqyN1QkgKyj5wuW0lcS85v4CrSw==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" } }, "@babel/plugin-transform-duplicate-keys": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz", - "integrity": "sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.7.tgz", + "integrity": "sha512-JdYfXyCRihAe46jUIliuL2/s0x0wObgwwiGxw/UbgJBr20gQBThrokO4nYKgWkD7uBaqM7+9x5TU7NkExZJyzw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.24.7" + } + }, + "@babel/plugin-transform-dynamic-import": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.7.tgz", + "integrity": "sha512-sc3X26PhZQDb3JhORmakcbvkeInvxz+A8oda99lj7J60QRuPZvNAk9wQlTBS1ZynelDrDmTU4pw1tyc5d5ZMUg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" } }, "@babel/plugin-transform-exponentiation-operator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz", - "integrity": "sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.7.tgz", + "integrity": "sha512-Rqe/vSc9OYgDajNIK35u7ot+KeCoetqQYFXM4Epf7M7ez3lWlOjrDjrwMei6caCVhfdw+mIKD4cgdGNy5JQotQ==", "dev": true, "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + } + }, + "@babel/plugin-transform-export-namespace-from": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.7.tgz", + "integrity": "sha512-v0K9uNYsPL3oXZ/7F9NNIbAj2jv1whUEtyA6aujhekLs56R++JDQuzRcP2/z4WX5Vg/c5lE9uWZA0/iUoFhLTA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" } }, "@babel/plugin-transform-for-of": { - "version": "7.18.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.8.tgz", - "integrity": "sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.7.tgz", + "integrity": "sha512-wo9ogrDG1ITTTBsy46oGiN1dS9A7MROBTcYsfS8DtsImMkHk9JXJ3EWQM6X2SUw4x80uGPlwj0o00Uoc6nEE3g==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7" } }, "@babel/plugin-transform-function-name": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz", - "integrity": "sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.7.tgz", + "integrity": "sha512-U9FcnA821YoILngSmYkW6FjyQe2TyZD5pHt4EVIhmcTkrJw/3KqcrRSxuOo5tFZJi7TE19iDyI1u+weTI7bn2w==", + "dev": true, + "requires": { + "@babel/helper-compilation-targets": "^7.24.7", + "@babel/helper-function-name": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + } + }, + "@babel/plugin-transform-json-strings": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.7.tgz", + "integrity": "sha512-2yFnBGDvRuxAaE/f0vfBKvtnvvqU8tGpMHqMNpTN2oWMKIR3NqFkjaAgGwawhqK/pIN2T3XdjGPdaG0vDhOBGw==", "dev": true, "requires": { - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-function-name": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-json-strings": "^7.8.3" } }, "@babel/plugin-transform-literals": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz", - "integrity": "sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.7.tgz", + "integrity": "sha512-vcwCbb4HDH+hWi8Pqenwnjy+UiklO4Kt1vfspcQYFhJdpthSnW8XvWGyDZWKNVrVbVViI/S7K9PDJZiUmP2fYQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.24.7" + } + }, + "@babel/plugin-transform-logical-assignment-operators": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.7.tgz", + "integrity": "sha512-4D2tpwlQ1odXmTEIFWy9ELJcZHqrStlzK/dAOWYyxX3zT0iXQB6banjgeOJQXzEc4S0E0a5A+hahxPaEFYftsw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" } }, "@babel/plugin-transform-member-expression-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz", - "integrity": "sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.7.tgz", + "integrity": "sha512-T/hRC1uqrzXMKLQ6UCwMT85S3EvqaBXDGf0FaMf4446Qx9vKwlghvee0+uuZcDUCZU5RuNi4781UQ7R308zzBw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.24.7" } }, "@babel/plugin-transform-modules-amd": { - "version": "7.19.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.19.6.tgz", - "integrity": "sha512-uG3od2mXvAtIFQIh0xrpLH6r5fpSQN04gIVovl+ODLdUMANokxQLZnPBHcjmv3GxRjnqwLuHvppjjcelqUFZvg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.7.tgz", + "integrity": "sha512-9+pB1qxV3vs/8Hdmz/CulFB8w2tuu6EB94JZFsjdqxQokwGa9Unap7Bo2gGBGIvPmDIVvQrom7r5m/TCDMURhg==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.19.6", - "@babel/helper-plugin-utils": "^7.19.0" + "@babel/helper-module-transforms": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" } }, "@babel/plugin-transform-modules-commonjs": { - "version": "7.19.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.19.6.tgz", - "integrity": "sha512-8PIa1ym4XRTKuSsOUXqDG0YaOlEuTVvHMe5JCfgBMOtHvJKw/4NGovEGN33viISshG/rZNVrACiBmPQLvWN8xQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.7.tgz", + "integrity": "sha512-iFI8GDxtevHJ/Z22J5xQpVqFLlMNstcLXh994xifFwxxGslr2ZXXLWgtBeLctOD63UFDArdvN6Tg8RFw+aEmjQ==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.19.6", - "@babel/helper-plugin-utils": "^7.19.0", - "@babel/helper-simple-access": "^7.19.4" + "@babel/helper-module-transforms": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-simple-access": "^7.24.7" } }, "@babel/plugin-transform-modules-systemjs": { - "version": "7.19.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.19.6.tgz", - "integrity": "sha512-fqGLBepcc3kErfR9R3DnVpURmckXP7gj7bAlrTQyBxrigFqszZCkFkcoxzCp2v32XmwXLvbw+8Yq9/b+QqksjQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.7.tgz", + "integrity": "sha512-GYQE0tW7YoaN13qFh3O1NCY4MPkUiAH3fiF7UcV/I3ajmDKEdG3l+UOcbAm4zUE3gnvUU+Eni7XrVKo9eO9auw==", "dev": true, "requires": { - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-module-transforms": "^7.19.6", - "@babel/helper-plugin-utils": "^7.19.0", - "@babel/helper-validator-identifier": "^7.19.1" + "@babel/helper-hoist-variables": "^7.24.7", + "@babel/helper-module-transforms": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-validator-identifier": "^7.24.7" } }, "@babel/plugin-transform-modules-umd": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz", - "integrity": "sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.7.tgz", + "integrity": "sha512-3aytQvqJ/h9z4g8AsKPLvD4Zqi2qT+L3j7XoFFu1XBlZWEl2/1kWnhmAbxpLgPrHSY0M6UA02jyTiwUVtiKR6A==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-module-transforms": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" } }, "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.19.1.tgz", - "integrity": "sha512-oWk9l9WItWBQYS4FgXD4Uyy5kq898lvkXpXQxoJEY1RnvPk4R/Dvu2ebXU9q8lP+rlMwUQTFf2Ok6d78ODa0kw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.24.7.tgz", + "integrity": "sha512-/jr7h/EWeJtk1U/uz2jlsCioHkZk1JJZVcc8oQsJ1dUlaJD83f4/6Zeh2aHt9BIFokHIsSeDfhUmju0+1GPd6g==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.19.0", - "@babel/helper-plugin-utils": "^7.19.0" + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" } }, "@babel/plugin-transform-new-target": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz", - "integrity": "sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.7.tgz", + "integrity": "sha512-RNKwfRIXg4Ls/8mMTza5oPF5RkOW8Wy/WgMAp1/F1yZ8mMbtwXW+HDoJiOsagWrAhI5f57Vncrmr9XeT4CVapA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.24.7" + } + }, + "@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.7.tgz", + "integrity": "sha512-Ts7xQVk1OEocqzm8rHMXHlxvsfZ0cEF2yomUqpKENHWMF4zKk175Y4q8H5knJes6PgYad50uuRmt3UJuhBw8pQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + } + }, + "@babel/plugin-transform-numeric-separator": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.7.tgz", + "integrity": "sha512-e6q1TiVUzvH9KRvicuxdBTUj4AdKSRwzIyFFnfnezpCfP2/7Qmbb8qbU2j7GODbl4JMkblitCQjKYUaX/qkkwA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + } + }, + "@babel/plugin-transform-object-rest-spread": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.7.tgz", + "integrity": "sha512-4QrHAr0aXQCEFni2q4DqKLD31n2DL+RxcwnNjDFkSG0eNQ/xCavnRkfCUjsyqGC2OviNJvZOF/mQqZBw7i2C5Q==", + "dev": true, + "requires": { + "@babel/helper-compilation-targets": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.24.7" } }, "@babel/plugin-transform-object-super": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz", - "integrity": "sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.7.tgz", + "integrity": "sha512-A/vVLwN6lBrMFmMDmPPz0jnE6ZGx7Jq7d6sT/Ev4H65RER6pZ+kczlf1DthF5N0qaPHBsI7UXiE8Zy66nmAovg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-replace-supers": "^7.24.7" + } + }, + "@babel/plugin-transform-optional-catch-binding": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.7.tgz", + "integrity": "sha512-uLEndKqP5BfBbC/5jTwPxLh9kqPWWgzN/f8w6UwAIirAEqiIVJWWY312X72Eub09g5KF9+Zn7+hT7sDxmhRuKA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + } + }, + "@babel/plugin-transform-optional-chaining": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.7.tgz", + "integrity": "sha512-tK+0N9yd4j+x/4hxF3F0e0fu/VdcxU18y5SevtyM/PCFlQvXbR0Zmlo2eBrKtVipGNFzpq56o8WsIIKcJFUCRQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-replace-supers": "^7.18.6" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" } }, "@babel/plugin-transform-parameters": { - "version": "7.18.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.18.8.tgz", - "integrity": "sha512-ivfbE3X2Ss+Fj8nnXvKJS6sjRG4gzwPMsP+taZC+ZzEGjAYlvENixmt1sZ5Ca6tWls+BlKSGKPJ6OOXvXCbkFg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.7.tgz", + "integrity": "sha512-yGWW5Rr+sQOhK0Ot8hjDJuxU3XLRQGflvT4lhlSY0DFvdb3TwKaY26CJzHtYllU0vT9j58hc37ndFPsqT1SrzA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.24.7" + } + }, + "@babel/plugin-transform-private-methods": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.7.tgz", + "integrity": "sha512-COTCOkG2hn4JKGEKBADkA8WNb35TGkkRbI5iT845dB+NyqgO8Hn+ajPbSnIQznneJTa3d30scb6iz/DhH8GsJQ==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + } + }, + "@babel/plugin-transform-private-property-in-object": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.7.tgz", + "integrity": "sha512-9z76mxwnwFxMyxZWEgdgECQglF2Q7cFLm0kMf8pGwt+GSJsY0cONKj/UuO4bOH0w/uAel3ekS4ra5CEAyJRmDA==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-create-class-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + }, + "dependencies": { + "@babel/helper-annotate-as-pure": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz", + "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==", + "dev": true, + "requires": { + "@babel/types": "^7.24.7" + } + } } }, "@babel/plugin-transform-property-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz", - "integrity": "sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.7.tgz", + "integrity": "sha512-EMi4MLQSHfd2nrCqQEWxFdha2gBCqU4ZcCng4WBGZ5CJL4bBRW0ptdqqDdeirGZcpALazVVNJqRmsO8/+oNCBA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.24.7" } }, "@babel/plugin-transform-react-display-name": { @@ -23104,17 +26633,6 @@ "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-jsx": "^7.22.5", "@babel/types": "^7.22.5" - }, - "dependencies": { - "@babel/helper-annotate-as-pure": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", - "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", - "dev": true, - "requires": { - "@babel/types": "^7.22.5" - } - } } }, "@babel/plugin-transform-react-jsx-development": { @@ -23134,50 +26652,39 @@ "requires": { "@babel/helper-annotate-as-pure": "^7.22.5", "@babel/helper-plugin-utils": "^7.22.5" - }, - "dependencies": { - "@babel/helper-annotate-as-pure": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", - "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", - "dev": true, - "requires": { - "@babel/types": "^7.22.5" - } - } } }, "@babel/plugin-transform-regenerator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.18.6.tgz", - "integrity": "sha512-poqRI2+qiSdeldcz4wTSTXBRryoq3Gc70ye7m7UD5Ww0nE29IXqMl6r7Nd15WBgRd74vloEMlShtH6CKxVzfmQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.7.tgz", + "integrity": "sha512-lq3fvXPdimDrlg6LWBoqj+r/DEWgONuwjuOuQCSYgRroXDH/IdM1C0IZf59fL5cHLpjEH/O6opIRBbqv7ELnuA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "regenerator-transform": "^0.15.0" + "@babel/helper-plugin-utils": "^7.24.7", + "regenerator-transform": "^0.15.2" } }, "@babel/plugin-transform-reserved-words": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz", - "integrity": "sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.7.tgz", + "integrity": "sha512-0DUq0pHcPKbjFZCfTss/pGkYMfy3vFWydkUBd9r0GHpIyfs2eCDENvqadMycRS9wZCXR41wucAfJHJmwA0UmoQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.24.7" } }, "@babel/plugin-transform-runtime": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.18.10.tgz", - "integrity": "sha512-q5mMeYAdfEbpBAgzl7tBre/la3LeCxmDO1+wMXRdPWbcoMjR3GiXlCLk7JBZVVye0bqTGNMbt0yYVXX1B1jEWQ==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.22.9.tgz", + "integrity": "sha512-9KjBH61AGJetCPYp/IEyLEp47SyybZb0nDRpBvmtEkm+rUIwxdlKpyNHI1TmsGkeuLclJdleQHRZ8XLBnnh8CQ==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.9", - "babel-plugin-polyfill-corejs2": "^0.3.2", - "babel-plugin-polyfill-corejs3": "^0.5.3", - "babel-plugin-polyfill-regenerator": "^0.4.0", - "semver": "^6.3.0" + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "babel-plugin-polyfill-corejs2": "^0.4.4", + "babel-plugin-polyfill-corejs3": "^0.8.2", + "babel-plugin-polyfill-regenerator": "^0.5.1", + "semver": "^6.3.1" }, "dependencies": { "semver": { @@ -23189,103 +26696,111 @@ } }, "@babel/plugin-transform-shorthand-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz", - "integrity": "sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.7.tgz", + "integrity": "sha512-KsDsevZMDsigzbA09+vacnLpmPH4aWjcZjXdyFKGzpplxhbeB4wYtury3vglQkg6KM/xEPKt73eCjPPf1PgXBA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.24.7" } }, "@babel/plugin-transform-spread": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.19.0.tgz", - "integrity": "sha512-RsuMk7j6n+r752EtzyScnWkQyuJdli6LdO5Klv8Yx0OfPVTcQkIUfS8clx5e9yHXzlnhOZF3CbQ8C2uP5j074w==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.7.tgz", + "integrity": "sha512-x96oO0I09dgMDxJaANcRyD4ellXFLLiWhuwDxKZX5g2rWP1bTPkBSwCYv96VDXVT1bD9aPj8tppr5ITIh8hBng==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.19.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7" } }, "@babel/plugin-transform-sticky-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz", - "integrity": "sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.7.tgz", + "integrity": "sha512-kHPSIJc9v24zEml5geKg9Mjx5ULpfncj0wRpYtxbvKyTtHCYDkVE3aHQ03FrpEo4gEe2vrJJS1Y9CJTaThA52g==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.24.7" } }, "@babel/plugin-transform-template-literals": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz", - "integrity": "sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.7.tgz", + "integrity": "sha512-AfDTQmClklHCOLxtGoP7HkeMw56k1/bTQjwsfhL6pppo/M4TOBSq+jjBUBLmV/4oeFg4GWMavIl44ZeCtmmZTw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.24.7" } }, "@babel/plugin-transform-typeof-symbol": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz", - "integrity": "sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.7.tgz", + "integrity": "sha512-VtR8hDy7YLB7+Pet9IarXjg/zgCMSF+1mNS/EQEiEaUPoFXCVsHG64SIxcaaI2zJgRiv+YmgaQESUfWAdbjzgg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.24.7" } }, "@babel/plugin-transform-unicode-escapes": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz", - "integrity": "sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.7.tgz", + "integrity": "sha512-U3ap1gm5+4edc2Q/P+9VrBNhGkfnf+8ZqppY71Bo/pzZmXhhLdqgaUl6cuB07O1+AQJtCLfaOmswiNbSQ9ivhw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.24.7" + } + }, + "@babel/plugin-transform-unicode-property-regex": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.7.tgz", + "integrity": "sha512-uH2O4OV5M9FZYQrwc7NdVmMxQJOCCzFeYudlZSzUAHRFeOujQefa92E74TQDVskNHCzOXoigEuoyzHDhaEaK5w==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" } }, "@babel/plugin-transform-unicode-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz", - "integrity": "sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.7.tgz", + "integrity": "sha512-hlQ96MBZSAXUq7ltkjtu3FJCCSMx/j629ns3hA3pXnBXjanNP0LHi+JpPeA81zaWgVK1VGH95Xuy7u0RyQ8kMg==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + } + }, + "@babel/plugin-transform-unicode-sets-regex": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.7.tgz", + "integrity": "sha512-2G8aAvF4wy1w/AGZkemprdGMRg5o6zPNhbHVImRz3lss55TYCBd6xStN19rt8XJHq20sqV0JbyWjOWwQRwV/wg==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" } }, "@babel/preset-env": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.18.10.tgz", - "integrity": "sha512-wVxs1yjFdW3Z/XkNfXKoblxoHgbtUF7/l3PvvP4m02Qz9TZ6uZGxRVYjSQeR87oQmHco9zWitW5J82DJ7sCjvA==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.18.8", - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/helper-validator-option": "^7.18.6", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.9", - "@babel/plugin-proposal-async-generator-functions": "^7.18.10", - "@babel/plugin-proposal-class-properties": "^7.18.6", - "@babel/plugin-proposal-class-static-block": "^7.18.6", - "@babel/plugin-proposal-dynamic-import": "^7.18.6", - "@babel/plugin-proposal-export-namespace-from": "^7.18.9", - "@babel/plugin-proposal-json-strings": "^7.18.6", - "@babel/plugin-proposal-logical-assignment-operators": "^7.18.9", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", - "@babel/plugin-proposal-numeric-separator": "^7.18.6", - "@babel/plugin-proposal-object-rest-spread": "^7.18.9", - "@babel/plugin-proposal-optional-catch-binding": "^7.18.6", - "@babel/plugin-proposal-optional-chaining": "^7.18.9", - "@babel/plugin-proposal-private-methods": "^7.18.6", - "@babel/plugin-proposal-private-property-in-object": "^7.18.6", - "@babel/plugin-proposal-unicode-property-regex": "^7.18.6", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.22.9.tgz", + "integrity": "sha512-wNi5H/Emkhll/bqPjsjQorSykrlfY5OWakd6AulLvMEytpKasMVUpVy8RL4qBIBs5Ac6/5i0/Rv0b/Fg6Eag/g==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.22.9", + "@babel/helper-compilation-targets": "^7.22.9", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-option": "^7.22.5", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.22.5", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.22.5", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-class-properties": "^7.12.13", "@babel/plugin-syntax-class-static-block": "^7.14.5", "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.18.6", + "@babel/plugin-syntax-import-assertions": "^7.22.5", + "@babel/plugin-syntax-import-attributes": "^7.22.5", + "@babel/plugin-syntax-import-meta": "^7.10.4", "@babel/plugin-syntax-json-strings": "^7.8.3", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", @@ -23295,45 +26810,62 @@ "@babel/plugin-syntax-optional-chaining": "^7.8.3", "@babel/plugin-syntax-private-property-in-object": "^7.14.5", "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-transform-arrow-functions": "^7.18.6", - "@babel/plugin-transform-async-to-generator": "^7.18.6", - "@babel/plugin-transform-block-scoped-functions": "^7.18.6", - "@babel/plugin-transform-block-scoping": "^7.18.9", - "@babel/plugin-transform-classes": "^7.18.9", - "@babel/plugin-transform-computed-properties": "^7.18.9", - "@babel/plugin-transform-destructuring": "^7.18.9", - "@babel/plugin-transform-dotall-regex": "^7.18.6", - "@babel/plugin-transform-duplicate-keys": "^7.18.9", - "@babel/plugin-transform-exponentiation-operator": "^7.18.6", - "@babel/plugin-transform-for-of": "^7.18.8", - "@babel/plugin-transform-function-name": "^7.18.9", - "@babel/plugin-transform-literals": "^7.18.9", - "@babel/plugin-transform-member-expression-literals": "^7.18.6", - "@babel/plugin-transform-modules-amd": "^7.18.6", - "@babel/plugin-transform-modules-commonjs": "^7.18.6", - "@babel/plugin-transform-modules-systemjs": "^7.18.9", - "@babel/plugin-transform-modules-umd": "^7.18.6", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.18.6", - "@babel/plugin-transform-new-target": "^7.18.6", - "@babel/plugin-transform-object-super": "^7.18.6", - "@babel/plugin-transform-parameters": "^7.18.8", - "@babel/plugin-transform-property-literals": "^7.18.6", - "@babel/plugin-transform-regenerator": "^7.18.6", - "@babel/plugin-transform-reserved-words": "^7.18.6", - "@babel/plugin-transform-shorthand-properties": "^7.18.6", - "@babel/plugin-transform-spread": "^7.18.9", - "@babel/plugin-transform-sticky-regex": "^7.18.6", - "@babel/plugin-transform-template-literals": "^7.18.9", - "@babel/plugin-transform-typeof-symbol": "^7.18.9", - "@babel/plugin-transform-unicode-escapes": "^7.18.10", - "@babel/plugin-transform-unicode-regex": "^7.18.6", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.22.5", + "@babel/plugin-transform-async-generator-functions": "^7.22.7", + "@babel/plugin-transform-async-to-generator": "^7.22.5", + "@babel/plugin-transform-block-scoped-functions": "^7.22.5", + "@babel/plugin-transform-block-scoping": "^7.22.5", + "@babel/plugin-transform-class-properties": "^7.22.5", + "@babel/plugin-transform-class-static-block": "^7.22.5", + "@babel/plugin-transform-classes": "^7.22.6", + "@babel/plugin-transform-computed-properties": "^7.22.5", + "@babel/plugin-transform-destructuring": "^7.22.5", + "@babel/plugin-transform-dotall-regex": "^7.22.5", + "@babel/plugin-transform-duplicate-keys": "^7.22.5", + "@babel/plugin-transform-dynamic-import": "^7.22.5", + "@babel/plugin-transform-exponentiation-operator": "^7.22.5", + "@babel/plugin-transform-export-namespace-from": "^7.22.5", + "@babel/plugin-transform-for-of": "^7.22.5", + "@babel/plugin-transform-function-name": "^7.22.5", + "@babel/plugin-transform-json-strings": "^7.22.5", + "@babel/plugin-transform-literals": "^7.22.5", + "@babel/plugin-transform-logical-assignment-operators": "^7.22.5", + "@babel/plugin-transform-member-expression-literals": "^7.22.5", + "@babel/plugin-transform-modules-amd": "^7.22.5", + "@babel/plugin-transform-modules-commonjs": "^7.22.5", + "@babel/plugin-transform-modules-systemjs": "^7.22.5", + "@babel/plugin-transform-modules-umd": "^7.22.5", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", + "@babel/plugin-transform-new-target": "^7.22.5", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.22.5", + "@babel/plugin-transform-numeric-separator": "^7.22.5", + "@babel/plugin-transform-object-rest-spread": "^7.22.5", + "@babel/plugin-transform-object-super": "^7.22.5", + "@babel/plugin-transform-optional-catch-binding": "^7.22.5", + "@babel/plugin-transform-optional-chaining": "^7.22.6", + "@babel/plugin-transform-parameters": "^7.22.5", + "@babel/plugin-transform-private-methods": "^7.22.5", + "@babel/plugin-transform-private-property-in-object": "^7.22.5", + "@babel/plugin-transform-property-literals": "^7.22.5", + "@babel/plugin-transform-regenerator": "^7.22.5", + "@babel/plugin-transform-reserved-words": "^7.22.5", + "@babel/plugin-transform-shorthand-properties": "^7.22.5", + "@babel/plugin-transform-spread": "^7.22.5", + "@babel/plugin-transform-sticky-regex": "^7.22.5", + "@babel/plugin-transform-template-literals": "^7.22.5", + "@babel/plugin-transform-typeof-symbol": "^7.22.5", + "@babel/plugin-transform-unicode-escapes": "^7.22.5", + "@babel/plugin-transform-unicode-property-regex": "^7.22.5", + "@babel/plugin-transform-unicode-regex": "^7.22.5", + "@babel/plugin-transform-unicode-sets-regex": "^7.22.5", "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.18.10", - "babel-plugin-polyfill-corejs2": "^0.3.2", - "babel-plugin-polyfill-corejs3": "^0.5.3", - "babel-plugin-polyfill-regenerator": "^0.4.0", - "core-js-compat": "^3.22.1", - "semver": "^6.3.0" + "@babel/types": "^7.22.5", + "babel-plugin-polyfill-corejs2": "^0.4.4", + "babel-plugin-polyfill-corejs3": "^0.8.2", + "babel-plugin-polyfill-regenerator": "^0.5.1", + "core-js-compat": "^3.31.0", + "semver": "^6.3.1" }, "dependencies": { "semver": { @@ -23371,84 +26903,89 @@ "@babel/plugin-transform-react-pure-annotations": "^7.22.5" } }, + "@babel/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==", + "dev": true + }, "@babel/runtime": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.9.tgz", - "integrity": "sha512-lkqXDcvlFT5rvEjiu6+QYO+1GXrEHRo2LOtS7E4GtX5ESIZOgepqsZBVIj6Pv+a6zqsya9VCgiK1KAK4BvJDAw==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.6.tgz", + "integrity": "sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ==", "dev": true, "requires": { - "regenerator-runtime": "^0.13.4" + "regenerator-runtime": "^0.13.11" } }, "@babel/template": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz", - "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", + "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", "dev": true, "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.18.10", - "@babel/types": "^7.18.10" + "@babel/code-frame": "^7.22.5", + "@babel/parser": "^7.22.5", + "@babel/types": "^7.22.5" } }, "@babel/traverse": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.5.tgz", - "integrity": "sha512-czx7Xy5a6sapWWRx61m1Ke1Ra4vczu1mCTtJam5zRTBOonfdJ+S/B6HYmGYu3fJtr8GGET3si6IhgWVBhJ/m8w==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.23.5", - "@babel/generator": "^7.23.5", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.5", - "@babel/types": "^7.23.5", - "debug": "^4.1.0", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.7.tgz", + "integrity": "sha512-yb65Ed5S/QAcewNPh0nZczy9JdYXkkAbIsEo+P7BE7yO3txAY30Y/oPa3QkQ5It3xVG2kpKMg9MsdxZaO31uKA==", + "dev": true, + "requires": { + "@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" }, "dependencies": { "@babel/generator": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.5.tgz", - "integrity": "sha512-BPssCHrBD+0YrxviOa3QzpqwhNIXKEtOa2jQrm4FlmkC2apYgRnQcmPWiGZDlGxiNtltnUFolMe8497Esry+jA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.7.tgz", + "integrity": "sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA==", "dev": true, "requires": { - "@babel/types": "^7.23.5", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", + "@babel/types": "^7.24.7", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^2.5.1" } }, - "@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "@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==", "dev": true, "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" + "@babel/types": "^7.24.7" } } } }, "@babel/types": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.5.tgz", - "integrity": "sha512-ON5kSOJwVO6xXVRTvOI0eOnWe7VdUcIpsovGo9U/Br4Ie4UVFQTboO2cYnDhAGU6Fp+UxSiT+pMft0SMHfuq6w==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.7.tgz", + "integrity": "sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==", "dev": true, "requires": { - "@babel/helper-string-parser": "^7.23.4", - "@babel/helper-validator-identifier": "^7.22.20", + "@babel/helper-string-parser": "^7.24.7", + "@babel/helper-validator-identifier": "^7.24.7", "to-fast-properties": "^2.0.0" } }, "@braintree/sanitize-url": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-6.0.2.tgz", - "integrity": "sha512-Tbsj02wXCbqGmzdnXNk0SOF19ChhRU70BsroIi4Pm6Ehp56in6vch94mfbdQ17DozxkL3BAVjbZ4Qc1a0HFRAg==" + "integrity": "sha512-Tbsj02wXCbqGmzdnXNk0SOF19ChhRU70BsroIi4Pm6Ehp56in6vch94mfbdQ17DozxkL3BAVjbZ4Qc1a0HFRAg==", + "optional": true }, "@cspotcode/source-map-support": { "version": "0.8.1", @@ -23471,146 +27008,10 @@ } } }, - "@csstools/postcss-cascade-layers": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-1.1.1.tgz", - "integrity": "sha512-+KdYrpKC5TgomQr2DlZF4lDEpHcoxnj5IGddYYfBWJAKfj1JtuHUIqMa+E1pJJ+z3kvDViWMqyqPlG4Ja7amQA==", - "dev": true, - "requires": { - "@csstools/selector-specificity": "^2.0.2", - "postcss-selector-parser": "^6.0.10" - } - }, - "@csstools/postcss-color-function": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-1.1.1.tgz", - "integrity": "sha512-Bc0f62WmHdtRDjf5f3e2STwRAl89N2CLb+9iAwzrv4L2hncrbDwnQD9PCq0gtAt7pOI2leIV08HIBUd4jxD8cw==", - "dev": true, - "requires": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" - } - }, - "@csstools/postcss-font-format-keywords": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-1.0.1.tgz", - "integrity": "sha512-ZgrlzuUAjXIOc2JueK0X5sZDjCtgimVp/O5CEqTcs5ShWBa6smhWYbS0x5cVc/+rycTDbjjzoP0KTDnUneZGOg==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "@csstools/postcss-hwb-function": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-1.0.2.tgz", - "integrity": "sha512-YHdEru4o3Rsbjmu6vHy4UKOXZD+Rn2zmkAmLRfPet6+Jz4Ojw8cbWxe1n42VaXQhD3CQUXXTooIy8OkVbUcL+w==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "@csstools/postcss-ic-unit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-1.0.1.tgz", - "integrity": "sha512-Ot1rcwRAaRHNKC9tAqoqNZhjdYBzKk1POgWfhN4uCOE47ebGcLRqXjKkApVDpjifL6u2/55ekkpnFcp+s/OZUw==", - "dev": true, - "requires": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" - } - }, - "@csstools/postcss-is-pseudo-class": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-2.0.7.tgz", - "integrity": "sha512-7JPeVVZHd+jxYdULl87lvjgvWldYu+Bc62s9vD/ED6/QTGjy0jy0US/f6BG53sVMTBJ1lzKZFpYmofBN9eaRiA==", - "dev": true, - "requires": { - "@csstools/selector-specificity": "^2.0.0", - "postcss-selector-parser": "^6.0.10" - } - }, - "@csstools/postcss-nested-calc": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-nested-calc/-/postcss-nested-calc-1.0.0.tgz", - "integrity": "sha512-JCsQsw1wjYwv1bJmgjKSoZNvf7R6+wuHDAbi5f/7MbFhl2d/+v+TvBTU4BJH3G1X1H87dHl0mh6TfYogbT/dJQ==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "@csstools/postcss-normalize-display-values": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-1.0.1.tgz", - "integrity": "sha512-jcOanIbv55OFKQ3sYeFD/T0Ti7AMXc9nM1hZWu8m/2722gOTxFg7xYu4RDLJLeZmPUVQlGzo4jhzvTUq3x4ZUw==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "@csstools/postcss-oklab-function": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-1.1.1.tgz", - "integrity": "sha512-nJpJgsdA3dA9y5pgyb/UfEzE7W5Ka7u0CX0/HIMVBNWzWemdcTH3XwANECU6anWv/ao4vVNLTMxhiPNZsTK6iA==", - "dev": true, - "requires": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" - } - }, - "@csstools/postcss-progressive-custom-properties": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-1.3.0.tgz", - "integrity": "sha512-ASA9W1aIy5ygskZYuWams4BzafD12ULvSypmaLJT2jvQ8G0M3I8PRQhC0h7mG0Z3LI05+agZjqSR9+K9yaQQjA==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "@csstools/postcss-stepped-value-functions": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-1.0.1.tgz", - "integrity": "sha512-dz0LNoo3ijpTOQqEJLY8nyaapl6umbmDcgj4AD0lgVQ572b2eqA1iGZYTTWhrcrHztWDDRAX2DGYyw2VBjvCvQ==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "@csstools/postcss-text-decoration-shorthand": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-1.0.0.tgz", - "integrity": "sha512-c1XwKJ2eMIWrzQenN0XbcfzckOLLJiczqy+YvfGmzoVXd7pT9FfObiSEfzs84bpE/VqfpEuAZ9tCRbZkZxxbdw==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "@csstools/postcss-trigonometric-functions": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-1.0.2.tgz", - "integrity": "sha512-woKaLO///4bb+zZC2s80l+7cm07M7268MsyG3M0ActXXEFi6SuhvriQYcb58iiKGbjwwIU7n45iRLEHypB47Og==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "@csstools/postcss-unset-value": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@csstools/postcss-unset-value/-/postcss-unset-value-1.0.2.tgz", - "integrity": "sha512-c8J4roPBILnelAsdLr4XOAR/GsTm0GJi4XpcfvoWk3U6KiTCqiFYc63KhRMQQX35jYMp4Ao8Ij9+IZRgMfJp1g==", - "dev": true, - "requires": {} - }, - "@csstools/selector-specificity": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.0.2.tgz", - "integrity": "sha512-IkpVW/ehM1hWKln4fCA3NzJU8KwD+kIOvPZA4cqxoJHtE21CCzjyp+Kxbu0i5I4tBNOlXPL9mjwnWlL0VEG4Fg==", - "dev": true, - "requires": {} - }, "@cypress/request": { - "version": "2.88.12", - "resolved": "https://registry.npmjs.org/@cypress/request/-/request-2.88.12.tgz", - "integrity": "sha512-tOn+0mDZxASFM+cuAP9szGUGPI1HwWVSvdzm7V4cCsPdFTx6qMj29CwaQmRAMIEhORIUBFBsYROYJcveK4uOjA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@cypress/request/-/request-3.0.1.tgz", + "integrity": "sha512-TWivJlJi8ZDx2wGOw1dbLuHJKUYX7bWySw377nlnGOW3hP9/MUKIsEdXT/YngWxVdgNCHRBmFlBipE+5/2ZZlQ==", "dev": true, "requires": { "aws-sign2": "~0.7.0", @@ -23626,7 +27027,7 @@ "json-stringify-safe": "~5.0.1", "mime-types": "~2.1.19", "performance-now": "^2.1.0", - "qs": "~6.10.3", + "qs": "6.10.4", "safe-buffer": "^5.1.2", "tough-cookie": "^4.1.3", "tunnel-agent": "^0.6.0", @@ -24212,9 +27613,9 @@ } }, "webpack": { - "version": "4.46.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.46.0.tgz", - "integrity": "sha512-6jJuJjg8znb/xRItk7bkT0+Q7AHCYjjFnvKIWQPkNIOyRqoCGvkOs0ipeQzrqz4l5FtN5ZI/ukEHroeX/o1/5Q==", + "version": "4.47.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.47.0.tgz", + "integrity": "sha512-td7fYwgLSrky3fI1EuU5cneU4+pbH6GgOfuKNS1tNPcfdGinGELAqsb/BP4nnvZyKSG2i/xFGU7+n2PvZA8HJQ==", "dev": true, "requires": { "@webassemblyjs/ast": "1.9.0", @@ -24329,13 +27730,169 @@ "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", "dev": true }, + "@esbuild/android-arm": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.17.tgz", + "integrity": "sha512-wHsmJG/dnL3OkpAcwbgoBTTMHVi4Uyou3F5mf58ZtmUyIKfcdA7TROav/6tCzET4A3QW2Q2FC+eFneMU+iyOxg==", + "dev": true, + "optional": true + }, + "@esbuild/android-arm64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.17.tgz", + "integrity": "sha512-9np+YYdNDed5+Jgr1TdWBsozZ85U1Oa3xW0c7TWqH0y2aGghXtZsuT8nYRbzOMcl0bXZXjOGbksoTtVOlWrRZg==", + "dev": true, + "optional": true + }, + "@esbuild/android-x64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.17.tgz", + "integrity": "sha512-O+FeWB/+xya0aLg23hHEM2E3hbfwZzjqumKMSIqcHbNvDa+dza2D0yLuymRBQQnC34CWrsJUXyH2MG5VnLd6uw==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-arm64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.17.tgz", + "integrity": "sha512-M9uJ9VSB1oli2BE/dJs3zVr9kcCBBsE883prage1NWz6pBS++1oNn/7soPNS3+1DGj0FrkSvnED4Bmlu1VAE9g==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-x64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.17.tgz", + "integrity": "sha512-XDre+J5YeIJDMfp3n0279DFNrGCXlxOuGsWIkRb1NThMZ0BsrWXoTg23Jer7fEXQ9Ye5QjrvXpxnhzl3bHtk0g==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-arm64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.17.tgz", + "integrity": "sha512-cjTzGa3QlNfERa0+ptykyxs5A6FEUQQF0MuilYXYBGdBxD3vxJcKnzDlhDCa1VAJCmAxed6mYhA2KaJIbtiNuQ==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-x64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.17.tgz", + "integrity": "sha512-sOxEvR8d7V7Kw8QqzxWc7bFfnWnGdaFBut1dRUYtu+EIRXefBc/eIsiUiShnW0hM3FmQ5Zf27suDuHsKgZ5QrA==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.17.tgz", + "integrity": "sha512-2d3Lw6wkwgSLC2fIvXKoMNGVaeY8qdN0IC3rfuVxJp89CRfA3e3VqWifGDfuakPmp90+ZirmTfye1n4ncjv2lg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.17.tgz", + "integrity": "sha512-c9w3tE7qA3CYWjT+M3BMbwMt+0JYOp3vCMKgVBrCl1nwjAlOMYzEo+gG7QaZ9AtqZFj5MbUc885wuBBmu6aADQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ia32": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.17.tgz", + "integrity": "sha512-1DS9F966pn5pPnqXYz16dQqWIB0dmDfAQZd6jSSpiT9eX1NzKh07J6VKR3AoXXXEk6CqZMojiVDSZi1SlmKVdg==", + "dev": true, + "optional": true + }, "@esbuild/linux-loong64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.5.tgz", - "integrity": "sha512-UHkDFCfSGTuXq08oQltXxSZmH1TXyWsL+4QhZDWvvLl6mEJQqk3u7/wq1LjhrrAXYIllaTtRSzUXl4Olkf2J8A==", + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.17.tgz", + "integrity": "sha512-EvLsxCk6ZF0fpCB6w6eOI2Fc8KW5N6sHlIovNe8uOFObL2O+Mr0bflPHyHwLT6rwMg9r77WOAWb2FqCQrVnwFg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-mips64el": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.17.tgz", + "integrity": "sha512-e0bIdHA5p6l+lwqTE36NAW5hHtw2tNRmHlGBygZC14QObsA3bD4C6sXLJjvnDIjSKhW1/0S3eDy+QmX/uZWEYQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ppc64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.17.tgz", + "integrity": "sha512-BAAilJ0M5O2uMxHYGjFKn4nJKF6fNCdP1E0o5t5fvMYYzeIqy2JdAP88Az5LHt9qBoUa4tDaRpfWt21ep5/WqQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-riscv64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.17.tgz", + "integrity": "sha512-Wh/HW2MPnC3b8BqRSIme/9Zhab36PPH+3zam5pqGRH4pE+4xTrVLx2+XdGp6fVS3L2x+DrsIcsbMleex8fbE6g==", "dev": true, "optional": true }, + "@esbuild/linux-s390x": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.17.tgz", + "integrity": "sha512-j/34jAl3ul3PNcK3pfI0NSlBANduT2UO5kZ7FCaK33XFv3chDhICLY8wJJWIhiQ+YNdQ9dxqQctRg2bvrMlYgg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-x64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.17.tgz", + "integrity": "sha512-QM50vJ/y+8I60qEmFxMoxIx4de03pGo2HwxdBeFd4nMh364X6TIBZ6VQ5UQmPbQWUVWHWws5MmJXlHAXvJEmpQ==", + "dev": true, + "optional": true + }, + "@esbuild/netbsd-x64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.17.tgz", + "integrity": "sha512-/jGlhWR7Sj9JPZHzXyyMZ1RFMkNPjC6QIAan0sDOtIo2TYk3tZn5UDrkE0XgsTQCxWTTOcMPf9p6Rh2hXtl5TQ==", + "dev": true, + "optional": true + }, + "@esbuild/openbsd-x64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.17.tgz", + "integrity": "sha512-rSEeYaGgyGGf4qZM2NonMhMOP/5EHp4u9ehFiBrg7stH6BYEEjlkVREuDEcQ0LfIl53OXLxNbfuIj7mr5m29TA==", + "dev": true, + "optional": true + }, + "@esbuild/sunos-x64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.17.tgz", + "integrity": "sha512-Y7ZBbkLqlSgn4+zot4KUNYst0bFoO68tRgI6mY2FIM+b7ZbyNVtNbDP5y8qlu4/knZZ73fgJDlXID+ohY5zt5g==", + "dev": true, + "optional": true + }, + "@esbuild/win32-arm64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.17.tgz", + "integrity": "sha512-bwPmTJsEQcbZk26oYpc4c/8PvTY3J5/QK8jM19DVlEsAB41M39aWovWoHtNm78sd6ip6prilxeHosPADXtEJFw==", + "dev": true, + "optional": true + }, + "@esbuild/win32-ia32": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.17.tgz", + "integrity": "sha512-H/XaPtPKli2MhW+3CQueo6Ni3Avggi6hP/YvgkEe1aSaxw+AeO8MFjq8DlgfTd9Iz4Yih3QCZI6YLMoyccnPRg==", + "dev": true, + "optional": true + }, + "@esbuild/win32-x64": { + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.17.tgz", + "integrity": "sha512-fGEb8f2BSA3CW7riJVurug65ACLuQAzKq0SSqkY2b2yHHH0MzDfbLyKIGzHwOI/gkHcxM/leuSW6D5w/LMNitA==", + "dev": true, + "optional": true + }, + "@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, + "requires": { + "eslint-visitor-keys": "^3.3.0" + } + }, "@eslint/eslintrc": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.0.5.tgz", @@ -24392,11 +27949,11 @@ } }, "@fortawesome/angular-fontawesome": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/@fortawesome/angular-fontawesome/-/angular-fontawesome-0.11.1.tgz", - "integrity": "sha512-Ngzm5MVxk76ZhYpPTNOI/mpYNz9bzwfBXC5L9mktLgOONjBuYBPVt+bH8lny8hNtDk0ppZzXsMN6CO7hckdfnw==", + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@fortawesome/angular-fontawesome/-/angular-fontawesome-0.13.0.tgz", + "integrity": "sha512-gzSPRdveOXNO7NIiMgTyB46aiHG0i98KinnAEqHXi8qzraM/kCcHn/0y3f4MhemX6kftwsFli0IU8RyHmtXlSQ==", "requires": { - "tslib": "^2.4.0" + "tslib": "^2.4.1" } }, "@fortawesome/fontawesome-common-types": { @@ -24458,6 +28015,71 @@ "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", "dev": true }, + "@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "requires": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true + }, + "ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true + }, + "emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "requires": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + } + }, + "strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "requires": { + "ansi-regex": "^6.0.1" + } + }, + "wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "requires": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + } + } + } + }, "@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", @@ -24478,13 +28100,14 @@ "dev": true }, "@jridgewell/gen-mapping": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", - "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", "dev": true, "requires": { - "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10" + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" } }, "@jridgewell/resolve-uri": { @@ -24494,56 +28117,803 @@ "dev": true }, "@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "dev": true }, "@jridgewell/source-map": { - "version": "0.3.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, "requires": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "dependencies": { - "@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, - "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - } - } + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" } }, "@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==", + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", "dev": true }, "@jridgewell/trace-mapping": { - "version": "0.3.17", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", - "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dev": true, "requires": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, "@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 }, + "@material/animation": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/animation/-/animation-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-leRf+BcZTfC/iSigLXnYgcHAGvFVQveoJT5+2PIRdyPI/bIG7hhciRgacHRsCKC0sGya81dDblLgdkjSUemYLw==", + "requires": { + "tslib": "^2.1.0" + } + }, + "@material/auto-init": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/auto-init/-/auto-init-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-uxzDq7q3c0Bu1pAsMugc1Ik9ftQYQqZY+5e2ybNplT8gTImJhNt4M2mMiMHbMANk2l3UgICmUyRSomgPBWCPIA==", + "requires": { + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "@material/banner": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/banner/-/banner-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-SHeVoidCUFVhXANN6MNWxK9SZoTSgpIP8GZB7kAl52BywLxtV+FirTtLXkg/8RUkxZRyRWl7HvQ0ZFZa7QQAyA==", + "requires": { + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/button": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/shape": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/tokens": "15.0.0-canary.bc9ae6c9c.0", + "@material/typography": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "@material/base": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/base/-/base-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-Fc3vGuOf+duGo22HTRP6dHdc+MUe0VqQfWOuKrn/wXKD62m0QQR2TqJd3rRhCumH557T5QUyheW943M3E+IGfg==", + "requires": { + "tslib": "^2.1.0" + } + }, + "@material/button": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/button/-/button-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-3AQgwrPZCTWHDJvwgKq7Cj+BurQ4wTjDdGL+FEnIGUAjJDskwi1yzx5tW2Wf/NxIi7IoPFyOY3UB41jwMiOrnw==", + "requires": { + "@material/density": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/focus-ring": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/shape": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/tokens": "15.0.0-canary.bc9ae6c9c.0", + "@material/touch-target": "15.0.0-canary.bc9ae6c9c.0", + "@material/typography": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "@material/card": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/card/-/card-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-nPlhiWvbLmooTnBmV5gmzB0eLWSgLKsSRBYAbIBmO76Okgz1y+fQNLag+lpm/TDaHVsn5fmQJH8e0zIg0rYsQA==", + "requires": { + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/shape": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/tokens": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "@material/checkbox": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/checkbox/-/checkbox-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-4tpNnO1L0IppoMF3oeQn8F17t2n0WHB0D7mdJK9rhrujen/fLbekkIC82APB3fdGtLGg3qeNqDqPsJm1YnmrwA==", + "requires": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/density": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/focus-ring": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/touch-target": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "@material/chips": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/chips/-/chips-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-fqHKvE5bSWK0bXVkf57MWxZtytGqYBZvvHIOs4JI9HPHEhaJy4CpSw562BEtbm3yFxxALoQknvPW2KYzvADnmA==", + "requires": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/checkbox": "15.0.0-canary.bc9ae6c9c.0", + "@material/density": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/focus-ring": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/shape": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/tokens": "15.0.0-canary.bc9ae6c9c.0", + "@material/touch-target": "15.0.0-canary.bc9ae6c9c.0", + "@material/typography": "15.0.0-canary.bc9ae6c9c.0", + "safevalues": "^0.3.4", + "tslib": "^2.1.0" + } + }, + "@material/circular-progress": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/circular-progress/-/circular-progress-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-Lxe8BGAxQwCQqrLhrYrIP0Uok10h7aYS3RBXP41ph+5GmwJd5zdyE2t93qm2dyThvU6qKuXw9726Dtq/N+wvZQ==", + "requires": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/progress-indicator": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "@material/data-table": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/data-table/-/data-table-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-j/7qplT9+sUpfe4pyWhPbl01qJA+OoNAG3VMJruBBR461ZBKyTi7ssKH9yksFGZ8eCEPkOsk/+kDxsiZvRWkeQ==", + "requires": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/checkbox": "15.0.0-canary.bc9ae6c9c.0", + "@material/density": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/icon-button": "15.0.0-canary.bc9ae6c9c.0", + "@material/linear-progress": "15.0.0-canary.bc9ae6c9c.0", + "@material/list": "15.0.0-canary.bc9ae6c9c.0", + "@material/menu": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/select": "15.0.0-canary.bc9ae6c9c.0", + "@material/shape": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/tokens": "15.0.0-canary.bc9ae6c9c.0", + "@material/touch-target": "15.0.0-canary.bc9ae6c9c.0", + "@material/typography": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "@material/density": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/density/-/density-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-Zt3u07fXrBWLW06Tl5fgvjicxNQMkFdawLyNTzZ5TvbXfVkErILLePwwGaw8LNcvzqJP6ABLA8jiR+sKNoJQCg==", + "requires": { + "tslib": "^2.1.0" + } + }, + "@material/dialog": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/dialog/-/dialog-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-o+9a/fmwJ9+gY3Z/uhj/PMVJDq7it1NTWKJn2GwAKdB+fDkT4hb9qEdcxMPyvJJ5ups+XiKZo03+tZrD+38c1w==", + "requires": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/button": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/icon-button": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/shape": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/tokens": "15.0.0-canary.bc9ae6c9c.0", + "@material/touch-target": "15.0.0-canary.bc9ae6c9c.0", + "@material/typography": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "@material/dom": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/dom/-/dom-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-ly78R7aoCJtundSUu0UROU+5pQD5Piae0Y1MkN6bs0724azeazX1KeXFeaf06JOXnlr5/41ol+fSUPowjoqnOg==", + "requires": { + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "@material/drawer": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/drawer/-/drawer-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-PFL4cEFnt7VTxDsuspFVNhsFDYyumjU0VWfj3PWB7XudsEfQ3lo85D3HCEtTTbRsCainGN8bgYNDNafLBqiigw==", + "requires": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/list": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/shape": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/typography": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "@material/elevation": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/elevation/-/elevation-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-Ro+Pk8jFuap+T0B0shA3xI1hs2b89dNQ2EIPCNjNMp87emHKAzJfhKb7EZGIwv3+gFLlVaLyIVkb94I89KLsyg==", + "requires": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "@material/fab": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/fab/-/fab-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-dvU0KWMRglwJEQwmQtFAmJcAjzg9VFF6Aqj78bJYu/DAIGFJ1VTTTSgoXM/XCm1YyQEZ7kZRvxBO37CH54rSDg==", + "requires": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/focus-ring": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/shape": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/tokens": "15.0.0-canary.bc9ae6c9c.0", + "@material/touch-target": "15.0.0-canary.bc9ae6c9c.0", + "@material/typography": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "@material/feature-targeting": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/feature-targeting/-/feature-targeting-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-wkDjVcoVEYYaJvun28IXdln/foLgPD7n9ZC9TY76GErGCwTq+HWpU6wBAAk+ePmpRFDayw4vI4wBlaWGxLtysQ==", + "requires": { + "tslib": "^2.1.0" + } + }, + "@material/floating-label": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/floating-label/-/floating-label-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-bUWPtXzZITOD/2mkvLkEPO1ngDWmb74y0Kgbz6llHLOQBtycyJIpuoQJ1q2Ez0NM/tFLwPphhAgRqmL3YQ/Kzw==", + "requires": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/typography": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "@material/focus-ring": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/focus-ring/-/focus-ring-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-cZHThVose3GvAlJzpJoBI1iqL6d1/Jj9hXrR+r8Mwtb1hBIUEG3hxfsRd4vGREuzROPlf0OgNf/V+YHoSwgR5w==", + "requires": { + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0" + } + }, + "@material/form-field": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/form-field/-/form-field-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-+JFXy5X44Gue1CbZZAQ6YejnI203lebYwL0i6k0ylDpWHEOdD5xkF2PyHR28r9/65Ebcbwbff6q7kI1SGoT7MA==", + "requires": { + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/typography": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "@material/icon-button": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/icon-button/-/icon-button-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-1a0MHgyIwOs4RzxrVljsqSizGYFlM1zY2AZaLDsgT4G3kzsplTx8HZQ022GpUCjAygW+WLvg4z1qAhQHvsbqlw==", + "requires": { + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/density": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/focus-ring": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/touch-target": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "@material/image-list": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/image-list/-/image-list-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-WKWmiYap2iu4QdqmeUSliLlN4O2Ueqa0OuVAYHn/TCzmQ2xmnhZ1pvDLbs6TplpOmlki7vFfe+aSt5SU9gwfOQ==", + "requires": { + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/shape": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/typography": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "@material/layout-grid": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/layout-grid/-/layout-grid-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-5GqmT6oTZhUGWIb+CLD0ZNyDyTiJsr/rm9oRIi3+vCujACwxFkON9tzBlZohdtFS16nuzUusthN6Jt9UrJcN6Q==", + "requires": { + "tslib": "^2.1.0" + } + }, + "@material/line-ripple": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/line-ripple/-/line-ripple-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-8S30WXEuUdgDdBulzUDlPXD6qMzwCX9SxYb5mGDYLwl199cpSGdXHtGgEcCjokvnpLhdZhcT1Dsxeo1g2Evh5Q==", + "requires": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "@material/linear-progress": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/linear-progress/-/linear-progress-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-6EJpjrz6aoH2/gXLg9iMe0yF2C42hpQyZoHpmcgTLKeci85ktDvJIjwup8tnk8ULQyFiGiIrhXw2v2RSsiFjvQ==", + "requires": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/progress-indicator": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "@material/list": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/list/-/list-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-TQ1ppqiCMQj/P7bGD4edbIIv4goczZUoiUAaPq/feb1dflvrFMzYqJ7tQRRCyBL8nRhJoI2x99tk8Q2RXvlGUQ==", + "requires": { + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/density": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/shape": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/tokens": "15.0.0-canary.bc9ae6c9c.0", + "@material/typography": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "@material/menu": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/menu/-/menu-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-IlAh61xzrzxXs38QZlt74UYt8J431zGznSzDtB1Fqs6YFNd11QPKoiRXn1J2Qu/lUxbFV7i8NBKMCKtia0n6/Q==", + "requires": { + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/list": "15.0.0-canary.bc9ae6c9c.0", + "@material/menu-surface": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/shape": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/tokens": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "@material/menu-surface": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/menu-surface/-/menu-surface-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-dMtSPN+olTWE+08M5qe4ea1IZOhVryYqzK0Gyb2u1G75rSArUxCOB5rr6OC/ST3Mq3RS6zGuYo7srZt4534K9Q==", + "requires": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/shape": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "@material/notched-outline": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/notched-outline/-/notched-outline-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-WuurMg44xexkvLTBTnsO0A+qnzFjpcPdvgWBGstBepYozsvSF9zJGdb1x7Zv1MmqbpYh/Ohnuxtb/Y3jOh6irg==", + "requires": { + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/floating-label": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/shape": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "@material/progress-indicator": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/progress-indicator/-/progress-indicator-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-uOnsvqw5F2fkeTnTl4MrYzjI7KCLmmLyZaM0cgLNuLsWVlddQE+SGMl28tENx7DUK3HebWq0FxCP8f25LuDD+w==", + "requires": { + "tslib": "^2.1.0" + } + }, + "@material/radio": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/radio/-/radio-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-ehzOK+U1IxQN+OQjgD2lsnf1t7t7RAwQzeO6Czkiuid29ookYbQynWuLWk7NW8H8ohl7lnmfqTP1xSNkkL/F0g==", + "requires": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/density": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/focus-ring": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/touch-target": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "@material/ripple": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/ripple/-/ripple-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-JfLW+g3GMVDv4cruQ19+HUxpKVdWCldFlIPw1UYezz2h3WTNDy05S3uP2zUdXzZ01C3dkBFviv4nqZ0GCT16MA==", + "requires": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "@material/rtl": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/rtl/-/rtl-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-SkKLNLFp5QtG7/JEFg9R92qq4MzTcZ5As6sWbH7rRg6ahTHoJEuqE+pOb9Vrtbj84k5gtX+vCYPvCILtSlr2uw==", + "requires": { + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "@material/segmented-button": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/segmented-button/-/segmented-button-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-YDwkCWP9l5mIZJ7pZJZ2hMDxfBlIGVJ+deNzr8O+Z7/xC5LGXbl4R5aPtUVHygvXAXxpf5096ZD+dSXzYzvWlw==", + "requires": { + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/touch-target": "15.0.0-canary.bc9ae6c9c.0", + "@material/typography": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "@material/select": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/select/-/select-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-unfOWVf7T0sixVG+3k3RTuATfzqvCF6QAzA6J9rlCh/Tq4HuIBNDdV4z19IVu4zwmgWYxY0iSvqWUvdJJYwakQ==", + "requires": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/density": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/floating-label": "15.0.0-canary.bc9ae6c9c.0", + "@material/line-ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/list": "15.0.0-canary.bc9ae6c9c.0", + "@material/menu": "15.0.0-canary.bc9ae6c9c.0", + "@material/menu-surface": "15.0.0-canary.bc9ae6c9c.0", + "@material/notched-outline": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/shape": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/tokens": "15.0.0-canary.bc9ae6c9c.0", + "@material/typography": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "@material/shape": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/shape/-/shape-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-Dsvr771ZKC46ODzoixLdGwlLEQLfxfLrtnRojXABoZf5G3o9KtJU+J+5Ld5aa960OAsCzzANuaub4iR88b1guA==", + "requires": { + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "@material/slider": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/slider/-/slider-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-3AEu+7PwW4DSNLndue47dh2u7ga4hDJRYmuu7wnJCIWJBnLCkp6C92kNc4Rj5iQY2ftJio5aj1gqryluh5tlYg==", + "requires": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/tokens": "15.0.0-canary.bc9ae6c9c.0", + "@material/typography": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "@material/snackbar": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/snackbar/-/snackbar-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-TwwQSYxfGK6mc03/rdDamycND6o+1p61WNd7ElZv1F1CLxB4ihRjbCoH7Qo+oVDaP8CTpjeclka+24RLhQq0mA==", + "requires": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/button": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/icon-button": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/shape": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/tokens": "15.0.0-canary.bc9ae6c9c.0", + "@material/typography": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "@material/switch": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/switch/-/switch-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-OjUjtT0kRz1ASAsOS+dNzwMwvsjmqy5edK57692qmrP6bL4GblFfBDoiNJ6t0AN4OaKcmL5Hy/xNrTdOZW7Qqw==", + "requires": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/density": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/focus-ring": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/shape": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/tokens": "15.0.0-canary.bc9ae6c9c.0", + "safevalues": "^0.3.4", + "tslib": "^2.1.0" + } + }, + "@material/tab": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/tab/-/tab-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-s/L9otAwn/pZwVQZBRQJmPqYeNbjoEbzbjMpDQf/VBG/6dJ+aP03ilIBEkqo8NVnCoChqcdtVCoDNRtbU+yp6w==", + "requires": { + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/focus-ring": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/tab-indicator": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/tokens": "15.0.0-canary.bc9ae6c9c.0", + "@material/typography": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "@material/tab-bar": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/tab-bar/-/tab-bar-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-Xmtq0wJGfu5k+zQeFeNsr4bUKv7L+feCmUp/gsapJ655LQKMXOUQZtSv9ZqWOfrCMy55hoF1CzGFV+oN3tyWWQ==", + "requires": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/density": "15.0.0-canary.bc9ae6c9c.0", + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/tab": "15.0.0-canary.bc9ae6c9c.0", + "@material/tab-indicator": "15.0.0-canary.bc9ae6c9c.0", + "@material/tab-scroller": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/tokens": "15.0.0-canary.bc9ae6c9c.0", + "@material/typography": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "@material/tab-indicator": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/tab-indicator/-/tab-indicator-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-despCJYi1GrDDq7F2hvLQkObHnSLZPPDxnOzU16zJ6FNYvIdszgfzn2HgAZ6pl5hLOexQ8cla6cAqjTDuaJBhQ==", + "requires": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "@material/tab-scroller": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/tab-scroller/-/tab-scroller-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-QWHG/EWxirj4V9u2IHz+OSY9XCWrnNrPnNgEufxAJVUKV/A8ma1DYeFSQqxhX709R8wKGdycJksg0Flkl7Gq7w==", + "requires": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/tab": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "@material/textfield": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/textfield/-/textfield-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-R3qRex9kCaZIAK8DuxPnVC42R0OaW7AB7fsFknDKeTeVQvRcbnV8E+iWSdqTiGdsi6QQHifX8idUrXw+O45zPw==", + "requires": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/density": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/floating-label": "15.0.0-canary.bc9ae6c9c.0", + "@material/line-ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/notched-outline": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/shape": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/tokens": "15.0.0-canary.bc9ae6c9c.0", + "@material/typography": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "@material/theme": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/theme/-/theme-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-CpUwXGE0dbhxQ45Hu9r9wbJtO/MAlv5ER4tBHA9tp/K+SU+lDgurBE2touFMg5INmdfVNtdumxb0nPPLaNQcUg==", + "requires": { + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "@material/tokens": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/tokens/-/tokens-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-nbEuGj05txWz6ZMUanpM47SaAD7soyjKILR+XwDell9Zg3bGhsnexCNXPEz2fD+YgomS+jM5XmIcaJJHg/H93Q==", + "requires": { + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0" + } + }, + "@material/tooltip": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/tooltip/-/tooltip-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-UzuXp0b9NuWuYLYpPguxrjbJnCmT/Cco8CkjI/6JajxaeA3o2XEBbQfRMTq8PTafuBjCHTc0b0mQY7rtxUp1Gg==", + "requires": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/button": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/shape": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/tokens": "15.0.0-canary.bc9ae6c9c.0", + "@material/typography": "15.0.0-canary.bc9ae6c9c.0", + "safevalues": "^0.3.4", + "tslib": "^2.1.0" + } + }, + "@material/top-app-bar": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/top-app-bar/-/top-app-bar-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-vJWjsvqtdSD5+yQ/9vgoBtBSCvPJ5uF/DVssv8Hdhgs1PYaAcODUi77kdi0+sy/TaWyOsTkQixqmwnFS16zesA==", + "requires": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/shape": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/typography": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "@material/touch-target": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/touch-target/-/touch-target-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-AqYh9fjt+tv4ZE0C6MeYHblS2H+XwLbDl2mtyrK0DOEnCVQk5/l5ImKDfhrUdFWHvS4a5nBM4AA+sa7KaroLoA==", + "requires": { + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "@material/typography": { + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/typography/-/typography-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-CKsG1zyv34AKPNyZC8olER2OdPII64iR2SzQjpqh1UUvmIFiMPk23LvQ1OnC5aCB14pOXzmVgvJt31r9eNdZ6Q==", + "requires": { + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "tslib": "^2.1.0" + } + }, + "@ngbracket/ngx-layout": { + "version": "15.1.3", + "resolved": "https://registry.npmjs.org/@ngbracket/ngx-layout/-/ngx-layout-15.1.3.tgz", + "integrity": "sha512-0fPiJ/DLNEWfyn/71IHuJ3SWpNFGLKMrEE79AIBczWStQ9I1t2IrOANKYi3r+7gcojisHbdfUc4q/6vjVfKt8w==", + "requires": { + "tslib": "^2.5.0" + } + }, "@ngneat/forms-manager": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/@ngneat/forms-manager/-/forms-manager-2.5.0.tgz", @@ -24560,9 +28930,9 @@ } }, "@ngtools/webpack": { - "version": "14.2.7", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-14.2.7.tgz", - "integrity": "sha512-I47BdEybpzjfFFMFB691o9C+69RexLTgSm/VCyDn4M8DrGrZpgYNhxN+AEr1uA6Bi6MaPG6w+TMac5tNIaO4Yw==", + "version": "16.2.16", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-16.2.16.tgz", + "integrity": "sha512-4gm2allK0Pjy/Lxb9IGRnhEZNEOJSOTWwy09VOdHouV2ODRK7Tto2LgteaFJUUSLkuvWRsI7pfuA6yrz8KDfHw==", "dev": true, "requires": {} }, @@ -24593,48 +28963,72 @@ } }, "@npmcli/fs": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.2.tgz", - "integrity": "sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.1.tgz", + "integrity": "sha512-q9CRWjpHCMIh5sVyefoD1cA7PkvILqCZsnSOEUUivORLjxCO/Irmue2DprETiNgEqktDBZaM1Bi+jrarx1XdCg==", "dev": true, "requires": { - "@gar/promisify": "^1.1.3", "semver": "^7.3.5" } }, "@npmcli/git": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-3.0.2.tgz", - "integrity": "sha512-CAcd08y3DWBJqJDpfuVL0uijlq5oaXaOJEKHKc4wqrjd00gkvTZB+nFuLn+doOOKddaQS9JfqtNoFCO2LCvA3w==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-4.1.0.tgz", + "integrity": "sha512-9hwoB3gStVfa0N31ymBmrX+GuDGdVA/QWShZVqE0HK2Af+7QGGrCTbZia/SW0ImUTjTne7SP91qxDmtXvDHRPQ==", "dev": true, "requires": { - "@npmcli/promise-spawn": "^3.0.0", + "@npmcli/promise-spawn": "^6.0.0", "lru-cache": "^7.4.4", - "mkdirp": "^1.0.4", - "npm-pick-manifest": "^7.0.0", - "proc-log": "^2.0.0", + "npm-pick-manifest": "^8.0.0", + "proc-log": "^3.0.0", "promise-inflight": "^1.0.1", "promise-retry": "^2.0.1", "semver": "^7.3.5", - "which": "^2.0.2" + "which": "^3.0.0" }, "dependencies": { "lru-cache": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.14.0.tgz", - "integrity": "sha512-EIRtP1GrSJny0dqb50QXRUNBxHJhcpxHC++M5tD7RYbvLLn5KVWKsbyswSSqDuU15UFi3bgTQIY8nhDMeF6aDQ==", + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "dev": true + }, + "which": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", + "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } } } }, "@npmcli/installed-package-contents": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-1.0.7.tgz", - "integrity": "sha512-9rufe0wnJusCQoLpV9ZPKIVP55itrM5BxOXs10DmdbRfgWtHy1LDyskbwRnBghuB0PrF7pNPOqREVtpz4HqzKw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-2.1.0.tgz", + "integrity": "sha512-c8UuGLeZpm69BryRykLuKRyKFZYJsZSCT4aVY5ds4omyZqJ172ApzgfKJ5eV/r3HgLdUYgFVe54KSFVjKoe27w==", "dev": true, "requires": { - "npm-bundled": "^1.1.1", - "npm-normalize-package-bin": "^1.0.1" + "npm-bundled": "^3.0.0", + "npm-normalize-package-bin": "^3.0.0" + }, + "dependencies": { + "npm-bundled": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-3.0.1.tgz", + "integrity": "sha512-+AvaheE/ww1JEwRHOrn4WHNzOxGtVp+adrg2AeZS/7KuxGUYFuBta98wYpfHBbJp6Tg6j1NKSEVHNcfZzJHQwQ==", + "dev": true, + "requires": { + "npm-normalize-package-bin": "^3.0.0" + } + }, + "npm-normalize-package-bin": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz", + "integrity": "sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==", + "dev": true + } } }, "@npmcli/move-file": { @@ -24648,47 +29042,199 @@ } }, "@npmcli/node-gyp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-2.0.0.tgz", - "integrity": "sha512-doNI35wIe3bBaEgrlPfdJPaCpUR89pJWep4Hq3aRdh6gKazIVWfs0jHttvSSoq47ZXgC7h73kDsUl8AoIQUB+A==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-3.0.0.tgz", + "integrity": "sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA==", "dev": true }, "@npmcli/promise-spawn": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-3.0.0.tgz", - "integrity": "sha512-s9SgS+p3a9Eohe68cSI3fi+hpcZUmXq5P7w0kMlAsWVtR7XbK3ptkZqKT2cK1zLDObJ3sR+8P59sJE0w/KTL1g==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-6.0.2.tgz", + "integrity": "sha512-gGq0NJkIGSwdbUt4yhdF8ZrmkGKVz9vAdVzpOfnom+V8PLSmSOVhZwbNvZZS1EYcJN5hzzKBxmmVVAInM6HQLg==", "dev": true, "requires": { - "infer-owner": "^1.0.4" + "which": "^3.0.0" + }, + "dependencies": { + "which": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", + "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } } }, "@npmcli/run-script": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-4.2.1.tgz", - "integrity": "sha512-7dqywvVudPSrRCW5nTHpHgeWnbBtz8cFkOuKrecm6ih+oO9ciydhWt6OF7HlqupRRmB8Q/gECVdB9LMfToJbRg==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-6.0.2.tgz", + "integrity": "sha512-NCcr1uQo1k5U+SYlnIrbAh3cxy+OQT1VtqiAbxdymSlptbzBb62AjH2xXgjNCoP073hoa1CfCAcwoZ8k96C4nA==", "dev": true, "requires": { - "@npmcli/node-gyp": "^2.0.0", - "@npmcli/promise-spawn": "^3.0.0", + "@npmcli/node-gyp": "^3.0.0", + "@npmcli/promise-spawn": "^6.0.0", "node-gyp": "^9.0.0", - "read-package-json-fast": "^2.0.3", - "which": "^2.0.2" + "read-package-json-fast": "^3.0.0", + "which": "^3.0.0" + }, + "dependencies": { + "which": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", + "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "@nrwl/devkit": { + "version": "16.5.1", + "resolved": "https://registry.npmjs.org/@nrwl/devkit/-/devkit-16.5.1.tgz", + "integrity": "sha512-NB+DE/+AFJ7lKH/WBFyatJEhcZGj25F24ncDkwjZ6MzEiSOGOJS0LaV/R+VUsmS5EHTPXYOpn3zHWWAcJhyOmA==", + "dev": true, + "requires": { + "@nx/devkit": "16.5.1" + } + }, + "@nrwl/tao": { + "version": "16.5.1", + "resolved": "https://registry.npmjs.org/@nrwl/tao/-/tao-16.5.1.tgz", + "integrity": "sha512-x+gi/fKdM6uQNIti9exFlm3V5LBP3Y8vOEziO42HdOigyrXa0S0HD2WMpccmp6PclYKhwEDUjKJ39xh5sdh4Ig==", + "dev": true, + "requires": { + "nx": "16.5.1" + } + }, + "@nx/devkit": { + "version": "16.5.1", + "resolved": "https://registry.npmjs.org/@nx/devkit/-/devkit-16.5.1.tgz", + "integrity": "sha512-T1acZrVVmJw/sJ4PIGidCBYBiBqlg/jT9e8nIGXLSDS20xcLvfo4zBQf8UZLrmHglnwwpDpOWuVJCp2rYA5aDg==", + "dev": true, + "requires": { + "@nrwl/devkit": "16.5.1", + "ejs": "^3.1.7", + "ignore": "^5.0.4", + "semver": "7.5.3", + "tmp": "~0.2.1", + "tslib": "^2.3.0" + }, + "dependencies": { + "semver": { + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", + "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } } }, + "@nx/nx-darwin-arm64": { + "version": "16.5.1", + "resolved": "https://registry.npmjs.org/@nx/nx-darwin-arm64/-/nx-darwin-arm64-16.5.1.tgz", + "integrity": "sha512-q98TFI4B/9N9PmKUr1jcbtD4yAFs1HfYd9jUXXTQOlfO9SbDjnrYJgZ4Fp9rMNfrBhgIQ4x1qx0AukZccKmH9Q==", + "dev": true, + "optional": true + }, + "@nx/nx-darwin-x64": { + "version": "16.5.1", + "resolved": "https://registry.npmjs.org/@nx/nx-darwin-x64/-/nx-darwin-x64-16.5.1.tgz", + "integrity": "sha512-j9HmL1l8k7EVJ3eOM5y8COF93gqrydpxCDoz23ZEtsY+JHY77VAiRQsmqBgEx9GGA2dXi9VEdS67B0+1vKariw==", + "dev": true, + "optional": true + }, + "@nx/nx-freebsd-x64": { + "version": "16.5.1", + "resolved": "https://registry.npmjs.org/@nx/nx-freebsd-x64/-/nx-freebsd-x64-16.5.1.tgz", + "integrity": "sha512-CXSPT01aVS869tvCCF2tZ7LnCa8l41wJ3mTVtWBkjmRde68E5Up093hklRMyXb3kfiDYlfIKWGwrV4r0eH6x1A==", + "dev": true, + "optional": true + }, + "@nx/nx-linux-arm-gnueabihf": { + "version": "16.5.1", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-16.5.1.tgz", + "integrity": "sha512-BhrumqJSZCWFfLFUKl4CAUwR0Y0G2H5EfFVGKivVecEQbb+INAek1aa6c89evg2/OvetQYsJ+51QknskwqvLsA==", + "dev": true, + "optional": true + }, + "@nx/nx-linux-arm64-gnu": { + "version": "16.5.1", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-16.5.1.tgz", + "integrity": "sha512-x7MsSG0W+X43WVv7JhiSq2eKvH2suNKdlUHEG09Yt0vm3z0bhtym1UCMUg3IUAK7jy9hhLeDaFVFkC6zo+H/XQ==", + "dev": true, + "optional": true + }, + "@nx/nx-linux-arm64-musl": { + "version": "16.5.1", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-16.5.1.tgz", + "integrity": "sha512-J+/v/mFjOm74I0PNtH5Ka+fDd+/dWbKhpcZ2R1/6b9agzZk+Ff/SrwJcSYFXXWKbPX+uQ4RcJoytT06Zs3s0ow==", + "dev": true, + "optional": true + }, + "@nx/nx-linux-x64-gnu": { + "version": "16.5.1", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-16.5.1.tgz", + "integrity": "sha512-igooWJ5YxQ94Zft7IqgL+Lw0qHaY15Btw4gfK756g/YTYLZEt4tTvR1y6RnK/wdpE3sa68bFTLVBNCGTyiTiDQ==", + "dev": true, + "optional": true + }, + "@nx/nx-linux-x64-musl": { + "version": "16.5.1", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-16.5.1.tgz", + "integrity": "sha512-zF/exnPqFYbrLAduGhTmZ7zNEyADid2bzNQiIjJkh8Y6NpDwrQIwVIyvIxqynsjMrIs51kBH+8TUjKjj2Jgf5A==", + "dev": true, + "optional": true + }, + "@nx/nx-win32-arm64-msvc": { + "version": "16.5.1", + "resolved": "https://registry.npmjs.org/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-16.5.1.tgz", + "integrity": "sha512-qtqiLS9Y9TYyAbbpq58kRoOroko4ZXg5oWVqIWFHoxc5bGPweQSJCROEqd1AOl2ZDC6BxfuVHfhDDop1kK05WA==", + "dev": true, + "optional": true + }, + "@nx/nx-win32-x64-msvc": { + "version": "16.5.1", + "resolved": "https://registry.npmjs.org/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-16.5.1.tgz", + "integrity": "sha512-kUJBLakK7iyA9WfsGGQBVennA4jwf5XIgm0lu35oMOphtZIluvzItMt0EYBmylEROpmpEIhHq0P6J9FA+WH0Rg==", + "dev": true, + "optional": true + }, + "@parcel/watcher": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.0.4.tgz", + "integrity": "sha512-cTDi+FUDBIUOBKEtj+nhiJ71AZVlkAsQFuGQTun5tV9mwQBQgZvhCzG+URPQc8myeN32yRVZEfVAPCs1RW+Jvg==", + "dev": true, + "requires": { + "node-addon-api": "^3.2.1", + "node-gyp-build": "^4.3.0" + } + }, + "@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "optional": true + }, "@popperjs/core": { "version": "2.11.2", "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.2.tgz", "integrity": "sha512-92FRmppjjqz29VMJ2dn+xdyXZBrMlE42AV6Kq6BwjWV7CNUW1hs2FtxSNLQE+gJhaZ6AAmYuO9y8dshhcBl7vA==" }, "@schematics/angular": { - "version": "14.2.7", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-14.2.7.tgz", - "integrity": "sha512-ujtLu0gWARtJsRbN+P+McDO0Y0ygJjUN5016SdbmYDMcDJkwi+GYHU8Yvh/UONtmNor3JdV8AnZ8OmWTlswTDA==", + "version": "16.2.14", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-16.2.14.tgz", + "integrity": "sha512-YqIv727l9Qze8/OL6H9mBHc2jVXzAGRNBYnxYWqWhLbfvuVbbldo6NNIIjgv6lrl2LJSdPAAMNOD5m/f6210ug==", "dev": true, "requires": { - "@angular-devkit/core": "14.2.7", - "@angular-devkit/schematics": "14.2.7", - "jsonc-parser": "3.1.0" + "@angular-devkit/core": "16.2.14", + "@angular-devkit/schematics": "16.2.14", + "jsonc-parser": "3.2.0" } }, "@schematics/update": { @@ -25136,16 +29682,120 @@ } } }, + "@sigstore/bundle": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-1.1.0.tgz", + "integrity": "sha512-PFutXEy0SmQxYI4texPw3dd2KewuNqv7OuK1ZFtY2fM754yhvG2KdgwIhRnoEE2uHdtdGNQ8s0lb94dW9sELog==", + "dev": true, + "requires": { + "@sigstore/protobuf-specs": "^0.2.0" + } + }, + "@sigstore/protobuf-specs": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.2.1.tgz", + "integrity": "sha512-XTWVxnWJu+c1oCshMLwnKvz8ZQJJDVOlciMfgpJBQbThVjKTCG8dwyhgLngBD2KN0ap9F/gOV8rFDEx8uh7R2A==", + "dev": true + }, + "@sigstore/sign": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-1.0.0.tgz", + "integrity": "sha512-INxFVNQteLtcfGmcoldzV6Je0sbbfh9I16DM4yJPw3j5+TFP8X6uIiA18mvpEa9yyeycAKgPmOA3X9hVdVTPUA==", + "dev": true, + "requires": { + "@sigstore/bundle": "^1.1.0", + "@sigstore/protobuf-specs": "^0.2.0", + "make-fetch-happen": "^11.0.1" + }, + "dependencies": { + "@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "dev": true + }, + "http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, + "requires": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + } + }, + "lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true + }, + "make-fetch-happen": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", + "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", + "dev": true, + "requires": { + "agentkeepalive": "^4.2.1", + "cacache": "^17.0.0", + "http-cache-semantics": "^4.1.1", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.7.1", + "minipass": "^5.0.0", + "minipass-fetch": "^3.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^7.0.0", + "ssri": "^10.0.0" + } + }, + "minipass-fetch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.5.tgz", + "integrity": "sha512-2N8elDQAtSnFV0Dk7gt15KHsS0Fyz6CbYZ360h0WTYV1Ty46li3rAXVOQj1THMNLdmrD9Vt5pBPtWtVkpwGBqg==", + "dev": true, + "requires": { + "encoding": "^0.1.13", + "minipass": "^7.0.3", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "dependencies": { + "minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true + } + } + } + } + }, + "@sigstore/tuf": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-1.0.3.tgz", + "integrity": "sha512-2bRovzs0nJZFlCN3rXirE4gwxCn97JNjMmwpecqlbgV9WcxX7WRuIrgzx/X7Ib7MYRbyUTpBYE0s2x6AmZXnlg==", + "dev": true, + "requires": { + "@sigstore/protobuf-specs": "^0.2.0", + "tuf-js": "^1.1.7" + } + }, "@socket.io/component-emitter": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz", - "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", + "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==", "dev": true }, "@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", "dev": true }, "@tsconfig/node10": { @@ -25172,10 +29822,46 @@ "integrity": "sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==", "dev": true }, + "@tufjs/canonical-json": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@tufjs/canonical-json/-/canonical-json-1.0.0.tgz", + "integrity": "sha512-QTnf++uxunWvG2z3UFNzAoQPHxnSXOwtaI3iJ+AohhV+5vONuArPjJE7aPXPVXfXJsqrVbZBu9b81AJoSd09IQ==", + "dev": true + }, + "@tufjs/models": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-1.0.4.tgz", + "integrity": "sha512-qaGV9ltJP0EO25YfFUPhxRVK0evXFIAGicsVXuRim4Ed9cjPxYhNnNJ49SFmbeLgtxpslIkX317IgpfcHPVj/A==", + "dev": true, + "requires": { + "@tufjs/canonical-json": "1.0.0", + "minimatch": "^9.0.0" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + } + } + }, "@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, "requires": { "@types/connect": "*", @@ -25183,27 +29869,27 @@ } }, "@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, "requires": { "@types/node": "*" } }, "@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, "requires": { "@types/node": "*" } }, "@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, "requires": { "@types/express-serve-static-core": "*", @@ -25217,9 +29903,9 @@ "dev": true }, "@types/cors": { - "version": "2.8.13", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.13.tgz", - "integrity": "sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA==", + "version": "2.8.17", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.17.tgz", + "integrity": "sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==", "dev": true, "requires": { "@types/node": "*" @@ -25237,59 +29923,46 @@ "integrity": "sha512-lhnbkC0XorAD7Dt7X+94cXUSHEdDNnEVk/DgFLHgIZQNhixV631Lj4+KpXunTT5rCHyj9RqK3TfO7QrOiwEeUQ==", "dev": true }, - "@types/eslint": { - "version": "8.4.8", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.8.tgz", - "integrity": "sha512-zUCKQI1bUCTi+0kQs5ZQzQ/XILWRLIlh15FXWNykJ+NG3TMKMVvwwC6GP3DR1Ylga15fB7iAExSzc4PNlR5i3w==", - "dev": true, - "requires": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "@types/eslint-scope": { - "version": "3.7.4", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", - "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", - "dev": true, - "requires": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, "@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 }, "@types/express": { - "version": "4.17.14", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.14.tgz", - "integrity": "sha512-TEbt+vaPFQ+xpxFLFssxUDXj5cWCxZJjIcB7Yg0k0GMHGtgtQgpvx/MUQUeAkNbA9AAGrwkAsoeItdTgS7FMyg==", + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", + "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", "dev": true, "requires": { "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.18", + "@types/express-serve-static-core": "^4.17.33", "@types/qs": "*", "@types/serve-static": "*" } }, "@types/express-serve-static-core": { - "version": "4.17.31", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.31.tgz", - "integrity": "sha512-DxMhY+NAsTwMMFHBTtJFNp5qiHKJ7TeqOo23zVEM9alT1Ml27Q3xcTH0xwxn7Q0BbMcVEJOs/7aQtUWupUQN3Q==", + "version": "4.19.5", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.5.tgz", + "integrity": "sha512-y6W03tvrACO72aijJ5uF02FRq5cgDR9lUxddQ8vyF+GvmjJQqbzDcJngEjURc+ZsG31VI3hODNZJ2URj86pzmg==", "dev": true, "requires": { "@types/node": "*", "@types/qs": "*", - "@types/range-parser": "*" + "@types/range-parser": "*", + "@types/send": "*" } }, + "@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 + }, "@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.15", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.15.tgz", + "integrity": "sha512-25g5atgiVNTIv0LBDTg1H74Hvayx0ajtJPLLcYE3whFv75J0pWNtOBzaXJQgDTmrX1bx5U9YC2w/n65BN1HwRQ==", "dev": true, "requires": { "@types/node": "*" @@ -25323,21 +29996,34 @@ "dev": true }, "@types/marked": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/@types/marked/-/marked-4.0.7.tgz", - "integrity": "sha512-eEAhnz21CwvKVW+YvRvcTuFKNU9CV1qH+opcgVK3pIMI6YZzDm6gc8o2vHjldFk6MGKt5pueSB7IOpvpx5Qekw==" + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@types/marked/-/marked-4.3.2.tgz", + "integrity": "sha512-a79Yc3TOk6dGdituy8hmTTJXjOkZ7zsFYV10L337ttq/rec8lRMDBpV7fL3uLx6TgbFCa5DU/h8FmIBQPSbU0w==", + "peer": true }, "@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 }, "@types/node": { - "version": "15.14.9", - "resolved": "https://registry.npmjs.org/@types/node/-/node-15.14.9.tgz", - "integrity": "sha512-qjd88DrCxupx/kJD5yQgZdcYKZKSIGBVDIBE1/LTGcNm3d2Np/jxojkdePDdfnBHJc5W7vSMpbJ1aB7p/Py69A==", - "dev": true + "version": "18.19.39", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.39.tgz", + "integrity": "sha512-nPwTRDKUctxw3di5b4TfT3I0sWDiWoPQCZjXhvdkINntwr8lcoVCKsTgnXeRubKIlfnV+eN/HYk6Jb40tbcEAQ==", + "dev": true, + "requires": { + "undici-types": "~5.26.4" + } + }, + "@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, + "requires": { + "@types/node": "*" + } }, "@types/parse-json": { "version": "4.0.0", @@ -25346,15 +30032,15 @@ "dev": true }, "@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.16", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.16.tgz", + "integrity": "sha512-7i+zxXdPD0T4cKDuxCUXJ4wHcsJLwENa6Z3dCu8cfCK743OGy5Nu1RmAGqDPsoTDINVEcdXKRvR/zre+P2Ku1A==", "dev": true }, "@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 }, "@types/retry": { @@ -25363,23 +30049,40 @@ "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", "dev": true }, + "@types/semver": { + "version": "7.5.8", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", + "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", + "dev": true + }, + "@types/send": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", + "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", + "dev": true, + "requires": { + "@types/mime": "^1", + "@types/node": "*" + } + }, "@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, "requires": { "@types/express": "*" } }, "@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, "requires": { - "@types/mime": "*", - "@types/node": "*" + "@types/http-errors": "*", + "@types/node": "*", + "@types/send": "*" } }, "@types/sinonjs__fake-timers": { @@ -25395,9 +30098,9 @@ "dev": true }, "@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, "requires": { "@types/node": "*" @@ -25416,9 +30119,9 @@ "dev": true }, "@types/ws": { - "version": "8.5.3", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.3.tgz", - "integrity": "sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==", + "version": "8.5.12", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.12.tgz", + "integrity": "sha512-3tPRkv1EtkDpzlgyKyI8pGsGZAGPEaXeu0DOj5DI25Ja91bdAYddYHbADRYVrZMRbfW+1l5YwXVDKohDJNQxkQ==", "dev": true, "requires": { "@types/node": "*" @@ -25487,31 +30190,31 @@ } }, "@typescript-eslint/type-utils": { - "version": "5.37.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.37.0.tgz", - "integrity": "sha512-BSx/O0Z0SXOF5tY0bNTBcDEKz2Ec20GVYvq/H/XNKiUorUFilH7NPbFUuiiyzWaSdN3PA8JV0OvYx0gH/5aFAQ==", + "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, "requires": { - "@typescript-eslint/typescript-estree": "5.37.0", - "@typescript-eslint/utils": "5.37.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "@typescript-eslint/utils": "5.62.0", "debug": "^4.3.4", "tsutils": "^3.21.0" }, "dependencies": { "@typescript-eslint/types": { - "version": "5.37.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.37.0.tgz", - "integrity": "sha512-3frIJiTa5+tCb2iqR/bf7XwU20lnU05r/sgPJnRpwvfZaqCJBrl8Q/mw9vr3NrNdB/XtVyMA0eppRMMBqdJ1bA==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", + "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "5.37.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.37.0.tgz", - "integrity": "sha512-JkFoFIt/cx59iqEDSgIGnQpCTRv96MQnXCYvJi7QhBC24uyuzbD8wVbajMB1b9x4I0octYFJ3OwjAwNqk1AjDA==", + "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, "requires": { - "@typescript-eslint/types": "5.37.0", - "@typescript-eslint/visitor-keys": "5.37.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", @@ -25520,23 +30223,14 @@ } }, "@typescript-eslint/visitor-keys": { - "version": "5.37.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.37.0.tgz", - "integrity": "sha512-Hp7rT4cENBPIzMwrlehLW/28EVCOcE9U1Z1BQTc8EA8v5qpr7GRGuG+U58V5tTY48zvUOA3KHvw3rA8tY9fbdA==", + "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, "requires": { - "@typescript-eslint/types": "5.37.0", + "@typescript-eslint/types": "5.62.0", "eslint-visitor-keys": "^3.3.0" } - }, - "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } } } }, @@ -25562,43 +30256,45 @@ } }, "@typescript-eslint/utils": { - "version": "5.37.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.37.0.tgz", - "integrity": "sha512-jUEJoQrWbZhmikbcWSMDuUSxEE7ID2W/QCV/uz10WtQqfOuKZUqFGjqLJ+qhDd17rjgp+QJPqTdPIBWwoob2NQ==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", + "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", "dev": true, "requires": { + "@eslint-community/eslint-utils": "^4.2.0", "@types/json-schema": "^7.0.9", - "@typescript-eslint/scope-manager": "5.37.0", - "@typescript-eslint/types": "5.37.0", - "@typescript-eslint/typescript-estree": "5.37.0", + "@types/semver": "^7.3.12", + "@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" }, "dependencies": { "@typescript-eslint/scope-manager": { - "version": "5.37.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.37.0.tgz", - "integrity": "sha512-F67MqrmSXGd/eZnujjtkPgBQzgespu/iCZ+54Ok9X5tALb9L2v3G+QBSoWkXG0p3lcTJsL+iXz5eLUEdSiJU9Q==", + "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, "requires": { - "@typescript-eslint/types": "5.37.0", - "@typescript-eslint/visitor-keys": "5.37.0" + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0" } }, "@typescript-eslint/types": { - "version": "5.37.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.37.0.tgz", - "integrity": "sha512-3frIJiTa5+tCb2iqR/bf7XwU20lnU05r/sgPJnRpwvfZaqCJBrl8Q/mw9vr3NrNdB/XtVyMA0eppRMMBqdJ1bA==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", + "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "5.37.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.37.0.tgz", - "integrity": "sha512-JkFoFIt/cx59iqEDSgIGnQpCTRv96MQnXCYvJi7QhBC24uyuzbD8wVbajMB1b9x4I0octYFJ3OwjAwNqk1AjDA==", + "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, "requires": { - "@typescript-eslint/types": "5.37.0", - "@typescript-eslint/visitor-keys": "5.37.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", @@ -25607,23 +30303,14 @@ } }, "@typescript-eslint/visitor-keys": { - "version": "5.37.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.37.0.tgz", - "integrity": "sha512-Hp7rT4cENBPIzMwrlehLW/28EVCOcE9U1Z1BQTc8EA8v5qpr7GRGuG+U58V5tTY48zvUOA3KHvw3rA8tY9fbdA==", + "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, "requires": { - "@typescript-eslint/types": "5.37.0", + "@typescript-eslint/types": "5.62.0", "eslint-visitor-keys": "^3.3.0" } - }, - "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } } } }, @@ -25637,32 +30324,39 @@ "eslint-visitor-keys": "^3.0.0" } }, + "@vitejs/plugin-basic-ssl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-1.0.1.tgz", + "integrity": "sha512-pcub+YbFtFhaGRTo1832FQHQSHvMrlb43974e2eS8EKleR3p1cDdkJFPci1UhwkEf1J9Bz+wKBSzqpKp7nNj2A==", + "dev": true, + "requires": {} + }, "@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, "requires": { - "@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" } }, "@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 }, "@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 }, "@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 }, "@webassemblyjs/helper-code-frame": { @@ -25739,111 +30433,111 @@ } }, "@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, "requires": { - "@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" } }, "@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 }, "@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, "requires": { - "@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" } }, "@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, "requires": { "@xtuc/ieee754": "^1.2.0" } }, "@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, "requires": { "@xtuc/long": "4.2.2" } }, "@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 }, "@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, "requires": { - "@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" } }, "@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, "requires": { - "@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" } }, "@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, "requires": { - "@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" } }, "@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, "requires": { - "@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" } }, "@webassemblyjs/wast-parser": { @@ -25892,15 +30586,78 @@ } }, "@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, "requires": { - "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/ast": "1.12.1", "@xtuc/long": "4.2.2" } }, + "@wessberg/ts-evaluator": { + "version": "0.0.27", + "resolved": "https://registry.npmjs.org/@wessberg/ts-evaluator/-/ts-evaluator-0.0.27.tgz", + "integrity": "sha512-7gOpVm3yYojUp/Yn7F4ZybJRxyqfMNf0LXK5KJiawbPfL0XTsJV+0mgrEDjOIR6Bi0OYk2Cyg4tjFu1r8MCZaA==", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "jsdom": "^16.4.0", + "object-path": "^0.11.5", + "tslib": "^2.0.3" + }, + "dependencies": { + "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, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, "@xtuc/ieee754": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", @@ -25918,6 +30675,33 @@ "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==" }, + "@yarnpkg/parsers": { + "version": "3.0.0-rc.46", + "resolved": "https://registry.npmjs.org/@yarnpkg/parsers/-/parsers-3.0.0-rc.46.tgz", + "integrity": "sha512-aiATs7pSutzda/rq8fnuPwTglyVwjM22bNnK2ZgjrpAjQHSSl3lztd2f9evst1W/qnC58DRz7T7QndUDumAR4Q==", + "dev": true, + "requires": { + "js-yaml": "^3.10.0", + "tslib": "^2.4.0" + } + }, + "@zkochan/js-yaml": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/@zkochan/js-yaml/-/js-yaml-0.0.6.tgz", + "integrity": "sha512-nzvgl3VfhcELQ8LyVrYOru+UtAy1nrygk2+AGbTm8a5YcO6o8lSjAT+pfg3vJWxIoZKOUhrK6UU7xW/+00kQrg==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + }, + "dependencies": { + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + } + } + }, "abab": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", @@ -25951,15 +30735,39 @@ "integrity": "sha512-NBOQlm9+7RBqRqZwimpgquaLeTJFayqb9UEPtTkpC3TkkwDnlsT/TwsCC0svjt9kEZ6G9mH5AEOHSz6Q/HrzQQ==" }, "acorn": { - "version": "8.8.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", - "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.0.tgz", + "integrity": "sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw==", "dev": true }, - "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==", + "acorn-globals": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", + "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", + "dev": true, + "requires": { + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1" + }, + "dependencies": { + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true + }, + "acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "dev": true + } + } + }, + "acorn-import-attributes": { + "version": "1.9.5", + "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", + "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", "dev": true, "requires": {} }, @@ -26009,13 +30817,11 @@ } }, "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, "requires": { - "debug": "^4.1.0", - "depd": "^1.1.2", "humanize-ms": "^1.2.1" } }, @@ -26085,9 +30891,9 @@ "requires": {} }, "angular-tag-cloud-module": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/angular-tag-cloud-module/-/angular-tag-cloud-module-14.0.0.tgz", - "integrity": "sha512-H1NU9C2nKT0WzKITZ0gP/T9QoXYpFxYHcUW9snFJOXnwmLLVo6VmXQ0KbI+0pVa5Tu/OxzNWiy1R61PtjBigKA==", + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/angular-tag-cloud-module/-/angular-tag-cloud-module-16.0.0.tgz", + "integrity": "sha512-xEKt+56bdQ6uWsQF3gL+MsmEdvhWJLM0KKOEumC04RVBdfsFwJyZpBC1vHzDbvgmMtvydITGk5UdXc039tFiDw==", "requires": { "tslib": "^2.3.0" } @@ -26176,10 +30982,13 @@ } }, "aria-query": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.0.2.tgz", - "integrity": "sha512-eigU3vhqSO+Z8BKDnVLN/ompjhf3pYzecKXz8+whRy+9gZu8n1TCGfwzQUUPnqdHl9ax1Hr9031orZ+UOEYr7Q==", - "dev": true + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", + "dev": true, + "requires": { + "dequal": "^2.0.3" + } }, "arr-diff": { "version": "4.0.0", @@ -26206,9 +31015,9 @@ "dev": true }, "array-flatten": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", - "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", "dev": true }, "array-union": { @@ -26294,14 +31103,13 @@ "assert-plus": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", "dev": true }, "assign-symbols": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==", - "dev": true + "integrity": "sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==" }, "astral-regex": { "version": "2.0.0", @@ -26325,7 +31133,7 @@ "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", "dev": true }, "at-least-node": { @@ -26341,13 +31149,13 @@ "dev": true }, "autoprefixer": { - "version": "10.4.13", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.13.tgz", - "integrity": "sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg==", + "version": "10.4.14", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.14.tgz", + "integrity": "sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==", "dev": true, "requires": { - "browserslist": "^4.21.4", - "caniuse-lite": "^1.0.30001426", + "browserslist": "^4.21.5", + "caniuse-lite": "^1.0.30001464", "fraction.js": "^4.2.0", "normalize-range": "^0.1.2", "picocolors": "^1.0.0", @@ -26357,13 +31165,13 @@ "aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", "dev": true }, "aws4": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", - "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", + "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==", "dev": true }, "axe-core": { @@ -26372,11 +31180,44 @@ "integrity": "sha512-32+ub6kkdhhWick/UjvEwRchgoetXqTK14INLqbGm5U2TzBkBNF3nQtLYm8ovxSkQWArjEQvftCKryjZaATu3w==", "dev": true }, + "axios": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.4.tgz", + "integrity": "sha512-DukmaFRnY6AzAALSH4J2M3k6PkaC+MfaAGdEERRWcC9q3/TWQwLpHR8ZRLKTdQ3aBDL64EdluRDjJqKw+BPZEw==", + "dev": true, + "requires": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + }, + "dependencies": { + "form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, + "proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "dev": true + } + } + }, "axobject-query": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.0.1.tgz", - "integrity": "sha512-vy5JPSOibF9yAeC2PoemRdA1MuSXX7vX5osdoxKf/6OUeppAWekZ3JIJVNWFMH6wgj7uHYyqZUSqE/b/3JLV1A==", - "dev": true + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.0.0.tgz", + "integrity": "sha512-+60uv1hiVFhHZeO+Lz0RYzsVHy5Wr1ayX0mwda9KPDVLNJgZ1T9Ny7VmFbLDzxsH0D87I86vgj3gFrjTJUYznw==", + "dev": true, + "requires": { + "dequal": "^2.0.3" + } }, "babel-loader": { "version": "8.2.5", @@ -26423,14 +31264,14 @@ } }, "babel-plugin-polyfill-corejs2": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz", - "integrity": "sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==", + "version": "0.4.11", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz", + "integrity": "sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==", "dev": true, "requires": { - "@babel/compat-data": "^7.17.7", - "@babel/helper-define-polyfill-provider": "^0.3.3", - "semver": "^6.1.1" + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.6.2", + "semver": "^6.3.1" }, "dependencies": { "semver": { @@ -26442,22 +31283,52 @@ } }, "babel-plugin-polyfill-corejs3": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.3.tgz", - "integrity": "sha512-zKsXDh0XjnrUEW0mxIHLfjBfnXSMr5Q/goMe/fxpQnLm07mcOZiIZHBNWCMx60HmdvjxfXcalac0tfFg0wqxyw==", + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.7.tgz", + "integrity": "sha512-KyDvZYxAzkC0Aj2dAPyDzi2Ym15e5JKZSK+maI7NAwSqofvuFglbSsxE7wUOvTg9oFVnHMzVzBKcqEb4PJgtOA==", "dev": true, "requires": { - "@babel/helper-define-polyfill-provider": "^0.3.2", - "core-js-compat": "^3.21.0" + "@babel/helper-define-polyfill-provider": "^0.4.4", + "core-js-compat": "^3.33.1" + }, + "dependencies": { + "@babel/helper-define-polyfill-provider": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.4.tgz", + "integrity": "sha512-QcJMILQCu2jm5TFPGA3lCpJJTeEP+mqeXooG/NZbg/h5FTFi6V0+99ahlRsW8/kRLyb24LZVCCiclDedhLKcBA==", + "dev": true, + "requires": { + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" + } + } } }, "babel-plugin-polyfill-regenerator": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz", - "integrity": "sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==", + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.5.tgz", + "integrity": "sha512-OJGYZlhLqBh2DDHeqAxWB1XIvr49CxiJ2gIt61/PU55CQK4Z58OzMqjDe1zwQdQk+rBYsRc+1rJmdajM3gimHg==", "dev": true, "requires": { - "@babel/helper-define-polyfill-provider": "^0.3.3" + "@babel/helper-define-polyfill-provider": "^0.5.0" + }, + "dependencies": { + "@babel/helper-define-polyfill-provider": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.5.0.tgz", + "integrity": "sha512-NovQquuQLAQ5HuyjCz7WQP9MjRj7dx++yspwiyUiGl9ZyadHRSql1HZh5ogRd8W8w6YM6EQ/NTB8rgjLt5W65Q==", + "dev": true, + "requires": { + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" + } + } } }, "balanced-match": { @@ -26512,7 +31383,7 @@ "bcrypt-pbkdf": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", "dev": true, "requires": { "tweetnacl": "^0.14.3" @@ -26581,21 +31452,21 @@ "dev": true }, "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.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", "dev": true, "requires": { "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", "http-errors": "2.0.0", "iconv-lite": "0.4.24", "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.1", + "qs": "6.13.0", + "raw-body": "2.5.2", "type-is": "~1.6.18", "unpipe": "1.0.0" }, @@ -26609,12 +31480,6 @@ "ms": "2.0.0" } }, - "depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "dev": true - }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -26631,12 +31496,12 @@ } }, "qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", "dev": true, "requires": { - "side-channel": "^1.0.4" + "side-channel": "^1.0.6" } } } @@ -26650,13 +31515,11 @@ } }, "bonjour-service": { - "version": "1.0.14", - "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.0.14.tgz", - "integrity": "sha512-HIMbgLnk1Vqvs6B4Wq5ep7mxvj9sGz5d1JJyDNSGNIdA/w2MCz6GTjWTdjqOJV1bEPj+6IkxDvWNFKEBxNt4kQ==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.2.1.tgz", + "integrity": "sha512-oSzCS2zV14bh2kji6vNe7vrpJYCHGvcZnlffFQ1MEoX/WOeQ/teD8SYWKR942OI3INjq8OMNJlbPK5LLLUxFDw==", "dev": true, "requires": { - "array-flatten": "^2.1.2", - "dns-equal": "^1.0.0", "fast-deep-equal": "^3.1.3", "multicast-dns": "^7.2.5" } @@ -26696,6 +31559,12 @@ "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", "dev": true }, + "browser-process-hrtime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", + "dev": true + }, "browserify-aes": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", @@ -26744,20 +31613,20 @@ } }, "browserify-sign": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", - "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.2.tgz", + "integrity": "sha512-1rudGyeYY42Dk6texmv7c4VcQ0EsvVbLwZkA+AQB7SxvXxmcD93jcHie8bzecJ+ChDlmAm2Qyu0+Ccg5uhZXCg==", "dev": true, "requires": { - "bn.js": "^5.1.1", - "browserify-rsa": "^4.0.1", + "bn.js": "^5.2.1", + "browserify-rsa": "^4.1.0", "create-hash": "^1.2.0", "create-hmac": "^1.1.7", - "elliptic": "^6.5.3", + "elliptic": "^6.5.4", "inherits": "^2.0.4", - "parse-asn1": "^5.1.5", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" + "parse-asn1": "^5.1.6", + "readable-stream": "^3.6.2", + "safe-buffer": "^5.2.1" }, "dependencies": { "safe-buffer": { @@ -26778,15 +31647,15 @@ } }, "browserslist": { - "version": "4.21.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz", - "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==", + "version": "4.23.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.1.tgz", + "integrity": "sha512-TUfofFo/KsK/bWZ9TWQ5O26tsWW4Uhmt8IYklbnUa70udB6P2wA7w7o4PY4muaEPBQaAX+CEnmmIA41NVHtPVw==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001400", - "electron-to-chromium": "^1.4.251", - "node-releases": "^2.0.6", - "update-browserslist-db": "^1.0.9" + "caniuse-lite": "^1.0.30001629", + "electron-to-chromium": "^1.4.796", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.16" } }, "buffer": { @@ -26834,29 +31703,23 @@ "dev": true }, "cacache": { - "version": "16.1.2", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.1.2.tgz", - "integrity": "sha512-Xx+xPlfCZIUHagysjjOAje9nRo8pRDczQCcXb4J2O0BLtH+xeVue6ba4y1kfJfQMAnM2mkcoMIAyOctlaRGWYA==", + "version": "17.1.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-17.1.4.tgz", + "integrity": "sha512-/aJwG2l3ZMJ1xNAnqbMpA40of9dj/pIH3QfiuQSqjfPJF747VR0J/bHn+/KdNnHKc6XQcWt/AfRSBft82W1d2A==", "dev": true, "requires": { - "@npmcli/fs": "^2.1.0", - "@npmcli/move-file": "^2.0.0", - "chownr": "^2.0.0", - "fs-minipass": "^2.1.0", - "glob": "^8.0.1", - "infer-owner": "^1.0.4", + "@npmcli/fs": "^3.1.0", + "fs-minipass": "^3.0.0", + "glob": "^10.2.2", "lru-cache": "^7.7.1", - "minipass": "^3.1.6", + "minipass": "^7.0.3", "minipass-collect": "^1.0.2", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", - "mkdirp": "^1.0.4", "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^9.0.0", + "ssri": "^10.0.0", "tar": "^6.1.11", - "unique-filename": "^1.1.1" + "unique-filename": "^3.0.0" }, "dependencies": { "brace-expansion": { @@ -26869,32 +31732,57 @@ } }, "glob": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz", - "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", + "version": "10.4.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.2.tgz", + "integrity": "sha512-GwMlUF6PkPo3Gk21UxkCohOv0PLcIXVtKyLlpEI28R/cO/4eNOdmLk3CMW1wROV/WR/EsZOWAfBbBOqYvs88/w==", "dev": true, "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" } }, "lru-cache": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.14.0.tgz", - "integrity": "sha512-EIRtP1GrSJny0dqb50QXRUNBxHJhcpxHC++M5tD7RYbvLLn5KVWKsbyswSSqDuU15UFi3bgTQIY8nhDMeF6aDQ==", + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "dev": true }, "minimatch": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", - "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, "requires": { "brace-expansion": "^2.0.1" } + }, + "minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true + }, + "unique-filename": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz", + "integrity": "sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==", + "dev": true, + "requires": { + "unique-slug": "^4.0.0" + } + }, + "unique-slug": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-4.0.0.tgz", + "integrity": "sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4" + } } } }, @@ -26922,13 +31810,16 @@ "dev": true }, "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, "requires": { - "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" } }, "callsites": { @@ -26944,15 +31835,15 @@ "dev": true }, "caniuse-lite": { - "version": "1.0.30001426", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001426.tgz", - "integrity": "sha512-n7cosrHLl8AWt0wwZw/PJZgUg3lV0gk9LMI7ikGJwhyhgsd2Nb65vKvmSexCqq/J7rbH3mFG6yZZiPR5dLPW5A==", + "version": "1.0.30001639", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001639.tgz", + "integrity": "sha512-eFHflNTBIlFwP2AIKaYuBQN/apnUoKNhBdza8ZnW/h2di4LCZ4xFqYlxUxo+LQ76KFI1PGcC1QDxMbxTZpSCAg==", "dev": true }, "caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", "dev": true }, "chalk": { @@ -26999,43 +31890,6 @@ "parse5-htmlparser2-tree-adapter": "^7.0.0" }, "dependencies": { - "dom-serializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", - "dev": true, - "requires": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" - } - }, - "domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "dev": true, - "requires": { - "domelementtype": "^2.3.0" - } - }, - "domutils": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz", - "integrity": "sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==", - "dev": true, - "requires": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.1" - } - }, - "entities": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.3.1.tgz", - "integrity": "sha512-o4q/dYJlmyjP2zfnaWDUC6A3BQFmVTX+tZPezK7k0GLSU9QYCauscf5Y+qcEPzKL+EixVouYDgLQK5H9GrLpkg==", - "dev": true - }, "parse5": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.0.0.tgz", @@ -27069,64 +31923,6 @@ "domelementtype": "^2.3.0", "domhandler": "^5.0.3", "domutils": "^3.0.1" - }, - "dependencies": { - "css-select": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", - "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", - "dev": true, - "requires": { - "boolbase": "^1.0.0", - "css-what": "^6.1.0", - "domhandler": "^5.0.2", - "domutils": "^3.0.1", - "nth-check": "^2.0.1" - } - }, - "css-what": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", - "dev": true - }, - "dom-serializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", - "dev": true, - "requires": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" - } - }, - "domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "dev": true, - "requires": { - "domelementtype": "^2.3.0" - } - }, - "domutils": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz", - "integrity": "sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==", - "dev": true, - "requires": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.1" - } - }, - "entities": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.3.1.tgz", - "integrity": "sha512-o4q/dYJlmyjP2zfnaWDUC6A3BQFmVTX+tZPezK7k0GLSU9QYCauscf5Y+qcEPzKL+EixVouYDgLQK5H9GrLpkg==", - "dev": true - } } }, "chokidar": { @@ -27304,6 +32100,7 @@ "version": "2.0.11", "resolved": "https://registry.npmjs.org/clipboard/-/clipboard-2.0.11.tgz", "integrity": "sha512-C+0bbOqkezLIsmWSvlsXS0Q0bmkugu7jcfMIACB+RDEntIzQIkdr148we28AfSloQLRdZlYL/QYyrq05j/3Faw==", + "optional": true, "requires": { "good-listener": "^1.2.2", "select": "^1.1.2", @@ -27428,9 +32225,15 @@ } }, "commander": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", - "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", + "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", + "dev": true + }, + "common-path-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", + "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==", "dev": true }, "common-tags": { @@ -27609,9 +32412,9 @@ } }, "content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", "dev": true }, "convert-source-map": { @@ -27770,12 +32573,12 @@ } }, "core-js-compat": { - "version": "3.26.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.26.0.tgz", - "integrity": "sha512-piOX9Go+Z4f9ZiBFLnZ5VrOpBl0h7IGCkiFUN11QTe6LjAvOT3ifL/5TdoizMh99hcGy5SoLyWbapIY/PIb/3A==", + "version": "3.37.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.37.1.tgz", + "integrity": "sha512-9TNiImhKvQqSUkOvk/mMRZzOANTiEVC7WaBNhHcKM7x+/5E1l5NvsysR19zuDQScE8k+kfQXWRN3AtS/eOSHpg==", "dev": true, "requires": { - "browserslist": "^4.21.4" + "browserslist": "^4.23.0" } }, "core-util-is": { @@ -27858,16 +32661,17 @@ "dev": true }, "critters": { - "version": "0.0.16", - "resolved": "https://registry.npmjs.org/critters/-/critters-0.0.16.tgz", - "integrity": "sha512-JwjgmO6i3y6RWtLYmXwO5jMd+maZt8Tnfu7VVISmEWyQqfLpB8soBswf8/2bu6SBXxtKA68Al3c+qIG1ApT68A==", + "version": "0.0.20", + "resolved": "https://registry.npmjs.org/critters/-/critters-0.0.20.tgz", + "integrity": "sha512-CImNRorKOl5d8TWcnAz5n5izQ6HFsvz29k327/ELy6UFcmbiZNOsinaKvzv16WZR0P6etfSWYzE47C4/56B3Uw==", "dev": true, "requires": { "chalk": "^4.1.0", - "css-select": "^4.2.0", - "parse5": "^6.0.1", - "parse5-htmlparser2-tree-adapter": "^6.0.1", - "postcss": "^8.3.7", + "css-select": "^5.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.2", + "htmlparser2": "^8.0.2", + "postcss": "^8.4.23", "pretty-bytes": "^5.3.0" }, "dependencies": { @@ -27911,12 +32715,6 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, - "parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", - "dev": true - }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -27958,70 +32756,47 @@ "randomfill": "^1.0.3" } }, - "css-blank-pseudo": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-3.0.3.tgz", - "integrity": "sha512-VS90XWtsHGqoM0t4KpH053c4ehxZ2E6HtGI7x68YFV0pTo/QmkV/YFA+NnlvK8guxZVNWGQhVNJGC39Q8XF4OQ==", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.9" - } - }, - "css-has-pseudo": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-3.0.4.tgz", - "integrity": "sha512-Vse0xpR1K9MNlp2j5w1pgWIJtm1a8qS0JwS9goFYcImjlHEmywP9VUF05aGBXzGpDJF86QXk4L0ypBmwPhGArw==", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.9" - } - }, "css-loader": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.7.1.tgz", - "integrity": "sha512-yB5CNFa14MbPJcomwNh3wLThtkZgcNyI2bNMRt8iE5Z8Vwl7f8vQXFAzn2HDOJvtDq2NTZBUGMSUNNyrv3/+cw==", + "version": "6.8.1", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.8.1.tgz", + "integrity": "sha512-xDAXtEVGlD0gJ07iclwWVkLoZOpEvAWaSyf6W18S2pOC//K8+qUDIx8IIT3D+HjnmkJPQeesOPv5aiUaJsCM2g==", "dev": true, "requires": { "icss-utils": "^5.1.0", - "postcss": "^8.4.7", + "postcss": "^8.4.21", "postcss-modules-extract-imports": "^3.0.0", - "postcss-modules-local-by-default": "^4.0.0", + "postcss-modules-local-by-default": "^4.0.3", "postcss-modules-scope": "^3.0.0", "postcss-modules-values": "^4.0.0", "postcss-value-parser": "^4.2.0", - "semver": "^7.3.5" + "semver": "^7.3.8" + }, + "dependencies": { + "semver": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", + "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "dev": true + } } }, - "css-prefers-color-scheme": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-6.0.3.tgz", - "integrity": "sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA==", - "dev": true, - "requires": {} - }, "css-select": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.2.1.tgz", - "integrity": "sha512-/aUslKhzkTNCQUB2qTX84lVmfia9NyjP3WpDGtj/WxhwBzWBYUV3DgUpurHTme8UTPcPlAD1DJ+b0nN/t50zDQ==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", "dev": true, "requires": { "boolbase": "^1.0.0", - "css-what": "^5.1.0", - "domhandler": "^4.3.0", - "domutils": "^2.8.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", "nth-check": "^2.0.1" } }, "css-what": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.1.0.tgz", - "integrity": "sha512-arSMRWIIFY0hV8pIxZMEfmMI47Wj3R/aWpZDDxWYCPEiOMv6tfOrnpDtgxBYPEQD4V0Y/958+1TdC3iWTFcUPw==", - "dev": true - }, - "cssdb": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-7.0.2.tgz", - "integrity": "sha512-Vm4b6P/PifADu0a76H0DKRNVWq3Rq9xa/Nx6oEMUBJlwTUuZoZ3dkZxo8Gob3UEL53Cq+Ma1GBgISed6XEBs3w==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", "dev": true }, "cssesc": { @@ -28030,6 +32805,29 @@ "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", "dev": true }, + "cssom": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", + "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", + "dev": true + }, + "cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "dev": true, + "requires": { + "cssom": "~0.3.6" + }, + "dependencies": { + "cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "dev": true + } + } + }, "custom-event": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", @@ -28042,29 +32840,28 @@ "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=" }, "cypress": { - "version": "12.3.0", - "resolved": "https://registry.npmjs.org/cypress/-/cypress-12.3.0.tgz", - "integrity": "sha512-ZQNebibi6NBt51TRxRMYKeFvIiQZ01t50HSy7z/JMgRVqBUey3cdjog5MYEbzG6Ktti5ckDt1tfcC47lmFwXkw==", + "version": "13.7.2", + "resolved": "https://registry.npmjs.org/cypress/-/cypress-13.7.2.tgz", + "integrity": "sha512-FF5hFI5wlRIHY8urLZjJjj/YvfCBrRpglbZCLr/cYcL9MdDe0+5usa8kTIrDHthlEc9lwihbkb5dmwqBDNS2yw==", "dev": true, "requires": { - "@cypress/request": "^2.88.10", + "@cypress/request": "^3.0.0", "@cypress/xvfb": "^1.2.4", - "@types/node": "^14.14.31", "@types/sinonjs__fake-timers": "8.1.1", "@types/sizzle": "^2.3.2", "arch": "^2.2.0", "blob-util": "^2.0.2", "bluebird": "^3.7.2", - "buffer": "^5.6.0", + "buffer": "^5.7.1", "cachedir": "^2.3.0", "chalk": "^4.1.0", "check-more-types": "^2.24.0", "cli-cursor": "^3.1.0", "cli-table3": "~0.6.1", - "commander": "^5.1.0", + "commander": "^6.2.1", "common-tags": "^1.8.0", "dayjs": "^1.10.4", - "debug": "^4.3.2", + "debug": "^4.3.4", "enquirer": "^2.3.6", "eventemitter2": "6.4.7", "execa": "4.1.0", @@ -28073,30 +32870,25 @@ "figures": "^3.2.0", "fs-extra": "^9.1.0", "getos": "^3.2.1", - "is-ci": "^3.0.0", + "is-ci": "^3.0.1", "is-installed-globally": "~0.4.0", "lazy-ass": "^1.6.0", "listr2": "^3.8.3", "lodash": "^4.17.21", "log-symbols": "^4.0.0", - "minimist": "^1.2.6", + "minimist": "^1.2.8", "ospath": "^1.2.2", "pretty-bytes": "^5.6.0", + "process": "^0.11.10", "proxy-from-env": "1.0.0", "request-progress": "^3.0.0", - "semver": "^7.3.2", + "semver": "^7.5.3", "supports-color": "^8.1.1", "tmp": "~0.2.1", "untildify": "^4.0.0", "yauzl": "^2.10.0" }, "dependencies": { - "@types/node": { - "version": "14.18.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.10.tgz", - "integrity": "sha512-6iihJ/Pp5fsFJ/aEDGyvT4pHGmCpq7ToQ/yf4bl5SbVAvwpspYJ+v3jO7n8UyjhQVHTy+KNszOozDdv+O6sovQ==", - "dev": true - }, "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -28148,6 +32940,15 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, + "semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, "supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", @@ -28191,6 +32992,7 @@ "version": "7.8.0", "resolved": "https://registry.npmjs.org/d3/-/d3-7.8.0.tgz", "integrity": "sha512-a5rNemRadWkEfqnY5NsD4RdCP9vn8EIJ4I5Rl14U0uKH1SXqcNmk/h9aGaAF1O98lz6L9M0IeUcuPa9GUYbI5A==", + "optional": true, "requires": { "d3-array": "3", "d3-axis": "3", @@ -28228,6 +33030,7 @@ "version": "3.2.1", "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.1.tgz", "integrity": "sha512-gUY/qeHq/yNqqoCKNq4vtpFLdoCdvyNpWoC/KNjhGbhDuQpAM9sIQQKkXSNpXa9h5KySs/gzm7R88WkUutgwWQ==", + "optional": true, "requires": { "internmap": "1 - 2" } @@ -28235,12 +33038,14 @@ "d3-axis": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz", - "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==" + "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==", + "optional": true }, "d3-brush": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz", "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==", + "optional": true, "requires": { "d3-dispatch": "1 - 3", "d3-drag": "2 - 3", @@ -28253,6 +33058,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz", "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==", + "optional": true, "requires": { "d3-path": "1 - 3" } @@ -28260,12 +33066,14 @@ "d3-color": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", - "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==" + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "optional": true }, "d3-contour": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-4.0.1.tgz", "integrity": "sha512-CMSllVHhBsqw3xrOCMXn5PCRZbLIMmsVj922YdqTiVMxi5jLHwg5y3mnZAC1Cm4xKgmx3sLjaSkuBKfZwx8LEQ==", + "optional": true, "requires": { "d3-array": "^3.2.0" } @@ -28274,6 +33082,7 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.2.tgz", "integrity": "sha512-IMLNldruDQScrcfT+MWnazhHbDJhcRJyOEBAJfwQnHle1RPh6WDuLvxNArUju2VSMSUuKlY5BGHRJ2cYyoFLQQ==", + "optional": true, "requires": { "delaunator": "5" } @@ -28281,12 +33090,14 @@ "d3-dispatch": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", - "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==" + "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", + "optional": true }, "d3-drag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", + "optional": true, "requires": { "d3-dispatch": "1 - 3", "d3-selection": "3" @@ -28296,6 +33107,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz", "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", + "optional": true, "requires": { "commander": "7", "iconv-lite": "0.6", @@ -28305,12 +33117,14 @@ "commander": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==" + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "optional": true }, "iconv-lite": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "optional": true, "requires": { "safer-buffer": ">= 2.1.2 < 3.0.0" } @@ -28320,12 +33134,14 @@ "d3-ease": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", - "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==" + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + "optional": true }, "d3-fetch": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz", "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==", + "optional": true, "requires": { "d3-dsv": "1 - 3" } @@ -28334,6 +33150,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", + "optional": true, "requires": { "d3-dispatch": "1 - 3", "d3-quadtree": "1 - 3", @@ -28343,12 +33160,14 @@ "d3-format": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", - "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==" + "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==", + "optional": true }, "d3-geo": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.0.tgz", "integrity": "sha512-JEo5HxXDdDYXCaWdwLRt79y7giK8SbhZJbFWXqbRTolCHFI5jRqteLzCsq51NKbUoX0PjBVSohxrx+NoOUujYA==", + "optional": true, "requires": { "d3-array": "2.5.0 - 3" } @@ -28356,12 +33175,14 @@ "d3-hierarchy": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", - "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==" + "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==", + "optional": true }, "d3-interpolate": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "optional": true, "requires": { "d3-color": "1 - 3" } @@ -28369,27 +33190,32 @@ "d3-path": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", - "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==" + "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", + "optional": true }, "d3-polygon": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz", - "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==" + "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==", + "optional": true }, "d3-quadtree": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", - "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==" + "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==", + "optional": true }, "d3-random": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz", - "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==" + "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==", + "optional": true }, "d3-scale": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", + "optional": true, "requires": { "d3-array": "2.10.0 - 3", "d3-format": "1 - 3", @@ -28402,6 +33228,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.0.0.tgz", "integrity": "sha512-Lx9thtxAKrO2Pq6OO2Ua474opeziKr279P/TKZsMAhYyNDD3EnCffdbgeSYN5O7m2ByQsxtuP2CSDczNUIZ22g==", + "optional": true, "requires": { "d3-color": "1 - 3", "d3-interpolate": "1 - 3" @@ -28410,12 +33237,14 @@ "d3-selection": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", - "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==" + "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", + "optional": true }, "d3-shape": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", + "optional": true, "requires": { "d3-path": "^3.1.0" } @@ -28424,6 +33253,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", + "optional": true, "requires": { "d3-array": "2 - 3" } @@ -28432,6 +33262,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", + "optional": true, "requires": { "d3-time": "1 - 3" } @@ -28439,12 +33270,14 @@ "d3-timer": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", - "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==" + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "optional": true }, "d3-transition": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", + "optional": true, "requires": { "d3-color": "1 - 3", "d3-dispatch": "1 - 3", @@ -28457,6 +33290,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", + "optional": true, "requires": { "d3-dispatch": "1 - 3", "d3-drag": "2 - 3", @@ -28478,6 +33312,7 @@ "version": "7.0.6", "resolved": "https://registry.npmjs.org/dagre-d3-es/-/dagre-d3-es-7.0.6.tgz", "integrity": "sha512-CaaE/nZh205ix+Up4xsnlGmpog5GGm81Upi2+/SBHxwNwrccBb3K51LzjZ1U6hgvOlAEUsVWf1xSTzCyKpJ6+Q==", + "optional": true, "requires": { "d3": "^7.7.0", "lodash-es": "^4.17.21" @@ -28486,12 +33321,51 @@ "dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", "dev": true, "requires": { "assert-plus": "^1.0.0" } }, + "data-urls": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", + "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", + "dev": true, + "requires": { + "abab": "^2.0.3", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0" + }, + "dependencies": { + "tr46": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", + "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", + "dev": true, + "requires": { + "punycode": "^2.1.1" + } + }, + "webidl-conversions": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", + "dev": true + }, + "whatwg-url": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", + "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", + "dev": true, + "requires": { + "lodash": "^4.7.0", + "tr46": "^2.1.0", + "webidl-conversions": "^6.1.0" + } + } + } + }, "date-format": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.3.tgz", @@ -28519,6 +33393,12 @@ "integrity": "sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI=", "dev": true }, + "decimal.js": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", + "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", + "dev": true + }, "decode-uri-component": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", @@ -28580,6 +33460,17 @@ "clone": "^1.0.2" } }, + "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, + "requires": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + } + }, "define-lazy-prop": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", @@ -28600,6 +33491,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.0.tgz", "integrity": "sha512-AyLvtyJdbv/U1GkiS6gUUzclRoAY4Gs75qkMygJJhU75LW4DNuSF2RMzpxs9jw9Oz1BobHjTdkG3zdP55VxAqw==", + "optional": true, "requires": { "robust-predicates": "^3.0.0" } @@ -28607,13 +33499,14 @@ "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", "dev": true }, "delegate": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/delegate/-/delegate-3.2.0.tgz", - "integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==" + "integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==", + "optional": true }, "delegates": { "version": "1.0.0", @@ -28622,15 +33515,15 @@ "dev": true }, "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "dev": true }, - "dependency-graph": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.11.0.tgz", - "integrity": "sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg==", + "dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", "dev": true }, "des.js": { @@ -28711,16 +33604,10 @@ "path-type": "^4.0.0" } }, - "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 - }, "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, "requires": { "@leichtgewicht/ip-codec": "^2.0.1" @@ -28748,14 +33635,14 @@ } }, "dom-serializer": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", - "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", "dev": true, "requires": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" } }, "domain-browser": { @@ -28770,31 +33657,60 @@ "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", "dev": true }, + "domexception": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", + "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", + "dev": true, + "requires": { + "webidl-conversions": "^5.0.0" + }, + "dependencies": { + "webidl-conversions": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", + "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", + "dev": true + } + } + }, "domhandler": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.0.tgz", - "integrity": "sha512-fC0aXNQXqKSFTr2wDNZDhsEYjCiYsDWl3D01kwt25hm1YIPyDGHvvi3rw+PLqHAl/m71MaiF7d5zvBr0p5UB2g==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", "dev": true, "requires": { - "domelementtype": "^2.2.0" + "domelementtype": "^2.3.0" } }, "dompurify": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.4.1.tgz", - "integrity": "sha512-ewwFzHzrrneRjxzmK6oVz/rZn9VWspGFRDb4/rRtIsM1n36t9AKma/ye8syCpcw+XJ25kOK/hOG7t1j2I2yBqA==" + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.5.4.tgz", + "integrity": "sha512-l5NNozANzaLPPe0XaAwvg3uZcHtDBnziX/HjsY1UcDj1MxTK8Dd0Kv096jyPK5HRzs/XM5IMj20dW8Fk+HnbUA==" }, "domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", "dev": true, "requires": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" } }, + "dotenv": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", + "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==", + "dev": true + }, + "duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", + "dev": true + }, "duplexify": { "version": "3.7.1", "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", @@ -28830,10 +33746,16 @@ } } }, + "eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, "ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", "dev": true, "requires": { "jsbn": "~0.1.0", @@ -28846,16 +33768,25 @@ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", "dev": true }, + "ejs": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", + "dev": true, + "requires": { + "jake": "^10.8.5" + } + }, "electron-to-chromium": { - "version": "1.4.284", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", - "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==", + "version": "1.4.816", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.816.tgz", + "integrity": "sha512-EKH5X5oqC6hLmiS7/vYtZHZFTNdhsYG5NVPRN6Yn0kQHNBlT59+xSM8HBy66P5fxWpKgZbPqb+diC64ng295Jw==", "dev": true }, "elliptic": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", - "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "version": "6.5.7", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.7.tgz", + "integrity": "sha512-ESVCtTwiA+XhY3wyh24QqRGBoP3rEdDUl3EDUUo9tft074fi19IrdpH7hLCMMP3CIj7jb3W96rn8lt/BqIlt5Q==", "dev": true, "requires": { "bn.js": "^4.11.9", @@ -28882,9 +33813,10 @@ "dev": true }, "emoji-toolkit": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/emoji-toolkit/-/emoji-toolkit-6.6.0.tgz", - "integrity": "sha512-pEu0kow2p1N8zCKnn/L6H0F3rWUBB3P3hVjr/O5yl1fK7N9jU4vO4G7EFapC5Y3XwZLUCY0FZbOPyTkH+4V2eQ==" + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/emoji-toolkit/-/emoji-toolkit-7.0.1.tgz", + "integrity": "sha512-l5aJyAhpC5s4mDuoVuqt4SzVjwIsIvakPh4ZGJJE4KWuWFCEHaXacQFkStVdD9zbRR+/BbRXob7u99o0lQFr8A==", + "optional": true }, "emojis-list": { "version": "3.0.0", @@ -28925,9 +33857,9 @@ } }, "engine.io": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.4.2.tgz", - "integrity": "sha512-FKn/3oMiJjrOEOeUub2WCox6JhxBXq/Zn3fZOMCBxKnNYtsdKjxhl7yR3fZhM9PV+rdE75SU5SYMc+2PGzo+Tg==", + "version": "6.5.5", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.5.5.tgz", + "integrity": "sha512-C5Pn8Wk+1vKBoHghJODM63yk8MvrO9EWZUfkAt5HAqIgPE4/8FF0PEGHXtEd40l223+cE5ABWuPzm38PHFXfMA==", "dev": true, "requires": { "@types/cookie": "^0.4.1", @@ -28938,20 +33870,29 @@ "cookie": "~0.4.1", "cors": "~2.8.5", "debug": "~4.3.1", - "engine.io-parser": "~5.0.3", - "ws": "~8.11.0" + "engine.io-parser": "~5.2.1", + "ws": "~8.17.1" + }, + "dependencies": { + "ws": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", + "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", + "dev": true, + "requires": {} + } } }, "engine.io-parser": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.6.tgz", - "integrity": "sha512-tjuoZDMAdEhVnSFleYPCtdL2GXwVTGtNjoeJd9IhIG3C1xs9uwxqRNEu5WpnDZCaozwVlK/nuQhpodhXSIMaxw==", + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz", + "integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==", "dev": true }, "enhanced-resolve": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz", - "integrity": "sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ==", + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", + "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", "dev": true, "requires": { "graceful-fs": "^4.2.4", @@ -28974,10 +33915,10 @@ "dev": true }, "entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "dev": true + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "devOptional": true }, "env-paths": { "version": "2.2.1", @@ -29015,10 +33956,25 @@ "is-arrayish": "^0.2.1" } }, + "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, + "requires": { + "get-intrinsic": "^1.2.4" + } + }, + "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 + }, "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.4", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", + "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==", "dev": true }, "es6-promise": { @@ -29035,185 +33991,45 @@ } }, "esbuild": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.5.tgz", - "integrity": "sha512-VSf6S1QVqvxfIsSKb3UKr3VhUCis7wgDbtF4Vd9z84UJr05/Sp2fRKmzC+CSPG/dNAPPJZ0BTBLTT1Fhd6N9Gg==", - "dev": true, - "optional": true, - "requires": { - "@esbuild/linux-loong64": "0.15.5", - "esbuild-android-64": "0.15.5", - "esbuild-android-arm64": "0.15.5", - "esbuild-darwin-64": "0.15.5", - "esbuild-darwin-arm64": "0.15.5", - "esbuild-freebsd-64": "0.15.5", - "esbuild-freebsd-arm64": "0.15.5", - "esbuild-linux-32": "0.15.5", - "esbuild-linux-64": "0.15.5", - "esbuild-linux-arm": "0.15.5", - "esbuild-linux-arm64": "0.15.5", - "esbuild-linux-mips64le": "0.15.5", - "esbuild-linux-ppc64le": "0.15.5", - "esbuild-linux-riscv64": "0.15.5", - "esbuild-linux-s390x": "0.15.5", - "esbuild-netbsd-64": "0.15.5", - "esbuild-openbsd-64": "0.15.5", - "esbuild-sunos-64": "0.15.5", - "esbuild-windows-32": "0.15.5", - "esbuild-windows-64": "0.15.5", - "esbuild-windows-arm64": "0.15.5" - } - }, - "esbuild-android-64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.5.tgz", - "integrity": "sha512-dYPPkiGNskvZqmIK29OPxolyY3tp+c47+Fsc2WYSOVjEPWNCHNyqhtFqQadcXMJDQt8eN0NMDukbyQgFcHquXg==", - "dev": true, - "optional": true - }, - "esbuild-android-arm64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.5.tgz", - "integrity": "sha512-YyEkaQl08ze3cBzI/4Cm1S+rVh8HMOpCdq8B78JLbNFHhzi4NixVN93xDrHZLztlocEYqi45rHHCgA8kZFidFg==", - "dev": true, - "optional": true - }, - "esbuild-darwin-64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.5.tgz", - "integrity": "sha512-Cr0iIqnWKx3ZTvDUAzG0H/u9dWjLE4c2gTtRLz4pqOBGjfjqdcZSfAObFzKTInLLSmD0ZV1I/mshhPoYSBMMCQ==", - "dev": true, - "optional": true - }, - "esbuild-darwin-arm64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.5.tgz", - "integrity": "sha512-WIfQkocGtFrz7vCu44ypY5YmiFXpsxvz2xqwe688jFfSVCnUsCn2qkEVDo7gT8EpsLOz1J/OmqjExePL1dr1Kg==", - "dev": true, - "optional": true - }, - "esbuild-freebsd-64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.5.tgz", - "integrity": "sha512-M5/EfzV2RsMd/wqwR18CELcenZ8+fFxQAAEO7TJKDmP3knhWSbD72ILzrXFMMwshlPAS1ShCZ90jsxkm+8FlaA==", - "dev": true, - "optional": true - }, - "esbuild-freebsd-arm64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.5.tgz", - "integrity": "sha512-2JQQ5Qs9J0440F/n/aUBNvY6lTo4XP/4lt1TwDfHuo0DY3w5++anw+jTjfouLzbJmFFiwmX7SmUhMnysocx96w==", - "dev": true, - "optional": true - }, - "esbuild-linux-32": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.5.tgz", - "integrity": "sha512-gO9vNnIN0FTUGjvTFucIXtBSr1Woymmx/aHQtuU+2OllGU6YFLs99960UD4Dib1kFovVgs59MTXwpFdVoSMZoQ==", - "dev": true, - "optional": true - }, - "esbuild-linux-64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.5.tgz", - "integrity": "sha512-ne0GFdNLsm4veXbTnYAWjbx3shpNKZJUd6XpNbKNUZaNllDZfYQt0/zRqOg0sc7O8GQ+PjSMv9IpIEULXVTVmg==", - "dev": true, - "optional": true - }, - "esbuild-linux-arm": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.5.tgz", - "integrity": "sha512-wvAoHEN+gJ/22gnvhZnS/+2H14HyAxM07m59RSLn3iXrQsdS518jnEWRBnJz3fR6BJa+VUTo0NxYjGaNt7RA7Q==", - "dev": true, - "optional": true - }, - "esbuild-linux-arm64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.5.tgz", - "integrity": "sha512-7EgFyP2zjO065XTfdCxiXVEk+f83RQ1JsryN1X/VSX2li9rnHAt2swRbpoz5Vlrl6qjHrCmq5b6yxD13z6RheA==", - "dev": true, - "optional": true - }, - "esbuild-linux-mips64le": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.5.tgz", - "integrity": "sha512-KdnSkHxWrJ6Y40ABu+ipTZeRhFtc8dowGyFsZY5prsmMSr1ZTG9zQawguN4/tunJ0wy3+kD54GaGwdcpwWAvZQ==", - "dev": true, - "optional": true - }, - "esbuild-linux-ppc64le": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.5.tgz", - "integrity": "sha512-QdRHGeZ2ykl5P0KRmfGBZIHmqcwIsUKWmmpZTOq573jRWwmpfRmS7xOhmDHBj9pxv+6qRMH8tLr2fe+ZKQvCYw==", - "dev": true, - "optional": true - }, - "esbuild-linux-riscv64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.5.tgz", - "integrity": "sha512-p+WE6RX+jNILsf+exR29DwgV6B73khEQV0qWUbzxaycxawZ8NE0wA6HnnTxbiw5f4Gx9sJDUBemh9v49lKOORA==", - "dev": true, - "optional": true - }, - "esbuild-linux-s390x": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.5.tgz", - "integrity": "sha512-J2ngOB4cNzmqLHh6TYMM/ips8aoZIuzxJnDdWutBw5482jGXiOzsPoEF4j2WJ2mGnm7FBCO4StGcwzOgic70JQ==", - "dev": true, - "optional": true - }, - "esbuild-netbsd-64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.5.tgz", - "integrity": "sha512-MmKUYGDizYjFia0Rwt8oOgmiFH7zaYlsoQ3tIOfPxOqLssAsEgG0MUdRDm5lliqjiuoog8LyDu9srQk5YwWF3w==", - "dev": true, - "optional": true - }, - "esbuild-openbsd-64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.5.tgz", - "integrity": "sha512-2mMFfkLk3oPWfopA9Plj4hyhqHNuGyp5KQyTT9Rc8hFd8wAn5ZrbJg+gNcLMo2yzf8Uiu0RT6G9B15YN9WQyMA==", - "dev": true, - "optional": true - }, - "esbuild-sunos-64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.5.tgz", - "integrity": "sha512-2sIzhMUfLNoD+rdmV6AacilCHSxZIoGAU2oT7XmJ0lXcZWnCvCtObvO6D4puxX9YRE97GodciRGDLBaiC6x1SA==", - "dev": true, - "optional": true + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.17.tgz", + "integrity": "sha512-1GJtYnUxsJreHYA0Y+iQz2UEykonY66HNWOb0yXYZi9/kNrORUEHVg87eQsCtqh59PEJ5YVZJO98JHznMJSWjg==", + "dev": true, + "requires": { + "@esbuild/android-arm": "0.18.17", + "@esbuild/android-arm64": "0.18.17", + "@esbuild/android-x64": "0.18.17", + "@esbuild/darwin-arm64": "0.18.17", + "@esbuild/darwin-x64": "0.18.17", + "@esbuild/freebsd-arm64": "0.18.17", + "@esbuild/freebsd-x64": "0.18.17", + "@esbuild/linux-arm": "0.18.17", + "@esbuild/linux-arm64": "0.18.17", + "@esbuild/linux-ia32": "0.18.17", + "@esbuild/linux-loong64": "0.18.17", + "@esbuild/linux-mips64el": "0.18.17", + "@esbuild/linux-ppc64": "0.18.17", + "@esbuild/linux-riscv64": "0.18.17", + "@esbuild/linux-s390x": "0.18.17", + "@esbuild/linux-x64": "0.18.17", + "@esbuild/netbsd-x64": "0.18.17", + "@esbuild/openbsd-x64": "0.18.17", + "@esbuild/sunos-x64": "0.18.17", + "@esbuild/win32-arm64": "0.18.17", + "@esbuild/win32-ia32": "0.18.17", + "@esbuild/win32-x64": "0.18.17" + } }, "esbuild-wasm": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.15.5.tgz", - "integrity": "sha512-lTJOEKekN/4JI/eOEq0wLcx53co2N6vaT/XjBz46D1tvIVoUEyM0o2K6txW6gEotf31szFD/J1PbxmnbkGlK9A==", + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.18.17.tgz", + "integrity": "sha512-9OHGcuRzy+I8ziF9FzjfKLWAPbvi0e/metACVg9k6bK+SI4FFxeV6PcZsz8RIVaMD4YNehw+qj6UMR3+qj/EuQ==", "dev": true }, - "esbuild-windows-32": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.5.tgz", - "integrity": "sha512-e+duNED9UBop7Vnlap6XKedA/53lIi12xv2ebeNS4gFmu7aKyTrok7DPIZyU5w/ftHD4MUDs5PJUkQPP9xJRzg==", - "dev": true, - "optional": true - }, - "esbuild-windows-64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.5.tgz", - "integrity": "sha512-v+PjvNtSASHOjPDMIai9Yi+aP+Vwox+3WVdg2JB8N9aivJ7lyhp4NVU+J0MV2OkWFPnVO8AE/7xH+72ibUUEnw==", - "dev": true, - "optional": true - }, - "esbuild-windows-arm64": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.5.tgz", - "integrity": "sha512-Yz8w/D8CUPYstvVQujByu6mlf48lKmXkq6bkeSZZxTA626efQOJb26aDGLzmFWx6eg/FwrXgt6SZs9V8Pwy/aA==", - "dev": true, - "optional": true - }, "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 }, "escape-html": { @@ -29228,6 +34044,33 @@ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", "dev": true }, + "escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "dev": true, + "requires": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2", + "source-map": "~0.6.1" + }, + "dependencies": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + }, + "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, + "optional": true + } + } + }, "eslint": { "version": "8.8.0", "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.8.0.tgz", @@ -29658,38 +34501,44 @@ } } }, + "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 + }, "express": { - "version": "4.18.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", - "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.0.tgz", + "integrity": "sha512-VqcNGcj/Id5ZT1LZ/cfihi3ttTn+NJmkli2eZADigjq29qTlWi/hAQ43t/VLPq8+UX06FCEx3ByOYet6ZFblng==", "dev": true, "requires": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.20.1", + "body-parser": "1.20.3", "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", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "1.2.0", + "finalhandler": "1.3.1", "fresh": "0.5.2", "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", + "merge-descriptors": "1.0.3", "methods": "~1.1.2", "on-finished": "2.4.1", "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", + "path-to-regexp": "0.1.10", "proxy-addr": "~2.0.7", - "qs": "6.11.0", + "qs": "6.13.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", + "send": "0.19.0", + "serve-static": "1.16.2", "setprototypeof": "1.2.0", "statuses": "2.0.1", "type-is": "~1.6.18", @@ -29697,16 +34546,10 @@ "vary": "~1.1.2" }, "dependencies": { - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", - "dev": true - }, "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 }, "debug": { @@ -29718,20 +34561,20 @@ "ms": "2.0.0" } }, - "depd": { + "encodeurl": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", "dev": true }, "finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", "dev": true, "requires": { "debug": "2.6.9", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "on-finished": "2.4.1", "parseurl": "~1.3.3", @@ -29755,12 +34598,12 @@ } }, "qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", "dev": true, "requires": { - "side-channel": "^1.0.4" + "side-channel": "^1.0.6" } }, "safe-buffer": { @@ -29787,7 +34630,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", - "dev": true, "requires": { "assign-symbols": "^1.0.0", "is-extendable": "^1.0.1" @@ -29872,7 +34714,7 @@ "extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", "dev": true }, "fast-deep-equal": { @@ -29881,9 +34723,9 @@ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, "fast-glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", - "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", "dev": true, "requires": { "@nodelib/fs.stat": "^2.0.2", @@ -29905,6 +34747,12 @@ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", "dev": true }, + "fast-uri": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.1.tgz", + "integrity": "sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw==", + "dev": true + }, "fastq": { "version": "1.13.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", @@ -29973,6 +34821,35 @@ "integrity": "sha512-g872QGsHexznxkIAdK8UiZRe7SkE6kvylShU4Nsj8NvfvZag7S0QuQ4IgvPDkk75HxgjIVDwycFTDAgIiO4nDA==", "dev": true }, + "filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "dev": true, + "requires": { + "minimatch": "^5.0.1" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + } + } + }, "fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -30035,6 +34912,12 @@ "path-exists": "^4.0.0" } }, + "flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true + }, "flat-cache": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", @@ -30085,9 +34968,9 @@ } }, "follow-redirects": { - "version": "1.14.8", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.8.tgz", - "integrity": "sha512-1x0S9UVJHsQprFcEC/qnNzBLcIxsjAV905f/UkQxbclCsoTWlacCNOpQa/anodLl2uaEKFhfWOvM2Qg77+15zA==", + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", "dev": true }, "for-in": { @@ -30096,10 +34979,28 @@ "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", "dev": true }, + "foreground-child": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.2.1.tgz", + "integrity": "sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "dependencies": { + "signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true + } + } + }, "forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", "dev": true }, "form-data": { @@ -30120,9 +35021,9 @@ "dev": true }, "fraction.js": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", - "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", "dev": true }, "fragment-cache": { @@ -30192,18 +35093,26 @@ } }, "fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", + "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==", "dev": true, "requires": { - "minipass": "^3.0.0" + "minipass": "^7.0.3" + }, + "dependencies": { + "minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true + } } }, "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 }, "fs-write-stream-atomic": { @@ -30254,9 +35163,9 @@ "optional": true }, "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==" }, "functional-red-black-tree": { "version": "1.0.1", @@ -30298,14 +35207,16 @@ "dev": true }, "get-intrinsic": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", - "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", "dev": true, "requires": { - "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" } }, "get-own-enumerable-property-symbols": { @@ -30347,7 +35258,7 @@ "getpass": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", "dev": true, "requires": { "assert-plus": "^1.0.0" @@ -30422,14 +35333,24 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/good-listener/-/good-listener-1.2.2.tgz", "integrity": "sha512-goW1b+d9q/HIwbVYZzZ6SsTr4IgE+WA44A0GmPIQstuOrgsFcT7VEJ48nmr9GaRtNu0XTKacFLGnBPAM6Afouw==", + "optional": true, "requires": { "delegate": "^3.1.2" } }, + "gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.3" + } + }, "graceful-fs": { - "version": "4.2.9", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", - "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==" + "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==" }, "graphlib": { "version": "2.1.8", @@ -30439,6 +35360,15 @@ "lodash": "^4.17.15" } }, + "guess-parser": { + "version": "0.4.22", + "resolved": "https://registry.npmjs.org/guess-parser/-/guess-parser-0.4.22.tgz", + "integrity": "sha512-KcUWZ5ACGaBM69SbqwVIuWGoSAgD+9iJnchR9j/IarVI1jHVeXv+bUXBIMeqVMSKt3zrn0Dgf9UpcOEpPBLbSg==", + "dev": true, + "requires": { + "@wessberg/ts-evaluator": "0.0.27" + } + }, "handle-thing": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", @@ -30459,6 +35389,21 @@ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, + "has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "requires": { + "es-define-property": "^1.0.0" + } + }, + "has-proto": { + "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 + }, "has-symbols": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", @@ -30552,6 +35497,15 @@ "minimalistic-assert": "^1.0.1" } }, + "hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "requires": { + "function-bind": "^1.1.2" + } + }, "hdr-histogram-js": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/hdr-histogram-js/-/hdr-histogram-js-2.0.3.tgz", @@ -30619,18 +35573,18 @@ "dev": true }, "hosted-git-info": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-5.2.1.tgz", - "integrity": "sha512-xIcQYMnhcx2Nr4JTjsFmwwnr9vldugPy9uVm0o87bjqqWMv9GaqsTeT+i99wTl0mk1uLxJtHxLb8kymqTENQsw==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.1.tgz", + "integrity": "sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==", "dev": true, "requires": { "lru-cache": "^7.5.1" }, "dependencies": { "lru-cache": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.14.0.tgz", - "integrity": "sha512-EIRtP1GrSJny0dqb50QXRUNBxHJhcpxHC++M5tD7RYbvLLn5KVWKsbyswSSqDuU15UFi3bgTQIY8nhDMeF6aDQ==", + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "dev": true } } @@ -30648,9 +35602,9 @@ }, "dependencies": { "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, "requires": { "core-util-is": "~1.0.0", @@ -30679,10 +35633,19 @@ "integrity": "sha512-vcz0yAaX/OaV6sdNHuT9alBOKkSxYb8h5Yq26dUqgi7XmCgGUSa7U9PiY1PBXQFMjKv1wVPs5/QzHlGuxPDUGg==", "dev": true }, + "html-encoding-sniffer": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", + "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", + "dev": true, + "requires": { + "whatwg-encoding": "^1.0.5" + } + }, "html-entities": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz", - "integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==", + "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 }, "html-escaper": { @@ -30692,60 +35655,21 @@ "dev": true }, "htmlparser2": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.1.tgz", - "integrity": "sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA==", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", + "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", "dev": true, "requires": { "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", + "domhandler": "^5.0.3", "domutils": "^3.0.1", - "entities": "^4.3.0" - }, - "dependencies": { - "dom-serializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", - "dev": true, - "requires": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" - } - }, - "domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "dev": true, - "requires": { - "domelementtype": "^2.3.0" - } - }, - "domutils": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz", - "integrity": "sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==", - "dev": true, - "requires": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.1" - } - }, - "entities": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.3.1.tgz", - "integrity": "sha512-o4q/dYJlmyjP2zfnaWDUC6A3BQFmVTX+tZPezK7k0GLSU9QYCauscf5Y+qcEPzKL+EixVouYDgLQK5H9GrLpkg==", - "dev": true - } + "entities": "^4.4.0" } }, "http-cache-semantics": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", "dev": true }, "http-deceiver": { @@ -30767,12 +35691,6 @@ "toidentifier": "1.0.1" }, "dependencies": { - "depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "dev": true - }, "statuses": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", @@ -30799,12 +35717,12 @@ } }, "http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", "dev": true, "requires": { - "@tootallnate/once": "2", + "@tootallnate/once": "1", "agent-base": "6", "debug": "4" } @@ -30897,18 +35815,18 @@ "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=" }, "ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", "dev": true }, "ignore-walk": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-5.0.1.tgz", - "integrity": "sha512-yemi4pMf51WKT7khInJqAvsIGzoqYXblnsz0ql8tM+yi1EKYTY1evX4NAbJrLL/Aanr2HyZeluqU+Oi7MGHokw==", + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-6.0.5.tgz", + "integrity": "sha512-VuuG0wCnjhnylG1ABXT3dAuIpTNDs/G8jlpmwXY03fXoXy/8ZK8/T+hMzt8L4WnrLCJgdybqgPagnF/f97cg3A==", "dev": true, "requires": { - "minimatch": "^5.0.1" + "minimatch": "^9.0.0" }, "dependencies": { "brace-expansion": { @@ -30921,9 +35839,9 @@ } }, "minimatch": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", - "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, "requires": { "brace-expansion": "^2.0.1" @@ -30939,9 +35857,9 @@ "optional": true }, "immutable": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.1.0.tgz", - "integrity": "sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ==", + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.6.tgz", + "integrity": "sha512-Ju0+lEMyzMVZarkTn/gqRpdqd5dOPaz1mCZ0SH3JV6iFw81PldE/PEB1hWVEA288HPt4WXW8O7AWxB10M+03QQ==", "dev": true }, "import-fresh": { @@ -31083,17 +36001,42 @@ "internmap": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", - "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==" + "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", + "optional": true }, "ip": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" }, + "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, + "requires": { + "jsbn": "1.1.0", + "sprintf-js": "^1.1.3" + }, + "dependencies": { + "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 + }, + "sprintf-js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", + "dev": true + } + } + }, "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 }, "is": { @@ -31179,7 +36122,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, "requires": { "is-plain-object": "^2.0.4" } @@ -31255,11 +36197,16 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, "requires": { "isobject": "^3.0.1" } }, + "is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "dev": true + }, "is-regexp": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", @@ -31275,7 +36222,7 @@ "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", "dev": true }, "is-unicode-supported": { @@ -31324,13 +36271,12 @@ "isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" }, "isstream": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", "dev": true }, "istanbul-lib-coverage": { @@ -31398,6 +36344,79 @@ "istanbul-lib-report": "^3.0.0" } }, + "jackspeak": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.0.tgz", + "integrity": "sha512-JVYhQnN59LVPFCEcVa2C3CrEKYacvjRfqIQl+h8oi91aLYQVWRYbxjPcv1bUiUy/kLmQaANrYfNMCO3kuEDHfw==", + "dev": true, + "requires": { + "@isaacs/cliui": "^8.0.2", + "@pkgjs/parseargs": "^0.11.0" + } + }, + "jake": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.1.tgz", + "integrity": "sha512-61btcOHNnLnsOdtLgA5efqQWjnSi/vow5HbI7HMdKKWqvrKR1bLK3BPlJn9gcSaP2ewuamUSMB5XEy76KUIS2w==", + "dev": true, + "requires": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.4", + "minimatch": "^3.1.2" + }, + "dependencies": { + "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, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, "jasmine-core": { "version": "3.99.0", "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-3.99.0.tgz", @@ -31432,6 +36451,12 @@ } } }, + "jiti": { + "version": "1.21.6", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.6.tgz", + "integrity": "sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==", + "dev": true + }, "jquery": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.0.tgz", @@ -31456,8 +36481,95 @@ "jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", + "dev": true + }, + "jsdom": { + "version": "16.7.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", + "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", + "dev": true, + "requires": { + "abab": "^2.0.5", + "acorn": "^8.2.4", + "acorn-globals": "^6.0.0", + "cssom": "^0.4.4", + "cssstyle": "^2.3.0", + "data-urls": "^2.0.0", + "decimal.js": "^10.2.1", + "domexception": "^2.0.1", + "escodegen": "^2.0.0", + "form-data": "^3.0.0", + "html-encoding-sniffer": "^2.0.1", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.0", + "parse5": "6.0.1", + "saxes": "^5.0.1", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.0.0", + "w3c-hr-time": "^1.0.2", + "w3c-xmlserializer": "^2.0.0", + "webidl-conversions": "^6.1.0", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.5.0", + "ws": "^7.4.6", + "xml-name-validator": "^3.0.0" + }, + "dependencies": { + "form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, + "parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true + }, + "tr46": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", + "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", + "dev": true, + "requires": { + "punycode": "^2.1.1" + } + }, + "webidl-conversions": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", + "dev": true + }, + "whatwg-url": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", + "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", + "dev": true, + "requires": { + "lodash": "^4.7.0", + "tr46": "^2.1.0", + "webidl-conversions": "^6.1.0" + } + }, + "ws": { + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "dev": true, + "requires": {} + } + } }, "jsesc": { "version": "2.5.2", @@ -31496,7 +36608,7 @@ "json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", "dev": true }, "json5": { @@ -31506,9 +36618,9 @@ "dev": true }, "jsonc-parser": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.1.0.tgz", - "integrity": "sha512-DRf0QjnNeCUds3xTjKlQQ3DpJD51GvDjJfnxUVWg6PZTo2otSm+slzNAxU/35hF8/oJIKoG9slq30JYOsF2azg==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", "dev": true }, "jsonfile": { @@ -31714,24 +36826,27 @@ } }, "katex": { - "version": "0.16.4", - "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.4.tgz", - "integrity": "sha512-WudRKUj8yyBeVDI4aYMNxhx5Vhh2PjpzQw1GRu/LVGqL4m1AxwD1GcUp0IMbdJaf5zsjtj8ghP0DOQRYhroNkw==", + "version": "0.16.10", + "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.10.tgz", + "integrity": "sha512-ZiqaC04tp2O5utMsl2TEZTXxa6WSC4yo0fv5ML++D3QZv/vx2Mct0mTlRx3O+uUkjfuAgOkzsCmq5MiUEsDDdA==", + "optional": true, "requires": { - "commander": "^8.0.0" + "commander": "^8.3.0" }, "dependencies": { "commander": { "version": "8.3.0", "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==" + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "optional": true } } }, "khroma": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/khroma/-/khroma-2.0.0.tgz", - "integrity": "sha512-2J8rDNlQWbtiNYThZRvmMv5yt44ZakX+Tz5ZIp/mN1pt4snn+m030Va5Z4v8xA0cQFDXBwO/8i42xL4QPsVk3g==" + "integrity": "sha512-2J8rDNlQWbtiNYThZRvmMv5yt44ZakX+Tz5ZIp/mN1pt4snn+m030Va5Z4v8xA0cQFDXBwO/8i42xL4QPsVk3g==", + "optional": true }, "kind-of": { "version": "6.0.3", @@ -31746,11 +36861,21 @@ "dev": true }, "klona": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.5.tgz", - "integrity": "sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", + "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", "dev": true }, + "launch-editor": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.9.1.tgz", + "integrity": "sha512-Gcnl4Bd+hRO9P9icCP/RVVT2o8SFlPXofuCxvA2SaZuH45whSvf5p8x5oih5ftLiVhEI4sp5xDY+R+b3zJBh5w==", + "dev": true, + "requires": { + "picocolors": "^1.0.0", + "shell-quote": "^1.8.1" + } + }, "lazy-ass": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/lazy-ass/-/lazy-ass-1.6.0.tgz", @@ -31817,9 +36942,9 @@ } }, "less-loader": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-11.0.0.tgz", - "integrity": "sha512-9+LOWWjuoectIEx3zrfN83NAGxSUB5pWEabbbidVQVgZhN+wN68pOvuyirVlH1IK4VT1f3TmlyvAnCXh8O5KEw==", + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-11.1.0.tgz", + "integrity": "sha512-C+uDBV7kS7W5fJlUjq5mPBeBVhYpTIm5gB09APT9o3n/ILeaXVsiSFTbZpTJCJwQ/Crczfn3DmfQFwxYusWFug==", "dev": true, "requires": { "klona": "^2.0.4" @@ -32008,9 +37133,9 @@ "dev": true }, "loader-utils": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.0.tgz", - "integrity": "sha512-HVl9ZqccQihZ7JM85dco1MvO9G+ONvxoGa9rkhzFsneGLKSUg1gJf9bWzhRhcvm2qChhWpebQhP44qxjKIUCaQ==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.1.tgz", + "integrity": "sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==", "dev": true }, "locate-path": { @@ -32030,7 +37155,8 @@ "lodash-es": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", - "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", + "optional": true }, "lodash.debounce": { "version": "4.0.8", @@ -32208,12 +37334,12 @@ } }, "magic-string": { - "version": "0.26.2", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.26.2.tgz", - "integrity": "sha512-NzzlXpclt5zAbmo6h6jNc8zl2gNRGHvmsZW4IvZhTC4W7k4OlLP+S5YLussa/r3ixNT66KOQfNORlXHSOy/X4A==", + "version": "0.30.1", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.1.tgz", + "integrity": "sha512-mbVKXPmS0z0G4XqFDCTllmDQ6coZzn94aMlb0o/A4HEHJCKcanlDZwYJgwnkmgD3jyWhUgj9VsPrfd972yPffA==", "dev": true, "requires": { - "sourcemap-codec": "^1.4.8" + "@jridgewell/sourcemap-codec": "^1.4.15" } }, "make-dir": { @@ -32263,11 +37389,140 @@ "ssri": "^9.0.0" }, "dependencies": { + "@npmcli/fs": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.2.tgz", + "integrity": "sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==", + "dev": true, + "requires": { + "@gar/promisify": "^1.1.3", + "semver": "^7.3.5" + } + }, + "@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "dev": true + }, + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "cacache": { + "version": "16.1.3", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.1.3.tgz", + "integrity": "sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==", + "dev": true, + "requires": { + "@npmcli/fs": "^2.1.0", + "@npmcli/move-file": "^2.0.0", + "chownr": "^2.0.0", + "fs-minipass": "^2.1.0", + "glob": "^8.0.1", + "infer-owner": "^1.0.4", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "mkdirp": "^1.0.4", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^9.0.0", + "tar": "^6.1.11", + "unique-filename": "^2.0.0" + } + }, + "fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + } + }, + "http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, + "requires": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + } + }, "lru-cache": { - "version": "7.14.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.14.0.tgz", - "integrity": "sha512-EIRtP1GrSJny0dqb50QXRUNBxHJhcpxHC++M5tD7RYbvLLn5KVWKsbyswSSqDuU15UFi3bgTQIY8nhDMeF6aDQ==", + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "dev": true + }, + "minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + }, + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "ssri": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz", + "integrity": "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==", + "dev": true, + "requires": { + "minipass": "^3.1.1" + } + }, + "unique-filename": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-2.0.1.tgz", + "integrity": "sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==", + "dev": true, + "requires": { + "unique-slug": "^3.0.0" + } + }, + "unique-slug": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-3.0.0.tgz", + "integrity": "sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4" + } } } }, @@ -32287,9 +37542,10 @@ } }, "marked": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/marked/-/marked-4.2.3.tgz", - "integrity": "sha512-slWRdJkbTZ+PjkyJnE30Uid64eHwbwa1Q25INCAYfZlK4o6ylagBy/Le9eWntqJFoFT93ikUKMv47GZ4gTwHkw==" + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", + "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", + "peer": true }, "material-design-icons-iconfont": { "version": "6.1.1", @@ -32319,12 +37575,12 @@ "dev": true }, "memfs": { - "version": "3.4.7", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.7.tgz", - "integrity": "sha512-ygaiUSNalBX85388uskeCyhSAoOSgzBbtVCr9jA2RROssFL9Q19/ZXFqS+2Th2sr1ewNIWgFdLzLC3Yl1Zv+lw==", + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", + "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", "dev": true, "requires": { - "fs-monkey": "^1.0.3" + "fs-monkey": "^1.0.4" } }, "memory-fs": { @@ -32364,9 +37620,9 @@ } }, "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", "dev": true }, "merge-stream": { @@ -32385,6 +37641,7 @@ "version": "9.3.0", "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-9.3.0.tgz", "integrity": "sha512-mGl0BM19TD/HbU/LmlaZbjBi//tojelg8P/mxD6pPZTAYaI+VawcyBdqRsoUHSc7j71PrMdJ3HBadoQNdvP5cg==", + "optional": true, "requires": { "@braintree/sanitize-url": "^6.0.0", "d3": "^7.0.0", @@ -32398,10 +37655,17 @@ "uuid": "^9.0.0" }, "dependencies": { + "dompurify": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.4.1.tgz", + "integrity": "sha512-ewwFzHzrrneRjxzmK6oVz/rZn9VWspGFRDb4/rRtIsM1n36t9AKma/ye8syCpcw+XJ25kOK/hOG7t1j2I2yBqA==", + "optional": true + }, "uuid": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", - "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==" + "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", + "optional": true } } }, @@ -32467,24 +37731,24 @@ "dev": true }, "mini-css-extract-plugin": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.6.1.tgz", - "integrity": "sha512-wd+SD57/K6DiV7jIR34P+s3uckTRuQvx0tKPcvjFlrEylk6P4mQ2KSWk1hblj1Kxaqok7LogKOieygXqBczNlg==", + "version": "2.7.6", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.6.tgz", + "integrity": "sha512-Qk7HcgaPkGG6eD77mLvZS1nmxlao3j+9PkrT9Uc7HAE1id3F41+DdBRYRYkbyfNRGzm8/YWtzhw7nVPmwhqTQw==", "dev": true, "requires": { "schema-utils": "^4.0.0" }, "dependencies": { "ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.16.0.tgz", + "integrity": "sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw==", "dev": true, "requires": { - "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" } }, "ajv-keywords": { @@ -32503,15 +37767,15 @@ "dev": true }, "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, "requires": { "@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" } } } @@ -32537,18 +37801,15 @@ } }, "minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==" }, "minipass": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.4.tgz", - "integrity": "sha512-I9WPbWHCGu8W+6k1ZiGpPu0GkoKBeorkfKNuAFBNS1HNFJvke82sxvI5bzcCNpWPorkOO5QQ+zomzzwRxejXiw==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true }, "minipass-collect": { "version": "1.0.2", @@ -32557,6 +37818,17 @@ "dev": true, "requires": { "minipass": "^3.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + } } }, "minipass-fetch": { @@ -32569,6 +37841,17 @@ "minipass": "^3.1.6", "minipass-sized": "^1.0.3", "minizlib": "^2.1.2" + }, + "dependencies": { + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + } } }, "minipass-flush": { @@ -32578,6 +37861,17 @@ "dev": true, "requires": { "minipass": "^3.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + } } }, "minipass-json-stream": { @@ -32588,6 +37882,17 @@ "requires": { "jsonparse": "^1.3.1", "minipass": "^3.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + } } }, "minipass-pipeline": { @@ -32597,6 +37902,17 @@ "dev": true, "requires": { "minipass": "^3.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + } } }, "minipass-sized": { @@ -32606,6 +37922,17 @@ "dev": true, "requires": { "minipass": "^3.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + } } }, "minizlib": { @@ -32616,6 +37943,17 @@ "requires": { "minipass": "^3.0.0", "yallist": "^4.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + } } }, "mississippi": { @@ -32660,7 +37998,8 @@ "moment-mini": { "version": "2.29.4", "resolved": "https://registry.npmjs.org/moment-mini/-/moment-mini-2.29.4.tgz", - "integrity": "sha512-uhXpYwHFeiTbY9KSgPPRoo1nt8OxNVdMVoTBYHfSEKeRkIkwGpO+gERmhuhBtzfaeOyTkykSrm2+noJBgqt3Hg==" + "integrity": "sha512-uhXpYwHFeiTbY9KSgPPRoo1nt8OxNVdMVoTBYHfSEKeRkIkwGpO+gERmhuhBtzfaeOyTkykSrm2+noJBgqt3Hg==", + "optional": true }, "move-concurrently": { "version": "1.0.1", @@ -32698,6 +38037,12 @@ } } }, + "mrmime": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz", + "integrity": "sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==", + "dev": true + }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -32727,9 +38072,9 @@ "optional": true }, "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 }, "nanomatch": { @@ -32758,27 +38103,16 @@ "dev": true }, "needle": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/needle/-/needle-3.1.0.tgz", - "integrity": "sha512-gCE9weDhjVGCRqS8dwDR/D3GTAeyXLXuqp7I8EzH6DllZGXSUyxuqqLh+YX9rMAWaaTFyVAg6rHGL25dqvczKw==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/needle/-/needle-3.3.1.tgz", + "integrity": "sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q==", "dev": true, "optional": true, "requires": { - "debug": "^3.2.6", "iconv-lite": "^0.6.3", "sax": "^1.2.4" }, "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "optional": true, - "requires": { - "ms": "^2.1.1" - } - }, "iconv-lite": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", @@ -32803,40 +38137,23 @@ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "dev": true }, - "ng2-ui-auth": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/ng2-ui-auth/-/ng2-ui-auth-10.0.1.tgz", - "integrity": "sha512-7LqWdH4/9Id21Ced5LCSIA9aUTPQU0DPwhtQhBMxHRCFx9P4bpCAUwTgJ0XLt2pczusdnGpmBxeDFILZnwupmA==", - "requires": { - "tslib": "^1.9.0" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - } - } - }, "ngx-markdown": { - "version": "14.0.1", - "resolved": "https://registry.npmjs.org/ngx-markdown/-/ngx-markdown-14.0.1.tgz", - "integrity": "sha512-y5CY4e0QM0uR6+MvU1rnh1Ks+rku14309kVVojyXLcWl4zlrt8VAYCcf/+A+8z/IDOaz38yTrxNBnvYDJzNzYA==", + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/ngx-markdown/-/ngx-markdown-16.0.0.tgz", + "integrity": "sha512-/rlbXi+HBscJCDdwaTWIUrRkvwJicPnuAgeugOCZa0UbZ4VCWV3U0+uB1Zv6krRDF6FXJNXNLTUrMZV7yH8I6A==", "requires": { - "@types/marked": "^4.0.3", "clipboard": "^2.0.11", - "emoji-toolkit": "^6.6.0", + "emoji-toolkit": "^7.0.0", "katex": "^0.16.0", - "marked": "^4.0.17", "mermaid": "^9.1.2", "prismjs": "^1.28.0", "tslib": "^2.3.0" } }, "ngx-mat-select-search": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ngx-mat-select-search/-/ngx-mat-select-search-5.0.0.tgz", - "integrity": "sha512-w9NLIhN/b6aDpvwdrvxttNm6eYbcnalyCIOPaFPTpK8Ub8graHmL6qQdWzIw54Qxyzlr7A0DvpMgywcs4eGSYA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/ngx-mat-select-search/-/ngx-mat-select-search-6.0.0.tgz", + "integrity": "sha512-arrWZg2N/Pv3hCE2EV0qj3rqEUKImntmhW8qvo/aYxeN9iWPsseOpokcfMeC9I/SrLrqQFdfyPgHOgB9DqF2Hw==", "requires": { "tslib": "^2.4.0" } @@ -32864,8 +38181,7 @@ "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, - "optional": true + "dev": true }, "node-fetch": { "version": "2.6.7", @@ -32893,12 +38209,13 @@ "dev": true }, "node-gyp": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.3.0.tgz", - "integrity": "sha512-A6rJWfXFz7TQNjpldJ915WFb1LnhO4lIve3ANPbWreuEoLoKlFT3sxIepPBkLhM27crW8YmN+pjlgbasH6cH/Q==", + "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, "requires": { "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", @@ -32922,11 +38239,10 @@ } }, "node-gyp-build": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.3.0.tgz", - "integrity": "sha512-iWjXZvmboq0ja1pUGULQBexmxq8CV4xBhX7VDOTbL7ZR4FOowwY/VOtRxBN/yKxmdGoIp4j5ysNT4u3S2pDQ3Q==", - "dev": true, - "optional": true + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.1.tgz", + "integrity": "sha512-OSs33Z9yWr148JZcbZd5WiAXhh/n9z8TxQcdMhIOlpN9AhWpLfvVFO73+m77bBABQMaY9XSvIa+qk0jlI7Gcaw==", + "dev": true }, "node-libs-browser": { "version": "2.2.1", @@ -33003,9 +38319,9 @@ } }, "node-releases": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", - "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==", + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", "dev": true }, "node.extend": { @@ -33021,7 +38337,8 @@ "non-layered-tidy-tree-layout": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/non-layered-tidy-tree-layout/-/non-layered-tidy-tree-layout-2.0.2.tgz", - "integrity": "sha512-gkXMxRzUH+PB0ax9dUN0yYF0S25BqeAYqhgMaLUFmpXLEk7Fcu8f4emJuOAY0V8kjDICxROIKsTAKsV/v355xw==" + "integrity": "sha512-gkXMxRzUH+PB0ax9dUN0yYF0S25BqeAYqhgMaLUFmpXLEk7Fcu8f4emJuOAY0V8kjDICxROIKsTAKsV/v355xw==", + "optional": true }, "nopt": { "version": "4.0.3", @@ -33077,9 +38394,9 @@ } }, "npm-install-checks": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-5.0.0.tgz", - "integrity": "sha512-65lUsMI8ztHCxFz5ckCEC44DRvEGdZX5usQFriauxHEwt7upv1FKaQEmAtU0YnOAdwuNWCmk64xYiQABNrEyLA==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-6.3.0.tgz", + "integrity": "sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw==", "dev": true, "requires": { "semver": "^7.1.1" @@ -33091,122 +38408,135 @@ "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==" }, "npm-package-arg": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-9.1.0.tgz", - "integrity": "sha512-4J0GL+u2Nh6OnhvUKXRr2ZMG4lR8qtLp+kv7UiV00Y+nGiSxtttCyIRHCt5L5BNkXQld/RceYItau3MDOoGiBw==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-10.1.0.tgz", + "integrity": "sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA==", "dev": true, "requires": { - "hosted-git-info": "^5.0.0", - "proc-log": "^2.0.1", + "hosted-git-info": "^6.0.0", + "proc-log": "^3.0.0", "semver": "^7.3.5", - "validate-npm-package-name": "^4.0.0" + "validate-npm-package-name": "^5.0.0" }, "dependencies": { - "builtins": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", - "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==", - "dev": true, - "requires": { - "semver": "^7.0.0" - } - }, "validate-npm-package-name": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-4.0.0.tgz", - "integrity": "sha512-mzR0L8ZDktZjpX4OB46KT+56MAhl4EIazWP/+G/HPGuvfdaqg4YsCdtOm6U9+LOFyYDoh4dpnpxZRB9MQQns5Q==", - "dev": true, - "requires": { - "builtins": "^5.0.0" - } + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.1.tgz", + "integrity": "sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==", + "dev": true } } }, "npm-packlist": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-5.1.3.tgz", - "integrity": "sha512-263/0NGrn32YFYi4J533qzrQ/krmmrWwhKkzwTuM4f/07ug51odoaNjUexxO4vxlzURHcmYMH1QjvHjsNDKLVg==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-7.0.4.tgz", + "integrity": "sha512-d6RGEuRrNS5/N84iglPivjaJPxhDbZmlbTwTDX2IbcRHG5bZCdtysYMhwiPvcF4GisXHGn7xsxv+GQ7T/02M5Q==", "dev": true, "requires": { - "glob": "^8.0.1", - "ignore-walk": "^5.0.1", - "npm-bundled": "^2.0.0", - "npm-normalize-package-bin": "^2.0.0" - }, - "dependencies": { - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "glob": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz", - "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - } - }, - "minimatch": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", - "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } - }, - "npm-bundled": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-2.0.1.tgz", - "integrity": "sha512-gZLxXdjEzE/+mOstGDqR6b0EkhJ+kM6fxM6vUuckuctuVPh80Q6pw/rSZj9s4Gex9GxWtIicO1pc8DB9KZWudw==", - "dev": true, - "requires": { - "npm-normalize-package-bin": "^2.0.0" - } - }, - "npm-normalize-package-bin": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-2.0.0.tgz", - "integrity": "sha512-awzfKUO7v0FscrSpRoogyNm0sajikhBWpU0QMrW09AMi9n1PoKU6WaIqUzuJSQnpciZZmJ/jMZ2Egfmb/9LiWQ==", - "dev": true - } + "ignore-walk": "^6.0.0" } }, "npm-pick-manifest": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-7.0.1.tgz", - "integrity": "sha512-IA8+tuv8KujbsbLQvselW2XQgmXWS47t3CB0ZrzsRZ82DbDfkcFunOaPm4X7qNuhMfq+FmV7hQT4iFVpHqV7mg==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-8.0.1.tgz", + "integrity": "sha512-mRtvlBjTsJvfCCdmPtiu2bdlx8d/KXtF7yNXNWe7G0Z36qWA9Ny5zXsI2PfBZEv7SXgoxTmNaTzGSbbzDZChoA==", "dev": true, "requires": { - "npm-install-checks": "^5.0.0", - "npm-normalize-package-bin": "^1.0.1", - "npm-package-arg": "^9.0.0", + "npm-install-checks": "^6.0.0", + "npm-normalize-package-bin": "^3.0.0", + "npm-package-arg": "^10.0.0", "semver": "^7.3.5" + }, + "dependencies": { + "npm-normalize-package-bin": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz", + "integrity": "sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==", + "dev": true + } } }, "npm-registry-fetch": { - "version": "13.3.1", - "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-13.3.1.tgz", - "integrity": "sha512-eukJPi++DKRTjSBRcDZSDDsGqRK3ehbxfFUcgaRd0Yp6kRwOwh2WVn0r+8rMB4nnuzvAk6rQVzl6K5CkYOmnvw==", + "version": "14.0.5", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-14.0.5.tgz", + "integrity": "sha512-kIDMIo4aBm6xg7jOttupWZamsZRkAqMqwqqbVXnUqstY5+tapvv6bkH/qMR76jdgV+YljEUCyWx3hRYMrJiAgA==", "dev": true, "requires": { - "make-fetch-happen": "^10.0.6", - "minipass": "^3.1.6", - "minipass-fetch": "^2.0.3", + "make-fetch-happen": "^11.0.0", + "minipass": "^5.0.0", + "minipass-fetch": "^3.0.0", "minipass-json-stream": "^1.0.1", "minizlib": "^2.1.2", - "npm-package-arg": "^9.0.1", - "proc-log": "^2.0.0" + "npm-package-arg": "^10.0.0", + "proc-log": "^3.0.0" + }, + "dependencies": { + "@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "dev": true + }, + "http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, + "requires": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + } + }, + "lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true + }, + "make-fetch-happen": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", + "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", + "dev": true, + "requires": { + "agentkeepalive": "^4.2.1", + "cacache": "^17.0.0", + "http-cache-semantics": "^4.1.1", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.7.1", + "minipass": "^5.0.0", + "minipass-fetch": "^3.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^7.0.0", + "ssri": "^10.0.0" + } + }, + "minipass-fetch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.5.tgz", + "integrity": "sha512-2N8elDQAtSnFV0Dk7gt15KHsS0Fyz6CbYZ360h0WTYV1Ty46li3rAXVOQj1THMNLdmrD9Vt5pBPtWtVkpwGBqg==", + "dev": true, + "requires": { + "encoding": "^0.1.13", + "minipass": "^7.0.3", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "dependencies": { + "minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true + } + } + } } }, "npm-run-path": { @@ -33239,6 +38569,203 @@ "boolbase": "^1.0.0" } }, + "nwsapi": { + "version": "2.2.10", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.10.tgz", + "integrity": "sha512-QK0sRs7MKv0tKe1+5uZIQk/C8XGza4DAnztJG8iD+TpJIORARrCxczA738awHrZoHeTjSSoHqao2teO0dC/gFQ==", + "dev": true + }, + "nx": { + "version": "16.5.1", + "resolved": "https://registry.npmjs.org/nx/-/nx-16.5.1.tgz", + "integrity": "sha512-I3hJRE4hG7JWAtncWwDEO3GVeGPpN0TtM8xH5ArZXyDuVeTth/i3TtJzdDzqXO1HHtIoAQN0xeq4n9cLuMil5g==", + "dev": true, + "requires": { + "@nrwl/tao": "16.5.1", + "@nx/nx-darwin-arm64": "16.5.1", + "@nx/nx-darwin-x64": "16.5.1", + "@nx/nx-freebsd-x64": "16.5.1", + "@nx/nx-linux-arm-gnueabihf": "16.5.1", + "@nx/nx-linux-arm64-gnu": "16.5.1", + "@nx/nx-linux-arm64-musl": "16.5.1", + "@nx/nx-linux-x64-gnu": "16.5.1", + "@nx/nx-linux-x64-musl": "16.5.1", + "@nx/nx-win32-arm64-msvc": "16.5.1", + "@nx/nx-win32-x64-msvc": "16.5.1", + "@parcel/watcher": "2.0.4", + "@yarnpkg/lockfile": "^1.1.0", + "@yarnpkg/parsers": "3.0.0-rc.46", + "@zkochan/js-yaml": "0.0.6", + "axios": "^1.0.0", + "chalk": "^4.1.0", + "cli-cursor": "3.1.0", + "cli-spinners": "2.6.1", + "cliui": "^7.0.2", + "dotenv": "~10.0.0", + "enquirer": "~2.3.6", + "fast-glob": "3.2.7", + "figures": "3.2.0", + "flat": "^5.0.2", + "fs-extra": "^11.1.0", + "glob": "7.1.4", + "ignore": "^5.0.4", + "js-yaml": "4.1.0", + "jsonc-parser": "3.2.0", + "lines-and-columns": "~2.0.3", + "minimatch": "3.0.5", + "npm-run-path": "^4.0.1", + "open": "^8.4.0", + "semver": "7.5.3", + "string-width": "^4.2.3", + "strong-log-transformer": "^2.1.0", + "tar-stream": "~2.2.0", + "tmp": "~0.2.1", + "tsconfig-paths": "^4.1.2", + "tslib": "^2.3.0", + "v8-compile-cache": "2.3.0", + "yargs": "^17.6.2", + "yargs-parser": "21.1.1" + }, + "dependencies": { + "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, + "requires": { + "color-convert": "^2.0.1" + } + }, + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "fast-glob": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", + "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + } + }, + "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, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "glob": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + }, + "lines-and-columns": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-2.0.4.tgz", + "integrity": "sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A==", + "dev": true + }, + "minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "semver": { + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", + "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "tsconfig-paths": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", + "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", + "dev": true, + "requires": { + "json5": "^2.2.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + } + } + }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -33314,9 +38841,15 @@ } }, "object-inspect": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", - "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", + "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", + "dev": true + }, + "object-path": { + "version": "0.11.8", + "resolved": "https://registry.npmjs.org/object-path/-/object-path-0.11.8.tgz", + "integrity": "sha512-YJjNZrlXJFM42wTBn6zgOJVar9KFJvzx6sTWDte8sWZF//cnjl0BxHNpfZx+ZffXX63A9q0b1zsFiBX4g4X5KA==", "dev": true }, "object-visit": { @@ -33376,9 +38909,9 @@ } }, "open": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", - "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", + "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, "requires": { "define-lazy-prop": "^2.0.0", @@ -33620,12 +39153,6 @@ "lodash": "^4.17.14" } }, - "commander": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", - "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", - "dev": true - }, "globby": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", @@ -33641,32 +39168,35 @@ } } }, + "package-json-from-dist": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", + "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==", + "dev": true + }, "pacote": { - "version": "13.6.2", - "resolved": "https://registry.npmjs.org/pacote/-/pacote-13.6.2.tgz", - "integrity": "sha512-Gu8fU3GsvOPkak2CkbojR7vjs3k3P9cA6uazKTHdsdV0gpCEQq2opelnEv30KRQWgVzP5Vd/5umjcedma3MKtg==", - "dev": true, - "requires": { - "@npmcli/git": "^3.0.0", - "@npmcli/installed-package-contents": "^1.0.7", - "@npmcli/promise-spawn": "^3.0.0", - "@npmcli/run-script": "^4.1.0", - "cacache": "^16.0.0", - "chownr": "^2.0.0", - "fs-minipass": "^2.1.0", - "infer-owner": "^1.0.4", - "minipass": "^3.1.6", - "mkdirp": "^1.0.4", - "npm-package-arg": "^9.0.0", - "npm-packlist": "^5.1.0", - "npm-pick-manifest": "^7.0.0", - "npm-registry-fetch": "^13.0.1", - "proc-log": "^2.0.0", + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-15.2.0.tgz", + "integrity": "sha512-rJVZeIwHTUta23sIZgEIM62WYwbmGbThdbnkt81ravBplQv+HjyroqnLRNH2+sLJHcGZmLRmhPwACqhfTcOmnA==", + "dev": true, + "requires": { + "@npmcli/git": "^4.0.0", + "@npmcli/installed-package-contents": "^2.0.1", + "@npmcli/promise-spawn": "^6.0.1", + "@npmcli/run-script": "^6.0.0", + "cacache": "^17.0.0", + "fs-minipass": "^3.0.0", + "minipass": "^5.0.0", + "npm-package-arg": "^10.0.0", + "npm-packlist": "^7.0.0", + "npm-pick-manifest": "^8.0.0", + "npm-registry-fetch": "^14.0.0", + "proc-log": "^3.0.0", "promise-retry": "^2.0.1", - "read-package-json": "^5.0.0", - "read-package-json-fast": "^2.0.3", - "rimraf": "^3.0.2", - "ssri": "^9.0.0", + "read-package-json": "^6.0.0", + "read-package-json-fast": "^3.0.0", + "sigstore": "^1.3.0", + "ssri": "^10.0.0", "tar": "^6.1.11" }, "dependencies": { @@ -33680,55 +39210,70 @@ } }, "glob": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz", - "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", + "version": "10.4.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.2.tgz", + "integrity": "sha512-GwMlUF6PkPo3Gk21UxkCohOv0PLcIXVtKyLlpEI28R/cO/4eNOdmLk3CMW1wROV/WR/EsZOWAfBbBOqYvs88/w==", "dev": true, "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "dependencies": { + "minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true + } } }, + "json-parse-even-better-errors": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.2.tgz", + "integrity": "sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==", + "dev": true + }, "minimatch": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", - "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, "requires": { "brace-expansion": "^2.0.1" } }, "normalize-package-data": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-4.0.1.tgz", - "integrity": "sha512-EBk5QKKuocMJhB3BILuKhmaPjI8vNRSpIfO9woLC6NyHVkKKdVEdAO1mrT0ZfxNR1lKwCcTkuZfmGIFdizZ8Pg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-5.0.0.tgz", + "integrity": "sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q==", "dev": true, "requires": { - "hosted-git-info": "^5.0.0", + "hosted-git-info": "^6.0.0", "is-core-module": "^2.8.1", "semver": "^7.3.5", "validate-npm-package-license": "^3.0.4" } }, "npm-normalize-package-bin": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-2.0.0.tgz", - "integrity": "sha512-awzfKUO7v0FscrSpRoogyNm0sajikhBWpU0QMrW09AMi9n1PoKU6WaIqUzuJSQnpciZZmJ/jMZ2Egfmb/9LiWQ==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz", + "integrity": "sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==", "dev": true }, "read-package-json": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-5.0.2.tgz", - "integrity": "sha512-BSzugrt4kQ/Z0krro8zhTwV1Kd79ue25IhNN/VtHFy1mG/6Tluyi+msc0UpwaoQzxSHa28mntAjIZY6kEgfR9Q==", + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-6.0.4.tgz", + "integrity": "sha512-AEtWXYfopBj2z5N5PbkAOeNHRPUg5q+Nen7QLxV8M2zJq1ym6/lCz3fYNTCXe19puu2d06jfHhrP7v/S2PtMMw==", "dev": true, "requires": { - "glob": "^8.0.1", - "json-parse-even-better-errors": "^2.3.1", - "normalize-package-data": "^4.0.0", - "npm-normalize-package-bin": "^2.0.0" + "glob": "^10.2.2", + "json-parse-even-better-errors": "^3.0.0", + "normalize-package-data": "^5.0.0", + "npm-normalize-package-bin": "^3.0.0" } } } @@ -33820,54 +39365,44 @@ "optional": true }, "parse5-html-rewriting-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5-html-rewriting-stream/-/parse5-html-rewriting-stream-6.0.1.tgz", - "integrity": "sha512-vwLQzynJVEfUlURxgnf51yAJDQTtVpNyGD8tKi2Za7m+akukNHxCcUQMAa/mUGLhCeicFdpy7Tlvj8ZNKadprg==", - "dev": true, - "requires": { - "parse5": "^6.0.1", - "parse5-sax-parser": "^6.0.1" - }, - "dependencies": { - "parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", - "dev": true - } - } - }, - "parse5-htmlparser2-tree-adapter": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", - "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse5-html-rewriting-stream/-/parse5-html-rewriting-stream-7.0.0.tgz", + "integrity": "sha512-mazCyGWkmCRWDI15Zp+UiCqMp/0dgEmkZRvhlsqqKYr4SsVm/TvnSpD9fCvqCA2zoWJcfRym846ejWBBHRiYEg==", "dev": true, "requires": { - "parse5": "^6.0.1" + "entities": "^4.3.0", + "parse5": "^7.0.0", + "parse5-sax-parser": "^7.0.0" }, "dependencies": { "parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", - "dev": true + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "dev": true, + "requires": { + "entities": "^4.4.0" + } } } }, "parse5-sax-parser": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5-sax-parser/-/parse5-sax-parser-6.0.1.tgz", - "integrity": "sha512-kXX+5S81lgESA0LsDuGjAlBybImAChYRMT+/uKCEXFBFOeEhS52qUCydGhU3qLRD8D9DVjaUo821WK7DM4iCeg==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse5-sax-parser/-/parse5-sax-parser-7.0.0.tgz", + "integrity": "sha512-5A+v2SNsq8T6/mG3ahcz8ZtQ0OUFTatxPbeidoMB7tkJSGDY3tdfl4MHovtLQHkEn5CGxijNWRQHhRQ6IRpXKg==", "dev": true, "requires": { - "parse5": "^6.0.1" + "parse5": "^7.0.0" }, "dependencies": { "parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", - "dev": true + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "dev": true, + "requires": { + "entities": "^4.4.0" + } } } }, @@ -33918,10 +39453,28 @@ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, + "path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "requires": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.3.0.tgz", + "integrity": "sha512-CQl19J/g+Hbjbv4Y3mFNNXFEL/5t/KCg8POCuUqd4rMKjGG+j1ybER83hxV58zL+dFI1PTkt3GNFSHRt+d8qEQ==", + "dev": true + } + } + }, "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.10.tgz", + "integrity": "sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==", "dev": true }, "path-type": { @@ -33952,13 +39505,13 @@ "performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", "dev": true }, "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", "dev": true }, "picomatch": { @@ -33989,9 +39542,9 @@ } }, "piscina": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/piscina/-/piscina-3.2.0.tgz", - "integrity": "sha512-yn/jMdHRw+q2ZJhFhyqsmANcbF6V2QwmD84c6xRau+QpQOmtrBCoRGdvTfeuFDYXB5W2m6MfLkjkvQa9lUSmIA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/piscina/-/piscina-4.0.0.tgz", + "integrity": "sha512-641nAmJS4k4iqpNUqfggqUBUMmlw0ZoM5VZKdQkV2e970Inn3Tk9kroCc1wpsYLD07vCwpys5iY0d3xI/9WkTg==", "dev": true, "requires": { "eventemitter-asyncresource": "^1.0.0", @@ -34034,232 +39587,73 @@ "dev": true }, "postcss": { - "version": "8.4.16", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.16.tgz", - "integrity": "sha512-ipHE1XBvKzm5xI7hiHCZJCSugxvsdq2mPnsq5+UF+VHCjiBvtDrlxJfMBToWaP9D5XlgNmcFGqoHmUn0EYEaRQ==", + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", "dev": true, "requires": { - "nanoid": "^3.3.4", + "nanoid": "^3.3.6", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" } }, - "postcss-attribute-case-insensitive": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-5.0.2.tgz", - "integrity": "sha512-XIidXV8fDr0kKt28vqki84fRK8VW8eTuIa4PChv2MqKuT6C9UjmSKzen6KaWhWEoYvwxFCa7n/tC1SZ3tyq4SQ==", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.10" - } - }, - "postcss-clamp": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/postcss-clamp/-/postcss-clamp-4.1.0.tgz", - "integrity": "sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-color-functional-notation": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.4.tgz", - "integrity": "sha512-2yrTAUZUab9s6CpxkxC4rVgFEVaR6/2Pipvi6qcgvnYiVqZcbDHEoBDhrXzyb7Efh2CCfHQNtcqWcIruDTIUeg==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-color-hex-alpha": { - "version": "8.0.4", - "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-8.0.4.tgz", - "integrity": "sha512-nLo2DCRC9eE4w2JmuKgVA3fGL3d01kGq752pVALF68qpGLmx2Qrk91QTKkdUqqp45T1K1XV8IhQpcu1hoAQflQ==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-color-rebeccapurple": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-7.1.1.tgz", - "integrity": "sha512-pGxkuVEInwLHgkNxUc4sdg4g3py7zUeCQ9sMfwyHAT+Ezk8a4OaaVZ8lIY5+oNqA/BXXgLyXv0+5wHP68R79hg==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-custom-media": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-8.0.2.tgz", - "integrity": "sha512-7yi25vDAoHAkbhAzX9dHx2yc6ntS4jQvejrNcC+csQJAXjj15e7VcWfMgLqBNAbOvqi5uIa9huOVwdHbf+sKqg==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-custom-properties": { - "version": "12.1.10", - "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-12.1.10.tgz", - "integrity": "sha512-U3BHdgrYhCrwTVcByFHs9EOBoqcKq4Lf3kXwbTi4hhq0qWhl/pDWq2THbv/ICX/Fl9KqeHBb8OVrTf2OaYF07A==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-custom-selectors": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-6.0.3.tgz", - "integrity": "sha512-fgVkmyiWDwmD3JbpCmB45SvvlCD6z9CG6Ie6Iere22W5aHea6oWa7EM2bpnv2Fj3I94L3VbtvX9KqwSi5aFzSg==", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.4" - } - }, - "postcss-dir-pseudo-class": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-6.0.5.tgz", - "integrity": "sha512-eqn4m70P031PF7ZQIvSgy9RSJ5uI2171O/OO/zcRNYpJbvaeKFUlar1aJ7rmgiQtbm0FSPsRewjpdS0Oew7MPA==", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.10" - } - }, - "postcss-double-position-gradients": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-3.1.2.tgz", - "integrity": "sha512-GX+FuE/uBR6eskOK+4vkXgT6pDkexLokPaz/AbJna9s5Kzp/yl488pKPjhy0obB475ovfT1Wv8ho7U/cHNaRgQ==", - "dev": true, - "requires": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-env-function": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-4.0.6.tgz", - "integrity": "sha512-kpA6FsLra+NqcFnL81TnsU+Z7orGtDTxcOhl6pwXeEq1yFPpRMkCDpHhrz8CFQDr/Wfm0jLiNQ1OsGGPjlqPwA==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-focus-visible": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-6.0.4.tgz", - "integrity": "sha512-QcKuUU/dgNsstIK6HELFRT5Y3lbrMLEOwG+A4s5cA+fx3A3y/JTq3X9LaOj3OC3ALH0XqyrgQIgey/MIZ8Wczw==", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.9" - } - }, - "postcss-focus-within": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-5.0.4.tgz", - "integrity": "sha512-vvjDN++C0mu8jz4af5d52CB184ogg/sSxAFS+oUJQq2SuCe7T5U2iIsVJtsCp2d6R4j0jr5+q3rPkBVZkXD9fQ==", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.9" - } - }, - "postcss-font-variant": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz", - "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==", - "dev": true, - "requires": {} - }, - "postcss-gap-properties": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-3.0.5.tgz", - "integrity": "sha512-IuE6gKSdoUNcvkGIqdtjtcMtZIFyXZhmFd5RUlg97iVEvp1BZKV5ngsAjCjrVy+14uhGBQl9tzmi1Qwq4kqVOg==", - "dev": true, - "requires": {} - }, - "postcss-image-set-function": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-4.0.7.tgz", - "integrity": "sha512-9T2r9rsvYzm5ndsBE8WgtrMlIT7VbtTfE7b3BQnudUqnBcBo7L758oc+o+pdj/dUV0l5wjwSdjeOH2DZtfv8qw==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-import": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.0.0.tgz", - "integrity": "sha512-Y20shPQ07RitgBGv2zvkEAu9bqvrD77C9axhj/aA1BQj4czape2MdClCExvB27EwYEJdGgKZBpKanb0t1rK2Kg==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.0.0", - "read-cache": "^1.0.0", - "resolve": "^1.1.7" - } - }, - "postcss-initial": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-4.0.1.tgz", - "integrity": "sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==", - "dev": true, - "requires": {} - }, - "postcss-lab-function": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-4.2.1.tgz", - "integrity": "sha512-xuXll4isR03CrQsmxyz92LJB2xX9n+pZJ5jE9JgcnmsCammLyKdlzrBin+25dy6wIjfhJpKBAN80gsTlCgRk2w==", - "dev": true, - "requires": { - "@csstools/postcss-progressive-custom-properties": "^1.1.0", - "postcss-value-parser": "^4.2.0" - } - }, "postcss-loader": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.0.1.tgz", - "integrity": "sha512-VRviFEyYlLjctSM93gAZtcJJ/iSkPZ79zWbN/1fSH+NisBByEiVLqpdVDrPLVSi8DX0oJo12kL/GppTBdKVXiQ==", + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.3.3.tgz", + "integrity": "sha512-YgO/yhtevGO/vJePCQmTxiaEwER94LABZN0ZMT4A0vsak9TpO+RvKRs7EmJ8peIlB9xfXCsS7M8LjqncsUZ5HA==", "dev": true, "requires": { - "cosmiconfig": "^7.0.0", - "klona": "^2.0.5", - "semver": "^7.3.7" + "cosmiconfig": "^8.2.0", + "jiti": "^1.18.2", + "semver": "^7.3.8" }, "dependencies": { - "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "cosmiconfig": { + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", + "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", "dev": true, "requires": { - "lru-cache": "^6.0.0" + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0", + "path-type": "^4.0.0" + } + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "requires": { + "argparse": "^2.0.1" } + }, + "semver": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", + "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "dev": true } } }, - "postcss-logical": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-5.0.4.tgz", - "integrity": "sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g==", - "dev": true, - "requires": {} - }, - "postcss-media-minmax": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-5.0.0.tgz", - "integrity": "sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ==", - "dev": true, - "requires": {} - }, "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, "requires": {} }, "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, "requires": { "icss-utils": "^5.0.0", @@ -34268,9 +39662,9 @@ } }, "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, "requires": { "postcss-selector-parser": "^6.0.4" @@ -34285,133 +39679,10 @@ "icss-utils": "^5.0.0" } }, - "postcss-nesting": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-10.2.0.tgz", - "integrity": "sha512-EwMkYchxiDiKUhlJGzWsD9b2zvq/r2SSubcRrgP+jujMXFzqvANLt16lJANC+5uZ6hjI7lpRmI6O8JIl+8l1KA==", - "dev": true, - "requires": { - "@csstools/selector-specificity": "^2.0.0", - "postcss-selector-parser": "^6.0.10" - } - }, - "postcss-opacity-percentage": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/postcss-opacity-percentage/-/postcss-opacity-percentage-1.1.2.tgz", - "integrity": "sha512-lyUfF7miG+yewZ8EAk9XUBIlrHyUE6fijnesuz+Mj5zrIHIEw6KcIZSOk/elVMqzLvREmXB83Zi/5QpNRYd47w==", - "dev": true - }, - "postcss-overflow-shorthand": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-3.0.4.tgz", - "integrity": "sha512-otYl/ylHK8Y9bcBnPLo3foYFLL6a6Ak+3EQBPOTR7luMYCOsiVTUk1iLvNf6tVPNGXcoL9Hoz37kpfriRIFb4A==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-page-break": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz", - "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==", - "dev": true, - "requires": {} - }, - "postcss-place": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-7.0.5.tgz", - "integrity": "sha512-wR8igaZROA6Z4pv0d+bvVrvGY4GVHihBCBQieXFY3kuSuMyOmEnnfFzHl/tQuqHZkfkIVBEbDvYcFfHmpSet9g==", - "dev": true, - "requires": { - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-preset-env": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-7.8.0.tgz", - "integrity": "sha512-leqiqLOellpLKfbHkD06E04P6d9ZQ24mat6hu4NSqun7WG0UhspHR5Myiv/510qouCjoo4+YJtNOqg5xHaFnCA==", - "dev": true, - "requires": { - "@csstools/postcss-cascade-layers": "^1.0.5", - "@csstools/postcss-color-function": "^1.1.1", - "@csstools/postcss-font-format-keywords": "^1.0.1", - "@csstools/postcss-hwb-function": "^1.0.2", - "@csstools/postcss-ic-unit": "^1.0.1", - "@csstools/postcss-is-pseudo-class": "^2.0.7", - "@csstools/postcss-nested-calc": "^1.0.0", - "@csstools/postcss-normalize-display-values": "^1.0.1", - "@csstools/postcss-oklab-function": "^1.1.1", - "@csstools/postcss-progressive-custom-properties": "^1.3.0", - "@csstools/postcss-stepped-value-functions": "^1.0.1", - "@csstools/postcss-text-decoration-shorthand": "^1.0.0", - "@csstools/postcss-trigonometric-functions": "^1.0.2", - "@csstools/postcss-unset-value": "^1.0.2", - "autoprefixer": "^10.4.8", - "browserslist": "^4.21.3", - "css-blank-pseudo": "^3.0.3", - "css-has-pseudo": "^3.0.4", - "css-prefers-color-scheme": "^6.0.3", - "cssdb": "^7.0.0", - "postcss-attribute-case-insensitive": "^5.0.2", - "postcss-clamp": "^4.1.0", - "postcss-color-functional-notation": "^4.2.4", - "postcss-color-hex-alpha": "^8.0.4", - "postcss-color-rebeccapurple": "^7.1.1", - "postcss-custom-media": "^8.0.2", - "postcss-custom-properties": "^12.1.8", - "postcss-custom-selectors": "^6.0.3", - "postcss-dir-pseudo-class": "^6.0.5", - "postcss-double-position-gradients": "^3.1.2", - "postcss-env-function": "^4.0.6", - "postcss-focus-visible": "^6.0.4", - "postcss-focus-within": "^5.0.4", - "postcss-font-variant": "^5.0.0", - "postcss-gap-properties": "^3.0.5", - "postcss-image-set-function": "^4.0.7", - "postcss-initial": "^4.0.1", - "postcss-lab-function": "^4.2.1", - "postcss-logical": "^5.0.4", - "postcss-media-minmax": "^5.0.0", - "postcss-nesting": "^10.1.10", - "postcss-opacity-percentage": "^1.1.2", - "postcss-overflow-shorthand": "^3.0.4", - "postcss-page-break": "^3.0.4", - "postcss-place": "^7.0.5", - "postcss-pseudo-class-any-link": "^7.1.6", - "postcss-replace-overflow-wrap": "^4.0.0", - "postcss-selector-not": "^6.0.1", - "postcss-value-parser": "^4.2.0" - } - }, - "postcss-pseudo-class-any-link": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.1.6.tgz", - "integrity": "sha512-9sCtZkO6f/5ML9WcTLcIyV1yz9D1rf0tWc+ulKcvV30s0iZKS/ONyETvoWsr6vnrmW+X+KmuK3gV/w5EWnT37w==", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.10" - } - }, - "postcss-replace-overflow-wrap": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz", - "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==", - "dev": true, - "requires": {} - }, - "postcss-selector-not": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-6.0.1.tgz", - "integrity": "sha512-1i9affjAe9xu/y9uqWH+tD4r6/hDaXJruk8xn2x1vzxC2U3J3LKO3zJW4CyxlNhA56pADJ/djpEwpH1RClI2rQ==", - "dev": true, - "requires": { - "postcss-selector-parser": "^6.0.10" - } - }, "postcss-selector-parser": { - "version": "6.0.10", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", - "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", + "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, "requires": { "cssesc": "^3.0.0", @@ -34454,9 +39725,9 @@ "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==" }, "proc-log": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-2.0.1.tgz", - "integrity": "sha512-Kcmo2FhfDTXdcbfDH76N7uBYHINxc/8GW7UAVuVP9I+Va3uHSerrnKV6dLooga/gh7GlgzuCCr/eoldnL1muGw==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-3.0.0.tgz", + "integrity": "sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==", "dev": true }, "process": { @@ -34629,9 +39900,9 @@ "dev": true }, "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, "requires": {} } @@ -34696,9 +39967,9 @@ "dev": true }, "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, "requires": { "bytes": "3.1.2", @@ -34707,15 +39978,6 @@ "unpipe": "1.0.0" } }, - "read-cache": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", - "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", - "dev": true, - "requires": { - "pify": "^2.3.0" - } - }, "read-installed": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/read-installed/-/read-installed-4.0.3.tgz", @@ -34752,19 +40014,33 @@ } }, "read-package-json-fast": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-2.0.3.tgz", - "integrity": "sha512-W/BKtbL+dUjTuRL2vziuYhp76s5HZ9qQhd/dKfWIZveD0O40453QNyZhC0e63lqZrAQ4jiOapVoeJ7JrszenQQ==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-3.0.2.tgz", + "integrity": "sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==", "dev": true, "requires": { - "json-parse-even-better-errors": "^2.3.0", - "npm-normalize-package-bin": "^1.0.1" + "json-parse-even-better-errors": "^3.0.0", + "npm-normalize-package-bin": "^3.0.0" + }, + "dependencies": { + "json-parse-even-better-errors": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.2.tgz", + "integrity": "sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==", + "dev": true + }, + "npm-normalize-package-bin": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz", + "integrity": "sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==", + "dev": true + } } }, "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, "requires": { "inherits": "^2.0.3", @@ -34794,9 +40070,9 @@ } }, "reflect-metadata": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", - "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==", + "version": "0.1.14", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.14.tgz", + "integrity": "sha512-ZhYeb6nRaXCfhnndflDK8qI6ZQ/YcWZCISRAWICW9XYqMUwjZM9Z0DveWX/ABN01oxSHwVxKQmxeYZSsm0jh5A==", "dev": true }, "regenerate": { @@ -34806,24 +40082,24 @@ "dev": true }, "regenerate-unicode-properties": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz", - "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==", + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", + "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", "dev": true, "requires": { "regenerate": "^1.4.2" } }, "regenerator-runtime": { - "version": "0.13.9", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", - "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==", + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", "dev": true }, "regenerator-transform": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.0.tgz", - "integrity": "sha512-LsrGtPmbYg19bcPHwdtmXwbW+TqNvtY4riE3P83foeHRroMbH6/2ddFBfab3t7kbzc7v7p4wbkIecHImqt0QNg==", + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", + "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", "dev": true, "requires": { "@babel/runtime": "^7.8.4" @@ -34852,25 +40128,19 @@ "dev": true }, "regexpu-core": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.2.1.tgz", - "integrity": "sha512-HrnlNtpvqP1Xkb28tMhBUO2EbyUHdQlsnlAhzWcwHy8WJR53UWr7/MAvqrsQKMbV4qdpv03oTMG8iIhfsPFktQ==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", + "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", "dev": true, "requires": { + "@babel/regjsgen": "^0.8.0", "regenerate": "^1.4.2", "regenerate-unicode-properties": "^10.1.0", - "regjsgen": "^0.7.1", "regjsparser": "^0.9.1", "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.0.0" + "unicode-match-property-value-ecmascript": "^2.1.0" } }, - "regjsgen": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.7.1.tgz", - "integrity": "sha512-RAt+8H2ZEzHeYWxZ3H2z6tF18zyyOnlcdaafLrm21Bguj7uZy6ULibiAFdXEtKQY4Sy7wDTwDiOazasMLc4KPA==", - "dev": true - }, "regjsparser": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", @@ -34935,11 +40205,11 @@ "dev": true }, "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.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", "requires": { - "is-core-module": "^2.9.0", + "is-core-module": "^2.11.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" } @@ -35044,7 +40314,17 @@ "robust-predicates": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.1.tgz", - "integrity": "sha512-ndEIpszUHiG4HtDsQLeIuMvRsDnn8c8rYStabochtUeCvfuvNptb5TUbVD68LRAILPX7p9nqQGh4xJgn3EHS/g==" + "integrity": "sha512-ndEIpszUHiG4HtDsQLeIuMvRsDnn8c8rYStabochtUeCvfuvNptb5TUbVD68LRAILPX7p9nqQGh4xJgn3EHS/g==", + "optional": true + }, + "rollup": { + "version": "3.29.5", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.5.tgz", + "integrity": "sha512-GVsDdsbJzzy4S/v3dqWPJ7EfvZJfCHiDqe80IyrF59LYuP+e6U1LJoUqeuqRbwAWoMNoXivMNeNAOf5E22VA1w==", + "dev": true, + "requires": { + "fsevents": "~2.3.2" + } }, "run-async": { "version": "2.4.1", @@ -35079,7 +40359,8 @@ "rw": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", - "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==" + "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==", + "optional": true }, "rxjs": { "version": "6.6.7", @@ -35115,10 +40396,15 @@ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, + "safevalues": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/safevalues/-/safevalues-0.3.4.tgz", + "integrity": "sha512-LRneZZRXNgjzwG4bDQdOTSbze3fHm1EAKN/8bePxnlEZiBmkYEDggaHbuvHI9/hoqHbGfsEA7tWS9GhYHZBBsw==" + }, "sass": { - "version": "1.54.4", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.54.4.tgz", - "integrity": "sha512-3tmF16yvnBwtlPrNBHw/H907j8MlOX8aTBnlNX1yrKx24RKcJGPyLhFUwkoKBKesR3unP93/2z14Ll8NicwQUA==", + "version": "1.64.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.64.1.tgz", + "integrity": "sha512-16rRACSOFEE8VN7SCgBu1MpYCyN7urj9At898tyzdXFhC+a+yOX5dXwAR7L8/IdPJ1NB8OYoXmD55DM30B2kEQ==", "dev": true, "requires": { "chokidar": ">=3.0.0 <4.0.0", @@ -35127,20 +40413,29 @@ } }, "sass-loader": { - "version": "13.0.2", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-13.0.2.tgz", - "integrity": "sha512-BbiqbVmbfJaWVeOOAu2o7DhYWtcNmTfvroVgFXa6k2hHheMxNAeDHLNoDy/Q5aoaVlz0LH+MbMktKwm9vN/j8Q==", + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-13.3.2.tgz", + "integrity": "sha512-CQbKl57kdEv+KDLquhC+gE3pXt74LEAzm+tzywcA0/aHZuub8wTErbjAoNI57rPUWRYRNC5WUnNl8eGJNbDdwg==", "dev": true, "requires": { - "klona": "^2.0.4", "neo-async": "^2.6.2" } }, "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.3.0.tgz", + "integrity": "sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==", + "dev": true, + "optional": true + }, + "saxes": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "dev": true, + "requires": { + "xmlchars": "^2.2.0" + } }, "schema-utils": { "version": "2.7.1", @@ -35244,7 +40539,8 @@ "select": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/select/-/select-1.1.2.tgz", - "integrity": "sha512-OwpTSOfy6xSs1+pwcNrv0RBMOzI39Lp3qQKUTPVVPRjCdNa5JH/oPRiqsesIskK8TVgmRiHwO4KXlV2Li9dANA==" + "integrity": "sha512-OwpTSOfy6xSs1+pwcNrv0RBMOzI39Lp3qQKUTPVVPRjCdNa5JH/oPRiqsesIskK8TVgmRiHwO4KXlV2Li9dANA==", + "optional": true }, "select-hose": { "version": "2.0.0", @@ -35253,11 +40549,12 @@ "dev": true }, "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, "requires": { + "@types/node-forge": "^1.3.0", "node-forge": "^1" } }, @@ -35292,9 +40589,9 @@ } }, "send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", "dev": true, "requires": { "debug": "2.6.9", @@ -35329,12 +40626,6 @@ } } }, - "depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "dev": true - }, "mime": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", @@ -35365,9 +40656,9 @@ } }, "serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", "dev": true, "requires": { "randombytes": "^2.1.0" @@ -35397,6 +40688,12 @@ "ms": "2.0.0" } }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "dev": true + }, "http-errors": { "version": "1.6.3", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", @@ -35430,15 +40727,23 @@ } }, "serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", "dev": true, "requires": { - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.18.0" + "send": "0.19.0" + }, + "dependencies": { + "encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "dev": true + } } }, "set-blocking": { @@ -35447,6 +40752,20 @@ "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", "dev": true }, + "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, + "requires": { + "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" + } + }, "set-value": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", @@ -35522,15 +40841,22 @@ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true }, + "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 + }, "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, "requires": { - "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" } }, "signal-exit": { @@ -35539,6 +40865,87 @@ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true }, + "sigstore": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-1.9.0.tgz", + "integrity": "sha512-0Zjz0oe37d08VeOtBIuB6cRriqXse2e8w+7yIy2XSXjshRKxbc2KkhXjL229jXSxEm7UbcjS76wcJDGQddVI9A==", + "dev": true, + "requires": { + "@sigstore/bundle": "^1.1.0", + "@sigstore/protobuf-specs": "^0.2.0", + "@sigstore/sign": "^1.0.0", + "@sigstore/tuf": "^1.0.3", + "make-fetch-happen": "^11.0.1" + }, + "dependencies": { + "@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "dev": true + }, + "http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, + "requires": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + } + }, + "lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true + }, + "make-fetch-happen": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", + "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", + "dev": true, + "requires": { + "agentkeepalive": "^4.2.1", + "cacache": "^17.0.0", + "http-cache-semantics": "^4.1.1", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.7.1", + "minipass": "^5.0.0", + "minipass-fetch": "^3.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^7.0.0", + "ssri": "^10.0.0" + } + }, + "minipass-fetch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.5.tgz", + "integrity": "sha512-2N8elDQAtSnFV0Dk7gt15KHsS0Fyz6CbYZ360h0WTYV1Ty46li3rAXVOQj1THMNLdmrD9Vt5pBPtWtVkpwGBqg==", + "dev": true, + "requires": { + "encoding": "^0.1.13", + "minipass": "^7.0.3", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "dependencies": { + "minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true + } + } + } + } + }, "slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -35756,17 +41163,18 @@ } }, "socket.io": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.6.1.tgz", - "integrity": "sha512-KMcaAi4l/8+xEjkRICl6ak8ySoxsYG+gG6/XfRCPJPQ/haCRIJBTL4wIl8YCsmtaBovcAXGLOShyVWQ/FG8GZA==", + "version": "4.7.5", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.7.5.tgz", + "integrity": "sha512-DmeAkF6cwM9jSfmp6Dr/5/mfMwb5Z5qRrSXLpo3Fq5SqyU8CMF15jIN4ZhfSwu35ksM1qmHZDQ/DK5XTccSTvA==", "dev": true, "requires": { "accepts": "~1.3.4", "base64id": "~2.0.0", + "cors": "~2.8.5", "debug": "~4.3.2", - "engine.io": "~6.4.1", + "engine.io": "~6.5.2", "socket.io-adapter": "~2.5.2", - "socket.io-parser": "~4.2.1" + "socket.io-parser": "~4.2.4" } }, "socket.io-adapter": { @@ -35779,9 +41187,9 @@ } }, "socket.io-parser": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.3.tgz", - "integrity": "sha512-JMafRntWVO2DCJimKsRTh/wnqVvO4hrfwOqtO7f+uzwsQMuxO6VwImtYxaQ+ieoyshWOTJyV0fA21lccEXRPpQ==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", + "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", "dev": true, "requires": { "@socket.io/component-emitter": "~3.1.0", @@ -35800,21 +41208,13 @@ } }, "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, "requires": { - "ip": "^2.0.0", + "ip-address": "^9.0.5", "smart-buffer": "^4.2.0" - }, - "dependencies": { - "ip": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", - "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==", - "dev": true - } } }, "socks-proxy-agent": { @@ -35846,9 +41246,9 @@ "dev": true }, "source-map-loader": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-4.0.0.tgz", - "integrity": "sha512-i3KVgM3+QPAHNbGavK+VBq03YoJl24m9JWNbLgsjTj8aJzXG9M61bantBTNBt7CNwY2FYf+RJRYJ3pzalKjIrw==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-4.0.1.tgz", + "integrity": "sha512-oqXpzDIByKONVY8g1NUPOTQhe0UTU5bWUl32GSkqK2LjJj0HmwTMVKxcUip0RgAYhY1mqgOxjbQM48a0mmeNfA==", "dev": true, "requires": { "abab": "^2.0.6", @@ -35996,7 +41396,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "dev": true, "requires": { "extend-shallow": "^3.0.0" } @@ -36008,9 +41407,9 @@ "dev": true }, "sshpk": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", - "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz", + "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==", "dev": true, "requires": { "asn1": "~0.2.3", @@ -36025,12 +41424,20 @@ } }, "ssri": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz", - "integrity": "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==", + "version": "10.0.6", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.6.tgz", + "integrity": "sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ==", "dev": true, "requires": { - "minipass": "^3.1.1" + "minipass": "^7.0.3" + }, + "dependencies": { + "minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true + } } }, "static-extend": { @@ -36264,6 +41671,17 @@ "strip-ansi": "^6.0.1" } }, + "string-width-cjs": { + "version": "npm:string-width@4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, "stringify-object": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", @@ -36284,6 +41702,15 @@ "ansi-regex": "^5.0.1" } }, + "strip-ansi-cjs": { + "version": "npm:strip-ansi@6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + }, "strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", @@ -36302,34 +41729,22 @@ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true }, - "stylis": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.1.3.tgz", - "integrity": "sha512-GP6WDNWf+o403jrEp9c5jibKavrtLW+/qYGhFxFrG8maXhwTBI7gLLhiBb0o7uFccWN+EOS9aMO6cGHWAO07OA==" - }, - "stylus": { - "version": "0.59.0", - "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.59.0.tgz", - "integrity": "sha512-lQ9w/XIOH5ZHVNuNbWW8D822r+/wBSO/d6XvtyHLF7LW4KaCIDeVbvn5DF8fGCJAUCwVhVi/h6J0NUcnylUEjg==", + "strong-log-transformer": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/strong-log-transformer/-/strong-log-transformer-2.1.0.tgz", + "integrity": "sha512-B3Hgul+z0L9a236FAUC9iZsL+nVHgoCJnqCbN588DjYxvGXaXaaFbfmQ/JhvKjZwsOukuR72XbHv71Qkug0HxA==", "dev": true, "requires": { - "@adobe/css-tools": "^4.0.1", - "debug": "^4.3.2", - "glob": "^7.1.6", - "sax": "~1.2.4", - "source-map": "^0.7.3" + "duplexer": "^0.1.1", + "minimist": "^1.2.0", + "through": "^2.3.4" } }, - "stylus-loader": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/stylus-loader/-/stylus-loader-7.0.0.tgz", - "integrity": "sha512-WTbtLrNfOfLgzTaR9Lj/BPhQroKk/LC1hfTXSUbrxmxgfUo3Y3LpmKRVA2R1XbjvTAvOfaian9vOyfv1z99E+A==", - "dev": true, - "requires": { - "fast-glob": "^3.2.11", - "klona": "^2.0.5", - "normalize-path": "^3.0.0" - } + "stylis": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.1.3.tgz", + "integrity": "sha512-GP6WDNWf+o403jrEp9c5jibKavrtLW+/qYGhFxFrG8maXhwTBI7gLLhiBb0o7uFccWN+EOS9aMO6cGHWAO07OA==", + "optional": true }, "supports-color": { "version": "5.5.0", @@ -36351,6 +41766,12 @@ "integrity": "sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==", "dev": true }, + "symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true + }, "tapable": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", @@ -36358,17 +41779,39 @@ "dev": true }, "tar": { - "version": "6.1.11", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", - "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", + "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, "requires": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", - "minipass": "^3.0.0", + "minipass": "^5.0.0", "minizlib": "^2.1.1", "mkdirp": "^1.0.3", "yallist": "^4.0.0" + }, + "dependencies": { + "fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + } + } + } } }, "tar-fs": { @@ -36405,13 +41848,13 @@ } }, "terser": { - "version": "5.14.2", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.14.2.tgz", - "integrity": "sha512-oL0rGeM/WFQCUd0y2QrWxYnq7tfSuKBiqTjRPWrRgB46WD/kiwHwF8T23z78H6Q6kGCuuHcPB+KULHRdxvVGQA==", + "version": "5.19.2", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.19.2.tgz", + "integrity": "sha512-qC5+dmecKJA4cpYxRa5aVkKehYsQKc+AHeKl0Oe62aYjBL8ZA33tTljktDHJSaxxMnbI5ZYw+o/S2DxxLu8OfA==", "dev": true, "requires": { - "@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" }, @@ -36425,28 +41868,46 @@ } }, "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, "requires": { - "@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" }, "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, "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, "requires": { "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", "ajv-keywords": "^3.5.2" } + }, + "terser": { + "version": "5.31.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.31.1.tgz", + "integrity": "sha512-37upzU1+viGvuFtBo9NPufCb9dwM0+l9hMxYyWfBA+fbwrPqNJAhbZ6W47bBFnZHKHTUBnMvi87434qq+qnxOg==", + "dev": true, + "requires": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + } } } }, @@ -36529,7 +41990,8 @@ "tiny-emitter": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz", - "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==" + "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==", + "optional": true }, "tmp": { "version": "0.2.1", @@ -36907,9 +42369,9 @@ } }, "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==" }, "tsutils": { "version": "3.21.0", @@ -36934,10 +42396,89 @@ "integrity": "sha512-JVa5ijo+j/sOoHGjw0sxw734b1LhBkQ3bvUGNdxnVXDCX81Yx7TFgnZygxrIIWn23hbfTaMYLwRmAxFyDuFmIw==", "dev": true }, + "tuf-js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-1.1.7.tgz", + "integrity": "sha512-i3P9Kgw3ytjELUfpuKVDNBJvk4u5bXL6gskv572mcevPbSKCV3zt3djhmlEQ65yERjIbOSncy7U4cQJaB1CBCg==", + "dev": true, + "requires": { + "@tufjs/models": "1.0.4", + "debug": "^4.3.4", + "make-fetch-happen": "^11.1.1" + }, + "dependencies": { + "@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "dev": true + }, + "http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, + "requires": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + } + }, + "lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true + }, + "make-fetch-happen": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", + "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", + "dev": true, + "requires": { + "agentkeepalive": "^4.2.1", + "cacache": "^17.0.0", + "http-cache-semantics": "^4.1.1", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.7.1", + "minipass": "^5.0.0", + "minipass-fetch": "^3.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^7.0.0", + "ssri": "^10.0.0" + } + }, + "minipass-fetch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.5.tgz", + "integrity": "sha512-2N8elDQAtSnFV0Dk7gt15KHsS0Fyz6CbYZ360h0WTYV1Ty46li3rAXVOQj1THMNLdmrD9Vt5pBPtWtVkpwGBqg==", + "dev": true, + "requires": { + "encoding": "^0.1.13", + "minipass": "^7.0.3", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "dependencies": { + "minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true + } + } + } + } + }, "tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", "dev": true, "requires": { "safe-buffer": "^5.0.1" @@ -36946,7 +42487,7 @@ "tweetnacl": { "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", "dev": true }, "type-check": { @@ -36986,9 +42527,9 @@ "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" }, "typescript": { - "version": "4.8.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz", - "integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==", + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", "dev": true }, "ua-parser-js": { @@ -37007,6 +42548,12 @@ "through": "^2.3.8" } }, + "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 + }, "unicode-canonical-property-names-ecmascript": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", @@ -37024,9 +42571,9 @@ } }, "unicode-match-property-value-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz", - "integrity": "sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", + "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", "dev": true }, "unicode-property-aliases-ecmascript": { @@ -37137,13 +42684,13 @@ "optional": true }, "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, "requires": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" + "escalade": "^3.1.2", + "picocolors": "^1.0.1" } }, "uri-js": { @@ -37280,7 +42827,7 @@ "verror": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", "dev": true, "requires": { "assert-plus": "^1.0.0", @@ -37288,6 +42835,18 @@ "extsprintf": "^1.2.0" } }, + "vite": { + "version": "4.5.5", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.5.tgz", + "integrity": "sha512-ifW3Lb2sMdX+WU91s3R0FyQlAyLxOzCSCP37ujw0+r5POeHPwe6udWVIElKQq8gk3t7b8rkmvqC6IHBpCff4GQ==", + "dev": true, + "requires": { + "esbuild": "^0.18.10", + "fsevents": "~2.3.2", + "postcss": "^8.4.27", + "rollup": "^3.27.1" + } + }, "vm-browserify": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", @@ -37300,10 +42859,28 @@ "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=", "dev": true }, + "w3c-hr-time": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + "dev": true, + "requires": { + "browser-process-hrtime": "^1.0.0" + } + }, + "w3c-xmlserializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", + "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", + "dev": true, + "requires": { + "xml-name-validator": "^3.0.0" + } + }, "watchpack": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", - "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", + "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==", "dev": true, "requires": { "glob-to-regexp": "^0.4.1", @@ -37598,41 +43175,40 @@ "dev": true }, "webpack": { - "version": "5.74.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.74.0.tgz", - "integrity": "sha512-A2InDwnhhGN4LYctJj6M1JEaGL7Luj6LOmyBHjcI8529cm5p6VXiTIW2sn6ffvEAKmveLzvu4jrihwXtPojlAA==", + "version": "5.94.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.94.0.tgz", + "integrity": "sha512-KcsGn50VT+06JH/iunZJedYGUJS5FGjow8wb9c0v5n1Om8O1g4L6LjtfxwlXIATopoQu+vOXXa7gYisWxCoPyg==", "dev": true, "requires": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^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-attributes": "^1.9.5", + "browserslist": "^4.21.10", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.10.0", - "es-module-lexer": "^0.9.0", + "enhanced-resolve": "^5.17.1", + "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", + "graceful-fs": "^4.2.11", "json-parse-even-better-errors": "^2.3.1", "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", - "schema-utils": "^3.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" }, "dependencies": { "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, "requires": { "@types/json-schema": "^7.0.8", @@ -37643,28 +43219,28 @@ } }, "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": "6.1.2", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-6.1.2.tgz", + "integrity": "sha512-Wu+EHmX326YPYUpQLKmKbTyZZJIB8/n6R09pTmB03kJmnMsVPTo9COzHZFr01txwaCAuZvfBJE4ZCHRcKs5JaQ==", "dev": true, "requires": { "colorette": "^2.0.10", - "memfs": "^3.4.3", + "memfs": "^3.4.12", "mime-types": "^2.1.31", "range-parser": "^1.2.1", "schema-utils": "^4.0.0" }, "dependencies": { "ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.16.0.tgz", + "integrity": "sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw==", "dev": true, "requires": { - "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" } }, "ajv-keywords": { @@ -37677,9 +43253,9 @@ } }, "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 }, "json-schema-traverse": { @@ -37689,23 +43265,23 @@ "dev": true }, "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, "requires": { "@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" } } } }, "webpack-dev-server": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.11.0.tgz", - "integrity": "sha512-L5S4Q2zT57SK7tazgzjMiSMBdsw+rGYIX27MgPgx7LDhWO0lViPrHKoLS7jo5In06PWYAhlYu3PbyoC6yAThbw==", + "version": "4.15.1", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.1.tgz", + "integrity": "sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA==", "dev": true, "requires": { "@types/bonjour": "^3.5.9", @@ -37714,7 +43290,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", @@ -37727,28 +43303,29 @@ "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", "schema-utils": "^4.0.0", - "selfsigned": "^2.0.1", + "selfsigned": "^2.1.1", "serve-index": "^1.9.1", "sockjs": "^0.3.24", "spdy": "^4.0.2", "webpack-dev-middleware": "^5.3.1", - "ws": "^8.4.2" + "ws": "^8.13.0" }, "dependencies": { "ajv": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", - "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "dev": true, "requires": { - "fast-deep-equal": "^3.1.1", + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "require-from-string": "^2.0.2" } }, "ajv-keywords": { @@ -37761,9 +43338,9 @@ } }, "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 }, "json-schema-traverse": { @@ -37773,23 +43350,43 @@ "dev": true }, "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, "requires": { "@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" } + }, + "webpack-dev-middleware": { + "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, + "requires": { + "colorette": "^2.0.10", + "memfs": "^3.4.3", + "mime-types": "^2.1.31", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + } + }, + "ws": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "dev": true, + "requires": {} } } }, "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.9.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.9.0.tgz", + "integrity": "sha512-6NbRQw4+Sy50vYNTw7EyOn41OZItPiXB8GNv3INSoe3PSFaHJEz3SHTrYVaRm2LilNGnFUzh0FAwqPEmU/CwDg==", "dev": true, "requires": { "clone-deep": "^4.0.1", @@ -37828,6 +43425,21 @@ "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", "dev": true }, + "whatwg-encoding": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "dev": true, + "requires": { + "iconv-lite": "0.4.24" + } + }, + "whatwg-mimetype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", + "dev": true + }, "whatwg-url": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", @@ -37857,9 +43469,9 @@ } }, "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 }, "word-wrap": { @@ -37920,6 +43532,43 @@ } } }, + "wrap-ansi-cjs": { + "version": "npm:wrap-ansi@7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "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, + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + } + } + }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -37932,6 +43581,18 @@ "dev": true, "requires": {} }, + "xml-name-validator": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", + "dev": true + }, + "xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true + }, "xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", @@ -37956,28 +43617,39 @@ "dev": true }, "yargs": { - "version": "17.5.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.5.1.tgz", - "integrity": "sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA==", + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dev": true, "requires": { - "cliui": "^7.0.2", + "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", - "yargs-parser": "^21.0.0" + "yargs-parser": "^21.1.1" }, "dependencies": { - "yargs-parser": { - "version": "21.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.0.tgz", - "integrity": "sha512-z9kApYUOCwoeZ78rfRYYWdiU/iNL6mwwYlkkZfJoyMR1xps+NEBX5X7XmRpxkZHhXJ6+Ey00IwKxBBSW9FIjyA==", - "dev": true + "cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + } } } }, + "yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true + }, "yauzl": { "version": "2.10.0", "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", @@ -37994,12 +43666,18 @@ "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", "dev": true }, + "yocto-queue": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.1.1.tgz", + "integrity": "sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==", + "dev": true + }, "zone.js": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.11.4.tgz", - "integrity": "sha512-DDh2Ab+A/B+9mJyajPjHFPWfYU1H+pdun4wnnk0OcQTNjem1XQSZ2CDW+rfZEUDjv5M19SBqAkjZi0x5wuB5Qw==", + "version": "0.13.3", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.13.3.tgz", + "integrity": "sha512-MKPbmZie6fASC/ps4dkmIhaT5eonHkEt6eAy80K42tAm0G2W+AahLJjbfi6X9NPdciOE9GRFTTM8u2IiF6O3ww==", "requires": { - "tslib": "^2.0.0" + "tslib": "^2.3.0" } } } diff --git a/package.json b/package.json index 141ed00cfc..0e864d6833 100644 --- a/package.json +++ b/package.json @@ -1,12 +1,11 @@ { "name": "dockstore-ui2", - "version": "2.10.0", + "version": "2.13.0", "license": "Apache License 2.0", "config": { - "webservice_version": "1.15.2", - "use_circle": false, - "circle_ci_source": "https://app.circleci.com/pipelines/github/dockstore/dockstore/10707/workflows/cbcf24c8-061a-4003-9d46-9de3b953b25f/jobs/39503/artifacts", - "circle_build_id": "39503" + "webservice_version_prefix": "1.16.0", + "webservice_version": "1.16.0", + "use_snapshot": false }, "scripts": { "ng": "npx ng", @@ -33,7 +32,7 @@ "test-staging-no-auth": "npx cypress run -c baseUrl=https://staging.dockstore.org -s \"cypress/e2e/smokeTests/stagingOnly/monitor.ts,cypress/e2e/smokeTests/stagingOnly/basic-enduser.ts,cypress/e2e/smokeTests/stagingOnly/search.ts,cypress/e2e/smokeTests/sharedTests/monitor.ts,cypress/e2e/smokeTests/sharedTests/basic-enduser.ts,cypress/e2e/smokeTests/sharedTests/search.ts,cypress/e2e/smokeTests/sharedTests/secheaders.ts\"", "test-prod-no-auth": "npx cypress run -c baseUrl=https://dockstore.org -s \"cypress/e2e/smokeTests/prodOnly/monitor.ts,cypress/e2e/smokeTests/prodOnly/basic-enduser.ts,cypress/e2e/smokeTests/prodOnly/search.ts,cypress/e2e/smokeTests/prodOnly/basic-enduser-prod-only.ts,cypress/e2e/smokeTests/sharedTests/monitor.ts,cypress/e2e/smokeTests/sharedTests/basic-enduser.ts,cypress/e2e/smokeTests/sharedTests/search.ts,cypress/e2e/smokeTests/sharedTests/secheaders.ts\"", "test-local-auth": "npx cypress run --headed -c baseUrl=http://localhost:4200 -s \"cypress/e2e/smokeTests/sharedTests/auth-tests.ts\"", - "test-qa-auth": "npx cypress run --record --reporter junit -c baseUrl=https://qa.dockstore.org -s \"cypress/e2e/smokeTests/qaOnly/auth-tests.ts,cypress/e2e/smokeTests/sharedTests/auth-tests.ts\"", + "test-qa-auth": "npx cypress run -c baseUrl=https://qa.dockstore.org -s \"cypress/e2e/smokeTests/qaOnly/auth-tests.ts,cypress/e2e/smokeTests/sharedTests/auth-tests.ts\"", "test-staging-auth": "npx cypress run -c baseUrl=https://staging.dockstore.org -s \"cypress/e2e/smokeTests/stagingOnly/auth-tests.ts,cypress/e2e/smokeTests/sharedTests/auth-tests.ts\"", "test-prod-auth": "npx cypress run -c baseUrl=https://dockstore.org -s \"cypress/e2e/smokeTests/prodOnly/auth-tests.ts,cypress/e2e/smokeTests/sharedTests/auth-tests.ts\"", "prepare": "husky install", @@ -42,58 +41,58 @@ }, "private": true, "dependencies": { - "@angular/animations": "^14.2.7", - "@angular/cdk": "^14.2.5", - "@angular/common": "^14.2.7", - "@angular/compiler": "^14.2.7", - "@angular/core": "^14.2.7", - "@angular/flex-layout": "^14.0.0-beta.41", - "@angular/forms": "^14.2.7", - "@angular/material": "^14.2.5", - "@angular/platform-browser": "^14.2.7", - "@angular/platform-browser-dynamic": "^14.2.7", - "@angular/router": "^14.2.7", + "@angular/animations": "^16.2.12", + "@angular/cdk": "^16.2.14", + "@angular/common": "^16.2.12", + "@angular/compiler": "^16.2.12", + "@angular/core": "^16.2.12", + "@angular/forms": "^16.2.12", + "@angular/material": "^16.2.14", + "@angular/platform-browser": "^16.2.12", + "@angular/platform-browser-dynamic": "^16.2.12", + "@angular/router": "^16.2.12", "@datorama/akita": "^7.0.0", - "@fortawesome/angular-fontawesome": "^0.11.1", + "@fortawesome/angular-fontawesome": "^0.13.0", "@fortawesome/fontawesome-svg-core": "^6.2.0", "@fortawesome/free-brands-svg-icons": "^6.0.0", "@fortawesome/free-solid-svg-icons": "^6.0.0", + "@ngbracket/ngx-layout": "^15.1.3", "@ngneat/forms-manager": "^2.3.0", "academicons": "^1.8.6", "ace-builds": "^1.4.12", - "angular-tag-cloud-module": "^14.0.0", + "angular-tag-cloud-module": "^16.0.0", "bodybuilder": "^2.4.0", "bootstrap": "^3.4.1", "cytoscape": "^3.19.0", "cytoscape-dagre": "^2.3.2", "cytoscape-popper": "^2.0.0", - "dompurify": "^2.2.9", + "dompurify": "^2.5.4", "file-saver": "^2.0.5", "ini": "^4.1.1", "jquery": "^3.6.0", "material-design-icons-iconfont": "^6.1.0", "mathjax": "^3.2.2", - "ng2-ui-auth": "^10.0.1", - "ngx-markdown": "^14.0.1", - "ngx-mat-select-search": "^5.0.0", + "ngx-markdown": "^16.0.0", + "ngx-mat-select-search": "^6.0.0", "ngx-sharebuttons": "^8.0.5", "prismjs": "^1.29.0", "rxjs": "^6.6.7", + "split-string": "^3.1.0", "ts-md5": "^1.2.8", "tslib": "^2.3.0", "uuid": "^8.3.2", - "zone.js": "~0.11.4" + "zone.js": "~0.13.3" }, "devDependencies": { - "@angular-devkit/build-angular": "^14.2.6", - "@angular-eslint/builder": "^14.0.1", - "@angular-eslint/eslint-plugin": "^14.0.1", - "@angular-eslint/eslint-plugin-template": "^14.0.1", - "@angular-eslint/schematics": "14.0.1", - "@angular-eslint/template-parser": "^14.0.1", - "@angular/cli": "^14.2.6", - "@angular/compiler-cli": "^14.2.7", - "@angular/language-service": "^14.2.7", + "@angular-devkit/build-angular": "^16.2.16", + "@angular-eslint/builder": "^16.3.1", + "@angular-eslint/eslint-plugin": "^16.3.1", + "@angular-eslint/eslint-plugin-template": "^16.3.1", + "@angular-eslint/schematics": "^16.3.1", + "@angular-eslint/template-parser": "^15.2.1", + "@angular/cli": "^16.2.14", + "@angular/compiler-cli": "^16.2.12", + "@angular/language-service": "^16.2.12", "@cypress/webpack-batteries-included-preprocessor": "^2.4.1", "@cypress/webpack-preprocessor": "^5.17.1", "@datorama/akita-ngdevtools": "^7.0.0", @@ -101,10 +100,10 @@ "@types/elasticsearch": "^5.0.37", "@types/jasmine": "^3.7.7", "@types/jquery": "^3.5.5", - "@types/node": "^15.12.2", + "@types/node": "^18.19.39", "@typescript-eslint/eslint-plugin": "5.3.0", "@typescript-eslint/parser": "5.3.0", - "cypress": "^12.3.0", + "cypress": "^13.7.2", "eslint": "^8.2.0", "husky": "^7.0.0", "jasmine-core": "^3.7.1", @@ -118,15 +117,14 @@ "pa11y-ci": "^3.0.1", "prettier": "^2.3.1", "ts-node": "^10.9.1", - "typescript": "^4.8.4" + "typescript": "^4.9.5" }, "overrides": { - "ng2-ui-auth": { - "@angular/common": "~14.2.7", - "@angular/core": "~14.2.7" - }, "@schematics/update": { "ini": "^1.3.8" + }, + "ngx-mat-select-search": { + "@angular/material": "^16.2.14" } } } diff --git a/scripts/generate-openapi-script.sh b/scripts/generate-openapi-script.sh index 029a0d9be3..14cb4df892 100755 --- a/scripts/generate-openapi-script.sh +++ b/scripts/generate-openapi-script.sh @@ -14,12 +14,20 @@ BASE_PATH="https://raw.githubusercontent.com/dockstore/dockstore/$npm_package_co wget --no-verbose https://repo.maven.apache.org/maven2/org/openapitools/openapi-generator-cli/${GENERATOR_VERSION}/openapi-generator-cli-${GENERATOR_VERSION}.jar -O openapi-generator-cli.jar rm -Rf src/app/shared/openapi -if [ "$npm_package_config_use_circle" = true ] +if [ "$npm_package_config_use_snapshot" = true ] then - OPENAPI_PATH=$(./scripts/get-circleci-artifact-url.sh "$npm_package_config_circle_build_id" openapi.yaml) + # note that -DremoteRepositories=github-packages:https://maven.pkg.github.com/dockstore/dockstore also works with the right credentials, loaded as -s .github/snapshot-mvn-settings.xml + mvn dependency:get -DremoteRepositories="https://artifacts.oicr.on.ca/artifactory/collab-snapshot" -Dartifact="io.dockstore:dockstore-webservice:${npm_package_config_webservice_version_prefix}-SNAPSHOT:openapi.yaml:dist" -Dtransitive=false --batch-mode -ntp + mvn dependency:copy -Dartifact="io.dockstore:dockstore-webservice:${npm_package_config_webservice_version_prefix}-SNAPSHOT:openapi.yaml:dist" -DoutputDirectory=. -Dmdep.useBaseVersion=true -batch-mode -ntp + OPENAPI_PATH=dockstore-webservice-${npm_package_config_webservice_version_prefix}-SNAPSHOT-dist.openapi.yaml else OPENAPI_PATH="${BASE_PATH}""/dockstore-webservice/src/main/resources/openapi3/openapi.yaml" fi java -jar openapi-generator-cli.jar generate -i "${OPENAPI_PATH}" -g typescript-angular -o src/app/shared/openapi -c swagger-config.json --skip-validate-spec + +for file in src/app/shared/openapi/*.ts src/app/shared/openapi/**/*.ts; do + echo "//@ts-nocheck" | cat - $file >> tmpFile && mv tmpFile $file +done + rm openapi-generator-cli.jar diff --git a/scripts/get-circleci-artifact-url.sh b/scripts/get-circleci-artifact-url.sh deleted file mode 100755 index 5caebe2186..0000000000 --- a/scripts/get-circleci-artifact-url.sh +++ /dev/null @@ -1,19 +0,0 @@ -#!/bin/bash -set -o errexit -set -o pipefail -set -o nounset -set -o xtrace - -if [[ -z ${1} || -z ${2} ]]; then - echo "Usage: $0 " - exit 1 -fi - -# This script gets the URL for a CircleCI artifact. -# It looks at all of the artifacts for a CircleCI build with and returns the URL of the artifact with a path that contains . - -CIRCLECI_BUILD_ID=${1} -ARTIFACT_NAME=${2} -ARTIFACT_URL=$(curl "https://circleci.com/api/v2/project/gh/dockstore/dockstore/${CIRCLECI_BUILD_ID}/artifacts" -H "Accept: application/json" | jq -r --arg ARTIFACT_NAME "${ARTIFACT_NAME}" '[.items[] | select( .path | contains($ARTIFACT_NAME) ) | .url] | first ') - -echo "${ARTIFACT_URL}" diff --git a/scripts/run-pa11y-ci.sh b/scripts/run-pa11y-ci.sh index 47e303e2a0..f0535ca47d 100755 --- a/scripts/run-pa11y-ci.sh +++ b/scripts/run-pa11y-ci.sh @@ -21,7 +21,7 @@ usage() { echo "-H, Display help command" echo "-B, Do all commands on base branch (if this option is not given all commands are done on current branch)" echo "-R, Runs pa11y-ci on branch (requires webservice to be running) and outputs results in a form that can be analysed" - echo "-A, Determines if current branch has more accessibility issues then base branch, requires the results from option -R to be available" + echo "-A, Determines if current branch has more accessibility issues than base branch, requires the results from option -R to be available" } # Variables for determining which command to run @@ -104,7 +104,7 @@ then # If the number of accessibility errors is equal, then check that if they are the same set of errors. if [ "$ACCESSIBILITY_ERRORS_CURRENT_BRANCH" -eq "$ACCESSIBILITY_ERRORS_BASE_BRANCH" ]; then - echo "The number of accessibility erorrs in this PR and the base branch are the same" + echo "The number of accessibility errors in this PR and the base branch are the same" exit 0 fi diff --git a/scripts/run-webservice-script.sh b/scripts/run-webservice-script.sh index 6f7af7423f..bc9b7cceb0 100755 --- a/scripts/run-webservice-script.sh +++ b/scripts/run-webservice-script.sh @@ -3,17 +3,21 @@ set -o errexit set -o pipefail set -o nounset set -o xtrace -if [ "$npm_package_config_use_circle" = true ] +if [ "$npm_package_config_use_snapshot" = true ] then - JAR_PATH=$(./scripts/get-circleci-artifact-url.sh "$npm_package_config_circle_build_id" dockstore-webservice) + # note that -DremoteRepositories=github-packages:https://maven.pkg.github.com/dockstore/dockstore also works with the right credentials, loaded as -s .github/snapshot-mvn-settings.xml + mvn dependency:get -DremoteRepositories="https://artifacts.oicr.on.ca/artifactory/collab-snapshot" -Dartifact="io.dockstore:dockstore-webservice:${npm_package_config_webservice_version_prefix}-SNAPSHOT" -Dtransitive=false --batch-mode -ntp + mvn dependency:copy -Dartifact="io.dockstore:dockstore-webservice:${npm_package_config_webservice_version_prefix}-SNAPSHOT" -DoutputDirectory=. -Dmdep.useBaseVersion=true -batch-mode -ntp + JAR_PATH=dockstore-webservice-${npm_package_config_webservice_version_prefix}-SNAPSHOT.jar + mv "$JAR_PATH" dockstore-webservice.jar else JAR_PATH="https://artifacts.oicr.on.ca/artifactory/collab-release/io/dockstore/dockstore-webservice/${npm_package_config_webservice_version}/dockstore-webservice-${npm_package_config_webservice_version}.jar" + wget -O dockstore-webservice.jar --no-verbose --tries=10 ${JAR_PATH} fi -wget -O dockstore-webservice.jar --no-verbose --tries=10 ${JAR_PATH} chmod u+x dockstore-webservice.jar psql -h localhost -c "create user dockstore with password 'dockstore' createdb;" -U postgres psql -h localhost -c "ALTER USER dockstore WITH superuser;" -U postgres psql -h localhost -c 'create database webservice_test with owner = dockstore;' -U postgres psql -h localhost -f test/${DB_DUMP:-db_dump.sql} webservice_test -U postgres -java -jar dockstore-webservice.jar db migrate -i 1.5.0,1.6.0,1.7.0,add_service_1.7.0,1.8.0,1.9.0,1.10.0,alter_test_user_1.10.2,1.11.0,1.12.0,1.13.0,1.14.0,add_notebook_1.14.0,1.15.0 test/web.yml +java -jar dockstore-webservice.jar db migrate -i 1.5.0,1.6.0,1.7.0,add_service_1.7.0,1.8.0,1.9.0,1.10.0,alter_test_user_1.10.2,1.11.0,1.12.0,1.13.0,1.14.0,add_notebook_1.14.0,1.15.0,1.16.0 test/web.yml diff --git a/src/app/about/about.component.html b/src/app/about/about.component.html index 6b84932254..371342c919 100644 --- a/src/app/about/about.component.html +++ b/src/app/about/about.component.html @@ -140,7 +140,7 @@

The Importance of Sharing

Building a Community

Several large projects and organizations in the Biosciences, specifically cancer sequencing projects such as - PCAWG, + PCAWG, PrecisionFDA, the Broad Institute, the University of California Santa Cruz, and diff --git a/src/app/about/about.component.ts b/src/app/about/about.component.ts index 0e1f9cbf96..b7f216056b 100644 --- a/src/app/about/about.component.ts +++ b/src/app/about/about.component.ts @@ -6,12 +6,34 @@ import { map } from 'rxjs/operators'; import { Funder, FundingComponent } from '../funding/funding.component'; import { Dockstore } from '../shared/dockstore.model'; import { Sponsor } from '../sponsors/sponsor.model'; +import { RouterLink } from '@angular/router'; +import { MatLegacyCardModule } from '@angular/material/legacy-card'; +import { MatLegacyTabsModule } from '@angular/material/legacy-tabs'; +import { ExtendedModule } from '@ngbracket/ngx-layout/extended'; +import { NgStyle, NgFor, AsyncPipe, SlicePipe } from '@angular/common'; +import { MatIconModule } from '@angular/material/icon'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; @Component({ selector: 'app-about', templateUrl: './about.component.html', styleUrls: ['./about.component.scss'], providers: [FundingComponent], + standalone: true, + imports: [ + FlexModule, + MatLegacyButtonModule, + MatIconModule, + NgStyle, + ExtendedModule, + MatLegacyTabsModule, + MatLegacyCardModule, + RouterLink, + NgFor, + AsyncPipe, + SlicePipe, + ], }) export class AboutComponent implements OnInit { Dockstore = Dockstore; @@ -36,7 +58,7 @@ export class AboutComponent implements OnInit { new Sponsor('ucsc.png', new URL('https://ucscgenomics.soe.ucsc.edu/')), new Sponsor('broad.svg', new URL('https://www.broadinstitute.org/')), new Sponsor('ga4gh.svg', new URL('https://genomicsandhealth.org/')), - new Sponsor('pcawg.png', new URL('https://dcc.icgc.org/pcawg')), + new Sponsor('pcawg.png', new URL('https://docs.icgc-argo.org/docs/data-access/icgc-25k-data')), new Sponsor('precision.png', new URL('https://precision.fda.gov/')), new Sponsor('nf-core.png', new URL('https://nf-co.re/')), ]; diff --git a/src/app/aliases/aliases.component.ts b/src/app/aliases/aliases.component.ts index 52fda38c76..74c8f3be10 100644 --- a/src/app/aliases/aliases.component.ts +++ b/src/app/aliases/aliases.component.ts @@ -1,17 +1,24 @@ import { Component, OnInit } from '@angular/core'; import { Observable } from 'rxjs'; -import { map, takeUntil } from 'rxjs/operators'; +import { takeUntil } from 'rxjs/operators'; import { Base } from '../shared/base'; import { Collection, DockstoreTool, Entry, Organization, Workflow, WorkflowVersionPathInfo } from '../shared/openapi'; import { ActivatedRoute, Router } from '../test'; import { AliasesQuery } from './state/aliases.query'; import { AliasesService } from './state/aliases.service'; import { EntryTypeMetadataService } from '../entry/type-metadata/entry-type-metadata.service'; +import { MatLegacyProgressBarModule } from '@angular/material/legacy-progress-bar'; +import { MatIconModule } from '@angular/material/icon'; +import { MatLegacyCardModule } from '@angular/material/legacy-card'; +import { NgIf, AsyncPipe } from '@angular/common'; +import { HeaderComponent } from '../header/header.component'; @Component({ selector: 'app-aliases', templateUrl: './aliases.component.html', styleUrls: ['./aliases.component.scss'], + standalone: true, + imports: [HeaderComponent, NgIf, MatLegacyCardModule, MatIconModule, MatLegacyProgressBarModule, AsyncPipe], }) export class AliasesComponent extends Base implements OnInit { loading$: Observable; diff --git a/src/app/aliases/aliases.module.ts b/src/app/aliases/aliases.module.ts deleted file mode 100644 index 24b96941d2..0000000000 --- a/src/app/aliases/aliases.module.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { FlexLayoutModule } from '@angular/flex-layout'; -import { RefreshAlertModule } from '../shared/alert/alert.module'; -import { HeaderModule } from '../shared/modules/header.module'; -import { CustomMaterialModule } from '../shared/modules/material.module'; -import { PipeModule } from '../shared/pipe/pipe.module'; -import { AliasesComponent } from './aliases.component'; -import { AliasesRouting } from './aliases.routing'; - -@NgModule({ - imports: [CommonModule, HeaderModule, AliasesRouting, CustomMaterialModule, RefreshAlertModule, FlexLayoutModule, PipeModule], - declarations: [AliasesComponent], - exports: [AliasesComponent], -}) -export class AliasesModule {} diff --git a/src/app/aliases/aliases.routing.ts b/src/app/aliases/aliases.routing.ts index a4872a4565..e6bfef40c7 100644 --- a/src/app/aliases/aliases.routing.ts +++ b/src/app/aliases/aliases.routing.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { RouterModule, Routes } from '@angular/router'; +import { Routes } from '@angular/router'; import { AliasesComponent } from './aliases.component'; const ALIASES_ROUTES: Routes = [ @@ -25,4 +25,4 @@ const ALIASES_ROUTES: Routes = [ }, ]; -export const AliasesRouting = RouterModule.forChild(ALIASES_ROUTES); +export const AliasesRouting = ALIASES_ROUTES; diff --git a/src/app/aliases/state/aliases.service.ts b/src/app/aliases/state/aliases.service.ts index feb555f540..24d981c030 100644 --- a/src/app/aliases/state/aliases.service.ts +++ b/src/app/aliases/state/aliases.service.ts @@ -8,7 +8,6 @@ import { Entry, Organization, OrganizationsService, - WorkflowsService, WorkflowVersionPathInfo, } from '../../shared/openapi'; import { AliasesStore } from './aliases.store'; @@ -19,7 +18,6 @@ export class AliasesService { private aliasesStore: AliasesStore, private organizationsService: OrganizationsService, private entriesService: EntriesService, - private workflowsService: WorkflowsService, private workflowVersionsService: WorkflowVersionsAliasService ) {} diff --git a/src/app/app.component.spec.ts b/src/app/app.component.spec.ts index 25fb7459db..2497f72e4b 100644 --- a/src/app/app.component.spec.ts +++ b/src/app/app.component.spec.ts @@ -1,47 +1,118 @@ -import { TestBed, waitForAsync } from '@angular/core/testing'; -import { RouterTestingModule } from '@angular/router/testing'; -import { RouterLinkStubDirective, RouterOutletStubComponent } from './test/router-stubs'; +import { HttpClientTestingModule } from '@angular/common/http/testing'; import { Component } from '@angular/core'; -import { MatSnackBarModule } from '@angular/material/snack-bar'; +import { TestBed, waitForAsync } from '@angular/core/testing'; +import { MatLegacyDialogModule } from '@angular/material/legacy-dialog'; +import { MatLegacySnackBarModule as MatSnackBarModule } from '@angular/material/legacy-snack-bar'; +import { RouterTestingModule } from '@angular/router/testing'; import { AppComponent } from './app.component'; +import { MytoolsService } from './mytools/mytools.service'; +import { MyWorkflowsService } from './myworkflows/myworkflows.service'; +import { AuthService } from './ng2-ui-auth/public_api'; +import { ServiceInfoService } from './service-info/service-info.service'; +import { ContainerService } from './shared/container.service'; +import { DateService } from './shared/date.service'; +import { DescriptorLanguageService } from './shared/entry/descriptor-language.service'; +import { LogoutService } from './shared/logout.service'; +import { Configuration, UsersService } from './shared/openapi'; +import { PagenumberService } from './shared/pagenumber.service'; +import { ProviderService } from './shared/provider.service'; +import { MyEntriesStateService } from './shared/state/my-entries.service'; +import { MyEntriesStore } from './shared/state/my-entries.store'; import { TrackLoginService } from './shared/track-login.service'; -import { TosBannerStubService, TrackLoginStubService } from './test/service-stubs'; +import { UrlResolverService } from './shared/url-resolver.service'; +import { RouterLinkStubDirective, RouterOutletStubComponent } from './test/router-stubs'; +import { + AuthStubService, + ConfigurationStub, + ContainerStubService, + DateStubService, + DescriptorLanguageStubService, + GA4GHV20StubService, + LogoutStubService, + ProviderStubService, + TosBannerStubService, + TrackLoginStubService, + UrlResolverStubService, + UsersStubService, +} from './test/service-stubs'; import { TosBannerService } from './tosBanner/state/tos-banner.service'; -@Component({ selector: 'app-banner', template: '' }) +@Component({ + selector: 'app-banner', + template: '', + standalone: true, + imports: [RouterTestingModule, MatSnackBarModule], +}) class BannerStubComponent {} -@Component({ selector: 'app-navbar', template: '' }) +@Component({ + selector: 'app-navbar', + template: '', + standalone: true, + imports: [RouterTestingModule, MatSnackBarModule], +}) class NavbarStubComponent {} -@Component({ selector: 'app-footer', template: '' }) +@Component({ + selector: 'app-footer', + template: '', + standalone: true, + imports: [RouterTestingModule, MatSnackBarModule], +}) class FooterStubComponent {} -@Component({ selector: 'app-tos-banner', template: '' }) +@Component({ + selector: 'app-tos-banner', + template: '', + standalone: true, + imports: [RouterTestingModule, MatSnackBarModule], +}) class TosBannerStubComponent {} -@Component({ selector: 'app-sitewide-notifications', template: '' }) +@Component({ + selector: 'app-sitewide-notifications', + template: '', + standalone: true, + imports: [RouterTestingModule, MatSnackBarModule], +}) class NotificationStubComponent {} describe('AppComponent', () => { beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [ - AppComponent, + declarations: [RouterLinkStubDirective, RouterOutletStubComponent], + imports: [ + RouterTestingModule, + MatLegacyDialogModule, + MatSnackBarModule, + HttpClientTestingModule, NavbarStubComponent, FooterStubComponent, BannerStubComponent, - RouterLinkStubDirective, - RouterOutletStubComponent, TosBannerStubComponent, NotificationStubComponent, + AppComponent, ], - imports: [RouterTestingModule, MatSnackBarModule], providers: [ { provide: TrackLoginService, useClass: TrackLoginStubService }, { provide: TosBannerService, useClass: TosBannerStubService }, + { provide: AuthService, useClass: AuthStubService }, + { provide: Configuration, useClass: ConfigurationStub }, + { provide: ContainerService, useClass: ContainerStubService }, + { provide: ServiceInfoService, useClass: GA4GHV20StubService }, + { provide: DateService, useClass: DateStubService }, + { provide: ProviderService, useClass: ProviderStubService }, + { provide: DescriptorLanguageService, useClass: DescriptorLanguageStubService }, + { provide: UrlResolverService, useClass: UrlResolverStubService }, + { provide: UsersService, useClass: UsersStubService }, + { provide: LogoutService, useClass: LogoutStubService }, + MyEntriesStateService, + MyEntriesStore, + MytoolsService, + MyWorkflowsService, + PagenumberService, ], }).compileComponents(); }) diff --git a/src/app/app.component.ts b/src/app/app.component.ts index dd1603bdcb..eedd6ae340 100644 --- a/src/app/app.component.ts +++ b/src/app/app.component.ts @@ -1,21 +1,40 @@ +import { AsyncPipe, NgIf } from '@angular/common'; import { Component, OnDestroy, OnInit } from '@angular/core'; import { Title } from '@angular/platform-browser'; -import { ActivatedRoute, NavigationEnd, Router } from '@angular/router'; +import { ActivatedRoute, NavigationEnd, Router, RouterOutlet } from '@angular/router'; import { Observable, Subject } from 'rxjs'; import { filter, map, mergeMap, takeUntil } from 'rxjs/operators'; +import { BannerComponent } from './banner/banner.component'; +import { ChangeUsernameBannerComponent } from './changeUsernameBanner/changeUsernameBanner.component'; +import { FooterComponent } from './footer/footer.component'; +import { NavbarComponent } from './navbar/navbar.component'; +import { SitewideNotificationsComponent } from './notifications/sitewide-notifications.component'; import { AlertService } from './shared/alert/state/alert.service'; import { currentPrivacyPolicyVersion, currentTOSVersion } from './shared/constants'; import { Dockstore } from './shared/dockstore.model'; import { User } from './shared/openapi/model/user'; import { TrackLoginService } from './shared/track-login.service'; -import { TosBannerQuery } from './tosBanner/state/tos-banner.query'; import { UserQuery } from './shared/user/user.query'; +import { TosBannerQuery } from './tosBanner/state/tos-banner.query'; import { TosBannerService } from './tosBanner/state/tos-banner.service'; +import { TosBannerComponent } from './tosBanner/tos-banner.component'; @Component({ selector: 'app-root', templateUrl: './app.component.html', styleUrls: ['./app.component.css'], + standalone: true, + imports: [ + NgIf, + TosBannerComponent, + ChangeUsernameBannerComponent, + SitewideNotificationsComponent, + BannerComponent, + NavbarComponent, + RouterOutlet, + FooterComponent, + AsyncPipe, + ], }) export class AppComponent implements OnInit, OnDestroy { public isLoggedIn$: Observable; diff --git a/src/app/app.module.ts b/src/app/app.module.ts index a5c535166a..eb921167de 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -13,111 +13,11 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { ClipboardModule } from '@angular/cdk/clipboard'; -import { HTTP_INTERCEPTORS, HttpClient, HttpClientModule } from '@angular/common/http'; -import { APP_INITIALIZER, NgModule } from '@angular/core'; -import { FlexLayoutModule } from '@angular/flex-layout'; -import { FormsModule, ReactiveFormsModule } from '@angular/forms'; -import { MAT_SNACK_BAR_DEFAULT_OPTIONS, MatSnackBarConfig } from '@angular/material/snack-bar'; -import { MAT_TOOLTIP_DEFAULT_OPTIONS, MatTooltipDefaultOptions } from '@angular/material/tooltip'; -import { BrowserModule, Title } from '@angular/platform-browser'; -import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; -import { AkitaNgDevtools } from '@datorama/akita-ngdevtools'; -import { FontAwesomeModule } from '@fortawesome/angular-fontawesome'; -import { AuthService, Ng2UiAuthModule } from 'ng2-ui-auth'; -import { MarkdownModule } from 'ngx-markdown'; -import { environment } from '../environments/environment'; -import { AboutComponent } from './about/about.component'; -import { AppComponent } from './app.component'; -import { CLIENT_ROUTER_PROVIDERS, routing } from './app.routing'; -import { BannerComponent } from './banner/banner.component'; -import { ChangeUsernameBannerComponent } from './changeUsernameBanner/changeUsernameBanner.component'; +import { MatLegacySnackBarConfig as MatSnackBarConfig } from '@angular/material/legacy-snack-bar'; +import { MatLegacyTooltipDefaultOptions as MatTooltipDefaultOptions } from '@angular/material/legacy-tooltip'; import { ConfigurationService } from './configuration.service'; import { EntryTypeMetadataService } from './entry/type-metadata/entry-type-metadata.service'; -import { ConfirmationDialogComponent } from './confirmation-dialog/confirmation-dialog.component'; -import { FileTreeComponent } from './file-tree/file-tree.component'; -import { FooterComponent } from './footer/footer.component'; -import { GitTagPipe } from './footer/git-tag.pipe'; -import { FundingComponent } from './funding/funding.component'; -import { GithubCallbackComponent } from './github-callback/github-callback.component'; -import { YoutubeComponent } from './home-page/home-logged-out/home.component'; -import { HomePageModule } from './home-page/home-page.module'; -import { InformationDialogComponent } from './information-dialog/information-dialog.component'; -import { CustomHeaderInterceptor } from './interceptors/custom-header.interceptor'; -import { WorkflowVersionsInterceptor } from './interceptors/workflow-versions.interceptor'; -import { LoginComponent } from './login/login.component'; -import { LoginService } from './login/login.service'; -import { AccountSidebarModule } from './loginComponents/accounts/account-sidebar/account-sidebar.module'; -import { AccountsComponent } from './loginComponents/accounts/accounts.component'; -import { ControlsComponent } from './loginComponents/accounts/controls/controls.component'; -import { DeleteAccountDialogComponent } from './loginComponents/accounts/controls/delete-account-dialog/delete-account-dialog.component'; -import { DeleteEntryDialogComponent } from './entry/delete/dialog/delete-entry-dialog.component'; -import { ArchiveEntryDialogComponent } from './entry/archive/dialog/archive-entry-dialog.component'; -import { RevokeTokenDialogComponent } from './loginComponents/accounts/external/revoke-token-dialog/revoke-token-dialog.component'; -import { AccountsExternalComponent } from './loginComponents/accounts/external/accounts.component'; -import { AccountsService } from './loginComponents/accounts/external/accounts.service'; -import { GetTokenUsernamePipe } from './loginComponents/accounts/external/getTokenUsername.pipe'; -import { ChangeUsernameModule } from './loginComponents/accounts/internal/change-username/change-username.module'; -import { AuthComponent } from './loginComponents/auth/auth.component'; -import { DownloadCLIClientComponent } from './loginComponents/onboarding/downloadcliclient/downloadcliclient.component'; -import { OnboardingComponent } from './loginComponents/onboarding/onboarding.component'; -import { QuickStartComponent } from './loginComponents/onboarding/quickstart.component'; -import { RequestsModule } from './loginComponents/requests.module'; -import { LogoutComponent } from './logout/logout.component'; -import { MaintenanceComponent } from './maintenance/maintenance.component'; -import { ServiceInfoService } from './service-info/service-info.service'; -import { NavbarComponent } from './navbar/navbar.component'; -import { SitewideNotificationsComponent } from './notifications/sitewide-notifications.component'; -import { OrganizationStargazersModule } from './organizations/organization/organization-stargazers/organization-stargazers.module'; -import { OrganizationStarringModule } from './organizations/organization/organization-starring/organization-starring.module'; -import { PageNotFoundComponent } from './pagenotfound/pagenotfound.component'; -import { RegisterService } from './register/register.service'; -import { SessionExpiredComponent } from './session-expired/session-expired.component'; -import { RefreshAlertModule } from './shared/alert/alert.module'; -import { AuthConfig } from './shared/auth.model'; -import { ContainerService } from './shared/container.service'; -import { DateService } from './shared/date.service'; -import { DescriptorLanguageService } from './shared/entry/descriptor-language.service'; -import { RegisterCheckerWorkflowService } from './shared/entry/register-checker-workflow/register-checker-workflow.service'; -import { ExtendedToolsService } from './shared/extended-tools.service'; -import { ExtendedWorkflowsService } from './shared/extended-workflows.service'; -import { ImageProviderService } from './shared/image-provider.service'; -import { ListService } from './shared/list.service'; -import { LogoutService } from './shared/logout.service'; -import { HeaderModule } from './shared/modules/header.module'; -import { ImgFallbackModule } from './shared/modules/img-fallback.module'; -import { ListContainersModule } from './shared/modules/list-containers.module'; -import { ListWorkflowsModule } from './shared/modules/list-workflows.module'; -import { MarkdownWrapperModule } from './shared/modules/markdown-wrapper.module'; -import { CustomMaterialModule } from './shared/modules/material.module'; -import { MySidebarModule } from './shared/modules/my-sidebar.module'; -import { OrderByModule } from './shared/modules/orderby.module'; -import { SnackbarModule } from './shared/modules/snackbar.module'; -import { ApiModule as ApiModule2 } from './shared/openapi/api.module'; -import { GA4GHV20Service } from './shared/openapi/api/gA4GHV20.service'; -import { OrgLogoService } from './shared/org-logo.service'; -import { PagenumberService } from './shared/pagenumber.service'; -import { PipeModule } from './shared/pipe/pipe.module'; -import { ProviderService } from './shared/provider.service'; -import { RefreshService } from './shared/refresh.service'; -import { ApiModule } from './shared/openapi/api.module'; import { Configuration } from './shared/openapi/configuration'; -import { TrackLoginService } from './shared/track-login.service'; -import { UrlResolverService } from './shared/url-resolver.service'; -import { VerifiedByService } from './shared/verified-by.service'; -import { SitemapComponent } from './sitemap/sitemap.component'; -import { StargazersModule } from './stargazers/stargazers.module'; -import { StarredEntriesComponent } from './starredentries/starredentries.component'; -import { StarringModule } from './starring/starring.module'; -import { TosBannerService } from './tosBanner/state/tos-banner.service'; -import { TosBannerComponent } from './tosBanner/tos-banner.component'; -import { ExporterStepComponent } from './workflow/snapshot-exporter-modal/exporter-step/exporter-step.component'; -import { SnaphotExporterModalComponent } from './workflow/snapshot-exporter-modal/snaphot-exporter-modal.component'; -import { ViewService } from './workflow/view/view.service'; -import { NgxMatSelectSearchModule } from 'ngx-mat-select-search'; -import { PreviewWarningModule } from './shared/modules/preview-warning.module'; -import { MyOrganizationsDialogComponent } from './home-page/widget/organization-box/my-organizations-dialog.component/my-organizations-dialog.component'; -import { LaunchToCodespaceDialogComponent } from './workflow/launch-third-party/dialog/launch-to-codespace-dialog.component'; export const myCustomTooltipDefaults: MatTooltipDefaultOptions = { showDelay: 500, @@ -138,130 +38,6 @@ export function initializerFactory( return () => Promise.all([configurationService.load(), entryTypeMetadataService.load()]); } -@NgModule({ - declarations: [ - AppComponent, - ControlsComponent, - DeleteAccountDialogComponent, - DeleteEntryDialogComponent, - ArchiveEntryDialogComponent, - NavbarComponent, - FooterComponent, - SitewideNotificationsComponent, - LoginComponent, - OnboardingComponent, - QuickStartComponent, - AccountsComponent, - AccountsExternalComponent, - AuthComponent, - GetTokenUsernamePipe, - StarredEntriesComponent, - DownloadCLIClientComponent, - MaintenanceComponent, - FundingComponent, - BannerComponent, - YoutubeComponent, - SitemapComponent, - GithubCallbackComponent, - ConfirmationDialogComponent, - InformationDialogComponent, - SessionExpiredComponent, - TosBannerComponent, - LogoutComponent, - GitTagPipe, - AboutComponent, - PageNotFoundComponent, - SnaphotExporterModalComponent, - ExporterStepComponent, - FileTreeComponent, - ChangeUsernameBannerComponent, - RevokeTokenDialogComponent, - MyOrganizationsDialogComponent, - LaunchToCodespaceDialogComponent, - ], - imports: [ - environment.production ? [] : AkitaNgDevtools.forRoot(), - FontAwesomeModule, - BrowserModule, - BrowserAnimationsModule, - FormsModule, - Ng2UiAuthModule.forRoot(AuthConfig), - HeaderModule, - ListContainersModule, - ListWorkflowsModule, - ClipboardModule, - OrderByModule, - FlexLayoutModule, - StarringModule, - OrganizationStarringModule, - OrganizationStargazersModule, - NgxMatSelectSearchModule, - routing, - StargazersModule, - MarkdownModule.forRoot(), - MarkdownWrapperModule, - ReactiveFormsModule, - ApiModule.forRoot(getApiConfig), - ApiModule2.forRoot(getApiConfig), - CustomMaterialModule, - RefreshAlertModule, - RequestsModule, - HomePageModule, - HttpClientModule, - SnackbarModule, - ImgFallbackModule, - PipeModule, - MySidebarModule, - AccountSidebarModule, - ChangeUsernameModule, - PreviewWarningModule, - ], - providers: [ - AccountsService, - AuthService, - LoginService, - RegisterService, - LogoutService, - DateService, - TrackLoginService, - ListService, - ProviderService, - ContainerService, - ImageProviderService, - HttpClient, - CLIENT_ROUTER_PROVIDERS, - RegisterCheckerWorkflowService, - RefreshService, - PagenumberService, - GA4GHV20Service, - DescriptorLanguageService, - UrlResolverService, - ServiceInfoService, - ExtendedWorkflowsService, - ExtendedToolsService, - VerifiedByService, - Title, - ViewService, - TosBannerService, - ConfigurationService, - EntryTypeMetadataService, - OrgLogoService, - { - provide: APP_INITIALIZER, - useFactory: initializerFactory, - deps: [ConfigurationService, EntryTypeMetadataService], - multi: true, - }, - { provide: MAT_TOOLTIP_DEFAULT_OPTIONS, useValue: myCustomTooltipDefaults }, - { provide: MAT_SNACK_BAR_DEFAULT_OPTIONS, useValue: myCustomSnackbarDefaults }, - { provide: HTTP_INTERCEPTORS, useClass: WorkflowVersionsInterceptor, multi: true }, - { provide: HTTP_INTERCEPTORS, useClass: CustomHeaderInterceptor, multi: true }, - { provide: Window, useValue: window }, - ], - bootstrap: [AppComponent], -}) -export class AppModule {} - export const apiConfig = new Configuration({ apiKeys: {}, basePath: window.location.protocol + '//' + window.location.host + '/api', diff --git a/src/app/app.routing.ts b/src/app/app.routing.ts index 7ac2f89c40..d94f9d7e0a 100644 --- a/src/app/app.routing.ts +++ b/src/app/app.routing.ts @@ -17,6 +17,8 @@ import { RouterModule, Routes } from '@angular/router'; import { AboutComponent } from './about/about.component'; import { FundingComponent } from './funding/funding.component'; import { GithubCallbackComponent } from './github-callback/github-callback.component'; +import { GithubLandingPageComponent } from './github-landing-page/github-landing-page.component'; +import { DashboardComponent } from './home-page/dashboard/dashboard.component'; import { HomeComponent } from './home-page/home-logged-out/home.component'; import { LoginComponent } from './login/login.component'; import { AccountsComponent } from './loginComponents/accounts/accounts.component'; @@ -25,13 +27,11 @@ import { OnboardingComponent } from './loginComponents/onboarding/onboarding.com import { QuickStartComponent } from './loginComponents/onboarding/quickstart.component'; import { LogoutComponent } from './logout/logout.component'; import { MaintenanceComponent } from './maintenance/maintenance.component'; -import { DashboardComponent } from './home-page/dashboard/dashboard.component'; +import { PageNotFoundComponent } from './pagenotfound/pagenotfound.component'; import { SessionExpiredComponent } from './session-expired/session-expired.component'; import { AuthGuard } from './shared/auth.guard'; import { SitemapComponent } from './sitemap/sitemap.component'; import { StarredEntriesComponent } from './starredentries/starredentries.component'; -import { PageNotFoundComponent } from './pagenotfound/pagenotfound.component'; -import { GithubLandingPageComponent } from './github-landing-page/github-landing-page.component'; export const CLIENT_ROUTER_PROVIDERS = [AuthGuard]; @@ -45,78 +45,78 @@ const APP_ROUTES: Routes = [ }, { path: 'docs', - loadChildren: () => import('app/docs/docs.module').then((m) => m.DocsModule), + loadChildren: () => import('app/docs/docs.routing').then((m) => m.docsRouting), data: { title: 'Dockstore | Documentation' }, }, { path: 'search-containers', - loadChildren: () => import('app/containers/containers.module').then((m) => m.ContainersModule), + loadChildren: () => import('app/containers/containers.routing').then((m) => m.containersRouting), data: { title: 'Dockstore | Tools' }, }, { path: 'containers', - loadChildren: () => import('app/containers/containers.module').then((m) => m.ContainersModule), + loadChildren: () => import('app/containers/containers.routing').then((m) => m.containersRouting), data: { title: 'Dockstore | Tools' }, }, { path: 'tools', - loadChildren: () => import('app/containers/containers.module').then((m) => m.ContainersModule), + loadChildren: () => import('app/containers/containers.routing').then((m) => m.containersRouting), data: { title: 'Dockstore | Tools' }, }, { path: 'workflows', - loadChildren: () => import('app/workflows/workflows.module').then((m) => m.WorkflowsModule), + loadChildren: () => import('app/workflows/workflows.routing').then((m) => m.workflowsRouting), data: { title: 'Dockstore | Workflows' }, }, { path: 'services', - loadChildren: () => import('app/workflows/services/services.module').then((m) => m.ServicesModule), + loadChildren: () => import('app/workflows/services/services.routing').then((m) => m.ServicesRoutes), data: { title: 'Dockstore | Services' }, }, { path: 'apptools', - loadChildren: () => import('app/workflows/apptools/apptools.module').then((m) => m.AppToolsModule), + loadChildren: () => import('app/workflows/apptools/apptools.routing').then((m) => m.AppToolsRoutes), data: { title: 'Dockstore | App Tools' }, }, { path: 'notebooks', - loadChildren: () => import('app/workflows/notebooks/notebooks.module').then((m) => m.NotebooksModule), + loadChildren: () => import('app/workflows/notebooks/notebooks.routing').then((m) => m.NotebooksRoutes), data: { title: 'Dockstore | Notebooks' }, }, { path: 'search-workflows', - loadChildren: () => import('app/workflows/workflows.module').then((m) => m.WorkflowsModule), + loadChildren: () => import('app/workflows/workflows.routing').then((m) => m.workflowsRouting), data: { title: 'Dockstore | Workflows' }, }, - { path: 'organizations', loadChildren: () => import('app/organizations/organizations.module').then((m) => m.OrganizationsModule) }, + { path: 'organizations', loadChildren: () => import('app/organizations/organizations.routing').then((m) => m.OrganizationsRouting) }, { path: 'my-tools', - loadChildren: () => import('app/mytools/mytools.module').then((m) => m.MyToolsModule), + loadChildren: () => import('app/mytools/mytools.routing').then((m) => m.mytoolsRouting), canActivate: [AuthGuard], data: { title: 'Dockstore | My Tools' }, }, { path: 'my-workflows', - loadChildren: () => import('app/myworkflows/myworkflows.module').then((m) => m.MyWorkflowsModule), + loadChildren: () => import('app/myworkflows/myworkflows.routing').then((m) => m.myworkflowRouting), canActivate: [AuthGuard], data: { title: 'Dockstore | My Workflows' }, }, { path: 'my-services', - loadChildren: () => import('app/my-services/my-services.module').then((m) => m.MyServicesModule), + loadChildren: () => import('app/my-services/my-services.routing').then((m) => m.MyServicesRoutes), canActivate: [AuthGuard], data: { title: 'Dockstore | My Services' }, }, { path: 'my-notebooks', - loadChildren: () => import('app/my-notebooks/my-notebooks.module').then((m) => m.MyNotebooksModule), + loadChildren: () => import('app/my-notebooks/my-notebooks.routing').then((m) => m.MyNotebooksRoutes), canActivate: [AuthGuard], data: { title: 'Dockstore | My Notebooks' }, }, { path: 'githubCallback', component: GithubCallbackComponent }, { path: 'aliases', - loadChildren: () => import('app/aliases/aliases.module').then((m) => m.AliasesModule), + loadChildren: () => import('app/aliases/aliases.routing').then((m) => m.AliasesRouting), data: { title: 'Dockstore | Aliases' }, }, { @@ -126,7 +126,7 @@ const APP_ROUTES: Routes = [ }, { path: 'search', - loadChildren: () => import('app/search/search.module').then((m) => m.SearchModule), + loadChildren: () => import('app/search/search.routing').then((m) => m.searchRouting), data: { title: 'Dockstore | Search' }, }, { path: 'register', component: LoginComponent, data: { title: 'Dockstore | Register' } }, @@ -147,7 +147,7 @@ const APP_ROUTES: Routes = [ { path: 'funding', component: FundingComponent, data: { title: 'Dockstore | Funding' } }, { path: 'sitemap', component: SitemapComponent, data: { title: 'Dockstore | Sitemap' } }, { path: 'github-landing-page', component: GithubLandingPageComponent, data: { title: 'Dockstore | GitHub Apps Landing Page' } }, - { path: 'users', loadChildren: () => import('app/user-page/user-page.module').then((m) => m.UserPageModule) }, + { path: 'users', loadChildren: () => import('app/user-page/user-page.routing').then((m) => m.UserPageRouting) }, { path: '**', component: PageNotFoundComponent, @@ -158,5 +158,4 @@ const APP_ROUTES: Routes = [ export const routing = RouterModule.forRoot(APP_ROUTES, { scrollPositionRestoration: 'enabled', anchorScrolling: 'enabled', - relativeLinkResolution: 'legacy', }); diff --git a/src/app/banner/banner.component.spec.ts b/src/app/banner/banner.component.spec.ts index 84e63d3f9e..abed3ca562 100644 --- a/src/app/banner/banner.component.spec.ts +++ b/src/app/banner/banner.component.spec.ts @@ -11,7 +11,7 @@ describe('BannerComponent', () => { beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [BannerComponent], + imports: [BannerComponent], providers: [ServiceInfoService, { provide: GA4GHV20Service, useClass: GA4GHV20StubService }], }).compileComponents(); }) diff --git a/src/app/banner/banner.component.ts b/src/app/banner/banner.component.ts index 15bf72fcf6..6d667cd8c8 100644 --- a/src/app/banner/banner.component.ts +++ b/src/app/banner/banner.component.ts @@ -7,11 +7,14 @@ import { versions } from '../footer/versions'; import { ServiceInfoService } from '../service-info/service-info.service'; import { Base } from '../shared/base'; import { TRSService } from 'app/shared/openapi'; +import { NgIf } from '@angular/common'; @Component({ selector: 'app-banner', templateUrl: './banner.component.html', styleUrls: ['./banner.component.scss'], + standalone: true, + imports: [NgIf], }) export class BannerComponent extends Base implements OnInit { showBanner: boolean; diff --git a/src/app/categories/button/category-button.component.ts b/src/app/categories/button/category-button.component.ts index 70758a49fd..cac45358e4 100644 --- a/src/app/categories/button/category-button.component.ts +++ b/src/app/categories/button/category-button.component.ts @@ -15,11 +15,17 @@ */ import { Component, OnChanges, Input } from '@angular/core'; import { Category, CategorySummary } from '../../shared/openapi'; +import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; +import { NgClass } from '@angular/common'; +import { RouterLink } from '@angular/router'; +import { MatLegacyChipsModule } from '@angular/material/legacy-chips'; @Component({ selector: 'app-category-button', templateUrl: './category-button.component.html', styleUrls: ['./category-button.component.scss'], + standalone: true, + imports: [MatLegacyChipsModule, RouterLink, NgClass, MatLegacyTooltipModule], }) export class CategoryButtonComponent implements OnChanges { @Input() category: Category | CategorySummary; diff --git a/src/app/categories/button/category-button.module.ts b/src/app/categories/button/category-button.module.ts deleted file mode 100644 index c1175ec2ff..0000000000 --- a/src/app/categories/button/category-button.module.ts +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright 2021 OICR and UCSC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { RouterModule } from '@angular/router'; -import { CustomMaterialModule } from '../../shared/modules/material.module'; - -import { CategoryButtonComponent } from './category-button.component'; - -@NgModule({ - declarations: [CategoryButtonComponent], - imports: [CommonModule, RouterModule, CustomMaterialModule], - exports: [CategoryButtonComponent], -}) -export class CategoryButtonModule {} diff --git a/src/app/changeUsernameBanner/changeUsernameBanner.component.ts b/src/app/changeUsernameBanner/changeUsernameBanner.component.ts index d8e9338cb5..8dab256841 100644 --- a/src/app/changeUsernameBanner/changeUsernameBanner.component.ts +++ b/src/app/changeUsernameBanner/changeUsernameBanner.component.ts @@ -14,9 +14,12 @@ * limitations under the License. */ import { Component } from '@angular/core'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; @Component({ selector: 'app-change-username-banner', templateUrl: './changeUsernameBanner.component.html', + standalone: true, + imports: [FlexModule], }) export class ChangeUsernameBannerComponent {} diff --git a/src/app/configuration.service.spec.ts b/src/app/configuration.service.spec.ts index 341328acac..5817565dfd 100644 --- a/src/app/configuration.service.spec.ts +++ b/src/app/configuration.service.spec.ts @@ -1,7 +1,7 @@ import { HttpClientTestingModule } from '@angular/common/http/testing'; import { inject, TestBed } from '@angular/core/testing'; -import { ConfigService } from 'ng2-ui-auth'; import { ConfigurationService } from './configuration.service'; +import { ConfigService } from './ng2-ui-auth/public_api'; describe('ConfigurationService', () => { beforeEach(() => diff --git a/src/app/configuration.service.ts b/src/app/configuration.service.ts index ac07a6e766..f238c33c23 100644 --- a/src/app/configuration.service.ts +++ b/src/app/configuration.service.ts @@ -1,6 +1,6 @@ import { Injectable } from '@angular/core'; -import { ConfigService } from 'ng2-ui-auth'; -import { IOauth2Options } from 'ng2-ui-auth/lib/config-interfaces'; +import { IOauth2Options } from './ng2-ui-auth/lib/config-interfaces'; +import { ConfigService } from './ng2-ui-auth/lib/config.service'; import { AuthConfig } from './shared/auth.model'; import { Dockstore } from './shared/dockstore.model'; import { FeatureService } from './shared/feature.service'; @@ -10,12 +10,7 @@ import { Config, MetadataService } from './shared/openapi'; providedIn: 'root', }) export class ConfigurationService { - constructor( - private metadataService: MetadataService, - private configService: ConfigService, - private window: Window, - private featureService: FeatureService - ) {} + constructor(private metadataService: MetadataService, private configService: ConfigService, private featureService: FeatureService) {} load(): Promise { return this.metadataService diff --git a/src/app/confirmation-dialog/confirmation-dialog.component.ts b/src/app/confirmation-dialog/confirmation-dialog.component.ts index e28904a3e9..a820caa373 100644 --- a/src/app/confirmation-dialog/confirmation-dialog.component.ts +++ b/src/app/confirmation-dialog/confirmation-dialog.component.ts @@ -1,5 +1,12 @@ import { Component, Inject } from '@angular/core'; -import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog'; +import { + MatLegacyDialogRef as MatDialogRef, + MAT_LEGACY_DIALOG_DATA as MAT_DIALOG_DATA, + MatLegacyDialogModule, +} from '@angular/material/legacy-dialog'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { NgIf } from '@angular/common'; export class ConfirmationDialogData { message?: string; @@ -12,6 +19,8 @@ export class ConfirmationDialogData { selector: 'app-confirmation-dialog', templateUrl: './confirmation-dialog.component.html', styleUrls: ['./confirmation-dialog.component.scss'], + standalone: true, + imports: [NgIf, MatLegacyDialogModule, FlexModule, MatLegacyButtonModule], }) export class ConfirmationDialogComponent { constructor(public dialogRef: MatDialogRef, @Inject(MAT_DIALOG_DATA) public data: ConfirmationDialogData) {} diff --git a/src/app/confirmation-dialog/confirmation-dialog.service.ts b/src/app/confirmation-dialog/confirmation-dialog.service.ts index 5fe3f550bf..558c65dacd 100644 --- a/src/app/confirmation-dialog/confirmation-dialog.service.ts +++ b/src/app/confirmation-dialog/confirmation-dialog.service.ts @@ -1,5 +1,5 @@ import { Injectable } from '@angular/core'; -import { MatDialog } from '@angular/material/dialog'; +import { MatLegacyDialog as MatDialog } from '@angular/material/legacy-dialog'; import { Observable } from 'rxjs'; import { ConfirmationDialogComponent, ConfirmationDialogData } from './confirmation-dialog.component'; diff --git a/src/app/container/add-tag/add-tag.component.ts b/src/app/container/add-tag/add-tag.component.ts index 2c4e617f8e..ea24373a99 100644 --- a/src/app/container/add-tag/add-tag.component.ts +++ b/src/app/container/add-tag/add-tag.component.ts @@ -15,8 +15,8 @@ */ import { HttpErrorResponse } from '@angular/common/http'; import { AfterViewChecked, Component, OnInit, ViewChild } from '@angular/core'; -import { NgForm } from '@angular/forms'; -import { MatDialog } from '@angular/material/dialog'; +import { NgForm, FormsModule } from '@angular/forms'; +import { MatLegacyDialog as MatDialog, MatLegacyDialogModule } from '@angular/material/legacy-dialog'; import { forkJoin, Observable } from 'rxjs'; import { debounceTime, takeUntil } from 'rxjs/operators'; import { AlertService } from '../../shared/alert/state/alert.service'; @@ -29,11 +29,34 @@ import { Tag } from '../../shared/openapi/model/tag'; import { ToolDescriptor } from '../../shared/openapi/model/toolDescriptor'; import { ToolQuery } from '../../shared/tool/tool.query'; import { formErrors, validationDescriptorPatterns, validationMessages } from '../../shared/validationMessages.model'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { MatLegacyCheckboxModule } from '@angular/material/legacy-checkbox'; +import { MatIconModule } from '@angular/material/icon'; +import { ExtendedModule } from '@ngbracket/ngx-layout/extended'; +import { NgIf, NgFor, NgClass } from '@angular/common'; +import { MatLegacyInputModule } from '@angular/material/legacy-input'; +import { MatLegacyFormFieldModule } from '@angular/material/legacy-form-field'; +import { AlertComponent } from '../../shared/alert/alert.component'; @Component({ selector: 'app-add-tag', templateUrl: './add-tag.component.html', styleUrls: ['./add-tag.component.css'], + standalone: true, + imports: [ + MatLegacyDialogModule, + AlertComponent, + FormsModule, + MatLegacyFormFieldModule, + MatLegacyInputModule, + NgIf, + NgFor, + NgClass, + ExtendedModule, + MatIconModule, + MatLegacyCheckboxModule, + MatLegacyButtonModule, + ], }) export class AddTagComponent extends Base implements OnInit, AfterViewChecked { addTagForm: NgForm; diff --git a/src/app/container/container.component.html b/src/app/container/container.component.html index 3d722ac53b..cd8fef4368 100644 --- a/src/app/container/container.component.html +++ b/src/app/container/container.component.html @@ -200,15 +200,15 @@

mat-stretch-tabs > - + > - [toolname]="tool?.toolname" [mode]="tool?.mode" [versionsFileTypes]="versionsFileTypes" - > + >
diff --git a/src/app/container/container.component.ts b/src/app/container/container.component.ts index 050cac063e..ec56c21b43 100644 --- a/src/app/container/container.component.ts +++ b/src/app/container/container.component.ts @@ -14,10 +14,10 @@ * limitations under the License. */ import { COMMA, ENTER } from '@angular/cdk/keycodes'; -import { Location } from '@angular/common'; +import { Location, NgIf, NgFor, NgClass, AsyncPipe, DatePipe } from '@angular/common'; import { AfterViewInit, Component, Input, OnInit } from '@angular/core'; -import { MatChipInputEvent } from '@angular/material/chips'; -import { MatDialog } from '@angular/material/dialog'; +import { MatLegacyChipInputEvent as MatChipInputEvent, MatLegacyChipsModule } from '@angular/material/legacy-chips'; +import { MatLegacyDialog as MatDialog } from '@angular/material/legacy-dialog'; import { Title } from '@angular/platform-browser'; import { ActivatedRoute, Router } from '@angular/router'; import { AlertService } from 'app/shared/alert/state/alert.service'; @@ -49,11 +49,79 @@ import { UrlResolverService } from './../shared/url-resolver.service'; import { AddTagComponent } from './add-tag/add-tag.component'; import { EmailService } from './email.service'; import { EntryCategoriesService } from '../categories/state/entry-categories.service'; +import { ShareButtonsModule } from 'ngx-sharebuttons/buttons'; +import { VerifiedByComponent } from '../shared/entry/verified-by/verified-by.component'; +import { CurrentCollectionsComponent } from '../entry/current-collections/current-collections.component'; +import { ClipboardModule } from '@angular/cdk/clipboard'; +import { SnackbarDirective } from '../shared/snackbar.directive'; +import { MatDividerModule } from '@angular/material/divider'; +import { ToolFileEditorComponent } from './tool-file-editor/tool-file-editor.component'; +import { FilesContainerComponent } from './files/files.component'; +import { VersionsContainerComponent } from './versions/versions.component'; +import { LaunchComponent } from './launch/launch.component'; +import { InfoTabComponent } from './info-tab/info-tab.component'; +import { MatLegacyTabsModule } from '@angular/material/legacy-tabs'; +import { StargazersComponent } from '../stargazers/stargazers.component'; +import { FormsModule, ReactiveFormsModule } from '@angular/forms'; +import { CategoryButtonComponent } from '../categories/button/category-button.component'; +import { ToolActionsComponent } from '../shared/entry-actions/tool-actions.component'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { StarringComponent } from '../starring/starring.component'; +import { MatLegacyOptionModule } from '@angular/material/legacy-core'; +import { MatLegacySelectModule } from '@angular/material/legacy-select'; +import { MatLegacyFormFieldModule } from '@angular/material/legacy-form-field'; +import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; +import { ExtendedModule } from '@ngbracket/ngx-layout/extended'; +import { PrivateIconComponent } from '../shared/private-icon/private-icon.component'; +import { JsonLdComponent } from '../shared/json-ld/json-ld.component'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { MatIconModule } from '@angular/material/icon'; +import { MatLegacyCardModule } from '@angular/material/legacy-card'; +import { WorkflowComponent } from '../workflow/workflow.component'; @Component({ selector: 'app-container', templateUrl: './container.component.html', styleUrls: ['../shared/styles/workflow-container.component.scss'], + standalone: true, + imports: [ + NgIf, + WorkflowComponent, + MatLegacyCardModule, + MatIconModule, + FlexModule, + JsonLdComponent, + PrivateIconComponent, + ExtendedModule, + MatLegacyChipsModule, + MatLegacyTooltipModule, + MatLegacyFormFieldModule, + MatLegacySelectModule, + NgFor, + MatLegacyOptionModule, + StarringComponent, + MatLegacyButtonModule, + ToolActionsComponent, + CategoryButtonComponent, + FormsModule, + ReactiveFormsModule, + StargazersComponent, + NgClass, + MatLegacyTabsModule, + InfoTabComponent, + LaunchComponent, + VersionsContainerComponent, + FilesContainerComponent, + ToolFileEditorComponent, + MatDividerModule, + SnackbarDirective, + ClipboardModule, + CurrentCollectionsComponent, + VerifiedByComponent, + ShareButtonsModule, + AsyncPipe, + DatePipe, + ], }) export class ContainerComponent extends Entry implements AfterViewInit, OnInit { dockerPullCmd: string; @@ -263,7 +331,7 @@ export class ContainerComponent extends Entry implements AfterViewInit, OnI }, (error) => { if (error.status === 404) { - this.router.navigate(['page-not-found']); + this.urlResolverService.showPageNotFound(); } } ); @@ -353,26 +421,6 @@ export class ContainerComponent extends Entry implements AfterViewInit, OnI } } - /** - * Will change the /tools in the current URL with /containers - * @return {void} - */ - switchToolsToContainers(): void { - const url = window.location.href.replace('/tools', '/containers'); - const toolsIndex = window.location.href.indexOf('/tools'); - const newPath = url.substring(toolsIndex); - this.location.go(newPath); - } - - getPageIndex(): number { - let pageIndex = this.getIndexInURL('/containers'); - if (pageIndex === -1) { - pageIndex = this.getIndexInURL('/tools'); - this.switchToolsToContainers(); - } - return pageIndex; - } - addToLabels(event: MatChipInputEvent): void { const input = event.input; const value = event.value; diff --git a/src/app/container/deregister-modal/deregister-modal.component.ts b/src/app/container/deregister-modal/deregister-modal.component.ts index efe98ea836..a6b1486b9f 100644 --- a/src/app/container/deregister-modal/deregister-modal.component.ts +++ b/src/app/container/deregister-modal/deregister-modal.component.ts @@ -20,11 +20,15 @@ import { ConfirmationDialogData } from '../../confirmation-dialog/confirmation-d import { ConfirmationDialogService } from '../../confirmation-dialog/confirmation-dialog.service'; import { bootstrap4mediumModalSize } from '../../shared/constants'; import { RegisterToolService } from './../register-tool/register-tool.service'; +import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; @Component({ selector: 'app-deregister-modal', templateUrl: './deregister-modal.component.html', styleUrls: ['./deregister-modal.component.css'], + standalone: true, + imports: [MatLegacyButtonModule, MatLegacyTooltipModule], }) export class ModalComponent { @Input() refreshMessage: boolean; diff --git a/src/app/container/descriptors/descriptors.component.spec.ts b/src/app/container/descriptors/descriptors.component.spec.ts index 4f87d61a09..b21451caec 100644 --- a/src/app/container/descriptors/descriptors.component.spec.ts +++ b/src/app/container/descriptors/descriptors.component.spec.ts @@ -16,7 +16,7 @@ import { HttpClientModule } from '@angular/common/http'; import { NO_ERRORS_SCHEMA } from '@angular/core'; import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { MatSnackBarModule } from '@angular/material/snack-bar'; +import { MatLegacySnackBarModule as MatSnackBarModule } from '@angular/material/legacy-snack-bar'; import { ContainersStubService, @@ -41,8 +41,7 @@ describe('DescriptorsComponent', () => { beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [DescriptorsComponent], - imports: [HttpClientModule, MatSnackBarModule, HttpClientTestingModule], + imports: [HttpClientModule, MatSnackBarModule, HttpClientTestingModule, DescriptorsComponent], schemas: [NO_ERRORS_SCHEMA], providers: [ DescriptorService, diff --git a/src/app/container/descriptors/descriptors.component.ts b/src/app/container/descriptors/descriptors.component.ts index a48466f7eb..1b59aa09b0 100644 --- a/src/app/container/descriptors/descriptors.component.ts +++ b/src/app/container/descriptors/descriptors.component.ts @@ -26,11 +26,39 @@ import { Tag } from '../../shared/openapi/model/tag'; import { ToolQuery } from '../../shared/tool/tool.query'; import { FilesQuery } from '../../workflow/files/state/files.query'; import { FilesService } from '../../workflow/files/state/files.service'; +import { CodeEditorComponent } from '../../shared/code-editor/code-editor.component'; +import { ClipboardModule } from '@angular/cdk/clipboard'; +import { SnackbarDirective } from '../../shared/snackbar.directive'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { MatToolbarModule } from '@angular/material/toolbar'; +import { SelectComponent } from '../../select/select.component'; +import { MatLegacyProgressBarModule } from '@angular/material/legacy-progress-bar'; +import { MatIconModule } from '@angular/material/icon'; +import { MatLegacyCardModule } from '@angular/material/legacy-card'; +import { NgIf, NgFor, AsyncPipe, KeyValuePipe } from '@angular/common'; @Component({ selector: 'app-descriptors-container', templateUrl: './descriptors.component.html', styleUrls: ['./descriptors.component.scss'], + standalone: true, + imports: [ + NgIf, + MatLegacyCardModule, + MatIconModule, + NgFor, + MatLegacyProgressBarModule, + SelectComponent, + MatToolbarModule, + FlexModule, + MatLegacyButtonModule, + SnackbarDirective, + ClipboardModule, + CodeEditorComponent, + AsyncPipe, + KeyValuePipe, + ], }) export class DescriptorsComponent extends EntryFileSelector implements OnChanges { @Input() id: number; diff --git a/src/app/container/dockerfile/dockerfile.component.spec.ts b/src/app/container/dockerfile/dockerfile.component.spec.ts index ca349ba7fd..1850b201e6 100644 --- a/src/app/container/dockerfile/dockerfile.component.spec.ts +++ b/src/app/container/dockerfile/dockerfile.component.spec.ts @@ -29,7 +29,7 @@ describe('DockerfileComponent', () => { beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [DockerfileComponent], + imports: [DockerfileComponent], schemas: [NO_ERRORS_SCHEMA], providers: [ { provide: FileService, useClass: FileStubService }, diff --git a/src/app/container/dockerfile/dockerfile.component.ts b/src/app/container/dockerfile/dockerfile.component.ts index e0b74ce4db..ac2b7ef77c 100644 --- a/src/app/container/dockerfile/dockerfile.component.ts +++ b/src/app/container/dockerfile/dockerfile.component.ts @@ -21,11 +21,30 @@ import { FileService } from '../../shared/file.service'; import { ContainersService } from '../../shared/openapi'; import { Tag } from '../../shared/openapi/model/tag'; import { ToolQuery } from '../../shared/tool/tool.query'; +import { CodeEditorComponent } from '../../shared/code-editor/code-editor.component'; +import { ClipboardModule } from '@angular/cdk/clipboard'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { MatToolbarModule } from '@angular/material/toolbar'; +import { MatLegacyProgressBarModule } from '@angular/material/legacy-progress-bar'; +import { MatIconModule } from '@angular/material/icon'; +import { MatLegacyCardModule } from '@angular/material/legacy-card'; +import { NgIf } from '@angular/common'; @Component({ selector: 'app-dockerfile', templateUrl: './dockerfile.component.html', styleUrls: ['./dockerfile.component.scss'], + standalone: true, + imports: [ + NgIf, + MatLegacyCardModule, + MatIconModule, + MatLegacyProgressBarModule, + MatToolbarModule, + MatLegacyButtonModule, + ClipboardModule, + CodeEditorComponent, + ], }) export class DockerfileComponent { @Input() id: number; diff --git a/src/app/container/files/files.component.ts b/src/app/container/files/files.component.ts index 6b6120a02d..794bc560dc 100644 --- a/src/app/container/files/files.component.ts +++ b/src/app/container/files/files.component.ts @@ -19,10 +19,19 @@ import { Files } from '../../shared/files'; import { GA4GHFilesService } from '../../shared/ga4gh-files/ga4gh-files.service'; import { SourceFile } from '../../shared/openapi'; import { Tag } from '../../shared/openapi/model/tag'; +import { MatIconModule } from '@angular/material/icon'; +import { MatLegacyCardModule } from '@angular/material/legacy-card'; +import { NgIf } from '@angular/common'; +import { ParamfilesComponent } from '../paramfiles/paramfiles.component'; +import { DescriptorsComponent } from '../descriptors/descriptors.component'; +import { DockerfileComponent } from '../dockerfile/dockerfile.component'; +import { MatLegacyTabsModule } from '@angular/material/legacy-tabs'; @Component({ selector: 'app-files-container', templateUrl: './files.component.html', + standalone: true, + imports: [MatLegacyTabsModule, DockerfileComponent, DescriptorsComponent, ParamfilesComponent, NgIf, MatLegacyCardModule, MatIconModule], }) export class FilesContainerComponent extends Files implements OnChanges { @Input() selectedVersion: Tag; diff --git a/src/app/container/info-tab/info-tab.component.html b/src/app/container/info-tab/info-tab.component.html index 87a2f99f16..a595e3d0d7 100644 --- a/src/app/container/info-tab/info-tab.component.html +++ b/src/app/container/info-tab/info-tab.component.html @@ -264,80 +264,9 @@ - -
  • - Topic - {{ tool?.topicSelection === TopicSelectionEnum.AUTOMATIC ? tool?.topicAutomatic : tool?.topicManual }} +
  • +
  • - - -
  • - Topic Automatic - {{ tool?.topicAutomatic }} -
  • - -
  • -
    - Topic - {{ tool?.topicManual || 'n/a' }} - - - - - -
    -
  • -
  • -
    - Topic Selection - - - Automatic - Manual - - -
    -
  • -
    = []; public displayedColumns: string[] = ['name', 'role', 'affiliation', 'email']; @@ -112,7 +157,6 @@ export class InfoTabComponent extends Base implements OnInit, OnChanges { this.infoTabService.wdlPathEditing$.pipe(takeUntil(this.ngUnsubscribe)).subscribe((editing) => (this.wdlPathEditing = editing)); this.infoTabService.cwlTestPathEditing$.pipe(takeUntil(this.ngUnsubscribe)).subscribe((editing) => (this.cwlTestPathEditing = editing)); this.infoTabService.wdlTestPathEditing$.pipe(takeUntil(this.ngUnsubscribe)).subscribe((editing) => (this.wdlTestPathEditing = editing)); - this.infoTabService.topicEditing$.pipe(takeUntil(this.ngUnsubscribe)).subscribe((topicEditing) => (this.topicEditing = topicEditing)); this.sessionQuery.isPublic$.pipe(takeUntil(this.ngUnsubscribe)).subscribe((publicPage) => (this.isPublic = publicPage)); } @@ -124,25 +168,6 @@ export class InfoTabComponent extends Base implements OnInit, OnChanges { }); } - toggleEditTopic() { - if (this.topicEditing) { - this.infoTabService.saveTopic(this.tool, this.revertTopic.bind(this)); - } - this.infoTabService.setTopicEditing(!this.topicEditing); - } - - revertTopic() { - this.tool.topicManual = this.extendedDockstoreTool.topicManual; - } - - revertTopicSelection() { - this.tool.topicSelection = this.extendedDockstoreTool.topicSelection; - } - - topicSelectionChange() { - this.infoTabService.saveTopicSelection(this.tool, this.revertTopicSelection.bind(this)); - } - toggleEditDockerFile() { if (this.dockerFileEditing) { this.infoTabService.updateAndRefresh(this.tool); @@ -178,14 +203,7 @@ export class InfoTabComponent extends Base implements OnInit, OnChanges { } somethingIsBeingEdited(): boolean { - return ( - this.dockerFileEditing || - this.cwlPathEditing || - this.wdlPathEditing || - this.cwlTestPathEditing || - this.wdlTestPathEditing || - this.topicEditing - ); + return this.dockerFileEditing || this.cwlPathEditing || this.wdlPathEditing || this.cwlTestPathEditing || this.wdlTestPathEditing; } /** @@ -195,7 +213,6 @@ export class InfoTabComponent extends Base implements OnInit, OnChanges { */ cancelEditing(): void { this.infoTabService.cancelEditing(); - this.revertTopic(); } /** diff --git a/src/app/container/info-tab/info-tab.service.ts b/src/app/container/info-tab/info-tab.service.ts index 7673ea7540..f8fa04627b 100644 --- a/src/app/container/info-tab/info-tab.service.ts +++ b/src/app/container/info-tab/info-tab.service.ts @@ -31,7 +31,6 @@ export class InfoTabService extends Base { public wdlPathEditing$: BehaviorSubject = new BehaviorSubject(false); public cwlTestPathEditing$: BehaviorSubject = new BehaviorSubject(false); public wdlTestPathEditing$: BehaviorSubject = new BehaviorSubject(false); - public topicEditing$: BehaviorSubject = new BehaviorSubject(false); /** * The original tool that should be in sync with the database @@ -86,46 +85,6 @@ export class InfoTabService extends Base { this.wdlTestPathEditing$.next(editing); } - setTopicEditing(editing: boolean) { - this.topicEditing$.next(editing); - } - - saveTopic(tool: DockstoreTool, errorCallback: () => void) { - this.alertService.start('Updating topic'); - const partialTool = this.getPartialToolForUpdate(tool); - this.containersService.updateContainer(this.tool.id, partialTool).subscribe( - (response) => { - this.alertService.detailedSuccess(); - const newTopic = response.topicManual; - this.containerService.updateActiveTopic(newTopic); - }, - (error) => { - this.alertService.detailedError(error); - errorCallback(); - } - ); - } - - /** - * Warning, this could potentially update a few other properties - * @param entry - */ - saveTopicSelection(entry: DockstoreTool, errorCallback: () => void) { - this.alertService.start('Updating topic selection'); - const partialEntryForUpdate = this.getPartialToolForUpdate(entry); - this.containersService.updateContainer(this.originalTool.id, partialEntryForUpdate).subscribe( - (response) => { - this.alertService.detailedSuccess(); - const newTopicSelection = response.topicSelection; - this.containerService.updateActiveTopicSelection(newTopicSelection); - }, - (error) => { - this.alertService.detailedError(error); - errorCallback(); - } - ); - } - updateAndRefresh(tool: ExtendedDockstoreTool) { const message = 'Tool Info'; const partialTool = this.getPartialToolForUpdate(tool); @@ -157,7 +116,7 @@ export class InfoTabService extends Base { * Sending back only the ones relevant. * Additionally, the webservice does not appear to understand starredUsers which causes an error. */ - private getPartialToolForUpdate(tool: ExtendedDockstoreTool): DockstoreTool { + getPartialToolForUpdate(tool: ExtendedDockstoreTool): DockstoreTool { const partialTool: DockstoreTool = { gitUrl: tool.gitUrl, mode: tool.mode, @@ -198,7 +157,6 @@ export class InfoTabService extends Base { this.wdlPathEditing$.next(false); this.wdlTestPathEditing$.next(false); this.cwlTestPathEditing$.next(false); - this.topicEditing$.next(false); this.restoreTool(); } diff --git a/src/app/container/launch/launch.component.ts b/src/app/container/launch/launch.component.ts index 6850039f52..defcf94510 100644 --- a/src/app/container/launch/launch.component.ts +++ b/src/app/container/launch/launch.component.ts @@ -24,12 +24,35 @@ import { ToolQuery } from '../../shared/tool/tool.query'; import { DescriptorLanguageService } from './../../shared/entry/descriptor-language.service'; import { Tag } from './../../shared/openapi/model/tag'; import { ToolLaunchService } from './tool-launch.service'; +import { LaunchCheckerWorkflowComponent } from '../../shared/entry/launch-checker-workflow/launch-checker-workflow.component'; +import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { MatLegacyOptionModule } from '@angular/material/legacy-core'; +import { MatLegacySelectModule } from '@angular/material/legacy-select'; +import { MatLegacyFormFieldModule } from '@angular/material/legacy-form-field'; +import { MatIconModule } from '@angular/material/icon'; +import { MatLegacyCardModule } from '@angular/material/legacy-card'; +import { NgIf, NgFor, AsyncPipe } from '@angular/common'; import DescriptorTypeEnum = Workflow.DescriptorTypeEnum; @Component({ - selector: 'app-launch', + selector: 'app-container-launch', templateUrl: './launch.component.html', styleUrls: ['./launch.component.css'], + standalone: true, + imports: [ + NgIf, + MatLegacyCardModule, + MatIconModule, + MatLegacyFormFieldModule, + MatLegacySelectModule, + NgFor, + MatLegacyOptionModule, + FlexModule, + MatLegacyTooltipModule, + LaunchCheckerWorkflowComponent, + AsyncPipe, + ], }) export class LaunchComponent extends Base implements OnInit, OnChanges { @Input() basePath: string; diff --git a/src/app/container/paramfiles/paramfiles.component.ts b/src/app/container/paramfiles/paramfiles.component.ts index d491cc34b5..781e159481 100644 --- a/src/app/container/paramfiles/paramfiles.component.ts +++ b/src/app/container/paramfiles/paramfiles.component.ts @@ -26,11 +26,39 @@ import { ToolQuery } from '../../shared/tool/tool.query'; import { FilesQuery } from '../../workflow/files/state/files.query'; import { FilesService } from '../../workflow/files/state/files.service'; import { ParamfilesService } from './paramfiles.service'; +import { CodeEditorComponent } from '../../shared/code-editor/code-editor.component'; +import { ClipboardModule } from '@angular/cdk/clipboard'; +import { SnackbarDirective } from '../../shared/snackbar.directive'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { MatToolbarModule } from '@angular/material/toolbar'; +import { SelectComponent } from '../../select/select.component'; +import { MatLegacyProgressBarModule } from '@angular/material/legacy-progress-bar'; +import { MatIconModule } from '@angular/material/icon'; +import { MatLegacyCardModule } from '@angular/material/legacy-card'; +import { NgIf, NgFor, AsyncPipe, KeyValuePipe } from '@angular/common'; @Component({ selector: 'app-paramfiles-container', templateUrl: './paramfiles.component.html', styleUrls: ['./paramfiles.component.scss'], + standalone: true, + imports: [ + NgIf, + MatLegacyCardModule, + MatIconModule, + NgFor, + MatLegacyProgressBarModule, + SelectComponent, + MatToolbarModule, + FlexModule, + MatLegacyButtonModule, + SnackbarDirective, + ClipboardModule, + CodeEditorComponent, + AsyncPipe, + KeyValuePipe, + ], }) export class ParamfilesComponent extends EntryFileSelector implements OnChanges { @Input() id: number; diff --git a/src/app/container/paramfiles/paramfiles.service.ts b/src/app/container/paramfiles/paramfiles.service.ts index 9755972adf..5079295317 100644 --- a/src/app/container/paramfiles/paramfiles.service.ts +++ b/src/app/container/paramfiles/paramfiles.service.ts @@ -41,7 +41,7 @@ export class ParamfilesService { return this.workflowsService.getTestParameterFiles1(id, versionName); } else { if (descriptor === 'CWL' || descriptor === 'WDL') { - return this.containersService.getTestParameterFiles(id, versionName, descriptor); + return this.containersService.getTestParameterFiles(id, descriptor, versionName); } } } diff --git a/src/app/container/refresh-tool-organization/refresh-tool-organization.component.spec.ts b/src/app/container/refresh-tool-organization/refresh-tool-organization.component.spec.ts index eada81a62c..ddf9207660 100644 --- a/src/app/container/refresh-tool-organization/refresh-tool-organization.component.spec.ts +++ b/src/app/container/refresh-tool-organization/refresh-tool-organization.component.spec.ts @@ -1,8 +1,8 @@ import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { MatButtonModule } from '@angular/material/button'; +import { MatLegacyButtonModule as MatButtonModule } from '@angular/material/legacy-button'; import { MatIconModule } from '@angular/material/icon'; -import { MatSnackBarModule } from '@angular/material/snack-bar'; -import { MatTooltipModule } from '@angular/material/tooltip'; +import { MatLegacySnackBarModule as MatSnackBarModule } from '@angular/material/legacy-snack-bar'; +import { MatLegacyTooltipModule as MatTooltipModule } from '@angular/material/legacy-tooltip'; import { ExtendedDockstoreToolService } from 'app/shared/extended-dockstoreTool/extended-dockstoreTool.service'; import { ProviderService } from 'app/shared/provider.service'; @@ -41,8 +41,7 @@ describe('RefreshToolOrganizationComponent', () => { beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [RefreshToolOrganizationComponent], - imports: [MatSnackBarModule, MatIconModule, MatButtonModule, MatTooltipModule], + imports: [MatSnackBarModule, MatIconModule, MatButtonModule, MatTooltipModule, RefreshToolOrganizationComponent], providers: [ { provide: UsersService, useClass: UsersStubService }, { provide: RefreshService, useClass: RefreshStubService }, diff --git a/src/app/container/refresh-tool-organization/refresh-tool-organization.component.ts b/src/app/container/refresh-tool-organization/refresh-tool-organization.component.ts index 7fe32a8463..a1d0ff60be 100644 --- a/src/app/container/refresh-tool-organization/refresh-tool-organization.component.ts +++ b/src/app/container/refresh-tool-organization/refresh-tool-organization.component.ts @@ -25,12 +25,16 @@ import { AlertService } from '../../shared/alert/state/alert.service'; import { RefreshOrganizationComponent } from '../../shared/refresh-organization/refresh-organization.component'; import { DockstoreTool } from '../../shared/openapi/model/dockstoreTool'; import { UserQuery } from '../../shared/user/user.query'; +import { AsyncPipe } from '@angular/common'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; @Component({ selector: 'app-refresh-tool-organization', // Note that the template and style is actually from the shared one (used by both my-workflows and my-tools) templateUrl: './../../shared/refresh-organization/refresh-organization.component.html', styleUrls: ['./../../shared/refresh-organization/refresh-organization.component.css'], + standalone: true, + imports: [MatLegacyButtonModule, AsyncPipe], }) export class RefreshToolOrganizationComponent extends RefreshOrganizationComponent implements OnInit { @Input() protected orgToolObject: OrgToolObject; diff --git a/src/app/container/refresh-wizard.module.ts b/src/app/container/refresh-wizard.module.ts deleted file mode 100644 index 3705a2a609..0000000000 --- a/src/app/container/refresh-wizard.module.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { RefreshAlertModule } from 'app/shared/alert/alert.module'; -import { CustomMaterialModule } from 'app/shared/modules/material.module'; - -import { FlexLayoutModule } from '@angular/flex-layout'; -import { RefreshWizardComponent } from './refresh-wizard/refresh-wizard.component'; - -@NgModule({ - imports: [CommonModule, RefreshAlertModule, CustomMaterialModule, FlexLayoutModule], - declarations: [RefreshWizardComponent], - exports: [RefreshWizardComponent], -}) -export class RefreshWizardModule {} diff --git a/src/app/container/refresh-wizard/refresh-wizard.component.ts b/src/app/container/refresh-wizard/refresh-wizard.component.ts index 89083d0b96..235e683bea 100644 --- a/src/app/container/refresh-wizard/refresh-wizard.component.ts +++ b/src/app/container/refresh-wizard/refresh-wizard.component.ts @@ -6,12 +6,41 @@ import { Observable } from 'rxjs'; import { RefreshWizardQuery } from '../state/refresh-wizard.query'; import { RefreshWizardService } from '../state/refresh-wizard.service'; import { RefreshWizardStore } from '../state/refresh-wizard.store'; +import { MatLegacyDialogModule } from '@angular/material/legacy-dialog'; +import { MatStepperModule } from '@angular/material/stepper'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { MatLegacyOptionModule } from '@angular/material/legacy-core'; +import { MatLegacySelectModule } from '@angular/material/legacy-select'; +import { MatLegacyFormFieldModule } from '@angular/material/legacy-form-field'; +import { MatIconModule } from '@angular/material/icon'; +import { MatLegacyCardModule } from '@angular/material/legacy-card'; +import { NgIf, NgFor, AsyncPipe } from '@angular/common'; +import { LoadingComponent } from '../../shared/loading/loading.component'; @Component({ selector: 'app-refresh-wizard', templateUrl: './refresh-wizard.component.html', styleUrls: ['./refresh-wizard.component.scss'], providers: [RefreshWizardQuery, RefreshWizardStore, RefreshWizardService], + standalone: true, + imports: [ + LoadingComponent, + NgIf, + MatLegacyCardModule, + MatIconModule, + MatLegacyFormFieldModule, + MatLegacySelectModule, + NgFor, + MatLegacyOptionModule, + MatLegacyButtonModule, + MatLegacyTooltipModule, + FlexModule, + MatStepperModule, + MatLegacyDialogModule, + AsyncPipe, + ], }) export class RefreshWizardComponent implements OnInit { loading$: Observable; diff --git a/src/app/container/register-tool/register-tool.component.html b/src/app/container/register-tool/register-tool.component.html index ebde07d712..7d585e3730 100644 --- a/src/app/container/register-tool/register-tool.component.html +++ b/src/app/container/register-tool/register-tool.component.html @@ -57,7 +57,7 @@

    Register Tool

    - +
    ; public isRefreshing$: Observable; - public gitHubAppInstallationLink$: Observable; public hostedTool: HostedTool = { path: '', registry: 'quay.io', @@ -166,7 +207,6 @@ export class RegisterToolComponent implements OnInit, AfterViewChecked, OnDestro ngOnInit() { this.loading$ = this.sessionQuery.loadingDialog$; - this.gitHubAppInstallationLink$ = this.sessionQuery.gitHubAppInstallationLandingPageLink$; this.registerToolService.toolRegisterError .pipe(takeUntil(this.ngUnsubscribe)) .subscribe((toolRegisterError) => (this.toolRegisterError = toolRegisterError)); diff --git a/src/app/container/register-tool/register-tool.service.ts b/src/app/container/register-tool/register-tool.service.ts index c6a291fb14..dc33d164bf 100644 --- a/src/app/container/register-tool/register-tool.service.ts +++ b/src/app/container/register-tool/register-tool.service.ts @@ -15,7 +15,7 @@ */ import { HttpErrorResponse } from '@angular/common/http'; import { Injectable } from '@angular/core'; -import { MatSnackBar } from '@angular/material/snack-bar'; +import { MatLegacySnackBar as MatSnackBar } from '@angular/material/legacy-snack-bar'; import { Router } from '@angular/router'; import { BehaviorSubject } from 'rxjs'; import { finalize } from 'rxjs/operators'; diff --git a/src/app/container/state/refresh-wizard.service.ts b/src/app/container/state/refresh-wizard.service.ts index baa54226d7..749a8b962e 100644 --- a/src/app/container/state/refresh-wizard.service.ts +++ b/src/app/container/state/refresh-wizard.service.ts @@ -1,6 +1,6 @@ import { HttpErrorResponse } from '@angular/common/http'; import { Injectable } from '@angular/core'; -import { MatSnackBar } from '@angular/material/snack-bar'; +import { MatLegacySnackBar as MatSnackBar } from '@angular/material/legacy-snack-bar'; import { transaction } from '@datorama/akita'; import { MytoolsService } from 'app/mytools/mytools.service'; import { TokenSource } from 'app/shared/enum/token-source.enum'; diff --git a/src/app/container/tool-file-editor/tool-file-editor.component.html b/src/app/container/tool-file-editor/tool-file-editor.component.html index 9e776d3704..7d2cd394be 100644 --- a/src/app/container/tool-file-editor/tool-file-editor.component.html +++ b/src/app/container/tool-file-editor/tool-file-editor.component.html @@ -22,7 +22,7 @@ [editing]="editing" [fileType]="'dockerfile'" [selectedVersion]="currentVersion" - [entryType]="'tool'" + [entryType]="EntryType.TOOL" [entrypath]="entrypath" > @@ -42,7 +42,7 @@ [fileType]="'descriptor'" [descriptorType]="selectedDescriptorType" [selectedVersion]="currentVersion" - [entryType]="'tool'" + [entryType]="EntryType.TOOL" [entrypath]="entrypath" > @@ -62,7 +62,7 @@ [fileType]="'testParam'" [descriptorType]="selectedDescriptorType" [selectedVersion]="currentVersion" - [entryType]="'tool'" + [entryType]="EntryType.TOOL" [entrypath]="entrypath" > diff --git a/src/app/container/tool-file-editor/tool-file-editor.component.spec.ts b/src/app/container/tool-file-editor/tool-file-editor.component.spec.ts index 89d5d56d2f..919f706777 100644 --- a/src/app/container/tool-file-editor/tool-file-editor.component.spec.ts +++ b/src/app/container/tool-file-editor/tool-file-editor.component.spec.ts @@ -2,16 +2,16 @@ import { ClipboardModule } from '@angular/cdk/clipboard'; import { HttpClientModule } from '@angular/common/http'; import { HttpClientTestingModule } from '@angular/common/http/testing'; import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { MatButtonModule } from '@angular/material/button'; -import { MatCardModule } from '@angular/material/card'; -import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatLegacyButtonModule as MatButtonModule } from '@angular/material/legacy-button'; +import { MatLegacyCardModule as MatCardModule } from '@angular/material/legacy-card'; +import { MatLegacyFormFieldModule as MatFormFieldModule } from '@angular/material/legacy-form-field'; import { MatIconModule } from '@angular/material/icon'; -import { MatInputModule } from '@angular/material/input'; -import { MatSelectModule } from '@angular/material/select'; -import { MatSnackBarModule } from '@angular/material/snack-bar'; -import { MatTabsModule } from '@angular/material/tabs'; +import { MatLegacyInputModule as MatInputModule } from '@angular/material/legacy-input'; +import { MatLegacySelectModule as MatSelectModule } from '@angular/material/legacy-select'; +import { MatLegacySnackBarModule as MatSnackBarModule } from '@angular/material/legacy-snack-bar'; +import { MatLegacyTabsModule as MatTabsModule } from '@angular/material/legacy-tabs'; import { MatToolbarModule } from '@angular/material/toolbar'; -import { MatTooltipModule } from '@angular/material/tooltip'; +import { MatLegacyTooltipModule as MatTooltipModule } from '@angular/material/legacy-tooltip'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { DescriptorLanguageService } from '../../shared/entry/descriptor-language.service'; import { SourceFile } from '../../shared/openapi'; @@ -35,7 +35,6 @@ describe('ToolFileEditorComponent', () => { beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [ToolFileEditorComponent, CodeEditorListComponent, CodeEditorComponent, PublicFileDownloadPipe, PrivateFilePathPipe], imports: [ MatButtonModule, MatTabsModule, @@ -51,6 +50,11 @@ describe('ToolFileEditorComponent', () => { ClipboardModule, HttpClientModule, HttpClientTestingModule, + ToolFileEditorComponent, + CodeEditorListComponent, + CodeEditorComponent, + PublicFileDownloadPipe, + PrivateFilePathPipe, ], providers: [ { provide: HostedService, useClass: HostedStubService }, @@ -82,6 +86,7 @@ describe('ToolFileEditorComponent', () => { path: 'foo.cwl', type: 'DOCKSTORE_CWL', content: content, + state: SourceFile.StateEnum.COMPLETE, }; component.originalSourceFiles = [sourceFile]; component.resetFiles(); diff --git a/src/app/container/tool-file-editor/tool-file-editor.component.ts b/src/app/container/tool-file-editor/tool-file-editor.component.ts index 62e3702416..cb4c6a5bd3 100644 --- a/src/app/container/tool-file-editor/tool-file-editor.component.ts +++ b/src/app/container/tool-file-editor/tool-file-editor.component.ts @@ -16,17 +16,35 @@ import { Component, Input } from '@angular/core'; import { AlertService } from '../../shared/alert/state/alert.service'; import { FileEditing } from '../../shared/file-editing'; -import { ContainertagsService, SourceFile, DockstoreTool, ToolDescriptor } from '../../shared/openapi'; +import { ContainertagsService, SourceFile, DockstoreTool, ToolDescriptor, EntryType } from '../../shared/openapi'; import { ContainerService } from './../../shared/container.service'; import { HostedService } from './../../shared/openapi/api/hosted.service'; import { Tag } from './../../shared/openapi/model/tag'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { NgIf } from '@angular/common'; +import { MatLegacyOptionModule } from '@angular/material/legacy-core'; +import { MatLegacySelectModule } from '@angular/material/legacy-select'; +import { MatLegacyFormFieldModule } from '@angular/material/legacy-form-field'; +import { CodeEditorListComponent } from '../../shared/code-editor-list/code-editor-list.component'; +import { MatLegacyTabsModule } from '@angular/material/legacy-tabs'; @Component({ selector: 'app-tool-file-editor', templateUrl: './tool-file-editor.component.html', styleUrls: ['./tool-file-editor.component.scss'], + standalone: true, + imports: [ + MatLegacyTabsModule, + CodeEditorListComponent, + MatLegacyFormFieldModule, + MatLegacySelectModule, + MatLegacyOptionModule, + NgIf, + MatLegacyButtonModule, + ], }) export class ToolFileEditorComponent extends FileEditing { + public EntryType = EntryType; dockerFile: Array = []; descriptorFiles: Array = []; testParameterFiles: Array = []; diff --git a/src/app/container/version-modal/version-modal.component.spec.ts b/src/app/container/version-modal/version-modal.component.spec.ts index b076aa3a7c..695fe34ffc 100644 --- a/src/app/container/version-modal/version-modal.component.spec.ts +++ b/src/app/container/version-modal/version-modal.component.spec.ts @@ -3,8 +3,8 @@ import { NO_ERRORS_SCHEMA } from '@angular/core'; import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; import { FormsModule } from '@angular/forms'; -import { MatDialogModule } from '@angular/material/dialog'; -import { MatSnackBarModule } from '@angular/material/snack-bar'; +import { MatLegacyDialogModule as MatDialogModule } from '@angular/material/legacy-dialog'; +import { MatLegacySnackBarModule as MatSnackBarModule } from '@angular/material/legacy-snack-bar'; import { ListContainersService } from '../../containers/list/list.service'; import { ContainerService } from '../../shared/container.service'; import { DateService } from '../../shared/date.service'; @@ -32,8 +32,7 @@ describe('VersionModalComponent', () => { waitForAsync(() => { TestBed.configureTestingModule({ schemas: [NO_ERRORS_SCHEMA], - declarations: [VersionModalComponent], - imports: [FormsModule, ClipboardModule, MatSnackBarModule, MatDialogModule], + imports: [FormsModule, ClipboardModule, MatSnackBarModule, MatDialogModule, VersionModalComponent], providers: [ { provide: ParamfilesService, useClass: ParamFilesStubService }, { provide: VersionModalService, useClass: VersionModalStubService }, diff --git a/src/app/container/version-modal/version-modal.component.ts b/src/app/container/version-modal/version-modal.component.ts index bac17da593..d0c517597e 100644 --- a/src/app/container/version-modal/version-modal.component.ts +++ b/src/app/container/version-modal/version-modal.component.ts @@ -14,8 +14,8 @@ * limitations under the License. */ import { AfterViewChecked, Component, OnDestroy, OnInit, ViewChild } from '@angular/core'; -import { NgForm } from '@angular/forms'; -import { MatDialog } from '@angular/material/dialog'; +import { NgForm, FormsModule } from '@angular/forms'; +import { MatLegacyDialog as MatDialog, MatLegacyDialogModule } from '@angular/material/legacy-dialog'; import { Base } from 'app/shared/base'; import { forkJoin } from 'rxjs'; import { debounceTime, finalize, takeUntil } from 'rxjs/operators'; @@ -35,11 +35,36 @@ import { ToolQuery } from '../../shared/tool/tool.query'; import { formErrors, validationDescriptorPatterns, validationMessages } from '../../shared/validationMessages.model'; import { ParamfilesService } from '../paramfiles/paramfiles.service'; import { VersionModalService } from './version-modal.service'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { ClipboardModule } from '@angular/cdk/clipboard'; +import { SnackbarDirective } from '../../shared/snackbar.directive'; +import { MatLegacyCardModule } from '@angular/material/legacy-card'; +import { MatIconModule } from '@angular/material/icon'; +import { ExtendedModule } from '@ngbracket/ngx-layout/extended'; +import { NgIf, NgFor, NgClass } from '@angular/common'; +import { LoadingComponent } from '../../shared/loading/loading.component'; +import { AlertComponent } from '../../shared/alert/alert.component'; @Component({ selector: 'app-version-modal', templateUrl: './version-modal.component.html', styleUrls: ['./version-modal.component.css'], + standalone: true, + imports: [ + MatLegacyDialogModule, + AlertComponent, + LoadingComponent, + NgIf, + FormsModule, + NgFor, + NgClass, + ExtendedModule, + MatIconModule, + MatLegacyCardModule, + SnackbarDirective, + ClipboardModule, + MatLegacyButtonModule, + ], }) export class VersionModalComponent extends Base implements OnInit, AfterViewChecked, OnDestroy { public TagEditorMode = TagEditorMode; diff --git a/src/app/container/versions/versions.component.html b/src/app/container/versions/versions.component.html index d518987d52..7edabb1ff8 100644 --- a/src/app/container/versions/versions.component.html +++ b/src/app/container/versions/versions.component.html @@ -134,7 +134,7 @@ - Actions + {{ this.publicPage ? 'Overview' : 'Actions' }} diff --git a/src/app/container/versions/versions.component.ts b/src/app/container/versions/versions.component.ts index 419c91dd9d..1fb4abf7a9 100644 --- a/src/app/container/versions/versions.component.ts +++ b/src/app/container/versions/versions.component.ts @@ -14,8 +14,8 @@ * limitations under the License. */ import { AfterViewInit, Component, EventEmitter, Input, OnChanges, OnInit, Output, ViewChild } from '@angular/core'; -import { MatSort } from '@angular/material/sort'; -import { MatTableDataSource } from '@angular/material/table'; +import { MatSort, MatSortModule } from '@angular/material/sort'; +import { MatLegacyTableDataSource as MatTableDataSource, MatLegacyTableModule } from '@angular/material/legacy-table'; import { faCodeBranch, faTag } from '@fortawesome/free-solid-svg-icons'; import { takeUntil } from 'rxjs/operators'; import { AlertService } from '../../shared/alert/state/alert.service'; @@ -28,11 +28,40 @@ import { VersionVerifiedPlatform, Tag } from '../../shared/openapi'; import { SessionQuery } from '../../shared/session/session.query'; import { DockstoreTool } from '../../shared/openapi/model/dockstoreTool'; import { Versions } from '../../shared/versions'; +import { DescriptorLanguageVersionsPipe } from '../../shared/entry/descriptor-language-versions.pipe'; +import { VerifiedPlatformsPipe } from '../../shared/entry/verified-platforms.pipe'; +import { CommitUrlPipe } from '../../shared/entry/commit-url.pipe'; +import { ExtendedModule } from '@ngbracket/ngx-layout/extended'; +import { ViewContainerComponent } from '../view/view.component'; +import { FontAwesomeModule } from '@fortawesome/angular-fontawesome'; +import { MatLegacyChipsModule } from '@angular/material/legacy-chips'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { MatIconModule } from '@angular/material/icon'; +import { NgIf, NgClass, DatePipe } from '@angular/common'; +import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; @Component({ selector: 'app-versions-container', templateUrl: './versions.component.html', styleUrls: ['./../../workflow/versions/versions.component.scss'], + standalone: true, + imports: [ + MatLegacyTableModule, + MatSortModule, + MatLegacyTooltipModule, + NgIf, + MatIconModule, + FlexModule, + MatLegacyChipsModule, + FontAwesomeModule, + ViewContainerComponent, + NgClass, + ExtendedModule, + DatePipe, + CommitUrlPipe, + VerifiedPlatformsPipe, + DescriptorLanguageVersionsPipe, + ], }) export class VersionsContainerComponent extends Versions implements OnInit, OnChanges, AfterViewInit { faTag = faTag; diff --git a/src/app/container/view/view.component.ts b/src/app/container/view/view.component.ts index a58db84a02..7eb1a03749 100644 --- a/src/app/container/view/view.component.ts +++ b/src/app/container/view/view.component.ts @@ -15,7 +15,7 @@ */ import { HttpErrorResponse } from '@angular/common/http'; import { Component, OnInit } from '@angular/core'; -import { MatDialog } from '@angular/material/dialog'; +import { MatLegacyDialog as MatDialog } from '@angular/material/legacy-dialog'; import { ViewService } from 'app/container/view/view.service'; import { AlertQuery } from 'app/shared/alert/state/alert.query'; import { Observable } from 'rxjs'; @@ -33,11 +33,16 @@ import { ToolQuery } from '../../shared/tool/tool.query'; import { View } from '../../shared/view'; import { VersionModalComponent } from '../version-modal/version-modal.component'; import { VersionModalService } from '../version-modal/version-modal.service'; +import { MatLegacyMenuModule } from '@angular/material/legacy-menu'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { NgIf, AsyncPipe } from '@angular/common'; @Component({ selector: 'app-view-container', templateUrl: './view.component.html', styleUrls: ['./view.component.css'], + standalone: true, + imports: [NgIf, MatLegacyButtonModule, MatLegacyMenuModule, AsyncPipe], }) // This is actually the actions dropdown for tags export class ViewContainerComponent extends View implements OnInit { diff --git a/src/app/containers/containers.component.ts b/src/app/containers/containers.component.ts index be2728f8c8..90f58478ff 100644 --- a/src/app/containers/containers.component.ts +++ b/src/app/containers/containers.component.ts @@ -15,15 +15,21 @@ */ import { Component } from '@angular/core'; -import { ActivatedRoute } from '@angular/router'; +import { ActivatedRoute, RouterLink, RouterOutlet } from '@angular/router'; import { SessionQuery } from 'app/shared/session/session.query'; import { SessionService } from 'app/shared/session/session.service'; import { Observable } from 'rxjs'; import { UrlResolverService } from '../shared/url-resolver.service'; +import { ExtendedModule } from '@ngbracket/ngx-layout/extended'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { NgIf, AsyncPipe, TitleCasePipe } from '@angular/common'; +import { HeaderComponent } from '../header/header.component'; @Component({ selector: 'app-containers', templateUrl: './containers.component.html', + standalone: true, + imports: [HeaderComponent, NgIf, FlexModule, RouterLink, ExtendedModule, RouterOutlet, AsyncPipe, TitleCasePipe], }) export class ContainersComponent { public entryName: string = ''; diff --git a/src/app/containers/containers.module.ts b/src/app/containers/containers.module.ts deleted file mode 100644 index f15885f252..0000000000 --- a/src/app/containers/containers.module.ts +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright 2017 OICR - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { MarkdownModule } from 'ngx-markdown'; - -import { ContainerModule } from '../shared/modules/container.module'; -import { HeaderModule } from '../shared/modules/header.module'; -import { ListContainersModule } from '../shared/modules/list-containers.module'; -import { SelectModule } from '../shared/modules/select.module'; -import { ContainersComponent } from './containers.component'; -import { containersRouting } from './containers.routing'; -import { SearchContainersComponent } from './search/search.component'; - -@NgModule({ - declarations: [ContainersComponent, SearchContainersComponent], - imports: [CommonModule, HeaderModule, SelectModule, ListContainersModule, ContainerModule, containersRouting, MarkdownModule], -}) -export class ContainersModule {} diff --git a/src/app/containers/containers.routing.ts b/src/app/containers/containers.routing.ts index 83b2078ac6..796689d95a 100644 --- a/src/app/containers/containers.routing.ts +++ b/src/app/containers/containers.routing.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { RouterModule, Routes } from '@angular/router'; +import { Routes } from '@angular/router'; import { EntryType } from 'app/shared/enum/entry-type'; import { ContainerComponent } from '../container/container.component'; import { ContainersComponent } from './containers.component'; @@ -32,4 +32,4 @@ const CONTAINERS_ROUTES: Routes = [ }, ]; -export const containersRouting = RouterModule.forChild(CONTAINERS_ROUTES); +export const containersRouting = CONTAINERS_ROUTES; diff --git a/src/app/containers/list/list.component.ts b/src/app/containers/list/list.component.ts index 2d2ea2beb6..f8342c4b9f 100644 --- a/src/app/containers/list/list.component.ts +++ b/src/app/containers/list/list.component.ts @@ -25,11 +25,45 @@ import { PaginatorService } from '../../shared/state/paginator.service'; import { ContainersService, DockstoreTool } from '../../shared/openapi'; import { ToolLister } from '../../shared/tool-lister'; import { PublishedToolsDataSource } from './published-tools.datasource'; +import { MatLegacyPaginatorModule } from '@angular/material/legacy-paginator'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { FontAwesomeModule } from '@fortawesome/angular-fontawesome'; +import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; +import { MatIconModule } from '@angular/material/icon'; +import { RouterLink } from '@angular/router'; +import { PrivateIconComponent } from '../../shared/private-icon/private-icon.component'; +import { ExtendedModule } from '@ngbracket/ngx-layout/extended'; +import { MatSortModule } from '@angular/material/sort'; +import { MatLegacyTableModule } from '@angular/material/legacy-table'; +import { MatLegacyInputModule } from '@angular/material/legacy-input'; +import { MatLegacyFormFieldModule } from '@angular/material/legacy-form-field'; +import { MatLegacyProgressBarModule } from '@angular/material/legacy-progress-bar'; +import { NgIf, NgFor, AsyncPipe, UpperCasePipe } from '@angular/common'; @Component({ selector: 'app-list-containers', templateUrl: './list.component.html', styleUrls: ['../../shared/styles/entry-table.scss', './list.component.scss'], + standalone: true, + imports: [ + NgIf, + MatLegacyProgressBarModule, + MatLegacyFormFieldModule, + MatLegacyInputModule, + MatLegacyTableModule, + MatSortModule, + ExtendedModule, + PrivateIconComponent, + RouterLink, + MatIconModule, + MatLegacyTooltipModule, + NgFor, + FontAwesomeModule, + MatLegacyButtonModule, + MatLegacyPaginatorModule, + AsyncPipe, + UpperCasePipe, + ], }) export class ListContainersComponent extends ToolLister implements OnInit { @Input() previewMode: boolean; diff --git a/src/app/containers/search/search.component.ts b/src/app/containers/search/search.component.ts index 9df41d1c18..9b14f51e2b 100644 --- a/src/app/containers/search/search.component.ts +++ b/src/app/containers/search/search.component.ts @@ -15,10 +15,13 @@ */ import { Component } from '@angular/core'; +import { ListContainersComponent } from '../list/list.component'; @Component({ selector: 'app-search-containers', templateUrl: './search.component.html', styleUrls: ['./search.component.css'], + standalone: true, + imports: [ListContainersComponent], }) export class SearchContainersComponent {} diff --git a/src/app/descriptor-languages/CWL.ts b/src/app/descriptor-languages/CWL.ts index 882de7e6d3..d742072c1b 100644 --- a/src/app/descriptor-languages/CWL.ts +++ b/src/app/descriptor-languages/CWL.ts @@ -7,7 +7,7 @@ export const extendedCWL: ExtendedDescriptorLanguageBean = { shortFriendlyName: 'CWL', friendlyName: 'Common Workflow Language', defaultDescriptorPath: '/Dockstore.cwl', - descriptorPathPattern: '^/([^/?:*|<>]+/)*[^/?:*|<>]+.(cwl|yaml|yml)', + descriptorPathPattern: '^\\/([^\\/?:*\\|<>]+\\/)*[^\\/?:*\\|<>]+.(cwl|yaml|yml)$', descriptorPathPlaceholder: 'e.g. /Dockstore.cwl', toolDescriptorEnum: ToolDescriptor.TypeEnum.CWL, workflowDescriptorEnum: Workflow.DescriptorTypeEnum.CWL, diff --git a/src/app/descriptor-languages/Galaxy.ts b/src/app/descriptor-languages/Galaxy.ts index 30ed242d46..37cbf82d5c 100644 --- a/src/app/descriptor-languages/Galaxy.ts +++ b/src/app/descriptor-languages/Galaxy.ts @@ -7,7 +7,7 @@ export const extendedGalaxy: ExtendedDescriptorLanguageBean = { shortFriendlyName: 'Galaxy', friendlyName: 'Galaxy Workflow Format', defaultDescriptorPath: '/workflow-name.yml', - descriptorPathPattern: '^/([^/?:*|<>]+/)*[^/?:*|<>]+.(ga|yaml|yml)', + descriptorPathPattern: '^\\/([^\\/?:*\\|<>]+\\/)*[^\\/?:*\\|<>]+.(ga|yaml|yml)$', descriptorPathPlaceholder: 'e.g. /workflow-name.yml', toolDescriptorEnum: ToolDescriptor.TypeEnum.GALAXY, workflowDescriptorEnum: Workflow.DescriptorTypeEnum.Gxformat2, @@ -18,7 +18,7 @@ export const extendedGalaxy: ExtendedDescriptorLanguageBean = { rowIdentifier: 'tool\xa0ID', workflowStepHeader: 'Tool Excerpt', }, - workflowLaunchSupport: false, + workflowLaunchSupport: true, testParameterFileType: SourceFile.TypeEnum.GXFORMAT2TESTFILE, fileTabs: [ { diff --git a/src/app/descriptor-languages/Jupyter.ts b/src/app/descriptor-languages/Jupyter.ts index e6ada828ec..d3c3aa366b 100644 --- a/src/app/descriptor-languages/Jupyter.ts +++ b/src/app/descriptor-languages/Jupyter.ts @@ -10,7 +10,7 @@ export const extendedJupyter: ExtendedDescriptorLanguageBean = { shortFriendlyName: 'Jupyter', friendlyName: 'Jupyter notebook', defaultDescriptorPath: '/notebook.ipynb', - descriptorPathPattern: '^/([^/?:*|<>]+/)*[^/?:*|<>]+.ipynb$', + descriptorPathPattern: '^^\\/([^\\/?:*\\|<>]+\\/)*[^\\/?:*\\|<>]+.ipynb$', descriptorPathPlaceholder: 'e.g. /notebook.ipynb', toolDescriptorEnum: ToolDescriptor.TypeEnum.JUPYTER, workflowDescriptorEnum: Workflow.DescriptorTypeEnum.Jupyter, diff --git a/src/app/descriptor-languages/Nextflow.ts b/src/app/descriptor-languages/Nextflow.ts index c40e73e591..a6aab51f0b 100644 --- a/src/app/descriptor-languages/Nextflow.ts +++ b/src/app/descriptor-languages/Nextflow.ts @@ -7,7 +7,7 @@ export const extendedNFL: ExtendedDescriptorLanguageBean = { shortFriendlyName: 'Nextflow', friendlyName: 'Nextflow', defaultDescriptorPath: '/nextflow.config', - descriptorPathPattern: '^/([^/?:*|<>]+/)*[^/?:*|<>]+.(config)', + descriptorPathPattern: '^\\/([^\\/?:*\\|<>]+\\/)*[^\\/?:*\\|<>]+.(config)$', descriptorPathPlaceholder: 'e.g. /nextflow.config', toolDescriptorEnum: ToolDescriptor.TypeEnum.NFL, workflowDescriptorEnum: Workflow.DescriptorTypeEnum.NFL, diff --git a/src/app/descriptor-languages/Snakemake.ts b/src/app/descriptor-languages/Snakemake.ts index 3ea99ba7ec..51299c79cf 100644 --- a/src/app/descriptor-languages/Snakemake.ts +++ b/src/app/descriptor-languages/Snakemake.ts @@ -7,7 +7,7 @@ export const extendedSMK: ExtendedDescriptorLanguageBean = { shortFriendlyName: 'Snakemake', friendlyName: 'Snakemake', defaultDescriptorPath: '/Snakefile', - descriptorPathPattern: '^/([^/?:*|<>]++/)*(Snakefile|[^./?:*|<>]++.smk))$', + descriptorPathPattern: '^\\/([^\\/?:*\\|<>]+\\/)*(Snakefile|[^.\\/?:*\\|<>]+.smk)$', descriptorPathPlaceholder: 'e.g. /Snakefile', toolDescriptorEnum: ToolDescriptor.TypeEnum.SMK, diff --git a/src/app/descriptor-languages/WDL.ts b/src/app/descriptor-languages/WDL.ts index ed3f0b1ffb..e221ce7c20 100644 --- a/src/app/descriptor-languages/WDL.ts +++ b/src/app/descriptor-languages/WDL.ts @@ -7,7 +7,7 @@ export const extendedWDL: ExtendedDescriptorLanguageBean = { shortFriendlyName: 'WDL', friendlyName: 'Workflow Description Language', defaultDescriptorPath: '/Dockstore.wdl', - descriptorPathPattern: '^/([^/?:*|<>]+/)*[^/?:*|<>]+.wdl$', + descriptorPathPattern: '^\\/([^\\/?:*\\|<>]+\\/)*[^\\/?:*\\|<>]+.wdl$', descriptorPathPlaceholder: 'e.g. /Dockstore.wdl', toolDescriptorEnum: ToolDescriptor.TypeEnum.WDL, workflowDescriptorEnum: Workflow.DescriptorTypeEnum.WDL, diff --git a/src/app/docs/docs.component.spec.ts b/src/app/docs/docs.component.spec.ts index 9c398e7883..29f827ffb5 100644 --- a/src/app/docs/docs.component.spec.ts +++ b/src/app/docs/docs.component.spec.ts @@ -15,7 +15,7 @@ */ import { TestBed, waitForAsync } from '@angular/core/testing'; -import { HeaderModule } from './../shared/modules/header.module'; +import { MatLegacySnackBarModule } from '@angular/material/legacy-snack-bar'; import { RouterLinkStubDirective, RouterOutletStubComponent } from './../test/router-stubs'; import { DocsComponent } from './docs.component'; @@ -25,24 +25,26 @@ import { DocsComponent } from './docs.component'; describe('DocsComponent', () => { // let component: DocsComponent; // let fixture: ComponentFixture; + let fixture; + let component; beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [DocsComponent, RouterLinkStubDirective, RouterOutletStubComponent], - imports: [HeaderModule], + declarations: [RouterLinkStubDirective, RouterOutletStubComponent], + imports: [DocsComponent, MatLegacySnackBarModule], }).compileComponents(); }) ); - // beforeEach(() => { - // fixture = TestBed.createComponent(DocsComponent); - // component = fixture.componentInstance; - // fixture.detectChanges(); - // }); + beforeEach(() => { + fixture = TestBed.createComponent(DocsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); - // it('should create', () => { - // expect(component).toBeTruthy(); - // }); + it('should create', () => { + expect(component).toBeTruthy(); + }); // it('should render subject', () => { // const h3 = fixture.debugElement.query(By.css('h3')); diff --git a/src/app/docs/docs.component.ts b/src/app/docs/docs.component.ts index 2a1d956085..4972692973 100644 --- a/src/app/docs/docs.component.ts +++ b/src/app/docs/docs.component.ts @@ -16,6 +16,7 @@ import { Component, OnInit } from '@angular/core'; import { Dockstore } from '../shared/dockstore.model'; +import { HeaderComponent } from '../header/header.component'; interface DocObject { existingPath: string; @@ -25,6 +26,8 @@ interface DocObject { @Component({ selector: 'app-docs', templateUrl: './docs.component.html', + standalone: true, + imports: [HeaderComponent], }) export class DocsComponent implements OnInit { // Array of doc objects, where existingPath is the path on Dockstore, and newPath is the new path on the docs page diff --git a/src/app/docs/docs.module.ts b/src/app/docs/docs.module.ts index 8ed8b6cc10..a8008aafa4 100644 --- a/src/app/docs/docs.module.ts +++ b/src/app/docs/docs.module.ts @@ -22,8 +22,7 @@ import { docsRouting } from './docs.routing'; import { DocsComponent } from './docs.component'; @NgModule({ - declarations: [DocsComponent], - imports: [CommonModule, docsRouting, HeaderModule], + imports: [CommonModule, docsRouting, HeaderModule, DocsComponent], providers: [], }) export class DocsModule {} diff --git a/src/app/docs/docs.routing.ts b/src/app/docs/docs.routing.ts index 7bedf18653..996783caef 100644 --- a/src/app/docs/docs.routing.ts +++ b/src/app/docs/docs.routing.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { RouterModule, Routes } from '@angular/router'; +import { Routes } from '@angular/router'; import { DocsComponent } from './docs.component'; @@ -25,4 +25,4 @@ const DOC_ROUTES: Routes = [ }, ]; -export const docsRouting = RouterModule.forChild(DOC_ROUTES); +export const docsRouting = DOC_ROUTES; diff --git a/src/app/entry/archive/dialog/archive-entry-dialog.component.spec.ts b/src/app/entry/archive/dialog/archive-entry-dialog.component.spec.ts index 1b82e75d9d..a88ab4c7c8 100644 --- a/src/app/entry/archive/dialog/archive-entry-dialog.component.spec.ts +++ b/src/app/entry/archive/dialog/archive-entry-dialog.component.spec.ts @@ -1,8 +1,8 @@ import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog'; +import { MatLegacyDialogRef as MatDialogRef, MAT_LEGACY_DIALOG_DATA as MAT_DIALOG_DATA } from '@angular/material/legacy-dialog'; import { NO_ERRORS_SCHEMA } from '@angular/core'; -import { CustomMaterialModule } from '../../../shared/modules/material.module'; +import { MatLegacySnackBarModule } from '@angular/material/legacy-snack-bar'; import { EntriesService } from '../../../shared/openapi'; import { EntriesStubService } from '../../../test/service-stubs'; import { ArchiveEntryDialogComponent } from './archive-entry-dialog.component'; @@ -14,9 +14,8 @@ describe('ArchiveEntryDialogComponent', () => { beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [ArchiveEntryDialogComponent], schemas: [NO_ERRORS_SCHEMA], - imports: [CustomMaterialModule], + imports: [ArchiveEntryDialogComponent, MatLegacySnackBarModule], providers: [ { provide: EntriesService, useClass: EntriesStubService }, { diff --git a/src/app/entry/archive/dialog/archive-entry-dialog.component.ts b/src/app/entry/archive/dialog/archive-entry-dialog.component.ts index bb072819a2..a8bdcbbefd 100644 --- a/src/app/entry/archive/dialog/archive-entry-dialog.component.ts +++ b/src/app/entry/archive/dialog/archive-entry-dialog.component.ts @@ -15,16 +15,26 @@ */ import { HttpErrorResponse } from '@angular/common/http'; import { Component, Inject } from '@angular/core'; -import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog'; -import { MatSnackBar } from '@angular/material/snack-bar'; +import { + MatLegacyDialogRef as MatDialogRef, + MAT_LEGACY_DIALOG_DATA as MAT_DIALOG_DATA, + MatLegacyDialogModule, +} from '@angular/material/legacy-dialog'; +import { MatLegacySnackBar as MatSnackBar } from '@angular/material/legacy-snack-bar'; import { Router } from '@angular/router'; import { Entry, EntriesService, DockstoreTool, Workflow } from '../../../shared/openapi'; import { AlertService } from '../../../shared/alert/state/alert.service'; +import { TitleCasePipe } from '@angular/common'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { AlertComponent } from '../../../shared/alert/alert.component'; @Component({ selector: 'app-archive-entry-dialog', templateUrl: './archive-entry-dialog.component.html', styleUrls: ['./archive-entry-dialog.component.scss'], + standalone: true, + imports: [MatLegacyDialogModule, AlertComponent, FlexModule, MatLegacyButtonModule, TitleCasePipe], }) export class ArchiveEntryDialogComponent { clicked: boolean; diff --git a/src/app/entry/current-collections.module.ts b/src/app/entry/current-collections.module.ts index 117ad54d87..ae2b370e88 100644 --- a/src/app/entry/current-collections.module.ts +++ b/src/app/entry/current-collections.module.ts @@ -1,15 +1,13 @@ import { CommonModule } from '@angular/common'; import { NgModule } from '@angular/core'; -import { FlexLayoutModule } from '@angular/flex-layout'; +import { FlexLayoutModule } from '@ngbracket/ngx-layout'; import { RouterModule } from '@angular/router'; -import { ImgFallbackModule } from '../shared/modules/img-fallback.module'; -import { CustomMaterialModule } from '../shared/modules/material.module'; + import { PipeModule } from '../shared/pipe/pipe.module'; import { CurrentCollectionsComponent } from './current-collections/current-collections.component'; @NgModule({ - imports: [CommonModule, CustomMaterialModule, FlexLayoutModule, RouterModule, ImgFallbackModule, PipeModule], - declarations: [CurrentCollectionsComponent], + imports: [CommonModule, FlexLayoutModule, RouterModule, PipeModule, CurrentCollectionsComponent], exports: [CurrentCollectionsComponent], }) export class CurrentCollectionsModule {} diff --git a/src/app/entry/current-collections/current-collections.component.ts b/src/app/entry/current-collections/current-collections.component.ts index ae2d4ad3d9..6e0d8189af 100644 --- a/src/app/entry/current-collections/current-collections.component.ts +++ b/src/app/entry/current-collections/current-collections.component.ts @@ -1,5 +1,5 @@ -import { Component, Input, OnChanges, OnInit, SimpleChanges, Version } from '@angular/core'; -import { MatDialog } from '@angular/material/dialog'; +import { Component, Input, OnChanges, OnInit, SimpleChanges } from '@angular/core'; +import { MatLegacyDialog as MatDialog } from '@angular/material/legacy-dialog'; import { ID } from '@datorama/akita'; import { Observable } from 'rxjs'; import { AddEntryComponent } from '../../organizations/collection/add-entry/add-entry.component'; @@ -8,11 +8,38 @@ import { TrackLoginService } from '../../shared/track-login.service'; import { CurrentCollectionsQuery } from '../state/current-collections.query'; import { CurrentCollectionsService } from '../state/current-collections.service'; import { OrgLogoService } from '../../shared/org-logo.service'; +import { GravatarPipe } from '../../gravatar/gravatar.pipe'; +import { RouterLinkActive, RouterLink } from '@angular/router'; +import { ImgFallbackDirective } from '../../shared/img-fallback.directive'; +import { MatDividerModule } from '@angular/material/divider'; +import { ExtendedModule } from '@ngbracket/ngx-layout/extended'; +import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { MatLegacyCardModule } from '@angular/material/legacy-card'; +import { NgIf, NgFor, NgTemplateOutlet, AsyncPipe } from '@angular/common'; @Component({ selector: 'app-current-collections', templateUrl: './current-collections.component.html', styleUrls: ['./current-collections.component.scss'], + standalone: true, + imports: [ + NgIf, + MatLegacyCardModule, + FlexModule, + MatLegacyButtonModule, + MatLegacyTooltipModule, + ExtendedModule, + MatDividerModule, + NgFor, + ImgFallbackDirective, + NgTemplateOutlet, + RouterLinkActive, + RouterLink, + AsyncPipe, + GravatarPipe, + ], }) export class CurrentCollectionsComponent implements OnInit, OnChanges { @Input() id: number; diff --git a/src/app/entry/delete/dialog/delete-entry-dialog.component.spec.ts b/src/app/entry/delete/dialog/delete-entry-dialog.component.spec.ts index c1b2a06bb0..e4345731ae 100644 --- a/src/app/entry/delete/dialog/delete-entry-dialog.component.spec.ts +++ b/src/app/entry/delete/dialog/delete-entry-dialog.component.spec.ts @@ -1,8 +1,8 @@ import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog'; +import { MatLegacyDialogRef as MatDialogRef, MAT_LEGACY_DIALOG_DATA as MAT_DIALOG_DATA } from '@angular/material/legacy-dialog'; import { NO_ERRORS_SCHEMA } from '@angular/core'; -import { CustomMaterialModule } from '../../../shared/modules/material.module'; +import { MatLegacySnackBarModule } from '@angular/material/legacy-snack-bar'; import { EntriesService } from '../../../shared/openapi'; import { EntriesStubService } from '../../../test/service-stubs'; import { DeleteEntryDialogComponent } from './delete-entry-dialog.component'; @@ -14,9 +14,8 @@ describe('DeleteEntryDialogComponent', () => { beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [DeleteEntryDialogComponent], schemas: [NO_ERRORS_SCHEMA], - imports: [CustomMaterialModule], + imports: [DeleteEntryDialogComponent, MatLegacySnackBarModule], providers: [ { provide: EntriesService, useClass: EntriesStubService }, { diff --git a/src/app/entry/delete/dialog/delete-entry-dialog.component.ts b/src/app/entry/delete/dialog/delete-entry-dialog.component.ts index c9d27f3eb6..4ffa06bcb9 100644 --- a/src/app/entry/delete/dialog/delete-entry-dialog.component.ts +++ b/src/app/entry/delete/dialog/delete-entry-dialog.component.ts @@ -15,16 +15,26 @@ */ import { HttpErrorResponse } from '@angular/common/http'; import { Component, Inject } from '@angular/core'; -import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog'; -import { MatSnackBar } from '@angular/material/snack-bar'; +import { + MatLegacyDialogRef as MatDialogRef, + MAT_LEGACY_DIALOG_DATA as MAT_DIALOG_DATA, + MatLegacyDialogModule, +} from '@angular/material/legacy-dialog'; +import { MatLegacySnackBar as MatSnackBar } from '@angular/material/legacy-snack-bar'; import { Router } from '@angular/router'; import { Entry, EntryType, EntriesService, DockstoreTool, Workflow } from '../../../shared/openapi'; import { AlertService } from '../../../shared/alert/state/alert.service'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { NgIf, TitleCasePipe } from '@angular/common'; +import { AlertComponent } from '../../../shared/alert/alert.component'; @Component({ selector: 'app-delete-entry-dialog', templateUrl: './delete-entry-dialog.component.html', styleUrls: ['./delete-entry-dialog.component.scss'], + standalone: true, + imports: [MatLegacyDialogModule, AlertComponent, NgIf, FlexModule, MatLegacyButtonModule, TitleCasePipe], }) export class DeleteEntryDialogComponent { clicked: boolean; diff --git a/src/app/entry/file-path.pipe.ts b/src/app/entry/file-path.pipe.ts index 5877d90f1a..961c086bd5 100644 --- a/src/app/entry/file-path.pipe.ts +++ b/src/app/entry/file-path.pipe.ts @@ -3,7 +3,10 @@ import { Pipe, PipeTransform } from '@angular/core'; * File paths are show relative to the primary descriptor, but the .dockstore.yml file can only ever be in one place * so only display it as /.dockstore.yml */ -@Pipe({ name: 'filePathPipe' }) +@Pipe({ + name: 'filePathPipe', + standalone: true, +}) export class FilePathPipe implements PipeTransform { transform(filePath: string): string { if (filePath.endsWith('.dockstore.yml')) { diff --git a/src/app/entry/router-link.pipe.ts b/src/app/entry/router-link.pipe.ts index e5bcf68345..a12f2bc261 100644 --- a/src/app/entry/router-link.pipe.ts +++ b/src/app/entry/router-link.pipe.ts @@ -4,6 +4,7 @@ import { EntryTypeMetadataService } from './type-metadata/entry-type-metadata.se @Pipe({ name: 'routerLink', + standalone: true, }) export class RouterLinkPipe implements PipeTransform { constructor(private entryTypeMetadataService: EntryTypeMetadataService) {} diff --git a/src/app/file-tree/file-tree.component.spec.ts b/src/app/file-tree/file-tree.component.spec.ts index f8e96508e4..14c04ef6b9 100644 --- a/src/app/file-tree/file-tree.component.spec.ts +++ b/src/app/file-tree/file-tree.component.spec.ts @@ -1,9 +1,15 @@ import { HttpClientTestingModule } from '@angular/common/http/testing'; import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { MatButtonModule } from '@angular/material/button'; -import { MAT_DIALOG_DATA, MatDialogModule, MatDialogRef } from '@angular/material/dialog'; +import { MatLegacyButtonModule as MatButtonModule } from '@angular/material/legacy-button'; +import { + MAT_LEGACY_DIALOG_DATA as MAT_DIALOG_DATA, + MatLegacyDialogModule as MatDialogModule, + MatLegacyDialogRef as MatDialogRef, +} from '@angular/material/legacy-dialog'; import { MatIconModule } from '@angular/material/icon'; +import { MatLegacyInputModule } from '@angular/material/legacy-input'; import { MatTreeModule } from '@angular/material/tree'; +import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { SourceFile } from 'app/shared/openapi'; import { DescriptorLanguageService } from '../shared/entry/descriptor-language.service'; import { SourceFileTabsService } from '../source-file-tabs/source-file-tabs.service'; @@ -18,8 +24,16 @@ describe('FileTreeComponent', () => { beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [FileTreeComponent], - imports: [MatButtonModule, MatIconModule, MatTreeModule, MatDialogModule, HttpClientTestingModule], + imports: [ + MatButtonModule, + MatIconModule, + MatTreeModule, + MatDialogModule, + HttpClientTestingModule, + MatLegacyInputModule, + BrowserAnimationsModule, + FileTreeComponent, + ], providers: [ { provide: MatDialogRef, useValue: {} }, { provide: MAT_DIALOG_DATA, useValue: [] }, @@ -45,8 +59,8 @@ describe('FileTreeComponent', () => { let expectedNodes = []; expect(component.convertSourceFilesToTree(sourcefiles)).toEqual(expectedNodes); sourcefiles = [ - { absolutePath: '/folder1/file1', path: 'file1', type: SourceFile.TypeEnum.DOCKSTOREWDL }, - { absolutePath: '/folder1/file2', path: 'file2', type: SourceFile.TypeEnum.DOCKSTOREWDL }, + { absolutePath: '/folder1/file1', path: 'file1', type: SourceFile.TypeEnum.DOCKSTOREWDL, state: SourceFile.StateEnum.COMPLETE }, + { absolutePath: '/folder1/file2', path: 'file2', type: SourceFile.TypeEnum.DOCKSTOREWDL, state: SourceFile.StateEnum.COMPLETE }, ]; expectedNodes = [ Object({ diff --git a/src/app/file-tree/file-tree.component.ts b/src/app/file-tree/file-tree.component.ts index fac8ce0af9..0f5d8e8f00 100644 --- a/src/app/file-tree/file-tree.component.ts +++ b/src/app/file-tree/file-tree.component.ts @@ -1,8 +1,17 @@ import { Component, Inject } from '@angular/core'; -import { MatTreeFlatDataSource, MatTreeFlattener } from '@angular/material/tree'; +import { MatTreeFlatDataSource, MatTreeFlattener, MatTreeModule } from '@angular/material/tree'; import { FlatTreeControl } from '@angular/cdk/tree'; -import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog'; +import { + MatLegacyDialogRef as MatDialogRef, + MAT_LEGACY_DIALOG_DATA as MAT_DIALOG_DATA, + MatLegacyDialogModule, +} from '@angular/material/legacy-dialog'; import { EntryType, SourceFile, ToolDescriptor } from 'app/shared/openapi'; +import { MatIconModule } from '@angular/material/icon'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { NgIf } from '@angular/common'; +import { MatLegacyInputModule } from '@angular/material/legacy-input'; +import { MatLegacyFormFieldModule } from '@angular/material/legacy-form-field'; /** File node data with possible child nodes. */ export interface FileNode { @@ -34,6 +43,16 @@ export interface FlatTreeNode { @Component({ selector: 'app-file-tree', templateUrl: './file-tree.component.html', + standalone: true, + imports: [ + MatLegacyDialogModule, + MatLegacyFormFieldModule, + MatLegacyInputModule, + MatTreeModule, + NgIf, + MatLegacyButtonModule, + MatIconModule, + ], }) export class FileTreeComponent { /** The TreeControl controls the expand/collapse state of tree nodes. */ diff --git a/src/app/footer/footer.component.spec.ts b/src/app/footer/footer.component.spec.ts index 3efa314623..162aaad1b6 100644 --- a/src/app/footer/footer.component.spec.ts +++ b/src/app/footer/footer.component.spec.ts @@ -14,9 +14,10 @@ * limitations under the License. */ +import { ClipboardModule } from '@angular/cdk/clipboard'; import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; import { MatIconModule } from '@angular/material/icon'; -import { MatSnackBarModule } from '@angular/material/snack-bar'; +import { MatLegacySnackBarModule as MatSnackBarModule } from '@angular/material/legacy-snack-bar'; import { RouterTestingModule } from '@angular/router/testing'; import { ServiceInfoService } from '../service-info/service-info.service'; import { GA4GHV20Service } from './../shared/openapi'; @@ -32,8 +33,7 @@ describe('FooterComponent', () => { beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [FooterComponent, GitTagPipe], - imports: [RouterTestingModule, MatIconModule, MatSnackBarModule], + imports: [RouterTestingModule, MatIconModule, MatSnackBarModule, ClipboardModule, FooterComponent, GitTagPipe], providers: [ServiceInfoService, { provide: GA4GHV20Service, useClass: GA4GHV20StubService }], }).compileComponents(); }) diff --git a/src/app/footer/footer.component.ts b/src/app/footer/footer.component.ts index 1eb0861d91..3c9f35db27 100644 --- a/src/app/footer/footer.component.ts +++ b/src/app/footer/footer.component.ts @@ -24,11 +24,21 @@ import { Dockstore } from './../shared/dockstore.model'; import { TRSService } from 'app/shared/openapi'; import { FooterService } from './footer.service'; import { versions } from './versions'; +import { GitTagPipe } from './git-tag.pipe'; +import { NgFor } from '@angular/common'; +import { MatIconModule } from '@angular/material/icon'; +import { ClipboardModule } from '@angular/cdk/clipboard'; +import { SnackbarDirective } from '../shared/snackbar.directive'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { RouterLink } from '@angular/router'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; @Component({ selector: 'app-footer', templateUrl: './footer.component.html', styleUrls: ['./footer.component.scss'], + standalone: true, + imports: [FlexModule, RouterLink, MatLegacyButtonModule, SnackbarDirective, ClipboardModule, MatIconModule, NgFor, GitTagPipe], }) export class FooterComponent extends Base implements OnInit { domain: string; diff --git a/src/app/footer/footer.service.spec.ts b/src/app/footer/footer.service.spec.ts index de368be0c0..db77a0bbb5 100644 --- a/src/app/footer/footer.service.spec.ts +++ b/src/app/footer/footer.service.spec.ts @@ -1,3 +1,4 @@ +import { ClipboardModule } from '@angular/cdk/clipboard'; import { TestBed } from '@angular/core/testing'; import { FooterService } from './footer.service'; @@ -6,7 +7,9 @@ describe('FooterService', () => { let service: FooterService; beforeEach(() => { - TestBed.configureTestingModule({}); + TestBed.configureTestingModule({ + imports: [ClipboardModule], + }); service = TestBed.inject(FooterService); }); diff --git a/src/app/footer/git-tag.pipe.ts b/src/app/footer/git-tag.pipe.ts index d0e071d9fa..cd01d06309 100644 --- a/src/app/footer/git-tag.pipe.ts +++ b/src/app/footer/git-tag.pipe.ts @@ -10,6 +10,7 @@ import { Pipe, PipeTransform } from '@angular/core'; */ @Pipe({ name: 'gitTag', + standalone: true, }) export class GitTagPipe implements PipeTransform { /** diff --git a/src/app/funding/funding.component.spec.ts b/src/app/funding/funding.component.spec.ts index 7031a4eb4e..e2e2d8a609 100644 --- a/src/app/funding/funding.component.spec.ts +++ b/src/app/funding/funding.component.spec.ts @@ -1,5 +1,8 @@ /* eslint-disable no-unused-vars, @typescript-eslint/no-unused-vars */ import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { MatDividerModule } from '@angular/material/divider'; +import { MatLegacyCardModule } from '@angular/material/legacy-card'; +import { MatLegacySnackBarModule } from '@angular/material/legacy-snack-bar'; import { FundingComponent } from './funding.component'; @@ -10,7 +13,7 @@ describe('FundingComponent', () => { beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [FundingComponent], + imports: [MatDividerModule, MatLegacyCardModule, FundingComponent, MatLegacySnackBarModule], }).compileComponents(); }) ); diff --git a/src/app/funding/funding.component.ts b/src/app/funding/funding.component.ts index 277b19463e..e71abe64ee 100644 --- a/src/app/funding/funding.component.ts +++ b/src/app/funding/funding.component.ts @@ -1,4 +1,10 @@ import { Component, Injectable } from '@angular/core'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { MatLegacyCardModule } from '@angular/material/legacy-card'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { MatDividerModule } from '@angular/material/divider'; +import { NgFor } from '@angular/common'; +import { HeaderComponent } from '../header/header.component'; export interface Funder { title: string; @@ -17,6 +23,8 @@ export interface FundingSections { selector: 'app-funding', templateUrl: './funding.component.html', styleUrls: ['./funding.component.scss'], + standalone: true, + imports: [HeaderComponent, NgFor, MatDividerModule, FlexModule, MatLegacyCardModule, MatLegacyButtonModule], }) @Injectable() export class FundingComponent { diff --git a/src/app/github-callback/github-callback.component.ts b/src/app/github-callback/github-callback.component.ts index 5363f4ed61..61280dcaef 100644 --- a/src/app/github-callback/github-callback.component.ts +++ b/src/app/github-callback/github-callback.component.ts @@ -4,11 +4,15 @@ import { Base } from 'app/shared/base'; import { ActivatedRoute } from 'app/test'; import { takeUntil } from 'rxjs/operators'; import { GithubCallbackService } from './github-callback.service'; +import { MatLegacyProgressSpinnerModule } from '@angular/material/legacy-progress-spinner'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; @Component({ selector: 'app-github-callback', templateUrl: './github-callback.component.html', styleUrls: ['./github-callback.component.scss'], + standalone: true, + imports: [FlexModule, MatLegacyProgressSpinnerModule], }) export class GithubCallbackComponent extends Base implements OnInit { constructor(private activatedRoute: ActivatedRoute, private router: GithubCallbackService) { diff --git a/src/app/github-callback/github-callback.service.ts b/src/app/github-callback/github-callback.service.ts index a504aba6f2..0dc2fe26f2 100644 --- a/src/app/github-callback/github-callback.service.ts +++ b/src/app/github-callback/github-callback.service.ts @@ -1,5 +1,6 @@ import { Injectable } from '@angular/core'; import { Params, Router } from '@angular/router'; +import { EntryType } from 'app/shared/enum/entry-type'; @Injectable({ providedIn: 'root', @@ -8,10 +9,10 @@ export class GithubCallbackService { constructor(private router: Router) {} public resolveQueryParam(queryParams: Params | null): void { if (queryParams) { - const state: string | null = queryParams.state; - this.router.navigateByUrl(state); + const entryTypeValue: EntryType | null = queryParams.state; + this.router.navigate(['/github-landing-page'], { queryParams: { entryType: entryTypeValue } }); } else { - this.router.navigateByUrl('/'); + this.router.navigateByUrl('/github-landing-page'); } } } diff --git a/src/app/github-landing-page/github-landing-page.component.html b/src/app/github-landing-page/github-landing-page.component.html index d6ad3c3e03..45fc1f31d4 100644 --- a/src/app/github-landing-page/github-landing-page.component.html +++ b/src/app/github-landing-page/github-landing-page.component.html @@ -14,82 +14,85 @@ ~ limitations under the License. --> -
    -
    -
    -

    Please wait while your GitHub repository installation is being processed. This may take a few minutes.

    -
    -
    -

    You can close this tab and return to Dockstore on the original tab.

    +

    + Your GitHub repository installation is being processed. It may take a few minutes to register your {{ entryTypeMetadata.termPlural }}. +

    +
    +
    +

    You can close this tab and return to Dockstore on the original tab.

    -
    - - - Do you have a .dockstore.yml file in your repository? - - - -
    - If you haven’t already, please create a .dockstore.yml file in your repository. This way, your workflows will be - kept up-to-date automatically.
    +
    + + + Do you have a .dockstore.yml file in your repository? + + + +

    + If you haven’t already, please create a .dockstore.yml file in your repository. This way, your + {{ entryTypeMetadata.termPlural }} will be kept up-to-date automatically. +

    +

    Here is a .dockstore.yml template:

    +
    + +
    +

    + View more .dockstore.yml templates for {{ entryTypeMetadata.termPlural }} + here. +

    +
    +
    - Here is the .dockstore.yml template: -
    + + + Tips and Tricks + -
    -version: 1.2
    -workflows:
    -  - subclass: <CWL | WDL | NFL | GALAXY>
    -    primaryDescriptorPath: <String>  # absolute path
    -    testParameterFiles: <String Array>  # absolute path
    -    readMePath: <String> # absolute path
    -    authors:
    -      - name: <String>
    -        email: <String>
    -          
    + -
    - Note: the first line of this file references the version of .dockstore.yml syntax being used, not the version/tag - of the workflow/tool/service/notebook it describes -
    - -
    - - - - Tips and Tricks - - - - - -
      -
    • - Make sure your file is saved as .dockstore.yml, not dockstore.yml nor .dockstore.yaml -
    • -
    • Put the .dockstore.yml file in the top of your repository or inside the .github/ directory
    • -
    • - The Dockstore Yaml Command Line Validator Tool can be used with the following command - in the Dockstore CLI, -
      dockstore yaml validate --path directory/of/.dockstore.yml
      -
    • -
    • - You can use a single .dockstore.yml file to register multiple tools, workflows, and notebooks, provided they are - all in the same repository as the .dockstore.yml file. If you do so, each one needs a unique name, it is - recommended to give each one a unique readMePath too. -
    • -
    -
    -
    -
    - + +
      +
    • + Make sure your file is saved as .dockstore.yml, not dockstore.yml nor .dockstore.yaml. +
    • +
    • Put the .dockstore.yml file in the top of your repository.
    • +
    • + The Dockstore Yaml Command Line Validator Tool can be used to validate the + .dockstore.yml. +
      dockstore yaml validate --path directory/of/.dockstore.yml
      +
    • +
    • + You can use a single .dockstore.yml file to register multiple {{ entryTypeMetadata.termPlural }}, provided they are + all in the same repository as the .dockstore.yml file. If you do so, each {{ entryTypeMetadata.term }} needs a + unique name. +
    • +
    +

    + View more + Tips And Tricks + and + FAQs. +

    +
    +
    +
    diff --git a/src/app/github-landing-page/github-landing-page.component.scss b/src/app/github-landing-page/github-landing-page.component.scss index 873043df8f..6a8d7d32fc 100644 --- a/src/app/github-landing-page/github-landing-page.component.scss +++ b/src/app/github-landing-page/github-landing-page.component.scss @@ -1,37 +1,9 @@ -.cards-container { - padding: 2% 0; -} - -.landing-page-card { - margin-bottom: 2%; -} - -.header-container { - text-align: center; - position: relative; -} - -.back-button { - position: absolute; - bottom: 0.1em; - right: 10em; -} - mat-divider { position: relative !important; } -.landing-page-card-content { - width: 90%; - margin: auto; -} - .docs-link-text { text-align: center; font-size: 16px; color: black; } - -.landing-page-container { - align-items: center; -} diff --git a/src/app/github-landing-page/github-landing-page.component.ts b/src/app/github-landing-page/github-landing-page.component.ts index c1f8f55df9..8fc67d8d13 100644 --- a/src/app/github-landing-page/github-landing-page.component.ts +++ b/src/app/github-landing-page/github-landing-page.component.ts @@ -1,11 +1,37 @@ -import { Component } from '@angular/core'; +import { Component, OnInit } from '@angular/core'; import { Dockstore } from '../shared/dockstore.model'; +import { ActivatedRoute, Params, RouterLink } from '@angular/router'; +import { takeUntil } from 'rxjs/operators'; +import { Base } from 'app/shared/base'; +import { EntryType, EntryTypeMetadata } from 'app/shared/openapi'; +import { EntryTypeMetadataService } from 'app/entry/type-metadata/entry-type-metadata.service'; +import { CodeEditorComponent } from '../shared/code-editor/code-editor.component'; +import { MatDividerModule } from '@angular/material/divider'; +import { MatLegacyCardModule } from '@angular/material/legacy-card'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; @Component({ selector: 'app-github-landing-page', templateUrl: './github-landing-page.component.html', styleUrls: ['./github-landing-page.component.scss'], + standalone: true, + imports: [FlexModule, MatLegacyCardModule, MatDividerModule, CodeEditorComponent, RouterLink], }) -export class GithubLandingPageComponent { +export class GithubLandingPageComponent extends Base implements OnInit { Dockstore = Dockstore; + entryType: EntryType; + entryTypeMetadata: EntryTypeMetadata; + templateUrl: string; + + constructor(private activatedRoute: ActivatedRoute, private entryTypeMetadataService: EntryTypeMetadataService) { + super(); + } + + ngOnInit() { + this.activatedRoute.queryParams.pipe(takeUntil(this.ngUnsubscribe)).subscribe((params: Params) => { + this.entryType = params.entryType ? params.entryType : EntryType.WORKFLOW; + this.entryTypeMetadata = this.entryTypeMetadataService.get(this.entryType); + this.templateUrl = `${Dockstore.DOCUMENTATION_URL}/assets/templates/${this.entryTypeMetadata.termPlural}/${this.entryTypeMetadata.termPlural}.html`; + }); + } } diff --git a/src/app/gravatar/gravatar.pipe.ts b/src/app/gravatar/gravatar.pipe.ts index b83e0de990..d7d3767725 100644 --- a/src/app/gravatar/gravatar.pipe.ts +++ b/src/app/gravatar/gravatar.pipe.ts @@ -6,6 +6,7 @@ import { GravatarService } from './gravatar.service'; */ @Pipe({ name: 'gravatar', + standalone: true, }) export class GravatarPipe implements PipeTransform { constructor(private gravatarService: GravatarService) {} diff --git a/src/app/gravatar/gravatar.service.ts b/src/app/gravatar/gravatar.service.ts index 4cdc58e966..fe435bb3fa 100644 --- a/src/app/gravatar/gravatar.service.ts +++ b/src/app/gravatar/gravatar.service.ts @@ -1,5 +1,5 @@ import { Injectable } from '@angular/core'; -import { Md5 } from 'ts-md5/dist/md5'; +import { Md5 } from 'ts-md5'; @Injectable({ providedIn: 'root', diff --git a/src/app/header/header.component.spec.ts b/src/app/header/header.component.spec.ts index 8e2eb454a6..8296ca1e2b 100644 --- a/src/app/header/header.component.spec.ts +++ b/src/app/header/header.component.spec.ts @@ -17,6 +17,7 @@ import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; import { NO_ERRORS_SCHEMA } from '@angular/core'; +import { MatLegacySnackBarModule } from '@angular/material/legacy-snack-bar'; import { RouterTestingModule } from '@angular/router/testing'; import { HeaderComponent } from './header.component'; @@ -27,9 +28,8 @@ describe('HeaderComponent', () => { beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - imports: [RouterTestingModule], + imports: [RouterTestingModule, HeaderComponent, MatLegacySnackBarModule], schemas: [NO_ERRORS_SCHEMA], - declarations: [HeaderComponent], }).compileComponents(); }) ); diff --git a/src/app/header/header.component.ts b/src/app/header/header.component.ts index 68aaf80f64..204656b776 100644 --- a/src/app/header/header.component.ts +++ b/src/app/header/header.component.ts @@ -16,10 +16,13 @@ import { Component } from '@angular/core'; import { Router } from '@angular/router'; import { toExtendSite } from '../shared/helpers'; +import { AlertComponent } from '../shared/alert/alert.component'; @Component({ selector: 'app-header', templateUrl: './header.component.html', + standalone: true, + imports: [AlertComponent], }) export class HeaderComponent { isExtended = false; diff --git a/src/app/home-page/dashboard/dashboard.component.spec.ts b/src/app/home-page/dashboard/dashboard.component.spec.ts index d727c3accc..15560a9b2f 100644 --- a/src/app/home-page/dashboard/dashboard.component.spec.ts +++ b/src/app/home-page/dashboard/dashboard.component.spec.ts @@ -1,15 +1,24 @@ import { NO_ERRORS_SCHEMA } from '@angular/core'; import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { MatButtonModule } from '@angular/material/button'; -import { MatDialogModule } from '@angular/material/dialog'; +import { MatLegacyButtonModule as MatButtonModule } from '@angular/material/legacy-button'; +import { MatLegacyDialogModule as MatDialogModule } from '@angular/material/legacy-dialog'; import { MatIconModule } from '@angular/material/icon'; +import { NoopAnimationsModule } from '@angular/platform-browser/animations'; import { RouterTestingModule } from '@angular/router/testing'; +import { MyWorkflowsService } from '../../myworkflows/myworkflows.service'; +import { DateService } from '../../shared/date.service'; +import { DescriptorLanguageService } from '../../shared/entry/descriptor-language.service'; +import { OrgLogoService } from '../../shared/org-logo.service'; +import { ProviderService } from '../../shared/provider.service'; +import { MyEntriesStateService } from '../../shared/state/my-entries.service'; +import { MyEntriesStore } from '../../shared/state/my-entries.store'; +import { UrlResolverService } from '../../shared/url-resolver.service'; import { DashboardComponent } from './dashboard.component'; import { RegisterToolService } from 'app/container/register-tool/register-tool.service'; import { HttpClientTestingModule } from '@angular/common/http/testing'; -import { MatSnackBarModule } from '@angular/material/snack-bar'; +import { MatLegacySnackBarModule as MatSnackBarModule } from '@angular/material/legacy-snack-bar'; import { ContainerService } from '../../shared/container.service'; -import { ContainerStubService } from '../../test/service-stubs'; +import { ContainerStubService, DateStubService, OrgLogoStubService, UrlResolverStubService } from '../../test/service-stubs'; import { MastodonService } from '../../shared/mastodon/mastodon.service'; describe('DashboardComponent', () => { @@ -19,10 +28,30 @@ describe('DashboardComponent', () => { beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [DashboardComponent], schemas: [NO_ERRORS_SCHEMA], - imports: [RouterTestingModule, MatButtonModule, MatIconModule, MatDialogModule, HttpClientTestingModule, MatSnackBarModule], - providers: [MastodonService, RegisterToolService, { provide: ContainerService, useClass: ContainerStubService }], + imports: [ + RouterTestingModule, + MatButtonModule, + MatIconModule, + MatDialogModule, + HttpClientTestingModule, + MatSnackBarModule, + DashboardComponent, + NoopAnimationsModule, + ], + providers: [ + MastodonService, + RegisterToolService, + MyWorkflowsService, + ProviderService, + { provide: DateService, useClass: DateStubService }, + { provide: ContainerService, useClass: ContainerStubService }, + { provide: DescriptorLanguageService, useClass: DescriptorLanguageService }, + { provide: UrlResolverService, useClass: UrlResolverStubService }, + { provide: OrgLogoService, useClass: OrgLogoStubService }, + MyEntriesStateService, + MyEntriesStore, + ], }).compileComponents(); }) ); diff --git a/src/app/home-page/dashboard/dashboard.component.ts b/src/app/home-page/dashboard/dashboard.component.ts index 5a336ac724..669f79e0dd 100644 --- a/src/app/home-page/dashboard/dashboard.component.ts +++ b/src/app/home-page/dashboard/dashboard.component.ts @@ -2,17 +2,40 @@ import { Component, OnInit, ViewChild, ElementRef } from '@angular/core'; import { Base } from 'app/shared/base'; import { takeUntil } from 'rxjs/operators'; import { RegisterToolService } from 'app/container/register-tool/register-tool.service'; -import { MatDialog } from '@angular/material/dialog'; +import { MatLegacyDialog as MatDialog } from '@angular/material/legacy-dialog'; import { RegisterToolComponent } from 'app/container/register-tool/register-tool.component'; import { AlertService } from 'app/shared/alert/state/alert.service'; import { Dockstore } from 'app/shared/dockstore.model'; import { bootstrap4largeModalSize } from '../../shared/constants'; import { EntryType } from '../../shared/openapi'; +import { FeaturedContentComponent } from '../widget/featured-content/featured-content.component'; +import { MastodonComponent } from '../../shared/mastodon/mastodon.component'; +import { NewsBoxComponent } from '../widget/news-box/news-box.component'; +import { StarredBoxComponent } from '../widget/starred-box/starred-box.component'; +import { OrganizationBoxComponent } from '../widget/organization-box/organization-box.component'; +import { EntryBoxComponent } from '../widget/entry-box/entry-box.component'; +import { NewsNotificationsComponent } from '../widget/news-updates/news-notifications.component'; +import { HeaderComponent } from '../../header/header.component'; +import { MySidebarComponent } from '../../my-sidebar/my-sidebar.component'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; @Component({ selector: 'app-dashboard', templateUrl: './dashboard.component.html', styleUrls: ['./dashboard.component.scss'], + standalone: true, + imports: [ + FlexModule, + MySidebarComponent, + HeaderComponent, + NewsNotificationsComponent, + EntryBoxComponent, + OrganizationBoxComponent, + StarredBoxComponent, + NewsBoxComponent, + MastodonComponent, + FeaturedContentComponent, + ], }) export class DashboardComponent extends Base implements OnInit { public Dockstore = Dockstore; diff --git a/src/app/home-page/home-logged-out/home.component.html b/src/app/home-page/home-logged-out/home.component.html index 05ca887a4e..bccac10107 100644 --- a/src/app/home-page/home-logged-out/home.component.html +++ b/src/app/home-page/home-logged-out/home.component.html @@ -28,14 +28,7 @@ >

    An app store for bioinformatics

    - Dockstore is a free and open source platform for sharing reusable and scalable analytical tools and workflows. It’s developed by - the - Cancer Genome Collaboratory - and used by the GA4GH. + Dockstore is a free and open source platform for sharing reusable and scalable analytical tools and workflows.
    diff --git a/src/app/home-page/home-logged-out/home.component.scss b/src/app/home-page/home-logged-out/home.component.scss index a82ee0ad70..33610751ee 100644 --- a/src/app/home-page/home-logged-out/home.component.scss +++ b/src/app/home-page/home-logged-out/home.component.scss @@ -115,10 +115,6 @@ h3 { border-radius: 1rem; } -.primary-3 { - color: mat.get-color-from-palette($dockstore-app-primary, 3); -} - .warn-1 { color: mat.get-color-from-palette($dockstore-app-error, darker); } diff --git a/src/app/home-page/home-logged-out/home.component.spec.ts b/src/app/home-page/home-logged-out/home.component.spec.ts index b28ffc1f3a..4fd274f166 100644 --- a/src/app/home-page/home-logged-out/home.component.spec.ts +++ b/src/app/home-page/home-logged-out/home.component.spec.ts @@ -16,10 +16,11 @@ import { HttpClientTestingModule } from '@angular/common/http/testing'; import { NO_ERRORS_SCHEMA } from '@angular/core'; import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { MatLegacyDialogModule } from '@angular/material/legacy-dialog'; +import { MatLegacySnackBarModule } from '@angular/material/legacy-snack-bar'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { RouterTestingModule } from '@angular/router/testing'; import { DescriptorLanguageService } from 'app/shared/entry/descriptor-language.service'; -import { CustomMaterialModule } from 'app/shared/modules/material.module'; import { HomeComponent } from './home.component'; import { MastodonService } from '../../shared/mastodon/mastodon.service'; @@ -30,9 +31,15 @@ describe('HomeComponent', () => { beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [HomeComponent], schemas: [NO_ERRORS_SCHEMA], - imports: [CustomMaterialModule, RouterTestingModule, HttpClientTestingModule, BrowserAnimationsModule], + imports: [ + RouterTestingModule, + HttpClientTestingModule, + BrowserAnimationsModule, + HomeComponent, + MatLegacyDialogModule, + MatLegacySnackBarModule, + ], providers: [MastodonService, DescriptorLanguageService], }).compileComponents(); }) diff --git a/src/app/home-page/home-logged-out/home.component.ts b/src/app/home-page/home-logged-out/home.component.ts index 527ddf9911..7014bd506e 100644 --- a/src/app/home-page/home-logged-out/home.component.ts +++ b/src/app/home-page/home-logged-out/home.component.ts @@ -14,7 +14,7 @@ * limitations under the License. */ import { Component, ElementRef, OnInit, ViewChild } from '@angular/core'; -import { MatDialog, MatDialogRef } from '@angular/material/dialog'; +import { MatLegacyDialog as MatDialog, MatLegacyDialogRef as MatDialogRef } from '@angular/material/legacy-dialog'; import { faGithub, faGoogle } from '@fortawesome/free-brands-svg-icons'; import { HomePageService } from 'app/home-page/home-page.service'; import { Base } from 'app/shared/base'; @@ -24,6 +24,23 @@ import { User } from '../../shared/openapi/model/user'; import { UserQuery } from '../../shared/user/user.query'; import { Category } from '../../shared/openapi'; import { AllCategoriesService } from '../../categories/state/all-categories.service'; +import { MastodonComponent } from '../../shared/mastodon/mastodon.component'; +import { MatDividerModule } from '@angular/material/divider'; +import { NewsAndUpdatesComponent } from '../widget/featured-content/news-and-updates.component'; +import { FeaturedContentComponent } from '../widget/featured-content/featured-content.component'; +import { FontAwesomeModule } from '@fortawesome/angular-fontawesome'; +import { ExtendedModule } from '@ngbracket/ngx-layout/extended'; +import { MatLegacyTabsModule } from '@angular/material/legacy-tabs'; +import { CategoryButtonComponent } from '../../categories/button/category-button.component'; +import { MatLegacyChipsModule } from '@angular/material/legacy-chips'; +import { NgIf, NgFor, AsyncPipe, SlicePipe } from '@angular/common'; +import { MatLegacyInputModule } from '@angular/material/legacy-input'; +import { MatLegacyFormFieldModule } from '@angular/material/legacy-form-field'; +import { MatIconModule } from '@angular/material/icon'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { RouterLink } from '@angular/router'; +import { JsonLdComponent } from '../../shared/json-ld/json-ld.component'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; /** * Simple youtube iframe component, too simple to have its own file @@ -33,6 +50,7 @@ import { AllCategoriesService } from '../../categories/state/all-categories.serv */ @Component({ template: '', + standalone: true, }) export class YoutubeComponent { constructor(public dialogRef: MatDialogRef) {} @@ -42,6 +60,29 @@ export class YoutubeComponent { selector: 'app-home', templateUrl: './home.component.html', styleUrls: ['./home.component.scss'], + standalone: true, + imports: [ + FlexModule, + JsonLdComponent, + RouterLink, + MatLegacyButtonModule, + MatIconModule, + MatLegacyFormFieldModule, + MatLegacyInputModule, + NgIf, + MatLegacyChipsModule, + NgFor, + CategoryButtonComponent, + MatLegacyTabsModule, + ExtendedModule, + FontAwesomeModule, + FeaturedContentComponent, + NewsAndUpdatesComponent, + MatDividerModule, + MastodonComponent, + AsyncPipe, + SlicePipe, + ], }) export class HomeComponent extends Base implements OnInit { faGithub = faGithub; diff --git a/src/app/home-page/home-page.module.ts b/src/app/home-page/home-page.module.ts deleted file mode 100644 index b279c9924f..0000000000 --- a/src/app/home-page/home-page.module.ts +++ /dev/null @@ -1,89 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { HttpClientModule } from '@angular/common/http'; -import { NgModule } from '@angular/core'; -import { FlexLayoutModule } from '@angular/flex-layout'; -import { FormsModule } from '@angular/forms'; -import { RouterModule } from '@angular/router'; -import { FontAwesomeModule } from '@fortawesome/angular-fontawesome'; -import { MatAutocompleteModule } from '@angular/material/autocomplete'; -import { HomeComponent } from 'app/home-page/home-logged-out/home.component'; -import { CustomMaterialModule } from 'app/shared/modules/material.module'; -import { MarkdownModule } from 'ngx-markdown'; -import { RefreshWizardModule } from '../container/refresh-wizard.module'; -import { RefreshAlertModule } from '../shared/alert/alert.module'; -import { CategoryButtonModule } from '../categories/button/category-button.module'; -import { JsonLdModule } from '../shared/modules/json-ld.module'; -import { RegisterGithubAppModule } from '../shared/modules/register-github-app.module'; -import { RecentEventsModule } from './recent-events/recent-events.module'; -import { FeaturedContentComponent } from './widget/featured-content/featured-content.component'; -import { NewsAndUpdatesComponent } from './widget/featured-content/news-and-updates.component'; -import { GettingStartedComponent } from './widget/getting-started/getting-started.component'; -import { NewsNotificationsComponent } from './widget/news-updates/news-notifications.component'; -import { MySidebarModule } from '../shared/modules/my-sidebar.module'; -import { EntryBoxComponent } from './widget/entry-box/entry-box.component'; -import { MytoolsService } from 'app/mytools/mytools.service'; -import { MyWorkflowsService } from 'app/myworkflows/myworkflows.service'; -import { MyEntriesStateService } from 'app/shared/state/my-entries.service'; -import { MyEntriesStore } from 'app/shared/state/my-entries.store'; -import { MyEntriesQuery } from 'app/shared/state/my-entries.query'; -import { RegisterWorkflowModalService } from 'app/workflow/register-workflow-modal/register-workflow-modal.service'; -import { RegisterToolService } from 'app/container/register-tool/register-tool.service'; -import { RegisterToolComponent } from 'app/container/register-tool/register-tool.component'; -import { DashboardComponent } from './dashboard/dashboard.component'; -import { OrganizationBoxComponent } from './widget/organization-box/organization-box.component'; -import { StarredBoxComponent } from './widget/starred-box/starred-box.component'; -import { HeaderModule } from 'app/shared/modules/header.module'; -import { NewsBoxComponent } from './widget/news-box/news-box.component'; -import { MarkdownWrapperModule } from '../shared/modules/markdown-wrapper.module'; -import { PreviewWarningModule } from '../shared/modules/preview-warning.module'; -import { MastodonComponent } from '../shared/mastodon/mastodon.component'; -import { SharedWorkflowServicesNotebooksModule } from '../shared-workflow-services-notebooks/shared-workflow-services-notebooks.module'; - -@NgModule({ - imports: [ - CommonModule, - CustomMaterialModule, - FlexLayoutModule, - RouterModule, - FormsModule, - HttpClientModule, - RefreshAlertModule, - MarkdownModule, - FontAwesomeModule, - MatAutocompleteModule, - CategoryButtonModule, - JsonLdModule, - MySidebarModule, - RecentEventsModule, - RefreshWizardModule, - HeaderModule, - MarkdownWrapperModule, - PreviewWarningModule, - RegisterGithubAppModule, - SharedWorkflowServicesNotebooksModule, - ], - declarations: [ - HomeComponent, - FeaturedContentComponent, - NewsAndUpdatesComponent, - NewsNotificationsComponent, - GettingStartedComponent, - EntryBoxComponent, - RegisterToolComponent, - DashboardComponent, - OrganizationBoxComponent, - StarredBoxComponent, - NewsBoxComponent, - MastodonComponent, - ], - providers: [ - MytoolsService, - MyWorkflowsService, - MyEntriesStateService, - MyEntriesStore, - MyEntriesQuery, - RegisterToolService, - RegisterWorkflowModalService, - ], -}) -export class HomePageModule {} diff --git a/src/app/home-page/home-page.service.ts b/src/app/home-page/home-page.service.ts index 29a57ef8d6..a7b21af796 100644 --- a/src/app/home-page/home-page.service.ts +++ b/src/app/home-page/home-page.service.ts @@ -10,7 +10,7 @@ export class HomePageService { '@context': 'http://schema.org', '@type': 'Organization', description: - 'Dockstore, developed by the Cancer Genome Collaboratory, is an open platform used by the GA4GH for sharing ' + + 'Dockstore is an open platform used by the GA4GH for sharing ' + 'Docker-based tools described with the Common Workflow Language (CWL), the Workflow Description Language (WDL), or Nextflow (NFL)', logo: '../assets/images/dockstore/dockstore.png', name: 'Dockstore', diff --git a/src/app/home-page/recent-events/recent-events.component.ts b/src/app/home-page/recent-events/recent-events.component.ts index 87282280f0..dd6926b388 100644 --- a/src/app/home-page/recent-events/recent-events.component.ts +++ b/src/app/home-page/recent-events/recent-events.component.ts @@ -1,5 +1,5 @@ import { Component, Input, OnInit } from '@angular/core'; -import { ActivatedRoute } from '@angular/router'; +import { ActivatedRoute, RouterLink } from '@angular/router'; import { ID } from '@datorama/akita'; import { Dockstore } from 'app/shared/dockstore.model'; import { Event, User, UsersService, EventsService } from 'app/shared/openapi'; @@ -13,6 +13,14 @@ import { Base } from 'app/shared/base'; import { Observable } from 'rxjs'; import { OrgLogoService } from '../../shared/org-logo.service'; import { GravatarService } from '../../gravatar/gravatar.service'; +import { RecentEventsPipe } from '../../shared/entry/recent-events.pipe'; +import { GravatarPipe } from '../../gravatar/gravatar.pipe'; +import { MatIconModule } from '@angular/material/icon'; +import { MatLegacyCardModule } from '@angular/material/legacy-card'; +import { ImgFallbackDirective } from '../../shared/img-fallback.directive'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { NgIf, NgFor, NgSwitch, NgSwitchCase, AsyncPipe, LowerCasePipe, SlicePipe, DatePipe } from '@angular/common'; +import { LoadingComponent } from '../../shared/loading/loading.component'; /** * Shows recent events related to starred organization and entries or user organization events @@ -25,6 +33,25 @@ import { GravatarService } from '../../gravatar/gravatar.service'; selector: 'app-recent-events', templateUrl: './recent-events.component.html', styleUrls: ['../../shared/styles/dashboard-boxes.scss'], + standalone: true, + imports: [ + LoadingComponent, + NgIf, + NgFor, + FlexModule, + RouterLink, + NgSwitch, + NgSwitchCase, + ImgFallbackDirective, + MatLegacyCardModule, + MatIconModule, + AsyncPipe, + LowerCasePipe, + SlicePipe, + DatePipe, + GravatarPipe, + RecentEventsPipe, + ], }) export class RecentEventsComponent extends Base implements OnInit { @Input() eventType: 'SELF_ORGANIZATIONS' | 'ALL_STARRED'; diff --git a/src/app/home-page/recent-events/recent-events.module.ts b/src/app/home-page/recent-events/recent-events.module.ts index 0bca81cb79..86068bdbfa 100644 --- a/src/app/home-page/recent-events/recent-events.module.ts +++ b/src/app/home-page/recent-events/recent-events.module.ts @@ -1,21 +1,18 @@ import { NgModule } from '@angular/core'; import { RecentEventsComponent } from './recent-events.component'; -import { RefreshAlertModule } from '../../shared/alert/alert.module'; + import { CommonModule } from '@angular/common'; import { EntryToDisplayNamePipe } from 'app/shared/entry-to-display-name.pipe'; -import { MatCardModule } from '@angular/material/card'; -import { FlexLayoutModule } from '@angular/flex-layout'; +import { MatLegacyCardModule as MatCardModule } from '@angular/material/legacy-card'; +import { FlexLayoutModule } from '@ngbracket/ngx-layout'; import { MatDividerModule } from '@angular/material/divider'; import { RouterModule } from '@angular/router'; import { MatIconModule } from '@angular/material/icon'; import { PipeModule } from '../../shared/pipe/pipe.module'; -import { ImgFallbackModule } from '../../shared/modules/img-fallback.module'; @NgModule({ - declarations: [RecentEventsComponent, EntryToDisplayNamePipe], providers: [], imports: [ - RefreshAlertModule, MatIconModule, CommonModule, MatCardModule, @@ -23,7 +20,8 @@ import { ImgFallbackModule } from '../../shared/modules/img-fallback.module'; MatDividerModule, RouterModule, PipeModule, - ImgFallbackModule, + RecentEventsComponent, + EntryToDisplayNamePipe, ], exports: [RecentEventsComponent], }) diff --git a/src/app/home-page/widget/entry-box/entry-box.component.spec.ts b/src/app/home-page/widget/entry-box/entry-box.component.spec.ts index 72dfe0d8f4..ec055574d6 100644 --- a/src/app/home-page/widget/entry-box/entry-box.component.spec.ts +++ b/src/app/home-page/widget/entry-box/entry-box.component.spec.ts @@ -1,12 +1,12 @@ import { HttpClientTestingModule } from '@angular/common/http/testing'; import { NO_ERRORS_SCHEMA } from '@angular/core'; import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { MatButtonModule } from '@angular/material/button'; -import { MatDialogModule } from '@angular/material/dialog'; +import { MatLegacyButtonModule as MatButtonModule } from '@angular/material/legacy-button'; +import { MatLegacyDialogModule as MatDialogModule } from '@angular/material/legacy-dialog'; import { MatIconModule } from '@angular/material/icon'; -import { MatSnackBarModule } from '@angular/material/snack-bar'; +import { MatLegacySnackBarModule as MatSnackBarModule } from '@angular/material/legacy-snack-bar'; import { RouterTestingModule } from '@angular/router/testing'; -import { MatAutocompleteModule } from '@angular/material/autocomplete'; +import { MatLegacyAutocompleteModule as MatAutocompleteModule } from '@angular/material/legacy-autocomplete'; import { RegisterToolService } from 'app/container/register-tool/register-tool.service'; import { MyWorkflowsService } from 'app/myworkflows/myworkflows.service'; import { DescriptorLanguageService } from 'app/shared/entry/descriptor-language.service'; @@ -34,7 +34,6 @@ describe('EntryBoxComponent', () => { beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [EntryBoxComponent], schemas: [NO_ERRORS_SCHEMA], imports: [ MatAutocompleteModule, @@ -44,6 +43,7 @@ describe('EntryBoxComponent', () => { MatDialogModule, HttpClientTestingModule, MatSnackBarModule, + EntryBoxComponent, ], providers: [ { provide: RegisterToolService, useClass: RegisterToolStubService }, diff --git a/src/app/home-page/widget/entry-box/entry-box.component.ts b/src/app/home-page/widget/entry-box/entry-box.component.ts index 515a52262f..52b15cc460 100644 --- a/src/app/home-page/widget/entry-box/entry-box.component.ts +++ b/src/app/home-page/widget/entry-box/entry-box.component.ts @@ -25,12 +25,43 @@ import { Dockstore } from 'app/shared/dockstore.model'; import { AlertService } from 'app/shared/alert/state/alert.service'; import { HttpResponse, HttpErrorResponse } from '@angular/common/http'; import { SessionService } from '../../../shared/session/session.service'; -import { Router } from '@angular/router'; +import { Router, RouterLink } from '@angular/router'; +import { MatLegacyOptionModule } from '@angular/material/legacy-core'; +import { MatIconModule } from '@angular/material/icon'; +import { MatLegacyAutocompleteModule } from '@angular/material/legacy-autocomplete'; +import { FormsModule } from '@angular/forms'; +import { MatLegacyInputModule } from '@angular/material/legacy-input'; +import { MatLegacyFormFieldModule } from '@angular/material/legacy-form-field'; +import { MatDividerModule } from '@angular/material/divider'; +import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { NgIf, NgFor, TitleCasePipe, DatePipe } from '@angular/common'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { MatLegacyCardModule } from '@angular/material/legacy-card'; @Component({ selector: 'app-entry-box', templateUrl: './entry-box.component.html', styleUrls: ['../../../shared/styles/dashboard-boxes.scss'], + standalone: true, + imports: [ + MatLegacyCardModule, + FlexModule, + NgIf, + MatLegacyButtonModule, + MatLegacyTooltipModule, + MatDividerModule, + MatLegacyFormFieldModule, + MatLegacyInputModule, + FormsModule, + MatLegacyAutocompleteModule, + MatIconModule, + NgFor, + MatLegacyOptionModule, + RouterLink, + TitleCasePipe, + DatePipe, + ], }) export class EntryBoxComponent extends Base implements OnInit { Dockstore = Dockstore; diff --git a/src/app/home-page/widget/featured-content/featured-content.component.ts b/src/app/home-page/widget/featured-content/featured-content.component.ts index 4a86ea10a6..0a975c6a14 100644 --- a/src/app/home-page/widget/featured-content/featured-content.component.ts +++ b/src/app/home-page/widget/featured-content/featured-content.component.ts @@ -6,6 +6,7 @@ import { Dockstore } from '../../../shared/dockstore.model'; @Component({ selector: 'app-featured-content', template: `
    `, + standalone: true, }) export class FeaturedContentComponent implements OnInit { public myExternalHTML = ''; diff --git a/src/app/home-page/widget/featured-content/news-and-updates.component.ts b/src/app/home-page/widget/featured-content/news-and-updates.component.ts index be7e107941..410704805b 100644 --- a/src/app/home-page/widget/featured-content/news-and-updates.component.ts +++ b/src/app/home-page/widget/featured-content/news-and-updates.component.ts @@ -7,6 +7,7 @@ import { Dockstore } from '../../../shared/dockstore.model'; selector: 'app-news-and-updates', template: ` `, styleUrls: ['../../../shared/styles/dashboard-boxes.scss'], + standalone: true, }) export class NewsAndUpdatesComponent { // TODO should parameterize FeaturedContentComponent or something diff --git a/src/app/home-page/widget/getting-started/getting-started.component.spec.ts b/src/app/home-page/widget/getting-started/getting-started.component.spec.ts index 562edfdbc8..94d788c00a 100644 --- a/src/app/home-page/widget/getting-started/getting-started.component.spec.ts +++ b/src/app/home-page/widget/getting-started/getting-started.component.spec.ts @@ -1,7 +1,8 @@ import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; - -import { MatButtonModule } from '@angular/material/button'; import { MatIconModule } from '@angular/material/icon'; + +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { RouterTestingModule } from '@angular/router/testing'; import { RouterLinkStubDirective } from '../../../test'; import { GettingStartedComponent } from './getting-started.component'; @@ -12,8 +13,8 @@ describe('GettingStartedComponent', () => { beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [GettingStartedComponent, RouterLinkStubDirective], - imports: [MatIconModule, MatButtonModule], + declarations: [RouterLinkStubDirective], + imports: [RouterTestingModule, MatIconModule, MatLegacyButtonModule, GettingStartedComponent], }).compileComponents(); }) ); diff --git a/src/app/home-page/widget/getting-started/getting-started.component.ts b/src/app/home-page/widget/getting-started/getting-started.component.ts index c88fd7bb49..1b386c5f7b 100644 --- a/src/app/home-page/widget/getting-started/getting-started.component.ts +++ b/src/app/home-page/widget/getting-started/getting-started.component.ts @@ -1,10 +1,15 @@ import { Component } from '@angular/core'; import { Dockstore } from '../../../shared/dockstore.model'; +import { MatIconModule } from '@angular/material/icon'; +import { RouterLink } from '@angular/router'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; @Component({ selector: 'app-getting-started', templateUrl: './getting-started.component.html', styleUrls: ['./getting-started.component.scss'], + standalone: true, + imports: [MatLegacyButtonModule, RouterLink, MatIconModule], }) export class GettingStartedComponent { Dockstore = Dockstore; diff --git a/src/app/home-page/widget/news-box/news-box.component.spec.ts b/src/app/home-page/widget/news-box/news-box.component.spec.ts index 4eca91143b..4d43a241cc 100644 --- a/src/app/home-page/widget/news-box/news-box.component.spec.ts +++ b/src/app/home-page/widget/news-box/news-box.component.spec.ts @@ -1,4 +1,8 @@ +import { HttpClientTestingModule } from '@angular/common/http/testing'; import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { MatDividerModule } from '@angular/material/divider'; +import { MatLegacyCardModule } from '@angular/material/legacy-card'; +import { MatLegacySnackBarModule } from '@angular/material/legacy-snack-bar'; import { NewsBoxComponent } from './news-box.component'; describe('NewsBoxComponent', () => { @@ -7,7 +11,7 @@ describe('NewsBoxComponent', () => { beforeEach(async () => { await TestBed.configureTestingModule({ - declarations: [NewsBoxComponent], + imports: [MatLegacyCardModule, MatDividerModule, NewsBoxComponent, HttpClientTestingModule, MatLegacySnackBarModule], }).compileComponents(); }); diff --git a/src/app/home-page/widget/news-box/news-box.component.ts b/src/app/home-page/widget/news-box/news-box.component.ts index 7806d45758..990b6c51d1 100644 --- a/src/app/home-page/widget/news-box/news-box.component.ts +++ b/src/app/home-page/widget/news-box/news-box.component.ts @@ -1,8 +1,14 @@ import { Component } from '@angular/core'; +import { NewsAndUpdatesComponent } from '../featured-content/news-and-updates.component'; +import { MatDividerModule } from '@angular/material/divider'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { MatLegacyCardModule } from '@angular/material/legacy-card'; @Component({ selector: 'app-news-box', templateUrl: './news-box.component.html', styleUrls: ['../../../shared/styles/dashboard-boxes.scss'], + standalone: true, + imports: [MatLegacyCardModule, FlexModule, MatDividerModule, NewsAndUpdatesComponent], }) export class NewsBoxComponent {} diff --git a/src/app/home-page/widget/news-updates/news-notifications.component.spec.ts b/src/app/home-page/widget/news-updates/news-notifications.component.spec.ts index ae289c871d..1282f9a157 100644 --- a/src/app/home-page/widget/news-updates/news-notifications.component.spec.ts +++ b/src/app/home-page/widget/news-updates/news-notifications.component.spec.ts @@ -10,8 +10,7 @@ describe('NewsNotificationsComponent', () => { beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [NewsNotificationsComponent], - imports: [MarkdownModule, HttpClientTestingModule], + imports: [MarkdownModule, HttpClientTestingModule, NewsNotificationsComponent], }).compileComponents(); }) ); diff --git a/src/app/home-page/widget/news-updates/news-notifications.component.ts b/src/app/home-page/widget/news-updates/news-notifications.component.ts index 49da060f53..aa4b595706 100644 --- a/src/app/home-page/widget/news-updates/news-notifications.component.ts +++ b/src/app/home-page/widget/news-updates/news-notifications.component.ts @@ -2,11 +2,19 @@ import { Component, OnInit } from '@angular/core'; import { Observable } from 'rxjs'; import { NotificationsService } from '../../../notifications/state/notifications.service'; import { Notification } from '../../../shared/openapi'; +import { MatIconModule } from '@angular/material/icon'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { MarkdownWrapperComponent } from '../../../shared/markdown-wrapper/markdown-wrapper.component'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { MatLegacyCardModule } from '@angular/material/legacy-card'; +import { NgFor, AsyncPipe } from '@angular/common'; @Component({ selector: 'app-news-notifications', templateUrl: './news-notifications.component.html', styleUrls: ['./news-notifications.component.scss'], + standalone: true, + imports: [NgFor, MatLegacyCardModule, FlexModule, MarkdownWrapperComponent, MatLegacyButtonModule, MatIconModule, AsyncPipe], }) export class NewsNotificationsComponent implements OnInit { public activeNotifications$: Observable>; diff --git a/src/app/home-page/widget/organization-box/my-organizations-dialog.component/my-organizations-dialog.component.ts b/src/app/home-page/widget/organization-box/my-organizations-dialog.component/my-organizations-dialog.component.ts index 6229d7edc2..644fc37d7b 100644 --- a/src/app/home-page/widget/organization-box/my-organizations-dialog.component/my-organizations-dialog.component.ts +++ b/src/app/home-page/widget/organization-box/my-organizations-dialog.component/my-organizations-dialog.component.ts @@ -1,10 +1,19 @@ import { Component, Inject } from '@angular/core'; -import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog'; +import { + MatLegacyDialogRef as MatDialogRef, + MAT_LEGACY_DIALOG_DATA as MAT_DIALOG_DATA, + MatLegacyDialogModule, +} from '@angular/material/legacy-dialog'; import { OrganizationUpdateTime } from 'app/shared/openapi'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { NgFor, DatePipe } from '@angular/common'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; @Component({ selector: 'app-my-organizations-dialog', templateUrl: './my-organizations-dialog.component.html', + standalone: true, + imports: [FlexModule, MatLegacyDialogModule, NgFor, MatLegacyButtonModule, DatePipe], }) export class MyOrganizationsDialogComponent { constructor( diff --git a/src/app/home-page/widget/organization-box/organization-box.component.ts b/src/app/home-page/widget/organization-box/organization-box.component.ts index 320ea9be3e..997f5d9e1c 100644 --- a/src/app/home-page/widget/organization-box/organization-box.component.ts +++ b/src/app/home-page/widget/organization-box/organization-box.component.ts @@ -1,5 +1,5 @@ import { Component, OnInit } from '@angular/core'; -import { MatDialog } from '@angular/material/dialog'; +import { MatLegacyDialog as MatDialog } from '@angular/material/legacy-dialog'; import { RequestsQuery } from 'app/loginComponents/state/requests.query'; import { RequireAccountsModalComponent } from 'app/organizations/registerOrganization/requireAccountsModal/require-accounts-modal.component'; import { Base } from 'app/shared/base'; @@ -9,12 +9,33 @@ import { bootstrap4mediumModalSize, bootstrap4largeModalSize } from 'app/shared/ import { Observable } from 'rxjs'; import { finalize, takeUntil } from 'rxjs/operators'; import { MyOrganizationsDialogComponent } from './my-organizations-dialog.component/my-organizations-dialog.component'; -import { Router } from '@angular/router'; +import { Router, RouterLink } from '@angular/router'; +import { RecentEventsComponent } from '../../recent-events/recent-events.component'; +import { MatDividerModule } from '@angular/material/divider'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { NgIf, AsyncPipe } from '@angular/common'; +import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; +import { MatIconModule } from '@angular/material/icon'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { MatLegacyCardModule } from '@angular/material/legacy-card'; @Component({ selector: 'app-organization-box', templateUrl: './organization-box.component.html', styleUrls: ['./organization-box.component.scss', '../../../shared/styles/dashboard-boxes.scss'], + standalone: true, + imports: [ + MatLegacyCardModule, + FlexModule, + MatIconModule, + RouterLink, + MatLegacyTooltipModule, + NgIf, + MatLegacyButtonModule, + MatDividerModule, + RecentEventsComponent, + AsyncPipe, + ], }) export class OrganizationBoxComponent extends Base implements OnInit { Dockstore = Dockstore; diff --git a/src/app/home-page/widget/starred-box/starred-box.component.ts b/src/app/home-page/widget/starred-box/starred-box.component.ts index 74f51b9318..ba397ab6c5 100644 --- a/src/app/home-page/widget/starred-box/starred-box.component.ts +++ b/src/app/home-page/widget/starred-box/starred-box.component.ts @@ -2,11 +2,20 @@ import { Component, OnInit } from '@angular/core'; import { Base } from 'app/shared/base'; import { Dockstore } from 'app/shared/dockstore.model'; import { UsersService } from 'app/shared/openapi'; +import { RecentEventsComponent } from '../../recent-events/recent-events.component'; +import { MatDividerModule } from '@angular/material/divider'; +import { NgIf } from '@angular/common'; +import { RouterLink } from '@angular/router'; +import { MatIconModule } from '@angular/material/icon'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { MatLegacyCardModule } from '@angular/material/legacy-card'; @Component({ selector: 'app-starred-box', templateUrl: './starred-box.component.html', styleUrls: ['./starred-box.component.scss', '../../../shared/styles/dashboard-boxes.scss'], + standalone: true, + imports: [MatLegacyCardModule, FlexModule, MatIconModule, RouterLink, NgIf, MatDividerModule, RecentEventsComponent], }) export class StarredBoxComponent extends Base implements OnInit { public Dockstore = Dockstore; diff --git a/src/app/information-dialog/information-dialog.component.ts b/src/app/information-dialog/information-dialog.component.ts index d5720877b9..1675c7cb3c 100644 --- a/src/app/information-dialog/information-dialog.component.ts +++ b/src/app/information-dialog/information-dialog.component.ts @@ -1,5 +1,12 @@ import { Component, Inject } from '@angular/core'; -import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog'; +import { + MatLegacyDialogRef as MatDialogRef, + MAT_LEGACY_DIALOG_DATA as MAT_DIALOG_DATA, + MatLegacyDialogModule, +} from '@angular/material/legacy-dialog'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { NgIf } from '@angular/common'; export class InformationDialogData { message?: string; @@ -10,6 +17,8 @@ export class InformationDialogData { @Component({ selector: 'app-information-dialog', templateUrl: './information-dialog.component.html', + standalone: true, + imports: [NgIf, MatLegacyDialogModule, FlexModule, MatLegacyButtonModule], }) export class InformationDialogComponent { constructor(public dialogRef: MatDialogRef, @Inject(MAT_DIALOG_DATA) public data: InformationDialogData) {} diff --git a/src/app/information-dialog/information-dialog.service.ts b/src/app/information-dialog/information-dialog.service.ts index 3d15c42dee..38574ce420 100644 --- a/src/app/information-dialog/information-dialog.service.ts +++ b/src/app/information-dialog/information-dialog.service.ts @@ -1,5 +1,5 @@ import { Injectable } from '@angular/core'; -import { MatDialog } from '@angular/material/dialog'; +import { MatLegacyDialog as MatDialog } from '@angular/material/legacy-dialog'; import { Observable } from 'rxjs'; import { InformationDialogComponent, InformationDialogData } from './information-dialog.component'; diff --git a/src/app/login/login.component.html b/src/app/login/login.component.html index 10c691ecba..d6e17bb0a7 100644 --- a/src/app/login/login.component.html +++ b/src/app/login/login.component.html @@ -17,7 +17,7 @@
    -

    Login to Collaboratory Dockstore

    +

    Login to Dockstore

    diff --git a/src/app/login/login.component.spec.ts b/src/app/login/login.component.spec.ts index 9e1a962fc8..80a04b7fe8 100644 --- a/src/app/login/login.component.spec.ts +++ b/src/app/login/login.component.spec.ts @@ -15,9 +15,12 @@ */ import { NO_ERRORS_SCHEMA } from '@angular/core'; import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { MatLegacySnackBarModule } from '@angular/material/legacy-snack-bar'; +import { NoopAnimationsModule } from '@angular/platform-browser/animations'; import { RouterTestingModule } from '@angular/router/testing'; import { RegisterService } from '../register/register.service'; +import { ProviderService } from '../shared/provider.service'; import { TrackLoginService } from '../shared/track-login.service'; import { UserService } from '../shared/user/user.service'; import { LoginStubService, TrackLoginStubService, UserStubService } from '../test/service-stubs'; @@ -31,14 +34,14 @@ describe('LoginComponent', () => { beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [LoginComponent], schemas: [NO_ERRORS_SCHEMA], - imports: [RouterTestingModule], + imports: [RouterTestingModule, LoginComponent, MatLegacySnackBarModule, NoopAnimationsModule], providers: [ { provide: TrackLoginService, useClass: TrackLoginStubService }, { provide: UserService, useClass: UserStubService }, { provide: LoginService, useClass: LoginStubService }, { provide: RegisterService, useClass: LoginStubService }, + ProviderService, ], }).compileComponents(); }) diff --git a/src/app/login/login.component.ts b/src/app/login/login.component.ts index 40913145d1..1628759388 100644 --- a/src/app/login/login.component.ts +++ b/src/app/login/login.component.ts @@ -23,11 +23,32 @@ import { RegisterService } from '../register/register.service'; import { TrackLoginService } from '../shared/track-login.service'; import { UserService } from '../shared/user/user.service'; import { LoginService } from './login.service'; +import { NgTemplateOutlet } from '@angular/common'; +import { MatLegacyCheckboxModule } from '@angular/material/legacy-checkbox'; +import { FontAwesomeModule } from '@fortawesome/angular-fontawesome'; +import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { MatLegacyTabsModule } from '@angular/material/legacy-tabs'; +import { MatLegacyCardModule } from '@angular/material/legacy-card'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { AlertComponent } from '../shared/alert/alert.component'; @Component({ selector: 'app-login', templateUrl: './login.component.html', styleUrls: ['./login.component.scss'], + standalone: true, + imports: [ + AlertComponent, + FlexModule, + MatLegacyCardModule, + MatLegacyTabsModule, + MatLegacyButtonModule, + MatLegacyTooltipModule, + FontAwesomeModule, + MatLegacyCheckboxModule, + NgTemplateOutlet, + ], }) export class LoginComponent { faGithub = faGithub; diff --git a/src/app/login/login.service.spec.ts b/src/app/login/login.service.spec.ts index 576134d893..eeb3ab5ed4 100644 --- a/src/app/login/login.service.spec.ts +++ b/src/app/login/login.service.spec.ts @@ -14,8 +14,8 @@ * limitations under the License. */ import { inject, TestBed } from '@angular/core/testing'; -import { MatSnackBarModule } from '@angular/material/snack-bar'; -import { AuthService } from 'ng2-ui-auth'; +import { MatLegacySnackBarModule as MatSnackBarModule } from '@angular/material/legacy-snack-bar'; +import { AuthService } from '../ng2-ui-auth/public_api'; import { AuthStubService } from '../test/service-stubs'; import { LoginService } from './login.service'; diff --git a/src/app/login/login.service.ts b/src/app/login/login.service.ts index 72cde2f132..fcd99fb3a7 100644 --- a/src/app/login/login.service.ts +++ b/src/app/login/login.service.ts @@ -15,8 +15,8 @@ */ import { HttpErrorResponse } from '@angular/common/http'; import { Injectable } from '@angular/core'; -import { AuthService } from 'ng2-ui-auth'; import { Observable } from 'rxjs'; +import { AuthService } from '../ng2-ui-auth/public_api'; import { AlertService } from '../shared/alert/state/alert.service'; @Injectable() diff --git a/src/app/loginComponents/accounts/account-sidebar/account-sidebar.component.spec.ts b/src/app/loginComponents/accounts/account-sidebar/account-sidebar.component.spec.ts index f49ca7c40b..a9feafb913 100644 --- a/src/app/loginComponents/accounts/account-sidebar/account-sidebar.component.spec.ts +++ b/src/app/loginComponents/accounts/account-sidebar/account-sidebar.component.spec.ts @@ -1,10 +1,13 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { MatLegacyDialogModule } from '@angular/material/legacy-dialog'; +import { MatLegacySnackBarModule } from '@angular/material/legacy-snack-bar'; +import { RouterTestingModule } from '@angular/router/testing'; import { AccountSidebarComponent } from './account-sidebar.component'; -import { CustomMaterialModule } from 'app/shared/modules/material.module'; -import { FlexLayoutModule } from '@angular/flex-layout'; +import { FlexLayoutModule } from '@ngbracket/ngx-layout'; import { CommonModule } from '@angular/common'; -import { MatTableModule } from '@angular/material/table'; +import { MatLegacyTableModule as MatTableModule } from '@angular/material/legacy-table'; import { UsersService } from '../../../shared/openapi/api/users.service'; import { UserService } from '../../../shared/user/user.service'; import { UsersStubService, UserStubService } from '../../../test/service-stubs'; @@ -16,8 +19,16 @@ describe('AccountSidebarComponent', () => { beforeEach(async () => { await TestBed.configureTestingModule({ - declarations: [AccountSidebarComponent], - imports: [CustomMaterialModule, FlexLayoutModule, CommonModule, MatTableModule], + imports: [ + FlexLayoutModule, + CommonModule, + MatTableModule, + MatLegacyButtonModule, + MatLegacySnackBarModule, + MatLegacyDialogModule, + RouterTestingModule, + AccountSidebarComponent, + ], providers: [ { provide: UsersService, useClass: UsersStubService }, { provide: UserService, useClass: UserStubService }, diff --git a/src/app/loginComponents/accounts/account-sidebar/account-sidebar.component.ts b/src/app/loginComponents/accounts/account-sidebar/account-sidebar.component.ts index 4617854331..78ffbda541 100644 --- a/src/app/loginComponents/accounts/account-sidebar/account-sidebar.component.ts +++ b/src/app/loginComponents/accounts/account-sidebar/account-sidebar.component.ts @@ -9,14 +9,22 @@ import { Profile, User } from '../../../shared/openapi'; import { UsersService } from '../../../shared/openapi/api/users.service'; import { UserQuery } from '../../../shared/user/user.query'; import { UserService } from '../../../shared/user/user.service'; -import { MatDialog } from '@angular/material/dialog'; +import { MatLegacyDialog as MatDialog } from '@angular/material/legacy-dialog'; import { ChangeUsernameComponent } from '../../../../app/loginComponents/accounts/internal/change-username/change-username.component'; import { bootstrap4largeModalSize } from '../../../shared/constants'; +import { RouterLink } from '@angular/router'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; +import { MatIconModule } from '@angular/material/icon'; +import { NgIf } from '@angular/common'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; @Component({ selector: 'app-account-sidebar', templateUrl: './account-sidebar.component.html', styleUrls: ['./account-sidebar.component.scss'], + standalone: true, + imports: [FlexModule, NgIf, MatIconModule, MatLegacyTooltipModule, MatLegacyButtonModule, RouterLink], }) export class AccountSidebarComponent implements OnInit { user: User; diff --git a/src/app/loginComponents/accounts/account-sidebar/account-sidebar.module.ts b/src/app/loginComponents/accounts/account-sidebar/account-sidebar.module.ts deleted file mode 100644 index 6141587033..0000000000 --- a/src/app/loginComponents/accounts/account-sidebar/account-sidebar.module.ts +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright 2022 OICR - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { NgModule } from '@angular/core'; -import { AccountSidebarComponent } from './account-sidebar.component'; -import { CustomMaterialModule } from 'app/shared/modules/material.module'; -import { FlexLayoutModule } from '@angular/flex-layout'; -import { CommonModule } from '@angular/common'; -import { RouterModule } from '@angular/router'; -import { ChangeUsernameModule } from '../internal/change-username/change-username.module'; - -@NgModule({ - declarations: [AccountSidebarComponent], - imports: [CustomMaterialModule, FlexLayoutModule, CommonModule, RouterModule, ChangeUsernameModule], - providers: [], - exports: [AccountSidebarComponent], -}) -export class AccountSidebarModule {} diff --git a/src/app/loginComponents/accounts/accounts.component.ts b/src/app/loginComponents/accounts/accounts.component.ts index f1983bc7c8..c7851b5eff 100644 --- a/src/app/loginComponents/accounts/accounts.component.ts +++ b/src/app/loginComponents/accounts/accounts.component.ts @@ -1,16 +1,34 @@ import { Location } from '@angular/common'; import { Component, OnInit } from '@angular/core'; import { UntypedFormControl } from '@angular/forms'; -import { MatTabChangeEvent } from '@angular/material/tabs'; +import { MatLegacyTabChangeEvent as MatTabChangeEvent, MatLegacyTabsModule } from '@angular/material/legacy-tabs'; import { ActivatedRoute, Params } from '@angular/router'; import { Observable } from 'rxjs'; import { takeUntil } from 'rxjs/operators'; import { Base } from '../../shared/base'; +import { RequestsComponent } from '../requests/requests.component'; +import { ControlsComponent } from './controls/controls.component'; +import { AccountsExternalComponent } from './external/accounts.component'; +import { AccountSidebarComponent } from './account-sidebar/account-sidebar.component'; +import { HeaderComponent } from '../../header/header.component'; +import { MySidebarComponent } from '../../my-sidebar/my-sidebar.component'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; @Component({ selector: 'app-accounts', templateUrl: './accounts.component.html', styleUrls: ['./accounts.component.scss'], + standalone: true, + imports: [ + FlexModule, + MySidebarComponent, + HeaderComponent, + AccountSidebarComponent, + MatLegacyTabsModule, + AccountsExternalComponent, + ControlsComponent, + RequestsComponent, + ], }) export class AccountsComponent extends Base implements OnInit { public currentTab = 'accounts'; // default to the 'accounts' tab diff --git a/src/app/loginComponents/accounts/controls/controls.component.spec.ts b/src/app/loginComponents/accounts/controls/controls.component.spec.ts index 3c9f0303a0..924f1ee536 100644 --- a/src/app/loginComponents/accounts/controls/controls.component.spec.ts +++ b/src/app/loginComponents/accounts/controls/controls.component.spec.ts @@ -2,7 +2,6 @@ import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; import { ReactiveFormsModule } from '@angular/forms'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; -import { CustomMaterialModule } from '../../../shared/modules/material.module'; import { RefreshService } from '../../../shared/refresh.service'; import { UsersService } from '../../../shared/openapi'; import { UserService } from '../../../shared/user/user.service'; @@ -17,8 +16,7 @@ describe('ControlsComponent', () => { beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [ControlsComponent, ChangeUsernameComponent], - imports: [CustomMaterialModule, BrowserAnimationsModule, ReactiveFormsModule], + imports: [BrowserAnimationsModule, ReactiveFormsModule, ControlsComponent, ChangeUsernameComponent], providers: [ { provide: UserService, useClass: UserStubService }, { provide: UsersService, useClass: UsersStubService }, diff --git a/src/app/loginComponents/accounts/controls/controls.component.ts b/src/app/loginComponents/accounts/controls/controls.component.ts index 24265ce5d0..ce3e898d96 100644 --- a/src/app/loginComponents/accounts/controls/controls.component.ts +++ b/src/app/loginComponents/accounts/controls/controls.component.ts @@ -1,15 +1,21 @@ import { Component, OnInit } from '@angular/core'; -import { MatDialog } from '@angular/material/dialog'; +import { MatLegacyDialog as MatDialog } from '@angular/material/legacy-dialog'; import { Observable } from 'rxjs'; import { UsersService } from '../../../shared/openapi'; import { UserQuery } from '../../../shared/user/user.query'; import { UserService } from '../../../shared/user/user.service'; import { DeleteAccountDialogComponent } from './delete-account-dialog/delete-account-dialog.component'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { MatIconModule } from '@angular/material/icon'; +import { MatLegacyCardModule } from '@angular/material/legacy-card'; +import { NgIf, AsyncPipe } from '@angular/common'; @Component({ selector: 'app-controls', templateUrl: './controls.component.html', styleUrls: ['./controls.component.scss'], + standalone: true, + imports: [NgIf, MatLegacyCardModule, MatIconModule, MatLegacyButtonModule, AsyncPipe], }) export class ControlsComponent implements OnInit { public canChangeUsername$: Observable; diff --git a/src/app/loginComponents/accounts/controls/delete-account-dialog/delete-account-dialog.component.spec.ts b/src/app/loginComponents/accounts/controls/delete-account-dialog/delete-account-dialog.component.spec.ts index 9e84c19427..006cb0fd19 100644 --- a/src/app/loginComponents/accounts/controls/delete-account-dialog/delete-account-dialog.component.spec.ts +++ b/src/app/loginComponents/accounts/controls/delete-account-dialog/delete-account-dialog.component.spec.ts @@ -1,10 +1,10 @@ import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; import { ReactiveFormsModule } from '@angular/forms'; -import { MatDialogRef } from '@angular/material/dialog'; +import { MatLegacyDialogRef as MatDialogRef } from '@angular/material/legacy-dialog'; import { NO_ERRORS_SCHEMA } from '@angular/core'; +import { MatLegacySnackBarModule } from '@angular/material/legacy-snack-bar'; import { LogoutService } from '../../../../shared/logout.service'; -import { CustomMaterialModule } from '../../../../shared/modules/material.module'; import { UsersService } from '../../../../shared/openapi'; import { LogoutStubService, UsersStubService } from '../../../../test/service-stubs'; import { DeleteAccountDialogComponent } from './delete-account-dialog.component'; @@ -16,9 +16,8 @@ describe('DeleteAccountDialogComponent', () => { beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [DeleteAccountDialogComponent], schemas: [NO_ERRORS_SCHEMA], - imports: [CustomMaterialModule, ReactiveFormsModule], + imports: [ReactiveFormsModule, DeleteAccountDialogComponent, MatLegacySnackBarModule], providers: [ { provide: LogoutService, useClass: LogoutStubService }, { provide: UsersService, useClass: UsersStubService }, diff --git a/src/app/loginComponents/accounts/controls/delete-account-dialog/delete-account-dialog.component.ts b/src/app/loginComponents/accounts/controls/delete-account-dialog/delete-account-dialog.component.ts index 3088c29cdb..0eb5cf050d 100644 --- a/src/app/loginComponents/accounts/controls/delete-account-dialog/delete-account-dialog.component.ts +++ b/src/app/loginComponents/accounts/controls/delete-account-dialog/delete-account-dialog.component.ts @@ -1,19 +1,46 @@ import { HttpErrorResponse } from '@angular/common/http'; import { Component, OnDestroy } from '@angular/core'; -import { AbstractControl, UntypedFormBuilder, UntypedFormControl, UntypedFormGroup, ValidatorFn, Validators } from '@angular/forms'; -import { MatDialogRef } from '@angular/material/dialog'; -import { MatSnackBar } from '@angular/material/snack-bar'; +import { + AbstractControl, + UntypedFormBuilder, + UntypedFormControl, + UntypedFormGroup, + ValidatorFn, + Validators, + FormsModule, + ReactiveFormsModule, +} from '@angular/forms'; +import { MatLegacyDialogRef as MatDialogRef, MatLegacyDialogModule } from '@angular/material/legacy-dialog'; +import { MatLegacySnackBar as MatSnackBar } from '@angular/material/legacy-snack-bar'; import { Subject } from 'rxjs'; import { finalize, takeUntil } from 'rxjs/operators'; import { LogoutService } from '../../../../shared/logout.service'; import { UsersService } from '../../../../shared/openapi'; import { UserQuery } from '../../../../shared/user/user.query'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { MatLegacyInputModule } from '@angular/material/legacy-input'; +import { MatLegacyFormFieldModule } from '@angular/material/legacy-form-field'; +import { NgIf } from '@angular/common'; +import { MatDividerModule } from '@angular/material/divider'; +import { AlertComponent } from '../../../../shared/alert/alert.component'; @Component({ selector: 'app-delete-account-dialog', templateUrl: './delete-account-dialog.component.html', styleUrls: ['./delete-account-dialog.component.scss'], + standalone: true, + imports: [ + MatLegacyDialogModule, + AlertComponent, + MatDividerModule, + NgIf, + FormsModule, + ReactiveFormsModule, + MatLegacyFormFieldModule, + MatLegacyInputModule, + MatLegacyButtonModule, + ], }) export class DeleteAccountDialogComponent implements OnDestroy { username = ''; diff --git a/src/app/loginComponents/accounts/external/accounts.component.ts b/src/app/loginComponents/accounts/external/accounts.component.ts index 0567ee2c33..5354f1da93 100644 --- a/src/app/loginComponents/accounts/external/accounts.component.ts +++ b/src/app/loginComponents/accounts/external/accounts.component.ts @@ -14,11 +14,11 @@ * limitations under the License. */ import { Component, OnDestroy, OnInit } from '@angular/core'; -import { MatSnackBar } from '@angular/material/snack-bar'; -import { Router } from '@angular/router'; -import { AuthService } from 'ng2-ui-auth'; +import { MatLegacySnackBar as MatSnackBar } from '@angular/material/legacy-snack-bar'; +import { Router, RouterLink } from '@angular/router'; import { Observable, Subject } from 'rxjs'; import { first, map, takeUntil } from 'rxjs/operators'; +import { AuthService } from '../../../ng2-ui-auth/public_api'; import { Dockstore } from '../../../shared/dockstore.model'; import { TokenSource } from '../../../shared/enum/token-source.enum'; import { TokenQuery } from '../../../shared/state/token.query'; @@ -30,10 +30,23 @@ import { TokenUser } from './../../../shared/openapi/model/tokenUser'; import { AccountsService } from './accounts.service'; import { LogoutService } from '../../../shared/logout.service'; import { RevokeTokenDialogComponent } from './revoke-token-dialog/revoke-token-dialog.component'; -import { MatDialog } from '@angular/material/dialog'; +import { MatLegacyDialog as MatDialog } from '@angular/material/legacy-dialog'; import { accountInfo, bootstrap4largeModalSize } from '../../../shared/constants'; import { AlertService } from '../../../shared/alert/state/alert.service'; import { HttpErrorResponse } from '@angular/common/http'; +import { GetTokenUsernamePipe } from './getTokenUsername.pipe'; +import { MatIconModule } from '@angular/material/icon'; +import { ClipboardModule } from '@angular/cdk/clipboard'; +import { SnackbarDirective } from '../../../shared/snackbar.directive'; +import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { MatLegacyInputModule } from '@angular/material/legacy-input'; +import { MatLegacyFormFieldModule } from '@angular/material/legacy-form-field'; +import { MatLegacyChipsModule } from '@angular/material/legacy-chips'; +import { MatBadgeModule } from '@angular/material/badge'; +import { MatLegacyCardModule } from '@angular/material/legacy-card'; +import { NgIf, NgFor, AsyncPipe } from '@angular/common'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; export interface AccountInfo { name: string; @@ -53,6 +66,25 @@ export interface AccountInfo { selector: 'app-accounts-external', templateUrl: './accounts.component.html', styleUrls: ['./accounts.component.scss'], + standalone: true, + imports: [ + FlexModule, + NgIf, + MatLegacyCardModule, + MatBadgeModule, + MatLegacyChipsModule, + RouterLink, + MatLegacyFormFieldModule, + MatLegacyInputModule, + MatLegacyButtonModule, + MatLegacyTooltipModule, + SnackbarDirective, + ClipboardModule, + MatIconModule, + NgFor, + AsyncPipe, + GetTokenUsernamePipe, + ], }) export class AccountsExternalComponent implements OnInit, OnDestroy { public dsServerURI: any; diff --git a/src/app/loginComponents/accounts/external/getTokenUsername.pipe.ts b/src/app/loginComponents/accounts/external/getTokenUsername.pipe.ts index 002bc34766..999701ccb1 100644 --- a/src/app/loginComponents/accounts/external/getTokenUsername.pipe.ts +++ b/src/app/loginComponents/accounts/external/getTokenUsername.pipe.ts @@ -4,6 +4,7 @@ import { TokenUser } from './../../../shared/openapi/model/tokenUser'; @Pipe({ name: 'getTokenUsername', + standalone: true, }) export class GetTokenUsernamePipe implements PipeTransform { /** diff --git a/src/app/loginComponents/accounts/external/revoke-token-dialog/revoke-token-dialog.component.ts b/src/app/loginComponents/accounts/external/revoke-token-dialog/revoke-token-dialog.component.ts index b43a45b8f7..87b26f9e92 100644 --- a/src/app/loginComponents/accounts/external/revoke-token-dialog/revoke-token-dialog.component.ts +++ b/src/app/loginComponents/accounts/external/revoke-token-dialog/revoke-token-dialog.component.ts @@ -15,16 +15,45 @@ */ import { Component, OnDestroy } from '@angular/core'; -import { AbstractControl, FormBuilder, FormControl, FormGroup, ValidatorFn, Validators } from '@angular/forms'; -import { MatDialogRef } from '@angular/material/dialog'; +import { + AbstractControl, + FormBuilder, + FormControl, + FormGroup, + ValidatorFn, + Validators, + FormsModule, + ReactiveFormsModule, +} from '@angular/forms'; +import { MatLegacyDialogRef as MatDialogRef, MatLegacyDialogModule } from '@angular/material/legacy-dialog'; import { takeUntil } from 'rxjs/operators'; import { UserQuery } from '../../../../shared/user/user.query'; import { Base } from '../../../../shared/base'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { MatLegacyInputModule } from '@angular/material/legacy-input'; +import { MatLegacyFormFieldModule } from '@angular/material/legacy-form-field'; +import { NgIf } from '@angular/common'; +import { MatDividerModule } from '@angular/material/divider'; +import { AlertComponent } from '../../../../shared/alert/alert.component'; @Component({ selector: 'app-revoke-token-dialog', templateUrl: './revoke-token-dialog.component.html', styleUrls: ['./revoke-token-dialog.component.scss'], + standalone: true, + imports: [ + MatLegacyDialogModule, + AlertComponent, + MatDividerModule, + NgIf, + FormsModule, + ReactiveFormsModule, + MatLegacyFormFieldModule, + MatLegacyInputModule, + FlexModule, + MatLegacyButtonModule, + ], }) export class RevokeTokenDialogComponent extends Base implements OnDestroy { username = ''; diff --git a/src/app/loginComponents/accounts/internal/change-username/change-username.component.spec.ts b/src/app/loginComponents/accounts/internal/change-username/change-username.component.spec.ts index 608d89f163..d1d840257b 100644 --- a/src/app/loginComponents/accounts/internal/change-username/change-username.component.spec.ts +++ b/src/app/loginComponents/accounts/internal/change-username/change-username.component.spec.ts @@ -1,12 +1,12 @@ import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; import { ReactiveFormsModule } from '@angular/forms'; -import { MatButtonModule } from '@angular/material/button'; -import { MatCardModule } from '@angular/material/card'; -import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatLegacyButtonModule as MatButtonModule } from '@angular/material/legacy-button'; +import { MatLegacyCardModule as MatCardModule } from '@angular/material/legacy-card'; +import { MatLegacyFormFieldModule as MatFormFieldModule } from '@angular/material/legacy-form-field'; import { MatIconModule } from '@angular/material/icon'; -import { MatInputModule } from '@angular/material/input'; -import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; -import { MatTooltipModule } from '@angular/material/tooltip'; +import { MatLegacyInputModule as MatInputModule } from '@angular/material/legacy-input'; +import { MatLegacyProgressSpinnerModule as MatProgressSpinnerModule } from '@angular/material/legacy-progress-spinner'; +import { MatLegacyTooltipModule as MatTooltipModule } from '@angular/material/legacy-tooltip'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { RefreshService } from '../../../../shared/refresh.service'; @@ -22,7 +22,6 @@ describe('ChangeUsernameComponent', () => { beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [ChangeUsernameComponent], imports: [ ReactiveFormsModule, MatIconModule, @@ -33,6 +32,7 @@ describe('ChangeUsernameComponent', () => { MatFormFieldModule, MatCardModule, BrowserAnimationsModule, + ChangeUsernameComponent, ], providers: [ { provide: UserService, useClass: UserStubService }, diff --git a/src/app/loginComponents/accounts/internal/change-username/change-username.component.ts b/src/app/loginComponents/accounts/internal/change-username/change-username.component.ts index 50733798c5..e6e544053b 100644 --- a/src/app/loginComponents/accounts/internal/change-username/change-username.component.ts +++ b/src/app/loginComponents/accounts/internal/change-username/change-username.component.ts @@ -14,7 +14,7 @@ * limitations under the License. */ import { Component, Input, OnInit } from '@angular/core'; -import { UntypedFormControl, Validators } from '@angular/forms'; +import { UntypedFormControl, Validators, FormsModule, ReactiveFormsModule } from '@angular/forms'; import { Observable, Subject } from 'rxjs'; import { debounceTime, finalize, takeUntil } from 'rxjs/operators'; import { formInputDebounceTime } from '../../../../shared/constants'; @@ -23,11 +23,33 @@ import { User } from '../../../../shared/openapi/model/user'; import { UserQuery } from '../../../../shared/user/user.query'; import { UserService } from '../../../../shared/user/user.service'; import { UsersService } from './../../../../shared/openapi/api/users.service'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { MatLegacyInputModule } from '@angular/material/legacy-input'; +import { MatLegacyFormFieldModule } from '@angular/material/legacy-form-field'; +import { MatIconModule } from '@angular/material/icon'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { MatLegacyCardModule } from '@angular/material/legacy-card'; +import { MatLegacyDialogModule } from '@angular/material/legacy-dialog'; +import { NgIf, AsyncPipe } from '@angular/common'; @Component({ selector: 'app-change-username', templateUrl: './change-username.component.html', styleUrls: ['./change-username.component.scss'], + standalone: true, + imports: [ + NgIf, + MatLegacyDialogModule, + MatLegacyCardModule, + FlexModule, + MatIconModule, + MatLegacyFormFieldModule, + MatLegacyInputModule, + FormsModule, + ReactiveFormsModule, + MatLegacyButtonModule, + AsyncPipe, + ], }) export class ChangeUsernameComponent implements OnInit { @Input() noDialog: boolean; diff --git a/src/app/loginComponents/accounts/internal/change-username/change-username.module.ts b/src/app/loginComponents/accounts/internal/change-username/change-username.module.ts deleted file mode 100644 index 968766ab54..0000000000 --- a/src/app/loginComponents/accounts/internal/change-username/change-username.module.ts +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright 2022 OICR - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { NgModule } from '@angular/core'; -import { CustomMaterialModule } from 'app/shared/modules/material.module'; -import { FlexLayoutModule } from '@angular/flex-layout'; -import { CommonModule } from '@angular/common'; -import { ChangeUsernameComponent } from './change-username.component'; -import { ReactiveFormsModule } from '@angular/forms'; - -@NgModule({ - declarations: [ChangeUsernameComponent], - imports: [CustomMaterialModule, FlexLayoutModule, CommonModule, ReactiveFormsModule], - providers: [], - exports: [ChangeUsernameComponent], -}) -export class ChangeUsernameModule {} diff --git a/src/app/loginComponents/auth/auth.component.spec.ts b/src/app/loginComponents/auth/auth.component.spec.ts index b5ff2ea4bc..9349726431 100644 --- a/src/app/loginComponents/auth/auth.component.spec.ts +++ b/src/app/loginComponents/auth/auth.component.spec.ts @@ -1,7 +1,7 @@ import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; import { RouterTestingModule } from '@angular/router/testing'; -import { MatSnackBarModule } from '@angular/material/snack-bar'; +import { MatLegacySnackBarModule as MatSnackBarModule } from '@angular/material/legacy-snack-bar'; import { TokenService } from '../../shared/state/token.service'; import { UserService } from '../../shared/user/user.service'; import { TokenStubService, UserStubService } from '../../test/service-stubs'; @@ -14,8 +14,7 @@ describe('AuthComponent', () => { beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [AuthComponent], - imports: [RouterTestingModule.withRoutes([{ path: '**', component: AuthComponent }]), MatSnackBarModule], + imports: [RouterTestingModule.withRoutes([{ path: '**', component: AuthComponent }]), MatSnackBarModule, AuthComponent], providers: [ { provide: UserService, useClass: UserStubService }, { provide: TokenService, useClass: TokenStubService }, diff --git a/src/app/loginComponents/auth/auth.component.ts b/src/app/loginComponents/auth/auth.component.ts index 5ed1268068..aaf13c26ed 100644 --- a/src/app/loginComponents/auth/auth.component.ts +++ b/src/app/loginComponents/auth/auth.component.ts @@ -13,6 +13,7 @@ import { TokenService } from '../../shared/state/token.service'; @Component({ selector: 'app-auth', templateUrl: './auth.component.html', + standalone: true, }) export class AuthComponent extends Base implements OnInit { Dockstore = Dockstore; diff --git a/src/app/loginComponents/onboarding/downloadcliclient/downloadcliclient.component.spec.ts b/src/app/loginComponents/onboarding/downloadcliclient/downloadcliclient.component.spec.ts index a8c57245a7..55715caf69 100644 --- a/src/app/loginComponents/onboarding/downloadcliclient/downloadcliclient.component.spec.ts +++ b/src/app/loginComponents/onboarding/downloadcliclient/downloadcliclient.component.spec.ts @@ -1,19 +1,19 @@ import { ClipboardModule } from '@angular/cdk/clipboard'; import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { AuthService } from 'ng2-ui-auth'; import { HttpClientTestingModule } from '@angular/common/http/testing'; -import { MatButtonModule } from '@angular/material/button'; +import { MatLegacyButtonModule as MatButtonModule } from '@angular/material/legacy-button'; import { MatIconModule } from '@angular/material/icon'; -import { MatTabsModule } from '@angular/material/tabs'; +import { MatLegacyTabsModule as MatTabsModule } from '@angular/material/legacy-tabs'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; import { MarkdownModule } from 'ngx-markdown'; +import { AuthService } from '../../../ng2-ui-auth/public_api'; import { MetadataService, GA4GHV20Service } from '../../../shared/openapi'; import { ServiceInfoService } from '../../../service-info/service-info.service'; import { RouterLinkStubDirective, RouterOutletStubComponent } from './../../../test/router-stubs'; import { AuthStubService, GA4GHV20StubService } from './../../../test/service-stubs'; import { DownloadCLIClientComponent } from './downloadcliclient.component'; -import { MatSnackBarModule } from '@angular/material/snack-bar'; +import { MatLegacySnackBarModule as MatSnackBarModule } from '@angular/material/legacy-snack-bar'; describe('DownloadCLIClientComponent', () => { let component: DownloadCLIClientComponent; @@ -22,7 +22,7 @@ describe('DownloadCLIClientComponent', () => { beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [DownloadCLIClientComponent, RouterLinkStubDirective, RouterOutletStubComponent], + declarations: [RouterLinkStubDirective, RouterOutletStubComponent], imports: [ ClipboardModule, MarkdownModule.forRoot(), @@ -32,6 +32,7 @@ describe('DownloadCLIClientComponent', () => { MatSnackBarModule, MatTabsModule, NoopAnimationsModule, + DownloadCLIClientComponent, ], providers: [ { provide: AuthService, useClass: AuthStubService }, diff --git a/src/app/loginComponents/onboarding/downloadcliclient/downloadcliclient.component.ts b/src/app/loginComponents/onboarding/downloadcliclient/downloadcliclient.component.ts index ea94e786b8..64756b879d 100644 --- a/src/app/loginComponents/onboarding/downloadcliclient/downloadcliclient.component.ts +++ b/src/app/loginComponents/onboarding/downloadcliclient/downloadcliclient.component.ts @@ -1,6 +1,6 @@ /* eslint-disable max-len */ -import { Component, EventEmitter, OnInit } from '@angular/core'; -import { AuthService } from 'ng2-ui-auth'; +import { Component, OnInit } from '@angular/core'; +import { AuthService } from '../../../ng2-ui-auth/public_api'; import { Dockstore } from '../../../shared/dockstore.model'; import { MetadataService, TRSService } from '../../../shared/openapi'; import { ServiceInfoService } from '../../../service-info/service-info.service'; @@ -8,11 +8,31 @@ import { AlertService } from './../../../shared/alert/state/alert.service'; import { forkJoin } from 'rxjs'; import { finalize, takeUntil } from 'rxjs/operators'; import { Base } from 'app/shared/base'; +import { ClipboardModule } from '@angular/cdk/clipboard'; +import { ExtendedModule } from '@ngbracket/ngx-layout/extended'; +import { SnackbarDirective } from '../../../shared/snackbar.directive'; +import { MatIconModule } from '@angular/material/icon'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { NgIf, NgClass } from '@angular/common'; +import { MatLegacyTabsModule } from '@angular/material/legacy-tabs'; +import { MarkdownModule } from 'ngx-markdown'; @Component({ selector: 'app-downloadcliclient', templateUrl: './downloadcliclient.component.html', styleUrls: ['./downloadcliclient.component.scss'], + standalone: true, + imports: [ + MarkdownModule, + MatLegacyTabsModule, + NgIf, + MatLegacyButtonModule, + MatIconModule, + SnackbarDirective, + NgClass, + ExtendedModule, + ClipboardModule, + ], }) export class DownloadCLIClientComponent extends Base implements OnInit { public downloadCli = 'dummy-start-value'; @@ -123,6 +143,7 @@ There are several ways to install Java on Mac OS. Here are some examples: After you've installed Java, make sure the version is correct by running \`java -version\` in the terminal, and verifying the major version is 17 or greater. + #### Part 2 - Install Docker Install Docker following the instructions on [Docker's website](https://docs.docker.com/docker-for-mac/install/). You should have at least version 4.3.0 installed. Make sure to install the correct version for your hardware. `; @@ -168,7 +189,7 @@ At this point, you now have the Dockstore CLI set up for interacting with the Do #### Part 6 - Install cwltool (Optional) Dockstore relies on [cwltool](https://github.com/common-workflow-language/cwltool) - a reference implementation of CWL - for local execution of tools and workflows described with CWL. -You'll need to have Python 3 and [pipx](https://pipx.pypa.io/latest/installation/) to be installed on your machine. +You'll need to have Python 3.10+ and [pipx](https://pipx.pypa.io/latest/installation/) to be installed on your machine. **Note:** cwltool must be available on your PATH for the Dockstore CLI to find it. diff --git a/src/app/loginComponents/onboarding/onboarding.component.ts b/src/app/loginComponents/onboarding/onboarding.component.ts index edca9ef82f..ce33911516 100644 --- a/src/app/loginComponents/onboarding/onboarding.component.ts +++ b/src/app/loginComponents/onboarding/onboarding.component.ts @@ -5,11 +5,36 @@ import { Dockstore } from '../../shared/dockstore.model'; import { TokenQuery } from '../../shared/state/token.query'; import { ExtendedUserData, User } from '../../shared/openapi'; import { UserQuery } from '../../shared/user/user.query'; +import { MatDividerModule } from '@angular/material/divider'; +import { RouterLink } from '@angular/router'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { DownloadCLIClientComponent } from './downloadcliclient/downloadcliclient.component'; +import { AccountsExternalComponent } from '../accounts/external/accounts.component'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { ChangeUsernameComponent } from '../accounts/internal/change-username/change-username.component'; +import { MatStepperModule } from '@angular/material/stepper'; +import { NgIf } from '@angular/common'; +import { MatIconModule } from '@angular/material/icon'; +import { HeaderComponent } from '../../header/header.component'; @Component({ selector: 'app-onboarding', templateUrl: './onboarding.component.html', styleUrls: ['./onboarding.component.scss'], + standalone: true, + imports: [ + HeaderComponent, + MatIconModule, + NgIf, + MatStepperModule, + ChangeUsernameComponent, + MatLegacyButtonModule, + AccountsExternalComponent, + DownloadCLIClientComponent, + FlexModule, + RouterLink, + MatDividerModule, + ], }) export class OnboardingComponent implements OnInit, OnDestroy { public tokenSetComplete: boolean; diff --git a/src/app/loginComponents/onboarding/quickstart.component.ts b/src/app/loginComponents/onboarding/quickstart.component.ts index 2105f52acb..35626b73a5 100644 --- a/src/app/loginComponents/onboarding/quickstart.component.ts +++ b/src/app/loginComponents/onboarding/quickstart.component.ts @@ -15,10 +15,16 @@ */ import { Component, OnInit } from '@angular/core'; import { Dockstore } from '../../shared/dockstore.model'; +import { DownloadCLIClientComponent } from './downloadcliclient/downloadcliclient.component'; +import { NgIf } from '@angular/common'; +import { MatIconModule } from '@angular/material/icon'; +import { HeaderComponent } from '../../header/header.component'; @Component({ selector: 'app-onboarding', templateUrl: './quickstart.component.html', + standalone: true, + imports: [HeaderComponent, MatIconModule, NgIf, DownloadCLIClientComponent], }) export class QuickStartComponent implements OnInit { public curStep = 1; diff --git a/src/app/loginComponents/requests.module.ts b/src/app/loginComponents/requests.module.ts deleted file mode 100644 index 2f5d201a6c..0000000000 --- a/src/app/loginComponents/requests.module.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { FlexLayoutModule } from '@angular/flex-layout'; -import { RouterModule } from '@angular/router'; -import { CustomMaterialModule } from './../shared/modules/material.module'; -import { - OrganizationInviteConfirmDialogComponent, - OrganizationRequestConfirmDialogComponent, - RequestsComponent, -} from './requests/requests.component'; -@NgModule({ - imports: [CommonModule, CustomMaterialModule, RouterModule, FlexLayoutModule], - declarations: [RequestsComponent, OrganizationRequestConfirmDialogComponent, OrganizationInviteConfirmDialogComponent], - exports: [RequestsComponent, OrganizationRequestConfirmDialogComponent, OrganizationInviteConfirmDialogComponent], -}) -export class RequestsModule {} diff --git a/src/app/loginComponents/requests/requests.component.html b/src/app/loginComponents/requests/requests.component.html index e741cc585d..202d21f3c4 100644 --- a/src/app/loginComponents/requests/requests.component.html +++ b/src/app/loginComponents/requests/requests.component.html @@ -12,7 +12,7 @@

    Curator Requests

    - + {{ org.displayName }} @@ -74,7 +74,10 @@

    My Requests

    - + {{ @@ -106,7 +109,10 @@

    My Requests

    info You have no rejected organizations.
    - + warning @@ -155,7 +161,10 @@

    Organization Invites

    - + {{ diff --git a/src/app/loginComponents/requests/requests.component.ts b/src/app/loginComponents/requests/requests.component.ts index 08ea194b7e..3f4eef8366 100644 --- a/src/app/loginComponents/requests/requests.component.ts +++ b/src/app/loginComponents/requests/requests.component.ts @@ -1,5 +1,10 @@ import { Component, Inject, OnInit } from '@angular/core'; -import { MatDialog, MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog'; +import { + MatLegacyDialog as MatDialog, + MatLegacyDialogRef as MatDialogRef, + MAT_LEGACY_DIALOG_DATA as MAT_DIALOG_DATA, + MatLegacyDialogModule, +} from '@angular/material/legacy-dialog'; import { Observable } from 'rxjs'; import { takeUntil } from 'rxjs/operators'; import { ConfirmationDialogData } from '../../confirmation-dialog/confirmation-dialog.component'; @@ -10,10 +15,20 @@ import { Organization, OrganizationUser } from '../../shared/openapi'; import { UserQuery } from '../../shared/user/user.query'; import { RequestsQuery } from '../state/requests.query'; import { RequestsService } from '../state/requests.service'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; +import { RouterLink } from '@angular/router'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { MatIconModule } from '@angular/material/icon'; +import { MatLegacyCardModule } from '@angular/material/legacy-card'; +import { NgIf, NgFor, AsyncPipe, LowerCasePipe, DatePipe } from '@angular/common'; +import { MatLegacyProgressBarModule } from '@angular/material/legacy-progress-bar'; @Component({ selector: 'app-organization-request-confirm-dialog', templateUrl: 'organization-request-confirm-dialog.html', + standalone: true, + imports: [MatLegacyDialogModule, FlexModule, MatLegacyButtonModule, NgIf], }) export class OrganizationRequestConfirmDialogComponent { constructor( @@ -29,6 +44,8 @@ export class OrganizationRequestConfirmDialogComponent { @Component({ selector: 'app-organization-invite-confirm-dialog', templateUrl: 'organization-invite-confirm-dialog.html', + standalone: true, + imports: [MatLegacyDialogModule, FlexModule, MatLegacyButtonModule, NgIf], }) export class OrganizationInviteConfirmDialogComponent { constructor(public dialogRef: MatDialogRef, @Inject(MAT_DIALOG_DATA) public data: DialogData) {} @@ -48,6 +65,21 @@ export interface DialogData { selector: 'app-requests', templateUrl: './requests.component.html', styleUrls: ['./requests.component.scss'], + standalone: true, + imports: [ + MatLegacyProgressBarModule, + NgIf, + MatLegacyCardModule, + MatIconModule, + FlexModule, + NgFor, + RouterLink, + MatLegacyTooltipModule, + MatLegacyButtonModule, + AsyncPipe, + LowerCasePipe, + DatePipe, + ], }) export class RequestsComponent extends Base implements OnInit { public allPendingOrganizations$: Observable>; @@ -143,4 +175,10 @@ export class RequestsComponent extends Base implements OnInit { } }); } + trackByOrg(index: number, item: Organization) { + return item.id; + } + trackByOrgUser(index: number, item: OrganizationUser) { + return item.id; + } } diff --git a/src/app/loginComponents/state/requests.service.spec.ts b/src/app/loginComponents/state/requests.service.spec.ts index ea827485cf..db96cef85c 100644 --- a/src/app/loginComponents/state/requests.service.spec.ts +++ b/src/app/loginComponents/state/requests.service.spec.ts @@ -1,6 +1,6 @@ import { HttpClientTestingModule } from '@angular/common/http/testing'; import { TestBed } from '@angular/core/testing'; -import { MatSnackBarModule } from '@angular/material/snack-bar'; +import { MatLegacySnackBarModule as MatSnackBarModule } from '@angular/material/legacy-snack-bar'; import { RequestsService } from './requests.service'; import { RequestsStore } from './requests.store'; diff --git a/src/app/logout/logout.component.spec.ts b/src/app/logout/logout.component.spec.ts index 3d3d42f2a9..6427aed236 100644 --- a/src/app/logout/logout.component.spec.ts +++ b/src/app/logout/logout.component.spec.ts @@ -1,11 +1,13 @@ import { Component } from '@angular/core'; import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { MatLegacySnackBarModule } from '@angular/material/legacy-snack-bar'; import { LogoutComponent } from './logout.component'; @Component({ selector: 'app-header', template: '', + standalone: true, }) class HeaderComponent {} @@ -16,7 +18,7 @@ describe('LogoutComponent', () => { beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [LogoutComponent, HeaderComponent], + imports: [LogoutComponent, HeaderComponent, MatLegacySnackBarModule], }).compileComponents(); }) ); diff --git a/src/app/logout/logout.component.ts b/src/app/logout/logout.component.ts index e8eb492fe7..3917d97ab2 100644 --- a/src/app/logout/logout.component.ts +++ b/src/app/logout/logout.component.ts @@ -1,8 +1,12 @@ import { Component } from '@angular/core'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { HeaderComponent } from '../header/header.component'; @Component({ selector: 'app-logout', templateUrl: './logout.component.html', styleUrls: ['./logout.component.scss'], + standalone: true, + imports: [HeaderComponent, FlexModule], }) export class LogoutComponent {} diff --git a/src/app/maintenance/maintenance.component.spec.ts b/src/app/maintenance/maintenance.component.spec.ts index da3f7b9482..6f28f3e913 100644 --- a/src/app/maintenance/maintenance.component.spec.ts +++ b/src/app/maintenance/maintenance.component.spec.ts @@ -1,6 +1,6 @@ /* eslint-disable no-unused-vars, @typescript-eslint/no-unused-vars */ import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { MatCardModule } from '@angular/material/card'; +import { MatLegacyCardModule as MatCardModule } from '@angular/material/legacy-card'; import { MatIconModule } from '@angular/material/icon'; import { MaintenanceComponent } from './maintenance.component'; @@ -11,8 +11,7 @@ describe('MaintenanceComponent', () => { beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [MaintenanceComponent], - imports: [MatCardModule, MatIconModule], + imports: [MatCardModule, MatIconModule, MaintenanceComponent], }).compileComponents(); }) ); diff --git a/src/app/maintenance/maintenance.component.ts b/src/app/maintenance/maintenance.component.ts index 5b1344b2c3..c52186d62b 100644 --- a/src/app/maintenance/maintenance.component.ts +++ b/src/app/maintenance/maintenance.component.ts @@ -1,8 +1,12 @@ import { Component } from '@angular/core'; +import { MatIconModule } from '@angular/material/icon'; +import { MatLegacyCardModule } from '@angular/material/legacy-card'; @Component({ selector: 'app-maintenance', templateUrl: './maintenance.component.html', styleUrls: ['./maintenance.component.scss'], + standalone: true, + imports: [MatLegacyCardModule, MatIconModule], }) export class MaintenanceComponent {} diff --git a/src/app/my-notebooks/my-notebooks.module.ts b/src/app/my-notebooks/my-notebooks.module.ts deleted file mode 100644 index 6ca991e898..0000000000 --- a/src/app/my-notebooks/my-notebooks.module.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { NgModule } from '@angular/core'; -import { SharedWorkflowServicesNotebooksModule } from '../shared-workflow-services-notebooks/shared-workflow-services-notebooks.module'; -import { MyNotebooksRoutes } from './my-notebooks.routing'; - -@NgModule({ - imports: [MyNotebooksRoutes, SharedWorkflowServicesNotebooksModule], -}) -export class MyNotebooksModule {} diff --git a/src/app/my-notebooks/my-notebooks.routing.ts b/src/app/my-notebooks/my-notebooks.routing.ts index 401fff4d06..50d9ddb313 100644 --- a/src/app/my-notebooks/my-notebooks.routing.ts +++ b/src/app/my-notebooks/my-notebooks.routing.ts @@ -1,4 +1,4 @@ -import { RouterModule, Routes } from '@angular/router'; +import { Routes } from '@angular/router'; import { MyWorkflowComponent } from '../myworkflows/my-workflow/my-workflow.component'; import { EntryType } from '../shared/enum/entry-type'; @@ -10,4 +10,4 @@ const routes: Routes = [ }, ]; -export const MyNotebooksRoutes = RouterModule.forChild(routes); +export const MyNotebooksRoutes = routes; diff --git a/src/app/my-services/my-services.module.ts b/src/app/my-services/my-services.module.ts deleted file mode 100644 index 36ccc0c66b..0000000000 --- a/src/app/my-services/my-services.module.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { NgModule } from '@angular/core'; -import { SharedWorkflowServicesNotebooksModule } from '../shared-workflow-services-notebooks/shared-workflow-services-notebooks.module'; -import { MyServicesRoutes } from './my-services.routing'; - -@NgModule({ - imports: [MyServicesRoutes, SharedWorkflowServicesNotebooksModule], -}) -export class MyServicesModule {} diff --git a/src/app/my-services/my-services.routing.ts b/src/app/my-services/my-services.routing.ts index 3a536062ed..38c1c16519 100644 --- a/src/app/my-services/my-services.routing.ts +++ b/src/app/my-services/my-services.routing.ts @@ -1,4 +1,4 @@ -import { RouterModule, Routes } from '@angular/router'; +import { Routes } from '@angular/router'; import { MyWorkflowComponent } from '../myworkflows/my-workflow/my-workflow.component'; import { EntryType } from '../shared/enum/entry-type'; @@ -10,4 +10,4 @@ const routes: Routes = [ }, ]; -export const MyServicesRoutes = RouterModule.forChild(routes); +export const MyServicesRoutes = routes; diff --git a/src/app/my-sidebar/my-sidebar.component.spec.ts b/src/app/my-sidebar/my-sidebar.component.spec.ts index e0af42cec9..ade3b3e0f9 100644 --- a/src/app/my-sidebar/my-sidebar.component.spec.ts +++ b/src/app/my-sidebar/my-sidebar.component.spec.ts @@ -1,4 +1,7 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { ProviderService } from '../shared/provider.service'; +import { ActivatedRoute, ActivatedRouteStub } from '../test'; +import { ProviderStubService } from '../test/service-stubs'; import { MySidebarComponent } from './my-sidebar.component'; describe('MySidebarComponent', () => { @@ -7,7 +10,11 @@ describe('MySidebarComponent', () => { beforeEach(async () => { await TestBed.configureTestingModule({ - declarations: [MySidebarComponent], + imports: [MySidebarComponent], + providers: [ + { provide: ProviderService, useClass: ProviderStubService }, + { provide: ActivatedRoute, useClass: ActivatedRouteStub }, + ], }).compileComponents(); }); diff --git a/src/app/my-sidebar/my-sidebar.component.ts b/src/app/my-sidebar/my-sidebar.component.ts index b0948448e6..58aad9cc4b 100644 --- a/src/app/my-sidebar/my-sidebar.component.ts +++ b/src/app/my-sidebar/my-sidebar.component.ts @@ -1,10 +1,15 @@ import { Component } from '@angular/core'; import { Dockstore } from '../shared/dockstore.model'; +import { NgIf } from '@angular/common'; +import { RouterLink, RouterLinkActive } from '@angular/router'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; @Component({ selector: 'app-my-sidebar', templateUrl: './my-sidebar.component.html', styleUrls: ['./my-sidebar.component.scss'], + standalone: true, + imports: [MatLegacyButtonModule, RouterLink, RouterLinkActive, NgIf], }) export class MySidebarComponent { Dockstore = Dockstore; diff --git a/src/app/mytools/my-tool/my-tool.component.html b/src/app/mytools/my-tool/my-tool.component.html index 4a0545736d..83171d687d 100644 --- a/src/app/mytools/my-tool/my-tool.component.html +++ b/src/app/mytools/my-tool/my-tool.component.html @@ -56,6 +56,33 @@ Register a tool Register a Tool + + + +

    You have not registered any tools @@ -71,6 +98,17 @@ [groupEntriesObject]="groupEntriesObject$ | async" [refreshMessage]="isRefreshing$ | async" > +
    + Don't see an organization? +
    Configure + your authorized organizations.

    @@ -105,7 +143,7 @@ class="accent-1-dark-btn" type="button" (click)="addToExistingTools()" - [disabled]="(isRefreshing$ | async) || (userQuery.user$ | async) === false" + [disabled]="(isRefreshing$ | async) || (userQuery.user$ | async) === null" matTooltip="Discover tools added by others using your linked source control accounts" > Discover Existing Dockstore Tools diff --git a/src/app/mytools/my-tool/my-tool.component.ts b/src/app/mytools/my-tool/my-tool.component.ts index 36367e3fff..f8167309e9 100644 --- a/src/app/mytools/my-tool/my-tool.component.ts +++ b/src/app/mytools/my-tool/my-tool.component.ts @@ -14,7 +14,7 @@ * limitations under the License. */ import { Component, OnInit } from '@angular/core'; -import { MatDialog } from '@angular/material/dialog'; +import { MatLegacyDialog as MatDialog } from '@angular/material/legacy-dialog'; import { ActivatedRoute, NavigationEnd, Router, RouterEvent } from '@angular/router'; import { faGithub } from '@fortawesome/free-brands-svg-icons'; import { AlertService } from 'app/shared/alert/state/alert.service'; @@ -22,7 +22,6 @@ import { SessionQuery } from 'app/shared/session/session.query'; import { SessionService } from 'app/shared/session/session.service'; import { MyEntriesQuery } from 'app/shared/state/my-entries.query'; import { MyEntriesStateService } from 'app/shared/state/my-entries.service'; -import { AuthService } from 'ng2-ui-auth'; import { combineLatest, Observable } from 'rxjs'; import { filter, map, takeUntil } from 'rxjs/operators'; import { RegisterToolComponent } from '../../container/register-tool/register-tool.component'; @@ -31,6 +30,7 @@ import { Tool } from '../../container/register-tool/tool'; import { AccountsService } from '../../loginComponents/accounts/external/accounts.service'; import { OrgWorkflowObject } from '../../myworkflows/my-workflow/my-workflow.component'; import { MyWorkflowsService } from '../../myworkflows/myworkflows.service'; +import { AuthService } from '../../ng2-ui-auth/public_api'; import { AlertQuery } from '../../shared/alert/state/alert.query'; import { bootstrap4largeModalSize } from '../../shared/constants'; import { ContainerService } from '../../shared/container.service'; @@ -47,11 +47,45 @@ import { UserQuery } from '../../shared/user/user.query'; import { MytoolsService } from '../mytools.service'; import { EntryType } from '../../shared/enum/entry-type'; import { UserService } from 'app/shared/user/user.service'; +import { ContainerComponent } from '../../container/container.component'; +import { FontAwesomeModule } from '@fortawesome/angular-fontawesome'; +import { MatLegacyCardModule } from '@angular/material/legacy-card'; +import { MatLegacyMenuModule } from '@angular/material/legacy-menu'; +import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; +import { NgIf, AsyncPipe, TitleCasePipe } from '@angular/common'; +import { MatSidenavModule } from '@angular/material/sidenav'; +import { MatIconModule } from '@angular/material/icon'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { HeaderComponent } from '../../header/header.component'; +import { MySidebarComponent } from '../../my-sidebar/my-sidebar.component'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { SidebarAccordionComponent } from '../sidebar-accordion/sidebar-accordion.component'; +import { SidebarAccordionComponent as WorkflowSidebarAccordionComponent } from '../../myworkflows/sidebar-accordion/sidebar-accordion.component'; +import { Dockstore } from 'app/shared/dockstore.model'; @Component({ selector: 'app-my-tool', templateUrl: './my-tool.component.html', styleUrls: ['../../shared/styles/my-entry.component.scss'], + standalone: true, + imports: [ + FlexModule, + MySidebarComponent, + HeaderComponent, + MatLegacyButtonModule, + MatIconModule, + MatSidenavModule, + NgIf, + MatLegacyTooltipModule, + MatLegacyMenuModule, + SidebarAccordionComponent, + WorkflowSidebarAccordionComponent, + MatLegacyCardModule, + FontAwesomeModule, + ContainerComponent, + AsyncPipe, + TitleCasePipe, + ], }) export class MyToolComponent extends MyEntry implements OnInit { faGithub = faGithub; @@ -69,6 +103,7 @@ export class MyToolComponent extends MyEntry implements OnInit { public groupEntriesObject$: Observable>>; public groupAppToolEntryObjects$: Observable>>; EntryType = EntryType; + Dockstore = Dockstore; constructor( private mytoolsService: MytoolsService, protected configuration: Configuration, @@ -115,6 +150,7 @@ export class MyToolComponent extends MyEntry implements OnInit { this.router.events .pipe( filter((event) => event instanceof NavigationEnd), + map((event) => event as NavigationEnd), takeUntil(this.ngUnsubscribe) ) .subscribe((event: RouterEvent) => { @@ -222,7 +258,7 @@ export class MyToolComponent extends MyEntry implements OnInit { addToExistingTools(): void { if (this.user) { - this.userService.addUserToWorkflows(this.user.id); + this.userService.addUserToWorkflows(this.user.id, EntryType.Tool); } } diff --git a/src/app/mytools/mytools.component.ts b/src/app/mytools/mytools.component.ts index 0ca917018f..84fde1e82f 100644 --- a/src/app/mytools/mytools.component.ts +++ b/src/app/mytools/mytools.component.ts @@ -14,10 +14,13 @@ * limitations under the License. */ import { Component } from '@angular/core'; +import { RouterOutlet } from '@angular/router'; @Component({ selector: 'app-mytools', templateUrl: './mytools.component.html', styleUrls: ['./mytools.component.css'], + standalone: true, + imports: [RouterOutlet], }) export class MyToolsComponent {} diff --git a/src/app/mytools/mytools.module.ts b/src/app/mytools/mytools.module.ts deleted file mode 100644 index 59bb759b12..0000000000 --- a/src/app/mytools/mytools.module.ts +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright 2017 OICR - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { FormsModule } from '@angular/forms'; -import { RefreshWizardModule } from 'app/container/refresh-wizard.module'; -import { MyEntriesModule } from 'app/shared/modules/my-entries.module'; -import { RefreshToolOrganizationComponent } from '../container/refresh-tool-organization/refresh-tool-organization.component'; -import { ContainerModule } from '../shared/modules/container.module'; -import { HeaderModule } from '../shared/modules/header.module'; -import { PipeModule } from '../shared/pipe/pipe.module'; -import { RegisterToolService } from './../container/register-tool/register-tool.service'; -import { AccountsService } from './../loginComponents/accounts/external/accounts.service'; -import { CustomMaterialModule } from './../shared/modules/material.module'; -import { MyToolComponent } from './my-tool/my-tool.component'; -import { MyToolsComponent } from './mytools.component'; -import { mytoolsRouting } from './mytools.routing'; -import { MytoolsService } from './mytools.service'; -import { SidebarAccordionComponent } from './sidebar-accordion/sidebar-accordion.component'; -import { SharedWorkflowServicesNotebooksModule } from '../shared-workflow-services-notebooks/shared-workflow-services-notebooks.module'; -import { IsAppToolPipe } from '../search/is-app-tool.pipe'; -import { WorkflowModule } from '../shared/modules/workflow.module'; -import { MySidebarModule } from '../shared/modules/my-sidebar.module'; - -@NgModule({ - declarations: [MyToolsComponent, RefreshToolOrganizationComponent, MyToolComponent, SidebarAccordionComponent], - imports: [ - CommonModule, - ContainerModule, - FormsModule, - HeaderModule, - mytoolsRouting, - CustomMaterialModule, - PipeModule, - MyEntriesModule, - RefreshWizardModule, - SharedWorkflowServicesNotebooksModule, - WorkflowModule, - MySidebarModule, - ], - providers: [RegisterToolService, AccountsService, MytoolsService, IsAppToolPipe], -}) -export class MyToolsModule {} diff --git a/src/app/mytools/mytools.routing.ts b/src/app/mytools/mytools.routing.ts index 77b94ab96e..d0b4b728a8 100644 --- a/src/app/mytools/mytools.routing.ts +++ b/src/app/mytools/mytools.routing.ts @@ -13,8 +13,12 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { RouterModule, Routes } from '@angular/router'; +import { Routes } from '@angular/router'; import { EntryType } from 'app/shared/enum/entry-type'; +import { EmailService } from '../container/email.service'; +import { InfoTabService } from '../container/info-tab/info-tab.service'; +import { ToolLaunchService } from '../container/launch/tool-launch.service'; +import { VersionModalService } from '../container/version-modal/version-modal.service'; import { MyToolComponent } from './my-tool/my-tool.component'; import { MyToolsComponent } from './mytools.component'; @@ -23,7 +27,14 @@ const MYTOOLS_ROUTES: Routes = [ path: '', component: MyToolsComponent, data: { title: 'Dockstore | My Tools' }, - children: [{ path: '**', component: MyToolComponent, data: { title: 'Dockstore | My Tools', entryType: EntryType.Tool } }], + children: [ + { + path: '**', + component: MyToolComponent, + data: { title: 'Dockstore | My Tools', entryType: EntryType.Tool }, + providers: [EmailService, InfoTabService, ToolLaunchService, VersionModalService], + }, + ], }, ]; -export const mytoolsRouting = RouterModule.forChild(MYTOOLS_ROUTES); +export const mytoolsRouting = MYTOOLS_ROUTES; diff --git a/src/app/mytools/mytools.service.spec.ts b/src/app/mytools/mytools.service.spec.ts index 1db7a2eb7d..b41eedf312 100644 --- a/src/app/mytools/mytools.service.spec.ts +++ b/src/app/mytools/mytools.service.spec.ts @@ -16,19 +16,20 @@ import { HttpClientTestingModule } from '@angular/common/http/testing'; import { inject, TestBed } from '@angular/core/testing'; +import { MatLegacySnackBarModule } from '@angular/material/legacy-snack-bar'; import { RouterTestingModule } from '@angular/router/testing'; import { ContainerService } from 'app/shared/container.service'; -import { CustomMaterialModule } from 'app/shared/modules/material.module'; -import { MyEntriesModule } from 'app/shared/modules/my-entries.module'; import { UrlResolverService } from 'app/shared/url-resolver.service'; -import { ContainerStubService, WorkflowsStubService } from 'app/test/service-stubs'; +import { ContainerStubService, DateStubService, WorkflowsStubService } from 'app/test/service-stubs'; +import { MyWorkflowsService } from '../myworkflows/myworkflows.service'; +import { DateService } from '../shared/date.service'; +import { DescriptorLanguageService } from '../shared/entry/descriptor-language.service'; import { DockstoreTool, Workflow, WorkflowsService } from '../shared/openapi'; +import { ProviderService } from '../shared/provider.service'; +import { MyEntriesStateService } from '../shared/state/my-entries.service'; +import { MyEntriesStore } from '../shared/state/my-entries.store'; import { OrgToolObject } from './my-tool/my-tool.component'; import { MytoolsService } from './mytools.service'; -import { DateService } from '../shared/date.service'; -import { MyWorkflowsService } from '../myworkflows/myworkflows.service'; -import { ProviderService } from '../shared/provider.service'; -import { DescriptorLanguageService } from '../shared/entry/descriptor-language.service'; describe('MytoolsService', () => { const tool1: DockstoreTool = { @@ -288,11 +289,13 @@ describe('MytoolsService', () => { { provide: WorkflowsService, useClass: WorkflowsStubService }, { provide: ContainerService, useClass: ContainerStubService }, { provide: UrlResolverService, useclass: UrlResolverService }, - MyWorkflowsService, - DateService, + { provide: DateService, useClass: DateStubService }, { provide: DescriptorLanguageService, useClass: DescriptorLanguageService }, + MyWorkflowsService, + MyEntriesStateService, + MyEntriesStore, ], - imports: [RouterTestingModule, CustomMaterialModule, HttpClientTestingModule, MyEntriesModule], + imports: [RouterTestingModule, HttpClientTestingModule, MatLegacySnackBarModule], }); }); it('should ...', inject([MytoolsService], (service: MytoolsService) => { diff --git a/src/app/mytools/sidebar-accordion/sidebar-accordion.component.spec.ts b/src/app/mytools/sidebar-accordion/sidebar-accordion.component.spec.ts index 49f2e450f1..7a987b13b1 100644 --- a/src/app/mytools/sidebar-accordion/sidebar-accordion.component.spec.ts +++ b/src/app/mytools/sidebar-accordion/sidebar-accordion.component.spec.ts @@ -1,11 +1,11 @@ import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { MatButtonModule } from '@angular/material/button'; +import { MatLegacyButtonModule as MatButtonModule } from '@angular/material/legacy-button'; import { MatExpansionModule } from '@angular/material/expansion'; import { MatIconModule } from '@angular/material/icon'; -import { MatListModule } from '@angular/material/list'; -import { MatTabsModule } from '@angular/material/tabs'; +import { MatLegacyListModule as MatListModule } from '@angular/material/legacy-list'; +import { MatLegacyTabsModule as MatTabsModule } from '@angular/material/legacy-tabs'; import { MatToolbarModule } from '@angular/material/toolbar'; -import { MatTooltipModule } from '@angular/material/tooltip'; +import { MatLegacyTooltipModule as MatTooltipModule } from '@angular/material/legacy-tooltip'; import { RouterTestingModule } from '@angular/router/testing'; import { RegisterToolService } from '../../container/register-tool/register-tool.service'; import { SelectTabPipe } from '../../shared/entry/select-tab.pipe'; @@ -23,7 +23,6 @@ describe('SidebarAccordionComponent', () => { beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [SidebarAccordionComponent, RefreshToolOrganizationComponent, SelectTabPipe], imports: [ MatTabsModule, MatToolbarModule, @@ -34,6 +33,9 @@ describe('SidebarAccordionComponent', () => { MatTooltipModule, RouterTestingModule, HttpClientTestingModule, + SidebarAccordionComponent, + RefreshToolOrganizationComponent, + SelectTabPipe, ], providers: [ { provide: RegisterToolService, useClass: RegisterToolStubService }, diff --git a/src/app/mytools/sidebar-accordion/sidebar-accordion.component.ts b/src/app/mytools/sidebar-accordion/sidebar-accordion.component.ts index 0838171fc1..899c88c00a 100644 --- a/src/app/mytools/sidebar-accordion/sidebar-accordion.component.ts +++ b/src/app/mytools/sidebar-accordion/sidebar-accordion.component.ts @@ -3,9 +3,17 @@ import { DockstoreTool } from 'app/shared/openapi'; import { Observable } from 'rxjs'; import { ToolQuery } from '../../shared/tool/tool.query'; import { OrgToolObject } from '../my-tool/my-tool.component'; -import { KeyValue } from '@angular/common'; +import { KeyValue, NgFor, NgIf, NgTemplateOutlet, NgClass, AsyncPipe, KeyValuePipe } from '@angular/common'; import { MetadataService } from '../../shared/openapi/api/metadata.service'; import { WorkflowQuery } from 'app/shared/state/workflow.query'; +import { SelectTabPipe } from '../../shared/entry/select-tab.pipe'; +import { RefreshToolOrganizationComponent } from '../../container/refresh-tool-organization/refresh-tool-organization.component'; +import { RouterLink } from '@angular/router'; +import { MatIconModule } from '@angular/material/icon'; +import { ExtendedModule } from '@ngbracket/ngx-layout/extended'; +import { MatLegacyListModule } from '@angular/material/legacy-list'; +import { MatLegacyTabsModule } from '@angular/material/legacy-tabs'; +import { MatExpansionModule } from '@angular/material/expansion'; interface GroupEntriesByRegistry { groupEntryInfo: OrgToolObject[]; @@ -16,6 +24,23 @@ interface GroupEntriesByRegistry { selector: 'app-sidebar-accordion', templateUrl: './sidebar-accordion.component.html', styleUrls: ['./sidebar-accordion.component.scss', '../../shared/styles/my-entry-sidebar.scss'], + standalone: true, + imports: [ + NgFor, + NgIf, + MatExpansionModule, + MatLegacyTabsModule, + NgTemplateOutlet, + MatLegacyListModule, + NgClass, + ExtendedModule, + MatIconModule, + RouterLink, + RefreshToolOrganizationComponent, + AsyncPipe, + KeyValuePipe, + SelectTabPipe, + ], }) export class SidebarAccordionComponent implements OnInit, OnChanges { @Input() openOneAtATime; diff --git a/src/app/myworkflows/my-workflow/my-workflow.component.html b/src/app/myworkflows/my-workflow/my-workflow.component.html index c3cabefc96..8da02db3a1 100644 --- a/src/app/myworkflows/my-workflow/my-workflow.component.html +++ b/src/app/myworkflows/my-workflow/my-workflow.component.html @@ -62,7 +62,7 @@ Register a {{ entryType | titlecase }}
    @@ -101,7 +101,7 @@ Don't see an organization? ConfigureShared with me

    Register a {{ entryType$ | async | titlecase }} - +
  • - If there are already workflows on Dockstore added by other users that you have access to, press the button below. + If there are already {{ entryType$ | async }}s on Dockstore added by other users that you have access to, press the + button below.
  • diff --git a/src/app/myworkflows/my-workflow/my-workflow.component.spec.ts b/src/app/myworkflows/my-workflow/my-workflow.component.spec.ts index 60af420a49..ab712efd97 100644 --- a/src/app/myworkflows/my-workflow/my-workflow.component.spec.ts +++ b/src/app/myworkflows/my-workflow/my-workflow.component.spec.ts @@ -16,20 +16,31 @@ import { HttpClientTestingModule } from '@angular/common/http/testing'; import { NO_ERRORS_SCHEMA } from '@angular/core'; import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { MatDialogRef } from '@angular/material/dialog'; +import { MatLegacyDialogModule, MatLegacyDialogRef as MatDialogRef } from '@angular/material/legacy-dialog'; +import { MatLegacySnackBarModule } from '@angular/material/legacy-snack-bar'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { RouterTestingModule } from '@angular/router/testing'; import { TrackLoginService } from 'app/shared/track-login.service'; -import { AuthService } from 'ng2-ui-auth'; import { AccountsService } from '../../loginComponents/accounts/external/accounts.service'; -import { CustomMaterialModule } from '../../shared/modules/material.module'; -import { MyEntriesModule } from '../../shared/modules/my-entries.module'; -import { RefreshService } from '../../shared/refresh.service'; -import { TokenQuery } from '../../shared/state/token.query'; -import { WorkflowService } from '../../shared/state/workflow.service'; +import { MytoolsService } from '../../mytools/mytools.service'; +import { AuthService } from '../../ng2-ui-auth/public_api'; +import { BioschemaService } from '../../shared/bioschema.service'; +import { ContainerService } from '../../shared/container.service'; +import { DateService } from '../../shared/date.service'; +import { DescriptorLanguageService } from '../../shared/entry/descriptor-language.service'; +import { ExtendedToolsService } from '../../shared/extended-tools.service'; +import { ExtendedWorkflowsService } from '../../shared/extended-workflows.service'; +import { MetadataService } from '../../shared/openapi'; import { UsersService } from '../../shared/openapi/api/users.service'; import { WorkflowsService } from '../../shared/openapi/api/workflows.service'; import { Configuration } from '../../shared/openapi/configuration'; +import { ProviderService } from '../../shared/provider.service'; +import { RefreshService } from '../../shared/refresh.service'; +import { MyEntriesQuery } from '../../shared/state/my-entries.query'; +import { MyEntriesStateService } from '../../shared/state/my-entries.service'; +import { MyEntriesStore } from '../../shared/state/my-entries.store'; +import { TokenQuery } from '../../shared/state/token.query'; +import { WorkflowService } from '../../shared/state/workflow.service'; import { UrlResolverService } from '../../shared/url-resolver.service'; import { UserQuery } from '../../shared/user/user.query'; import { RouterLinkStubDirective } from '../../test'; @@ -38,7 +49,10 @@ import { AccountsStubService, AuthStubService, ConfigurationStub, + ContainerStubService, + DateStubService, MetadataStubService, + ProviderStubService, RefreshStubService, RegisterWorkflowModalStubService, TrackLoginStubService, @@ -50,8 +64,6 @@ import { import { RegisterWorkflowModalService } from '../../workflow/register-workflow-modal/register-workflow-modal.service'; import { MyWorkflowsService } from '../myworkflows.service'; import { MyWorkflowComponent } from './my-workflow.component'; -import { DescriptorLanguageService } from '../../shared/entry/descriptor-language.service'; -import { MetadataService } from '../../shared/openapi'; describe('MyWorkflowsComponent', () => { let component: MyWorkflowComponent; @@ -60,9 +72,16 @@ describe('MyWorkflowsComponent', () => { beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [MyWorkflowComponent, RouterLinkStubDirective, RouterOutletStubComponent], + declarations: [RouterLinkStubDirective, RouterOutletStubComponent], schemas: [NO_ERRORS_SCHEMA], - imports: [RouterTestingModule, HttpClientTestingModule, BrowserAnimationsModule, CustomMaterialModule, MyEntriesModule], + imports: [ + RouterTestingModule, + HttpClientTestingModule, + BrowserAnimationsModule, + MatLegacySnackBarModule, + MatLegacyDialogModule, + MyWorkflowComponent, + ], providers: [ { provide: DescriptorLanguageService, useClass: DescriptorLanguageService }, { provide: MetadataService, useClass: MetadataStubService }, @@ -71,11 +90,21 @@ describe('MyWorkflowsComponent', () => { { provide: UsersService, useClass: UsersStubService }, { provide: AuthService, useClass: AuthStubService }, { provide: WorkflowService, useClass: WorkflowStubService }, + { provide: ContainerService, useClass: ContainerStubService }, { provide: RefreshService, useClass: RefreshStubService }, { provide: RegisterWorkflowModalService, useClass: RegisterWorkflowModalStubService }, + { provide: DateService, useClass: DateStubService }, + BioschemaService, + ExtendedToolsService, + ExtendedWorkflowsService, + MyEntriesQuery, + MyEntriesStateService, + MyEntriesStore, MyWorkflowsService, + MytoolsService, TokenQuery, { provide: AccountsService, useClass: AccountsStubService }, + { provide: ProviderService, useClass: ProviderStubService }, { provide: WorkflowsService, useClass: WorkflowsStubService }, { provide: UrlResolverService, useClass: UrlResolverStubService }, { provide: TrackLoginService, useClass: TrackLoginStubService }, diff --git a/src/app/myworkflows/my-workflow/my-workflow.component.ts b/src/app/myworkflows/my-workflow/my-workflow.component.ts index 6beb61a68f..2e4f33ed56 100644 --- a/src/app/myworkflows/my-workflow/my-workflow.component.ts +++ b/src/app/myworkflows/my-workflow/my-workflow.component.ts @@ -14,7 +14,7 @@ * limitations under the License. */ import { Component, OnInit } from '@angular/core'; -import { MatDialog } from '@angular/material/dialog'; +import { MatLegacyDialog as MatDialog } from '@angular/material/legacy-dialog'; import { ActivatedRoute, NavigationEnd, Router } from '@angular/router'; import { faGithub } from '@fortawesome/free-brands-svg-icons'; import { EntryType } from 'app/shared/enum/entry-type'; @@ -26,10 +26,10 @@ import { TokenService } from 'app/shared/state/token.service'; import { BioWorkflow } from 'app/shared/openapi/model/bioWorkflow'; import { Service } from 'app/shared/openapi/model/service'; import { UserService } from 'app/shared/user/user.service'; -import { AuthService } from 'ng2-ui-auth'; import { combineLatest, Observable } from 'rxjs'; import { filter, map, shareReplay, takeUntil } from 'rxjs/operators'; import { AccountsService } from '../../loginComponents/accounts/external/accounts.service'; +import { AuthService } from '../../ng2-ui-auth/public_api'; import { AlertQuery } from '../../shared/alert/state/alert.query'; import { MyEntry, OrgEntryObject } from '../../shared/my-entry'; import { TokenQuery } from '../../shared/state/token.query'; @@ -42,6 +42,19 @@ import { UserQuery } from '../../shared/user/user.query'; import { RegisterWorkflowModalService } from '../../workflow/register-workflow-modal/register-workflow-modal.service'; import { MyWorkflowsService } from '../myworkflows.service'; import { Dockstore } from '../../shared/dockstore.model'; +import { WorkflowComponent } from '../../workflow/workflow.component'; +import { FontAwesomeModule } from '@fortawesome/angular-fontawesome'; +import { MatLegacyCardModule } from '@angular/material/legacy-card'; +import { SidebarAccordionComponent } from '../sidebar-accordion/sidebar-accordion.component'; +import { MatLegacyMenuModule } from '@angular/material/legacy-menu'; +import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; +import { MatSidenavModule } from '@angular/material/sidenav'; +import { NgIf, AsyncPipe, TitleCasePipe } from '@angular/common'; +import { MatIconModule } from '@angular/material/icon'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { HeaderComponent } from '../../header/header.component'; +import { MySidebarComponent } from '../../my-sidebar/my-sidebar.component'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; /** * How the workflow selection works: @@ -63,6 +76,24 @@ import { Dockstore } from '../../shared/dockstore.model'; selector: 'app-my-workflow', templateUrl: './my-workflow.component.html', styleUrls: ['../../shared/styles/my-entry.component.scss'], + standalone: true, + imports: [ + FlexModule, + MySidebarComponent, + HeaderComponent, + MatLegacyButtonModule, + MatIconModule, + NgIf, + MatSidenavModule, + MatLegacyTooltipModule, + MatLegacyMenuModule, + SidebarAccordionComponent, + MatLegacyCardModule, + FontAwesomeModule, + WorkflowComponent, + AsyncPipe, + TitleCasePipe, + ], }) export class MyWorkflowComponent extends MyEntry implements OnInit { Dockstore = Dockstore; @@ -82,7 +113,6 @@ export class MyWorkflowComponent extends MyEntry implements OnInit { public isRefreshing$: Observable; public showSidebar = true; hasSourceControlToken$: Observable; - public gitHubAppInstallationLink$: Observable; public groupEntriesObject$: Observable>>; public groupSharedEntriesObject$: Observable>>; public hasGroupSharedEntriesObject$: Observable; @@ -130,7 +160,6 @@ export class MyWorkflowComponent extends MyEntry implements OnInit { ngOnInit() { this.myWorkflowsService.clearPartialState(); - this.gitHubAppInstallationLink$ = this.sessionQuery.gitHubAppInstallationLink$; this.tokenService.getGitHubOrganizations(); this.isRefreshing$ = this.alertQuery.showInfo$; /** @@ -229,7 +258,7 @@ export class MyWorkflowComponent extends MyEntry implements OnInit { addToExistingWorkflows(): void { if (this.user) { - this.userService.addUserToWorkflows(this.user.id); + this.userService.addUserToWorkflows(this.user.id, this.entryType); } } diff --git a/src/app/myworkflows/myworkflows.module.ts b/src/app/myworkflows/myworkflows.module.ts deleted file mode 100644 index 8d4dc55248..0000000000 --- a/src/app/myworkflows/myworkflows.module.ts +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright 2017 OICR - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import { NgModule } from '@angular/core'; -import { SharedWorkflowServicesNotebooksModule } from '../shared-workflow-services-notebooks/shared-workflow-services-notebooks.module'; -import { myworkflowRouting } from './myworkflows.routing'; -import { GitHubAppsLogsModule } from './sidebar-accordion/github-apps-logs/github-apps-logs.module'; - -@NgModule({ - imports: [SharedWorkflowServicesNotebooksModule, myworkflowRouting, GitHubAppsLogsModule], -}) -export class MyWorkflowsModule {} diff --git a/src/app/myworkflows/myworkflows.routing.ts b/src/app/myworkflows/myworkflows.routing.ts index c9ab572450..fbbb6812d3 100644 --- a/src/app/myworkflows/myworkflows.routing.ts +++ b/src/app/myworkflows/myworkflows.routing.ts @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { RouterModule, Routes } from '@angular/router'; +import { Routes } from '@angular/router'; import { EntryType } from '../shared/enum/entry-type'; import { MyWorkflowComponent } from './my-workflow/my-workflow.component'; @@ -24,4 +24,4 @@ const routes: Routes = [ data: { title: 'Dockstore | My Workflows', entryType: EntryType.BioWorkflow }, }, ]; -export const myworkflowRouting = RouterModule.forChild(routes); +export const myworkflowRouting = routes; diff --git a/src/app/myworkflows/myworkflows.service.spec.ts b/src/app/myworkflows/myworkflows.service.spec.ts index 69e16847fb..6de22a876e 100644 --- a/src/app/myworkflows/myworkflows.service.spec.ts +++ b/src/app/myworkflows/myworkflows.service.spec.ts @@ -15,20 +15,26 @@ */ import { inject, TestBed } from '@angular/core/testing'; +import { MatLegacyDialogModule } from '@angular/material/legacy-dialog'; +import { MatLegacySnackBarModule } from '@angular/material/legacy-snack-bar'; import { RouterTestingModule } from '@angular/router/testing'; -import { CustomMaterialModule } from 'app/shared/modules/material.module'; -import { MyEntriesModule } from 'app/shared/modules/my-entries.module'; -import { WorkflowService } from 'app/shared/state/workflow.service'; +import { EntryTypeMetadataService } from 'app/entry/type-metadata/entry-type-metadata.service'; import { UsersService, WorkflowsService } from 'app/shared/openapi'; +import { WorkflowService } from 'app/shared/state/workflow.service'; import { UrlResolverService } from 'app/shared/url-resolver.service'; -import { EntryTypeMetadataService } from 'app/entry/type-metadata/entry-type-metadata.service'; import { + DateStubService, + EntryTypeMetadataStubService, + ProviderStubService, UrlResolverStubService, UsersStubService, WorkflowsStubService, WorkflowStubService, - EntryTypeMetadataStubService, } from 'app/test/service-stubs'; +import { DateService } from '../shared/date.service'; +import { ProviderService } from '../shared/provider.service'; +import { MyEntriesStateService } from '../shared/state/my-entries.service'; +import { MyEntriesStore } from '../shared/state/my-entries.store'; import { Workflow } from './../shared/openapi/model/workflow'; import { OrgWorkflowObject } from './my-workflow/my-workflow.component'; import { MyWorkflowsService } from './myworkflows.service'; @@ -152,14 +158,17 @@ describe('MyWorkflowsService', () => { const expectedResult: OrgWorkflowObject[] = [expectedResult1, expectedResult2, expectedResult3]; beforeEach(() => { TestBed.configureTestingModule({ - imports: [CustomMaterialModule, RouterTestingModule, MyEntriesModule], + imports: [RouterTestingModule, MatLegacySnackBarModule, MatLegacyDialogModule], providers: [ - MyWorkflowsService, + { provide: DateService, useClass: DateStubService }, { provide: UrlResolverService, useClass: UrlResolverStubService }, { provide: WorkflowService, useClass: WorkflowStubService }, { provide: UsersService, useClass: UsersStubService }, { provide: WorkflowsService, useClass: WorkflowsStubService }, { provide: EntryTypeMetadataService, useClass: EntryTypeMetadataStubService }, + { provide: ProviderService, useClass: ProviderStubService }, + MyEntriesStateService, + MyEntriesStore, ], }); }); diff --git a/src/app/myworkflows/myworkflows.service.ts b/src/app/myworkflows/myworkflows.service.ts index e3eb6af0be..989f2a89d5 100644 --- a/src/app/myworkflows/myworkflows.service.ts +++ b/src/app/myworkflows/myworkflows.service.ts @@ -16,28 +16,36 @@ import { HttpErrorResponse } from '@angular/common/http'; import { Injectable } from '@angular/core'; -import { MatDialog } from '@angular/material/dialog'; +import { MatLegacyDialog as MatDialog } from '@angular/material/legacy-dialog'; import { transaction } from '@datorama/akita'; import { AlertService } from 'app/shared/alert/state/alert.service'; import { includesAuthors, includesValidation, bootstrap4largeModalSize, includesMetrics } from 'app/shared/constants'; import { EntryType } from 'app/shared/enum/entry-type'; import { MyEntriesService } from 'app/shared/myentries.service'; -import { SessionQuery } from 'app/shared/session/session.query'; import { MyEntriesStateService } from 'app/shared/state/my-entries.service'; import { WorkflowService } from 'app/shared/state/workflow.service'; -import { BioWorkflow, DockstoreTool, SharedWorkflows, UsersService, Workflow, WorkflowsService } from 'app/shared/openapi'; +import { + BioWorkflow, + DockstoreTool, + EntryType as OpenApiEntryType, + SharedWorkflows, + UsersService, + Workflow, + WorkflowsService, +} from 'app/shared/openapi'; import { UrlResolverService } from 'app/shared/url-resolver.service'; import { UserQuery } from 'app/shared/user/user.query'; import { RegisterWorkflowModalComponent } from 'app/workflow/register-workflow-modal/register-workflow-modal.component'; import { RegisterGithubAppModalComponent } from 'app/workflow/register-workflow-modal/register-github-app-modal/register-github-app-modal.component'; -import { forkJoin, Observable, of as observableOf } from 'rxjs'; +import { forkJoin, of as observableOf } from 'rxjs'; import { catchError, finalize } from 'rxjs/operators'; import { OrgWorkflowObject } from './my-workflow/my-workflow.component'; import { Location } from '@angular/common'; -@Injectable() +@Injectable({ + providedIn: 'root', +}) export class MyWorkflowsService extends MyEntriesService> { - gitHubAppInstallationLink$: Observable; constructor( protected userQuery: UserQuery, protected alertService: AlertService, @@ -45,13 +53,11 @@ export class MyWorkflowsService extends MyEntriesService { if (reloadEntries) { const user = this.userQuery.getValue().user; diff --git a/src/app/myworkflows/sidebar-accordion/github-apps-logs/github-apps-logs.component.html b/src/app/myworkflows/sidebar-accordion/github-apps-logs/github-apps-logs.component.html index e5f9667b9c..65a0b382c7 100644 --- a/src/app/myworkflows/sidebar-accordion/github-apps-logs/github-apps-logs.component.html +++ b/src/app/myworkflows/sidebar-accordion/github-apps-logs/github-apps-logs.component.html @@ -1,21 +1,24 @@

    GitHub App Logs

    - - + + warning There were problems retrieving the GitHub App logs for this organization.
    Often, if you cannot view the logs for your GitHub user account, you must unlink and relink it in
    your Dockstore profile.
    Otherwise, your GitHub user or the Dockstore app may not have access to the GitHub organization.
    - Click here to confirm that the Dockstore app is authorized.
    - + warning There are no GitHub App logs for this organization. -
    - +
    + warning No results. @@ -38,7 +41,7 @@

    GitHub App Logs

    Entry Name - {{ element.entryName ? element.entryName : 'n/a' }} + {{ element.entryName ? element.entryName : 'n/a' }}
    Delivery ID @@ -59,8 +62,12 @@

    GitHub App Logs

    - Success - {{ element.ignored ? 'Ignored' : (column | mapFriendlyValue: element[column]) }} + Status + + {{ + element.ignored ? 'Ignored' : element.success && element.message ? 'Warnings' : (column | mapFriendlyValue: element[column]) + }} +
    {{ column | titlecase }} diff --git a/src/app/myworkflows/sidebar-accordion/github-apps-logs/github-apps-logs.component.ts b/src/app/myworkflows/sidebar-accordion/github-apps-logs/github-apps-logs.component.ts index 65a9ba1881..46790f50ac 100644 --- a/src/app/myworkflows/sidebar-accordion/github-apps-logs/github-apps-logs.component.ts +++ b/src/app/myworkflows/sidebar-accordion/github-apps-logs/github-apps-logs.component.ts @@ -1,25 +1,34 @@ import { animate, state, style, transition, trigger } from '@angular/animations'; -import { DatePipe } from '@angular/common'; import { AfterViewInit, Component, ElementRef, Inject, OnInit, ViewChild } from '@angular/core'; -import { MAT_DIALOG_DATA } from '@angular/material/dialog'; -import { MatPaginator } from '@angular/material/paginator'; -import { MatSnackBar } from '@angular/material/snack-bar'; -import { MatSort } from '@angular/material/sort'; -import { MatTableDataSource } from '@angular/material/table'; +import { MAT_LEGACY_DIALOG_DATA as MAT_DIALOG_DATA, MatLegacyDialogModule } from '@angular/material/legacy-dialog'; +import { MatLegacyPaginator as MatPaginator, MatLegacyPaginatorModule } from '@angular/material/legacy-paginator'; +import { MatSort, MatSortModule } from '@angular/material/sort'; import { AlertService } from 'app/shared/alert/state/alert.service'; import { LambdaEvent, LambdaEventsService } from 'app/shared/openapi'; -import { debounceTime, distinctUntilChanged, finalize, takeUntil, tap } from 'rxjs/operators'; -import { MapFriendlyValuesPipe } from '../../../search/map-friendly-values.pipe'; -import { BehaviorSubject, fromEvent, merge, Observable } from 'rxjs'; +import { fromEvent, merge, Observable } from 'rxjs'; +import { debounceTime, distinctUntilChanged, takeUntil, tap } from 'rxjs/operators'; +import { Base } from '../../../shared/base'; import { formInputDebounceTime } from '../../../shared/constants'; -import { HttpResponse } from '@angular/common/http'; import { PaginatorService } from '../../../shared/state/paginator.service'; -import { PaginatorQuery } from '../../../shared/state/paginator.query'; -import { Base } from '../../../shared/base'; +import { LambdaEventDataSource, ShowContent } from './lambda-events-datasource'; +import { MapFriendlyValuesPipe } from '../../../search/map-friendly-values.pipe'; +import { ClipboardModule } from '@angular/cdk/clipboard'; +import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; +import { SnackbarDirective } from '../../../shared/snackbar.directive'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { MatLegacyTableModule } from '@angular/material/legacy-table'; +import { MatLegacyInputModule } from '@angular/material/legacy-input'; +import { MatLegacyFormFieldModule } from '@angular/material/legacy-form-field'; +import { RouterLink } from '@angular/router'; +import { MatIconModule } from '@angular/material/icon'; +import { MatLegacyCardModule } from '@angular/material/legacy-card'; +import { NgIf, NgFor, NgSwitch, NgSwitchCase, NgSwitchDefault, AsyncPipe, TitleCasePipe, DatePipe } from '@angular/common'; +import { LoadingComponent } from '../../../shared/loading/loading.component'; +import { Dockstore } from 'app/shared/dockstore.model'; /** * Based on https://material.angular.io/components/table/examples example with expandable rows - * TODO: Add backend pagination * @export * @class GithubAppsLogsComponent * @implements {OnInit} @@ -36,23 +45,47 @@ import { Base } from '../../../shared/base'; transition('expanded <=> void', animate('225ms cubic-bezier(0.4, 0.0, 0.2, 1)')), ]), ], + standalone: true, + imports: [ + MatLegacyDialogModule, + LoadingComponent, + NgIf, + MatLegacyCardModule, + MatIconModule, + RouterLink, + MatLegacyFormFieldModule, + MatLegacyInputModule, + MatLegacyTableModule, + MatSortModule, + NgFor, + NgSwitch, + NgSwitchCase, + FlexModule, + MatLegacyButtonModule, + SnackbarDirective, + MatLegacyTooltipModule, + ClipboardModule, + NgSwitchDefault, + MatLegacyPaginatorModule, + AsyncPipe, + TitleCasePipe, + DatePipe, + MapFriendlyValuesPipe, + ], }) export class GithubAppsLogsComponent extends Base implements OnInit, AfterViewInit { - datePipe: DatePipe; + Dockstore = Dockstore; columnsToDisplay: string[]; displayedColumns: string[]; lambdaEvents: LambdaEvent[] | null; @ViewChild(MatPaginator, { static: true }) paginator: MatPaginator; @ViewChild(MatSort, { static: true }) sort: MatSort; @ViewChild('filter', { static: true }) filter: ElementRef; - loading = true; public LambdaEvent = LambdaEvent; - dataSource: MatTableDataSource = new MatTableDataSource(); expandedElement: LambdaEvent | null; - showContent: 'table' | 'error' | 'empty' | 'noResult' | null; + public showContent$: Observable; + public eventsLength$: Observable; type: 'workflow' | 'tool' | 'lambdaEvent' = 'lambdaEvent'; - private eventsSubject$ = new BehaviorSubject([]); - public eventsLength$ = new BehaviorSubject(0); public pageSize$: Observable; public pageIndex$: Observable; @@ -61,57 +94,44 @@ export class GithubAppsLogsComponent extends Base implements OnInit, AfterViewIn private pageFilter: string; isExpansionDetailRow = (i: number, row: Object) => row.hasOwnProperty('detailRow'); + public dataSource: LambdaEventDataSource; constructor( @Inject(MAT_DIALOG_DATA) public matDialogData: { userId?: number; organization?: string }, private paginatorService: PaginatorService, private lambdaEventsService: LambdaEventsService, - private matSnackBar: MatSnackBar, - private mapPipe: MapFriendlyValuesPipe, - private paginatorQuery: PaginatorQuery + private alertService: AlertService ) { super(); - this.datePipe = new DatePipe('en'); - const defaultPredicate = this.dataSource.filterPredicate; - this.dataSource.filterPredicate = (data, filter) => { - const formattedDate = this.datePipe.transform(data.eventDate, 'yyyy-MM-ddTHH:mm').toLowerCase(); - const formattedStatus = this.mapPipe.transform('success', String(data.success)).toLowerCase(); - return formattedDate.indexOf(filter) >= 0 || formattedStatus.indexOf(filter) >= 0 || defaultPredicate(data, filter); - }; } ngOnInit() { + this.dataSource = new LambdaEventDataSource(this.lambdaEventsService); + this.showContent$ = this.dataSource.showContent$; + this.eventsLength$ = this.dataSource.eventsLength$; this.columnsToDisplay = this.matDialogData.userId ? ['organization', 'repository', 'entryName', 'deliveryId', 'reference', 'success', 'type'] : ['repository', 'entryName', 'deliveryId', 'reference', 'success', 'type']; this.displayedColumns = ['eventDate', 'githubUsername', ...this.columnsToDisplay]; - this.loading = true; } ngAfterViewInit() { + this.dataSource.events$ + .pipe(takeUntil(this.ngUnsubscribe)) + // Subscribe to errors only here; The MatTable listens to events LambdaEventsDataSource.connect + .subscribe({ error: (error) => this.alertService.detailedError(error) }); this.loadAppsLogs(); } loadAppsLogs() { - this.dataSource.sort = this.sort; - this.pageSize$ = this.paginatorQuery.eventPageSize$; - this.pageIndex$ = this.paginatorQuery.eventPageIndex$; - - // Initial load - this.loadEvents(this.paginator.pageIndex * this.paginator.pageSize, this.paginator.pageSize, null, null, null); + this.loadEvents(); this.paginatorService.setPaginator(this.type, this.paginator.pageSize, this.paginator.pageIndex); // Handle paginator changes merge(this.paginator.page) - .pipe(distinctUntilChanged()) + .pipe(distinctUntilChanged(), takeUntil(this.ngUnsubscribe)) .subscribe(() => { - this.loadEvents( - this.paginator.pageIndex * this.paginator.pageSize, // set offset to the new pageIndex * the page size - this.paginator.pageSize, - this.pageFilter, - this.mapSortOrder(this.sortDirection), - this.sortCol - ); + this.loadEvents(); this.paginatorService.setPaginator(this.type, this.paginator.pageSize, this.paginator.pageIndex); }); @@ -133,13 +153,7 @@ export class GithubAppsLogsComponent extends Base implements OnInit, AfterViewIn takeUntil(this.ngUnsubscribe) ) .subscribe(() => { - this.loadEvents( - this.paginator.pageIndex, - this.paginator.pageSize, - this.pageFilter, - this.mapSortOrder(this.sortDirection), - this.sortCol - ); + this.loadEvents(); }); // Handle input text field changes @@ -155,72 +169,20 @@ export class GithubAppsLogsComponent extends Base implements OnInit, AfterViewIn takeUntil(this.ngUnsubscribe) ) .subscribe(() => { - this.loadEvents( - this.paginator.pageIndex, - this.paginator.pageSize, - this.pageFilter, - this.mapSortOrder(this.sortDirection), - this.sortCol - ); + this.loadEvents(); }); } - loadEvents(pageIndex: number, pageSize: number, filter: string, sortDirection: string, sortCol: string) { - const filtered = filter?.length > 0; - let lambdaEvents: Observable>; - if (this.matDialogData.userId) { - lambdaEvents = this.lambdaEventsService.getUserLambdaEvents( - this.matDialogData.userId, - pageIndex, - pageSize, - filter, - sortCol, - sortDirection, - 'response' - ); - } else { - lambdaEvents = this.lambdaEventsService.getLambdaEventsByOrganization( - this.matDialogData.organization, - pageIndex, - pageSize, - filter, - sortCol, - sortDirection, - 'response' - ); - } - lambdaEvents - .pipe( - finalize(() => { - this.loading = false; - this.updateContentToShow(this.lambdaEvents, filtered); - }) - ) - .subscribe( - (lambdaEvents) => { - this.eventsSubject$.next((this.lambdaEvents = lambdaEvents.body)); - this.eventsLength$.next(Number(lambdaEvents.headers.get('X-total-count'))); - }, - (error) => { - this.lambdaEvents = null; - this.dataSource.data = []; - const detailedErrorMessage = AlertService.getDetailedErrorMessage(error); - this.matSnackBar.open(detailedErrorMessage); - } - ); - } - - updateContentToShow(lambdaEvents: LambdaEvent[] | null, filtered: boolean) { - this.dataSource.data = lambdaEvents ? lambdaEvents : []; - if (!lambdaEvents) { - this.showContent = 'error'; - } else if (lambdaEvents.length === 0 && !filtered) { - this.showContent = 'empty'; - } else if (lambdaEvents.length === 0 && filtered) { - this.showContent = 'noResult'; - } else { - this.showContent = 'table'; - } + private loadEvents() { + this.dataSource.loadEvents( + this.paginator.pageIndex * this.paginator.pageSize, + this.paginator.pageSize, + this.pageFilter, + this.mapSortOrder(this.sortDirection), + this.sortCol, + this.matDialogData.userId, + this.matDialogData.organization + ); } mapSortOrder(rawSortOrder: string): 'asc' | 'desc' { @@ -230,12 +192,10 @@ export class GithubAppsLogsComponent extends Base implements OnInit, AfterViewIn direction = 'asc'; break; } - case 'desc': { - direction = 'desc'; - break; - } + case 'desc': default: { direction = 'desc'; + break; } } return direction; diff --git a/src/app/myworkflows/sidebar-accordion/github-apps-logs/github-apps-logs.module.ts b/src/app/myworkflows/sidebar-accordion/github-apps-logs/github-apps-logs.module.ts deleted file mode 100644 index 8cd1b84078..0000000000 --- a/src/app/myworkflows/sidebar-accordion/github-apps-logs/github-apps-logs.module.ts +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright 2020 OICR - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { ClipboardModule } from '@angular/cdk/clipboard'; -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { RouterModule } from '@angular/router'; -import { FlexLayoutModule } from '@angular/flex-layout'; -import { RefreshAlertModule } from 'app/shared/alert/alert.module'; -import { CustomMaterialModule } from 'app/shared/modules/material.module'; -import { PipeModule } from '../../../shared/pipe/pipe.module'; -import { SnackbarModule } from '../../../shared/modules/snackbar.module'; -import { GithubAppsLogsComponent } from './github-apps-logs.component'; - -@NgModule({ - imports: [ - CustomMaterialModule, - CommonModule, - RefreshAlertModule, - FlexLayoutModule, - PipeModule, - RouterModule, - ClipboardModule, - SnackbarModule, - ], - declarations: [GithubAppsLogsComponent], -}) -export class GitHubAppsLogsModule {} diff --git a/src/app/myworkflows/sidebar-accordion/github-apps-logs/lambda-events-datasource.ts b/src/app/myworkflows/sidebar-accordion/github-apps-logs/lambda-events-datasource.ts new file mode 100644 index 0000000000..670914f770 --- /dev/null +++ b/src/app/myworkflows/sidebar-accordion/github-apps-logs/lambda-events-datasource.ts @@ -0,0 +1,96 @@ +/* + * + * Copyright 2024 OICR and UCSC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * + */ + +import { CollectionViewer, DataSource } from '@angular/cdk/collections'; +import { HttpResponse } from '@angular/common/http'; +import { BehaviorSubject, Observable } from 'rxjs'; +import { finalize } from 'rxjs/operators'; +import { LambdaEvent, LambdaEventsService } from '../../../shared/openapi'; + +export type ShowContent = 'table' | 'error' | 'empty' | 'noResult' | null; + +export class LambdaEventDataSource implements DataSource { + private eventsSubject$ = new BehaviorSubject([]); + private loadingSubject$ = new BehaviorSubject(true); + private eventsLengthSubject$ = new BehaviorSubject(0); + private showContentSubject$ = new BehaviorSubject(null); + + public events$ = this.eventsSubject$.asObservable(); + public loading$ = this.loadingSubject$.asObservable(); + public eventsLength$ = this.eventsLengthSubject$.asObservable(); + public showContent$ = this.showContentSubject$.asObservable(); + + constructor(private lambdaEventsService: LambdaEventsService) {} + connect(collectionViewer: CollectionViewer): Observable { + return this.events$; + } + disconnect(collectionViewer: CollectionViewer): void { + this.eventsSubject$.complete(); + } + + loadEvents( + pageIndex: number, + pageSize: number, + filter: string | null, + sortDirection: string, + sortCol: string, + userId: number | undefined, + organization: string | undefined + ) { + let lambdaEvents: Observable>; + if (userId) { + lambdaEvents = this.lambdaEventsService.getUserLambdaEvents(userId, pageIndex, pageSize, filter, sortCol, sortDirection, 'response'); + } else { + lambdaEvents = this.lambdaEventsService.getLambdaEventsByOrganization( + organization, + pageIndex, + pageSize, + filter, + sortCol, + sortDirection, + 'response' + ); + } + lambdaEvents + .pipe( + finalize(() => { + this.loadingSubject$.next(false); + }) + ) + .subscribe( + (response) => { + const events: LambdaEvent[] = response.body; + this.eventsSubject$.next(events); + this.eventsLengthSubject$.next(Number(response.headers.get('X-total-count'))); + this.showContentSubject$.next(this.calculateShowContent(events.length, filter?.length > 0)); + }, + (error) => { + this.showContentSubject$.next('error'); + this.eventsSubject$.error(error); + } + ); + } + + private calculateShowContent(eventsLength: number, filtered: boolean): ShowContent { + if (eventsLength === 0) { + return filtered ? 'noResult' : 'empty'; + } + return 'table'; + } +} diff --git a/src/app/myworkflows/sidebar-accordion/sidebar-accordion.component.spec.ts b/src/app/myworkflows/sidebar-accordion/sidebar-accordion.component.spec.ts index 57056c7a00..c15f8a895c 100644 --- a/src/app/myworkflows/sidebar-accordion/sidebar-accordion.component.spec.ts +++ b/src/app/myworkflows/sidebar-accordion/sidebar-accordion.component.spec.ts @@ -1,16 +1,15 @@ import { HttpClientTestingModule } from '@angular/common/http/testing'; import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { MatDialogRef } from '@angular/material/dialog'; +import { MatLegacyDialogModule, MatLegacyDialogRef as MatDialogRef } from '@angular/material/legacy-dialog'; import { RouterTestingModule } from '@angular/router/testing'; -import { CustomMaterialModule } from 'app/shared/modules/material.module'; import { RefreshWorkflowOrganizationComponent } from 'app/workflow/refresh-workflow-organization/refresh-workflow-organization.component'; +import { DescriptorLanguageService } from '../../shared/entry/descriptor-language.service'; import { SelectTabPipe } from '../../shared/entry/select-tab.pipe'; import { RefreshService } from '../../shared/refresh.service'; import { WorkflowService } from '../../shared/state/workflow.service'; import { RefreshStubService, RegisterWorkflowModalStubService, WorkflowStubService } from './../../test/service-stubs'; import { RegisterWorkflowModalService } from './../../workflow/register-workflow-modal/register-workflow-modal.service'; import { SidebarAccordionComponent } from './sidebar-accordion.component'; -import { DescriptorLanguageService } from '../../shared/entry/descriptor-language.service'; describe('SidebarAccordionComponent', () => { let component: SidebarAccordionComponent; @@ -19,8 +18,14 @@ describe('SidebarAccordionComponent', () => { beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [SidebarAccordionComponent, RefreshWorkflowOrganizationComponent, SelectTabPipe], - imports: [HttpClientTestingModule, CustomMaterialModule, RouterTestingModule], + imports: [ + HttpClientTestingModule, + RouterTestingModule, + SidebarAccordionComponent, + RefreshWorkflowOrganizationComponent, + SelectTabPipe, + MatLegacyDialogModule, + ], providers: [ { provide: RegisterWorkflowModalService, diff --git a/src/app/myworkflows/sidebar-accordion/sidebar-accordion.component.ts b/src/app/myworkflows/sidebar-accordion/sidebar-accordion.component.ts index d3152bbcf4..588cb7c2d1 100644 --- a/src/app/myworkflows/sidebar-accordion/sidebar-accordion.component.ts +++ b/src/app/myworkflows/sidebar-accordion/sidebar-accordion.component.ts @@ -15,7 +15,7 @@ */ import { Component, Input, OnInit, OnChanges, SimpleChanges } from '@angular/core'; -import { MatDialog } from '@angular/material/dialog'; +import { MatLegacyDialog as MatDialog } from '@angular/material/legacy-dialog'; import { AlertQuery } from 'app/shared/alert/state/alert.query'; import { bootstrap4extraLargeModalSize } from 'app/shared/constants'; import { EntryType } from 'app/shared/enum/entry-type'; @@ -25,8 +25,18 @@ import { Observable } from 'rxjs'; import { WorkflowQuery } from '../../shared/state/workflow.query'; import { OrgWorkflowObject } from '../my-workflow/my-workflow.component'; import { GithubAppsLogsComponent } from './github-apps-logs/github-apps-logs.component'; -import { KeyValue } from '@angular/common'; +import { KeyValue, NgFor, NgIf, NgClass, NgTemplateOutlet, AsyncPipe, KeyValuePipe } from '@angular/common'; import { MetadataService } from '../../shared/openapi/api/metadata.service'; +import { SelectTabPipe } from '../../shared/entry/select-tab.pipe'; +import { RefreshWorkflowOrganizationComponent } from '../../workflow/refresh-workflow-organization/refresh-workflow-organization.component'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { RouterLink } from '@angular/router'; +import { MatIconModule } from '@angular/material/icon'; +import { MatLegacyListModule } from '@angular/material/legacy-list'; +import { ExtendedModule } from '@ngbracket/ngx-layout/extended'; +import { MatLegacyTabsModule } from '@angular/material/legacy-tabs'; +import { MatExpansionModule } from '@angular/material/expansion'; interface GroupEntriesBySource { groupEntryInfo: OrgWorkflowObject[]; @@ -41,6 +51,25 @@ interface GroupEntriesBySource { '../../mytools/sidebar-accordion/sidebar-accordion.component.scss', '../../shared/styles/my-entry-sidebar.scss', ], + standalone: true, + imports: [ + NgFor, + NgIf, + MatExpansionModule, + MatLegacyTabsModule, + ExtendedModule, + NgClass, + NgTemplateOutlet, + MatLegacyListModule, + MatIconModule, + RouterLink, + FlexModule, + MatLegacyButtonModule, + RefreshWorkflowOrganizationComponent, + AsyncPipe, + KeyValuePipe, + SelectTabPipe, + ], }) export class SidebarAccordionComponent implements OnInit, OnChanges { @Input() openOneAtATime; diff --git a/src/app/navbar/navbar.component.spec.ts b/src/app/navbar/navbar.component.spec.ts index a3d7fc2728..fccd8adbcc 100644 --- a/src/app/navbar/navbar.component.spec.ts +++ b/src/app/navbar/navbar.component.spec.ts @@ -15,13 +15,13 @@ */ import { NO_ERRORS_SCHEMA } from '@angular/core'; import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { MatButtonModule } from '@angular/material/button'; +import { MatLegacyButtonModule as MatButtonModule } from '@angular/material/legacy-button'; import { MatDividerModule } from '@angular/material/divider'; import { MatIconModule } from '@angular/material/icon'; -import { MatMenuModule } from '@angular/material/menu'; +import { MatLegacyMenuModule as MatMenuModule } from '@angular/material/legacy-menu'; import { MatToolbarModule } from '@angular/material/toolbar'; import { HttpClientTestingModule } from '@angular/common/http/testing'; -import { MatSnackBarModule } from '@angular/material/snack-bar'; +import { MatLegacySnackBarModule as MatSnackBarModule } from '@angular/material/legacy-snack-bar'; import { RouterTestingModule } from '@angular/router/testing'; import { RequestsService } from '../loginComponents/state/requests.service'; import { LogoutService } from '../shared/logout.service'; @@ -38,7 +38,6 @@ describe('NavbarComponent', () => { beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [NavbarComponent], imports: [ RouterTestingModule, MatMenuModule, @@ -48,6 +47,7 @@ describe('NavbarComponent', () => { MatDividerModule, MatToolbarModule, HttpClientTestingModule, + NavbarComponent, ], schemas: [NO_ERRORS_SCHEMA], providers: [ diff --git a/src/app/navbar/navbar.component.ts b/src/app/navbar/navbar.component.ts index 70af820893..68566aed79 100644 --- a/src/app/navbar/navbar.component.ts +++ b/src/app/navbar/navbar.component.ts @@ -14,11 +14,10 @@ * limitations under the License. */ import { Component, OnInit } from '@angular/core'; -import { NavigationEnd, Router } from '@angular/router'; +import { NavigationEnd, Router, RouterLink, RouterLinkActive } from '@angular/router'; import { Observable, Subject, combineLatest } from 'rxjs'; import { filter, map, takeUntil } from 'rxjs/operators'; import { Logout } from '../loginComponents/logout'; -import { currentPrivacyPolicyVersion, currentTOSVersion } from '../shared/constants'; import { Dockstore } from '../shared/dockstore.model'; import { toExtendSite } from '../shared/helpers'; import { UserQuery } from '../shared/user/user.query'; @@ -30,11 +29,35 @@ import { TrackLoginService } from './../shared/track-login.service'; import { Organization, OrganizationUser } from '../shared/openapi'; import { RequestsQuery } from '../loginComponents/state/requests.query'; import { RequestsService } from '../loginComponents/state/requests.service'; +import { MatLegacyMenuModule } from '@angular/material/legacy-menu'; +import { MatBadgeModule } from '@angular/material/badge'; +import { MatIconModule } from '@angular/material/icon'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { ExtendedModule } from '@ngbracket/ngx-layout/extended'; +import { NgClass, NgIf, NgTemplateOutlet, AsyncPipe } from '@angular/common'; +import { MatToolbarModule } from '@angular/material/toolbar'; @Component({ selector: 'app-navbar', templateUrl: './navbar.component.html', styleUrls: ['./navbar.component.scss'], + standalone: true, + imports: [ + MatToolbarModule, + NgClass, + ExtendedModule, + RouterLink, + MatLegacyButtonModule, + RouterLinkActive, + NgIf, + FlexModule, + MatIconModule, + MatBadgeModule, + NgTemplateOutlet, + MatLegacyMenuModule, + AsyncPipe, + ], }) export class NavbarComponent extends Logout implements OnInit { public user: User; @@ -42,8 +65,6 @@ export class NavbarComponent extends Logout implements OnInit { isExtended = false; Dockstore = Dockstore; protected ngUnsubscribe: Subject<{}> = new Subject(); - private readonly currentTOSVersion: User.TosversionEnum = currentTOSVersion; - private readonly currentPrivacyPolicyVersion: User.PrivacyPolicyVersionEnum = currentPrivacyPolicyVersion; public myOrganizationInvites$: Observable>; public myRejectedOrganizationRequests$: Observable>; public allPendingOrganizations$: Observable>; diff --git a/src/app/ng2-ui-auth/README.md b/src/app/ng2-ui-auth/README.md new file mode 100644 index 0000000000..07d6061cf3 --- /dev/null +++ b/src/app/ng2-ui-auth/README.md @@ -0,0 +1,4 @@ +Files in this directory are originally from https://github.com/ronzeidman/ng2-ui-auth + +That repo is no longer maintained, and became incompatible with recent Angular versions. It was easiest to commit the files +here and tweak them. diff --git a/src/app/ng2-ui-auth/lib/auth.service.spec.ts b/src/app/ng2-ui-auth/lib/auth.service.spec.ts new file mode 100644 index 0000000000..d679b63c6c --- /dev/null +++ b/src/app/ng2-ui-auth/lib/auth.service.spec.ts @@ -0,0 +1,51 @@ +/* + * + * Copyright 2024 OICR and UCSC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * + */ + +import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { TestBed, inject } from '@angular/core/testing'; + +import { AuthService } from './auth.service'; +import { CONFIG_OPTIONS, ConfigService } from './config.service'; +import { LocalService } from './local.service'; +import { OauthService } from './oauth.service'; +import { PopupService } from './popup.service'; +import { SharedService } from './shared.service'; +import { StorageService } from './storage-service'; + +describe('AuthService', () => { + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + providers: [ + AuthService, + ConfigService, + LocalService, + OauthService, + PopupService, + SharedService, + StorageService, + { provide: CONFIG_OPTIONS, useValue: {} }, + ], + }); + }); + + it('should be created', inject([AuthService], (service: AuthService) => { + expect(service).toBeTruthy(); + })); +}); diff --git a/src/app/ng2-ui-auth/lib/auth.service.ts b/src/app/ng2-ui-auth/lib/auth.service.ts new file mode 100644 index 0000000000..0374e75ae6 --- /dev/null +++ b/src/app/ng2-ui-auth/lib/auth.service.ts @@ -0,0 +1,63 @@ +import { Injectable } from '@angular/core'; +import { Observable } from 'rxjs'; +import { LocalService } from './local.service'; +import { OauthService } from './oauth.service'; +import { SharedService } from './shared.service'; +import { StorageType } from './storage-type.enum'; + +@Injectable() +export class AuthService { + constructor(private shared: SharedService, private local: LocalService, private oauth: OauthService) {} + + public login(user: string | object, url?: string): Observable { + return this.local.login(user, url); + } + + public signup(user: string | object, url?: string): Observable { + return this.local.signup(user, url); + } + + public logout(): Observable { + return this.shared.logout(); + } + + public authenticate(name: string, userData?: any): Observable { + return this.oauth.authenticate(name, userData); + } + + public link(name: string, userData?: any): Observable { + return this.oauth.authenticate(name, userData); + } + + public unlink(provider: string, url?: string): Observable { + return this.oauth.unlink(provider, url); + } + + public isAuthenticated(): boolean { + return this.shared.isAuthenticated(); + } + + public getToken(): string | null { + return this.shared.getToken(); + } + + public setToken(token: string | object): void { + this.shared.setToken(token); + } + + public removeToken(): void { + this.shared.removeToken(); + } + + public getPayload(): any { + return this.shared.getPayload(); + } + + public setStorageType(type: StorageType): boolean { + return this.shared.setStorageType(type); + } + + public getExpirationDate(): Date | null { + return this.shared.getExpirationDate(); + } +} diff --git a/src/app/ng2-ui-auth/lib/browser-storage.service.spec.ts b/src/app/ng2-ui-auth/lib/browser-storage.service.spec.ts new file mode 100644 index 0000000000..935602f907 --- /dev/null +++ b/src/app/ng2-ui-auth/lib/browser-storage.service.spec.ts @@ -0,0 +1,35 @@ +/* + * + * Copyright 2024 OICR and UCSC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * + */ + +import { TestBed, inject } from '@angular/core/testing'; + +import { BrowserStorageService } from './browser-storage.service'; +import { CONFIG_OPTIONS, ConfigService } from './config.service'; + +describe('BrowserStorageService', () => { + beforeEach(() => { + TestBed.configureTestingModule({ + providers: [BrowserStorageService, ConfigService, { provide: CONFIG_OPTIONS, useValue: {} }], + }); + }); + + it('should be created', inject([BrowserStorageService], (service: BrowserStorageService) => { + expect(service).toBeTruthy(); + })); +}); diff --git a/src/app/ng2-ui-auth/lib/browser-storage.service.ts b/src/app/ng2-ui-auth/lib/browser-storage.service.ts new file mode 100644 index 0000000000..6750d1f63c --- /dev/null +++ b/src/app/ng2-ui-auth/lib/browser-storage.service.ts @@ -0,0 +1,160 @@ +/* + * + * Copyright 2024 OICR and UCSC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * + */ + +import { Injectable } from '@angular/core'; +import { StorageService } from './storage-service'; +import { StorageType } from './storage-type.enum'; +import { ConfigService } from './config.service'; + +@Injectable() +export class BrowserStorageService extends StorageService { + private store: { [key: string]: string } = {}; + private storageType = StorageType.MEMORY; + + constructor(config: ConfigService) { + super(); + if (!this.updateStorageType(config.options.storageType)) { + console.warn(config.options.storageType + ' is not available.'); + } + } + + public updateStorageType(storageType: StorageType) { + const isStorageAvailable = this.checkIsStorageAvailable(storageType); + if (!isStorageAvailable) { + return false; + } + this.storageType = storageType; + return true; + } + + public get(key: string) { + switch (this.storageType) { + case StorageType.COOKIE: + case StorageType.SESSION_COOKIE: + return this.getCookie(key); + case StorageType.LOCAL_STORAGE: + case StorageType.SESSION_STORAGE: + return window[this.storageType].getItem(key); + case StorageType.MEMORY: + return this.store[key]; + case StorageType.NONE: + default: + return null; + } + } + + public set(key: string, value: string, date: string) { + switch (this.storageType) { + case StorageType.COOKIE: + case StorageType.SESSION_COOKIE: + this.setCookie(key, value, this.storageType === StorageType.COOKIE ? date : ''); + break; + case StorageType.LOCAL_STORAGE: + case StorageType.SESSION_STORAGE: + window[this.storageType].setItem(key, value); + break; + case StorageType.MEMORY: + this.store[key] = value; + break; + case StorageType.NONE: + default: + break; + } + } + + public remove(key: string) { + switch (this.storageType) { + case StorageType.COOKIE: + case StorageType.SESSION_COOKIE: + this.removeCookie(key); + break; + case StorageType.LOCAL_STORAGE: + case StorageType.SESSION_STORAGE: + window[this.storageType].removeItem(key); + break; + case StorageType.MEMORY: + delete this.store[key]; + break; + case StorageType.NONE: + default: + break; + } + } + + private checkIsStorageAvailable(storageType: StorageType) { + switch (storageType) { + case StorageType.COOKIE: + case StorageType.SESSION_COOKIE: + return this.isCookieStorageAvailable(); + case StorageType.LOCAL_STORAGE: + case StorageType.SESSION_STORAGE: + return this.isWindowStorageAvailable(storageType); + case StorageType.NONE: + case StorageType.MEMORY: + return true; + default: + return false; + } + } + + private isWindowStorageAvailable(storageType: StorageType.SESSION_STORAGE | StorageType.LOCAL_STORAGE) { + try { + const supported = window && storageType in window && window[storageType] !== null; + + if (supported) { + const key = Math.random().toString(36).substring(7); + window[storageType].setItem(key, ''); + window[storageType].removeItem(key); + } + + return supported; + } catch (e) { + return false; + } + } + + private isCookieStorageAvailable() { + try { + const supported = document && 'cookie' in document; + + if (supported) { + const key = Math.random().toString(36).substring(7); + this.setCookie(key, 'test', new Date(Date.now() + 60 * 1000).toUTCString()); + const value = this.getCookie(key); + this.removeCookie(key); + return value === 'test'; + } + return false; + } catch (e) { + return false; + } + } + + private setCookie(key: string, value: string, expires = '', path = '/') { + document.cookie = `${key}=${value}${expires ? `; expires=${expires}` : ''}; path=${path}`; + } + + private removeCookie(key: string, path = '/') { + this.setCookie(key, '', new Date(0).toUTCString(), path); + } + + private getCookie(key: string) { + return document.cookie.replace(new RegExp(`(?:(?:^|.*;\\s*)${key}\\s*\\=\\s*([^;]*).*$)|^.*$`), '$1'); + } +} diff --git a/src/app/ng2-ui-auth/lib/config-interfaces.ts b/src/app/ng2-ui-auth/lib/config-interfaces.ts new file mode 100644 index 0000000000..61339217e3 --- /dev/null +++ b/src/app/ng2-ui-auth/lib/config-interfaces.ts @@ -0,0 +1,78 @@ +import { StorageType } from './storage-type.enum'; + +export interface IPopupOptions { + width?: number; + height?: number; + left?: number; + top?: number; + visibleToolbar?: boolean; +} + +export interface IOauth1Options { + url?: string; + name?: string; + redirectUri?: string; + popupOptions?: IPopupOptions; + authorizationEndpoint?: string; + oauthType?: '1.0'; + method?: string; +} + +export interface IOauth2Options { + url?: string; + name?: string; + redirectUri?: string; + popupOptions?: IPopupOptions; + authorizationEndpoint?: string; + oauthType?: '2.0'; + method?: string; + responseType?: string; + clientId?: string; + additionalUrlParams?: { + [paramName: string]: string | (() => string) | null | undefined; + }; + scopeDelimiter?: string; + scope?: string[]; + state?: string | (() => string); +} + +export interface IProviders { + [provider: string]: IOauth2Options | IOauth1Options; +} + +export interface IConfigOptions { + tokenRoot: string | null; + cordova: boolean | null; + baseUrl: string; + loginUrl: string; + signupUrl: string; + unlinkUrl: string; + tokenName: string; + tokenSeparator: string; + tokenPrefix: string; + authToken: string; + authHeader: string; + storageType: StorageType; + providers: IProviders; + withCredentials: boolean; + resolveToken: (response: any, config: IConfigOptions) => string; +} + +// now even using ts 2.7.2 Partial causes "Could not resolve type Partial" build error... +export interface IPartialConfigOptions { + tokenRoot?: string | null; + cordova?: boolean | null; + baseUrl?: string; + loginUrl?: string; + signupUrl?: string; + unlinkUrl?: string; + tokenName?: string; + tokenSeparator?: string; + tokenPrefix?: string; + authToken?: string; + authHeader?: string; + storageType?: StorageType; + providers?: IProviders; + withCredentials?: boolean; + resolveToken?: (response: any, config: IConfigOptions) => string; +} diff --git a/src/app/ng2-ui-auth/lib/config-providers.ts b/src/app/ng2-ui-auth/lib/config-providers.ts new file mode 100644 index 0000000000..cc2ddc3daf --- /dev/null +++ b/src/app/ng2-ui-auth/lib/config-providers.ts @@ -0,0 +1,143 @@ +/* + * + * Copyright 2024 OICR and UCSC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * + */ + +import { IProviders } from '../public_api'; +import { getWindowOrigin } from './utils'; + +export const defaultProviders: IProviders = { + facebook: { + name: 'facebook', + url: '/auth/facebook', + redirectUri: `${getWindowOrigin()}/`, + authorizationEndpoint: 'https://www.facebook.com/v2.5/dialog/oauth', + additionalUrlParams: { + display: 'popup', + }, + scope: ['email'], + scopeDelimiter: ',', + oauthType: '2.0', + popupOptions: { width: 580, height: 400 }, + }, + google: { + name: 'google', + url: '/auth/google', + authorizationEndpoint: 'https://accounts.google.com/o/oauth2/v2/auth', + additionalUrlParams: { + display: 'popup', + prompt: undefined, + login_hint: undefined, + access_type: undefined, + include_granted_scopes: undefined, + 'openid.realm': undefined, + hd: undefined, + }, + scope: ['openid', 'email'], + scopeDelimiter: ' ', + oauthType: '2.0', + popupOptions: { width: 452, height: 633 }, + state: () => encodeURIComponent(Math.random().toString(36).substr(2)), + }, + github: { + name: 'github', + url: '/auth/github', + authorizationEndpoint: 'https://github.com/login/oauth/authorize', + scope: ['user:email'], + scopeDelimiter: ' ', + oauthType: '2.0', + popupOptions: { width: 1020, height: 618 }, + }, + instagram: { + name: 'instagram', + url: '/auth/instagram', + authorizationEndpoint: 'https://api.instagram.com/oauth/authorize', + scope: ['basic'], + scopeDelimiter: '+', + oauthType: '2.0', + }, + linkedin: { + name: 'linkedin', + url: '/auth/linkedin', + authorizationEndpoint: 'https://www.linkedin.com/uas/oauth2/authorization', + scope: ['r_emailaddress'], + scopeDelimiter: ' ', + oauthType: '2.0', + popupOptions: { width: 527, height: 582 }, + state: 'STATE', + }, + twitter: { + name: 'twitter', + url: '/auth/twitter', + authorizationEndpoint: 'https://api.twitter.com/oauth/authenticate', + oauthType: '1.0', + popupOptions: { width: 495, height: 645 }, + }, + twitch: { + name: 'twitch', + url: '/auth/twitch', + authorizationEndpoint: 'https://api.twitch.tv/kraken/oauth2/authorize', + scope: ['user_read'], + scopeDelimiter: ' ', + additionalUrlParams: { + display: 'popup', + }, + oauthType: '2.0', + popupOptions: { width: 500, height: 560 }, + }, + live: { + name: 'live', + url: '/auth/live', + authorizationEndpoint: 'https://login.live.com/oauth20_authorize.srf', + additionalUrlParams: { + display: 'popup', + }, + scope: ['wl.emails'], + scopeDelimiter: ' ', + oauthType: '2.0', + popupOptions: { width: 500, height: 560 }, + }, + yahoo: { + name: 'yahoo', + url: '/auth/yahoo', + authorizationEndpoint: 'https://api.login.yahoo.com/oauth2/request_auth', + scope: [], + scopeDelimiter: ',', + oauthType: '2.0', + popupOptions: { width: 559, height: 519 }, + }, + bitbucket: { + name: 'bitbucket', + url: '/auth/bitbucket', + authorizationEndpoint: 'https://bitbucket.org/site/oauth2/authorize', + redirectUri: `${getWindowOrigin()}/`, + scope: ['email'], + scopeDelimiter: ',', + oauthType: '2.0', + popupOptions: { width: 1028, height: 529 }, + }, + spotify: { + name: 'spotify', + url: '/auth/spotify', + authorizationEndpoint: 'https://accounts.spotify.com/authorize', + scope: ['', 'user-read-email'], + scopeDelimiter: ',', + oauthType: '2.0', + popupOptions: { width: 500, height: 530 }, + state: () => encodeURIComponent(Math.random().toString(36).substr(2)), + }, +}; diff --git a/src/app/ng2-ui-auth/lib/config.service.spec.ts b/src/app/ng2-ui-auth/lib/config.service.spec.ts new file mode 100644 index 0000000000..d08fd2da0c --- /dev/null +++ b/src/app/ng2-ui-auth/lib/config.service.spec.ts @@ -0,0 +1,34 @@ +/* + * + * Copyright 2024 OICR and UCSC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * + */ + +import { TestBed, inject } from '@angular/core/testing'; + +import { CONFIG_OPTIONS, ConfigService } from './config.service'; + +describe('ConfigService', () => { + beforeEach(() => { + TestBed.configureTestingModule({ + providers: [ConfigService, { provide: CONFIG_OPTIONS, useValue: {} }], + }); + }); + + it('should be created', inject([ConfigService], (service: ConfigService) => { + expect(service).toBeTruthy(); + })); +}); diff --git a/src/app/ng2-ui-auth/lib/config.service.ts b/src/app/ng2-ui-auth/lib/config.service.ts new file mode 100644 index 0000000000..bd9cfc8ca8 --- /dev/null +++ b/src/app/ng2-ui-auth/lib/config.service.ts @@ -0,0 +1,98 @@ +/* + * + * Copyright 2024 OICR and UCSC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * + */ + +import { Inject, Injectable, InjectionToken } from '@angular/core'; +import { IConfigOptions, IPartialConfigOptions, IProviders } from './config-interfaces'; +import { defaultProviders } from './config-providers'; +import { StorageType } from './storage-type.enum'; + +export const CONFIG_OPTIONS = new InjectionToken('config.options'); +@Injectable() +export class ConfigService { + public options = { + withCredentials: false, + tokenRoot: null, + baseUrl: '/', + loginUrl: '/auth/login', + signupUrl: '/auth/signup', + unlinkUrl: '/auth/unlink/', + tokenName: 'token', + tokenSeparator: '_', + tokenPrefix: 'ng2-ui-auth', + authHeader: 'Authorization', + authToken: 'Bearer', + storageType: StorageType.LOCAL_STORAGE, + cordova: undefined, + resolveToken: (response: any, config: IConfigOptions) => { + const accessToken: string | { [key: string]: string } | null | undefined = + response && (response.access_token || response.token || response.data); + if (!accessToken) { + // console.warn('No token found'); + return null; + } + if (typeof accessToken === 'string') { + return accessToken; + } + if (typeof accessToken !== 'object') { + // console.warn('No token found'); + return null; + } + const tokenRootData = + config.tokenRoot && + config.tokenRoot.split('.').reduce((o: any, x: any) => { + return o[x]; + }, accessToken); + const token = tokenRootData ? tokenRootData[config.tokenName] : accessToken[config.tokenName]; + if (token) { + return token; + } + // const tokenPath = this.tokenRoot ? this.tokenRoot + '.' + this.tokenName : this.tokenName; + // console.warn('Expecting a token named "' + tokenPath); + return null; + }, + providers: {}, + }; + + constructor(@Inject(CONFIG_OPTIONS) options: IPartialConfigOptions) { + this.options = { + ...this.options, + ...options, + }; + this.mergeWithDefaultProviders(); + } + + updateProviders(providers: IProviders) { + this.options.providers = { + ...(this.options.providers || {}), + ...providers, + }; + this.mergeWithDefaultProviders(); + } + + mergeWithDefaultProviders() { + Object.keys(this.options.providers).forEach((key) => { + if (key in defaultProviders) { + this.options.providers[key] = { + ...defaultProviders[key], + ...this.options.providers[key], + }; + } + }); + } +} diff --git a/src/app/ng2-ui-auth/lib/interceptor.service.spec.ts b/src/app/ng2-ui-auth/lib/interceptor.service.spec.ts new file mode 100644 index 0000000000..8c216f2af5 --- /dev/null +++ b/src/app/ng2-ui-auth/lib/interceptor.service.spec.ts @@ -0,0 +1,37 @@ +/* + * + * Copyright 2024 OICR and UCSC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * + */ + +import { TestBed, inject } from '@angular/core/testing'; +import { CONFIG_OPTIONS, ConfigService } from './config.service'; + +import { JwtInterceptor } from './interceptor.service'; +import { SharedService } from './shared.service'; +import { StorageService } from './storage-service'; + +describe('InterceptorService', () => { + beforeEach(() => { + TestBed.configureTestingModule({ + providers: [JwtInterceptor, SharedService, StorageService, ConfigService, { provide: CONFIG_OPTIONS, useValue: {} }], + }); + }); + + it('should be created', inject([JwtInterceptor], (service: JwtInterceptor) => { + expect(service).toBeTruthy(); + })); +}); diff --git a/src/app/ng2-ui-auth/lib/interceptor.service.ts b/src/app/ng2-ui-auth/lib/interceptor.service.ts new file mode 100644 index 0000000000..21e24336b9 --- /dev/null +++ b/src/app/ng2-ui-auth/lib/interceptor.service.ts @@ -0,0 +1,19 @@ +import { Injectable } from '@angular/core'; +import { HttpInterceptor, HttpRequest, HttpHandler, HttpEvent } from '@angular/common/http'; +import { SharedService } from './shared.service'; +import { ConfigService } from './config.service'; +import { Observable } from 'rxjs'; + +@Injectable() +export class JwtInterceptor implements HttpInterceptor { + constructor(private shared: SharedService, private config: ConfigService) {} + + intercept(req: HttpRequest, next: HttpHandler): Observable> { + const { authHeader, authToken } = this.config.options; + const token = this.shared.getToken(); + const isAuthenticated = this.shared.isAuthenticated(); + const newReq = + isAuthenticated && !req.headers.has(authHeader) ? req.clone({ setHeaders: { [authHeader]: `${authToken} ${token}` } }) : req; + return next.handle(newReq); + } +} diff --git a/src/app/ng2-ui-auth/lib/local.service.spec.ts b/src/app/ng2-ui-auth/lib/local.service.spec.ts new file mode 100644 index 0000000000..27de1eb8f7 --- /dev/null +++ b/src/app/ng2-ui-auth/lib/local.service.spec.ts @@ -0,0 +1,39 @@ +/* + * + * Copyright 2024 OICR and UCSC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * + */ + +import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { TestBed, inject } from '@angular/core/testing'; +import { CONFIG_OPTIONS, ConfigService } from './config.service'; + +import { LocalService } from './local.service'; +import { SharedService } from './shared.service'; +import { StorageService } from './storage-service'; + +describe('LocalService', () => { + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + providers: [LocalService, SharedService, StorageService, ConfigService, { provide: CONFIG_OPTIONS, useValue: {} }], + }); + }); + + it('should be created', inject([LocalService], (service: LocalService) => { + expect(service).toBeTruthy(); + })); +}); diff --git a/src/app/ng2-ui-auth/lib/local.service.ts b/src/app/ng2-ui-auth/lib/local.service.ts new file mode 100644 index 0000000000..33b6756ea5 --- /dev/null +++ b/src/app/ng2-ui-auth/lib/local.service.ts @@ -0,0 +1,41 @@ +/* + * + * Copyright 2024 OICR and UCSC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * + */ + +import { Injectable } from '@angular/core'; +import { HttpClient } from '@angular/common/http'; +import { SharedService } from './shared.service'; +import { ConfigService } from './config.service'; +import { joinUrl } from './utils'; +import { tap } from 'rxjs/operators'; +import { Observable } from 'rxjs'; + +@Injectable() +export class LocalService { + constructor(private http: HttpClient, private shared: SharedService, private config: ConfigService) {} + + public login(user: string | object, url?: string): Observable { + return this.http + .post(url || joinUrl(this.config.options.baseUrl, this.config.options.loginUrl), user) + .pipe(tap((data) => this.shared.setToken(data))); + } + + public signup(user: string | object, url?: string): Observable { + return this.http.post(url || joinUrl(this.config.options.baseUrl, this.config.options.signupUrl), user); + } +} diff --git a/src/app/ng2-ui-auth/lib/ng2-ui-auth.module.ts b/src/app/ng2-ui-auth/lib/ng2-ui-auth.module.ts new file mode 100644 index 0000000000..3d6a23b7a7 --- /dev/null +++ b/src/app/ng2-ui-auth/lib/ng2-ui-auth.module.ts @@ -0,0 +1,58 @@ +/* + * + * Copyright 2024 OICR and UCSC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * + */ + +import { NgModule, ModuleWithProviders } from '@angular/core'; +import { HttpClientModule, HTTP_INTERCEPTORS } from '@angular/common/http'; +import { IPartialConfigOptions } from './config-interfaces'; +import { CONFIG_OPTIONS, ConfigService } from './config.service'; +import { StorageService } from './storage-service'; +import { BrowserStorageService } from './browser-storage.service'; +import { SharedService } from './shared.service'; +import { JwtInterceptor } from './interceptor.service'; +import { OauthService } from './oauth.service'; +import { HttpClient } from '@angular/common/http'; +import { PopupService } from './popup.service'; +import { LocalService } from './local.service'; +import { AuthService } from './auth.service'; + +@NgModule({ + imports: [HttpClientModule], + declarations: [], + exports: [], +}) +export class Ng2UiAuthModule { + static forRoot(configOptions?: IPartialConfigOptions, defaultJwtInterceptor = true): ModuleWithProviders { + return { + ngModule: Ng2UiAuthModule, + providers: [ + ...(configOptions ? [{ provide: CONFIG_OPTIONS, useValue: configOptions }] : []), + { provide: ConfigService, useClass: ConfigService, deps: [CONFIG_OPTIONS] }, + { provide: StorageService, useClass: BrowserStorageService, deps: [ConfigService] }, + { provide: SharedService, useClass: SharedService, deps: [StorageService, ConfigService] }, + { provide: LocalService, useClass: LocalService, deps: [HttpClient, SharedService, ConfigService] }, + { provide: PopupService, useClass: PopupService, deps: [ConfigService] }, + { provide: OauthService, useClass: OauthService, deps: [HttpClient, SharedService, ConfigService, PopupService] }, + { provide: AuthService, useClass: AuthService, deps: [SharedService, LocalService, OauthService] }, + ...(defaultJwtInterceptor + ? [{ provide: HTTP_INTERCEPTORS, useClass: JwtInterceptor, multi: true, deps: [SharedService, ConfigService] }] + : []), + ], + }; + } +} diff --git a/src/app/ng2-ui-auth/lib/oauth-service.ts b/src/app/ng2-ui-auth/lib/oauth-service.ts new file mode 100644 index 0000000000..c6a0bc6bc5 --- /dev/null +++ b/src/app/ng2-ui-auth/lib/oauth-service.ts @@ -0,0 +1,6 @@ +import { IOauth2Options, IOauth1Options } from './config-interfaces'; +import { Observable } from 'rxjs'; + +export interface IOauthService { + open(options: IOauth2Options | IOauth1Options, userData: object): Observable; +} diff --git a/src/app/ng2-ui-auth/lib/oauth.service.spec.ts b/src/app/ng2-ui-auth/lib/oauth.service.spec.ts new file mode 100644 index 0000000000..028592bde1 --- /dev/null +++ b/src/app/ng2-ui-auth/lib/oauth.service.spec.ts @@ -0,0 +1,40 @@ +/* + * + * Copyright 2024 OICR and UCSC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * + */ + +import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { TestBed, inject } from '@angular/core/testing'; +import { CONFIG_OPTIONS, ConfigService } from './config.service'; + +import { OauthService } from './oauth.service'; +import { PopupService } from './popup.service'; +import { SharedService } from './shared.service'; +import { StorageService } from './storage-service'; + +describe('OauthService', () => { + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + providers: [OauthService, SharedService, PopupService, StorageService, { provide: CONFIG_OPTIONS, useValue: {} }, ConfigService], + }); + }); + + it('should be created', inject([OauthService], (service: OauthService) => { + expect(service).toBeTruthy(); + })); +}); diff --git a/src/app/ng2-ui-auth/lib/oauth.service.ts b/src/app/ng2-ui-auth/lib/oauth.service.ts new file mode 100644 index 0000000000..97acc998bc --- /dev/null +++ b/src/app/ng2-ui-auth/lib/oauth.service.ts @@ -0,0 +1,64 @@ +/* + * + * Copyright 2024 OICR and UCSC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * + */ + +import { Injectable, Injector } from '@angular/core'; +import { joinUrl } from './utils'; +import { tap } from 'rxjs/operators'; +import { Oauth1Service } from './oauth1.service'; +import { Oauth2Service } from './oauth2.service'; +import { Observable } from 'rxjs'; +import { PopupService } from './popup.service'; +import { ConfigService } from './config.service'; +import { SharedService } from './shared.service'; +import { HttpClient } from '@angular/common/http'; +import { IOauthService } from './oauth-service'; + +@Injectable() +export class OauthService { + readonly depProviders = [ + { provide: HttpClient, useValue: this.http }, + { provide: PopupService, useValue: this.popup }, + { provide: ConfigService, useValue: this.config }, + ]; + readonly deps = [HttpClient, PopupService, ConfigService]; + + constructor(private http: HttpClient, private shared: SharedService, private config: ConfigService, private popup: PopupService) {} + + public authenticate(name: string, userData?: any): Observable { + const provider: IOauthService = + this.config.options.providers[name].oauthType === '1.0' + ? Injector.create([...this.depProviders, { provide: Oauth1Service, deps: this.deps }]).get(Oauth1Service) + : Injector.create([...this.depProviders, { provide: Oauth2Service, deps: this.deps }]).get(Oauth2Service); + + return provider.open(this.config.options.providers[name], userData || {}).pipe( + tap((response) => { + // this is for a scenario when someone wishes to opt out from + // satellizer's magic by doing authorization code exchange and + // saving a token manually. + if (this.config.options.providers[name].url) { + this.shared.setToken(response); + } + }) + ); + } + + public unlink(provider: string, url = joinUrl(this.config.options.baseUrl, this.config.options.unlinkUrl), method = 'POST') { + return this.http.request(method, url, { body: { provider } }); + } +} diff --git a/src/app/ng2-ui-auth/lib/oauth1.service.spec.ts b/src/app/ng2-ui-auth/lib/oauth1.service.spec.ts new file mode 100644 index 0000000000..b8a3e5b418 --- /dev/null +++ b/src/app/ng2-ui-auth/lib/oauth1.service.spec.ts @@ -0,0 +1,38 @@ +/* + * + * Copyright 2024 OICR and UCSC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * + */ + +import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { TestBed, inject } from '@angular/core/testing'; +import { CONFIG_OPTIONS, ConfigService } from './config.service'; + +import { Oauth1Service } from './oauth1.service'; +import { PopupService } from './popup.service'; + +describe('Oauth1Service', () => { + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + providers: [Oauth1Service, PopupService, ConfigService, { provide: CONFIG_OPTIONS, useValue: {} }], + }); + }); + + it('should be created', inject([Oauth1Service], (service: Oauth1Service) => { + expect(service).toBeTruthy(); + })); +}); diff --git a/src/app/ng2-ui-auth/lib/oauth1.service.ts b/src/app/ng2-ui-auth/lib/oauth1.service.ts new file mode 100644 index 0000000000..35f3eb8cdc --- /dev/null +++ b/src/app/ng2-ui-auth/lib/oauth1.service.ts @@ -0,0 +1,62 @@ +/* + * + * Copyright 2024 OICR and UCSC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * + */ + +import { HttpClient } from '@angular/common/http'; +import { Injectable } from '@angular/core'; +import { Observable } from 'rxjs'; +import { map, switchMap, tap } from 'rxjs/operators'; +import { IOauth1Options } from './config-interfaces'; +import { ConfigService } from './config.service'; +import { IOauthService } from './oauth-service'; +import { PopupService } from './popup.service'; +import { buildQueryString, joinUrl } from './utils'; + +@Injectable() +export class Oauth1Service implements IOauthService { + constructor(private http: HttpClient, private popup: PopupService, private config: ConfigService) {} + + open(oauthOptions: IOauth1Options, userData: object): Observable { + const serverUrl = this.config.options.baseUrl ? joinUrl(this.config.options.baseUrl, oauthOptions.url) : oauthOptions.url; + return this.popup.open('about:blank', oauthOptions, this.config.options.cordova).pipe( + switchMap((popupWindow) => + this.http.post(serverUrl, oauthOptions).pipe( + tap((authorizationData) => + popupWindow + ? popupWindow.location.replace([oauthOptions.authorizationEndpoint, buildQueryString(authorizationData)].join('?')) + : undefined + ), + switchMap((authorizationData) => + this.popup + .waitForClose(popupWindow, this.config.options.cordova, oauthOptions.redirectUri) + .pipe(map((oauthData) => ({ authorizationData, oauthData }))) + ) + ) + ), + switchMap(({ authorizationData, oauthData }) => this.exchangeForToken(oauthOptions, authorizationData, oauthData, userData)) + ); + } + + private exchangeForToken(oauthOptions: IOauth1Options, authorizationData: object, oauthData: object, userData: object) { + const body = { oauthOptions, authorizationData, oauthData, userData }; + const { withCredentials, baseUrl } = this.config.options; + const { method = 'POST', url } = oauthOptions; + const exchangeForTokenUrl = baseUrl ? joinUrl(baseUrl, url) : url; + return this.http.request(method, exchangeForTokenUrl, { body, withCredentials }); + } +} diff --git a/src/app/ng2-ui-auth/lib/oauth2.service.spec.ts b/src/app/ng2-ui-auth/lib/oauth2.service.spec.ts new file mode 100644 index 0000000000..bfc2be590d --- /dev/null +++ b/src/app/ng2-ui-auth/lib/oauth2.service.spec.ts @@ -0,0 +1,38 @@ +/* + * + * Copyright 2024 OICR and UCSC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * + */ + +import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { TestBed, inject } from '@angular/core/testing'; +import { CONFIG_OPTIONS, ConfigService } from './config.service'; + +import { Oauth2Service } from './oauth2.service'; +import { PopupService } from './popup.service'; + +describe('Oauth2Service', () => { + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + providers: [Oauth2Service, PopupService, ConfigService, { provide: CONFIG_OPTIONS, useValue: {} }], + }); + }); + + it('should be created', inject([Oauth2Service], (service: Oauth2Service) => { + expect(service).toBeTruthy(); + })); +}); diff --git a/src/app/ng2-ui-auth/lib/oauth2.service.ts b/src/app/ng2-ui-auth/lib/oauth2.service.ts new file mode 100644 index 0000000000..494412ce28 --- /dev/null +++ b/src/app/ng2-ui-auth/lib/oauth2.service.ts @@ -0,0 +1,100 @@ +/* + * + * Copyright 2024 OICR and UCSC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * + */ + +import { HttpClient } from '@angular/common/http'; +import { Injectable } from '@angular/core'; +import { empty, Observable, of } from 'rxjs'; +import { switchMap } from 'rxjs/operators'; +import { IOauth2Options } from './config-interfaces'; +import { ConfigService } from './config.service'; +import { IOauthService } from './oauth-service'; +import { PopupService } from './popup.service'; +import { buildQueryString, getWindowOrigin, joinUrl } from './utils'; + +@Injectable() +export class Oauth2Service implements IOauthService { + constructor(private http: HttpClient, private popup: PopupService, private config: ConfigService) {} + + open(oauthOptions: IOauth2Options, userData: object): Observable { + const authorizationData = this.getAuthorizationData(oauthOptions); + const url = [oauthOptions.authorizationEndpoint, buildQueryString(authorizationData)].join('?'); + return this.popup.open(url, oauthOptions, this.config.options.cordova).pipe( + switchMap((window?: Window) => + window ? this.popup.waitForClose(window, this.config.options.cordova, oauthOptions.redirectUri) : empty() + ), + switchMap((oauthData: any) => { + // when no server URL provided, return popup params as-is. + // this is for a scenario when someone wishes to opt out from + // satellizer's magic by doing authorization code exchange and + // saving a token manually. + if (oauthOptions.responseType === 'token' || !oauthOptions.url) { + return of(oauthData); + } + + if (oauthData.state && oauthData.state !== authorizationData.state) { + throw new Error('OAuth "state" mismatch'); + } + return this.exchangeForToken(oauthOptions, authorizationData, oauthData, userData); + }) + ); + } + + private exchangeForToken(options: IOauth2Options, authorizationData: object, oauthData: object, userData: object) { + const body = { authorizationData, oauthData, userData }; + const { baseUrl, withCredentials } = this.config.options; + const { url, method = 'POST' } = options; + const exchangeForTokenUrl = baseUrl ? joinUrl(baseUrl, url) : url; + return this.http.request(method, exchangeForTokenUrl, { body, withCredentials }); + } + + private getAuthorizationData(options: IOauth2Options) { + const { + responseType = 'code', + clientId, + redirectUri = getWindowOrigin() || '', + scopeDelimiter = ',', + scope, + state, + additionalUrlParams, + } = options; + const resolvedState = typeof state === 'function' ? state() : state; + return [ + ['response_type', responseType], + ['client_id', clientId], + ['redirect_uri', redirectUri], + ...(state ? [['state', resolvedState]] : []), + ...(scope ? [['scope', scope.join(scopeDelimiter)]] : []), + ...(additionalUrlParams + ? Object.keys(additionalUrlParams).map((key) => { + const value: string | (() => string) | null | undefined = (additionalUrlParams as any)[key]; + if (typeof value === 'string') { + return [key, value]; + } else if (typeof value === 'function') { + return [key, value()]; + } else if (value === null) { + return [key, '']; + } + return ['', '']; + }) + : []), + ] + .filter((_) => !!_[0]) + .reduce((acc, next) => ({ ...acc, [next[0]]: next[1] }), {} as { [key: string]: string }); + } +} diff --git a/src/app/ng2-ui-auth/lib/popup.service.spec.ts b/src/app/ng2-ui-auth/lib/popup.service.spec.ts new file mode 100644 index 0000000000..00967d0462 --- /dev/null +++ b/src/app/ng2-ui-auth/lib/popup.service.spec.ts @@ -0,0 +1,34 @@ +/* + * + * Copyright 2024 OICR and UCSC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * + */ + +import { TestBed, inject } from '@angular/core/testing'; + +import { PopupService } from './popup.service'; + +describe('PopupService', () => { + beforeEach(() => { + TestBed.configureTestingModule({ + providers: [PopupService], + }); + }); + + it('should be created', inject([PopupService], (service: PopupService) => { + expect(service).toBeTruthy(); + })); +}); diff --git a/src/app/ng2-ui-auth/lib/popup.service.ts b/src/app/ng2-ui-auth/lib/popup.service.ts new file mode 100644 index 0000000000..e3313f20a0 --- /dev/null +++ b/src/app/ng2-ui-auth/lib/popup.service.ts @@ -0,0 +1,161 @@ +/* + * + * Copyright 2024 OICR and UCSC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * + */ + +import { Injectable } from '@angular/core'; +import { empty, fromEvent, interval, merge, Observable, of, throwError } from 'rxjs'; +import { delay, map, switchMap, take } from 'rxjs/operators'; +import { IOauth1Options, IOauth2Options, IPopupOptions } from './config-interfaces'; +import { getWindowOrigin } from './utils'; + +declare const cordova: any; +@Injectable() +export class PopupService { + public open(url: string, options: IOauth2Options | IOauth1Options, cordova = this.isCordovaApp()) { + const stringifiedOptions = this.stringifyOptions(this.prepareOptions(options.popupOptions)); + const windowName = cordova ? '_blank' : options.name; + + const popupWindow = typeof window !== 'undefined' ? window.open(url, windowName, stringifiedOptions) : null; + + if (popupWindow) { + if (popupWindow.focus) { + popupWindow.focus(); + } + return of(popupWindow); + } + return empty(); + } + + public waitForClose(popupWindow: Window, cordova = this.isCordovaApp(), redirectUri = getWindowOrigin()) { + return cordova ? this.eventListener(popupWindow, redirectUri) : this.pollPopup(popupWindow, redirectUri); + } + + private eventListener(popupWindow: Window, redirectUri = getWindowOrigin()) { + if (!popupWindow) { + throw new Error('Popup was not created'); + } + return merge( + fromEvent(popupWindow, 'exit').pipe( + delay(100), + map(() => { + throw new Error('Authentication Canceled'); + }) + ), + fromEvent(popupWindow, 'loadstart') + ).pipe( + switchMap((event: Event & { url: string }) => { + if (!popupWindow || popupWindow.closed) { + return Observable.throw(new Error('Authentication Canceled')); + } + if (event.url.indexOf(redirectUri) !== 0) { + return empty(); + } + + const parser = document.createElement('a'); + parser.href = event.url; + + if (parser.search || parser.hash) { + const queryParams = parser.search.substring(1).replace(/\/$/, ''); + const hashParams = parser.hash.substring(1).replace(/\/$/, ''); + const hash = this.parseQueryString(hashParams); + const qs = this.parseQueryString(queryParams); + const allParams = { ...qs, ...hash }; + + popupWindow.close(); + + if (allParams.error) { + throw allParams.error; + } else { + return of(allParams); + } + } + return empty(); + }), + take(1) + ); + } + + private pollPopup(popupWindow: Window, redirectUri = getWindowOrigin()) { + return interval(50).pipe( + switchMap(() => { + if (!popupWindow || popupWindow.closed) { + return throwError(new Error('Authentication Canceled')); + } + + const popupWindowOrigin = getWindowOrigin(popupWindow); + + if ( + popupWindowOrigin && + (redirectUri.indexOf(popupWindowOrigin) === 0 || popupWindowOrigin.indexOf(redirectUri) === 0) && + (popupWindow.location.search || popupWindow.location.hash) + ) { + const queryParams = popupWindow.location.search.substring(1).replace(/\/$/, ''); + const hashParams = popupWindow.location.hash.substring(1).replace(/[\/$]/, ''); + const hash = this.parseQueryString(hashParams); + const qs = this.parseQueryString(queryParams); + popupWindow.close(); + const allParams = { ...qs, ...hash }; + if (allParams.error) { + throw allParams.error; + } else { + return of(allParams); + } + } + return empty(); + }), + take(1) + ); + } + + private prepareOptions(options?: IPopupOptions) { + options = options || {}; + const width = options.width || 500; + const height = options.height || 500; + return { + width, + height, + left: window.screenX + (window.outerWidth - width) / 2, + top: window.screenY + (window.outerHeight - height) / 2.5, + toolbar: options.visibleToolbar ? 'yes' : 'no', + ...options, + }; + } + + private stringifyOptions(options: { [index: string]: string | number | boolean | null | undefined }) { + return Object.keys(options) + .map((key) => (options[key] === null || options[key] === undefined ? key : key + '=' + options[key])) + .join(','); + } + + private parseQueryString(joinedKeyValue: string): any { + let key; + let value; + return joinedKeyValue.split('&').reduce((obj, keyValue) => { + if (keyValue) { + value = keyValue.split('='); + key = decodeURIComponent(value[0]); + obj[key] = typeof value[1] !== 'undefined' ? decodeURIComponent(value[1]) : true; + } + return obj; + }, {} as { [k: string]: string | true }); + } + + private isCordovaApp() { + return typeof cordova === 'object' || (document.URL.indexOf('http://') === -1 && document.URL.indexOf('https://') === -1); + } +} diff --git a/src/app/ng2-ui-auth/lib/shared.service.spec.ts b/src/app/ng2-ui-auth/lib/shared.service.spec.ts new file mode 100644 index 0000000000..bc8e08f201 --- /dev/null +++ b/src/app/ng2-ui-auth/lib/shared.service.spec.ts @@ -0,0 +1,36 @@ +/* + * + * Copyright 2024 OICR and UCSC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * + */ + +import { TestBed, inject } from '@angular/core/testing'; +import { CONFIG_OPTIONS, ConfigService } from './config.service'; + +import { SharedService } from './shared.service'; +import { StorageService } from './storage-service'; + +describe('SharedService', () => { + beforeEach(() => { + TestBed.configureTestingModule({ + providers: [SharedService, StorageService, ConfigService, { provide: CONFIG_OPTIONS, useValue: {} }], + }); + }); + + it('should be created', inject([SharedService], (service: SharedService) => { + expect(service).toBeTruthy(); + })); +}); diff --git a/src/app/ng2-ui-auth/lib/shared.service.ts b/src/app/ng2-ui-auth/lib/shared.service.ts new file mode 100644 index 0000000000..b0eb5807ab --- /dev/null +++ b/src/app/ng2-ui-auth/lib/shared.service.ts @@ -0,0 +1,132 @@ +/* + * + * Copyright 2024 OICR and UCSC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * + */ + +import { Injectable } from '@angular/core'; +import { StorageType } from './storage-type.enum'; +import { Subscriber, Observable } from 'rxjs'; +import { StorageService } from './storage-service'; +import { ConfigService } from './config.service'; + +@Injectable() +export class SharedService { + public tokenName = this.config.options.tokenPrefix + ? [this.config.options.tokenPrefix, this.config.options.tokenName].join(this.config.options.tokenSeparator) + : this.config.options.tokenName; + + constructor(private storage: StorageService, private config: ConfigService) {} + + public getToken() { + return this.storage.get(this.tokenName); + } + + public getPayload(token = this.getToken()) { + if (token && token.split('.').length === 3) { + try { + const base64Url = token.split('.')[1]; + const base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/'); + return JSON.parse(this.b64DecodeUnicode(base64)); + } catch (e) { + return undefined; + } + } + } + + public setToken(response: string | object) { + if (!response) { + // console.warn('Can\'t set token without passing a value'); + return; + } + + let token: string; + if (typeof response === 'string') { + token = response; + } else { + token = this.config.options.resolveToken(response, this.config.options); + } + + if (token) { + const expDate = this.getExpirationDate(token); + this.storage.set(this.tokenName, token, expDate ? expDate.toUTCString() : ''); + } + } + + public removeToken() { + this.storage.remove(this.tokenName); + } + + public isAuthenticated(token = this.getToken()) { + // a token is present + if (token) { + // token with a valid JWT format XXX.YYY.ZZZ + if (token.split('.').length === 3) { + // could be a valid JWT or an access token with the same format + try { + const base64Url = token.split('.')[1]; + const base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/'); + const exp = JSON.parse(this.b64DecodeUnicode(base64)).exp; + // jwt with an optional expiration claims + if (exp) { + const isExpired = Math.round(new Date().getTime() / 1000) >= exp; + if (isExpired) { + // fail: Expired token + this.storage.remove(this.tokenName); + return false; + } else { + // pass: Non-expired token + return true; + } + } + } catch (e) { + // pass: Non-JWT token that looks like JWT + return true; + } + } + // pass: All other tokens + return true; + } + // lail: No token at all + return false; + } + + public getExpirationDate(token = this.getToken()) { + const payload = this.getPayload(token); + if (payload && payload.exp && Math.round(new Date().getTime() / 1000) < payload.exp) { + const date = new Date(0); + date.setUTCSeconds(payload.exp); + return date; + } + return null; + } + + public logout(): Observable { + return Observable.create((observer: Subscriber) => { + this.storage.remove(this.tokenName); + observer.next(); + observer.complete(); + }); + } + + public setStorageType(type: StorageType) { + return this.storage.updateStorageType(type); + } + + private b64DecodeUnicode(str) { + return decodeURIComponent(Array.prototype.map.call(atob(str), (c) => '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2)).join('')); + } +} diff --git a/src/app/ng2-ui-auth/lib/storage-service.ts b/src/app/ng2-ui-auth/lib/storage-service.ts new file mode 100644 index 0000000000..dd2826cdd0 --- /dev/null +++ b/src/app/ng2-ui-auth/lib/storage-service.ts @@ -0,0 +1,11 @@ +import { StorageType } from './storage-type.enum'; + +export abstract class StorageService { + abstract updateStorageType(storageType: StorageType): boolean; + + abstract get(key: string): string; + + abstract set(key: string, value: string, date: string): void; + + abstract remove(key: string): void; +} diff --git a/src/app/ng2-ui-auth/lib/storage-type.enum.ts b/src/app/ng2-ui-auth/lib/storage-type.enum.ts new file mode 100644 index 0000000000..33d5b338e2 --- /dev/null +++ b/src/app/ng2-ui-auth/lib/storage-type.enum.ts @@ -0,0 +1,27 @@ +/* + * + * Copyright 2024 OICR and UCSC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * + */ + +export enum StorageType { + NONE = 'none', + MEMORY = 'memory', + LOCAL_STORAGE = 'localStorage', + SESSION_STORAGE = 'sessionStorage', + COOKIE = 'cookie', + SESSION_COOKIE = 'sessionCookie', +} diff --git a/src/app/ng2-ui-auth/lib/utils.ts b/src/app/ng2-ui-auth/lib/utils.ts new file mode 100644 index 0000000000..091a5700c2 --- /dev/null +++ b/src/app/ng2-ui-auth/lib/utils.ts @@ -0,0 +1,57 @@ +/* + * + * Copyright 2024 OICR and UCSC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * + */ + +/** + * Created by Ron on 17/12/2015. + */ + +export function joinUrl(baseUrl: string, url: string) { + if (/^(?:[a-z]+:)?\/\//i.test(url)) { + return url; + } + + const joined = [baseUrl, url].join('/'); + + return joined.replace(/[\/]+/g, '/').replace(/\/\?/g, '?').replace(/\/\#/g, '#').replace(/\:\//g, '://'); +} + +export function buildQueryString(obj: object) { + return Object.keys(obj) + .map((key) => (!!obj[key] ? `${encodeURIComponent(key)}=${encodeURIComponent(obj[key])}` : key)) + .join('&'); +} + +export function getWindowOrigin(w?: Window) { + if (!w && typeof window !== 'undefined') { + w = window; + } + try { + if (!w || !w.location) { + return null; + } + if (!w.location.origin) { + return `${w.location.protocol}//${w.location.hostname}${w.location.port ? ':' + w.location.port : ''}`; + } + return w.location.origin; + } catch (error) { + return null; + // ignore DOMException: Blocked a frame with origin from accessing a cross-origin frame. + // error instanceof DOMException && error.name === 'SecurityError' + } +} diff --git a/src/app/ng2-ui-auth/public_api.ts b/src/app/ng2-ui-auth/public_api.ts new file mode 100644 index 0000000000..7bfed7f6da --- /dev/null +++ b/src/app/ng2-ui-auth/public_api.ts @@ -0,0 +1,35 @@ +import { Ng2UiAuthModule } from './lib/ng2-ui-auth.module'; +import { LocalService } from './lib/local.service'; +import { Oauth2Service } from './lib/oauth2.service'; +import { Oauth1Service } from './lib/oauth1.service'; +import { PopupService } from './lib/popup.service'; +import { OauthService } from './lib/oauth.service'; +import { SharedService } from './lib/shared.service'; +import { StorageService } from './lib/storage-service'; +import { BrowserStorageService } from './lib/browser-storage.service'; +import { AuthService } from './lib/auth.service'; +import { ConfigService, CONFIG_OPTIONS } from './lib/config.service'; +import { JwtInterceptor } from './lib/interceptor.service'; +import { IProviders } from './lib/config-interfaces'; +import { StorageType } from './lib/storage-type.enum'; + +/* + * Public API Surface of ng2-ui-auth + */ +export { + Ng2UiAuthModule, + LocalService, + Oauth2Service, + Oauth1Service, + PopupService, + OauthService, + SharedService, + StorageService, + BrowserStorageService, + AuthService, + ConfigService, + JwtInterceptor, + CONFIG_OPTIONS, + IProviders, + StorageType, +}; diff --git a/src/app/ng2-ui-auth/test.ts b/src/app/ng2-ui-auth/test.ts new file mode 100644 index 0000000000..a7f794a86a --- /dev/null +++ b/src/app/ng2-ui-auth/test.ts @@ -0,0 +1,16 @@ +// This file is required by karma.conf.js and loads recursively all the .spec and framework files + +import { getTestBed } from '@angular/core/testing'; +import { BrowserDynamicTestingModule, platformBrowserDynamicTesting } from '@angular/platform-browser-dynamic/testing'; +import 'core-js/es7/reflect'; +import 'zone.js/dist/zone'; +import 'zone.js/dist/zone-testing'; + +declare const require: any; + +// First, initialize the Angular testing environment. +getTestBed().initTestEnvironment(BrowserDynamicTestingModule, platformBrowserDynamicTesting()); +// Then we find all the tests. +const context = require.context('./', true, /\.spec\.ts$/); +// And load the modules. +context.keys().map(context); diff --git a/src/app/notebook/notebook-markdown.component.ts b/src/app/notebook/notebook-markdown.component.ts index e8778b5bd0..7301fd1dff 100644 --- a/src/app/notebook/notebook-markdown.component.ts +++ b/src/app/notebook/notebook-markdown.component.ts @@ -3,11 +3,14 @@ import { DomSanitizer, SafeHtml } from '@angular/platform-browser'; import { MarkdownWrapperService } from '../shared/markdown-wrapper/markdown-wrapper.service'; import { join, replaceAll, selectBestFromMimeBundle } from './notebook-helpers'; import { Attachments, Cell } from './notebook-types'; +import { NgIf } from '@angular/common'; import './mathjax'; @Component({ selector: 'app-notebook-markdown', templateUrl: './notebook-markdown.component.html', + standalone: true, + imports: [NgIf], }) export class NotebookMarkdownComponent implements OnChanges { @Input() cell: Cell; diff --git a/src/app/notebook/notebook-mime-bundle-output.component.ts b/src/app/notebook/notebook-mime-bundle-output.component.ts index 8e7ace5512..84fa3add03 100644 --- a/src/app/notebook/notebook-mime-bundle-output.component.ts +++ b/src/app/notebook/notebook-mime-bundle-output.component.ts @@ -2,10 +2,13 @@ import { Component, Input, OnChanges } from '@angular/core'; import { MarkdownWrapperService } from '../shared/markdown-wrapper/markdown-wrapper.service'; import { escape, selectBestFromMimeBundle } from './notebook-helpers'; import { MimeBundle, Output, OutputMetadata } from './notebook-types'; +import { NgIf } from '@angular/common'; @Component({ selector: 'app-notebook-mime-bundle-output', templateUrl: './notebook-mime-bundle-output.component.html', + standalone: true, + imports: [NgIf], }) export class NotebookMimeBundleOutputComponent implements OnChanges { @Input() output: Output; diff --git a/src/app/notebook/notebook-source.component.ts b/src/app/notebook/notebook-source.component.ts index 15b1318c9d..7f047c7d18 100644 --- a/src/app/notebook/notebook-source.component.ts +++ b/src/app/notebook/notebook-source.component.ts @@ -1,11 +1,14 @@ import { Component, Input, OnChanges } from '@angular/core'; import { escape, join } from './notebook-helpers'; import { Cell } from './notebook-types'; +import { NgIf } from '@angular/common'; import './prism'; @Component({ selector: 'app-notebook-source', templateUrl: './notebook-source.component.html', + standalone: true, + imports: [NgIf], }) export class NotebookSourceComponent implements OnChanges { @Input() cell: Cell; diff --git a/src/app/notebook/notebook-stream-output.component.ts b/src/app/notebook/notebook-stream-output.component.ts index e69a9351dc..f3a1be36e7 100644 --- a/src/app/notebook/notebook-stream-output.component.ts +++ b/src/app/notebook/notebook-stream-output.component.ts @@ -1,10 +1,13 @@ import { Component, Input, OnChanges } from '@angular/core'; import { join } from './notebook-helpers'; import { Output } from './notebook-types'; +import { NgIf } from '@angular/common'; @Component({ selector: 'app-notebook-stream-output', templateUrl: './notebook-stream-output.component.html', + standalone: true, + imports: [NgIf], }) export class NotebookStreamOutputComponent implements OnChanges { @Input() output: Output; diff --git a/src/app/notebook/notebook.component.html b/src/app/notebook/notebook.component.html index 4ecd378f5a..55e6089cfd 100644 --- a/src/app/notebook/notebook.component.html +++ b/src/app/notebook/notebook.component.html @@ -1,6 +1,6 @@ -
    The notebook could not be displayed.
    +
    {{ error }}
    diff --git a/src/app/notebook/notebook.component.spec.ts b/src/app/notebook/notebook.component.spec.ts index 20895ac358..3b78c38fd0 100644 --- a/src/app/notebook/notebook.component.spec.ts +++ b/src/app/notebook/notebook.component.spec.ts @@ -20,14 +20,14 @@ describe('NotebookComponent', () => { beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [ + imports: [ + HttpClientTestingModule, NotebookComponent, NotebookMarkdownComponent, NotebookSourceComponent, NotebookStreamOutputComponent, NotebookMimeBundleOutputComponent, ], - imports: [HttpClientTestingModule], providers: [ { provide: WorkflowsService, @@ -64,7 +64,7 @@ describe('NotebookComponent', () => { } function makeSourceFile(content: string, path: string, type: SourceFile.TypeEnum = SourceFile.TypeEnum.DOCKSTOREJUPYTER): SourceFile { - return { content: content, path: path, type: type } as SourceFile; + return { content: content, path: path, type: type, state: SourceFile.StateEnum.COMPLETE } as SourceFile; } function makeWorkflow(language: string): Workflow { @@ -97,14 +97,14 @@ describe('NotebookComponent', () => { function confirmSuccess() { const element: HTMLElement = fixture.nativeElement; - expect(notebookComponent.error).toBeFalse(); + expect(notebookComponent.error).toBeNull(); expect(element.querySelectorAll('.notebook').length).toBe(1); expect(element.textContent).not.toContain('The notebook could not be displayed.'); } function confirmError() { const element: HTMLElement = fixture.nativeElement; - expect(notebookComponent.error).toBeTrue(); + expect(notebookComponent.error).not.toEqual(null); expect(element.querySelectorAll('.notebook').length).toBe(0); expect(element.textContent).toContain('The notebook could not be displayed.'); } @@ -192,4 +192,12 @@ describe('NotebookComponent', () => { expect(element.querySelector('.source').textContent).toContain('some input'); expect(element.querySelector('.output').textContent).toContain('some html'); }); + + it('should display the message from a NOT_STORED notebook', () => { + const sourceFile = makeSourceFile('could not store', '/main.ipynb'); + sourceFile.state = SourceFile.StateEnum.NOTSTORED; + formatEntities([sourceFile], makeWorkflow('Python'), makeVersion('/main.ipynb'), ''); + confirmError(); + expect(element.textContent).toContain('could not store'); + }); }); diff --git a/src/app/notebook/notebook.component.ts b/src/app/notebook/notebook.component.ts index 3525f91962..a933aa741f 100644 --- a/src/app/notebook/notebook.component.ts +++ b/src/app/notebook/notebook.component.ts @@ -3,6 +3,11 @@ import { finalize } from 'rxjs/operators'; import { Subscription } from 'rxjs'; import { SourceFile, Workflow, WorkflowVersion, WorkflowsService } from 'app/shared/openapi'; import { Cell } from './notebook-types'; +import { NotebookMimeBundleOutputComponent } from './notebook-mime-bundle-output.component'; +import { NotebookStreamOutputComponent } from './notebook-stream-output.component'; +import { NotebookSourceComponent } from './notebook-source.component'; +import { NotebookMarkdownComponent } from './notebook-markdown.component'; +import { NgIf, NgFor } from '@angular/common'; /** * Convert the specified notebook to user-friendly preview that represents it. @@ -11,9 +16,20 @@ import { Cell } from './notebook-types'; * https://nbformat.readthedocs.io/en/latest/ */ +const ERROR_MESSAGE = 'The notebook could not be displayed.'; + @Component({ selector: 'app-notebook', templateUrl: './notebook.component.html', + standalone: true, + imports: [ + NgIf, + NgFor, + NotebookMarkdownComponent, + NotebookSourceComponent, + NotebookStreamOutputComponent, + NotebookMimeBundleOutputComponent, + ], }) export class NotebookComponent implements OnChanges { constructor(private workflowsService: WorkflowsService) {} @@ -21,7 +37,7 @@ export class NotebookComponent implements OnChanges { @Input() version: WorkflowVersion; @Input() baseUrl: string; loading: boolean = true; - error: boolean = false; + error: string | null = null; cells: Cell[] = []; private currentSubscription: Subscription = null; @@ -31,7 +47,7 @@ export class NotebookComponent implements OnChanges { retrieveAndFormatNotebook() { this.loading = true; - this.error = false; + this.error = null; this.cells = []; // The next line cancels any previous request that is still in progress, // because if we're here, the @Inputs have changed, and we're about to @@ -59,34 +75,50 @@ export class NotebookComponent implements OnChanges { (sourceFiles: SourceFile[]) => { for (const sourceFile of sourceFiles) { if (this.isPrimaryDescriptor(sourceFile.path)) { - try { - // Parse the JSON content of the notebook file. - const json = JSON.parse(sourceFile.content); - // Find the cells and, if necessary, convert them to a representation that approximates nbformat 4. - const cells = json?.nbformat < 4 ? this.cellsToNbformat4(json?.worksheets[0]?.cells) : json?.cells; - // If the `cells` property is an array, filter spam and "pass" the cells to the template. - if (this.isArray(cells)) { - this.cells = this.filterSpam(cells); - this.error = false; - return; - } - } catch (e) { - console.log('Exception formatting notebook:'); - console.log(e.message); + if (sourceFile.state === 'COMPLETE') { + this.formatNotebook(sourceFile.content); + } else { + this.error = this.incompleteSourceFileErrorMessage(sourceFile); } - this.error = true; return; } } - this.error = true; + this.error = ERROR_MESSAGE; }, // Failure. () => { - this.error = true; + this.error = ERROR_MESSAGE; } ); } + formatNotebook(content: string): void { + try { + // Parse the JSON content of the notebook file. + const json = JSON.parse(content); + // Find the cells and, if necessary, convert them to a representation that approximates nbformat 4. + const cells = json?.nbformat < 4 ? this.cellsToNbformat4(json?.worksheets[0]?.cells) : json?.cells; + // If the `cells` property is an array, filter spam, "pass" the cells to the template, and return. + if (this.isArray(cells)) { + this.cells = this.filterSpam(cells); + this.error = null; + return; + } + } catch (e) { + console.log('Exception formatting notebook:'); + console.log(e.message); + } + this.error = ERROR_MESSAGE; + } + + incompleteSourceFileErrorMessage(file: SourceFile): string { + var message = ERROR_MESSAGE; + if (file.state === 'NOT_STORED') { + message = message + ' ' + file.content; + } + return message; + } + isPrimaryDescriptor(path: string): boolean { return path === this.version.workflow_path; } diff --git a/src/app/notifications/sitewide-notifications.component.ts b/src/app/notifications/sitewide-notifications.component.ts index a3f559f87a..ad1e67fcda 100644 --- a/src/app/notifications/sitewide-notifications.component.ts +++ b/src/app/notifications/sitewide-notifications.component.ts @@ -2,11 +2,18 @@ import { Component, OnInit } from '@angular/core'; import { Observable } from 'rxjs'; import { Notification } from '../shared/openapi/model/notification'; import { NotificationsService } from './state/notifications.service'; +import { MatIconModule } from '@angular/material/icon'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { MarkdownWrapperComponent } from '../shared/markdown-wrapper/markdown-wrapper.component'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { NgFor, AsyncPipe } from '@angular/common'; @Component({ selector: 'app-sitewide-notifications', templateUrl: './sitewide-notifications.component.html', styleUrls: ['./sitewide-notifications.component.scss'], + standalone: true, + imports: [NgFor, FlexModule, MarkdownWrapperComponent, MatLegacyButtonModule, MatIconModule, AsyncPipe], }) export class SitewideNotificationsComponent implements OnInit { public activeNotifications$: Observable>; diff --git a/src/app/organizations/collection/add-entry.module.ts b/src/app/organizations/collection/add-entry.module.ts index 76137efe2b..446af09a57 100644 --- a/src/app/organizations/collection/add-entry.module.ts +++ b/src/app/organizations/collection/add-entry.module.ts @@ -15,14 +15,12 @@ */ import { CommonModule } from '@angular/common'; import { NgModule } from '@angular/core'; -import { FlexLayoutModule } from '@angular/flex-layout'; +import { FlexLayoutModule } from '@ngbracket/ngx-layout'; import { CurrentCollectionsModule } from '../../entry/current-collections.module'; -import { RefreshAlertModule } from '../../shared/alert/alert.module'; -import { CustomMaterialModule } from '../../shared/modules/material.module'; + import { AddEntryComponent } from './add-entry/add-entry.component'; @NgModule({ - imports: [CommonModule, CustomMaterialModule, CurrentCollectionsModule, FlexLayoutModule, RefreshAlertModule], - declarations: [AddEntryComponent], + imports: [CommonModule, CurrentCollectionsModule, FlexLayoutModule, AddEntryComponent], }) export class AddEntryModule {} diff --git a/src/app/organizations/collection/add-entry/add-entry.component.ts b/src/app/organizations/collection/add-entry/add-entry.component.ts index b4f89af2e8..f080fa61ba 100644 --- a/src/app/organizations/collection/add-entry/add-entry.component.ts +++ b/src/app/organizations/collection/add-entry/add-entry.component.ts @@ -1,14 +1,42 @@ import { Component, Inject, OnInit } from '@angular/core'; -import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog'; +import { + MatLegacyDialogRef as MatDialogRef, + MAT_LEGACY_DIALOG_DATA as MAT_DIALOG_DATA, + MatLegacyDialogModule, +} from '@angular/material/legacy-dialog'; import { Observable } from 'rxjs'; import { Collection, OrganizationUser } from '../../../shared/openapi'; import { AddEntryQuery } from '../state/add-entry.query'; import { AddEntryService } from '../state/add-entry.service'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { MatLegacyOptionModule } from '@angular/material/legacy-core'; +import { MatLegacySelectModule } from '@angular/material/legacy-select'; +import { MatLegacyFormFieldModule } from '@angular/material/legacy-form-field'; +import { MatIconModule } from '@angular/material/icon'; +import { MatLegacyCardModule } from '@angular/material/legacy-card'; +import { NgIf, NgFor, AsyncPipe } from '@angular/common'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { LoadingComponent } from '../../../shared/loading/loading.component'; @Component({ selector: 'app-add-entry', templateUrl: './add-entry.component.html', styleUrls: ['./add-entry.component.scss'], + standalone: true, + imports: [ + MatLegacyDialogModule, + LoadingComponent, + FlexModule, + NgIf, + MatLegacyCardModule, + MatIconModule, + MatLegacyFormFieldModule, + MatLegacySelectModule, + NgFor, + MatLegacyOptionModule, + MatLegacyButtonModule, + AsyncPipe, + ], }) export class AddEntryComponent implements OnInit { public memberships$: Observable>; diff --git a/src/app/organizations/collection/collection.component.html b/src/app/organizations/collection/collection.component.html index b14eb38444..bd6039202a 100644 --- a/src/app/organizations/collection/collection.component.html +++ b/src/app/organizations/collection/collection.component.html @@ -133,6 +133,12 @@
    +
    + + + {{ entry.topic }} + +

    diff --git a/src/app/organizations/collection/collection.component.ts b/src/app/organizations/collection/collection.component.ts index c0f4ad4521..3b2a575f3a 100644 --- a/src/app/organizations/collection/collection.component.ts +++ b/src/app/organizations/collection/collection.component.ts @@ -1,13 +1,17 @@ import { Component, Inject, OnInit } from '@angular/core'; -import { MAT_DIALOG_DATA, MatDialog } from '@angular/material/dialog'; +import { + MAT_LEGACY_DIALOG_DATA as MAT_DIALOG_DATA, + MatLegacyDialog as MatDialog, + MatLegacyDialogModule, +} from '@angular/material/legacy-dialog'; import { Observable } from 'rxjs'; import { bootstrap4mediumModalSize } from '../../shared/constants'; import { Dockstore } from '../../shared/dockstore.model'; import { TagEditorMode } from '../../shared/enum/tagEditorMode.enum'; import { OrgLogoService } from '../../shared/org-logo.service'; -import { Collection, Organization, OrganizationsService } from '../../shared/openapi'; +import { Collection, Organization, OrganizationsService, Workflow } from '../../shared/openapi'; +import TopicSelectionEnum = Workflow.TopicSelectionEnum; import { ToolDescriptor } from '../../shared/openapi/model/toolDescriptor'; -import { Workflow } from '../../shared/openapi/model/workflow'; import { UserQuery } from '../../shared/user/user.query'; import { ActivatedRoute } from '../../test'; import { CreateCollectionComponent } from '../collections/create-collection/create-collection.component'; @@ -20,10 +24,31 @@ import { OrganizationQuery } from '../state/organization.query'; import { EntryType } from 'app/shared/enum/entry-type'; import { HttpErrorResponse } from '@angular/common/http'; import { AlertService } from '../../shared/alert/state/alert.service'; +import { AlertComponent } from '../../shared/alert/alert.component'; +import { RouterLinkPipe } from '../../entry/router-link.pipe'; +import { GravatarPipe } from '../../gravatar/gravatar.pipe'; +import { MapFriendlyValuesPipe } from '../../search/map-friendly-values.pipe'; +import { MarkdownWrapperComponent } from '../../shared/markdown-wrapper/markdown-wrapper.component'; +import { CategoryButtonComponent } from '../../categories/button/category-button.component'; +import { MatLegacyChipsModule } from '@angular/material/legacy-chips'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; +import { ImgFallbackDirective } from '../../shared/img-fallback.directive'; +import { MatIconModule } from '@angular/material/icon'; +import { MatLegacyCardModule } from '@angular/material/legacy-card'; +import { NgIf, NgFor, NgClass, AsyncPipe, DatePipe } from '@angular/common'; +import { LoadingComponent } from '../../shared/loading/loading.component'; +import { ExtendedModule } from '@ngbracket/ngx-layout/extended'; +import { RouterLink } from '@angular/router'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { HeaderComponent } from '../../header/header.component'; +import { AiBubbleComponent } from '../../shared/ai-bubble/ai-bubble.component'; @Component({ selector: 'app-collection-entry-confirm-remove', templateUrl: 'collection-entry-confirm-remove.html', + standalone: true, + imports: [MatLegacyDialogModule, AlertComponent, FlexModule, MatLegacyButtonModule], }) export class CollectionRemoveEntryDialogComponent { constructor(@Inject(MAT_DIALOG_DATA) public data: EntryDialogData, private collectionsService: CollectionsService) {} @@ -51,6 +76,31 @@ export interface EntryDialogData { selector: 'app-collection', templateUrl: './collection.component.html', styleUrls: ['./collection.component.scss', '../organization/organization.component.scss'], + standalone: true, + imports: [ + HeaderComponent, + FlexModule, + RouterLink, + ExtendedModule, + LoadingComponent, + NgIf, + MatLegacyCardModule, + MatIconModule, + ImgFallbackDirective, + MatLegacyTooltipModule, + MatLegacyButtonModule, + NgFor, + MatLegacyChipsModule, + CategoryButtonComponent, + NgClass, + MarkdownWrapperComponent, + AsyncPipe, + DatePipe, + MapFriendlyValuesPipe, + GravatarPipe, + RouterLinkPipe, + AiBubbleComponent, + ], }) export class CollectionComponent implements OnInit { entryType = EntryType; @@ -166,4 +216,5 @@ export class CollectionComponent implements OnInit { } protected readonly Dockstore = Dockstore; + protected readonly TopicSelectionEnum = TopicSelectionEnum; } diff --git a/src/app/organizations/collection/state/add-entry.service.spec.ts b/src/app/organizations/collection/state/add-entry.service.spec.ts index 71057156bb..7c96f6033c 100644 --- a/src/app/organizations/collection/state/add-entry.service.spec.ts +++ b/src/app/organizations/collection/state/add-entry.service.spec.ts @@ -1,6 +1,6 @@ import { HttpClientTestingModule } from '@angular/common/http/testing'; import { TestBed } from '@angular/core/testing'; -import { CustomMaterialModule } from '../../../shared/modules/material.module'; +import { MatLegacySnackBarModule } from '@angular/material/legacy-snack-bar'; import { AddEntryService } from './add-entry.service'; import { AddEntryStore } from './add-entry.store'; @@ -10,7 +10,7 @@ describe('AddEntryService', () => { beforeEach(() => { TestBed.configureTestingModule({ providers: [AddEntryService, AddEntryStore], - imports: [HttpClientTestingModule, CustomMaterialModule], + imports: [HttpClientTestingModule, MatLegacySnackBarModule], }); addEntryService = TestBed.inject(AddEntryService); diff --git a/src/app/organizations/collections.module.ts b/src/app/organizations/collections.module.ts deleted file mode 100644 index e15f113700..0000000000 --- a/src/app/organizations/collections.module.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { FlexLayoutModule } from '@angular/flex-layout'; -import { RouterModule } from '@angular/router'; - -import { MarkdownModule } from 'ngx-markdown'; -import { CategoryButtonModule } from '../categories/button/category-button.module'; -import { RefreshAlertModule } from '../shared/alert/alert.module'; -import { HeaderModule } from '../shared/modules/header.module'; -import { ImgFallbackModule } from '../shared/modules/img-fallback.module'; -import { MarkdownWrapperModule } from '../shared/modules/markdown-wrapper.module'; -import { CustomMaterialModule } from '../shared/modules/material.module'; -import { PipeModule } from '../shared/pipe/pipe.module'; -import { CollectionComponent, CollectionRemoveEntryDialogComponent } from './collection/collection.component'; -import { CollectionsComponent } from './collections/collections.component'; -import { CreateCollectionModule } from './collections/create-collection.module'; -import { RemoveCollectionDialogComponent } from './collections/remove-collection/remove-collection.component'; -import { UpdateOrganizationDescriptionModule } from './organization/update-organization-description.module'; -import { PreviewWarningModule } from '../shared/modules/preview-warning.module'; - -@NgModule({ - imports: [ - CommonModule, - CreateCollectionModule, - CustomMaterialModule, - FlexLayoutModule, - HeaderModule, - RefreshAlertModule, - RouterModule, - MarkdownModule, - UpdateOrganizationDescriptionModule, - MarkdownWrapperModule, - CategoryButtonModule, - ImgFallbackModule, - PipeModule, - PreviewWarningModule, - ], - declarations: [CollectionsComponent, CollectionComponent, CollectionRemoveEntryDialogComponent, RemoveCollectionDialogComponent], - exports: [CollectionsComponent, CollectionComponent], -}) -export class CollectionsModule {} diff --git a/src/app/organizations/collections/collections.component.ts b/src/app/organizations/collections/collections.component.ts index e7dbf8e86a..c8b080ad4d 100644 --- a/src/app/organizations/collections/collections.component.ts +++ b/src/app/organizations/collections/collections.component.ts @@ -13,10 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { P } from '@angular/cdk/keycodes'; -import { KeyValue } from '@angular/common'; +import { KeyValue, NgIf, NgFor, AsyncPipe, JsonPipe, KeyValuePipe } from '@angular/common'; import { Component, Input, OnChanges, OnInit, SimpleChanges } from '@angular/core'; -import { MatDialog } from '@angular/material/dialog'; +import { MatLegacyDialog as MatDialog } from '@angular/material/legacy-dialog'; import { HashMap } from '@datorama/akita'; import { Observable } from 'rxjs'; import { TagEditorMode } from '../../shared/enum/tagEditorMode.enum'; @@ -26,11 +25,33 @@ import { CollectionsService } from '../state/collections.service'; import { OrganizationQuery } from '../state/organization.query'; import { CreateCollectionComponent } from './create-collection/create-collection.component'; import { Dockstore } from '../../shared/dockstore.model'; +import { RouterLink } from '@angular/router'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { MatLegacyCardModule } from '@angular/material/legacy-card'; +import { LoadingComponent } from '../../shared/loading/loading.component'; +import { MatIconModule } from '@angular/material/icon'; +import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; @Component({ selector: 'app-collections', templateUrl: './collections.component.html', styleUrls: ['./collections.component.scss'], + standalone: true, + imports: [ + NgIf, + MatLegacyButtonModule, + MatLegacyTooltipModule, + MatIconModule, + LoadingComponent, + MatLegacyCardModule, + FlexModule, + NgFor, + RouterLink, + AsyncPipe, + JsonPipe, + KeyValuePipe, + ], }) export class CollectionsComponent implements OnInit, OnChanges { public Dockstore = Dockstore; diff --git a/src/app/organizations/collections/create-collection.module.ts b/src/app/organizations/collections/create-collection.module.ts deleted file mode 100644 index 6e01441ee3..0000000000 --- a/src/app/organizations/collections/create-collection.module.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { FlexLayoutModule } from '@angular/flex-layout'; -import { ReactiveFormsModule } from '@angular/forms'; - -import { RefreshAlertModule } from '../../shared/alert/alert.module'; -import { CustomMaterialModule } from '../../shared/modules/material.module'; -import { CreateCollectionComponent } from './create-collection/create-collection.component'; - -@NgModule({ - imports: [CommonModule, FlexLayoutModule, CustomMaterialModule, ReactiveFormsModule, RefreshAlertModule], - declarations: [CreateCollectionComponent], -}) -export class CreateCollectionModule {} diff --git a/src/app/organizations/collections/create-collection/create-collection.component.ts b/src/app/organizations/collections/create-collection/create-collection.component.ts index 6d3c47bed7..4954237a26 100644 --- a/src/app/organizations/collections/create-collection/create-collection.component.ts +++ b/src/app/organizations/collections/create-collection/create-collection.component.ts @@ -1,8 +1,7 @@ -import { KeyValue } from '@angular/common'; +import { KeyValue, NgIf, AsyncPipe } from '@angular/common'; import { Component, Inject, OnDestroy, OnInit } from '@angular/core'; -import { AbstractControl, UntypedFormGroup } from '@angular/forms'; -import { MAT_DIALOG_DATA } from '@angular/material/dialog'; -import { HashMap } from '@datorama/akita'; +import { AbstractControl, UntypedFormGroup, FormsModule, ReactiveFormsModule } from '@angular/forms'; +import { MAT_LEGACY_DIALOG_DATA as MAT_DIALOG_DATA, MatLegacyDialogModule } from '@angular/material/legacy-dialog'; import { NgFormsManager } from '@ngneat/forms-manager'; import { Observable } from 'rxjs'; import { TagEditorMode } from '../../../shared/enum/tagEditorMode.enum'; @@ -10,6 +9,12 @@ import { Collection } from '../../../shared/openapi'; import { CreateCollectionQuery } from '../state/create-collection.query'; import { CreateCollectionService, FormsState } from '../state/create-collection.service'; +import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { MatLegacyInputModule } from '@angular/material/legacy-input'; +import { MatLegacyFormFieldModule } from '@angular/material/legacy-form-field'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { AlertComponent } from '../../../shared/alert/alert.component'; /** * This is actually both create and update collection dialog @@ -21,6 +26,20 @@ import { CreateCollectionService, FormsState } from '../state/create-collection. */ @Component({ templateUrl: './create-collection.component.html', + standalone: true, + imports: [ + NgIf, + MatLegacyDialogModule, + AlertComponent, + FormsModule, + FlexModule, + ReactiveFormsModule, + MatLegacyFormFieldModule, + MatLegacyInputModule, + MatLegacyButtonModule, + MatLegacyTooltipModule, + AsyncPipe, + ], }) export class CreateCollectionComponent implements OnInit, OnDestroy { createCollectionForm: UntypedFormGroup; diff --git a/src/app/organizations/collections/remove-collection/remove-collection.component.ts b/src/app/organizations/collections/remove-collection/remove-collection.component.ts index 739d7f1529..755490c262 100644 --- a/src/app/organizations/collections/remove-collection/remove-collection.component.ts +++ b/src/app/organizations/collections/remove-collection/remove-collection.component.ts @@ -14,22 +14,38 @@ * limitations under the License. */ import { Component, Inject } from '@angular/core'; -import { MAT_DIALOG_DATA } from '@angular/material/dialog'; +import { MAT_LEGACY_DIALOG_DATA as MAT_DIALOG_DATA, MatLegacyDialogModule } from '@angular/material/legacy-dialog'; import { Observable } from 'rxjs'; import { CollectionsService } from '../../state/collections.service'; import { CollectionsQuery } from '../../state/collections.query'; +import { AsyncPipe } from '@angular/common'; +import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { AlertComponent } from '../../../shared/alert/alert.component'; @Component({ selector: 'app-collection-confirm-remove', templateUrl: './remove-collection.component.html', + standalone: true, + imports: [MatLegacyDialogModule, AlertComponent, FlexModule, MatLegacyButtonModule, MatLegacyTooltipModule, AsyncPipe], }) export class RemoveCollectionDialogComponent { public collectionsQueryLoading$: Observable; - constructor(@Inject(MAT_DIALOG_DATA) public data: CollectionDialogData, private collectionsService: CollectionsService, private collectionsQuery: CollectionsQuery) { - this.collectionsQueryLoading$ = collectionsQuery.selectLoading(); + constructor( + @Inject(MAT_DIALOG_DATA) public data: CollectionDialogData, + private collectionsService: CollectionsService, + private collectionsQuery: CollectionsQuery + ) { + this.collectionsQueryLoading$ = this.collectionsQuery.selectLoading(); } removeCollection() { - this.collectionsService.deleteCollection(this.data.organizationId, this.data.collectionId, this.data.organizationName, this.data.collectionName); + this.collectionsService.deleteCollection( + this.data.organizationId, + this.data.collectionId, + this.data.organizationName, + this.data.collectionName + ); } } diff --git a/src/app/organizations/collections/state/create-collection.service.spec.ts b/src/app/organizations/collections/state/create-collection.service.spec.ts index 519923976f..d2dcb09823 100644 --- a/src/app/organizations/collections/state/create-collection.service.spec.ts +++ b/src/app/organizations/collections/state/create-collection.service.spec.ts @@ -16,8 +16,8 @@ import { HttpClientTestingModule } from '@angular/common/http/testing'; import { TestBed } from '@angular/core/testing'; import { UntypedFormBuilder } from '@angular/forms'; -import { MatDialog, MatDialogModule } from '@angular/material/dialog'; -import { MatSnackBarModule } from '@angular/material/snack-bar'; +import { MatLegacyDialog as MatDialog, MatLegacyDialogModule as MatDialogModule } from '@angular/material/legacy-dialog'; +import { MatLegacySnackBarModule as MatSnackBarModule } from '@angular/material/legacy-snack-bar'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { of as observableOf, throwError } from 'rxjs'; import { OrganizationsService } from '../../../shared/openapi'; diff --git a/src/app/organizations/collections/state/create-collection.service.ts b/src/app/organizations/collections/state/create-collection.service.ts index 7e2f52ff7a..faa948fc13 100644 --- a/src/app/organizations/collections/state/create-collection.service.ts +++ b/src/app/organizations/collections/state/create-collection.service.ts @@ -1,7 +1,7 @@ import { HttpErrorResponse } from '@angular/common/http'; import { Injectable } from '@angular/core'; import { UntypedFormBuilder, UntypedFormGroup, Validators } from '@angular/forms'; -import { MatDialog } from '@angular/material/dialog'; +import { MatLegacyDialog as MatDialog } from '@angular/material/legacy-dialog'; import { NgFormsManager } from '@ngneat/forms-manager'; import { finalize } from 'rxjs/operators'; import { AlertService } from '../../../shared/alert/state/alert.service'; diff --git a/src/app/organizations/events.module.ts b/src/app/organizations/events.module.ts deleted file mode 100644 index 6d8ccc76ee..0000000000 --- a/src/app/organizations/events.module.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { FlexLayoutModule } from '@angular/flex-layout'; -import { RouterModule } from '@angular/router'; - -import { RefreshAlertModule } from '../shared/alert/alert.module'; -import { CustomMaterialModule } from './../shared/modules/material.module'; -import { EventsComponent } from './events/events.component'; - -@NgModule({ - imports: [CommonModule, CustomMaterialModule, FlexLayoutModule, RouterModule, RefreshAlertModule], - declarations: [EventsComponent], - exports: [EventsComponent], -}) -export class EventsModule {} diff --git a/src/app/organizations/events/events.component.ts b/src/app/organizations/events/events.component.ts index d544691695..5b5c52aa03 100644 --- a/src/app/organizations/events/events.component.ts +++ b/src/app/organizations/events/events.component.ts @@ -3,11 +3,31 @@ import { Observable } from 'rxjs'; import { Event } from '../../shared/openapi'; import { EventsQuery } from '../state/events.query'; import { EventsService } from '../state/events.service'; +import { RouterLink } from '@angular/router'; +import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; +import { MatLegacyChipsModule } from '@angular/material/legacy-chips'; +import { NgFor, NgIf, AsyncPipe, DatePipe } from '@angular/common'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { LoadingComponent } from '../../shared/loading/loading.component'; +import { MatLegacyCardModule } from '@angular/material/legacy-card'; @Component({ selector: 'app-events', templateUrl: './events.component.html', styleUrls: ['./events.component.scss'], + standalone: true, + imports: [ + MatLegacyCardModule, + LoadingComponent, + FlexModule, + NgFor, + MatLegacyChipsModule, + MatLegacyTooltipModule, + RouterLink, + NgIf, + AsyncPipe, + DatePipe, + ], }) export class EventsComponent implements OnInit, OnChanges { @Input() organizationID: number; diff --git a/src/app/organizations/organization-members.module.ts b/src/app/organizations/organization-members.module.ts deleted file mode 100644 index 4c77114926..0000000000 --- a/src/app/organizations/organization-members.module.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { FlexLayoutModule } from '@angular/flex-layout'; -import { RouterModule } from '@angular/router'; - -import { RefreshAlertModule } from '../shared/alert/alert.module'; -import { CustomMaterialModule } from '../shared/modules/material.module'; -import { OrganizationMembersComponent } from './organization-members/organization-members.component'; -import { UpsertOrganizationMemberModule } from './upsert-organization-member.module'; - -@NgModule({ - imports: [CommonModule, FlexLayoutModule, CustomMaterialModule, RefreshAlertModule, UpsertOrganizationMemberModule, RouterModule], - declarations: [OrganizationMembersComponent], - exports: [OrganizationMembersComponent], -}) -export class OrganizationMembersModule {} diff --git a/src/app/organizations/organization-members/organization-members.component.ts b/src/app/organizations/organization-members/organization-members.component.ts index d9a8a77ff0..ee1eebb606 100644 --- a/src/app/organizations/organization-members/organization-members.component.ts +++ b/src/app/organizations/organization-members/organization-members.component.ts @@ -14,7 +14,7 @@ * limitations under the License. */ import { Component, OnInit } from '@angular/core'; -import { MatDialog } from '@angular/material/dialog'; +import { MatLegacyDialog as MatDialog } from '@angular/material/legacy-dialog'; import { ID } from '@datorama/akita'; import { ConfirmationDialogService } from 'app/confirmation-dialog/confirmation-dialog.service'; import { Base } from 'app/shared/base'; @@ -30,11 +30,36 @@ import { OrganizationMembersService } from '../state/organization-members.servic import { OrganizationQuery } from '../state/organization.query'; import { UpsertOrganizationMemberComponent } from '../upsert-organization-member/upsert-organization-member.component'; import { GravatarService } from '../../gravatar/gravatar.service'; +import { ExtendedModule } from '@ngbracket/ngx-layout/extended'; +import { RouterLink } from '@angular/router'; +import { MatLegacyCardModule } from '@angular/material/legacy-card'; +import { LoadingComponent } from '../../shared/loading/loading.component'; +import { MatIconModule } from '@angular/material/icon'; +import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { NgIf, NgFor, NgClass, AsyncPipe, TitleCasePipe } from '@angular/common'; @Component({ selector: 'app-organization-members', templateUrl: './organization-members.component.html', styleUrls: ['./organization-members.component.scss'], + standalone: true, + imports: [ + NgIf, + FlexModule, + MatLegacyButtonModule, + MatLegacyTooltipModule, + MatIconModule, + LoadingComponent, + NgFor, + MatLegacyCardModule, + RouterLink, + NgClass, + ExtendedModule, + AsyncPipe, + TitleCasePipe, + ], }) export class OrganizationMembersComponent extends Base implements OnInit { OrganizationUser = OrganizationUser; diff --git a/src/app/organizations/organization.module.ts b/src/app/organizations/organization.module.ts deleted file mode 100644 index 2e1f638727..0000000000 --- a/src/app/organizations/organization.module.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { FlexLayoutModule } from '@angular/flex-layout'; -import { RouterModule } from '@angular/router'; -import { MarkdownModule } from 'ngx-markdown'; -import { RefreshAlertModule } from '../shared/alert/alert.module'; -import { HeaderModule } from '../shared/modules/header.module'; -import { MarkdownWrapperModule } from '../shared/modules/markdown-wrapper.module'; -import { CustomMaterialModule } from '../shared/modules/material.module'; -import { PipeModule } from '../shared/pipe/pipe.module'; -import { CollectionsModule } from './collections.module'; -import { EventsModule } from './events.module'; -import { ImgFallbackModule } from '../shared/modules/img-fallback.module'; -import { OrganizationMembersModule } from './organization-members.module'; -import { OrganizationStargazersModule } from './organization/organization-stargazers/organization-stargazers.module'; -import { OrganizationStarringModule } from './organization/organization-starring/organization-starring.module'; -import { OrganizationComponent } from './organization/organization.component'; -import { UpdateOrganizationDescriptionModule } from './organization/update-organization-description.module'; -import { PreviewWarningModule } from '../shared/modules/preview-warning.module'; - -@NgModule({ - imports: [ - CollectionsModule, - CommonModule, - FlexLayoutModule, - HeaderModule, - CustomMaterialModule, - OrganizationMembersModule, - UpdateOrganizationDescriptionModule, - EventsModule, - RouterModule, - RefreshAlertModule, - OrganizationStarringModule, - OrganizationStargazersModule, - MarkdownModule, - PipeModule, - MarkdownWrapperModule, - ImgFallbackModule, - PreviewWarningModule, - ], - declarations: [OrganizationComponent], - exports: [OrganizationComponent], -}) -export class OrganizationModule {} diff --git a/src/app/organizations/organization/organization-stargazers/organization-stargazers.component.spec.ts b/src/app/organizations/organization/organization-stargazers/organization-stargazers.component.spec.ts index 5588eeb10a..8a4d4e6816 100644 --- a/src/app/organizations/organization/organization-stargazers/organization-stargazers.component.spec.ts +++ b/src/app/organizations/organization/organization-stargazers/organization-stargazers.component.spec.ts @@ -14,7 +14,7 @@ * limitations under the License. */ import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { MatCardModule } from '@angular/material/card'; +import { MatLegacyCardModule as MatCardModule } from '@angular/material/legacy-card'; import { MatIconModule } from '@angular/material/icon'; import { StarOrganizationService } from '../../../shared/star-organization.service'; import { UserService } from '../../../shared/user/user.service'; @@ -29,8 +29,7 @@ describe('OrganizationStargazersComponent', () => { beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [OrganizationStargazersComponent], - imports: [MatIconModule, MatCardModule], + imports: [MatIconModule, MatCardModule, OrganizationStargazersComponent], providers: [ { provide: UserService, useClass: UserStubService }, { provide: OrganizationStarringService, useClass: OrganizationStarringStubService }, diff --git a/src/app/organizations/organization/organization-stargazers/organization-stargazers.component.ts b/src/app/organizations/organization/organization-stargazers/organization-stargazers.component.ts index 9bd9f4fcbf..cf0885adb5 100644 --- a/src/app/organizations/organization/organization-stargazers/organization-stargazers.component.ts +++ b/src/app/organizations/organization/organization-stargazers/organization-stargazers.component.ts @@ -22,11 +22,18 @@ import { User } from '../../../shared/openapi'; import { UserService } from '../../../shared/user/user.service'; import { OrganizationStarringService } from '../organization-starring/organization-starring.service'; import { altAvatarImg } from 'app/shared/constants'; +import { RouterLink } from '@angular/router'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { MatIconModule } from '@angular/material/icon'; +import { MatLegacyCardModule } from '@angular/material/legacy-card'; +import { NgIf, NgFor } from '@angular/common'; @Component({ selector: 'app-organization-stargazers', templateUrl: '../../../stargazers/stargazers.component.html', styleUrls: ['../../../stargazers/stargazers.component.css'], + standalone: true, + imports: [NgIf, MatLegacyCardModule, MatIconModule, FlexModule, NgFor, RouterLink], }) export class OrganizationStargazersComponent extends Base implements OnInit { starGazers: Array; diff --git a/src/app/organizations/organization/organization-stargazers/organization-stargazers.module.ts b/src/app/organizations/organization/organization-stargazers/organization-stargazers.module.ts index 8f79fafc17..c4953c2d1b 100644 --- a/src/app/organizations/organization/organization-stargazers/organization-stargazers.module.ts +++ b/src/app/organizations/organization/organization-stargazers/organization-stargazers.module.ts @@ -15,8 +15,8 @@ */ import { CommonModule } from '@angular/common'; import { NgModule } from '@angular/core'; -import { FlexLayoutModule } from '@angular/flex-layout'; -import { CustomMaterialModule } from '../../../shared/modules/material.module'; +import { FlexLayoutModule } from '@ngbracket/ngx-layout'; + import { RouterModule } from '@angular/router'; import { StarOrganizationService } from '../../../shared/star-organization.service'; @@ -24,8 +24,7 @@ import { OrganizationStarringService } from '../organization-starring/organizati import { OrganizationStargazersComponent } from './organization-stargazers.component'; @NgModule({ - imports: [CommonModule, FlexLayoutModule, CustomMaterialModule, RouterModule], - declarations: [OrganizationStargazersComponent], + imports: [CommonModule, FlexLayoutModule, RouterModule, OrganizationStargazersComponent], exports: [OrganizationStargazersComponent], providers: [OrganizationStarringService, StarOrganizationService], }) diff --git a/src/app/organizations/organization/organization-starring/organization-starring.component.spec.ts b/src/app/organizations/organization/organization-starring/organization-starring.component.spec.ts index 28b3586290..0b1e2ded3c 100644 --- a/src/app/organizations/organization/organization-starring/organization-starring.component.spec.ts +++ b/src/app/organizations/organization/organization-starring/organization-starring.component.spec.ts @@ -15,9 +15,10 @@ */ import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; - import { MatIconModule } from '@angular/material/icon'; -import { MatSnackBarModule } from '@angular/material/snack-bar'; + +import { MatLegacySnackBarModule as MatSnackBarModule } from '@angular/material/legacy-snack-bar'; +import { MatTooltipModule } from '@angular/material/tooltip'; import { ContainerService } from '../../../shared/container.service'; import { StarOrganizationService } from '../../../shared/star-organization.service'; import { StarentryService } from '../../../shared/starentry.service'; @@ -41,8 +42,7 @@ describe('OrganizationStarringComponent', () => { beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - imports: [MatIconModule, MatSnackBarModule], - declarations: [OrganizationStarringComponent], + imports: [MatIconModule, MatSnackBarModule, MatTooltipModule, OrganizationStarringComponent], providers: [ { provide: TrackLoginService, useClass: TrackLoginStubService }, { provide: OrganizationStarringService, useClass: OrganizationStarringStubService }, diff --git a/src/app/organizations/organization/organization-starring/organization-starring.component.ts b/src/app/organizations/organization/organization-starring/organization-starring.component.ts index 6632dc27de..7b568c3fbd 100644 --- a/src/app/organizations/organization/organization-starring/organization-starring.component.ts +++ b/src/app/organizations/organization/organization-starring/organization-starring.component.ts @@ -25,11 +25,16 @@ import { Organization, User } from '../../../shared/openapi'; import { TrackLoginService } from '../../../shared/track-login.service'; import { UserQuery } from '../../../shared/user/user.query'; import { OrganizationStarringService } from './organization-starring.service'; +import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; +import { MatIconModule } from '@angular/material/icon'; +import { NgClass, NgIf } from '@angular/common'; @Component({ selector: 'app-organization-starring', templateUrl: '../../../starring/starring.component.html', styleUrls: ['../../../starring/starring.component.scss'], + standalone: true, + imports: [NgClass, NgIf, MatIconModule, MatLegacyTooltipModule], }) export class OrganizationStarringComponent extends Base implements OnInit, OnDestroy, OnChanges { @Input() organization: Organization; diff --git a/src/app/organizations/organization/organization-starring/organization-starring.module.ts b/src/app/organizations/organization/organization-starring/organization-starring.module.ts index 4dc03faa01..c9270ede14 100644 --- a/src/app/organizations/organization/organization-starring/organization-starring.module.ts +++ b/src/app/organizations/organization/organization-starring/organization-starring.module.ts @@ -16,15 +16,14 @@ import { CommonModule } from '@angular/common'; import { NgModule } from '@angular/core'; import { MatIconModule } from '@angular/material/icon'; -import { MatTooltipModule } from '@angular/material/tooltip'; +import { MatLegacyTooltipModule as MatTooltipModule } from '@angular/material/legacy-tooltip'; import { StarOrganizationService } from '../../../shared/star-organization.service'; import { OrganizationStarringComponent } from './organization-starring.component'; import { OrganizationStarringService } from './organization-starring.service'; @NgModule({ - imports: [CommonModule, MatIconModule, MatTooltipModule], - declarations: [OrganizationStarringComponent], + imports: [CommonModule, MatIconModule, MatTooltipModule, OrganizationStarringComponent], exports: [OrganizationStarringComponent], providers: [OrganizationStarringService, StarOrganizationService], }) diff --git a/src/app/organizations/organization/organization.component.html b/src/app/organizations/organization/organization.component.html index 0f6e4dafeb..b67614fb61 100644 --- a/src/app/organizations/organization/organization.component.html +++ b/src/app/organizations/organization/organization.component.html @@ -33,7 +33,7 @@
    -
    Organization not found
    +
    Organization not found
    diff --git a/src/app/organizations/organization/organization.component.ts b/src/app/organizations/organization/organization.component.ts index 6cb2a7d984..8a10082e6b 100644 --- a/src/app/organizations/organization/organization.component.ts +++ b/src/app/organizations/organization/organization.component.ts @@ -14,7 +14,7 @@ * limitations under the License. */ import { Component, OnInit } from '@angular/core'; -import { MatDialog } from '@angular/material/dialog'; +import { MatLegacyDialog as MatDialog } from '@angular/material/legacy-dialog'; import { Observable } from 'rxjs'; import { map } from 'rxjs/operators'; import { TagEditorMode } from '../../shared/enum/tagEditorMode.enum'; @@ -33,11 +33,55 @@ import { OrganizationService } from '../state/organization.service'; // eslint-disable-next-line max-len import { UpdateOrganizationOrCollectionDescriptionComponent } from './update-organization-description/update-organization-description.component'; import { Dockstore } from '../../shared/dockstore.model'; +import { GravatarPipe } from '../../gravatar/gravatar.pipe'; +import { MarkdownWrapperComponent } from '../../shared/markdown-wrapper/markdown-wrapper.component'; +import { EventsComponent } from '../events/events.component'; +import { OrganizationMembersComponent } from '../organization-members/organization-members.component'; +import { CollectionsComponent } from '../collections/collections.component'; +import { MatLegacyTabsModule } from '@angular/material/legacy-tabs'; +import { OrganizationStargazersComponent } from './organization-stargazers/organization-stargazers.component'; +import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { OrganizationStarringComponent } from './organization-starring/organization-starring.component'; +import { ImgFallbackDirective } from '../../shared/img-fallback.directive'; +import { MatIconModule } from '@angular/material/icon'; +import { MatLegacyCardModule } from '@angular/material/legacy-card'; +import { JsonLdComponent } from '../../shared/json-ld/json-ld.component'; +import { LoadingComponent } from '../../shared/loading/loading.component'; +import { NgIf, AsyncPipe } from '@angular/common'; +import { ExtendedModule } from '@ngbracket/ngx-layout/extended'; +import { RouterLink } from '@angular/router'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { HeaderComponent } from '../../header/header.component'; @Component({ selector: 'app-organization', templateUrl: './organization.component.html', styleUrls: ['./organization.component.scss'], + standalone: true, + imports: [ + HeaderComponent, + FlexModule, + RouterLink, + ExtendedModule, + NgIf, + LoadingComponent, + JsonLdComponent, + MatLegacyCardModule, + MatIconModule, + ImgFallbackDirective, + OrganizationStarringComponent, + MatLegacyButtonModule, + MatLegacyTooltipModule, + OrganizationStargazersComponent, + MatLegacyTabsModule, + CollectionsComponent, + OrganizationMembersComponent, + EventsComponent, + MarkdownWrapperComponent, + AsyncPipe, + GravatarPipe, + ], }) export class OrganizationComponent implements OnInit { public organizationStarGazersClicked = false; diff --git a/src/app/organizations/organization/state/update-organization-description.service.spec.ts b/src/app/organizations/organization/state/update-organization-description.service.spec.ts index c9b2006ca2..ec6fbc0b7b 100644 --- a/src/app/organizations/organization/state/update-organization-description.service.spec.ts +++ b/src/app/organizations/organization/state/update-organization-description.service.spec.ts @@ -1,18 +1,24 @@ import { HttpClientTestingModule } from '@angular/common/http/testing'; import { TestBed } from '@angular/core/testing'; import { UntypedFormBuilder } from '@angular/forms'; -import { MatDialogModule } from '@angular/material/dialog'; -import { MatSnackBarModule } from '@angular/material/snack-bar'; +import { MatLegacyDialogModule as MatDialogModule } from '@angular/material/legacy-dialog'; +import { MatLegacySnackBarModule as MatSnackBarModule } from '@angular/material/legacy-snack-bar'; import { RouterTestingModule } from '@angular/router/testing'; import { UpdateOrganizationOrCollectionDescriptionService } from './update-organization-description.service'; import { UpdateOrganizationOrCollectionDescriptionStore } from './update-organization-description.store'; +import { UrlResolverService } from '../../../shared/url-resolver.service'; describe('UpdateOrganizationOrcolelctionDescriptionService', () => { let updateOrganizationOrCollectionDescriptionService: UpdateOrganizationOrCollectionDescriptionService; beforeEach(() => { TestBed.configureTestingModule({ - providers: [UpdateOrganizationOrCollectionDescriptionService, UpdateOrganizationOrCollectionDescriptionStore, UntypedFormBuilder], + providers: [ + UpdateOrganizationOrCollectionDescriptionService, + UpdateOrganizationOrCollectionDescriptionStore, + UntypedFormBuilder, + UrlResolverService, + ], imports: [HttpClientTestingModule, RouterTestingModule, MatDialogModule, MatSnackBarModule], }); diff --git a/src/app/organizations/organization/state/update-organization-description.service.ts b/src/app/organizations/organization/state/update-organization-description.service.ts index 4a78616447..9d68e78a72 100644 --- a/src/app/organizations/organization/state/update-organization-description.service.ts +++ b/src/app/organizations/organization/state/update-organization-description.service.ts @@ -1,6 +1,6 @@ import { Injectable } from '@angular/core'; import { UntypedFormBuilder, UntypedFormGroup } from '@angular/forms'; -import { MatDialog } from '@angular/material/dialog'; +import { MatLegacyDialog as MatDialog } from '@angular/material/legacy-dialog'; import { finalize } from 'rxjs/operators'; import { Organization, OrganizationsService } from '../../../shared/openapi'; import { CollectionsService } from '../../state/collections.service'; diff --git a/src/app/organizations/organization/time-ago-msg.pipe.ts b/src/app/organizations/organization/time-ago-msg.pipe.ts index 2999e08bbf..67871b648c 100644 --- a/src/app/organizations/organization/time-ago-msg.pipe.ts +++ b/src/app/organizations/organization/time-ago-msg.pipe.ts @@ -18,6 +18,7 @@ import { DateService } from '../../shared/date.service'; @Pipe({ name: 'timeAgoMessage', + standalone: true, }) export class TimeAgoMsgPipe implements PipeTransform { constructor(private dateService: DateService) {} diff --git a/src/app/organizations/organization/update-organization-description.module.ts b/src/app/organizations/organization/update-organization-description.module.ts deleted file mode 100644 index a5870c1512..0000000000 --- a/src/app/organizations/organization/update-organization-description.module.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { FlexLayoutModule } from '@angular/flex-layout'; -import { ReactiveFormsModule } from '@angular/forms'; -import { MarkdownModule } from 'ngx-markdown'; -import { RefreshAlertModule } from '../../shared/alert/alert.module'; -import { JsonLdModule } from '../../shared/modules/json-ld.module'; -import { MarkdownWrapperModule } from '../../shared/modules/markdown-wrapper.module'; -import { CustomMaterialModule } from '../../shared/modules/material.module'; -import { OrgSchemaService } from '../../shared/org-schema.service'; -import { StarOrganizationService } from '../../shared/star-organization.service'; -import { OrganizationStarringService } from './organization-starring/organization-starring.service'; -// eslint-disable-next-line max-len -import { UpdateOrganizationOrCollectionDescriptionComponent } from './update-organization-description/update-organization-description.component'; - -@NgModule({ - imports: [ - CommonModule, - FlexLayoutModule, - CustomMaterialModule, - JsonLdModule, - RefreshAlertModule, - ReactiveFormsModule, - MarkdownModule, - MarkdownWrapperModule, - ], - providers: [OrganizationStarringService, StarOrganizationService, OrgSchemaService], - declarations: [UpdateOrganizationOrCollectionDescriptionComponent], - exports: [JsonLdModule], -}) -export class UpdateOrganizationDescriptionModule {} diff --git a/src/app/organizations/organization/update-organization-description/update-organization-description.component.ts b/src/app/organizations/organization/update-organization-description/update-organization-description.component.ts index 12fc7d6106..784ac88cae 100644 --- a/src/app/organizations/organization/update-organization-description/update-organization-description.component.ts +++ b/src/app/organizations/organization/update-organization-description/update-organization-description.component.ts @@ -14,12 +14,34 @@ * limitations under the License. */ import { Component, Inject, OnInit } from '@angular/core'; -import { AbstractControl, UntypedFormGroup } from '@angular/forms'; -import { MAT_DIALOG_DATA } from '@angular/material/dialog'; +import { UntypedFormGroup, FormsModule, ReactiveFormsModule } from '@angular/forms'; +import { MAT_LEGACY_DIALOG_DATA as MAT_DIALOG_DATA, MatLegacyDialogModule } from '@angular/material/legacy-dialog'; import { UpdateOrganizationOrCollectionDescriptionService } from '../state/update-organization-description.service'; +import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { MarkdownWrapperComponent } from '../../../shared/markdown-wrapper/markdown-wrapper.component'; +import { MatLegacyInputModule } from '@angular/material/legacy-input'; +import { MatLegacyFormFieldModule } from '@angular/material/legacy-form-field'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { MatLegacyTabsModule } from '@angular/material/legacy-tabs'; +import { AlertComponent } from '../../../shared/alert/alert.component'; @Component({ templateUrl: './update-organization-description.component.html', + standalone: true, + imports: [ + MatLegacyDialogModule, + AlertComponent, + MatLegacyTabsModule, + FormsModule, + FlexModule, + ReactiveFormsModule, + MatLegacyFormFieldModule, + MatLegacyInputModule, + MarkdownWrapperComponent, + MatLegacyButtonModule, + MatLegacyTooltipModule, + ], }) export class UpdateOrganizationOrCollectionDescriptionComponent implements OnInit { updateOrganizationOrCollectionDescriptionForm: UntypedFormGroup; diff --git a/src/app/organizations/organizations.module.ts b/src/app/organizations/organizations.module.ts deleted file mode 100644 index 69a6b42d2f..0000000000 --- a/src/app/organizations/organizations.module.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { FlexLayoutModule } from '@angular/flex-layout'; -import { ReactiveFormsModule } from '@angular/forms'; - -import { HeaderModule } from '../shared/modules/header.module'; -import { ImgFallbackModule } from '../shared/modules/img-fallback.module'; -import { CustomMaterialModule } from '../shared/modules/material.module'; -import { PipeModule } from '../shared/pipe/pipe.module'; -import { OrganizationModule } from './organization.module'; -import { UpdateOrganizationDescriptionModule } from './organization/update-organization-description.module'; -import { OrganizationsRouting } from './organizations.routing'; -import { OrganizationsComponent } from './organizations/organizations.component'; -import { RegisterOrganizationModule } from './register-organization.module'; - -@NgModule({ - imports: [ - CommonModule, - FlexLayoutModule, - HeaderModule, - CustomMaterialModule, - OrganizationModule, - OrganizationsRouting, - ReactiveFormsModule, - RegisterOrganizationModule, - UpdateOrganizationDescriptionModule, - ImgFallbackModule, - PipeModule, - ], - declarations: [OrganizationsComponent], -}) -export class OrganizationsModule {} diff --git a/src/app/organizations/organizations.routing.ts b/src/app/organizations/organizations.routing.ts index b2b54aaf41..cb738a5f15 100644 --- a/src/app/organizations/organizations.routing.ts +++ b/src/app/organizations/organizations.routing.ts @@ -14,7 +14,8 @@ * limitations under the License. */ -import { RouterModule, Routes } from '@angular/router'; +import { Routes } from '@angular/router'; +import { OrgSchemaService } from '../shared/org-schema.service'; import { CollectionComponent } from './collection/collection.component'; import { OrganizationComponent } from './organization/organization.component'; @@ -22,8 +23,13 @@ import { OrganizationsComponent } from './organizations/organizations.component' const ORGANIZATIONS_ROUTES: Routes = [ { path: '', component: OrganizationsComponent, data: { title: 'Dockstore | Organizations' } }, - { path: ':organizationName', component: OrganizationComponent, data: { title: 'Dockstore | Organization' } }, + { + path: ':organizationName', + component: OrganizationComponent, + data: { title: 'Dockstore | Organization' }, + providers: [OrgSchemaService], + }, { path: ':organizationName/collections/:collectionName', component: CollectionComponent, data: { title: 'Dockstore | Collection' } }, ]; -export const OrganizationsRouting = RouterModule.forChild(ORGANIZATIONS_ROUTES); +export const OrganizationsRouting = ORGANIZATIONS_ROUTES; diff --git a/src/app/organizations/organizations/organizations.component.ts b/src/app/organizations/organizations/organizations.component.ts index 0a6cc9875a..20ac10e7e4 100644 --- a/src/app/organizations/organizations/organizations.component.ts +++ b/src/app/organizations/organizations/organizations.component.ts @@ -14,9 +14,9 @@ * limitations under the License. */ import { Component, OnInit } from '@angular/core'; -import { UntypedFormBuilder, UntypedFormGroup } from '@angular/forms'; -import { MatDialog } from '@angular/material/dialog'; -import { PageEvent } from '@angular/material/paginator'; +import { UntypedFormBuilder, UntypedFormGroup, FormsModule, ReactiveFormsModule } from '@angular/forms'; +import { MatLegacyDialog as MatDialog } from '@angular/material/legacy-dialog'; +import { LegacyPageEvent as PageEvent, MatLegacyPaginatorModule } from '@angular/material/legacy-paginator'; import { Observable } from 'rxjs'; import { debounceTime, distinctUntilChanged, takeUntil } from 'rxjs/operators'; import { AlertQuery } from '../../shared/alert/state/alert.query'; @@ -28,11 +28,49 @@ import { OrganizationsQuery } from '../state/organizations.query'; import { OrganizationsStateService } from '../state/organizations.service'; import { RequireAccountsModalComponent } from '../registerOrganization/requireAccountsModal/require-accounts-modal.component'; import { OrgLogoService } from '../../shared/org-logo.service'; +import { GravatarPipe } from '../../gravatar/gravatar.pipe'; +import { ImgFallbackDirective } from '../../shared/img-fallback.directive'; +import { RouterLink } from '@angular/router'; +import { MatLegacyCardModule } from '@angular/material/legacy-card'; +import { MatIconModule } from '@angular/material/icon'; +import { MatLegacyInputModule } from '@angular/material/legacy-input'; +import { MatLegacyOptionModule } from '@angular/material/legacy-core'; +import { MatLegacySelectModule } from '@angular/material/legacy-select'; +import { MatLegacyFormFieldModule } from '@angular/material/legacy-form-field'; +import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { ExtendedModule } from '@ngbracket/ngx-layout/extended'; +import { NgIf, NgFor, AsyncPipe } from '@angular/common'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { HeaderComponent } from '../../header/header.component'; @Component({ selector: 'app-organizations', templateUrl: './organizations.component.html', styleUrls: ['./organizations.component.scss'], + standalone: true, + imports: [ + HeaderComponent, + FlexModule, + NgIf, + ExtendedModule, + MatLegacyButtonModule, + MatLegacyTooltipModule, + FormsModule, + ReactiveFormsModule, + MatLegacyFormFieldModule, + MatLegacySelectModule, + MatLegacyOptionModule, + MatLegacyInputModule, + MatIconModule, + NgFor, + MatLegacyCardModule, + RouterLink, + ImgFallbackDirective, + MatLegacyPaginatorModule, + AsyncPipe, + GravatarPipe, + ], }) export class OrganizationsComponent extends Base implements OnInit { public orgLength$: Observable; diff --git a/src/app/organizations/register-organization.module.ts b/src/app/organizations/register-organization.module.ts deleted file mode 100644 index 1954a1a802..0000000000 --- a/src/app/organizations/register-organization.module.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { FormsModule, ReactiveFormsModule } from '@angular/forms'; - -import { RefreshAlertModule } from '../shared/alert/alert.module'; -import { AlertService } from '../shared/alert/state/alert.service'; -import { CustomMaterialModule } from '../shared/modules/material.module'; -import { RegisterOrganizationComponent } from './registerOrganization/register-organization.component'; -import { RouterModule } from '@angular/router'; -import { RequireAccountsModalComponent } from './registerOrganization/requireAccountsModal/require-accounts-modal.component'; -import { FlexModule } from '@angular/flex-layout'; - -@NgModule({ - imports: [CommonModule, FormsModule, CustomMaterialModule, ReactiveFormsModule, RefreshAlertModule, RouterModule, FlexModule], - declarations: [RegisterOrganizationComponent, RequireAccountsModalComponent], - providers: [AlertService], -}) -export class RegisterOrganizationModule {} diff --git a/src/app/organizations/registerOrganization/register-organization.component.ts b/src/app/organizations/registerOrganization/register-organization.component.ts index 3db581e07e..5fa4cae289 100644 --- a/src/app/organizations/registerOrganization/register-organization.component.ts +++ b/src/app/organizations/registerOrganization/register-organization.component.ts @@ -14,13 +14,20 @@ * limitations under the License. */ import { Component, Inject, OnDestroy, OnInit } from '@angular/core'; -import { AbstractControl, UntypedFormGroup } from '@angular/forms'; -import { MAT_DIALOG_DATA } from '@angular/material/dialog'; +import { AbstractControl, UntypedFormGroup, FormsModule, ReactiveFormsModule } from '@angular/forms'; +import { MAT_LEGACY_DIALOG_DATA as MAT_DIALOG_DATA, MatLegacyDialogModule } from '@angular/material/legacy-dialog'; import { NgFormsManager } from '@ngneat/forms-manager'; import { Organization } from 'app/shared/openapi'; import { TagEditorMode } from '../../shared/enum/tagEditorMode.enum'; import { FormsState, RegisterOrganizationService } from '../state/register-organization.service'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { MatLegacyInputModule } from '@angular/material/legacy-input'; +import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; +import { MatLegacyFormFieldModule } from '@angular/material/legacy-form-field'; +import { AlertComponent } from '../../shared/alert/alert.component'; +import { NgIf } from '@angular/common'; /** * This is actually create and update organization dialog @@ -34,6 +41,19 @@ import { FormsState, RegisterOrganizationService } from '../state/register-organ selector: 'app-register-organization', templateUrl: './register-organization.component.html', styleUrls: ['./register-organization.component.scss'], + standalone: true, + imports: [ + MatLegacyDialogModule, + NgIf, + AlertComponent, + FormsModule, + ReactiveFormsModule, + MatLegacyFormFieldModule, + MatLegacyTooltipModule, + MatLegacyInputModule, + FlexModule, + MatLegacyButtonModule, + ], }) export class RegisterOrganizationComponent implements OnInit, OnDestroy { registerOrganizationForm: UntypedFormGroup; diff --git a/src/app/organizations/registerOrganization/requireAccountsModal/require-accounts-modal.component.ts b/src/app/organizations/registerOrganization/requireAccountsModal/require-accounts-modal.component.ts index 35603d9ecf..5b19e7fdfb 100644 --- a/src/app/organizations/registerOrganization/requireAccountsModal/require-accounts-modal.component.ts +++ b/src/app/organizations/registerOrganization/requireAccountsModal/require-accounts-modal.component.ts @@ -1,14 +1,20 @@ import { Component, OnInit } from '@angular/core'; import { TokenQuery } from '../../../shared/state/token.query'; -import { MatDialog } from '@angular/material/dialog'; +import { MatLegacyDialog as MatDialog, MatLegacyDialogModule } from '@angular/material/legacy-dialog'; import { RegisterOrganizationComponent } from '../register-organization.component'; import { TagEditorMode } from '../../../shared/enum/tagEditorMode.enum'; import { map } from 'rxjs/operators'; import { Observable } from 'rxjs'; +import { AsyncPipe, I18nPluralPipe } from '@angular/common'; +import { RouterLink } from '@angular/router'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; @Component({ selector: 'app-require-accounts-modal', templateUrl: './require-accounts-modal.component.html', + standalone: true, + imports: [MatLegacyDialogModule, FlexModule, MatLegacyButtonModule, RouterLink, AsyncPipe, I18nPluralPipe], }) export class RequireAccountsModalComponent implements OnInit { public numLinkedAccounts$: Observable; diff --git a/src/app/organizations/state/collections.service.spec.ts b/src/app/organizations/state/collections.service.spec.ts index 64afe1f784..04ac9de423 100644 --- a/src/app/organizations/state/collections.service.spec.ts +++ b/src/app/organizations/state/collections.service.spec.ts @@ -1,8 +1,9 @@ import { HttpClientTestingModule } from '@angular/common/http/testing'; import { TestBed } from '@angular/core/testing'; +import { MatLegacyDialogModule } from '@angular/material/legacy-dialog'; +import { MatLegacySnackBarModule } from '@angular/material/legacy-snack-bar'; import { RouterTestingModule } from '@angular/router/testing'; - -import { CustomMaterialModule } from '../../shared/modules/material.module'; +import { UrlResolverService } from '../../shared/url-resolver.service'; import { CollectionsService } from './collections.service'; import { CollectionsStore } from './collections.store'; @@ -11,8 +12,8 @@ describe('CollectionsService', () => { beforeEach(() => { TestBed.configureTestingModule({ - providers: [CollectionsService, CollectionsStore], - imports: [HttpClientTestingModule, CustomMaterialModule, RouterTestingModule], + providers: [CollectionsService, CollectionsStore, UrlResolverService], + imports: [HttpClientTestingModule, RouterTestingModule, MatLegacySnackBarModule, MatLegacyDialogModule], }); collectionsService = TestBed.inject(CollectionsService); diff --git a/src/app/organizations/state/collections.service.ts b/src/app/organizations/state/collections.service.ts index a5ff7bd590..70d8b3e162 100644 --- a/src/app/organizations/state/collections.service.ts +++ b/src/app/organizations/state/collections.service.ts @@ -15,7 +15,7 @@ */ import { HttpErrorResponse } from '@angular/common/http'; import { Injectable } from '@angular/core'; -import { MatDialog } from '@angular/material/dialog'; +import { MatLegacyDialog as MatDialog } from '@angular/material/legacy-dialog'; import { Router } from '@angular/router'; import { ID, transaction } from '@datorama/akita'; import { finalize } from 'rxjs/operators'; @@ -25,6 +25,7 @@ import { CollectionsQuery } from './collections.query'; import { CollectionsStore } from './collections.store'; import { OrganizationQuery } from './organization.query'; import { OrganizationService } from './organization.service'; +import { UrlResolverService } from '../../shared/url-resolver.service'; @Injectable({ providedIn: 'root' }) export class CollectionsService { @@ -36,7 +37,8 @@ export class CollectionsService { private organizationStore: OrganizationQuery, private collectionsQuery: CollectionsQuery, private matDialog: MatDialog, - private router: Router + private router: Router, + public urlResolverService: UrlResolverService ) {} clearState() { @@ -102,7 +104,7 @@ export class CollectionsService { (error: HttpErrorResponse) => { this.collectionsStore.setError(true); if (error.status === 404) { - this.router.navigate(['page-not-found']); + this.urlResolverService.showPageNotFound(); } } ); diff --git a/src/app/organizations/state/events.service.spec.ts b/src/app/organizations/state/events.service.spec.ts index 39b4dd5559..2ddd6206cf 100644 --- a/src/app/organizations/state/events.service.spec.ts +++ b/src/app/organizations/state/events.service.spec.ts @@ -1,6 +1,6 @@ import { HttpClientTestingModule } from '@angular/common/http/testing'; import { TestBed } from '@angular/core/testing'; -import { MatSnackBarModule } from '@angular/material/snack-bar'; +import { MatLegacySnackBarModule as MatSnackBarModule } from '@angular/material/legacy-snack-bar'; import { EventsService } from './events.service'; import { EventsStore } from './events.store'; diff --git a/src/app/organizations/state/organization-members.service.spec.ts b/src/app/organizations/state/organization-members.service.spec.ts index d9859af014..832a468381 100644 --- a/src/app/organizations/state/organization-members.service.spec.ts +++ b/src/app/organizations/state/organization-members.service.spec.ts @@ -1,6 +1,6 @@ import { HttpClientTestingModule } from '@angular/common/http/testing'; import { TestBed } from '@angular/core/testing'; -import { MatSnackBarModule } from '@angular/material/snack-bar'; +import { MatLegacySnackBarModule as MatSnackBarModule } from '@angular/material/legacy-snack-bar'; import { OrganizationMembersService } from './organization-members.service'; import { OrganizationMembersStore } from './organization-members.store'; diff --git a/src/app/organizations/state/organization-members.service.ts b/src/app/organizations/state/organization-members.service.ts index 5c93a5ac94..0560959d92 100644 --- a/src/app/organizations/state/organization-members.service.ts +++ b/src/app/organizations/state/organization-members.service.ts @@ -1,6 +1,6 @@ import { HttpErrorResponse } from '@angular/common/http'; import { Injectable } from '@angular/core'; -import { MatSnackBar } from '@angular/material/snack-bar'; +import { MatLegacySnackBar as MatSnackBar } from '@angular/material/legacy-snack-bar'; import { ID, transaction } from '@datorama/akita'; import { finalize } from 'rxjs/operators'; import { AlertService } from '../../shared/alert/state/alert.service'; diff --git a/src/app/organizations/state/organization.service.spec.ts b/src/app/organizations/state/organization.service.spec.ts index 48486f5e30..9b2bdfc5b9 100644 --- a/src/app/organizations/state/organization.service.spec.ts +++ b/src/app/organizations/state/organization.service.spec.ts @@ -16,14 +16,17 @@ import { HttpClientTestingModule } from '@angular/common/http/testing'; import { Component } from '@angular/core'; import { TestBed } from '@angular/core/testing'; -import { MatSnackBarModule } from '@angular/material/snack-bar'; +import { MatLegacySnackBarModule as MatSnackBarModule } from '@angular/material/legacy-snack-bar'; import { Routes } from '@angular/router'; import { RouterTestingModule } from '@angular/router/testing'; import { OrganizationService } from './organization.service'; import { OrganizationStore } from './organization.store'; +import { UrlResolverService } from '../../shared/url-resolver.service'; @Component({ template: ` `, + standalone: true, + imports: [HttpClientTestingModule, MatSnackBarModule], }) export class OrganizationsComponent {} @@ -33,9 +36,13 @@ describe('OrganizationService', () => { let organizationService: OrganizationService; beforeEach(() => { TestBed.configureTestingModule({ - declarations: [OrganizationsComponent], - providers: [OrganizationService, OrganizationStore], - imports: [HttpClientTestingModule, MatSnackBarModule, RouterTestingModule.withRoutes(MOCK_ORGANIZATIONS_ROUTES)], + providers: [OrganizationService, OrganizationStore, UrlResolverService], + imports: [ + HttpClientTestingModule, + MatSnackBarModule, + RouterTestingModule.withRoutes(MOCK_ORGANIZATIONS_ROUTES), + OrganizationsComponent, + ], }); organizationService = TestBed.inject(OrganizationService); diff --git a/src/app/organizations/state/organization.service.ts b/src/app/organizations/state/organization.service.ts index c8b4be009a..d863086015 100644 --- a/src/app/organizations/state/organization.service.ts +++ b/src/app/organizations/state/organization.service.ts @@ -19,8 +19,8 @@ import { finalize } from 'rxjs/operators'; import { Organization, OrganizationsService } from '../../shared/openapi'; import { OrganizationMembersService } from './organization-members.service'; import { OrganizationStore } from './organization.store'; -import { Router } from '@angular/router'; import { HttpHeaderResponse } from '@angular/common/http'; +import { UrlResolverService } from '../../shared/url-resolver.service'; @Injectable({ providedIn: 'root' }) export class OrganizationService { @@ -28,7 +28,7 @@ export class OrganizationService { private organizationStore: OrganizationStore, private organizationsService: OrganizationsService, private organizationMembersService: OrganizationMembersService, - private router: Router + public urlResolverService: UrlResolverService ) {} clearState(): void { @@ -84,7 +84,7 @@ export class OrganizationService { (error: HttpHeaderResponse) => { this.organizationStore.setError(true); if (error.status === 404) { - this.router.navigate(['page-not-found']); + this.urlResolverService.showPageNotFound(); } } ); diff --git a/src/app/organizations/state/organizations.query.spec.ts b/src/app/organizations/state/organizations.query.spec.ts index d176145bfe..5bddc1c8bd 100644 --- a/src/app/organizations/state/organizations.query.spec.ts +++ b/src/app/organizations/state/organizations.query.spec.ts @@ -47,6 +47,19 @@ describe('OrganizationsQuery', () => { muttonOrganization, duckOrganization, ]; + const fishOrganization: Organization = { + name: 'fish', + status: Organization.StatusEnum.APPROVED, + topic: 'nothing relevent', + displayName: 'TheDisplayName', + }; + const shrimpOrganization: Organization = { + name: 'shrimp', + status: Organization.StatusEnum.APPROVED, + topic: 'nothing relevent', + displayName: 'ADisplayName', + }; + const displayNameOrganizations: Array = [potatoOrganization, fishOrganization, shrimpOrganization]; expect(query.filterOrganizations(exampleOrganizations, 'potato')).toEqual([potatoOrganization]); expect(query.filterOrganizations(exampleOrganizations, 'po')).toEqual([potatoOrganization, porkOrganization]); expect(query.filterOrganizations(exampleOrganizations, 'POTATO')).toEqual([potatoOrganization]); @@ -61,5 +74,10 @@ describe('OrganizationsQuery', () => { expect(query.filterOrganizations(exampleOrganizations, 'someLocation')).toEqual([potatoOrganization]); expect(query.filterOrganizations(exampleOrganizations, 'someAvatarUrl')).toEqual([]); expect(query.filterOrganizations([], 'CK')).toEqual([]); + expect(query.filterAndSortOrganizations(displayNameOrganizations, '', 'name')).toEqual([ + shrimpOrganization, + potatoOrganization, + fishOrganization, + ]); }); }); diff --git a/src/app/organizations/state/organizations.query.ts b/src/app/organizations/state/organizations.query.ts index 181f0ca009..f09c31b7ea 100644 --- a/src/app/organizations/state/organizations.query.ts +++ b/src/app/organizations/state/organizations.query.ts @@ -75,7 +75,7 @@ export class OrganizationsQuery extends Query { let newOrganizations = this.filterOrganizations(organizations, searchName); const arrayForSort = [...newOrganizations]; if (sortBy === 'name') { - arrayForSort.sort((a, b) => (a.displayName < b.displayName ? -1 : 1)); + arrayForSort.sort((a, b) => (a.displayName.toLowerCase() < b.displayName.toLowerCase() ? -1 : 1)); newOrganizations = arrayForSort; } else if (sortBy === 'starred') { arrayForSort.sort((a, b) => (a.starredUsers.length < b.starredUsers.length ? 1 : -1)); diff --git a/src/app/organizations/state/organizations.service.spec.ts b/src/app/organizations/state/organizations.service.spec.ts index b80f7da741..3181266f3a 100644 --- a/src/app/organizations/state/organizations.service.spec.ts +++ b/src/app/organizations/state/organizations.service.spec.ts @@ -1,6 +1,6 @@ import { HttpClientTestingModule } from '@angular/common/http/testing'; import { TestBed } from '@angular/core/testing'; -import { MatSnackBarModule } from '@angular/material/snack-bar'; +import { MatLegacySnackBarModule as MatSnackBarModule } from '@angular/material/legacy-snack-bar'; import { OrganizationsStateService } from './organizations.service'; import { OrganizationsStore } from './organizations.store'; diff --git a/src/app/organizations/state/register-organization.service.spec.ts b/src/app/organizations/state/register-organization.service.spec.ts index cb2ac684b0..ff79609c35 100644 --- a/src/app/organizations/state/register-organization.service.spec.ts +++ b/src/app/organizations/state/register-organization.service.spec.ts @@ -1,7 +1,7 @@ import { HttpClientTestingModule } from '@angular/common/http/testing'; import { TestBed } from '@angular/core/testing'; -import { MatDialog, MatDialogModule } from '@angular/material/dialog'; -import { MatSnackBarModule } from '@angular/material/snack-bar'; +import { MatLegacyDialog as MatDialog, MatLegacyDialogModule as MatDialogModule } from '@angular/material/legacy-dialog'; +import { MatLegacySnackBarModule as MatSnackBarModule } from '@angular/material/legacy-snack-bar'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { RouterTestingModule } from '@angular/router/testing'; import { of as observableOf, throwError } from 'rxjs'; @@ -9,6 +9,7 @@ import { of as observableOf, throwError } from 'rxjs'; import { UntypedFormBuilder } from '@angular/forms'; import { OrganizationsService } from '../../shared/openapi'; import { RegisterOrganizationService } from './register-organization.service'; +import { UrlResolverService } from '../../shared/url-resolver.service'; let organizationsServiceSpy: jasmine.SpyObj; let matDialogSpy: jasmine.SpyObj; @@ -23,6 +24,7 @@ describe('RegisterOrganizationService', () => { providers: [ RegisterOrganizationService, UntypedFormBuilder, + UrlResolverService, { provide: OrganizationsService, useValue: organizationsServiceStub }, { provide: MatDialog, useValue: matDialogStub }, ], diff --git a/src/app/organizations/state/register-organization.service.ts b/src/app/organizations/state/register-organization.service.ts index 2c32fb2fd5..88cd8780f0 100644 --- a/src/app/organizations/state/register-organization.service.ts +++ b/src/app/organizations/state/register-organization.service.ts @@ -1,7 +1,7 @@ import { HttpErrorResponse } from '@angular/common/http'; import { Injectable } from '@angular/core'; import { UntypedFormBuilder, UntypedFormGroup, Validators } from '@angular/forms'; -import { MatDialog } from '@angular/material/dialog'; +import { MatLegacyDialog as MatDialog } from '@angular/material/legacy-dialog'; import { Router } from '@angular/router'; import { NgFormsManager } from '@ngneat/forms-manager'; diff --git a/src/app/organizations/state/upsert-organization-member.service.spec.ts b/src/app/organizations/state/upsert-organization-member.service.spec.ts index 3ada787312..762e13c3d6 100644 --- a/src/app/organizations/state/upsert-organization-member.service.spec.ts +++ b/src/app/organizations/state/upsert-organization-member.service.spec.ts @@ -1,8 +1,8 @@ import { HttpClientTestingModule } from '@angular/common/http/testing'; import { TestBed } from '@angular/core/testing'; import { UntypedFormBuilder } from '@angular/forms'; -import { MatDialogModule } from '@angular/material/dialog'; -import { MatSnackBarModule } from '@angular/material/snack-bar'; +import { MatLegacyDialogModule as MatDialogModule } from '@angular/material/legacy-dialog'; +import { MatLegacySnackBarModule as MatSnackBarModule } from '@angular/material/legacy-snack-bar'; import { UpsertOrganizationMemberService } from './upsert-organization-member.service'; import { UpsertOrganizationMemberStore } from './upsert-organization-member.store'; diff --git a/src/app/organizations/state/upsert-organization-member.service.ts b/src/app/organizations/state/upsert-organization-member.service.ts index 47fc9ee241..dde5750f0a 100644 --- a/src/app/organizations/state/upsert-organization-member.service.ts +++ b/src/app/organizations/state/upsert-organization-member.service.ts @@ -1,7 +1,7 @@ import { HttpErrorResponse } from '@angular/common/http'; import { Injectable } from '@angular/core'; import { UntypedFormBuilder, UntypedFormControl, UntypedFormGroup, Validators } from '@angular/forms'; -import { MatDialog } from '@angular/material/dialog'; +import { MatLegacyDialog as MatDialog } from '@angular/material/legacy-dialog'; import { NgFormsManager } from '@ngneat/forms-manager'; import { finalize } from 'rxjs/operators'; import { AlertService } from '../../shared/alert/state/alert.service'; diff --git a/src/app/organizations/upsert-organization-member.module.ts b/src/app/organizations/upsert-organization-member.module.ts deleted file mode 100644 index 6de2592f01..0000000000 --- a/src/app/organizations/upsert-organization-member.module.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { FlexLayoutModule } from '@angular/flex-layout'; -import { ReactiveFormsModule } from '@angular/forms'; - -import { RefreshAlertModule } from '../shared/alert/alert.module'; -import { CustomMaterialModule } from '../shared/modules/material.module'; -import { UpsertOrganizationMemberComponent } from './upsert-organization-member/upsert-organization-member.component'; - -@NgModule({ - imports: [CommonModule, FlexLayoutModule, CustomMaterialModule, ReactiveFormsModule, RefreshAlertModule], - declarations: [UpsertOrganizationMemberComponent], -}) -export class UpsertOrganizationMemberModule {} diff --git a/src/app/organizations/upsert-organization-member/upsert-organization-member.component.ts b/src/app/organizations/upsert-organization-member/upsert-organization-member.component.ts index 619af48383..eb781be149 100644 --- a/src/app/organizations/upsert-organization-member/upsert-organization-member.component.ts +++ b/src/app/organizations/upsert-organization-member/upsert-organization-member.component.ts @@ -1,10 +1,19 @@ import { Component, Inject, OnDestroy, OnInit } from '@angular/core'; -import { AbstractControl, UntypedFormGroup } from '@angular/forms'; -import { MAT_DIALOG_DATA } from '@angular/material/dialog'; +import { AbstractControl, UntypedFormGroup, FormsModule, ReactiveFormsModule } from '@angular/forms'; +import { MAT_LEGACY_DIALOG_DATA as MAT_DIALOG_DATA, MatLegacyDialogModule } from '@angular/material/legacy-dialog'; import { NgFormsManager } from '@ngneat/forms-manager'; import { TagEditorMode } from '../../shared/enum/tagEditorMode.enum'; import { OrganizationUser } from '../../shared/openapi'; import { FormsState, UpsertOrganizationMemberService } from '../state/upsert-organization-member.service'; +import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { MatLegacyOptionModule } from '@angular/material/legacy-core'; +import { MatLegacySelectModule } from '@angular/material/legacy-select'; +import { NgIf, NgFor, TitleCasePipe } from '@angular/common'; +import { MatLegacyInputModule } from '@angular/material/legacy-input'; +import { MatLegacyFormFieldModule } from '@angular/material/legacy-form-field'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { AlertComponent } from '../../shared/alert/alert.component'; export interface UpsertOrganizationMemberComponentData { mode: TagEditorMode; @@ -18,6 +27,23 @@ export interface UpsertOrganizationMemberComponentData { @Component({ selector: 'app-upsert-organization-member', templateUrl: './upsert-organization-member.component.html', + standalone: true, + imports: [ + MatLegacyDialogModule, + AlertComponent, + FormsModule, + ReactiveFormsModule, + FlexModule, + MatLegacyFormFieldModule, + MatLegacyInputModule, + NgIf, + MatLegacySelectModule, + NgFor, + MatLegacyOptionModule, + MatLegacyButtonModule, + MatLegacyTooltipModule, + TitleCasePipe, + ], }) export class UpsertOrganizationMemberComponent implements OnInit, OnDestroy { roleKeys: any; diff --git a/src/app/pagenotfound/pagenotfound.component.ts b/src/app/pagenotfound/pagenotfound.component.ts index 0b5a05e039..198b685ad0 100644 --- a/src/app/pagenotfound/pagenotfound.component.ts +++ b/src/app/pagenotfound/pagenotfound.component.ts @@ -1,9 +1,13 @@ import { Component } from '@angular/core'; import { Dockstore } from '../shared/dockstore.model'; +import { ExtendedModule } from '@ngbracket/ngx-layout/extended'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; @Component({ selector: 'app-pagenotfound', templateUrl: './pagenotfound.component.html', + standalone: true, + imports: [FlexModule, ExtendedModule], }) export class PageNotFoundComponent { Dockstore = Dockstore; diff --git a/src/app/preview-warning/preview-warning.component.ts b/src/app/preview-warning/preview-warning.component.ts index a44f654c46..3a2cacf60b 100644 --- a/src/app/preview-warning/preview-warning.component.ts +++ b/src/app/preview-warning/preview-warning.component.ts @@ -1,8 +1,12 @@ import { Component, Input } from '@angular/core'; +import { MatIconModule } from '@angular/material/icon'; +import { MatLegacyCardModule } from '@angular/material/legacy-card'; @Component({ selector: 'app-preview-warning', templateUrl: './preview-warning.component.html', + standalone: true, + imports: [MatLegacyCardModule, MatIconModule], }) export class PreviewWarningComponent { @Input() featureName: string; diff --git a/src/app/register/register.service.spec.ts b/src/app/register/register.service.spec.ts index 6b1a6b269e..f310f09609 100644 --- a/src/app/register/register.service.spec.ts +++ b/src/app/register/register.service.spec.ts @@ -15,8 +15,8 @@ */ import { inject, TestBed } from '@angular/core/testing'; -import { MatSnackBarModule } from '@angular/material/snack-bar'; -import { AuthService } from 'ng2-ui-auth'; +import { MatLegacySnackBarModule as MatSnackBarModule } from '@angular/material/legacy-snack-bar'; +import { AuthService } from '../ng2-ui-auth/public_api'; import { AuthStubService } from '../test/service-stubs'; import { RegisterService } from './register.service'; diff --git a/src/app/register/register.service.ts b/src/app/register/register.service.ts index 260e05ba20..5348f9eec8 100644 --- a/src/app/register/register.service.ts +++ b/src/app/register/register.service.ts @@ -16,8 +16,8 @@ import { HttpErrorResponse } from '@angular/common/http'; import { Injectable } from '@angular/core'; -import { AuthService } from 'ng2-ui-auth'; import { Observable } from 'rxjs'; +import { AuthService } from '../ng2-ui-auth/public_api'; import { AlertService } from '../shared/alert/state/alert.service'; @Injectable() diff --git a/src/app/search/advancedsearch/advancedsearch.component.ts b/src/app/search/advancedsearch/advancedsearch.component.ts index cfc3b5fb4f..7c87b20d04 100644 --- a/src/app/search/advancedsearch/advancedsearch.component.ts +++ b/src/app/search/advancedsearch/advancedsearch.component.ts @@ -15,17 +15,35 @@ */ import { Component, OnInit } from '@angular/core'; -import { MatDialog } from '@angular/material/dialog'; +import { MatLegacyDialog as MatDialog, MatLegacyDialogModule } from '@angular/material/legacy-dialog'; import { takeUntil } from 'rxjs/operators'; import { Base } from '../../shared/base'; +import { SearchAuthorsHtmlPipe } from '../search-authors-html.pipe'; import { SearchService } from '../state/search.service'; import { AdvancedSearchObject } from './../../shared/models/AdvancedSearchObject'; import { AdvancedSearchQuery } from './state/advanced-search.query'; +import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; +import { FormsModule } from '@angular/forms'; +import { MatLegacyOptionModule } from '@angular/material/legacy-core'; +import { MatLegacySelectModule } from '@angular/material/legacy-select'; +import { MatLegacyFormFieldModule } from '@angular/material/legacy-form-field'; +import { NgIf } from '@angular/common'; @Component({ selector: 'app-advancedsearch', templateUrl: './advancedsearch.component.html', styleUrls: ['./advancedsearch.component.scss'], + standalone: true, + imports: [ + MatLegacyDialogModule, + NgIf, + MatLegacyFormFieldModule, + MatLegacySelectModule, + MatLegacyOptionModule, + FormsModule, + MatLegacyTooltipModule, + SearchAuthorsHtmlPipe, + ], }) export class AdvancedSearchComponent extends Base implements OnInit { NOTFilter: string; diff --git a/src/app/search/basic-search/basic-search.component.spec.ts b/src/app/search/basic-search/basic-search.component.spec.ts index 484cff94a6..84e77437f1 100644 --- a/src/app/search/basic-search/basic-search.component.spec.ts +++ b/src/app/search/basic-search/basic-search.component.spec.ts @@ -1,10 +1,10 @@ /* eslint-disable no-unused-vars, @typescript-eslint/no-unused-vars */ import { NO_ERRORS_SCHEMA } from '@angular/core'; import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { MatAutocompleteModule } from '@angular/material/autocomplete'; +import { MatLegacyAutocompleteModule as MatAutocompleteModule } from '@angular/material/legacy-autocomplete'; +import { MatLegacyDialogModule } from '@angular/material/legacy-dialog'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { RouterTestingModule } from '@angular/router/testing'; -import { CustomMaterialModule } from '../../shared/modules/material.module'; import { ProviderService } from '../../shared/provider.service'; import { SearchStubService } from '../../test/service-stubs'; import { SearchService } from '../state/search.service'; @@ -18,8 +18,7 @@ describe('BasicSearchComponent', () => { waitForAsync(() => { TestBed.configureTestingModule({ schemas: [NO_ERRORS_SCHEMA], - imports: [MatAutocompleteModule, RouterTestingModule, BrowserAnimationsModule, CustomMaterialModule], - declarations: [BasicSearchComponent], + imports: [MatAutocompleteModule, MatLegacyDialogModule, RouterTestingModule, BrowserAnimationsModule, BasicSearchComponent], providers: [ProviderService, { provide: SearchService, useClass: SearchStubService }], }).compileComponents(); }) diff --git a/src/app/search/basic-search/basic-search.component.ts b/src/app/search/basic-search/basic-search.component.ts index 7851c03cb3..0db3bae4a5 100644 --- a/src/app/search/basic-search/basic-search.component.ts +++ b/src/app/search/basic-search/basic-search.component.ts @@ -1,21 +1,45 @@ import { Component, EventEmitter, OnInit, Output } from '@angular/core'; -import { UntypedFormControl } from '@angular/forms'; -import { MatDialog } from '@angular/material/dialog'; +import { UntypedFormControl, FormsModule, ReactiveFormsModule } from '@angular/forms'; +import { MatLegacyDialog as MatDialog } from '@angular/material/legacy-dialog'; import { Observable } from 'rxjs'; import { debounceTime, distinctUntilChanged, shareReplay, takeUntil } from 'rxjs/operators'; import { Base } from '../../shared/base'; import { bootstrap4largeModalSize, formInputDebounceTime } from '../../shared/constants'; import { AdvancedSearchComponent } from '../advancedsearch/advancedsearch.component'; import { SearchQuery } from '../state/search.query'; -import { SearchService } from '../state/search.service'; +import { MatLegacyOptionModule } from '@angular/material/legacy-core'; +import { MatIconModule } from '@angular/material/icon'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { NgIf, NgFor, AsyncPipe } from '@angular/common'; +import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; +import { MatLegacyAutocompleteModule } from '@angular/material/legacy-autocomplete'; +import { MatLegacyInputModule } from '@angular/material/legacy-input'; +import { MatLegacyFormFieldModule } from '@angular/material/legacy-form-field'; +import { MatExpansionModule } from '@angular/material/expansion'; @Component({ selector: 'app-basic-search', templateUrl: './basic-search.component.html', styleUrls: ['./basic-search.component.scss'], + standalone: true, + imports: [ + MatExpansionModule, + MatLegacyFormFieldModule, + MatLegacyInputModule, + MatLegacyAutocompleteModule, + FormsModule, + MatLegacyTooltipModule, + ReactiveFormsModule, + NgIf, + MatLegacyButtonModule, + MatIconModule, + NgFor, + MatLegacyOptionModule, + AsyncPipe, + ], }) export class BasicSearchComponent extends Base implements OnInit { - constructor(private searchService: SearchService, private searchQuery: SearchQuery, private matDialog: MatDialog) { + constructor(private searchQuery: SearchQuery, private matDialog: MatDialog) { super(); } public searchFormControl = new UntypedFormControl(); diff --git a/src/app/search/facet-search/facet-search-update.pipe.ts b/src/app/search/facet-search/facet-search-update.pipe.ts index f0c641b7bf..0dd8670986 100644 --- a/src/app/search/facet-search/facet-search-update.pipe.ts +++ b/src/app/search/facet-search/facet-search-update.pipe.ts @@ -2,6 +2,7 @@ import { Pipe, PipeTransform } from '@angular/core'; @Pipe({ name: 'getFacetSearchUpdate', + standalone: true, }) /** * This pipe updates the number of hidden items in the facet when a search is completed diff --git a/src/app/search/facet-search/facet-search.pipe.ts b/src/app/search/facet-search/facet-search.pipe.ts index 668fdc285f..bf71779f67 100644 --- a/src/app/search/facet-search/facet-search.pipe.ts +++ b/src/app/search/facet-search/facet-search.pipe.ts @@ -2,6 +2,7 @@ import { Pipe, PipeTransform } from '@angular/core'; @Pipe({ name: 'getFacetSearchResults', + standalone: true, }) /** * This pipe filters results in the facet according to the facet search text diff --git a/src/app/search/get-histogram-style.pipe.ts b/src/app/search/get-histogram-style.pipe.ts index 5d72713beb..d17524b008 100644 --- a/src/app/search/get-histogram-style.pipe.ts +++ b/src/app/search/get-histogram-style.pipe.ts @@ -2,6 +2,7 @@ import { Pipe, PipeTransform } from '@angular/core'; @Pipe({ name: 'getHistogramStyle', + standalone: true, }) export class GetHistogramStylePipe implements PipeTransform { /** diff --git a/src/app/search/helpers.spec.ts b/src/app/search/helpers.spec.ts new file mode 100644 index 0000000000..b584d52a96 --- /dev/null +++ b/src/app/search/helpers.spec.ts @@ -0,0 +1,45 @@ +/* + * Copyright 2024 OICR, UCSC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { parseTerms } from './helpers'; + +describe('helpers', () => { + it('should parse the search terms correctly', () => { + expect(parseTerms('')).toEqual([]); + expect(parseTerms('a')).toEqual(['a']); + expect(parseTerms('a b')).toEqual(['a', 'b']); + expect(parseTerms('a b c')).toEqual(['a', 'b', 'c']); + expect(parseTerms('abc')).toEqual(['abc']); + + expect(parseTerms('""')).toEqual([]); + expect(parseTerms('"a"')).toEqual(['a']); + expect(parseTerms('"a b"')).toEqual(['a b']); + expect(parseTerms('"a b c"')).toEqual(['a b c']); + expect(parseTerms('"abc"')).toEqual(['abc']); + + expect(parseTerms('a b "c d"')).toEqual(['a', 'b', 'c d']); + expect(parseTerms('a "b c" d')).toEqual(['a', 'b c', 'd']); + expect(parseTerms('"a b" c d')).toEqual(['a b', 'c', 'd']); + + expect(parseTerms(' ')).toEqual([]); + expect(parseTerms('a ')).toEqual(['a']); + expect(parseTerms(' a')).toEqual(['a']); + expect(parseTerms(' a ')).toEqual(['a']); + + // should not crash + parseTerms('"a'); + parseTerms('"a b c'); + }); +}); diff --git a/src/app/shared/modules/orderby.module.ts b/src/app/search/helpers.ts similarity index 72% rename from src/app/shared/modules/orderby.module.ts rename to src/app/search/helpers.ts index 21f29d602f..ab4ab9abc0 100644 --- a/src/app/shared/modules/orderby.module.ts +++ b/src/app/search/helpers.ts @@ -1,5 +1,5 @@ /* - * Copyright 2017 OICR + * Copyright 2024 OICR, UCSC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -13,14 +13,8 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +import * as split from 'split-string'; -import { NgModule } from '@angular/core'; - -/* Bootstrap */ -import { OrderBy } from '../../shared/orderBy'; - -@NgModule({ - declarations: [OrderBy], - exports: [OrderBy], -}) -export class OrderByModule {} +export function parseTerms(searchText: string): string[] { + return split(searchText, { sep: ' ' }).filter((term) => term.length > 0); +} diff --git a/src/app/search/is-app-tool.pipe.ts b/src/app/search/is-app-tool.pipe.ts index f55d3060d5..280272a68b 100644 --- a/src/app/search/is-app-tool.pipe.ts +++ b/src/app/search/is-app-tool.pipe.ts @@ -3,6 +3,7 @@ import { AppTool, DockstoreTool } from '../shared/openapi'; @Pipe({ name: 'isAppTool', + standalone: true, }) export class IsAppToolPipe implements PipeTransform { transform(tool: DockstoreTool | AppTool): tool is AppTool { diff --git a/src/app/search/join-with-ellipses.pipe.ts b/src/app/search/join-with-ellipses.pipe.ts index 5d24cd66e5..7a05d9b8ef 100644 --- a/src/app/search/join-with-ellipses.pipe.ts +++ b/src/app/search/join-with-ellipses.pipe.ts @@ -2,6 +2,7 @@ import { Pipe, PipeTransform } from '@angular/core'; @Pipe({ name: 'joinWithEllipses', + standalone: true, }) export class JoinWithEllipsesPipe implements PipeTransform { transform(fragments: any): string { diff --git a/src/app/search/map-friendly-values.pipe.ts b/src/app/search/map-friendly-values.pipe.ts index 41930669fd..04bfa13032 100644 --- a/src/app/search/map-friendly-values.pipe.ts +++ b/src/app/search/map-friendly-values.pipe.ts @@ -21,6 +21,7 @@ import PartnerEnum = CloudInstance.PartnerEnum; @Pipe({ name: 'mapFriendlyValue', + standalone: true, }) export class MapFriendlyValuesPipe implements PipeTransform { constructor(private descriptorLanguageService: DescriptorLanguageService, private platformPartnerPipe: PlatformPartnerPipe) {} @@ -118,6 +119,9 @@ export class MapFriendlyValuesPipe implements PipeTransform { ['PUSH', 'Push'], ['DELETE', 'Delete'], ['INSTALL', 'Install'], + ['UNINSTALL', 'Uninstall'], + ['PUBLISH', 'Publish'], + ['RELEASE', 'Release'], ]), ], [ diff --git a/src/app/search/query-builder.service.ts b/src/app/search/query-builder.service.ts index e08d65bd83..4bb323a7ac 100644 --- a/src/app/search/query-builder.service.ts +++ b/src/app/search/query-builder.service.ts @@ -21,6 +21,7 @@ import { CategorySort } from '../shared/models/CategorySort'; import { tagCloudCommonTerms } from './../shared/constants'; import { AdvancedSearchObject } from './../shared/models/AdvancedSearchObject'; import { SearchService } from './state/search.service'; +import { parseTerms } from './helpers'; type Index = 'workflows' | 'tools' | 'notebooks'; @@ -78,6 +79,7 @@ export class QueryBuilderService { private sourceOptions(body: Bodybuilder) { return body.rawOption('_source', [ 'all_authors', + 'approvedAITopic', 'descriptorType', 'descriptorTypeSubclass', 'full_workflow_path', @@ -92,6 +94,7 @@ export class QueryBuilderService { 'toolname', 'tool_path', 'topicAutomatic', + 'topicSelection', 'verified', 'workflowName', ]); @@ -170,26 +173,27 @@ export class QueryBuilderService { * @memberof SearchComponent */ appendFilter(body: any, aggKey: string | null, filters: Map>, exclusiveFilters: Array): Bodybuilder { - filters.forEach((value: Set, key: string) => { - value.forEach((insideFilter) => { - const isExclusiveFilter = exclusiveFilters.includes(key); - if (aggKey === key && !isExclusiveFilter) { - // Return some garbage filter because we've decided to append a filter, there's no turning back - // return body; // <--- this does not work - body = body.notFilter('term', 'some garbage term that hopefully never gets matched', insideFilter); - } else { - // value refers to the buckets selected - if (value.size > 1) { - body = body.orFilter('term', key, insideFilter); - } else { - if (isExclusiveFilter) { - body = body.filter('term', key, this.convertIntStringToBoolString(insideFilter)); - } else { - body = body.filter('term', key, insideFilter); - } + filters.forEach((values: Set, key: string) => { + const isExclusiveFilter = exclusiveFilters.includes(key); + if (aggKey === key && !isExclusiveFilter) { + // Return some garbage filter because we've decided to append a filter, there's no turning back + values.forEach((value) => { + body = body.notFilter('term', 'some garbage term that hopefully never gets matched', value); + }); + } else if (values.size == 1) { + // Add a filter that matches a single value + const [value] = values; + const convertedValue = isExclusiveFilter ? this.convertIntStringToBoolString(value) : value; + body = body.filter('term', key, convertedValue); + } else { + // Add a filter that matches at least one of multiple values + body = body.filter('bool', (b) => { + for (const value of values) { + b = b.orFilter('term', key, value); } - } - }); + return b; + }); + } }); return body; } @@ -271,19 +275,20 @@ export class QueryBuilderService { */ private searchEverything(body: bodybuilder.Bodybuilder, searchString: string): bodybuilder.Bodybuilder { // Extract each search term from the search string, limiting to a maximum of 20 terms to prevent a DOS attack - const terms = searchString.trim().split(' ').slice(0, 20); + const terms = parseTerms(searchString).slice(0, 20); terms.forEach((term) => { + const matchOp = term.includes(' ') ? 'match_phrase' : 'match'; body .orQuery('wildcard', 'full_workflow_path', { value: '*' + term + '*', case_insensitive: true, boost: 14 }) .orQuery('wildcard', 'tool_path', { value: '*' + term + '*', case_insensitive: true, boost: 14 }) - .orQuery('match', 'workflowVersions.sourceFiles.content', { query: term, boost: 0.2 }) - .orQuery('match', 'tags.sourceFiles.content', { query: term, boost: 0.2 }) - .orQuery('match', 'description', { query: term, boost: 2 }) - .orQuery('match', 'labels', { query: term, boost: 2 }) - .orQuery('match', 'all_authors.name', { query: term, boost: 3 }) - .orQuery('match', 'topicAutomatic', { query: term, boost: 4 }) - .orQuery('match', 'categories.topic', { query: term, boost: 2 }) - .orQuery('match', 'categories.displayName', { query: term, boost: 3 }); + .orQuery(matchOp, 'workflowVersions.sourceFiles.content', { query: term, boost: 0.2 }) + .orQuery(matchOp, 'tags.sourceFiles.content', { query: term, boost: 0.2 }) + .orQuery(matchOp, 'description', { query: term, boost: 2 }) + .orQuery(matchOp, 'labels', { query: term, boost: 2 }) + .orQuery(matchOp, 'all_authors.name', { query: term, boost: 3 }) + .orQuery(matchOp, 'topicAutomatic', { query: term, boost: 4 }) + .orQuery(matchOp, 'categories.topic', { query: term, boost: 2 }) + .orQuery(matchOp, 'categories.displayName', { query: term, boost: 3 }); }); body.queryMinimumShouldMatch(1); return body; diff --git a/src/app/search/search-authors-html.pipe.ts b/src/app/search/search-authors-html.pipe.ts index 307b96ed11..e1d473b06e 100644 --- a/src/app/search/search-authors-html.pipe.ts +++ b/src/app/search/search-authors-html.pipe.ts @@ -3,6 +3,7 @@ import { Author, OrcidAuthorInformation } from 'app/shared/openapi'; @Pipe({ name: 'getSearchAuthorsHtml', + standalone: true, }) /** * This pipe filters results in the facet according to the facet search text diff --git a/src/app/search/search-entry-table.ts b/src/app/search/search-entry-table.ts index 1b3a501047..2749e0e76e 100644 --- a/src/app/search/search-entry-table.ts +++ b/src/app/search/search-entry-table.ts @@ -14,9 +14,9 @@ * limitations under the License. */ import { Directive, OnInit, ViewChild } from '@angular/core'; -import { MatPaginator, PageEvent } from '@angular/material/paginator'; +import { MatLegacyPaginator as MatPaginator, LegacyPageEvent as PageEvent } from '@angular/material/legacy-paginator'; import { MatSort } from '@angular/material/sort'; -import { MatTableDataSource } from '@angular/material/table'; +import { MatLegacyTableDataSource as MatTableDataSource } from '@angular/material/legacy-table'; import { combineLatest, Observable, Subject } from 'rxjs'; import { takeUntil } from 'rxjs/operators'; import { Base } from '../shared/base'; @@ -32,7 +32,7 @@ export abstract class SearchEntryTable extends Base implements OnInit { protected verifiedLink: string; protected ngUnsubscribe: Subject<{}> = new Subject(); - public readonly displayedColumns = ['name', 'verified', 'all_authors', 'descriptorType', 'projectLinks', 'starredUsers']; + public readonly displayedColumns = ['name', 'all_authors', 'descriptorType', 'starredUsers']; public readonly columnsToDisplayWithExpand = [...this.displayedColumns, 'expand']; public readonly searchEverythingFriendlyNames = new Map([ ['full_workflow_path', 'Path'], diff --git a/src/app/search/search-notebook-table/search-notebook-table.component.html b/src/app/search/search-notebook-table/search-notebook-table.component.html index c0197c2f5a..c9bf63827c 100644 --- a/src/app/search/search-notebook-table/search-notebook-table.component.html +++ b/src/app/search/search-notebook-table/search-notebook-table.component.html @@ -4,31 +4,33 @@
    - Name + Name and Description
    + notebook icon {{ notebook?.source.organization + '/' + notebook?.source.repository + (notebook?.source.workflowName ? '/' + notebook?.source.workflowName : '') }} -
    - {{ notebook.source.topicAutomatic }} +
    + {{ notebook?.source.topicAutomatic }} +
    Author - + +
    + +
    +
    Format @@ -48,19 +50,11 @@
    - - Links - - - - - - Stars - {{ !notebook?.source.starredUsers || notebook?.source.starredUsers.length === 0 ? '' : notebook?.source.starredUsers?.length }} - star_rate + star_rate + {{ !notebook?.source.starredUsers || notebook?.source.starredUsers.length === 0 ? '' : notebook?.source.starredUsers.length }} diff --git a/src/app/search/search-notebook-table/search-notebook-table.component.scss b/src/app/search/search-notebook-table/search-notebook-table.component.scss index db11452167..fabe799883 100644 --- a/src/app/search/search-notebook-table/search-notebook-table.component.scss +++ b/src/app/search/search-notebook-table/search-notebook-table.component.scss @@ -1,9 +1,9 @@ .mat-column-descriptorType { - max-width: 90px; + max-width: 10rem; } -.mat-column-projectLinks { - max-width: 80px; +.mat-column-descriptorTypeSubclass { + max-width: 10rem; } td.mat-cell { diff --git a/src/app/search/search-notebook-table/search-notebook-table.component.spec.ts b/src/app/search/search-notebook-table/search-notebook-table.component.spec.ts index 8e3dbf3de7..30caf1b702 100644 --- a/src/app/search/search-notebook-table/search-notebook-table.component.spec.ts +++ b/src/app/search/search-notebook-table/search-notebook-table.component.spec.ts @@ -6,8 +6,7 @@ import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { RouterTestingModule } from '@angular/router/testing'; import { DateService } from '../../shared/date.service'; import { DockstoreService } from '../../shared/dockstore.service'; -import { CustomMaterialModule } from '../../shared/modules/material.module'; -import { DockstoreStubService, SearchStubService } from '../../test/service-stubs'; +import { DateStubService, DockstoreStubService, SearchStubService } from '../../test/service-stubs'; import { SearchService } from '../state/search.service'; import { SearchNotebookTableComponent } from './search-notebook-table.component'; @@ -18,12 +17,11 @@ describe('SearchNotebookTableComponent', () => { beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [SearchNotebookTableComponent], schemas: [NO_ERRORS_SCHEMA], - imports: [CustomMaterialModule, BrowserAnimationsModule, RouterTestingModule], + imports: [BrowserAnimationsModule, RouterTestingModule, SearchNotebookTableComponent], providers: [ { provide: DockstoreService, useClass: DockstoreStubService }, - DateService, + { provide: DateService, useClass: DateStubService }, { provide: SearchService, useClass: SearchStubService }, ], }).compileComponents(); diff --git a/src/app/search/search-notebook-table/search-notebook-table.component.ts b/src/app/search/search-notebook-table/search-notebook-table.component.ts index b6bbd8d48d..a0c8eaf118 100644 --- a/src/app/search/search-notebook-table/search-notebook-table.component.ts +++ b/src/app/search/search-notebook-table/search-notebook-table.component.ts @@ -14,13 +14,27 @@ * limitations under the License. */ import { Component, OnInit } from '@angular/core'; -import { MatTableDataSource } from '@angular/material/table'; +import { MatLegacyTableDataSource as MatTableDataSource, MatLegacyTableModule } from '@angular/material/legacy-table'; import { Observable } from 'rxjs'; import { DateService } from '../../shared/date.service'; -import { Notebook } from '../../shared/openapi'; +import { Notebook, Workflow } from '../../shared/openapi'; import { SearchEntryTable } from '../search-entry-table'; import { SearchQuery, SearchResult } from '../state/search.query'; import { SearchService } from '../state/search.service'; +import { JoinWithEllipsesPipe } from 'app/search/join-with-ellipses.pipe'; +import { SearchAuthorsHtmlPipe } from 'app/search/search-authors-html.pipe'; +import { DescriptorLanguagePipe } from '../../shared/entry/descriptor-language.pipe'; +import { MatLegacyPaginatorModule } from '@angular/material/legacy-paginator'; +import { MatIconModule } from '@angular/material/icon'; +import { FontAwesomeModule } from '@fortawesome/angular-fontawesome'; +import { ExtendedModule } from '@ngbracket/ngx-layout/extended'; +import { AiBubbleComponent } from '../../shared/ai-bubble/ai-bubble.component'; +import { RouterLink } from '@angular/router'; +import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; +import { MatSortModule } from '@angular/material/sort'; +import { MatLegacyProgressBarModule } from '@angular/material/legacy-progress-bar'; +import { NgIf, NgFor, KeyValuePipe } from '@angular/common'; +import TopicSelectionEnum = Workflow.TopicSelectionEnum; /** * this component refers to search page not notebook listing search @@ -30,9 +44,28 @@ import { SearchService } from '../state/search.service'; selector: 'app-search-notebook-table', templateUrl: './search-notebook-table.component.html', styleUrls: ['../../shared/styles/entry-table.scss', './search-notebook-table.component.scss'], + standalone: true, + imports: [ + NgIf, + MatLegacyProgressBarModule, + MatLegacyTableModule, + MatSortModule, + MatLegacyTooltipModule, + RouterLink, + AiBubbleComponent, + ExtendedModule, + FontAwesomeModule, + MatIconModule, + NgFor, + MatLegacyPaginatorModule, + KeyValuePipe, + DescriptorLanguagePipe, + SearchAuthorsHtmlPipe, + JoinWithEllipsesPipe, + ], }) export class SearchNotebookTableComponent extends SearchEntryTable implements OnInit { - public readonly displayedColumns = ['name', 'all_authors', 'descriptorType', 'descriptorTypeSubclass', 'projectLinks', 'starredUsers']; + public readonly displayedColumns = ['name', 'all_authors', 'descriptorType', 'descriptorTypeSubclass', 'starredUsers']; readonly entryType = 'notebook'; public dataSource: MatTableDataSource>; constructor(dateService: DateService, searchQuery: SearchQuery, searchService: SearchService) { @@ -42,4 +75,6 @@ export class SearchNotebookTableComponent extends SearchEntryTable implements On privateNgOnInit(): Observable>> { return this.searchQuery.notebooks$; } + + protected readonly TopicSelectionEnum = TopicSelectionEnum; } diff --git a/src/app/search/search-results/search-results.component.spec.ts b/src/app/search/search-results/search-results.component.spec.ts index d3af0819d7..d987344059 100644 --- a/src/app/search/search-results/search-results.component.spec.ts +++ b/src/app/search/search-results/search-results.component.spec.ts @@ -16,7 +16,9 @@ import { NO_ERRORS_SCHEMA } from '@angular/core'; import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { ExtendedGA4GHStubService, QueryBuilderStubService, SearchStubService } from './../../test/service-stubs'; +import { NoopAnimationsModule } from '@angular/platform-browser/animations'; +import { DateService } from '../../shared/date.service'; +import { DateStubService, ExtendedGA4GHStubService, QueryBuilderStubService, SearchStubService } from './../../test/service-stubs'; import { QueryBuilderService } from './../query-builder.service'; import { RouterTestingModule } from '@angular/router/testing'; @@ -31,13 +33,13 @@ describe('SearchResultsComponent', () => { beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [SearchResultsComponent], schemas: [NO_ERRORS_SCHEMA], - imports: [RouterTestingModule], + imports: [RouterTestingModule, SearchResultsComponent, NoopAnimationsModule], providers: [ { provide: SearchService, useClass: SearchStubService }, { provide: QueryBuilderService, useClass: QueryBuilderStubService }, { provide: ExtendedGA4GHService, useClass: ExtendedGA4GHStubService }, + { provide: DateService, useClass: DateStubService }, ], }).compileComponents(); }) diff --git a/src/app/search/search-results/search-results.component.ts b/src/app/search/search-results/search-results.component.ts index 77cdbb7b3d..8725316f19 100644 --- a/src/app/search/search-results/search-results.component.ts +++ b/src/app/search/search-results/search-results.component.ts @@ -15,18 +15,37 @@ */ import { Component, OnInit } from '@angular/core'; import { faMinus, faPlus } from '@fortawesome/free-solid-svg-icons'; -import { CloudData, CloudOptions } from 'angular-tag-cloud-module'; +import { CloudData, CloudOptions, TagCloudComponent } from 'angular-tag-cloud-module'; import { ExtendedGA4GHService } from 'app/shared/openapi'; import { Observable } from 'rxjs'; import { Base } from '../../shared/base'; import { QueryBuilderService } from '../query-builder.service'; import { SearchQuery } from '../state/search.query'; import { SearchService } from '../state/search.service'; +import { SearchNotebookTableComponent } from '../search-notebook-table/search-notebook-table.component'; +import { SearchToolTableComponent } from '../search-tool-table/search-tool-table.component'; +import { SearchWorkflowTableComponent } from '../search-workflow-table/search-workflow-table.component'; +import { MatDividerModule } from '@angular/material/divider'; +import { FontAwesomeModule } from '@fortawesome/angular-fontawesome'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { NgIf, AsyncPipe } from '@angular/common'; @Component({ selector: 'app-search-results', templateUrl: './search-results.component.html', styleUrls: ['./search-results.component.scss'], + standalone: true, + imports: [ + NgIf, + FlexModule, + FontAwesomeModule, + TagCloudComponent, + MatDividerModule, + SearchWorkflowTableComponent, + SearchToolTableComponent, + SearchNotebookTableComponent, + AsyncPipe, + ], }) export class SearchResultsComponent extends Base implements OnInit { faPlus = faPlus; @@ -37,8 +56,6 @@ export class SearchResultsComponent extends Base implements OnInit { public showWorkflowTagCloud$: Observable; public showToolTagCloud$: Observable; public showNotebookTagCloud$: Observable; - public selectedIndex$: Observable; - public selectedTab: number; toolTagCloudData: Array; workflowTagCloudData: Array; notebookTagCloudData: Array; diff --git a/src/app/search/search-tool-table/search-tool-table.component.html b/src/app/search/search-tool-table/search-tool-table.component.html index 1918c03968..69110ecfe6 100644 --- a/src/app/search/search-tool-table/search-tool-table.component.html +++ b/src/app/search/search-tool-table/search-tool-table.component.html @@ -23,10 +23,11 @@
    + tool icon -
    + -
    + {{ tool?.source.namespace + '/' + tool?.source.name + (tool?.source.toolname ? '/' + tool?.source.toolname : '') }} -
    - {{ tool.source.topicAutomatic }} +
    + {{ tool?.source.topicAutomatic }} +
    - - Verified - - - check - - - Author - + +
    + +
    +
    Format @@ -91,18 +80,6 @@ - - Links - - - - -     - - - - - Stars { beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [SearchToolTableComponent], schemas: [NO_ERRORS_SCHEMA], - imports: [CustomMaterialModule, BrowserAnimationsModule, RouterTestingModule], + imports: [BrowserAnimationsModule, RouterTestingModule, SearchToolTableComponent], providers: [ { provide: DockstoreService, useClass: DockstoreStubService }, - DateService, + { provide: DateService, useClass: DateStubService }, { provide: ListContainersService, useClass: ListContainersStubService }, { provide: SearchService, useClass: SearchStubService }, ], diff --git a/src/app/search/search-tool-table/search-tool-table.component.ts b/src/app/search/search-tool-table/search-tool-table.component.ts index bb5646577c..900fdda72a 100644 --- a/src/app/search/search-tool-table/search-tool-table.component.ts +++ b/src/app/search/search-tool-table/search-tool-table.component.ts @@ -1,11 +1,27 @@ import { Component, OnInit } from '@angular/core'; -import { MatTableDataSource } from '@angular/material/table'; +import { MatLegacyTableDataSource as MatTableDataSource, MatLegacyTableModule } from '@angular/material/legacy-table'; import { Observable } from 'rxjs'; import { DateService } from '../../shared/date.service'; import { AppTool, DockstoreTool } from '../../shared/openapi'; import { SearchEntryTable } from '../search-entry-table'; import { SearchQuery, SearchResult } from '../state/search.query'; import { SearchService } from '../state/search.service'; +import { IsAppToolPipe } from '../is-app-tool.pipe'; +import { JoinWithEllipsesPipe } from 'app/search/join-with-ellipses.pipe'; +import { SearchAuthorsHtmlPipe } from 'app/search/search-authors-html.pipe'; +import { MatLegacyPaginatorModule } from '@angular/material/legacy-paginator'; +import { FontAwesomeModule } from '@fortawesome/angular-fontawesome'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { MatIconModule } from '@angular/material/icon'; +import { ExtendedModule } from '@ngbracket/ngx-layout/extended'; +import { AiBubbleComponent } from '../../shared/ai-bubble/ai-bubble.component'; +import { RouterLink } from '@angular/router'; +import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; +import { PrivateIconComponent } from '../../shared/private-icon/private-icon.component'; +import { MatSortModule } from '@angular/material/sort'; +import { MatLegacyProgressBarModule } from '@angular/material/legacy-progress-bar'; +import { NgIf, NgFor, UpperCasePipe, KeyValuePipe } from '@angular/common'; +import TopicSelectionEnum = DockstoreTool.TopicSelectionEnum; /** * this component refers to search page not tool listing search @@ -15,6 +31,28 @@ import { SearchService } from '../state/search.service'; selector: 'app-search-tool-table', templateUrl: './search-tool-table.component.html', styleUrls: ['../../shared/styles/entry-table.scss', './search-tool-table.component.scss'], + standalone: true, + imports: [ + NgIf, + MatLegacyProgressBarModule, + MatLegacyTableModule, + MatSortModule, + PrivateIconComponent, + MatLegacyTooltipModule, + RouterLink, + AiBubbleComponent, + ExtendedModule, + MatIconModule, + FlexModule, + NgFor, + FontAwesomeModule, + MatLegacyPaginatorModule, + UpperCasePipe, + KeyValuePipe, + SearchAuthorsHtmlPipe, + JoinWithEllipsesPipe, + IsAppToolPipe, + ], }) export class SearchToolTableComponent extends SearchEntryTable implements OnInit { readonly entryType = 'tool'; @@ -26,4 +64,5 @@ export class SearchToolTableComponent extends SearchEntryTable implements OnInit privateNgOnInit(): Observable>> { return this.searchQuery.tools$; } + protected readonly TopicSelectionEnum = TopicSelectionEnum; } diff --git a/src/app/search/search-workflow-table/search-workflow-table.component.html b/src/app/search/search-workflow-table/search-workflow-table.component.html index a494fde3fc..ae9cf1c2d8 100644 --- a/src/app/search/search-workflow-table/search-workflow-table.component.html +++ b/src/app/search/search-workflow-table/search-workflow-table.component.html @@ -7,6 +7,7 @@ Name and Description - - Links - - - - - - Stars star_rate - {{ !workflow?.source.starredUsers || workflow?.source.starredUsers.length === 0 ? '' : workflow?.source.starredUsers?.length }} + {{ !workflow?.source.starredUsers || workflow?.source.starredUsers.length === 0 ? '' : workflow?.source.starredUsers.length }} diff --git a/src/app/search/search-workflow-table/search-workflow-table.component.spec.ts b/src/app/search/search-workflow-table/search-workflow-table.component.spec.ts index 594a04248e..76cb256d5c 100644 --- a/src/app/search/search-workflow-table/search-workflow-table.component.spec.ts +++ b/src/app/search/search-workflow-table/search-workflow-table.component.spec.ts @@ -6,8 +6,7 @@ import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { RouterTestingModule } from '@angular/router/testing'; import { DateService } from '../../shared/date.service'; import { DockstoreService } from '../../shared/dockstore.service'; -import { CustomMaterialModule } from '../../shared/modules/material.module'; -import { DockstoreStubService, SearchStubService } from '../../test/service-stubs'; +import { DateStubService, DockstoreStubService, SearchStubService } from '../../test/service-stubs'; import { SearchService } from '../state/search.service'; import { SearchWorkflowTableComponent } from './search-workflow-table.component'; @@ -18,12 +17,11 @@ describe('SearchWorkflowTableComponent', () => { beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [SearchWorkflowTableComponent], schemas: [NO_ERRORS_SCHEMA], - imports: [CustomMaterialModule, BrowserAnimationsModule, RouterTestingModule], + imports: [BrowserAnimationsModule, RouterTestingModule, SearchWorkflowTableComponent], providers: [ { provide: DockstoreService, useClass: DockstoreStubService }, - DateService, + { provide: DateService, useClass: DateStubService }, { provide: SearchService, useClass: SearchStubService }, ], }).compileComponents(); diff --git a/src/app/search/search-workflow-table/search-workflow-table.component.ts b/src/app/search/search-workflow-table/search-workflow-table.component.ts index ce825799b5..0b4b6935af 100644 --- a/src/app/search/search-workflow-table/search-workflow-table.component.ts +++ b/src/app/search/search-workflow-table/search-workflow-table.component.ts @@ -14,13 +14,27 @@ * limitations under the License. */ import { Component, OnInit } from '@angular/core'; -import { MatTableDataSource } from '@angular/material/table'; +import { MatLegacyTableDataSource as MatTableDataSource, MatLegacyTableModule } from '@angular/material/legacy-table'; import { Observable } from 'rxjs'; import { DateService } from '../../shared/date.service'; import { Workflow } from '../../shared/openapi'; import { SearchEntryTable } from '../search-entry-table'; import { SearchQuery, SearchResult } from '../state/search.query'; import { SearchService } from '../state/search.service'; +import { JoinWithEllipsesPipe } from 'app/search/join-with-ellipses.pipe'; +import { SearchAuthorsHtmlPipe } from 'app/search/search-authors-html.pipe'; +import { DescriptorLanguagePipe } from '../../shared/entry/descriptor-language.pipe'; +import { MatLegacyPaginatorModule } from '@angular/material/legacy-paginator'; +import { FontAwesomeModule } from '@fortawesome/angular-fontawesome'; +import { MatIconModule } from '@angular/material/icon'; +import { ExtendedModule } from '@ngbracket/ngx-layout/extended'; +import { AiBubbleComponent } from '../../shared/ai-bubble/ai-bubble.component'; +import { RouterLink } from '@angular/router'; +import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; +import { MatSortModule } from '@angular/material/sort'; +import { MatLegacyProgressBarModule } from '@angular/material/legacy-progress-bar'; +import { NgIf, NgFor, KeyValuePipe } from '@angular/common'; +import TopicSelectionEnum = Workflow.TopicSelectionEnum; /** * this component refers to search page not workflow listing search @@ -30,6 +44,25 @@ import { SearchService } from '../state/search.service'; selector: 'app-search-workflow-table', templateUrl: './search-workflow-table.component.html', styleUrls: ['../../shared/styles/entry-table.scss', './search-workflow-table.component.scss'], + standalone: true, + imports: [ + NgIf, + MatLegacyProgressBarModule, + MatLegacyTableModule, + MatSortModule, + MatLegacyTooltipModule, + RouterLink, + AiBubbleComponent, + ExtendedModule, + MatIconModule, + FontAwesomeModule, + NgFor, + MatLegacyPaginatorModule, + KeyValuePipe, + DescriptorLanguagePipe, + SearchAuthorsHtmlPipe, + JoinWithEllipsesPipe, + ], }) export class SearchWorkflowTableComponent extends SearchEntryTable implements OnInit { readonly entryType = 'workflow'; @@ -41,4 +74,5 @@ export class SearchWorkflowTableComponent extends SearchEntryTable implements On privateNgOnInit(): Observable>> { return this.searchQuery.workflows$; } + protected readonly TopicSelectionEnum = TopicSelectionEnum; } diff --git a/src/app/search/search.component.scss b/src/app/search/search.component.scss index b45679ec86..2a186e568c 100644 --- a/src/app/search/search.component.scss +++ b/src/app/search/search.component.scss @@ -24,6 +24,10 @@ mat-tab-group.homeComponent { color: $header-color; } +.hits { + line-height: 1.8; +} + .sidebar { position: fixed; top: 0; diff --git a/src/app/search/search.component.spec.ts b/src/app/search/search.component.spec.ts index f58ad5f3cf..b19207df3e 100644 --- a/src/app/search/search.component.spec.ts +++ b/src/app/search/search.component.spec.ts @@ -16,16 +16,23 @@ import { ClipboardModule } from '@angular/cdk/clipboard'; import { Component } from '@angular/core'; import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { MatLegacyDialogModule } from '@angular/material/legacy-dialog'; -import { MatSnackBarModule } from '@angular/material/snack-bar'; +import { MatLegacySnackBarModule as MatSnackBarModule } from '@angular/material/legacy-snack-bar'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { RouterTestingModule } from '@angular/router/testing'; import { FontAwesomeModule } from '@fortawesome/angular-fontawesome'; import { ExtendedGA4GHService } from 'app/shared/openapi'; import { of } from 'rxjs'; -import { CustomMaterialModule } from '../shared/modules/material.module'; +import { DateService } from '../shared/date.service'; import { ProviderService } from '../shared/provider.service'; -import { ExtendedGA4GHStubService, ProviderStubService, QueryBuilderStubService, SearchStubService } from './../test/service-stubs'; +import { + DateStubService, + ExtendedGA4GHStubService, + ProviderStubService, + QueryBuilderStubService, + SearchStubService, +} from './../test/service-stubs'; import { MapFriendlyValuesPipe } from './map-friendly-values.pipe'; import { QueryBuilderService } from './query-builder.service'; import { SearchComponent } from './search.component'; @@ -35,18 +42,24 @@ import { SearchService } from './state/search.service'; @Component({ selector: 'app-search-results', template: '', + standalone: true, + imports: [ClipboardModule, FontAwesomeModule, RouterTestingModule, MatSnackBarModule], }) class SearchResultsComponent {} @Component({ selector: 'app-basic-search', template: '', + standalone: true, + imports: [ClipboardModule, FontAwesomeModule, RouterTestingModule, MatSnackBarModule], }) class BasicSearchComponent {} @Component({ selector: 'app-header', template: '', + standalone: true, + imports: [ClipboardModule, FontAwesomeModule, RouterTestingModule, MatSnackBarModule], }) class HeaderComponent {} @@ -59,14 +72,18 @@ describe('SearchComponent', () => { beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [SearchComponent, MapFriendlyValuesPipe, HeaderComponent, BasicSearchComponent, SearchResultsComponent], imports: [ BrowserAnimationsModule, - CustomMaterialModule, ClipboardModule, FontAwesomeModule, RouterTestingModule, MatSnackBarModule, + MatLegacyDialogModule, + SearchComponent, + MapFriendlyValuesPipe, + HeaderComponent, + BasicSearchComponent, + SearchResultsComponent, ], providers: [ { provide: SearchService, useClass: SearchStubService }, @@ -74,6 +91,7 @@ describe('SearchComponent', () => { { provide: ProviderService, useClass: ProviderStubService }, { provide: ExtendedGA4GHService, useClass: ExtendedGA4GHStubService }, { provide: SearchQuery, useValue: jasmine.createSpyObj('SearchQuery', ['select', 'getValue', 'searchText']) }, + { provide: DateService, useClass: DateStubService }, ], }).compileComponents(); }) diff --git a/src/app/search/search.component.ts b/src/app/search/search.component.ts index 4cc14fcf4b..8d74f1e84f 100644 --- a/src/app/search/search.component.ts +++ b/src/app/search/search.component.ts @@ -13,11 +13,11 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { Location } from '@angular/common'; +import { Location, NgClass, NgFor, NgIf, NgStyle, AsyncPipe, LowerCasePipe } from '@angular/common'; import { HttpErrorResponse } from '@angular/common/http'; import { Component, HostListener, OnDestroy, OnInit, ViewChild } from '@angular/core'; -import { MatAccordion } from '@angular/material/expansion'; -import { MatTabChangeEvent } from '@angular/material/tabs'; +import { MatAccordion, MatExpansionModule } from '@angular/material/expansion'; +import { MatLegacyTabChangeEvent as MatTabChangeEvent, MatLegacyTabsModule } from '@angular/material/legacy-tabs'; import { ActivatedRoute, ParamMap, Router } from '@angular/router'; import { faAngleDoubleDown, @@ -41,6 +41,27 @@ import { AdvancedSearchQuery } from './advancedsearch/state/advanced-search.quer import { QueryBuilderService } from './query-builder.service'; import { SearchQuery } from './state/search.query'; import { Hit, SearchService } from './state/search.service'; +import { GetFacetSearchUpdatePipe } from './facet-search/facet-search-update.pipe'; +import { GetFacetSearchResultsPipe } from './facet-search/facet-search.pipe'; +import { GetHistogramStylePipe } from './get-histogram-style.pipe'; +import { MapFriendlyValuesPipe } from './map-friendly-values.pipe'; +import { SearchResultsComponent } from './search-results/search-results.component'; +import { ClipboardModule } from '@angular/cdk/clipboard'; +import { SnackbarDirective } from '../shared/snackbar.directive'; +import { MatLegacyCardModule } from '@angular/material/legacy-card'; +import { MatLegacyCheckboxModule } from '@angular/material/legacy-checkbox'; +import { FontAwesomeModule } from '@fortawesome/angular-fontawesome'; +import { MatLegacyOptionModule } from '@angular/material/legacy-core'; +import { MatLegacyAutocompleteModule } from '@angular/material/legacy-autocomplete'; +import { FormsModule } from '@angular/forms'; +import { MatLegacyInputModule } from '@angular/material/legacy-input'; +import { MatLegacyFormFieldModule } from '@angular/material/legacy-form-field'; +import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; +import { BasicSearchComponent } from './basic-search/basic-search.component'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { ExtendedModule } from '@ngbracket/ngx-layout/extended'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { HeaderComponent } from '../header/header.component'; /** * @@ -70,6 +91,38 @@ import { Hit, SearchService } from './state/search.service'; selector: 'app-search', templateUrl: './search.component.html', styleUrls: ['./search.component.scss'], + standalone: true, + imports: [ + HeaderComponent, + FlexModule, + MatLegacyTabsModule, + NgClass, + ExtendedModule, + MatLegacyButtonModule, + MatExpansionModule, + BasicSearchComponent, + NgFor, + NgIf, + MatLegacyTooltipModule, + MatLegacyFormFieldModule, + MatLegacyInputModule, + FormsModule, + MatLegacyAutocompleteModule, + MatLegacyOptionModule, + FontAwesomeModule, + NgStyle, + MatLegacyCheckboxModule, + MatLegacyCardModule, + SnackbarDirective, + ClipboardModule, + SearchResultsComponent, + AsyncPipe, + LowerCasePipe, + MapFriendlyValuesPipe, + GetHistogramStylePipe, + GetFacetSearchResultsPipe, + GetFacetSearchUpdatePipe, + ], }) export class SearchComponent implements OnInit, OnDestroy { Dockstore = Dockstore; diff --git a/src/app/search/search.module.ts b/src/app/search/search.module.ts deleted file mode 100644 index 887af17a8a..0000000000 --- a/src/app/search/search.module.ts +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Copyright 2017 OICR - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import { ClipboardModule } from '@angular/cdk/clipboard'; -import { CommonModule } from '@angular/common'; -import { HttpClientModule } from '@angular/common/http'; -import { NgModule } from '@angular/core'; -import { FlexLayoutModule } from '@angular/flex-layout'; -import { FormsModule, ReactiveFormsModule } from '@angular/forms'; -import { MatAutocompleteModule } from '@angular/material/autocomplete'; -import { FontAwesomeModule } from '@fortawesome/angular-fontawesome'; -import { TagCloudComponent } from 'angular-tag-cloud-module'; - -import { RefreshAlertModule } from '../shared/alert/alert.module'; -import { HeaderModule } from '../shared/modules/header.module'; -import { CustomMaterialModule } from '../shared/modules/material.module'; -import { SnackbarModule } from '../shared/modules/snackbar.module'; -import { PipeModule } from '../shared/pipe/pipe.module'; -import { PrivateIconModule } from '../shared/private-icon/private-icon.module'; -import { AdvancedSearchComponent } from './advancedsearch/advancedsearch.component'; -import { BasicSearchComponent } from './basic-search/basic-search.component'; -import { IsAppToolPipe } from './is-app-tool.pipe'; -import { QueryBuilderService } from './query-builder.service'; -import { SearchResultsComponent } from './search-results/search-results.component'; -import { SearchToolTableComponent } from './search-tool-table/search-tool-table.component'; -import { SearchWorkflowTableComponent } from './search-workflow-table/search-workflow-table.component'; -import { SearchNotebookTableComponent } from './search-notebook-table/search-notebook-table.component'; -import { SearchComponent } from './search.component'; -import { searchRouting } from './search.routing'; -import { SearchService } from './state/search.service'; -import { PreviewWarningModule } from '../shared/modules/preview-warning.module'; -import { SearchAuthorsHtmlPipe } from './search-authors-html.pipe'; -import { JoinWithEllipsesPipe } from './join-with-ellipses.pipe'; - -@NgModule({ - declarations: [ - AdvancedSearchComponent, - SearchComponent, - SearchResultsComponent, - SearchToolTableComponent, - SearchWorkflowTableComponent, - SearchNotebookTableComponent, - BasicSearchComponent, - IsAppToolPipe, - ], - imports: [ - CommonModule, - CustomMaterialModule, - FontAwesomeModule, - MatAutocompleteModule, - FormsModule, - HeaderModule, - PipeModule, - ClipboardModule, - searchRouting, - HttpClientModule, - PrivateIconModule, - ReactiveFormsModule, - RefreshAlertModule, - FlexLayoutModule, - SnackbarModule, - TagCloudComponent, - PreviewWarningModule, - ], - providers: [SearchService, QueryBuilderService, SearchAuthorsHtmlPipe, JoinWithEllipsesPipe], - exports: [SearchComponent, IsAppToolPipe], -}) -export class SearchModule {} diff --git a/src/app/search/search.routing.ts b/src/app/search/search.routing.ts index 2d6e3c71f9..e2ff4492b2 100644 --- a/src/app/search/search.routing.ts +++ b/src/app/search/search.routing.ts @@ -14,15 +14,19 @@ * limitations under the License. */ -import { RouterModule, Routes } from '@angular/router'; +import { Routes } from '@angular/router'; +import { QueryBuilderService } from './query-builder.service'; +import { SearchAuthorsHtmlPipe } from './search-authors-html.pipe'; import { SearchComponent } from './search.component'; +import { SearchService } from './state/search.service'; const CONTAINERS_ROUTES: Routes = [ { + providers: [QueryBuilderService, SearchService, SearchAuthorsHtmlPipe], path: '**', component: SearchComponent, data: { title: 'Dockstore | Search' }, }, ]; -export const searchRouting = RouterModule.forChild(CONTAINERS_ROUTES); +export const searchRouting = CONTAINERS_ROUTES; diff --git a/src/app/search/state/search.query.ts b/src/app/search/state/search.query.ts index e9bd581f31..ed997e7d5d 100644 --- a/src/app/search/state/search.query.ts +++ b/src/app/search/state/search.query.ts @@ -1,10 +1,10 @@ import { Injectable } from '@angular/core'; -import { ActivatedRoute } from '@angular/router'; import { Query } from '@datorama/akita'; import { combineLatest, Observable } from 'rxjs'; import { map } from 'rxjs/operators'; import { AppTool, DockstoreTool, Workflow, Notebook } from '../../shared/openapi'; import { SearchState, SearchStore } from './search.store'; +import { parseTerms } from '../helpers'; export interface SearchResult { source: T; @@ -33,7 +33,7 @@ export class SearchQuery extends Query { map((notebooks: Array>) => this.haveNoHits(notebooks)) ); public searchText$: Observable = this.select((state) => state.searchText); - public basicSearchText$: Observable = this.searchText$.pipe(map((searchText) => this.joinComma(searchText))); + public basicSearchText$: Observable = this.searchText$.pipe(map((searchText) => this.joinComma(parseTerms(searchText)))); public showToolTagCloud$: Observable = this.select((state) => state.showToolTagCloud); public showWorkflowTagCloud$: Observable = this.select((state) => state.showWorkflowTagCloud); public showNotebookTagCloud$: Observable = this.select((state) => state.showNotebookTagCloud); @@ -60,7 +60,7 @@ export class SearchQuery extends Query { }) ); - constructor(protected store: SearchStore, private route: ActivatedRoute) { + constructor(protected store: SearchStore) { super(store); } @@ -68,8 +68,8 @@ export class SearchQuery extends Query { return !object || object.length === 0; } - joinComma(searchTerm: string): string { - return searchTerm.trim().split(' ').join(', '); + joinComma(strings: string[]): string { + return strings.join(', '); } /** diff --git a/src/app/search/state/search.service.spec.ts b/src/app/search/state/search.service.spec.ts index 677a351c44..8a77eb6835 100644 --- a/src/app/search/state/search.service.spec.ts +++ b/src/app/search/state/search.service.spec.ts @@ -15,7 +15,7 @@ */ import { HttpClientTestingModule } from '@angular/common/http/testing'; import { inject, TestBed } from '@angular/core/testing'; -import { MatSnackBarModule } from '@angular/material/snack-bar'; +import { MatLegacySnackBarModule as MatLegacySnackBarModule } from '@angular/material/legacy-snack-bar'; import { RouterTestingModule } from '@angular/router/testing'; import { first } from 'rxjs/operators'; import { ImageProviderService } from '../../shared/image-provider.service'; @@ -31,7 +31,7 @@ describe('SearchService', () => { let searchService: SearchService; beforeEach(() => { TestBed.configureTestingModule({ - imports: [RouterTestingModule, HttpClientTestingModule, MatSnackBarModule], + imports: [RouterTestingModule, HttpClientTestingModule, MatLegacySnackBarModule], providers: [ ImageProviderService, SearchService, @@ -123,7 +123,7 @@ describe('SearchService', () => { it('should sort workflows correctly', inject([SearchService], (service: SearchService) => { const a: Workflow = { type: '', - author: 'a', + authors: [{ name: 'a' }], gitUrl: 'https://giturl', mode: Workflow.ModeEnum.FULL, organization: '', @@ -135,20 +135,23 @@ describe('SearchService', () => { descriptorTypeSubclass: Workflow.DescriptorTypeSubclassEnum.NA, full_workflow_path: 'abc', }; + a['all_authors'] = a['authors']; - const b: Workflow = { + const b: Object = { ...a, - author: 'B', + authors: [{ name: 'B' }], full_workflow_path: 'Bcd', starredUsers: [{ isAdmin: false, curator: false, platformPartner: null, setupComplete: true }], }; + b['all_authors'] = b['authors']; - const c: Workflow = { ...a, author: null, full_workflow_path: null, descriptorType: Workflow.DescriptorTypeEnum.WDL }; + const c: Workflow = { ...a, authors: [], full_workflow_path: null, descriptorType: Workflow.DescriptorTypeEnum.WDL }; + c['all_authors'] = c['authors']; - expect(searchService.compareAttributes(a, b, 'author', 'asc', 'workflow')).toEqual(-1); - expect(searchService.compareAttributes(a, b, 'author', 'desc', 'workflow')).toEqual(1); - expect(searchService.compareAttributes(b, c, 'author', 'asc', 'workflow')).toEqual(-1); - expect(searchService.compareAttributes(b, c, 'author', 'desc', 'workflow')).toEqual(-1); + expect(searchService.compareAttributes(a, b, 'all_authors', 'asc', 'workflow')).toEqual(-1); + expect(searchService.compareAttributes(a, b, 'all_authors', 'desc', 'workflow')).toEqual(1); + expect(searchService.compareAttributes(b, c, 'all_authors', 'asc', 'workflow')).toEqual(-1); + expect(searchService.compareAttributes(b, c, 'all_authors', 'desc', 'workflow')).toEqual(1); expect(searchService.compareAttributes(a, c, 'descriptorType', 'asc', 'workflow')).toEqual(-1); expect(searchService.compareAttributes(a, b, 'descriptorType', 'desc', 'workflow')).toEqual(-0); expect(searchService.compareAttributes(a, b, 'starredUsers', 'asc', 'workflow')).toEqual(-1); diff --git a/src/app/select/select.component.spec.ts b/src/app/select/select.component.spec.ts index 499f4c79c9..a709832f2e 100644 --- a/src/app/select/select.component.spec.ts +++ b/src/app/select/select.component.spec.ts @@ -16,6 +16,7 @@ import { NO_ERRORS_SCHEMA } from '@angular/core'; import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { NoopAnimationsModule } from '@angular/platform-browser/animations'; import { SelectComponent } from './select.component'; @@ -26,7 +27,7 @@ describe('SelectComponent', () => { beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [SelectComponent], + imports: [SelectComponent, NoopAnimationsModule], schemas: [NO_ERRORS_SCHEMA], }).compileComponents(); }) diff --git a/src/app/select/select.component.ts b/src/app/select/select.component.ts index 18b0527e4c..caddca4473 100644 --- a/src/app/select/select.component.ts +++ b/src/app/select/select.component.ts @@ -15,10 +15,17 @@ */ import { Component, EventEmitter, Input, OnChanges, Output } from '@angular/core'; +import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; +import { MatLegacyOptionModule } from '@angular/material/legacy-core'; +import { NgFor, NgIf } from '@angular/common'; +import { MatLegacySelectModule } from '@angular/material/legacy-select'; +import { MatLegacyFormFieldModule } from '@angular/material/legacy-form-field'; @Component({ selector: 'app-select', templateUrl: './select.component.html', + standalone: true, + imports: [MatLegacyFormFieldModule, MatLegacySelectModule, NgFor, MatLegacyOptionModule, MatLegacyTooltipModule, NgIf], }) export class SelectComponent implements OnChanges { @Input() items: Array; diff --git a/src/app/session-expired/session-expired.component.ts b/src/app/session-expired/session-expired.component.ts index 021a9082e7..45112503a6 100644 --- a/src/app/session-expired/session-expired.component.ts +++ b/src/app/session-expired/session-expired.component.ts @@ -14,9 +14,13 @@ * limitations under the License. */ import { Component } from '@angular/core'; +import { RouterLink } from '@angular/router'; +import { HeaderComponent } from '../header/header.component'; @Component({ selector: 'app-policy-update', templateUrl: './session-expired.component.html', + standalone: true, + imports: [HeaderComponent, RouterLink], }) export class SessionExpiredComponent {} diff --git a/src/app/shared-workflow-services-notebooks/shared-workflow-services-notebooks.module.ts b/src/app/shared-workflow-services-notebooks/shared-workflow-services-notebooks.module.ts deleted file mode 100644 index 6018af8d97..0000000000 --- a/src/app/shared-workflow-services-notebooks/shared-workflow-services-notebooks.module.ts +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Copyright 2022 OICR, UCSC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { FormsModule } from '@angular/forms'; -import { RouterModule } from '@angular/router'; -import { MyWorkflowsService } from 'app/myworkflows/myworkflows.service'; -import { EntryWizardModule } from 'app/shared/entry-wizard.module'; -import { MyEntriesModule } from 'app/shared/modules/my-entries.module'; -import { PreviewWarningModule } from 'app/shared/modules/preview-warning.module'; -import { RegisterGithubAppModalComponent } from 'app/workflow/register-workflow-modal/register-github-app-modal/register-github-app-modal.component'; -import { MyWorkflowComponent } from '../myworkflows/my-workflow/my-workflow.component'; -import { SidebarAccordionComponent } from '../myworkflows/sidebar-accordion/sidebar-accordion.component'; -import { RefreshAlertModule } from '../shared/alert/alert.module'; -import { HeaderModule } from '../shared/modules/header.module'; -import { CustomMaterialModule } from '../shared/modules/material.module'; -import { RegisterGithubAppModule } from '../shared/modules/register-github-app.module'; -import { WorkflowModule } from '../shared/modules/workflow.module'; -import { PipeModule } from '../shared/pipe/pipe.module'; -import { RefreshWorkflowOrganizationComponent } from '../workflow/refresh-workflow-organization/refresh-workflow-organization.component'; -import { RegisterWorkflowModalComponent } from '../workflow/register-workflow-modal/register-workflow-modal.component'; - -const DECLARATIONS: any[] = [ - MyWorkflowComponent, - RefreshWorkflowOrganizationComponent, - RegisterWorkflowModalComponent, - RegisterGithubAppModalComponent, - SidebarAccordionComponent, -]; -const IMPORTS = [ - FormsModule, - WorkflowModule, - HeaderModule, - CustomMaterialModule, - RefreshAlertModule, - PipeModule, - CommonModule, - RouterModule, - MyEntriesModule, - EntryWizardModule, - PreviewWarningModule, - RegisterGithubAppModule, -]; - -/** - * This is a shared module between the My Workflows page, My Services page, and My Notebooks page. - * It shares modules and components - * - * @export - * @class SharedWorkflowServicesNotebooksModule - */ -@NgModule({ - declarations: DECLARATIONS, - imports: IMPORTS, - providers: [MyWorkflowsService], - exports: [DECLARATIONS.concat(IMPORTS), SidebarAccordionComponent], -}) -export class SharedWorkflowServicesNotebooksModule {} diff --git a/src/app/shared/ai-bubble/ai-bubble.component.html b/src/app/shared/ai-bubble/ai-bubble.component.html new file mode 100644 index 0000000000..d0271f9036 --- /dev/null +++ b/src/app/shared/ai-bubble/ai-bubble.component.html @@ -0,0 +1,15 @@ + + AI generation icon + AI + diff --git a/src/app/shared/ai-bubble/ai-bubble.component.ts b/src/app/shared/ai-bubble/ai-bubble.component.ts new file mode 100644 index 0000000000..72b75e0a36 --- /dev/null +++ b/src/app/shared/ai-bubble/ai-bubble.component.ts @@ -0,0 +1,42 @@ +/* + * Copyright 2024 OICR, UCSC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { Component, Input, OnInit } from '@angular/core'; +import { Dockstore } from '../dockstore.model'; +import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; + +/** + * Component for the AI generated indicator. + * + * @export + * @class AiBubbleComponent + * @implements {OnInit} + */ +@Component({ + selector: 'app-ai-bubble', + templateUrl: './ai-bubble.component.html', + standalone: true, + imports: [MatLegacyTooltipModule], +}) +export class AiBubbleComponent implements OnInit { + constructor() {} + + ngOnInit() {} + + protected readonly Dockstore = Dockstore; + + @Input() + isPublic: boolean; +} diff --git a/src/app/shared/alert/alert.component.spec.ts b/src/app/shared/alert/alert.component.spec.ts index da308ba4e9..afed9557ea 100644 --- a/src/app/shared/alert/alert.component.spec.ts +++ b/src/app/shared/alert/alert.component.spec.ts @@ -1,8 +1,8 @@ import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { MatCardModule } from '@angular/material/card'; +import { MatLegacyCardModule as MatCardModule } from '@angular/material/legacy-card'; import { MatIconModule } from '@angular/material/icon'; -import { MatProgressBarModule } from '@angular/material/progress-bar'; -import { MatSnackBarModule } from '@angular/material/snack-bar'; +import { MatLegacyProgressBarModule as MatProgressBarModule } from '@angular/material/legacy-progress-bar'; +import { MatLegacySnackBarModule as MatSnackBarModule } from '@angular/material/legacy-snack-bar'; import { AlertComponent } from './alert.component'; @@ -13,8 +13,7 @@ describe('RefreshAlertComponent', () => { beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - imports: [MatProgressBarModule, MatSnackBarModule, MatIconModule, MatCardModule], - declarations: [AlertComponent], + imports: [MatProgressBarModule, MatSnackBarModule, MatIconModule, MatCardModule, AlertComponent], }).compileComponents(); }) ); diff --git a/src/app/shared/alert/alert.component.ts b/src/app/shared/alert/alert.component.ts index 245d7aba29..197c9b1d9a 100644 --- a/src/app/shared/alert/alert.component.ts +++ b/src/app/shared/alert/alert.component.ts @@ -18,6 +18,10 @@ import { Observable } from 'rxjs'; import { AlertQuery } from './state/alert.query'; import { AlertService } from './state/alert.service'; +import { MatLegacyProgressBarModule } from '@angular/material/legacy-progress-bar'; +import { MatIconModule } from '@angular/material/icon'; +import { MatLegacyCardModule } from '@angular/material/legacy-card'; +import { NgIf, AsyncPipe } from '@angular/common'; /** * Stick this component into any location you want to potentially display a progress bar or alert. @@ -30,6 +34,8 @@ import { AlertService } from './state/alert.service'; selector: 'app-alert', templateUrl: './alert.component.html', styleUrls: ['./alert.component.css'], + standalone: true, + imports: [NgIf, MatLegacyCardModule, MatIconModule, MatLegacyProgressBarModule, AsyncPipe], }) export class AlertComponent implements OnInit { public showError$: Observable; diff --git a/src/app/shared/alert/alert.module.ts b/src/app/shared/alert/alert.module.ts deleted file mode 100644 index 0bf66abe3f..0000000000 --- a/src/app/shared/alert/alert.module.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { FormsModule } from '@angular/forms'; -import { MatIconModule } from '@angular/material/icon'; -import { MatProgressBarModule } from '@angular/material/progress-bar'; -import { CustomMaterialModule } from './../modules/material.module'; - -import { LoadingComponent } from '../loading/loading.component'; -import { AlertComponent } from './alert.component'; - -@NgModule({ - declarations: [AlertComponent, LoadingComponent], - imports: [MatProgressBarModule, MatIconModule, CommonModule, FormsModule, CustomMaterialModule], - exports: [AlertComponent, LoadingComponent], -}) -export class RefreshAlertModule {} diff --git a/src/app/shared/alert/state/alert.service.ts b/src/app/shared/alert/state/alert.service.ts index 9cef7af8f0..d939d5302b 100644 --- a/src/app/shared/alert/state/alert.service.ts +++ b/src/app/shared/alert/state/alert.service.ts @@ -15,7 +15,7 @@ */ import { HttpErrorResponse } from '@angular/common/http'; import { Injectable } from '@angular/core'; -import { MatSnackBar } from '@angular/material/snack-bar'; +import { MatLegacySnackBar as MatSnackBar } from '@angular/material/legacy-snack-bar'; import { AlertQuery } from './alert.query'; import { AlertStore } from './alert.store'; diff --git a/src/app/shared/auth.guard.ts b/src/app/shared/auth.guard.ts index faef9bf4e4..4548165862 100644 --- a/src/app/shared/auth.guard.ts +++ b/src/app/shared/auth.guard.ts @@ -15,15 +15,15 @@ */ import { Injectable } from '@angular/core'; -import { ActivatedRouteSnapshot, CanActivate, Router, RouterStateSnapshot } from '@angular/router'; -import { AuthService } from 'ng2-ui-auth'; -import { of } from 'rxjs/internal/observable/of'; +import { ActivatedRouteSnapshot, Router, RouterStateSnapshot } from '@angular/router'; +import { of } from 'rxjs'; import { catchError, map } from 'rxjs/operators'; +import { AuthService } from '../ng2-ui-auth/public_api'; import { LogoutService } from './logout.service'; import { UsersService } from './openapi'; @Injectable() -export class AuthGuard implements CanActivate { +export class AuthGuard { constructor( private auth: AuthService, private router: Router, diff --git a/src/app/shared/auth.model.ts b/src/app/shared/auth.model.ts index 7f9a9ed231..cba4e6cb15 100644 --- a/src/app/shared/auth.model.ts +++ b/src/app/shared/auth.model.ts @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { IPartialConfigOptions } from 'ng2-ui-auth/lib/config-interfaces'; +import { IPartialConfigOptions } from '../ng2-ui-auth/lib/config-interfaces'; import { Dockstore } from '../shared/dockstore.model'; export const AuthConfig: IPartialConfigOptions = { diff --git a/src/app/shared/available-logs.module.ts b/src/app/shared/available-logs.module.ts deleted file mode 100644 index 81900304c7..0000000000 --- a/src/app/shared/available-logs.module.ts +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright 2019 OICR - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { FlexLayoutModule } from '@angular/flex-layout'; -import { RefreshAlertModule } from './alert/alert.module'; -import { AvailableLogsComponent } from './available-logs/available-logs.component'; -import { RemoveExtensionPipe } from './available-logs/remove-extension.pipe'; -import { ToolTesterLogPipe } from './available-logs/tool-tester-log.pipe'; -import { VerifiedDisplayComponent } from './entry/verified-display/verified-display.component'; -import { CustomMaterialModule } from './modules/material.module'; - -@NgModule({ - imports: [CommonModule, CustomMaterialModule, FlexLayoutModule, RefreshAlertModule], - declarations: [AvailableLogsComponent, VerifiedDisplayComponent, ToolTesterLogPipe, RemoveExtensionPipe], - exports: [VerifiedDisplayComponent], -}) -export class AvailableLogsModule {} diff --git a/src/app/shared/available-logs/available-logs.component.ts b/src/app/shared/available-logs/available-logs.component.ts index 6ca3e0c2a4..eff8a85fc3 100644 --- a/src/app/shared/available-logs/available-logs.component.ts +++ b/src/app/shared/available-logs/available-logs.component.ts @@ -1,5 +1,5 @@ import { Component, Inject, OnInit } from '@angular/core'; -import { MAT_DIALOG_DATA } from '@angular/material/dialog'; +import { MAT_LEGACY_DIALOG_DATA as MAT_DIALOG_DATA, MatLegacyDialogModule } from '@angular/material/legacy-dialog'; import { ID } from '@datorama/akita'; import { Observable } from 'rxjs'; import { takeUntil } from 'rxjs/operators'; @@ -9,6 +9,15 @@ import { ToolTesterLog } from '../openapi/model/toolTesterLog'; import { AvailableLogsQuery } from '../state/available-logs.query'; import { AvailableLogsService } from '../state/available-logs.service'; import { CheckerWorkflowQuery } from '../state/checker-workflow.query'; +import { RemoveExtensionPipe } from './remove-extension.pipe'; +import { ToolTesterLogPipe } from './tool-tester-log.pipe'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { MatLegacyTableModule } from '@angular/material/legacy-table'; +import { VerifiedDisplayComponent } from '../entry/verified-display/verified-display.component'; +import { NgIf, AsyncPipe, DatePipe } from '@angular/common'; +import { MatLegacyCardModule } from '@angular/material/legacy-card'; +import { LoadingComponent } from '../loading/loading.component'; interface VersionVerifiedInformation { version: WorkflowVersion | Tag; @@ -19,6 +28,21 @@ interface VersionVerifiedInformation { selector: 'app-available-logs', templateUrl: './available-logs.component.html', styleUrls: ['./available-logs.component.scss'], + standalone: true, + imports: [ + MatLegacyDialogModule, + LoadingComponent, + MatLegacyCardModule, + NgIf, + VerifiedDisplayComponent, + MatLegacyTableModule, + MatLegacyButtonModule, + FlexModule, + AsyncPipe, + DatePipe, + ToolTesterLogPipe, + RemoveExtensionPipe, + ], }) export class AvailableLogsComponent extends Base implements OnInit { version: Tag | WorkflowVersion | null; diff --git a/src/app/shared/available-logs/remove-extension.pipe.ts b/src/app/shared/available-logs/remove-extension.pipe.ts index 6add2d5dff..45c2381595 100644 --- a/src/app/shared/available-logs/remove-extension.pipe.ts +++ b/src/app/shared/available-logs/remove-extension.pipe.ts @@ -2,6 +2,7 @@ import { Pipe, PipeTransform } from '@angular/core'; @Pipe({ name: 'removeExtension', + standalone: true, }) export class RemoveExtensionPipe implements PipeTransform { /** diff --git a/src/app/shared/available-logs/tool-tester-log.pipe.ts b/src/app/shared/available-logs/tool-tester-log.pipe.ts index 3962068e91..8eb51f6aaa 100644 --- a/src/app/shared/available-logs/tool-tester-log.pipe.ts +++ b/src/app/shared/available-logs/tool-tester-log.pipe.ts @@ -3,6 +3,7 @@ import { Router, UrlTree } from '@angular/router'; import { Dockstore } from '../dockstore.model'; @Pipe({ name: 'toolTesterLog', + standalone: true, }) export class ToolTesterLogPipe implements PipeTransform { constructor(private router: Router) {} diff --git a/src/app/shared/code-editor-list/code-editor-list.component.spec.ts b/src/app/shared/code-editor-list/code-editor-list.component.spec.ts index de7286303f..d89f5c6ec0 100644 --- a/src/app/shared/code-editor-list/code-editor-list.component.spec.ts +++ b/src/app/shared/code-editor-list/code-editor-list.component.spec.ts @@ -1,14 +1,14 @@ import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; import { ClipboardModule } from '@angular/cdk/clipboard'; -import { MatButtonModule } from '@angular/material/button'; -import { MatCardModule } from '@angular/material/card'; -import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatLegacyButtonModule as MatButtonModule } from '@angular/material/legacy-button'; +import { MatLegacyCardModule as MatCardModule } from '@angular/material/legacy-card'; +import { MatLegacyFormFieldModule as MatFormFieldModule } from '@angular/material/legacy-form-field'; import { MatIconModule } from '@angular/material/icon'; -import { MatInputModule } from '@angular/material/input'; -import { MatTabsModule } from '@angular/material/tabs'; +import { MatLegacyInputModule as MatInputModule } from '@angular/material/legacy-input'; +import { MatLegacyTabsModule as MatTabsModule } from '@angular/material/legacy-tabs'; import { MatToolbarModule } from '@angular/material/toolbar'; -import { MatTooltipModule } from '@angular/material/tooltip'; +import { MatLegacyTooltipModule as MatTooltipModule } from '@angular/material/legacy-tooltip'; import { WorkflowService } from '../state/workflow.service'; import { PrivateFilePathPipe } from './../../shared/entry/private-file-path.pipe'; @@ -27,7 +27,6 @@ describe('CodeEditorListComponent', () => { beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [CodeEditorListComponent, CodeEditorComponent, PublicFileDownloadPipe, PrivateFilePathPipe], imports: [ MatButtonModule, MatTabsModule, @@ -39,6 +38,10 @@ describe('CodeEditorListComponent', () => { MatCardModule, ClipboardModule, HttpClientTestingModule, + CodeEditorListComponent, + CodeEditorComponent, + PublicFileDownloadPipe, + PrivateFilePathPipe, ], providers: [ { provide: WorkflowService, useClass: WorkflowStubService }, diff --git a/src/app/shared/code-editor-list/code-editor-list.component.ts b/src/app/shared/code-editor-list/code-editor-list.component.ts index 22eb2c90af..6cc71dc8c6 100644 --- a/src/app/shared/code-editor-list/code-editor-list.component.ts +++ b/src/app/shared/code-editor-list/code-editor-list.component.ts @@ -2,11 +2,25 @@ import { Component, Input } from '@angular/core'; import { Observable } from 'rxjs'; import { WorkflowQuery } from '../state/workflow.query'; -import { SourceFile } from '../openapi'; +import { EntryType, SourceFile } from '../openapi'; import { ToolDescriptor } from './../../shared/openapi/model/toolDescriptor'; import { WorkflowVersion } from './../../shared/openapi/model/workflowVersion'; import { CodeEditorListService } from './code-editor-list.service'; import { FileService } from 'app/shared/file.service'; +import { PrivateFilePathPipe } from '../entry/private-file-path.pipe'; +import { PublicFileDownloadPipe } from '../entry/public-file-download.pipe'; +import { CodeEditorComponent } from '../code-editor/code-editor.component'; +import { ClipboardModule } from '@angular/cdk/clipboard'; +import { SnackbarDirective } from '../snackbar.directive'; +import { MatIconModule } from '@angular/material/icon'; +import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { MatLegacyInputModule } from '@angular/material/legacy-input'; +import { MatLegacyFormFieldModule } from '@angular/material/legacy-form-field'; +import { FormsModule } from '@angular/forms'; +import { MatToolbarModule } from '@angular/material/toolbar'; +import { MatLegacyCardModule } from '@angular/material/legacy-card'; +import { NgIf, NgFor, AsyncPipe } from '@angular/common'; export type FileCategory = 'descriptor' | 'dockerfile' | 'testParam'; @@ -14,13 +28,32 @@ export type FileCategory = 'descriptor' | 'dockerfile' | 'testParam'; selector: 'app-code-editor-list', templateUrl: './code-editor-list.component.html', styleUrls: ['./code-editor-list.component.scss'], + standalone: true, + imports: [ + NgIf, + MatLegacyCardModule, + NgFor, + MatToolbarModule, + FormsModule, + MatLegacyFormFieldModule, + MatLegacyInputModule, + MatLegacyButtonModule, + MatLegacyTooltipModule, + MatIconModule, + SnackbarDirective, + ClipboardModule, + CodeEditorComponent, + AsyncPipe, + PublicFileDownloadPipe, + PrivateFilePathPipe, + ], }) export class CodeEditorListComponent { @Input() sourcefiles: SourceFile[]; @Input() editing: boolean; @Input() fileType: FileCategory; @Input() descriptorType: ToolDescriptor.TypeEnum; - @Input() entryType: 'tool' | 'workflow'; + @Input() entryType: EntryType; @Input() entrypath: string; @Input() selectedVersion: WorkflowVersion; protected published$: Observable; diff --git a/src/app/shared/code-editor-list/code-editor-list.service.spec.ts b/src/app/shared/code-editor-list/code-editor-list.service.spec.ts index 60ddaf7372..8d9a5beafd 100644 --- a/src/app/shared/code-editor-list/code-editor-list.service.spec.ts +++ b/src/app/shared/code-editor-list/code-editor-list.service.spec.ts @@ -33,37 +33,76 @@ describe('CodeEditorListService', () => { it('should be able to determine files to add', () => { const service: CodeEditorListService = TestBed.inject(CodeEditorListService); // Brand new hosted workflow with no descriptors - const primarySMKFile = { content: '', absolutePath: '/Snakefile', path: '/Snakefile', type: SourceFile.TypeEnum.DOCKSTORESMK }; - const secondarySMKFile = { content: '', absolutePath: '/.smk', path: '/.smk', type: SourceFile.TypeEnum.DOCKSTORESMK }; + const primarySMKFile = { + content: '', + absolutePath: '/Snakefile', + path: '/Snakefile', + type: SourceFile.TypeEnum.DOCKSTORESMK, + state: SourceFile.StateEnum.COMPLETE, + }; const primaryCWLFile: SourceFile = { content: '', absolutePath: '/Dockstore.cwl', path: '/Dockstore.cwl', type: SourceFile.TypeEnum.DOCKSTORECWL, + state: SourceFile.StateEnum.COMPLETE, + }; + const secondaryCWLFile = { + content: '', + absolutePath: '/.cwl', + path: '/.cwl', + type: SourceFile.TypeEnum.DOCKSTORECWL, + state: SourceFile.StateEnum.COMPLETE, + }; + const primaryWDLFile = { + content: '', + absolutePath: '/Dockstore.wdl', + path: '/Dockstore.wdl', + type: SourceFile.TypeEnum.DOCKSTOREWDL, + state: SourceFile.StateEnum.COMPLETE, + }; + const secondaryWDLFile = { + content: '', + absolutePath: '/.wdl', + path: '/.wdl', + type: SourceFile.TypeEnum.DOCKSTOREWDL, + state: SourceFile.StateEnum.COMPLETE, + }; + const firstPrimaryNFLFile = { + content: '', + absolutePath: '/main.nf', + path: '/main.nf', + type: SourceFile.TypeEnum.NEXTFLOW, + state: SourceFile.StateEnum.COMPLETE, }; - const secondaryCWLFile = { content: '', absolutePath: '/.cwl', path: '/.cwl', type: SourceFile.TypeEnum.DOCKSTORECWL }; - const primaryWDLFile = { content: '', absolutePath: '/Dockstore.wdl', path: '/Dockstore.wdl', type: SourceFile.TypeEnum.DOCKSTOREWDL }; - const secondaryWDLFile = { content: '', absolutePath: '/.wdl', path: '/.wdl', type: SourceFile.TypeEnum.DOCKSTOREWDL }; - const firstPrimaryNFLFile = { content: '', absolutePath: '/main.nf', path: '/main.nf', type: SourceFile.TypeEnum.NEXTFLOW }; const secondPrimaryNFLFile = { content: '', absolutePath: '/nextflow.config', path: '/nextflow.config', type: SourceFile.TypeEnum.NEXTFLOWCONFIG, + state: SourceFile.StateEnum.COMPLETE, + }; + const secondaryNFLFile = { + content: '', + absolutePath: '/.nf', + path: '/.nf', + type: SourceFile.TypeEnum.NEXTFLOW, + state: SourceFile.StateEnum.COMPLETE, }; - const secondaryNFLFile = { content: '', absolutePath: '/.nf', path: '/.nf', type: SourceFile.TypeEnum.NEXTFLOW }; const primaryNFLFiles = [firstPrimaryNFLFile, secondPrimaryNFLFile]; const primaryGalaxyFile = { content: '', absolutePath: '/workflow-name.yml', path: '/workflow-name.yml', type: SourceFile.TypeEnum.DOCKSTOREGXFORMAT2, + state: SourceFile.StateEnum.COMPLETE, }; const secondaryGalaxyFile = { content: '', absolutePath: '/.yml', path: '/.yml', type: SourceFile.TypeEnum.DOCKSTOREGXFORMAT2, + state: SourceFile.StateEnum.COMPLETE, }; expect(service.determineFilesToAdd(ToolDescriptor.TypeEnum.SMK, 'descriptor', [])).toEqual([primarySMKFile]); expect(service.determineFilesToAdd(ToolDescriptor.TypeEnum.CWL, 'descriptor', [])).toEqual([primaryCWLFile]); @@ -71,27 +110,48 @@ describe('CodeEditorListService', () => { expect(service.determineFilesToAdd(ToolDescriptor.TypeEnum.NFL, 'descriptor', [])).toEqual(primaryNFLFiles); expect(service.determineFilesToAdd(ToolDescriptor.TypeEnum.GALAXY, 'descriptor', [])).toEqual([primaryGalaxyFile]); - const testSMKFile = { content: '', absolutePath: '/test.smk.json', path: '/test.smk.json', type: SourceFile.TypeEnum.SMKTESTPARAMS }; - const testCWLFile = { content: '', absolutePath: '/test.cwl.json', path: '/test.cwl.json', type: SourceFile.TypeEnum.CWLTESTJSON }; - const testWDLFile = { content: '', absolutePath: '/test.wdl.json', path: '/test.wdl.json', type: SourceFile.TypeEnum.WDLTESTJSON }; + const testSMKFile = { + content: '', + absolutePath: '/test.smk.json', + path: '/test.smk.json', + type: SourceFile.TypeEnum.SMKTESTPARAMS, + state: SourceFile.StateEnum.COMPLETE, + }; + const testCWLFile = { + content: '', + absolutePath: '/test.cwl.json', + path: '/test.cwl.json', + type: SourceFile.TypeEnum.CWLTESTJSON, + state: SourceFile.StateEnum.COMPLETE, + }; + const testWDLFile = { + content: '', + absolutePath: '/test.wdl.json', + path: '/test.wdl.json', + type: SourceFile.TypeEnum.WDLTESTJSON, + state: SourceFile.StateEnum.COMPLETE, + }; // Weird because NFL doesn't have test parameter files const testNFLFile = { content: '', absolutePath: '/test.nfl.json', path: '/test.nfl.json', type: SourceFile.TypeEnum.NEXTFLOWTESTPARAMS, + state: SourceFile.StateEnum.COMPLETE, }; const testGalaxyFile = { content: '', absolutePath: '/test.galaxy.json', path: '/test.galaxy.json', type: SourceFile.TypeEnum.GXFORMAT2TESTFILE, + state: SourceFile.StateEnum.COMPLETE, }; const testDockerFile = { content: '', absolutePath: '/Dockerfile', path: '/Dockerfile', type: SourceFile.TypeEnum.DOCKERFILE, + state: SourceFile.StateEnum.COMPLETE, }; // Brand new hosted workflow with no test parameter file expect(service.determineFilesToAdd(ToolDescriptor.TypeEnum.SMK, 'testParam', [])).toEqual([testSMKFile]); @@ -125,6 +185,7 @@ describe('CodeEditorListService', () => { absolutePath: '/.dockstore.yml', path: '/.dockstore.yml', type: SourceFile.TypeEnum.DOCKSTORECWL, + state: SourceFile.StateEnum.COMPLETE, }; expect(service.determineFilesToAdd(ToolDescriptor.TypeEnum.SERVICE, 'descriptor', [])).toEqual([weirdServiceFile]); }); diff --git a/src/app/shared/code-editor-list/code-editor-list.service.ts b/src/app/shared/code-editor-list/code-editor-list.service.ts index 77cf093ec2..34aabd1e99 100644 --- a/src/app/shared/code-editor-list/code-editor-list.service.ts +++ b/src/app/shared/code-editor-list/code-editor-list.service.ts @@ -201,6 +201,7 @@ export class CodeEditorListService { content: '', path: newFilePath, type: type, + state: 'COMPLETE', }; } else { return null; diff --git a/src/app/shared/code-editor/code-editor.component.spec.ts b/src/app/shared/code-editor/code-editor.component.spec.ts index 145886bec0..967851a280 100644 --- a/src/app/shared/code-editor/code-editor.component.spec.ts +++ b/src/app/shared/code-editor/code-editor.component.spec.ts @@ -10,8 +10,7 @@ describe('CodeEditorComponent', () => { beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [CodeEditorComponent], - imports: [HttpClientTestingModule], + imports: [HttpClientTestingModule, CodeEditorComponent], }).compileComponents(); }) ); diff --git a/src/app/shared/code-editor/code-editor.component.ts b/src/app/shared/code-editor/code-editor.component.ts index 56eff64963..b6220bb8fb 100644 --- a/src/app/shared/code-editor/code-editor.component.ts +++ b/src/app/shared/code-editor/code-editor.component.ts @@ -1,6 +1,8 @@ import { HttpClient } from '@angular/common/http'; import { AfterViewInit, Component, EventEmitter, Input, Output } from '@angular/core'; + import { ace } from './../grammars/custom-grammars.js'; +import { EntryType } from '../openapi/model/entryType'; let ACE_EDITOR_INSTANCE = 0; @@ -8,6 +10,7 @@ let ACE_EDITOR_INSTANCE = 0; selector: 'app-code-editor', templateUrl: './code-editor.component.html', styleUrls: ['./code-editor.component.scss'], + standalone: true, }) export class CodeEditorComponent implements AfterViewInit { editorContent: string; @@ -16,7 +19,7 @@ export class CodeEditorComponent implements AfterViewInit { editorFilepath: string; aceId: string; readOnly = true; - @Input() entryType: 'tool' | 'workflow'; + @Input() entryType: EntryType; @Input() set editing(value: boolean) { if (value !== undefined) { this.toggleReadOnly(!value); @@ -72,7 +75,9 @@ export class CodeEditorComponent implements AfterViewInit { this.editor.setValue(this.editorContent, cursorPos); } - this.editor.focus(); + if (!this.readOnly) { + this.editor.focus(); + } }; let sampleCodeUrl = ''; @@ -80,9 +85,9 @@ export class CodeEditorComponent implements AfterViewInit { // Load sample code by default when editing empty CWL/WDL/Nextflow files if (!this.editorContent) { if (this.mode === 'cwl') { - if (this.entryType === 'tool') { + if (this.entryType === EntryType.TOOL) { sampleCodeUrl = '../assets/text/sample-tool.cwl'; - } else if (this.entryType === 'workflow') { + } else if (this.entryType === EntryType.WORKFLOW) { sampleCodeUrl = '../assets/text/sample-workflow.cwl'; } } else if (this.mode === 'wdl') { @@ -91,11 +96,21 @@ export class CodeEditorComponent implements AfterViewInit { sampleCodeUrl = '../assets/text/sample.nf'; } else if (this.editorFilepath === '/nextflow.config') { sampleCodeUrl = '../assets/text/nextflow.config'; + } else if (this.mode === 'yaml') { + if (this.entryType === EntryType.WORKFLOW) { + sampleCodeUrl = '../assets/text/sample-workflow-dockstore.yml'; + } else if (this.entryType === EntryType.APPTOOL) { + sampleCodeUrl = '../assets/text/sample-tool-dockstore.yml'; + } else if (this.entryType === EntryType.NOTEBOOK) { + sampleCodeUrl = '../assets/text/sample-notebook-dockstore.yml'; + } else if (this.entryType === EntryType.SERVICE) { + sampleCodeUrl = '../assets/text/sample-service-dockstore.yml'; + } } } if (sampleCodeUrl) { const httpOptions: Object = { responseType: 'text' }; - this.httpClient.get(sampleCodeUrl, httpOptions).subscribe(setContent); + this.httpClient.get(sampleCodeUrl, httpOptions).subscribe((content: string) => setContent(content, this.readOnly ? -1 : 0)); } else { setContent(this.editorContent, -1); } diff --git a/src/app/shared/constants.ts b/src/app/shared/constants.ts index 2f594d40b4..3d9fdcb359 100644 --- a/src/app/shared/constants.ts +++ b/src/app/shared/constants.ts @@ -27,7 +27,6 @@ export const includesValidation = 'validations'; export const includesVersions = 'versions'; export const includesAuthors = 'authors'; export const includesMetrics = 'metrics'; -export const bootstrap4smallModalSize = '300px'; export const bootstrap4mediumModalSize = '500px'; export const bootstrap4largeModalSize = '800px'; export const bootstrap4extraLargeModalSize = '1140px'; @@ -35,12 +34,7 @@ export const myBioWorkflowsURLSegment = 'my-workflows'; export const myServicesURLSegment = 'my-services'; export const myToolsURLSegment = 'my-tools'; export const myNotebooksURLSegment = 'my-notebooks'; -export const bioWorkflowsURLSegment = 'workflows'; -export const servicesURLSegment = 'services'; -export const toolsURLSegment = 'tools'; -export const notebooksURLSegment = 'notebooks'; export const altAvatarImg = 'http://www.imcslc.ca/imc/includes/themes/imc/images/layout/img_placeholder_avatar.jpg'; -export const devMode = false; export const currentTOSVersion: User.TosversionEnum = User.TosversionEnum.TOSVERSION2; export const currentPrivacyPolicyVersion: User.PrivacyPolicyVersionEnum = User.PrivacyPolicyVersionEnum.PRIVACYPOLICYVERSION25; export const dismissedLatestTOS = 'dismissedLatestTOS'; diff --git a/src/app/shared/container.service.ts b/src/app/shared/container.service.ts index 66a0d62afa..66e7f062ba 100644 --- a/src/app/shared/container.service.ts +++ b/src/app/shared/container.service.ts @@ -15,11 +15,8 @@ */ import { Injectable } from '@angular/core'; import { BehaviorSubject } from 'rxjs'; -import { ExtendedDockstoreToolService } from './extended-dockstoreTool/extended-dockstoreTool.service'; import { DockstoreTool } from './openapi/model/dockstoreTool'; -import { ToolQuery } from './tool/tool.query'; import { ToolService } from './tool/tool.service'; -import { ToolStore } from './tool/tool.store'; /** * This is mostly deprecated in favor of ToolService for the selected tool @@ -33,12 +30,7 @@ export class ContainerService { tools$ = new BehaviorSubject(null); // This contains the list of unsorted tools private copyBtnSource = new BehaviorSubject(null); // This is the currently selected copy button. copyBtn$ = this.copyBtnSource.asObservable(); - constructor( - private toolService: ToolService, - private toolQuery: ToolQuery, - private toolStore: ToolStore, - private extendedDockstoreToolService: ExtendedDockstoreToolService - ) {} + constructor(private toolService: ToolService) {} setTool(tool: any) { this.toolService.setTool(tool); } @@ -96,16 +88,4 @@ export class ContainerService { setCopyBtn(copyBtn: any) { this.copyBtnSource.next(copyBtn); } - - updateActiveTopic(topicManual: string) { - const newTool = { ...this.toolQuery.getActive(), topicManual: topicManual }; - this.toolStore.upsert(newTool.id, newTool); - this.extendedDockstoreToolService.update(newTool); - } - - updateActiveTopicSelection(topicSelection: DockstoreTool.TopicSelectionEnum) { - const newWorkflow = { ...this.toolQuery.getActive(), topicSelection: topicSelection }; - this.toolStore.upsert(newWorkflow.id, newWorkflow); - this.extendedDockstoreToolService.update(newWorkflow); - } } diff --git a/src/app/shared/entry-actions/entry-actions.service.spec.ts b/src/app/shared/entry-actions/entry-actions.service.spec.ts index 0e8181845d..e54824bf53 100644 --- a/src/app/shared/entry-actions/entry-actions.service.spec.ts +++ b/src/app/shared/entry-actions/entry-actions.service.spec.ts @@ -1,18 +1,18 @@ import { inject, TestBed } from '@angular/core/testing'; -import { MatDialog } from '@angular/material/dialog'; +import { MatLegacyDialogModule } from '@angular/material/legacy-dialog'; +import { MatLegacySnackBarModule } from '@angular/material/legacy-snack-bar'; import { ContainersStubService, ContainerStubService, + EntriesStubService, WorkflowsStubService, WorkflowStubService, - EntriesStubService, } from 'app/test/service-stubs'; import { exampleEntry } from '../../test/mocked-objects'; import { ContainerService } from '../container.service'; import { EntryType } from '../enum/entry-type'; -import { CustomMaterialModule } from '../modules/material.module'; +import { ContainersService, DockstoreTool, EntriesService, Entry, Tag, Workflow, WorkflowsService } from '../openapi'; import { WorkflowService } from '../state/workflow.service'; -import { ContainersService, DockstoreTool, Entry, Tag, Workflow, WorkflowsService, EntriesService } from '../openapi'; import { EntryActionsService } from './entry-actions.service'; describe('Service: EntryActionsService', () => { @@ -41,7 +41,7 @@ describe('Service: EntryActionsService', () => { useClass: EntriesStubService, }, ], - imports: [CustomMaterialModule], + imports: [MatLegacySnackBarModule, MatLegacyDialogModule], }); }); @@ -49,6 +49,7 @@ describe('Service: EntryActionsService', () => { expect(service).toBeTruthy(); })); it('should know if entry is hosted', inject([EntryActionsService], (service: EntryActionsService) => { + expect(DockstoreTool.ModeEnum.HOSTED).toBe(Workflow.ModeEnum.HOSTED); // Both values should be the same expect(service.isEntryHosted(null)).toBeTruthy(); const dockstoreTool = {}; dockstoreTool.mode = DockstoreTool.ModeEnum.HOSTED; diff --git a/src/app/shared/entry-actions/entry-actions.service.ts b/src/app/shared/entry-actions/entry-actions.service.ts index 81ab410c21..42101f7b7b 100644 --- a/src/app/shared/entry-actions/entry-actions.service.ts +++ b/src/app/shared/entry-actions/entry-actions.service.ts @@ -1,6 +1,6 @@ import { HttpErrorResponse } from '@angular/common/http'; import { Injectable, EventEmitter } from '@angular/core'; -import { MatDialog } from '@angular/material/dialog'; +import { MatLegacyDialog as MatDialog } from '@angular/material/legacy-dialog'; import { AlertService } from '../alert/state/alert.service'; import { includesAuthors, includesVersions } from '../constants'; import { ContainerService } from '../container.service'; diff --git a/src/app/shared/entry-actions/tool-actions.component.ts b/src/app/shared/entry-actions/tool-actions.component.ts index de79fa3153..145098578f 100644 --- a/src/app/shared/entry-actions/tool-actions.component.ts +++ b/src/app/shared/entry-actions/tool-actions.component.ts @@ -4,11 +4,19 @@ import { RefreshService } from '../refresh.service'; import { DockstoreTool, Tag } from '../openapi'; import { EntryActionsComponent } from './entry-actions.component'; import { EntryActionsService } from './entry-actions.service'; +import { ModalComponent } from '../../container/deregister-modal/deregister-modal.component'; +import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; +import { RouterLink } from '@angular/router'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { NgIf, AsyncPipe } from '@angular/common'; @Component({ selector: 'app-tool-actions', templateUrl: './tool-actions.component.html', styleUrls: ['./entry-actions.component.scss'], + standalone: true, + imports: [NgIf, FlexModule, MatLegacyButtonModule, RouterLink, MatLegacyTooltipModule, ModalComponent, AsyncPipe], }) export class ToolActionsComponent extends EntryActionsComponent implements OnInit, OnChanges { @Input() tool: DockstoreTool; diff --git a/src/app/shared/entry-actions/workflow-actions.component.ts b/src/app/shared/entry-actions/workflow-actions.component.ts index e352d74359..37833de1b2 100644 --- a/src/app/shared/entry-actions/workflow-actions.component.ts +++ b/src/app/shared/entry-actions/workflow-actions.component.ts @@ -1,5 +1,5 @@ import { Component, Input, Output, EventEmitter, OnChanges, OnInit, SimpleChanges } from '@angular/core'; -import { MatDialog } from '@angular/material/dialog'; +import { MatLegacyDialog as MatDialog } from '@angular/material/legacy-dialog'; import { Observable } from 'rxjs'; import { AlertQuery } from '../alert/state/alert.query'; import { ga4ghServiceIdPrefix, ga4ghWorkflowIdPrefix } from '../constants'; @@ -13,11 +13,18 @@ import { EntryActionsComponent } from './entry-actions.component'; import { EntryActionsService } from './entry-actions.service'; import { DeleteEntryDialogComponent } from '../../entry/delete/dialog/delete-entry-dialog.component'; import { bootstrap4largeModalSize } from '../../shared/constants'; +import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; +import { RouterLink } from '@angular/router'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { NgIf, AsyncPipe } from '@angular/common'; @Component({ selector: 'app-workflow-actions', templateUrl: './workflow-actions.component.html', styleUrls: ['./entry-actions.component.scss'], + standalone: true, + imports: [NgIf, FlexModule, MatLegacyButtonModule, RouterLink, MatLegacyTooltipModule, AsyncPipe], }) export class WorkflowActionsComponent extends EntryActionsComponent implements OnInit, OnChanges { @Input() workflow: BioWorkflow | Service | Notebook; diff --git a/src/app/shared/entry-to-display-name.pipe.ts b/src/app/shared/entry-to-display-name.pipe.ts index 6d6a59f69b..fe14cc407d 100644 --- a/src/app/shared/entry-to-display-name.pipe.ts +++ b/src/app/shared/entry-to-display-name.pipe.ts @@ -7,6 +7,7 @@ import { DockstoreTool, Workflow } from './openapi'; */ @Pipe({ name: 'entryToDisplayName', + standalone: true, }) export class EntryToDisplayNamePipe implements PipeTransform { transform(entry: DockstoreTool | Workflow): string { diff --git a/src/app/shared/entry-wizard.module.ts b/src/app/shared/entry-wizard.module.ts deleted file mode 100644 index 949639abd7..0000000000 --- a/src/app/shared/entry-wizard.module.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { FormsModule } from '@angular/forms'; -import { EntryWizardComponent } from './entry-wizard/entry-wizard.component'; -import { CustomMaterialModule } from './modules/material.module'; - -@NgModule({ - imports: [CommonModule, CustomMaterialModule, FormsModule], - declarations: [EntryWizardComponent], - exports: [EntryWizardComponent], -}) -export class EntryWizardModule {} diff --git a/src/app/shared/entry-wizard/entry-wizard.component.ts b/src/app/shared/entry-wizard/entry-wizard.component.ts index ac9e7a576d..d111fa5141 100644 --- a/src/app/shared/entry-wizard/entry-wizard.component.ts +++ b/src/app/shared/entry-wizard/entry-wizard.component.ts @@ -1,15 +1,35 @@ import { Component, OnInit } from '@angular/core'; -import { MatSlideToggleChange } from '@angular/material/slide-toggle'; +import { MatLegacySlideToggleChange as MatSlideToggleChange, MatLegacySlideToggleModule } from '@angular/material/legacy-slide-toggle'; import { Observable } from 'rxjs'; import { map } from 'rxjs/operators'; import { Repository } from '../openapi/model/repository'; import { EntryWizardQuery } from '../state/entry-wizard.query'; import { EntryWizardService } from '../state/entry-wizard.service'; +import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; +import { MatLegacyOptionModule } from '@angular/material/legacy-core'; +import { FormsModule } from '@angular/forms'; +import { MatLegacySelectModule } from '@angular/material/legacy-select'; +import { MatLegacyFormFieldModule } from '@angular/material/legacy-form-field'; +import { MatLegacyProgressBarModule } from '@angular/material/legacy-progress-bar'; +import { NgIf, NgFor, AsyncPipe } from '@angular/common'; @Component({ selector: 'app-entry-wizard', templateUrl: './entry-wizard.component.html', styleUrls: ['./entry-wizard.component.scss'], + standalone: true, + imports: [ + NgIf, + MatLegacyProgressBarModule, + MatLegacyFormFieldModule, + MatLegacySelectModule, + FormsModule, + NgFor, + MatLegacyOptionModule, + MatLegacySlideToggleModule, + MatLegacyTooltipModule, + AsyncPipe, + ], }) export class EntryWizardComponent implements OnInit { isLoading$: Observable; diff --git a/src/app/shared/entry.ts b/src/app/shared/entry.ts index e085d9a086..1d1d105454 100644 --- a/src/app/shared/entry.ts +++ b/src/app/shared/entry.ts @@ -17,11 +17,11 @@ import { Location } from '@angular/common'; import { HttpErrorResponse } from '@angular/common/http'; import { Directive, Injectable, Input, OnDestroy, ViewChild } from '@angular/core'; import { UntypedFormControl, Validators } from '@angular/forms'; -import { MatChipInputEvent } from '@angular/material/chips'; -import { MatTabChangeEvent, MatTabGroup } from '@angular/material/tabs'; +import { MatLegacyChipInputEvent as MatChipInputEvent } from '@angular/material/legacy-chips'; +import { MatLegacyTabChangeEvent as MatTabChangeEvent, MatLegacyTabGroup as MatTabGroup } from '@angular/material/legacy-tabs'; import { ActivatedRoute, NavigationEnd, Params, Router, RouterEvent } from '@angular/router'; import { Observable, Subject } from 'rxjs'; -import { filter, takeUntil } from 'rxjs/operators'; +import { filter, map, takeUntil } from 'rxjs/operators'; import { EntryCategoriesService } from '../categories/state/entry-categories.service'; import { Dockstore } from '../shared/dockstore.model'; import { Category, EntriesService, VersionVerifiedPlatform, SourceFile } from '../shared/openapi'; @@ -98,6 +98,7 @@ export abstract class Entry implements OnDestro this.router.events .pipe( filter((event) => event instanceof NavigationEnd), + map((event) => event as NavigationEnd), takeUntil(this.ngUnsubscribe) ) .subscribe((event: RouterEvent) => { @@ -412,11 +413,9 @@ export abstract class Entry implements OnDestro * Will decode the URL * @return {void} */ - decodeURL(type: string): void { - const url = decodeURIComponent(window.location.href); - const containersIndex = this.getIndexInURL('/' + type); - const newPath = url.substring(containersIndex); - this.location.replaceState(newPath); + decodeURL(): void { + const url = decodeURIComponent(window.location.pathname); + this.location.replaceState(url); } /** @@ -442,11 +441,7 @@ export abstract class Entry implements OnDestro redirectToCanonicalURL(myPage: string): void { if (this.getIndexInURL(myPage) === -1) { // Decode the URL - this.decodeURL(this._toolType); - - // Get index of /containers or /workflows - // TODO: Not sure why getPageIndex() returns anything, but does need to get called to change URL. - this.getPageIndex(); + this.decodeURL(); } } @@ -484,12 +479,6 @@ export abstract class Entry implements OnDestro })(); } - /** - * Gets the index of /containers or /workflows from the URL - * @return {number} - */ - abstract getPageIndex(): number; - /** * Go to the search page with a query preloaded * @param {string} searchValue Value to search for diff --git a/src/app/shared/entry/base-url.pipe.ts b/src/app/shared/entry/base-url.pipe.ts index afcd2c392a..c0dcccd770 100644 --- a/src/app/shared/entry/base-url.pipe.ts +++ b/src/app/shared/entry/base-url.pipe.ts @@ -2,6 +2,7 @@ import { Pipe, PipeTransform } from '@angular/core'; @Pipe({ name: 'baseUrl', + standalone: true, }) export class BaseUrlPipe implements PipeTransform { /** diff --git a/src/app/shared/entry/commit-url.pipe.ts b/src/app/shared/entry/commit-url.pipe.ts index 1af461154b..3e4c56ff6d 100644 --- a/src/app/shared/entry/commit-url.pipe.ts +++ b/src/app/shared/entry/commit-url.pipe.ts @@ -2,6 +2,7 @@ import { Pipe, PipeTransform } from '@angular/core'; @Pipe({ name: 'commitUrl', + standalone: true, }) export class CommitUrlPipe implements PipeTransform { transform(commitId: string, providerUrl: string): string { diff --git a/src/app/shared/entry/descriptor-language-versions.pipe.ts b/src/app/shared/entry/descriptor-language-versions.pipe.ts index 43cb01bb8d..0678528bc6 100644 --- a/src/app/shared/entry/descriptor-language-versions.pipe.ts +++ b/src/app/shared/entry/descriptor-language-versions.pipe.ts @@ -2,18 +2,30 @@ import { Pipe, PipeTransform } from '@angular/core'; @Pipe({ name: 'descriptorLanguageVersions', + standalone: true, }) export class DescriptorLanguageVersionsPipe implements PipeTransform { /** - * Creates a string containing the descriptor language and descriptor language versions + * Creates a string containing the descriptor language or engine versions, and the descriptor language if specified by showDescriptorLanguage * @param descriptorLanguage - * @param descriptorLanguageVersions + * @param descriptorLanguageOrEngineVersions + * @param showDescriptorLanguage whether or not the descriptor language should be included in the resulting string * @returns */ - transform(descriptorLanguage: string, descriptorLanguageVersions: Array): string { - if (descriptorLanguageVersions && descriptorLanguageVersions.length > 0) { - const languageVersions = [...descriptorLanguageVersions]; - return descriptorLanguage + ' ' + languageVersions.sort().join(', '); + transform(descriptorLanguage: string, descriptorLanguageOrEngineVersions: Array, showDescriptorLanguage: boolean = true): string { + if (descriptorLanguageOrEngineVersions && descriptorLanguageOrEngineVersions.length > 0) { + const versions = [...descriptorLanguageOrEngineVersions]; + if (showDescriptorLanguage) { + return descriptorLanguage + ' ' + versions.sort().join(', '); + } else { + // Remove the descriptor language from the version if it exists. Ex: 'Nextflow !>=23.04.0' -> '!>=23.04.0' + return versions + .map((version) => { + return version.replace(descriptorLanguage + ' ', ''); + }) + .sort() + .join(', '); + } } return ''; } diff --git a/src/app/shared/entry/descriptor-language-versions.spec.ts b/src/app/shared/entry/descriptor-language-versions.spec.ts index 428596471c..1b52a39f92 100644 --- a/src/app/shared/entry/descriptor-language-versions.spec.ts +++ b/src/app/shared/entry/descriptor-language-versions.spec.ts @@ -7,5 +7,7 @@ describe('Pipe: DescriptorLanguageVersionsPipe', () => { expect(pipe.transform('WDL', ['1.0, 1.1'])).toBe('WDL 1.0, 1.1'); expect(pipe.transform('CWL', ['v1.0'])).toBe('CWL v1.0'); expect(pipe.transform('WDL', [])).toBe(''); + expect(pipe.transform('Nextflow', ['Nextflow >=0.32.0', 'Nextflow !>=23.04.0'], false)).toBe('!>=23.04.0, >=0.32.0'); + expect(pipe.transform('Nextflow', ['Nextflow >=0.32.0'], false)).toBe('>=0.32.0'); }); }); diff --git a/src/app/shared/entry/descriptor-language.pipe.ts b/src/app/shared/entry/descriptor-language.pipe.ts index be955ac018..ed3111fc2d 100644 --- a/src/app/shared/entry/descriptor-language.pipe.ts +++ b/src/app/shared/entry/descriptor-language.pipe.ts @@ -4,6 +4,7 @@ import { Workflow } from '../../shared/openapi'; @Pipe({ name: 'descriptorLanguage', + standalone: true, }) export class DescriptorLanguagePipe implements PipeTransform { /** diff --git a/src/app/shared/entry/descriptor-language.service.spec.ts b/src/app/shared/entry/descriptor-language.service.spec.ts index add123f201..d1e0410f12 100644 --- a/src/app/shared/entry/descriptor-language.service.spec.ts +++ b/src/app/shared/entry/descriptor-language.service.spec.ts @@ -28,23 +28,24 @@ describe('Service: DescriptorLanguage', () => { it('should return the descriptor languages in an string array', () => { const stubValue: Array = [{ value: 'cwl' }, { value: 'wdl' }, { value: 'nextflow' }]; metadataServiceSpy.getDescriptorLanguages.and.returnValue(observableOf(stubValue)); + workflowQuerySpy.entryType$ = observableOf('workflow'); const descriptorLanguageService = new DescriptorLanguageService(metadataServiceSpy, workflowQuerySpy); descriptorLanguageService.filteredDescriptorLanguages$.pipe(first()).subscribe((languages: Array) => { expect(languages).toEqual(['cwl', 'wdl', 'nextflow'], 'service returned stub value'); }); }); - it('should be able to filter service out', () => { + it('should be able to filter service and notebook out', () => { const descriptorLanguageBeans: DescriptorLanguageBean[] = []; descriptorLanguageBeans.push({ friendlyName: 'potato', value: 'potato' }); descriptorLanguageBeans.push({ friendlyName: 'beef', value: 'beef' }); descriptorLanguageBeans.push({ friendlyName: 'stew', value: 'stew' }); descriptorLanguageBeans.push({ friendlyName: 'generic placeholder for services', value: 'service' }); + descriptorLanguageBeans.push({ friendlyName: 'generic placeholder for notebooks', value: 'jupyter' }); metadataServiceSpy.getDescriptorLanguages.and.returnValue(observableOf(descriptorLanguageBeans)); + workflowQuerySpy.entryType$ = observableOf('workflow'); const descriptorLanguageService = new DescriptorLanguageService(metadataServiceSpy, workflowQuerySpy); - const filteredDescriptorLanguageBeans = descriptorLanguageService.filterService(descriptorLanguageBeans); - expect(filteredDescriptorLanguageBeans.length).toEqual(3); - filteredDescriptorLanguageBeans.forEach((descriptorLanguageBean) => { - expect(descriptorLanguageBean.value).not.toEqual(descriptorLanguageService.knownServiceValue); + descriptorLanguageService.filteredDescriptorLanguages$.pipe(first()).subscribe((languages: Array) => { + expect(languages).toEqual(['potato', 'beef', 'stew'], 'service returned stub value'); }); }); it('should be able to get home page inner HTML', () => { @@ -105,13 +106,13 @@ describe('Service: DescriptorLanguage', () => { metadataServiceSpy.getDescriptorLanguages.and.returnValue(observableOf(descriptorLanguageBeans)); const descriptorLanguageService = new DescriptorLanguageService(metadataServiceSpy, workflowQuerySpy); let placeholder = descriptorLanguageService.getDescriptorPattern(ToolDescriptor.TypeEnum.SMK); - expect(placeholder).toEqual('^/([^/?:*|<>]++/)*(Snakefile|[^./?:*|<>]++.smk))$'); + expect(placeholder).toEqual('^\\/([^\\/?:*\\|<>]+\\/)*(Snakefile|[^.\\/?:*\\|<>]+.smk)$'); placeholder = descriptorLanguageService.getDescriptorPattern(ToolDescriptor.TypeEnum.CWL); - expect(placeholder).toEqual('^/([^/?:*|<>]+/)*[^/?:*|<>]+.(cwl|yaml|yml)'); + expect(placeholder).toEqual('^\\/([^\\/?:*\\|<>]+\\/)*[^\\/?:*\\|<>]+.(cwl|yaml|yml)$'); placeholder = descriptorLanguageService.getDescriptorPattern(ToolDescriptor.TypeEnum.WDL); - expect(placeholder).toEqual('^/([^/?:*|<>]+/)*[^/?:*|<>]+.wdl$'); + expect(placeholder).toEqual('^\\/([^\\/?:*\\|<>]+\\/)*[^\\/?:*\\|<>]+.wdl$'); placeholder = descriptorLanguageService.getDescriptorPattern(ToolDescriptor.TypeEnum.NFL); - expect(placeholder).toEqual('^/([^/?:*|<>]+/)*[^/?:*|<>]+.(config)'); + expect(placeholder).toEqual('^\\/([^\\/?:*\\|<>]+\\/)*[^\\/?:*\\|<>]+.(config)$'); placeholder = descriptorLanguageService.getDescriptorPattern(ToolDescriptor.TypeEnum.SERVICE); expect(placeholder).toEqual('.*'); placeholder = descriptorLanguageService.getDescriptorPattern('UnrecognizedType'); diff --git a/src/app/shared/entry/descriptor-language.service.ts b/src/app/shared/entry/descriptor-language.service.ts index 9be4302da9..88020e0e19 100644 --- a/src/app/shared/entry/descriptor-language.service.ts +++ b/src/app/shared/entry/descriptor-language.service.ts @@ -34,8 +34,6 @@ export class DescriptorLanguageService { readonly knownServiceValue = 'service'; public descriptorLanguages$: Observable>; - public descriptorLanguagesInnerHTML$: Observable; - public noService$: Observable; private descriptorLanguagesBean$ = new BehaviorSubject([]); public filteredDescriptorLanguages$: Observable>; constructor(private metadataService: MetadataService, private sessionQuery: SessionQuery) { @@ -47,10 +45,6 @@ export class DescriptorLanguageService { } }) ); - this.noService$ = this.descriptorLanguagesBean$.pipe(map((beans) => this.filterService(beans))); - this.descriptorLanguagesInnerHTML$ = this.noService$.pipe( - map((descriptorLanguageBeans: DescriptorLanguageBean[]) => this.getDescriptorLanguagesInnerHTML(descriptorLanguageBeans)) - ); const combined$ = combineLatest([this.descriptorLanguages$, this.sessionQuery.entryType$]); this.filteredDescriptorLanguages$ = combined$.pipe(map((combined) => this.filterLanguages(combined[0], combined[1]))); } @@ -233,17 +227,6 @@ export class DescriptorLanguageService { } } - /** - * Certain pages ignore the 'service' descriptor language completely, this filters it out of the known languages - * - * @param {DescriptorLanguageBean[]} beans Descriptor language bean returned from the metadata endpoint - * @returns {DescriptorLanguageBean[]} Filtered list of languages that do not have 'service' in it - * @memberof DescriptorLanguageService - */ - filterService(beans: DescriptorLanguageBean[]): DescriptorLanguageBean[] { - return beans.filter((bean) => bean.value !== this.knownServiceValue); - } - /** * Some entries are not meant to show all descriptor types * @@ -254,7 +237,11 @@ export class DescriptorLanguageService { */ filterLanguages(descriptorTypes: Workflow.DescriptorTypeEnum[], entryType: EntryType): Workflow.DescriptorTypeEnum[] { if (entryType === EntryType.BioWorkflow || entryType === EntryType.Tool || !entryType) { - return descriptorTypes.filter((descriptorType) => descriptorType !== Workflow.DescriptorTypeEnum.Service); + return descriptorTypes.filter( + (descriptorType) => descriptorType !== Workflow.DescriptorTypeEnum.Service && descriptorType !== Workflow.DescriptorTypeEnum.Jupyter + ); + } else if (entryType === EntryType.Notebook) { + return [Workflow.DescriptorTypeEnum.Jupyter]; } else { return [Workflow.DescriptorTypeEnum.Service]; } diff --git a/src/app/shared/entry/doi/doi-badge/doi-badge.component.html b/src/app/shared/entry/doi/doi-badge/doi-badge.component.html new file mode 100644 index 0000000000..111b7ac279 --- /dev/null +++ b/src/app/shared/entry/doi/doi-badge/doi-badge.component.html @@ -0,0 +1,32 @@ + + small Dockstore logo + small GitHub logo + account_circle + + + {{ doi.name }} + diff --git a/src/app/shared/entry/doi/doi-badge/doi-badge.component.ts b/src/app/shared/entry/doi/doi-badge/doi-badge.component.ts new file mode 100644 index 0000000000..1d0b87aa47 --- /dev/null +++ b/src/app/shared/entry/doi/doi-badge/doi-badge.component.ts @@ -0,0 +1,27 @@ +import { NgIf } from '@angular/common'; +import { Component, Input } from '@angular/core'; +import { MatIconModule } from '@angular/material/icon'; +import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; +import { Dockstore } from 'app/shared/dockstore.model'; +import { Doi } from 'app/shared/openapi'; + +@Component({ + selector: 'app-doi-badge', + templateUrl: './doi-badge.component.html', + styleUrls: [], + standalone: true, + imports: [MatLegacyTooltipModule, NgIf, MatIconModule], +}) +export class DoiBadgeComponent { + Dockstore = Dockstore; + DoiInitiator = Doi.InitiatorEnum; + DoiType = Doi.TypeEnum; + zenodoUrl: string; + @Input() doi: Doi; + @Input() displayInitiator: boolean = true; + @Input() displayDoi: boolean = true; + + constructor() { + this.zenodoUrl = Dockstore.ZENODO_AUTH_URL ? Dockstore.ZENODO_AUTH_URL.replace('oauth/authorize', '') : ''; + } +} diff --git a/src/app/shared/entry/doi/manage-dois/manage-dois-dialog.component.html b/src/app/shared/entry/doi/manage-dois/manage-dois-dialog.component.html new file mode 100644 index 0000000000..13c8b6fcd9 --- /dev/null +++ b/src/app/shared/entry/doi/manage-dois/manage-dois-dialog.component.html @@ -0,0 +1,47 @@ +

    Manage DOIs

    + +

    + A Digital Object Identifier (DOI) allows a {{ entryTypeMetadata.term }} version to be easily cited in publications. There are two types + of DOIs: +

    +
      +
    • Version DOI: represents a specific version.
    • +
    • Concept DOI: represents all versions and resolves to the latest one.
    • +
    + + info This {{ entryTypeMetadata.term }} has no DOIs. + +

    Select which DOI to display publicly:

    + + + +
    + + {{ doiInfo.key | titlecase }} +
    +
    +
    +
    + Manually created by a user in the Dockstore UI. + + Automatically created by Dockstore for valid tags belonging to published {{ entryTypeMetadata.termPlural }}. + + Created by Zenodo's integration with GitHub. +
    + + Version DOI: + + n/a + + + Concept DOI: + + +
    +
    +
    +
    +
    + + +
    diff --git a/src/app/shared/entry/doi/manage-dois/manage-dois-dialog.component.ts b/src/app/shared/entry/doi/manage-dois/manage-dois-dialog.component.ts new file mode 100644 index 0000000000..595d86aa62 --- /dev/null +++ b/src/app/shared/entry/doi/manage-dois/manage-dois-dialog.component.ts @@ -0,0 +1,81 @@ +import { KeyValue, KeyValuePipe, NgFor, NgIf, TitleCasePipe } from '@angular/common'; +import { Component, Inject } from '@angular/core'; +import { FormsModule } from '@angular/forms'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { MatLegacyCardModule } from '@angular/material/legacy-card'; +import { MAT_LEGACY_DIALOG_DATA, MatLegacyDialogModule, MatLegacyDialogRef } from '@angular/material/legacy-dialog'; +import { MatLegacyRadioModule } from '@angular/material/legacy-radio'; +import { FlexModule } from '@ngbracket/ngx-layout'; +import { Doi, EntryTypeMetadata, Workflow, WorkflowVersion } from 'app/shared/openapi'; +import { ManageDoisDialogService } from './manage-dois-dialog.service'; +import { MatIconModule } from '@angular/material/icon'; +import { DoiBadgeComponent } from '../doi-badge/doi-badge.component'; + +export interface ManageDoisDialogData { + entry: Workflow; + version: WorkflowVersion; +} + +export interface DoiInfo { + initiator: Doi.InitiatorEnum; + conceptDoi: Doi; + versionDoi: Doi | undefined; +} + +@Component({ + selector: 'app-manage-dois-dialog', + templateUrl: './manage-dois-dialog.component.html', + styleUrls: ['../../../styles/radio-button-cards.scss'], + standalone: true, + imports: [ + MatLegacyDialogModule, + MatLegacyButtonModule, + MatLegacyCardModule, + MatLegacyRadioModule, + MatIconModule, + FlexModule, + FormsModule, + NgIf, + NgFor, + KeyValuePipe, + TitleCasePipe, + DoiBadgeComponent, + ], +}) +export class ManageDoisDialogComponent { + DoiInitiatorEnum = Doi.InitiatorEnum; + entry: Workflow; + entryTypeMetadata: EntryTypeMetadata; + selectedOption: Doi.InitiatorEnum; + doiInfoMap: Map = new Map(); + + constructor( + public dialogRef: MatLegacyDialogRef, + public manageDoisDialogService: ManageDoisDialogService, + @Inject(MAT_LEGACY_DIALOG_DATA) public data: ManageDoisDialogData + ) { + this.entry = data.entry; + this.entryTypeMetadata = data.entry.entryTypeMetadata; + this.selectedOption = data.entry.doiSelection; + Object.entries(data.entry.conceptDois).forEach(([initiator, conceptDoi]) => { + let initiatorEnum = Object.keys(Doi.InitiatorEnum).find((i) => Doi.InitiatorEnum[i] === initiator); + let versionDoi = data.version?.dois[initiator]; + this.doiInfoMap.set(Doi.InitiatorEnum[initiatorEnum], { + initiator: Doi.InitiatorEnum[initiatorEnum], + conceptDoi: conceptDoi, + versionDoi: versionDoi, + }); + }); + } + + saveDoiSelection() { + this.manageDoisDialogService.saveDoiSelection(this.entry, this.selectedOption); + } + + /** + * To prevent the Angular's keyvalue pipe from sorting by key + */ + originalOrder = (a: KeyValue, b: KeyValue): number => { + return 0; + }; +} diff --git a/src/app/shared/entry/doi/manage-dois/manage-dois-dialog.service.ts b/src/app/shared/entry/doi/manage-dois/manage-dois-dialog.service.ts new file mode 100644 index 0000000000..3883b8c62d --- /dev/null +++ b/src/app/shared/entry/doi/manage-dois/manage-dois-dialog.service.ts @@ -0,0 +1,32 @@ +import { Injectable } from '@angular/core'; +import { AlertService } from '../../../alert/state/alert.service'; +import { Doi, Workflow, WorkflowsService } from '../../../openapi'; +import { WorkflowService } from '../../../state/workflow.service'; +import { WorkflowQuery } from 'app/shared/state/workflow.query'; +import { InfoTabService } from 'app/workflow/info-tab/info-tab.service'; + +@Injectable() +export class ManageDoisDialogService { + constructor( + private alertService: AlertService, + private workflowsService: WorkflowsService, + private workflowService: WorkflowService, + private workflowQuery: WorkflowQuery, + private infoTabService: InfoTabService + ) {} + + saveDoiSelection(entry: Workflow, doiSelection: Doi.InitiatorEnum) { + this.alertService.start('Saving DOI selection'); + const newEntryForUpdate = this.infoTabService.getPartialEntryForUpdate({ ...entry, doiSelection: doiSelection }); + + this.workflowsService.updateWorkflow(entry.id, newEntryForUpdate).subscribe( + (response) => { + this.alertService.detailedSuccess(); + this.workflowService.setWorkflow({ ...this.workflowQuery.getActive(), doiSelection: response.doiSelection }); + }, + (error) => { + this.alertService.detailedError(error); + } + ); + } +} diff --git a/src/app/shared/entry/entry.module.ts b/src/app/shared/entry/entry.module.ts index 4e6745c35e..69ea97fcb0 100644 --- a/src/app/shared/entry/entry.module.ts +++ b/src/app/shared/entry/entry.module.ts @@ -16,22 +16,19 @@ import { ClipboardModule } from '@angular/cdk/clipboard'; import { CommonModule } from '@angular/common'; import { NgModule } from '@angular/core'; -import { FlexLayoutModule } from '@angular/flex-layout'; +import { FlexLayoutModule } from '@ngbracket/ngx-layout'; import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import { RouterModule } from '@angular/router'; import { ShareButtonsModule } from 'ngx-sharebuttons/buttons'; import { ShareIconsModule } from 'ngx-sharebuttons/icons'; -import { RefreshAlertModule } from '../alert/alert.module'; -import { AvailableLogsModule } from '../available-logs.module'; + import { BioschemaService } from '../bioschema.service'; import { CodeEditorListComponent } from '../code-editor-list/code-editor-list.component'; import { CodeEditorComponent } from '../code-editor/code-editor.component'; import { EntryActionsService } from '../entry-actions/entry-actions.service'; import { PublicFileDownloadPipe } from '../entry/public-file-download.pipe'; -import { JsonLdModule } from '../modules/json-ld.module'; -import { CustomMaterialModule } from '../modules/material.module'; -import { SnackbarModule } from '../modules/snackbar.module'; + import { CommitUrlPipe } from './commit-url.pipe'; import { InfoTabCheckerWorkflowPathComponent } from './info-tab-checker-workflow-path/info-tab-checker-workflow-path.component'; import { LaunchCheckerWorkflowComponent } from './launch-checker-workflow/launch-checker-workflow.component'; @@ -45,19 +42,12 @@ import { VersionProviderUrlPipe } from './versionProviderUrl.pipe'; @NgModule({ imports: [ - AvailableLogsModule, CommonModule, FormsModule, - CustomMaterialModule, FlexLayoutModule, - JsonLdModule, ClipboardModule, RouterModule, ReactiveFormsModule, - RefreshAlertModule, - SnackbarModule, - ], - declarations: [ InfoTabCheckerWorkflowPathComponent, RegisterCheckerWorkflowComponent, LaunchCheckerWorkflowComponent, @@ -76,16 +66,12 @@ import { VersionProviderUrlPipe } from './versionProviderUrl.pipe'; LaunchCheckerWorkflowComponent, CodeEditorComponent, CodeEditorListComponent, - CustomMaterialModule, CommitUrlPipe, FlexLayoutModule, VerifiedByComponent, - VerifiedDisplayComponent, VerifiedPlatformsPipe, VersionProviderUrlPipe, PublicFileDownloadPipe, - JsonLdModule, - RefreshAlertModule, ShareButtonsModule, ShareIconsModule, UrlDeconstructPipe, diff --git a/src/app/shared/entry/execution-status.pipe.ts b/src/app/shared/entry/execution-status.pipe.ts index 33407f44f2..72e1a8b37f 100644 --- a/src/app/shared/entry/execution-status.pipe.ts +++ b/src/app/shared/entry/execution-status.pipe.ts @@ -4,6 +4,7 @@ import ExecutionStatusEnum = RunExecution.ExecutionStatusEnum; @Pipe({ name: 'executionStatus', + standalone: true, }) export class ExecutionStatusPipe implements PipeTransform { /** diff --git a/src/app/shared/entry/info-tab-checker-workflow-path/info-tab-checker-workflow-path.component.html b/src/app/shared/entry/info-tab-checker-workflow-path/info-tab-checker-workflow-path.component.html index b039035408..ca59adb880 100644 --- a/src/app/shared/entry/info-tab-checker-workflow-path/info-tab-checker-workflow-path.component.html +++ b/src/app/shared/entry/info-tab-checker-workflow-path/info-tab-checker-workflow-path.component.html @@ -1,4 +1,4 @@ -
  • +
  • Checker Workflow: @@ -15,7 +15,7 @@ > visibility View - + +
    diff --git a/src/app/shared/entry/info-tab-topic/display-topic/display-topic.component.spec.ts b/src/app/shared/entry/info-tab-topic/display-topic/display-topic.component.spec.ts new file mode 100644 index 0000000000..2d4bfe6f39 --- /dev/null +++ b/src/app/shared/entry/info-tab-topic/display-topic/display-topic.component.spec.ts @@ -0,0 +1,48 @@ +/* + * Copyright 2024 OICR and UCSC + * + * Licensed under the Apache License, Version 2.0 (the "License") + * you may not use this file except in compliance with the License + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; + +import { DisplayTopicComponent } from './display-topic.component'; +import { EntryTypeMetadataStubService } from 'app/test/service-stubs'; +import { MatLegacyDialogModule } from '@angular/material/legacy-dialog'; +import { EntryTypeMetadataService } from 'app/entry/type-metadata/entry-type-metadata.service'; +import { sampleWorkflow1 } from 'app/test/mocked-objects'; + +describe('DisplayTopicComponent', () => { + let component: DisplayTopicComponent; + let fixture: ComponentFixture; + + beforeEach( + waitForAsync(() => { + TestBed.configureTestingModule({ + providers: [{ provide: EntryTypeMetadataService, useClass: EntryTypeMetadataStubService }], + imports: [MatLegacyDialogModule, DisplayTopicComponent], + }).compileComponents(); + }) + ); + + beforeEach(() => { + fixture = TestBed.createComponent(DisplayTopicComponent); + component = fixture.componentInstance; + component.entry = sampleWorkflow1; + component.disableEditing = false; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/shared/entry/info-tab-topic/display-topic/display-topic.component.ts b/src/app/shared/entry/info-tab-topic/display-topic/display-topic.component.ts new file mode 100644 index 0000000000..afe061932e --- /dev/null +++ b/src/app/shared/entry/info-tab-topic/display-topic/display-topic.component.ts @@ -0,0 +1,61 @@ +import { AsyncPipe, NgIf, TitleCasePipe } from '@angular/common'; +import { Component, Input, OnDestroy, OnInit } from '@angular/core'; +import { MatIconModule } from '@angular/material/icon'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { MatLegacyDialog } from '@angular/material/legacy-dialog'; +import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; +import { Base } from 'app/shared/base'; +import { DockstoreTool, Entry, EntryTypeMetadata, Workflow } from 'app/shared/openapi'; +import { SessionQuery } from 'app/shared/session/session.query'; +import { Observable } from 'rxjs'; +import { EditTopicDialogComponent } from '../edit-topic/edit-topic-dialog.component'; +import { bootstrap4largeModalSize } from 'app/shared/constants'; +import { AiBubbleComponent } from 'app/shared/ai-bubble/ai-bubble.component'; +import { FlexModule } from '@ngbracket/ngx-layout'; + +@Component({ + selector: 'app-display-topic', + templateUrl: './display-topic.component.html', + styleUrls: ['../../../styles/info-tab.component.scss'], + standalone: true, + imports: [NgIf, MatLegacyTooltipModule, MatLegacyButtonModule, MatIconModule, AsyncPipe, AiBubbleComponent, FlexModule, TitleCasePipe], +}) +export class DisplayTopicComponent extends Base implements OnInit, OnDestroy { + TopicSelectionEnum = Entry.TopicSelectionEnum; + isPublic$: Observable; + isGitHubAppEntry: boolean; + entryTypeMetadata: EntryTypeMetadata; + selectedTopic: string; + @Input() entry: DockstoreTool | Workflow; + @Input() disableEditing: boolean; + constructor(private sessionQuery: SessionQuery, private dialog: MatLegacyDialog) { + super(); + } + + ngOnInit(): void { + this.isPublic$ = this.sessionQuery.isPublic$; + this.entryTypeMetadata = this.entry.entryTypeMetadata; + this.isGitHubAppEntry = (this.entry as Workflow).mode === Workflow.ModeEnum.DOCKSTOREYML; // Only Workflow has DOCKSTOREYML ModeEnum + } + + ngOnChanges(): void { + this.selectedTopic = this.getSelectedTopic(); + } + + editTopic() { + this.dialog.open(EditTopicDialogComponent, { width: bootstrap4largeModalSize, data: { entry: this.entry } }); + } + + private getSelectedTopic(): string | null { + switch (this.entry.topicSelection) { + case this.TopicSelectionEnum.MANUAL: + return this.entry.topicManual; + case this.TopicSelectionEnum.AUTOMATIC: + return this.entry.topicAutomatic; + case this.TopicSelectionEnum.AI: + return this.entry.topicAI; + default: + return null; + } + } +} diff --git a/src/app/shared/entry/info-tab-topic/edit-topic/edit-topic-dialog.component.html b/src/app/shared/entry/info-tab-topic/edit-topic/edit-topic-dialog.component.html new file mode 100644 index 0000000000..06e03f7304 --- /dev/null +++ b/src/app/shared/entry/info-tab-topic/edit-topic/edit-topic-dialog.component.html @@ -0,0 +1,124 @@ +

    Select a Topic

    + +

    + A topic is a short description of your {{ entryTypeMetadata.term }}. There {{ topicOptions.length === 1 ? 'is' : 'are' }} + {{ topicOptions.length }} type{{ topicOptions.length === 1 ? '' : 's' }} of topic{{ topicOptions.length === 1 ? '' : 's' }} that you can + choose from: +

    + + + +
    +
    + + edit + GitHub icon + AI generation icon + + {{ topicOption.label }} +
    + checkmark Approved +
    +
    +
    +
    + {{ topicOption.description }} + info +
    + + + + info You have not approved this topic. Click Save to confirm that you + have reviewed and approved the topic. Otherwise, select another topic. + + +
    + {{ topicOption.value || 'Not Available' }} + +
    + + + + + +
    +
    +
    +
    +
    +
    + By selecting the AI topic, you are confirming that you have reviewed and approved it. There will be no + icon when the topic is displayed publicly. Are you sure you want to select the AI + topic? +
    + + +
    diff --git a/src/app/shared/entry/info-tab-topic/edit-topic/edit-topic-dialog.component.scss b/src/app/shared/entry/info-tab-topic/edit-topic/edit-topic-dialog.component.scss new file mode 100644 index 0000000000..51d797084b --- /dev/null +++ b/src/app/shared/entry/info-tab-topic/edit-topic/edit-topic-dialog.component.scss @@ -0,0 +1,8 @@ +@use '@angular/material' as mat; + +@import 'materialColorScheme.scss'; + +.approved { + color: white !important; + background-color: $accent-3-dark; +} diff --git a/src/app/shared/entry/info-tab-topic/edit-topic/edit-topic-dialog.component.spec.ts b/src/app/shared/entry/info-tab-topic/edit-topic/edit-topic-dialog.component.spec.ts new file mode 100644 index 0000000000..8d74d1ee78 --- /dev/null +++ b/src/app/shared/entry/info-tab-topic/edit-topic/edit-topic-dialog.component.spec.ts @@ -0,0 +1,65 @@ +/* + * Copyright 2024 OICR and UCSC + * + * Licensed under the Apache License, Version 2.0 (the "License") + * you may not use this file except in compliance with the License + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; + +import { EditTopicDialogStubService, EntryActionsStubService, EntryTypeMetadataStubService } from 'app/test/service-stubs'; +import { MAT_LEGACY_DIALOG_DATA, MatLegacyDialogRef } from '@angular/material/legacy-dialog'; +import { EntryTypeMetadataService } from 'app/entry/type-metadata/entry-type-metadata.service'; +import { sampleWorkflow1 } from 'app/test/mocked-objects'; +import { EditTopicDialogComponent } from './edit-topic-dialog.component'; +import { EditTopicDialogService } from './edit-topic-dialog.service'; +import { NO_ERRORS_SCHEMA } from '@angular/core'; +import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; +import { EntryActionsService } from 'app/shared/entry-actions/entry-actions.service'; + +describe('EditTopicDialogComponent', () => { + let component: EditTopicDialogComponent; + let fixture: ComponentFixture; + + beforeEach( + waitForAsync(() => { + TestBed.configureTestingModule({ + schemas: [NO_ERRORS_SCHEMA], + providers: [ + { provide: EntryTypeMetadataService, useClass: EntryTypeMetadataStubService }, + { provide: EditTopicDialogService, useClass: EditTopicDialogStubService }, + { provide: EntryActionsService, useClass: EntryActionsStubService }, + { + provide: MatLegacyDialogRef, + useValue: { + close: (dialogResult: any) => {}, + }, + }, + { + provide: MAT_LEGACY_DIALOG_DATA, + useValue: { entry: sampleWorkflow1 }, + }, + ], + imports: [EditTopicDialogComponent, BrowserAnimationsModule], + }).compileComponents(); + }) + ); + + beforeEach(() => { + fixture = TestBed.createComponent(EditTopicDialogComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/shared/entry/info-tab-topic/edit-topic/edit-topic-dialog.component.ts b/src/app/shared/entry/info-tab-topic/edit-topic/edit-topic-dialog.component.ts new file mode 100644 index 0000000000..9476604829 --- /dev/null +++ b/src/app/shared/entry/info-tab-topic/edit-topic/edit-topic-dialog.component.ts @@ -0,0 +1,152 @@ +/* + * Copyright 2024 OICR and UCSC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { Component, Inject } from '@angular/core'; +import { MatLegacyDialogRef, MatLegacyDialogModule, MAT_LEGACY_DIALOG_DATA } from '@angular/material/legacy-dialog'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { MatLegacyInputModule } from '@angular/material/legacy-input'; +import { MatLegacyFormFieldModule } from '@angular/material/legacy-form-field'; +import { NgFor, NgIf } from '@angular/common'; +import { MatDividerModule } from '@angular/material/divider'; +import { AlertComponent } from 'app/shared/alert/alert.component'; +import { DockstoreTool, Entry, EntryType, EntryTypeMetadata, Workflow } from 'app/shared/openapi'; +import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; +import { AiBubbleComponent } from 'app/shared/ai-bubble/ai-bubble.component'; +import { FormsModule } from '@angular/forms'; +import { MatLegacyRadioModule } from '@angular/material/legacy-radio'; +import { MatIconModule } from '@angular/material/icon'; +import { MatLegacyCardModule } from '@angular/material/legacy-card'; +import { EditTopicDialogService } from './edit-topic-dialog.service'; +import { EntryActionsService } from 'app/shared/entry-actions/entry-actions.service'; +import { MatRadioChange } from '@angular/material/radio'; +import { Dockstore } from 'app/shared/dockstore.model'; +import { ClipboardModule } from '@angular/cdk/clipboard'; +import { SnackbarDirective } from 'app/shared/snackbar.directive'; + +export interface EditTopicDialogData { + entry: DockstoreTool | Workflow; +} + +export interface TopicOption { + type: Entry.TopicSelectionEnum; + label: string; + description: string; + value: string | null; +} + +@Component({ + selector: 'app-edit-topic-dialog', + templateUrl: './edit-topic-dialog.component.html', + styleUrls: ['./edit-topic-dialog.component.scss', '../../../styles/radio-button-cards.scss'], + standalone: true, + imports: [ + MatLegacyDialogModule, + AlertComponent, + MatDividerModule, + NgIf, + MatLegacyFormFieldModule, + MatLegacyInputModule, + FlexModule, + MatLegacyButtonModule, + MatLegacyTooltipModule, + AiBubbleComponent, + FormsModule, + MatLegacyRadioModule, + MatIconModule, + MatLegacyCardModule, + NgFor, + ClipboardModule, + SnackbarDirective, + ], +}) +export class EditTopicDialogComponent { + Dockstore = Dockstore; + TopicSelectionEnum = Entry.TopicSelectionEnum; + entry: Workflow | DockstoreTool; + entryType: EntryType; + entryTypeMetadata: EntryTypeMetadata; + isGitHubAppEntry: boolean; + isHostedEntry: boolean; + topicEditing: boolean; + selectedOption: Entry.TopicSelectionEnum; + editedTopicManual: string; + promptToConfirmAISelection: boolean = false; + topicOptions: TopicOption[]; + + constructor( + public dialogRef: MatLegacyDialogRef, + public editTopicDialogService: EditTopicDialogService, + public entryActionsService: EntryActionsService, + @Inject(MAT_LEGACY_DIALOG_DATA) public data: EditTopicDialogData + ) { + this.entry = data.entry; + this.entryType = data.entry.entryType; + this.entryTypeMetadata = data.entry.entryTypeMetadata; + this.isGitHubAppEntry = (data.entry as Workflow).mode === Workflow.ModeEnum.DOCKSTOREYML; // Only Workflow has DOCKSTOREYML ModeEnum + this.isHostedEntry = this.entryActionsService.isEntryHosted(data.entry); + this.selectedOption = data.entry.topicSelection; + this.editedTopicManual = data.entry.topicManual; + const manualTopicOption: TopicOption = { + type: this.TopicSelectionEnum.MANUAL, + label: 'Manual', + description: this.isGitHubAppEntry + ? 'Specified in the .dockstore.yml file on GitHub. Edit the topic field in the .dockstore.yml to change the topic.' + : 'Entered manually by the user.', + value: this.entry.topicManual, + }; + const automaticTopicOption: TopicOption = { + type: this.TopicSelectionEnum.AUTOMATIC, + label: 'GitHub', + description: 'Retrieved automatically from the GitHub repository description.', + value: this.entry.topicAutomatic, + }; + const aiTopicOption: TopicOption = { + type: this.TopicSelectionEnum.AI, + label: 'AI', + description: `Generated by AI using the content of your ${this.entryTypeMetadata.term}.`, + value: this.entry.topicAI, + }; + this.topicOptions = [manualTopicOption]; + if (!this.isHostedEntry) { + this.topicOptions = [...this.topicOptions, automaticTopicOption]; + } + if (this.entry.topicAI) { + this.topicOptions = [...this.topicOptions, aiTopicOption]; + } + } + + /** + * This is triggered when a Topic Selection radio button is changed + * + * @param {MatRadioChange} event + * @memberof RegisterWorkflowModalComponent + */ + radioButtonChange(event: MatRadioChange): void { + if (event.value !== this.TopicSelectionEnum.AI) { + this.promptToConfirmAISelection = false; + } + } + + saveTopic() { + if (this.selectedOption === this.TopicSelectionEnum.AI && !this.entry.approvedAITopic && !this.promptToConfirmAISelection) { + this.promptToConfirmAISelection = true; + } else { + this.editTopicDialogService.saveTopicChanges(this.entry, this.editedTopicManual, this.selectedOption); + this.dialogRef.close(); + } + } +} diff --git a/src/app/shared/entry/info-tab-topic/edit-topic/edit-topic-dialog.service.ts b/src/app/shared/entry/info-tab-topic/edit-topic/edit-topic-dialog.service.ts new file mode 100644 index 0000000000..c813418de3 --- /dev/null +++ b/src/app/shared/entry/info-tab-topic/edit-topic/edit-topic-dialog.service.ts @@ -0,0 +1,71 @@ +import { Injectable } from '@angular/core'; +import { AlertService } from '../../../alert/state/alert.service'; +import { ContainersService, DockstoreTool, EntryType, Workflow, WorkflowsService } from '../../../openapi'; +import { WorkflowService } from '../../../state/workflow.service'; +import { ContainerService } from '../../../container.service'; +import { WorkflowQuery } from 'app/shared/state/workflow.query'; +import { ToolQuery } from 'app/shared/tool/tool.query'; +import { InfoTabService as WorkflowInfoTabService } from 'app/workflow/info-tab/info-tab.service'; +import { InfoTabService as ContainerInfoTabService } from 'app/container/info-tab/info-tab.service'; + +@Injectable() +export class EditTopicDialogService { + constructor( + private alertService: AlertService, + private workflowsService: WorkflowsService, + private workflowService: WorkflowService, + private containersService: ContainersService, + private containerService: ContainerService, + private workflowInfoTabService: WorkflowInfoTabService, + private containerInfoTabService: ContainerInfoTabService, + private workflowQuery: WorkflowQuery, + private toolQuery: ToolQuery + ) {} + + saveTopicChanges(entry: Workflow | DockstoreTool, topicManual: string, topicSelection: Workflow.TopicSelectionEnum) { + this.alertService.start('Saving topic changes'); + let newEntryForUpdate; + if (topicSelection === Workflow.TopicSelectionEnum.AI) { + // If the user selects the AI topic, they have reviewed and approved it + newEntryForUpdate = { ...entry, topicManual: topicManual, topicSelection: topicSelection, approvedAITopic: true }; + } else { + newEntryForUpdate = { ...entry, topicManual: topicManual, topicSelection: topicSelection }; + } + + if (entry.entryType === EntryType.TOOL) { + this.containersService + .updateContainer(entry.id, this.containerInfoTabService.getPartialToolForUpdate(newEntryForUpdate as DockstoreTool)) + .subscribe( + (response) => { + this.alertService.detailedSuccess(); + this.containerService.setTool({ + ...this.toolQuery.getActive(), + topicManual: response.topicManual, + topicSelection: response.topicSelection, + approvedAITopic: response.approvedAITopic, + }); + }, + (error) => { + this.alertService.detailedError(error); + } + ); + } else { + this.workflowsService + .updateWorkflow(entry.id, this.workflowInfoTabService.getPartialEntryForUpdate(newEntryForUpdate as Workflow)) + .subscribe( + (response) => { + this.alertService.detailedSuccess(); + this.workflowService.setWorkflow({ + ...this.workflowQuery.getActive(), + topicManual: response.topicManual, + topicSelection: response.topicSelection, + approvedAITopic: response.approvedAITopic, + }); + }, + (error) => { + this.alertService.detailedError(error); + } + ); + } + } +} diff --git a/src/app/shared/entry/launch-checker-workflow/launch-checker-workflow.component.spec.ts b/src/app/shared/entry/launch-checker-workflow/launch-checker-workflow.component.spec.ts index 75c1035217..2b92191f00 100644 --- a/src/app/shared/entry/launch-checker-workflow/launch-checker-workflow.component.spec.ts +++ b/src/app/shared/entry/launch-checker-workflow/launch-checker-workflow.component.spec.ts @@ -15,7 +15,7 @@ */ import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { MatCardModule } from '@angular/material/card'; +import { MatLegacyCardModule as MatCardModule } from '@angular/material/legacy-card'; import { CheckerWorkflowService } from '../../state/checker-workflow.service'; import { CheckerWorkflowStubService } from './../../../test/service-stubs'; import { LaunchCheckerWorkflowComponent } from './launch-checker-workflow.component'; @@ -26,9 +26,8 @@ describe('LaunchCheckerWorkflowComponent', () => { beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [LaunchCheckerWorkflowComponent], providers: [{ provide: CheckerWorkflowService, useClass: CheckerWorkflowStubService }], - imports: [MatCardModule], + imports: [MatCardModule, LaunchCheckerWorkflowComponent], }).compileComponents(); }) ); diff --git a/src/app/shared/entry/launch-checker-workflow/launch-checker-workflow.component.ts b/src/app/shared/entry/launch-checker-workflow/launch-checker-workflow.component.ts index 9f7cfc722c..a64a00a8de 100644 --- a/src/app/shared/entry/launch-checker-workflow/launch-checker-workflow.component.ts +++ b/src/app/shared/entry/launch-checker-workflow/launch-checker-workflow.component.ts @@ -18,11 +18,29 @@ import { Observable } from 'rxjs'; import { map } from 'rxjs/operators'; import { CheckerWorkflowQuery } from '../../state/checker-workflow.query'; +import { MatIconModule } from '@angular/material/icon'; +import { ClipboardModule } from '@angular/cdk/clipboard'; +import { SnackbarDirective } from '../../snackbar.directive'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; +import { MatLegacyCardModule } from '@angular/material/legacy-card'; +import { NgIf, AsyncPipe } from '@angular/common'; @Component({ selector: 'app-launch-checker-workflow', templateUrl: './launch-checker-workflow.component.html', styleUrls: ['./launch-checker-workflow.component.scss'], + standalone: true, + imports: [ + NgIf, + MatLegacyCardModule, + MatLegacyTooltipModule, + MatLegacyButtonModule, + SnackbarDirective, + ClipboardModule, + MatIconModule, + AsyncPipe, + ], }) export class LaunchCheckerWorkflowComponent { @Input() command: string; diff --git a/src/app/shared/entry/platform-partner.pipe.ts b/src/app/shared/entry/platform-partner.pipe.ts index 1169aa59ea..3425b36f6b 100644 --- a/src/app/shared/entry/platform-partner.pipe.ts +++ b/src/app/shared/entry/platform-partner.pipe.ts @@ -4,6 +4,7 @@ import PartnerEnum = CloudInstance.PartnerEnum; @Pipe({ name: 'platformPartner', + standalone: true, }) export class PlatformPartnerPipe implements PipeTransform { /** diff --git a/src/app/shared/entry/private-file-path.pipe.ts b/src/app/shared/entry/private-file-path.pipe.ts index 9cb1f35d93..5c55dec7cc 100644 --- a/src/app/shared/entry/private-file-path.pipe.ts +++ b/src/app/shared/entry/private-file-path.pipe.ts @@ -3,6 +3,7 @@ import { FileService } from '../file.service'; @Pipe({ name: 'privateFilePath', + standalone: true, }) export class PrivateFilePathPipe implements PipeTransform { constructor(protected fileService: FileService) {} diff --git a/src/app/shared/entry/public-file-download.pipe.ts b/src/app/shared/entry/public-file-download.pipe.ts index 60e785179a..289f8cb686 100644 --- a/src/app/shared/entry/public-file-download.pipe.ts +++ b/src/app/shared/entry/public-file-download.pipe.ts @@ -6,6 +6,7 @@ import { ToolDescriptor } from '../openapi'; @Pipe({ name: 'publicFileDownload', + standalone: true, }) export class PublicFileDownloadPipe implements PipeTransform { constructor(protected fileService: FileService) {} diff --git a/src/app/shared/entry/recent-events.pipe.spec.ts b/src/app/shared/entry/recent-events.pipe.spec.ts index cb454ffe8f..268aaf4fbb 100644 --- a/src/app/shared/entry/recent-events.pipe.spec.ts +++ b/src/app/shared/entry/recent-events.pipe.spec.ts @@ -1,5 +1,4 @@ import { RecentEventsPipe } from './recent-events.pipe'; -import { Workflow } from 'app/shared/openapi'; describe('Pipe: recentEvents', () => { const entryFields = ['tool', 'workflow', 'apptool', 'service', 'notebook']; diff --git a/src/app/shared/entry/recent-events.pipe.ts b/src/app/shared/entry/recent-events.pipe.ts index 3af5c702af..bf51f68c7e 100644 --- a/src/app/shared/entry/recent-events.pipe.ts +++ b/src/app/shared/entry/recent-events.pipe.ts @@ -1,13 +1,12 @@ import { Inject, Pipe, PipeTransform } from '@angular/core'; import { Event, DockstoreTool, Workflow } from 'app/shared/openapi'; import { EntryToDisplayNamePipe } from '../entry-to-display-name.pipe'; -import { EntryType } from '../../shared/enum/entry-type'; @Pipe({ name: 'recentEvents', + standalone: true, }) export class RecentEventsPipe implements PipeTransform { - private EntryType = EntryType; constructor(@Inject(EntryToDisplayNamePipe) private entryToDisplayNamePipe: EntryToDisplayNamePipe) {} /** diff --git a/src/app/shared/entry/register-checker-workflow/register-checker-workflow.component.spec.ts b/src/app/shared/entry/register-checker-workflow/register-checker-workflow.component.spec.ts index fb6a186845..6f67af0d5a 100644 --- a/src/app/shared/entry/register-checker-workflow/register-checker-workflow.component.spec.ts +++ b/src/app/shared/entry/register-checker-workflow/register-checker-workflow.component.spec.ts @@ -16,10 +16,9 @@ import { NO_ERRORS_SCHEMA } from '@angular/core'; import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; import { FormsModule } from '@angular/forms'; -import { MatDialogModule } from '@angular/material/dialog'; -import { MatSnackBarModule } from '@angular/material/snack-bar'; +import { MatLegacyDialogModule as MatDialogModule } from '@angular/material/legacy-dialog'; +import { MatLegacySnackBarModule as MatSnackBarModule } from '@angular/material/legacy-snack-bar'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; -import { CustomMaterialModule } from 'app/shared/modules/material.module'; import { CheckerWorkflowStubService, DescriptorLanguageStubService, RegisterCheckerWorkflowStubService } from '../../../test/service-stubs'; import { DescriptorTypeCompatService } from '../../descriptor-type-compat.service'; import { CheckerWorkflowService } from '../../state/checker-workflow.service'; @@ -34,9 +33,8 @@ describe('RegisterCheckerWorkflowComponent', () => { beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [RegisterCheckerWorkflowComponent], schemas: [NO_ERRORS_SCHEMA], - imports: [FormsModule, MatSnackBarModule, MatDialogModule, BrowserAnimationsModule, CustomMaterialModule], + imports: [FormsModule, MatSnackBarModule, MatDialogModule, BrowserAnimationsModule, RegisterCheckerWorkflowComponent], providers: [ { provide: RegisterCheckerWorkflowService, useClass: RegisterCheckerWorkflowStubService }, { provide: CheckerWorkflowService, useClass: CheckerWorkflowStubService }, diff --git a/src/app/shared/entry/register-checker-workflow/register-checker-workflow.component.ts b/src/app/shared/entry/register-checker-workflow/register-checker-workflow.component.ts index 7c46a751b2..9d36b1ed0d 100644 --- a/src/app/shared/entry/register-checker-workflow/register-checker-workflow.component.ts +++ b/src/app/shared/entry/register-checker-workflow/register-checker-workflow.component.ts @@ -15,7 +15,7 @@ */ import { HttpErrorResponse } from '@angular/common/http'; import { AfterViewChecked, Component, OnInit, ViewChild } from '@angular/core'; -import { NgForm } from '@angular/forms'; +import { NgForm, FormsModule } from '@angular/forms'; import { ExtendedDescriptorLanguageBean } from 'app/entry/extendedDescriptorLanguage'; import { Observable } from 'rxjs'; import { debounceTime, takeUntil } from 'rxjs/operators'; @@ -31,9 +31,33 @@ import { Workflow } from '../../openapi/model/workflow'; import { formErrors, validationDescriptorPatterns, validationMessages } from '../../validationMessages.model'; import { DescriptorLanguageService } from '../descriptor-language.service'; import { RegisterCheckerWorkflowService } from './register-checker-workflow.service'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { MatLegacyOptionModule } from '@angular/material/legacy-core'; +import { MatLegacySelectModule } from '@angular/material/legacy-select'; +import { NgIf, NgFor, AsyncPipe } from '@angular/common'; +import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; +import { MatLegacyInputModule } from '@angular/material/legacy-input'; +import { MatLegacyFormFieldModule } from '@angular/material/legacy-form-field'; +import { AlertComponent } from '../../alert/alert.component'; +import { MatLegacyDialogModule } from '@angular/material/legacy-dialog'; @Component({ templateUrl: './register-checker-workflow.component.html', + standalone: true, + imports: [ + MatLegacyDialogModule, + AlertComponent, + FormsModule, + MatLegacyFormFieldModule, + MatLegacyInputModule, + MatLegacyTooltipModule, + NgIf, + MatLegacySelectModule, + NgFor, + MatLegacyOptionModule, + MatLegacyButtonModule, + AsyncPipe, + ], }) export class RegisterCheckerWorkflowComponent extends Base implements OnInit, AfterViewChecked { constructor( diff --git a/src/app/shared/entry/register-checker-workflow/register-checker-workflow.service.spec.ts b/src/app/shared/entry/register-checker-workflow/register-checker-workflow.service.spec.ts index cfebdb644f..d02ecbb3a1 100644 --- a/src/app/shared/entry/register-checker-workflow/register-checker-workflow.service.spec.ts +++ b/src/app/shared/entry/register-checker-workflow/register-checker-workflow.service.spec.ts @@ -15,8 +15,8 @@ */ import { inject, TestBed } from '@angular/core/testing'; -import { MatDialogModule } from '@angular/material/dialog'; -import { MatSnackBarModule } from '@angular/material/snack-bar'; +import { MatLegacyDialogModule as MatDialogModule } from '@angular/material/legacy-dialog'; +import { MatLegacySnackBarModule as MatSnackBarModule } from '@angular/material/legacy-snack-bar'; import { ContainerStubService, RefreshStubService, diff --git a/src/app/shared/entry/register-checker-workflow/register-checker-workflow.service.ts b/src/app/shared/entry/register-checker-workflow/register-checker-workflow.service.ts index 02984c8964..8248b4428a 100644 --- a/src/app/shared/entry/register-checker-workflow/register-checker-workflow.service.ts +++ b/src/app/shared/entry/register-checker-workflow/register-checker-workflow.service.ts @@ -15,7 +15,7 @@ */ import { HttpErrorResponse } from '@angular/common/http'; import { Injectable } from '@angular/core'; -import { MatDialog } from '@angular/material/dialog'; +import { MatLegacyDialog as MatDialog } from '@angular/material/legacy-dialog'; import { BehaviorSubject, merge as observableMerge, Observable } from 'rxjs'; import { filter, first } from 'rxjs/operators'; import { AlertService } from '../../alert/state/alert.service'; diff --git a/src/app/shared/entry/select-tab.pipe.ts b/src/app/shared/entry/select-tab.pipe.ts index 2976de1d6f..08dbc7b26d 100644 --- a/src/app/shared/entry/select-tab.pipe.ts +++ b/src/app/shared/entry/select-tab.pipe.ts @@ -22,6 +22,7 @@ import { DockstoreTool, Entry, Workflow } from '../openapi'; @Pipe({ name: 'selectTab', + standalone: true, }) export class SelectTabPipe implements PipeTransform { /** diff --git a/src/app/shared/entry/url-deconstruct.pipe.ts b/src/app/shared/entry/url-deconstruct.pipe.ts index 16fe8c4373..fb601b7e32 100644 --- a/src/app/shared/entry/url-deconstruct.pipe.ts +++ b/src/app/shared/entry/url-deconstruct.pipe.ts @@ -2,6 +2,7 @@ import { Pipe, PipeTransform } from '@angular/core'; @Pipe({ name: 'urlDeconstruct', + standalone: true, }) export class UrlDeconstructPipe implements PipeTransform { /** diff --git a/src/app/shared/entry/verified-by/verified-by.component.spec.ts b/src/app/shared/entry/verified-by/verified-by.component.spec.ts index 287abe9746..3f5ef67d6e 100644 --- a/src/app/shared/entry/verified-by/verified-by.component.spec.ts +++ b/src/app/shared/entry/verified-by/verified-by.component.spec.ts @@ -1,5 +1,4 @@ import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { CustomMaterialModule } from '../../modules/material.module'; import { VerifiedByComponent } from './verified-by.component'; describe('VerifiedByComponent', () => { @@ -9,8 +8,7 @@ describe('VerifiedByComponent', () => { beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - imports: [CustomMaterialModule], - declarations: [VerifiedByComponent], + imports: [VerifiedByComponent], }).compileComponents(); }) ); diff --git a/src/app/shared/entry/verified-by/verified-by.component.ts b/src/app/shared/entry/verified-by/verified-by.component.ts index 80799f5c1b..5101a1856c 100644 --- a/src/app/shared/entry/verified-by/verified-by.component.ts +++ b/src/app/shared/entry/verified-by/verified-by.component.ts @@ -1,14 +1,21 @@ import { Component, Input, OnChanges } from '@angular/core'; -import { MatDialog } from '@angular/material/dialog'; +import { MatLegacyDialog as MatDialog, MatLegacyDialogModule } from '@angular/material/legacy-dialog'; import { AvailableLogsComponent } from '../../available-logs/available-logs.component'; import { bootstrap4largeModalSize } from '../../constants'; import { VersionVerifiedPlatform, Tag, WorkflowVersion } from '../../openapi'; import { VerifiedByService } from '../../verified-by.service'; +import { MatDividerModule } from '@angular/material/divider'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { MatLegacyCardModule } from '@angular/material/legacy-card'; +import { NgIf, NgFor } from '@angular/common'; @Component({ selector: 'app-verified-by', templateUrl: './verified-by.component.html', styleUrls: ['./verified-by.component.scss'], + standalone: true, + imports: [NgIf, MatLegacyCardModule, FlexModule, MatLegacyButtonModule, MatDividerModule, NgFor, MatLegacyDialogModule], }) export class VerifiedByComponent implements OnChanges { @Input() version: WorkflowVersion | Tag; diff --git a/src/app/shared/entry/verified-display/verified-display.component.spec.ts b/src/app/shared/entry/verified-display/verified-display.component.spec.ts index 847213cc92..9c21bf5dff 100644 --- a/src/app/shared/entry/verified-display/verified-display.component.spec.ts +++ b/src/app/shared/entry/verified-display/verified-display.component.spec.ts @@ -3,7 +3,6 @@ import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { versionVerifiedPlatform } from '../../../test/mocked-objects'; -import { CustomMaterialModule } from '../../modules/material.module'; import { VerifiedDisplayComponent } from './verified-display.component'; describe('VerifiedDisplayComponent', () => { @@ -13,8 +12,7 @@ describe('VerifiedDisplayComponent', () => { beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [VerifiedDisplayComponent], - imports: [CustomMaterialModule, BrowserAnimationsModule], + imports: [BrowserAnimationsModule, VerifiedDisplayComponent], }).compileComponents(); }) ); diff --git a/src/app/shared/entry/verified-display/verified-display.component.ts b/src/app/shared/entry/verified-display/verified-display.component.ts index bd729c9d7d..5819327618 100644 --- a/src/app/shared/entry/verified-display/verified-display.component.ts +++ b/src/app/shared/entry/verified-display/verified-display.component.ts @@ -14,14 +14,16 @@ * limitations under the License. */ import { Component, Input, OnChanges, OnInit, ViewChild } from '@angular/core'; -import { MatSort } from '@angular/material/sort'; -import { MatTableDataSource } from '@angular/material/table'; +import { MatSort, MatSortModule } from '@angular/material/sort'; +import { MatLegacyTableDataSource as MatTableDataSource, MatLegacyTableModule } from '@angular/material/legacy-table'; import { VersionVerifiedPlatform, Tag, VerificationInformation, WorkflowVersion } from '../../openapi'; @Component({ selector: 'app-verified-display', templateUrl: './verified-display.component.html', styleUrls: ['./verified-display.component.scss'], + standalone: true, + imports: [MatLegacyTableModule, MatSortModule], }) export class VerifiedDisplayComponent implements OnInit, OnChanges { @Input() verifiedByPlatform: Array; diff --git a/src/app/shared/entry/verified-platforms.pipe.ts b/src/app/shared/entry/verified-platforms.pipe.ts index 43bb2e3633..94af00a4b9 100644 --- a/src/app/shared/entry/verified-platforms.pipe.ts +++ b/src/app/shared/entry/verified-platforms.pipe.ts @@ -3,6 +3,7 @@ import { VersionVerifiedPlatform } from '../openapi'; @Pipe({ name: 'verifiedPlatforms', + standalone: true, }) export class VerifiedPlatformsPipe implements PipeTransform { transform(versionid: number, versionVerifiedPlatform: Array): string { diff --git a/src/app/shared/entry/versionProviderUrl.pipe.ts b/src/app/shared/entry/versionProviderUrl.pipe.ts index 1166ea2303..bdad727c5a 100644 --- a/src/app/shared/entry/versionProviderUrl.pipe.ts +++ b/src/app/shared/entry/versionProviderUrl.pipe.ts @@ -2,6 +2,7 @@ import { Pipe, PipeTransform } from '@angular/core'; @Pipe({ name: 'versionProviderUrl', + standalone: true, }) export class VersionProviderUrlPipe implements PipeTransform { transform(providerUrl: string, versionName: string): any { diff --git a/src/app/shared/file.service.ts b/src/app/shared/file.service.ts index aa433c4e1c..dbc8d291db 100644 --- a/src/app/shared/file.service.ts +++ b/src/app/shared/file.service.ts @@ -15,7 +15,6 @@ */ import { Injectable } from '@angular/core'; import * as FileSaver from 'file-saver'; -import { DomSanitizer } from '@angular/platform-browser'; import { ga4ghPath, ga4ghWorkflowIdPrefix } from './constants'; import { DescriptorTypeCompatService } from './descriptor-type-compat.service'; import { Dockstore } from './dockstore.model'; @@ -26,7 +25,7 @@ const cwlImportHttpRegEx: RegExp = new RegExp(/^[^#]+((run)|(\$((import)|(includ @Injectable({ providedIn: 'root' }) export class FileService { - constructor(private sanitizer: DomSanitizer, private descriptorTypeCompatService: DescriptorTypeCompatService) {} + constructor(private descriptorTypeCompatService: DescriptorTypeCompatService) {} /** * Get the download path of a descriptor diff --git a/src/app/shared/img-fallback.directive.spec.ts b/src/app/shared/img-fallback.directive.spec.ts index 2074cc55b4..a7866be8e6 100644 --- a/src/app/shared/img-fallback.directive.spec.ts +++ b/src/app/shared/img-fallback.directive.spec.ts @@ -5,6 +5,8 @@ import { ImgFallbackDirective } from './img-fallback.directive'; @Component({ template: '', + imports: [ImgFallbackDirective], + standalone: true, }) class TestComponent {} @@ -12,9 +14,7 @@ describe('ImgFallbackDirective', () => { let img: any; beforeEach(() => { - const component = TestBed.configureTestingModule({ declarations: [ImgFallbackDirective, TestComponent] }).createComponent( - TestComponent - ); + const component = TestBed.configureTestingModule({ imports: [TestComponent] }).createComponent(TestComponent); img = component.debugElement.query(By.css('img')).nativeElement; }); diff --git a/src/app/shared/img-fallback.directive.ts b/src/app/shared/img-fallback.directive.ts index 904d31125a..4f47e284b5 100644 --- a/src/app/shared/img-fallback.directive.ts +++ b/src/app/shared/img-fallback.directive.ts @@ -2,6 +2,7 @@ import { Directive, ElementRef, HostListener, Input } from '@angular/core'; @Directive({ selector: 'img[appFallback]', + standalone: true, }) export class ImgFallbackDirective { @Input() appFallback: string; diff --git a/src/app/shared/json-ld/json-ld.component.spec.ts b/src/app/shared/json-ld/json-ld.component.spec.ts index 8b4e62f963..d15442b836 100644 --- a/src/app/shared/json-ld/json-ld.component.spec.ts +++ b/src/app/shared/json-ld/json-ld.component.spec.ts @@ -72,7 +72,7 @@ describe('JsonLdComponent', () => { beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [JsonLdComponent], + imports: [JsonLdComponent], }).compileComponents(); }) ); diff --git a/src/app/shared/json-ld/json-ld.component.ts b/src/app/shared/json-ld/json-ld.component.ts index 38c5aa4ea4..bade532c21 100644 --- a/src/app/shared/json-ld/json-ld.component.ts +++ b/src/app/shared/json-ld/json-ld.component.ts @@ -56,6 +56,7 @@ import { DomSanitizer, SafeHtml } from '@angular/platform-browser'; selector: 'app-json-ld', template: '', changeDetection: ChangeDetectionStrategy.OnPush, + standalone: true, }) export class JsonLdComponent { @Input() diff --git a/src/app/shared/launch.service.ts b/src/app/shared/launch.service.ts index 5e671ff5b8..b3843766e8 100644 --- a/src/app/shared/launch.service.ts +++ b/src/app/shared/launch.service.ts @@ -28,6 +28,8 @@ export abstract class LaunchService { public readonly cwltoolTooltip = 'Commands for launching tools/workflows through CWLtool: the CWL reference implementation. ' + this.nonStrict; public readonly wesTooltip = 'Commands for provisioning files and launching a workflow against AWS AGC infrastructure.'; + private readonly galaxyParamFileName = 'galaxy_job.yml'; + constructor(protected descriptorTypeCompatService: DescriptorTypeCompatService) {} abstract getParamsString(path: string, versionName: string, currentDescriptor: string): string; abstract getCliString(path: string, versionName: string, currentDescriptor: string): string; @@ -77,6 +79,31 @@ export abstract class LaunchService { return `nextflow run https://${workflowPath} -r ${versionName}`; } + getSharedZipString(workflowPath: string, versionName: string) { + return `wget -O temp.zip '${Dockstore.API_URI}${ga4ghPath}/tools/${encodeURIComponent( + '#workflow/' + workflowPath + )}/versions/${encodeURIComponent(versionName)}/GALAXY/files?format=zip' +unzip temp.zip`; + } + + /** + * This creates the planemo local init command + * @param path The GA4GH Tool's path + * @param versionName The ToolVersion's name + */ + getPlanemoLocalInitString(workflowPath: string, versionName: string, primaryDescriptorPath: string) { + return `planemo workflow_job_init ${primaryDescriptorPath} -o ${this.galaxyParamFileName}`; + } + + /** + * This creates the planemo local launch commands + * @param path The GA4GH Tool's path + * @param versionName The ToolVersion's name + */ + getPlanemoLocalLaunchString(workflowPath: string, versionName: string, primaryDescriptorPath: string) { + return `planemo run ${primaryDescriptorPath} ${this.galaxyParamFileName} --download_outputs --output_directory . --output_json output.json --engine docker_galaxy`; + } + /** * Gets local launch command */ @@ -99,7 +126,7 @@ export abstract class LaunchService { * @param {string} entryPath The entry path * @param {string} versionName The workflow version * @param {ToolDescriptor.TypeEnum} descriptorType The descriptor type (cwl, wdl, nfl) - * @param {string} filePath Relative file path of the the test parameter file + * @param {string} filePath Relative file path of the test parameter file * @returns {string} The wget command * @memberof LaunchService */ @@ -127,7 +154,11 @@ export abstract class LaunchService { } const prefix = `wget --header='Accept: text/plain`; - const outputFile = `-O Dockstore.json`; + + let outputFile = `-O Dockstore.json`; + if (descriptorType === ToolDescriptor.TypeEnum.GALAXY) { + outputFile = '-O ' + this.galaxyParamFileName; + } const id = encodeURIComponent(entryPath); const versionId = encodeURIComponent(versionName); diff --git a/src/app/shared/loading/loading.component.spec.ts b/src/app/shared/loading/loading.component.spec.ts index edcca9e3c1..aa9611b6ca 100644 --- a/src/app/shared/loading/loading.component.spec.ts +++ b/src/app/shared/loading/loading.component.spec.ts @@ -1,7 +1,7 @@ /* eslint-disable no-unused-vars, @typescript-eslint/no-unused-vars */ import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { MatProgressBarModule } from '@angular/material/progress-bar'; +import { MatLegacyProgressBarModule as MatProgressBarModule } from '@angular/material/legacy-progress-bar'; import { LoadingComponent } from './loading.component'; describe('LoadingComponent', () => { @@ -11,8 +11,7 @@ describe('LoadingComponent', () => { beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - imports: [MatProgressBarModule], - declarations: [LoadingComponent], + imports: [MatProgressBarModule, LoadingComponent], }).compileComponents(); }) ); diff --git a/src/app/shared/loading/loading.component.ts b/src/app/shared/loading/loading.component.ts index fc25182ea1..278f45156c 100644 --- a/src/app/shared/loading/loading.component.ts +++ b/src/app/shared/loading/loading.component.ts @@ -1,4 +1,6 @@ import { Component, Input } from '@angular/core'; +import { MatLegacyProgressBarModule } from '@angular/material/legacy-progress-bar'; +import { NgIf } from '@angular/common'; /** * To use this component, wrap your original component with this component's tags @@ -13,6 +15,8 @@ import { Component, Input } from '@angular/core'; selector: 'app-loading', templateUrl: './loading.component.html', styleUrls: ['./loading.component.scss'], + standalone: true, + imports: [NgIf, MatLegacyProgressBarModule], }) export class LoadingComponent { @Input() loading = true; diff --git a/src/app/shared/markdown-wrapper/markdown-wrapper.component.spec.ts b/src/app/shared/markdown-wrapper/markdown-wrapper.component.spec.ts index fa51723453..d7f6d7c7e1 100644 --- a/src/app/shared/markdown-wrapper/markdown-wrapper.component.spec.ts +++ b/src/app/shared/markdown-wrapper/markdown-wrapper.component.spec.ts @@ -11,8 +11,7 @@ describe('MarkdownWrapperComponent', () => { beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - imports: [MarkdownModule], - declarations: [MarkdownWrapperComponent], + imports: [MarkdownModule, MarkdownWrapperComponent], providers: [MarkdownService, { provide: SECURITY_CONTEXT, useValue: SecurityContext.HTML }], }).compileComponents(); }) diff --git a/src/app/shared/markdown-wrapper/markdown-wrapper.component.ts b/src/app/shared/markdown-wrapper/markdown-wrapper.component.ts index 0619925da2..20c7ca8558 100644 --- a/src/app/shared/markdown-wrapper/markdown-wrapper.component.ts +++ b/src/app/shared/markdown-wrapper/markdown-wrapper.component.ts @@ -5,6 +5,7 @@ import { MarkdownWrapperService } from './markdown-wrapper.service'; selector: 'app-markdown-wrapper', templateUrl: './markdown-wrapper.component.html', styleUrls: ['./markdown-wrapper.component.scss'], + standalone: true, }) export class MarkdownWrapperComponent implements OnChanges { @Input() data: string; diff --git a/src/app/shared/mastodon/mastodon.component.ts b/src/app/shared/mastodon/mastodon.component.ts index 81645bdc66..6fa01f2d41 100644 --- a/src/app/shared/mastodon/mastodon.component.ts +++ b/src/app/shared/mastodon/mastodon.component.ts @@ -6,6 +6,10 @@ import { Component } from '@angular/core'; import { MastodonService } from './mastodon.service'; // Import the service +import { ExtendedModule } from '@ngbracket/ngx-layout/extended'; +import { NgFor, NgIf, NgStyle } from '@angular/common'; +import { MatDividerModule } from '@angular/material/divider'; +import { MatLegacyCardModule } from '@angular/material/legacy-card'; export interface MastodonTimelineData { postUrl: string; @@ -25,6 +29,8 @@ export interface MastodonTimelineData { selector: 'app-mastodon-timeline', templateUrl: './mastodon.component.html', styleUrls: ['./mastodon.component.scss'], + standalone: true, + imports: [MatLegacyCardModule, MatDividerModule, NgFor, NgIf, NgStyle, ExtendedModule], }) export class MastodonComponent { fetchedData: Map; diff --git a/src/app/shared/modules/container.module.ts b/src/app/shared/modules/container.module.ts deleted file mode 100644 index 66e3af9408..0000000000 --- a/src/app/shared/modules/container.module.ts +++ /dev/null @@ -1,117 +0,0 @@ -/* - * Copyright 2017 OICR - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import { ClipboardModule } from '@angular/cdk/clipboard'; -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { FlexLayoutModule } from '@angular/flex-layout'; -import { FormsModule } from '@angular/forms'; - -import { MarkdownModule } from 'ngx-markdown'; -import { ContainerComponent } from '../../container/container.component'; -import { DescriptorsComponent } from '../../container/descriptors/descriptors.component'; -import { DockerfileComponent } from '../../container/dockerfile/dockerfile.component'; -import { EmailService } from '../../container/email.service'; -import { FilesContainerComponent } from '../../container/files/files.component'; -import { LaunchComponent } from '../../container/launch/launch.component'; -import { ToolLaunchService } from '../../container/launch/tool-launch.service'; -import { ParamfilesComponent } from '../../container/paramfiles/paramfiles.component'; -import { ParamfilesService } from '../../container/paramfiles/paramfiles.service'; -import { ToolFileEditorComponent } from '../../container/tool-file-editor/tool-file-editor.component'; -import { VersionsContainerComponent } from '../../container/versions/versions.component'; -import { ViewContainerComponent } from '../../container/view/view.component'; -import { CurrentCollectionsModule } from '../../entry/current-collections.module'; -import { AddEntryModule } from '../../organizations/collection/add-entry.module'; -import { OrderByModule } from '../../shared/modules/orderby.module'; -import { StargazersModule } from '../../stargazers/stargazers.module'; -import { StarringModule } from '../../starring/starring.module'; -import { StarringService } from '../../starring/starring.service'; -import { DateService } from '../date.service'; -import { ToolActionsComponent } from '../entry-actions/tool-actions.component'; -import { FileService } from '../file.service'; -import { PipeModule } from '../pipe/pipe.module'; -import { AddTagComponent } from './../../container/add-tag/add-tag.component'; -import { ModalComponent } from './../../container/deregister-modal/deregister-modal.component'; -import { InfoTabComponent } from './../../container/info-tab/info-tab.component'; -import { InfoTabService } from './../../container/info-tab/info-tab.service'; -import { RegisterToolService } from './../../container/register-tool/register-tool.service'; -import { VersionModalComponent } from './../../container/version-modal/version-modal.component'; -import { VersionModalService } from './../../container/version-modal/version-modal.service'; -import { EntryModule } from './../entry/entry.module'; -import { CustomMaterialModule } from './../modules/material.module'; -import { PrivateIconModule } from './../private-icon/private-icon.module'; -import { RefreshService } from './../refresh.service'; -import { HeaderModule } from './header.module'; -import { ListContainersModule } from './list-containers.module'; -import { MarkdownWrapperModule } from './markdown-wrapper.module'; -import { SelectModule } from './select.module'; -import { SnackbarModule } from './snackbar.module'; -import { CategoryButtonModule } from './../../categories/button/category-button.module'; -import { WorkflowModule } from './workflow.module'; - -@NgModule({ - declarations: [ - ContainerComponent, - LaunchComponent, - VersionsContainerComponent, - ViewContainerComponent, - FilesContainerComponent, - DockerfileComponent, - DescriptorsComponent, - ParamfilesComponent, - ModalComponent, - ToolActionsComponent, - AddTagComponent, - VersionModalComponent, - InfoTabComponent, - ToolFileEditorComponent, - ], - imports: [ - CommonModule, - ClipboardModule, - CurrentCollectionsModule, - HeaderModule, - SelectModule, - ListContainersModule, - FormsModule, - OrderByModule, - PrivateIconModule, - StarringModule, - StargazersModule, - EntryModule, - AddEntryModule, - FlexLayoutModule, - MarkdownModule, - MarkdownWrapperModule, - PipeModule, - SnackbarModule, - CategoryButtonModule, - WorkflowModule, - ], - providers: [ - EmailService, - DateService, - FileService, - ToolLaunchService, - ParamfilesService, - RefreshService, - RegisterToolService, - StarringService, - VersionModalService, - InfoTabService, - ], - exports: [ContainerComponent, CustomMaterialModule, EntryModule, ToolActionsComponent], -}) -export class ContainerModule {} diff --git a/src/app/shared/modules/header.module.ts b/src/app/shared/modules/header.module.ts deleted file mode 100644 index 64653fb407..0000000000 --- a/src/app/shared/modules/header.module.ts +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright 2017 OICR - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { NgModule } from '@angular/core'; -import { HeaderComponent } from '../../header/header.component'; -import { RefreshAlertModule } from '../alert/alert.module'; - -@NgModule({ - declarations: [HeaderComponent], - imports: [RefreshAlertModule], - providers: [], - exports: [HeaderComponent], -}) -export class HeaderModule {} diff --git a/src/app/shared/modules/img-fallback.module.ts b/src/app/shared/modules/img-fallback.module.ts deleted file mode 100644 index 543416b7d7..0000000000 --- a/src/app/shared/modules/img-fallback.module.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { NgModule } from '@angular/core'; -import { ImgFallbackDirective } from '../img-fallback.directive'; - -@NgModule({ - declarations: [ImgFallbackDirective], - exports: [ImgFallbackDirective], -}) -export class ImgFallbackModule {} diff --git a/src/app/shared/modules/json-ld.module.ts b/src/app/shared/modules/json-ld.module.ts deleted file mode 100644 index 411bad6f55..0000000000 --- a/src/app/shared/modules/json-ld.module.ts +++ /dev/null @@ -1,27 +0,0 @@ -/* - * - * * Copyright 2022 OICR and UCSC - * * - * * Licensed under the Apache License, Version 2.0 (the "License"); - * * you may not use this file except in compliance with the License. - * * You may obtain a copy of the License at - * * - * * http://www.apache.org/licenses/LICENSE-2.0 - * * - * * Unless required by applicable law or agreed to in writing, software - * * distributed under the License is distributed on an "AS IS" BASIS, - * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * * See the License for the specific language governing permissions and - * * limitations under the License. - * - * - */ - -import { NgModule } from '@angular/core'; -import { JsonLdComponent } from '../json-ld/json-ld.component'; - -@NgModule({ - declarations: [JsonLdComponent], - exports: [JsonLdComponent], -}) -export class JsonLdModule {} diff --git a/src/app/shared/modules/list-containers.module.ts b/src/app/shared/modules/list-containers.module.ts deleted file mode 100644 index fd13cf9fad..0000000000 --- a/src/app/shared/modules/list-containers.module.ts +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright 2017 OICR - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import { ClipboardModule } from '@angular/cdk/clipboard'; -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { RouterModule } from '@angular/router'; - -import { ListContainersComponent } from '../../containers/list/list.component'; -import { ListContainersService } from '../../containers/list/list.service'; -import { PublishedToolsDataSource } from '../../containers/list/published-tools.datasource'; -import { EntryModule } from '../entry/entry.module'; -import { PrivateIconModule } from '../private-icon/private-icon.module'; -import { HeaderModule } from './header.module'; -import { CustomMaterialModule } from './material.module'; - -@NgModule({ - declarations: [ListContainersComponent], - imports: [CommonModule, RouterModule, ClipboardModule, CustomMaterialModule, HeaderModule, PrivateIconModule, EntryModule], - providers: [PublishedToolsDataSource, ListContainersService], - exports: [ListContainersComponent], -}) -export class ListContainersModule {} diff --git a/src/app/shared/modules/list-workflows.module.ts b/src/app/shared/modules/list-workflows.module.ts deleted file mode 100644 index 932e8941ea..0000000000 --- a/src/app/shared/modules/list-workflows.module.ts +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright 2017 OICR - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { RouterModule } from '@angular/router'; -import { ListWorkflowsComponent } from '../../workflows/list/list.component'; -import { PublishedWorkflowsDataSource } from '../../workflows/list/published-workflows.datasource'; -import { EntryModule } from '../entry/entry.module'; -import { PipeModule } from '../pipe/pipe.module'; -import { HeaderModule } from './header.module'; -import { CustomMaterialModule } from './material.module'; - -@NgModule({ - declarations: [ListWorkflowsComponent], - imports: [CommonModule, RouterModule, HeaderModule, CustomMaterialModule, EntryModule, PipeModule], - providers: [PublishedWorkflowsDataSource], - exports: [ListWorkflowsComponent], -}) -export class ListWorkflowsModule {} diff --git a/src/app/shared/modules/markdown-wrapper.module.ts b/src/app/shared/modules/markdown-wrapper.module.ts deleted file mode 100644 index 0ffff82d45..0000000000 --- a/src/app/shared/modules/markdown-wrapper.module.ts +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright 2020 OICR - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { MarkdownModule } from 'ngx-markdown'; -import { MarkdownWrapperComponent } from '../markdown-wrapper/markdown-wrapper.component'; -import { MarkdownWrapperService } from '../markdown-wrapper/markdown-wrapper.service'; - -@NgModule({ - declarations: [MarkdownWrapperComponent], - imports: [CommonModule, MarkdownModule], - providers: [MarkdownWrapperService], - exports: [MarkdownWrapperComponent], -}) -export class MarkdownWrapperModule {} diff --git a/src/app/shared/modules/material.module.ts b/src/app/shared/modules/material.module.ts deleted file mode 100644 index 3cae3d1011..0000000000 --- a/src/app/shared/modules/material.module.ts +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Copyright 2018 OICR - * - * Licensed under the Apache License, Version 2.0 (the "License") - * you may not use this file except in compliance with the License - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import { DragDropModule } from '@angular/cdk/drag-drop'; -import { NgModule } from '@angular/core'; -import { MatBadgeModule } from '@angular/material/badge'; -import { MatButtonModule } from '@angular/material/button'; -import { MatCardModule } from '@angular/material/card'; -import { MatCheckboxModule } from '@angular/material/checkbox'; -import { MatChipsModule } from '@angular/material/chips'; -import { MatDialogModule } from '@angular/material/dialog'; -import { MatDividerModule } from '@angular/material/divider'; -import { MatExpansionModule } from '@angular/material/expansion'; -import { MatFormFieldModule } from '@angular/material/form-field'; -import { MatIconModule } from '@angular/material/icon'; -import { MatInputModule } from '@angular/material/input'; -import { MatListModule } from '@angular/material/list'; -import { MatMenuModule } from '@angular/material/menu'; -import { MatPaginatorModule } from '@angular/material/paginator'; -import { MatProgressBarModule } from '@angular/material/progress-bar'; -import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; -import { MatRadioModule } from '@angular/material/radio'; -import { MatSelectModule } from '@angular/material/select'; -import { MatSidenavModule } from '@angular/material/sidenav'; -import { MatSlideToggleModule } from '@angular/material/slide-toggle'; -import { MatSnackBarModule } from '@angular/material/snack-bar'; -import { MatSortModule } from '@angular/material/sort'; -import { MatStepperModule } from '@angular/material/stepper'; -import { MatTableModule } from '@angular/material/table'; -import { MatTabsModule } from '@angular/material/tabs'; -import { MatToolbarModule } from '@angular/material/toolbar'; -import { MatTooltipModule } from '@angular/material/tooltip'; -import { MatTreeModule } from '@angular/material/tree'; - -const MATERIAL_MODULES = [ - DragDropModule, - MatBadgeModule, - MatButtonModule, - MatCardModule, - MatCheckboxModule, - MatChipsModule, - MatDialogModule, - MatDividerModule, - MatExpansionModule, - MatFormFieldModule, - MatIconModule, - MatInputModule, - MatListModule, - MatMenuModule, - MatPaginatorModule, - MatProgressBarModule, - MatProgressSpinnerModule, - MatRadioModule, - MatSelectModule, - MatSidenavModule, - MatSnackBarModule, - MatSortModule, - MatStepperModule, - MatTableModule, - MatTabsModule, - MatToolbarModule, - MatTooltipModule, - MatTreeModule, - MatSlideToggleModule, -]; - -@NgModule({ - imports: MATERIAL_MODULES, - exports: MATERIAL_MODULES, -}) -export class CustomMaterialModule {} diff --git a/src/app/shared/modules/my-entries.module.ts b/src/app/shared/modules/my-entries.module.ts deleted file mode 100644 index ac0ba2842a..0000000000 --- a/src/app/shared/modules/my-entries.module.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { MyEntriesQuery } from '../state/my-entries.query'; -import { MyEntriesStateService } from '../state/my-entries.service'; -import { MyEntriesStore } from '../state/my-entries.store'; - -/** - * This module contains components and services that are common to all my-entry pages (such as my-tools, my-workflows, my-services) - * - * @export - * @class MyEntriesModule - */ -@NgModule({ - providers: [MyEntriesStateService, MyEntriesStore, MyEntriesQuery], - imports: [CommonModule], -}) -export class MyEntriesModule {} diff --git a/src/app/shared/modules/my-sidebar.module.ts b/src/app/shared/modules/my-sidebar.module.ts deleted file mode 100644 index 2f1bc4695c..0000000000 --- a/src/app/shared/modules/my-sidebar.module.ts +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright 2017 OICR - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { MySidebarComponent } from '../../my-sidebar/my-sidebar.component'; -import { CustomMaterialModule } from 'app/shared/modules/material.module'; -import { RouterModule } from '@angular/router'; - -@NgModule({ - declarations: [MySidebarComponent], - imports: [CommonModule, CustomMaterialModule, RouterModule], - providers: [], - exports: [MySidebarComponent], -}) -export class MySidebarModule {} diff --git a/src/app/shared/modules/preview-warning.module.ts b/src/app/shared/modules/preview-warning.module.ts deleted file mode 100644 index da80a008c3..0000000000 --- a/src/app/shared/modules/preview-warning.module.ts +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright 2023 OICR, UCSC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { NgModule } from '@angular/core'; -import { CustomMaterialModule } from 'app/shared/modules/material.module'; -import { PreviewWarningComponent } from '../../preview-warning/preview-warning.component'; - -@NgModule({ - declarations: [PreviewWarningComponent], - imports: [CustomMaterialModule], - exports: [PreviewWarningComponent], -}) -export class PreviewWarningModule {} diff --git a/src/app/shared/modules/register-github-app.module.ts b/src/app/shared/modules/register-github-app.module.ts deleted file mode 100644 index ded0171246..0000000000 --- a/src/app/shared/modules/register-github-app.module.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { FlexModule } from '@angular/flex-layout'; -import { MatButtonModule } from '@angular/material/button'; -import { MatIconModule } from '@angular/material/icon'; -import { MatTooltipModule } from '@angular/material/tooltip'; -import { RouterLinkWithHref } from '@angular/router'; -import { RegisterGithubAppComponent } from '../register-github-app/register-github-app.component'; -import { GithubLandingPageComponent } from '../../github-landing-page/github-landing-page.component'; -import { MatAutocompleteModule } from '@angular/material/autocomplete'; -import { MatCardModule } from '@angular/material/card'; -import { MatDividerModule } from '@angular/material/divider'; -import { MatFormFieldModule } from '@angular/material/form-field'; -import { MatInputModule } from '@angular/material/input'; -import { MatOptionModule } from '@angular/material/core'; -import { ReactiveFormsModule } from '@angular/forms'; - -@NgModule({ - declarations: [RegisterGithubAppComponent, GithubLandingPageComponent], - exports: [RegisterGithubAppComponent], - imports: [ - CommonModule, - FlexModule, - MatButtonModule, - MatIconModule, - MatTooltipModule, - RouterLinkWithHref, - MatAutocompleteModule, - MatCardModule, - MatDividerModule, - MatFormFieldModule, - MatInputModule, - MatOptionModule, - ReactiveFormsModule, - ], -}) -export class RegisterGithubAppModule {} diff --git a/src/app/shared/modules/select.module.ts b/src/app/shared/modules/select.module.ts deleted file mode 100644 index 2c56658b0d..0000000000 --- a/src/app/shared/modules/select.module.ts +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright 2017 OICR - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { FormsModule } from '@angular/forms'; -import { CustomMaterialModule } from './../modules/material.module'; - -import { SelectComponent } from '../../select/select.component'; - -@NgModule({ - declarations: [SelectComponent], - imports: [CommonModule, FormsModule, CustomMaterialModule], - providers: [], - exports: [SelectComponent], -}) -export class SelectModule {} diff --git a/src/app/shared/modules/snackbar.module.ts b/src/app/shared/modules/snackbar.module.ts deleted file mode 100644 index f7ccfd82bd..0000000000 --- a/src/app/shared/modules/snackbar.module.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { NgModule } from '@angular/core'; -import { SnackbarDirective } from '../snackbar.directive'; - -@NgModule({ - declarations: [SnackbarDirective], - exports: [SnackbarDirective], -}) -export class SnackbarModule {} diff --git a/src/app/shared/modules/workflow.module.ts b/src/app/shared/modules/workflow.module.ts deleted file mode 100644 index 6f9d3ac257..0000000000 --- a/src/app/shared/modules/workflow.module.ts +++ /dev/null @@ -1,143 +0,0 @@ -/* - * Copyright 2017 OICR - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import { ClipboardModule } from '@angular/cdk/clipboard'; -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { FlexLayoutModule } from '@angular/flex-layout'; -import { FormsModule } from '@angular/forms'; - -import { MarkdownModule } from 'ngx-markdown'; -import { ParamfilesService } from '../../container/paramfiles/paramfiles.service'; -import { CurrentCollectionsModule } from '../../entry/current-collections.module'; -import { AddEntryModule } from '../../organizations/collection/add-entry.module'; -import { OrderByModule } from '../../shared/modules/orderby.module'; -import { SourceFileTabsComponent } from '../../source-file-tabs/source-file-tabs.component'; -import { NotebookComponent } from '../../notebook/notebook.component'; -import { NotebookMimeBundleOutputComponent } from '../../notebook/notebook-mime-bundle-output.component'; -import { NotebookStreamOutputComponent } from '../../notebook/notebook-stream-output.component'; -import { NotebookMarkdownComponent } from '../../notebook/notebook-markdown.component'; -import { NotebookSourceComponent } from '../../notebook/notebook-source.component'; -import { StargazersModule } from '../../stargazers/stargazers.module'; -import { StarringModule } from '../../starring/starring.module'; -import { FilterCloudInstancesPipe } from '../../workflow/launch-third-party/filterCloudInstances.pipe'; -import { LaunchThirdPartyComponent } from '../../workflow/launch-third-party/launch-third-party.component'; -import { MultiCloudLaunchComponent } from '../../workflow/launch-third-party/multi-cloud-launch/multi-cloud-launch.component'; -import { LaunchWorkflowComponent } from '../../workflow/launch/launch.component'; -import { WorkflowLaunchService } from '../../workflow/launch/workflow-launch.service'; -import { PermissionsComponent } from '../../workflow/permissions/permissions.component'; -import { VersionsWorkflowComponent } from '../../workflow/versions/versions.component'; -import { ViewWorkflowComponent } from '../../workflow/view/view.component'; -import { WorkflowFileEditorComponent } from '../../workflow/workflow-file-editor/workflow-file-editor.component'; -import { WorkflowComponent } from '../../workflow/workflow.component'; -import { RefreshAlertModule } from '../alert/alert.module'; -import { DateService } from '../date.service'; -import { WorkflowActionsComponent } from '../entry-actions/workflow-actions.component'; -import { FileService } from '../file.service'; -import { HeaderModule } from '../modules/header.module'; -import { ListWorkflowsModule } from '../modules/list-workflows.module'; -import { SelectModule } from '../modules/select.module'; -import { PipeModule } from '../pipe/pipe.module'; -import { DagModule } from './../../workflow/dag/dag.module'; -import { InfoTabComponent } from './../../workflow/info-tab/info-tab.component'; -import { InfoTabService } from './../../workflow/info-tab/info-tab.service'; -import { RegisterWorkflowModalService } from './../../workflow/register-workflow-modal/register-workflow-modal.service'; -import { ToolTabComponent } from './../../workflow/tool-tab/tool-tab.component'; -import { VersionModalComponent } from './../../workflow/version-modal/version-modal.component'; -import { VersionModalService } from './../../workflow/version-modal/version-modal.service'; -import { ExecutionsTabComponent } from '../../workflow/executions/executions-tab.component'; -import { EntryModule } from './../entry/entry.module'; -import { CustomMaterialModule } from './../modules/material.module'; -import { RefreshService } from './../refresh.service'; -import { MarkdownWrapperModule } from './markdown-wrapper.module'; -import { SnackbarModule } from './snackbar.module'; -import { CategoryButtonModule } from './../../categories/button/category-button.module'; -import { MySidebarModule } from '../modules/my-sidebar.module'; -import { SourceFileTabsService } from '../../source-file-tabs/source-file-tabs.service'; -import { NgxMatSelectSearchModule } from 'ngx-mat-select-search'; -import { PreviewWarningModule } from './preview-warning.module'; - -@NgModule({ - declarations: [ - WorkflowComponent, - WorkflowFileEditorComponent, - VersionsWorkflowComponent, - LaunchThirdPartyComponent, - LaunchWorkflowComponent, - PermissionsComponent, - ViewWorkflowComponent, - VersionModalComponent, - WorkflowActionsComponent, - InfoTabComponent, - ExecutionsTabComponent, - ToolTabComponent, - SourceFileTabsComponent, - NotebookComponent, - NotebookMimeBundleOutputComponent, - NotebookStreamOutputComponent, - NotebookMarkdownComponent, - NotebookSourceComponent, - FilterCloudInstancesPipe, - MultiCloudLaunchComponent, - ExecutionsTabComponent, - ], - imports: [ - CommonModule, - CurrentCollectionsModule, - FlexLayoutModule, - HeaderModule, - ListWorkflowsModule, - SelectModule, - PipeModule, - StarringModule, - OrderByModule, - FormsModule, - DagModule, - StargazersModule, - ClipboardModule, - EntryModule, - AddEntryModule, - MarkdownModule, - RefreshAlertModule, - MarkdownWrapperModule, - SnackbarModule, - CategoryButtonModule, - MySidebarModule, - NgxMatSelectSearchModule, - PreviewWarningModule, - ], - providers: [ - DateService, - FileService, - WorkflowLaunchService, - ParamfilesService, - InfoTabService, - RefreshService, - RegisterWorkflowModalService, - VersionModalService, - SourceFileTabsService, - ], - exports: [ - WorkflowComponent, - CustomMaterialModule, - EntryModule, - HeaderModule, - CommonModule, - WorkflowActionsComponent, - FilterCloudInstancesPipe, - MySidebarModule, - ], -}) -export class WorkflowModule {} diff --git a/src/app/shared/modules/workflowsPage.module.ts b/src/app/shared/modules/workflowsPage.module.ts deleted file mode 100644 index 6f5cdb9b72..0000000000 --- a/src/app/shared/modules/workflowsPage.module.ts +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright 2017 OICR - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import { NgModule } from '@angular/core'; -import { SearchWorkflowsComponent } from 'app/workflows/search/search.component'; -import { WorkflowsComponent } from 'app/workflows/workflows.component'; -import { ListWorkflowsModule } from './list-workflows.module'; -import { WorkflowModule } from './workflow.module'; -import { PreviewWarningModule } from './preview-warning.module'; - -@NgModule({ - declarations: [WorkflowsComponent, SearchWorkflowsComponent], - imports: [WorkflowModule, ListWorkflowsModule, PreviewWarningModule], - exports: [WorkflowsComponent, WorkflowModule, ListWorkflowsModule], -}) -export class WorkflowsPageModule {} diff --git a/src/app/shared/my-entry.ts b/src/app/shared/my-entry.ts index d080c3d725..b980ef674f 100644 --- a/src/app/shared/my-entry.ts +++ b/src/app/shared/my-entry.ts @@ -15,10 +15,10 @@ */ import { Injectable, OnDestroy } from '@angular/core'; import { ActivatedRoute } from '@angular/router'; -import { AuthService } from 'ng2-ui-auth'; import { Observable, Subject } from 'rxjs'; import { takeUntil } from 'rxjs/operators'; import { AccountsService } from '../loginComponents/accounts/external/accounts.service'; +import { AuthService } from '../ng2-ui-auth/public_api'; import { Base } from './base'; import { TokenSource } from './enum/token-source.enum'; import { ExtendedDockstoreTool } from './models/ExtendedDockstoreTool'; diff --git a/src/app/shared/orderBy.ts b/src/app/shared/orderBy.ts index 431e7ca30a..064f41d07f 100644 --- a/src/app/shared/orderBy.ts +++ b/src/app/shared/orderBy.ts @@ -25,7 +25,11 @@ import { Pipe, PipeTransform } from '@angular/core'; -@Pipe({ name: 'orderBy', pure: false }) +@Pipe({ + name: 'orderBy', + pure: false, + standalone: true, +}) export class OrderBy implements PipeTransform { value: string[] = []; diff --git a/src/app/shared/pipe/pipe.module.ts b/src/app/shared/pipe/pipe.module.ts index 1e971fd872..b44e92cfd0 100644 --- a/src/app/shared/pipe/pipe.module.ts +++ b/src/app/shared/pipe/pipe.module.ts @@ -41,8 +41,7 @@ const DECLARATIONS: any[] = [ ExecutionStatusPipe, ]; @NgModule({ - imports: [CommonModule], - declarations: DECLARATIONS, + imports: [CommonModule, ...DECLARATIONS], exports: DECLARATIONS, providers: [EntryToDisplayNamePipe, PlatformPartnerPipe, MapFriendlyValuesPipe], }) diff --git a/src/app/shared/private-icon/private-icon.component.ts b/src/app/shared/private-icon/private-icon.component.ts index 4eb4bde6fa..c31471c88f 100644 --- a/src/app/shared/private-icon/private-icon.component.ts +++ b/src/app/shared/private-icon/private-icon.component.ts @@ -1,9 +1,13 @@ import { Component } from '@angular/core'; import { Dockstore } from '../../shared/dockstore.model'; +import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; +import { MatIconModule } from '@angular/material/icon'; @Component({ selector: 'app-private-icon', templateUrl: './private-icon.component.html', + standalone: true, + imports: [MatIconModule, MatLegacyTooltipModule], }) export class PrivateIconComponent { // Change this link if necessary diff --git a/src/app/shared/private-icon/private-icon.module.ts b/src/app/shared/private-icon/private-icon.module.ts deleted file mode 100644 index 9f554b5223..0000000000 --- a/src/app/shared/private-icon/private-icon.module.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { MatIconModule } from '@angular/material/icon'; - -import { MatTooltipModule } from '@angular/material/tooltip'; -import { PrivateIconComponent } from './private-icon.component'; - -@NgModule({ - imports: [CommonModule, MatIconModule, MatTooltipModule], - declarations: [PrivateIconComponent], - exports: [PrivateIconComponent], -}) -export class PrivateIconModule {} diff --git a/src/app/shared/refresh.service.spec.ts b/src/app/shared/refresh.service.spec.ts index 8dfa9b7585..33313601da 100644 --- a/src/app/shared/refresh.service.spec.ts +++ b/src/app/shared/refresh.service.spec.ts @@ -14,7 +14,7 @@ * limitations under the License. */ import { inject, TestBed } from '@angular/core/testing'; -import { MatSnackBarModule } from '@angular/material/snack-bar'; +import { MatLegacySnackBarModule as MatSnackBarModule } from '@angular/material/legacy-snack-bar'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { first } from 'rxjs/operators'; diff --git a/src/app/shared/register-github-app/register-github-app.component.html b/src/app/shared/register-github-app/register-github-app.component.html index 1b2f399840..e06e53da0d 100644 --- a/src/app/shared/register-github-app/register-github-app.component.html +++ b/src/app/shared/register-github-app/register-github-app.component.html @@ -2,21 +2,21 @@
    1. Click the "Manage..." button below to install Dockstore's App on your GitHub repositories that contain {{ entryType }}s. The App - notifies Dockstore whenever the repositories change.Click the "Manage..." button below to install Dockstore's App on your GitHub repositories that contain + {{ entryTypeMetadata.term }}s. The App notifies Dockstore whenever the repositories change.
    2. - Describe your {{ entryType }}s by adding a + Describe your {{ entryTypeMetadata.term }}s by adding a .dockstore.yml to the root directory of the repositories where you installed the App.
    3. -
    4. Push your changes and wait two minutes for Dockstore to read your {{ entryType }}s.
    5. +
    6. Push your changes and wait two minutes for Dockstore to read your {{ entryTypeMetadata.term }}s.
    7. - Refresh your Dockstore dashboard to see your {{ entryType }}s. If they don't appear, click the dashboard's "{{ - entryType | titlecase + Refresh your Dockstore dashboard to see your {{ entryTypeMetadata.term }}s. If they don't appear, click the dashboard's "{{ + entryTypeMetadata.term | titlecase }}s" tile and click on the organization's "Apps Logs" button to see what went wrong.
    @@ -29,16 +29,17 @@ >.

    - add Manage Dockstore installations on GitHub + add Manage Dockstore installations on GitHub +
  • diff --git a/src/app/shared/register-github-app/register-github-app.component.spec.ts b/src/app/shared/register-github-app/register-github-app.component.spec.ts index 659e8afc1b..fa741bb68e 100644 --- a/src/app/shared/register-github-app/register-github-app.component.spec.ts +++ b/src/app/shared/register-github-app/register-github-app.component.spec.ts @@ -1,8 +1,12 @@ import { HttpClientTestingModule } from '@angular/common/http/testing'; import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { MatIconModule } from '@angular/material/icon'; import { RegisterGithubAppComponent } from './register-github-app.component'; -import { MatDialogRef } from '@angular/material/dialog'; +import { MatLegacyDialogRef as MatDialogRef } from '@angular/material/legacy-dialog'; +import { EntryType } from '../openapi'; +import { EntryTypeMetadataService } from 'app/entry/type-metadata/entry-type-metadata.service'; +import { EntryTypeMetadataStubService } from 'app/test/service-stubs'; describe('RegisterGithubAppComponent', () => { let component: RegisterGithubAppComponent; @@ -10,18 +14,19 @@ describe('RegisterGithubAppComponent', () => { beforeEach(async () => { await TestBed.configureTestingModule({ - declarations: [RegisterGithubAppComponent], - imports: [HttpClientTestingModule], + imports: [HttpClientTestingModule, MatIconModule, RegisterGithubAppComponent], providers: [ { provide: MatDialogRef, useValue: {}, }, + { provide: EntryTypeMetadataService, useClass: EntryTypeMetadataStubService }, ], }).compileComponents(); fixture = TestBed.createComponent(RegisterGithubAppComponent); component = fixture.componentInstance; + component.entryType = EntryType.WORKFLOW; fixture.detectChanges(); }); diff --git a/src/app/shared/register-github-app/register-github-app.component.ts b/src/app/shared/register-github-app/register-github-app.component.ts index 38d5ce827b..fbb95b21f9 100644 --- a/src/app/shared/register-github-app/register-github-app.component.ts +++ b/src/app/shared/register-github-app/register-github-app.component.ts @@ -1,17 +1,59 @@ -import { Component, Input } from '@angular/core'; +import { Component, Input, OnInit } from '@angular/core'; +import { Base } from '../base'; import { Dockstore } from '../dockstore.model'; -import { SessionQuery } from '../session/session.query'; import { UserQuery } from '../user/user.query'; +import { HttpParams } from '@angular/common/http'; +import { EntryType, EntryTypeMetadata } from '../openapi'; +import { EntryTypeMetadataService } from 'app/entry/type-metadata/entry-type-metadata.service'; +import { AsyncPipe, TitleCasePipe } from '@angular/common'; +import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { MatIconModule } from '@angular/material/icon'; @Component({ selector: 'app-register-github-app', templateUrl: './register-github-app.component.html', + standalone: true, + imports: [MatIconModule, FlexModule, MatLegacyButtonModule, MatLegacyTooltipModule, AsyncPipe, TitleCasePipe], }) -export class RegisterGithubAppComponent { +export class RegisterGithubAppComponent extends Base implements OnInit { public Dockstore = Dockstore; - public gitHubAppInstallationLink$ = this.sessionQuery.gitHubAppInstallationLandingPageLink$; public isUsernameChangeRequired$ = this.userQuery.isUsernameChangeRequired$; - @Input() public entryType: string; + public entryTypeMetadata: EntryTypeMetadata; + @Input() public entryType: EntryType; + private gitHubAppInstallationLink: string; - constructor(private sessionQuery: SessionQuery, private userQuery: UserQuery) {} + constructor(private userQuery: UserQuery, private entryTypeMetadataService: EntryTypeMetadataService) { + super(); + } + + ngOnInit(): void { + this.gitHubAppInstallationLink = this.generateGitHubAppInstallationUrl(this.entryType); + this.entryTypeMetadata = this.entryTypeMetadataService.get(this.entryType); + } + + public openGitHubApp() { + window.open(this.gitHubAppInstallationLink, '_blank', 'noopener,noreferrer'); + } + + /** + * Generates a GitHub App installation URL that has a 'state' query parameter containing an entryType. + * + * The GitHub App installation link allows a 'state' query parameter that preserves the state of the application page + * and return users back to that state after they install the GitHub App. + * More details here https://docs.github.com/en/apps/sharing-github-apps/sharing-your-github-app. + * + * The entryType is used as the 'state' so that users are redirected to the GitHub App landing page for the entryType they were registering. + * + * @param entryType Entry type to use as the 'state' query parameter in the installation URL + * @returns + */ + generateGitHubAppInstallationUrl(entryType: EntryType): string { + let queryParams = new HttpParams(); + // Can only provide a state query parameter + // https://docs.github.com/en/apps/sharing-github-apps/sharing-your-github-app + queryParams = queryParams.set('state', entryType); + return Dockstore.GITHUB_APP_INSTALLATION_URL + '/installations/new?' + queryParams.toString(); + } } diff --git a/src/app/shared/session/session.query.ts b/src/app/shared/session/session.query.ts index 340acbbfda..c66581e8dc 100644 --- a/src/app/shared/session/session.query.ts +++ b/src/app/shared/session/session.query.ts @@ -13,13 +13,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { HttpParams } from '@angular/common/http'; import { Injectable } from '@angular/core'; -import { Router } from '@angular/router'; import { Query } from '@datorama/akita'; import { Observable } from 'rxjs'; import { map } from 'rxjs/operators'; -import { Dockstore } from '../dockstore.model'; import { EntryType } from '../enum/entry-type'; import { EntryType as OpenApiEntryType, EntryTypeMetadata } from 'app/shared/openapi'; import { EntryTypeMetadataService } from 'app/entry/type-metadata/entry-type-metadata.service'; @@ -47,29 +44,8 @@ export class SessionQuery extends Query { isService$: Observable = this.entryType$.pipe(map((entryType) => entryType === EntryType.Service)); isNotebook$: Observable = this.entryType$.pipe(map((entryType) => entryType === EntryType.Notebook)); isTool$: Observable = this.entryType$.pipe(map((entryType) => entryType === EntryType.Tool)); - gitHubAppInstallationLink$: Observable = this.entryType$.pipe( - map((entryType: EntryType) => (entryType ? this.generateGitHubAppInstallationUrl(this.route.url) : null)) - ); - gitHubAppInstallationLandingPageLink$: Observable = this.entryType$.pipe( - map((entryType: EntryType) => (entryType ? this.generateGitHubAppInstallationUrl('/github-landing-page') : null)) - ); loadingDialog$: Observable = this.select((session) => session.loadingDialog); - constructor(protected store: SessionStore, private route: Router, private entryTypeMetadataService: EntryTypeMetadataService) { + constructor(protected store: SessionStore, private entryTypeMetadataService: EntryTypeMetadataService) { super(store); } - - /** - * Generate the general GitHub App installation URL - * - * @param {string} redirectPath The page to redirect to after installation is complete - * @returns {string} - * @memberof WorkflowQuery - */ - generateGitHubAppInstallationUrl(redirectPath: string): string { - let queryParams = new HttpParams(); - // Can only provide a state query parameter - // https://docs.github.com/en/apps/sharing-github-apps/sharing-your-github-app - queryParams = queryParams.set('state', redirectPath); - return Dockstore.GITHUB_APP_INSTALLATION_URL + '/installations/new?' + queryParams.toString(); - } } diff --git a/src/app/shared/snackbar.directive.ts b/src/app/shared/snackbar.directive.ts index 73485148d0..7aaad0487b 100644 --- a/src/app/shared/snackbar.directive.ts +++ b/src/app/shared/snackbar.directive.ts @@ -1,8 +1,9 @@ import { Directive, HostListener } from '@angular/core'; -import { MatSnackBar } from '@angular/material/snack-bar'; +import { MatLegacySnackBar as MatSnackBar } from '@angular/material/legacy-snack-bar'; @Directive({ selector: '[appSnackbar]', + standalone: true, }) export class SnackbarDirective { constructor(private matSnackBar: MatSnackBar) {} diff --git a/src/app/shared/state/workflow.query.ts b/src/app/shared/state/workflow.query.ts index 952430f4a1..33cd3f0454 100644 --- a/src/app/shared/state/workflow.query.ts +++ b/src/app/shared/state/workflow.query.ts @@ -39,6 +39,9 @@ export class WorkflowQuery extends QueryEntity = this.descriptorType$.pipe( map((descriptorType: ToolDescriptor.TypeEnum) => descriptorType === ToolDescriptor.TypeEnum.WDL) ); + public isGalaxy$: Observable = this.descriptorType$.pipe( + map((descriptorType: ToolDescriptor.TypeEnum) => descriptorType === ToolDescriptor.TypeEnum.GALAXY) + ); constructor( protected store: WorkflowStore, private descriptorTypeCompatService: DescriptorTypeCompatService, diff --git a/src/app/shared/state/workflow.service.ts b/src/app/shared/state/workflow.service.ts index 828710f68b..fc4d53f573 100644 --- a/src/app/shared/state/workflow.service.ts +++ b/src/app/shared/state/workflow.service.ts @@ -6,7 +6,6 @@ import { BioWorkflow } from '../openapi/model/bioWorkflow'; import { Service } from '../openapi/model/service'; import { Notebook } from '../openapi/model/notebook'; import { ExtendedWorkflowService } from './extended-workflow.service'; -import { WorkflowQuery } from './workflow.query'; import { WorkflowStore } from './workflow.store'; @Injectable({ providedIn: 'root' }) @@ -21,11 +20,7 @@ export class WorkflowService { nsWorkflows$: BehaviorSubject> = new BehaviorSubject>(null); private copyBtnSource = new BehaviorSubject(null); // This is the currently selected copy button. copyBtn$ = this.copyBtnSource.asObservable(); - constructor( - private workflowStore: WorkflowStore, - private extendedWorkflowService: ExtendedWorkflowService, - private workflowQuery: WorkflowQuery - ) {} + constructor(private workflowStore: WorkflowStore, private extendedWorkflowService: ExtendedWorkflowService) {} /** * Converts the mapping of roles to workflows to a concatentation of all the workflows @@ -53,18 +48,6 @@ export class WorkflowService { } } - updateActiveTopic(topic: string) { - const newWorkflow = { ...this.workflowQuery.getActive(), topicManual: topic }; - this.workflowStore.upsert(newWorkflow.id, newWorkflow); - this.extendedWorkflowService.update(newWorkflow); - } - - updateActiveTopicSelection(topicSelection: Workflow.TopicSelectionEnum) { - const newWorkflow = { ...this.workflowQuery.getActive(), topicSelection: topicSelection }; - this.workflowStore.upsert(newWorkflow.id, newWorkflow); - this.extendedWorkflowService.update(newWorkflow); - } - get() { // Placeholder // this.http.get('https://akita.com').subscribe((entities) => this.workflowStore.set(entities)); diff --git a/src/app/shared/styles/entry-table.scss b/src/app/shared/styles/entry-table.scss index 04aadda48e..4bead7c00d 100644 --- a/src/app/shared/styles/entry-table.scss +++ b/src/app/shared/styles/entry-table.scss @@ -5,15 +5,15 @@ .mat-column-starredUsers, .mat-column-stars { max-width: 6rem; - justify-content: flex-end; color: mat.get-color-from-palette($dockstore-app-accent-1, darker); } .mat-column-all_authors { - max-width: 20rem; + max-width: 16rem; } .mat-column-descriptorType, +.mat-column-descriptorTypeSubclass, .mat-column-format { min-width: min-content; max-width: 14rem; diff --git a/src/app/container/info-tab/info-tab.component.css b/src/app/shared/styles/info-tab.component.scss similarity index 96% rename from src/app/container/info-tab/info-tab.component.css rename to src/app/shared/styles/info-tab.component.scss index b5351685e0..874ec6db35 100644 --- a/src/app/container/info-tab/info-tab.component.css +++ b/src/app/shared/styles/info-tab.component.scss @@ -1,5 +1,5 @@ /* - * Copyright 2017 OICR + * Copyright 2024 OICR and UCSC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/app/shared/styles/radio-button-cards.scss b/src/app/shared/styles/radio-button-cards.scss new file mode 100644 index 0000000000..6b3b0c4f39 --- /dev/null +++ b/src/app/shared/styles/radio-button-cards.scss @@ -0,0 +1,41 @@ +/* + * Copyright 2024 OICR + * + * Licensed under the Apache License, Version 2.0 (the "License") + * you may not use this file except in compliance with the License + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +@use '@angular/material' as mat; +@import 'materialColorScheme.scss'; + +// This file contains styles for mat-cards with radio buttons + +// This style ensures that the mat radio content text fills up the whole mat-card +:host ::ng-deep .mat-radio-label-content { + width: 100%; +} + +// Wraps the text because by default, mat-radio-label doesn't wrap +:host ::ng-deep .mat-radio-label { + white-space: normal; +} + +:host ::ng-deep .mat-form-field-wrapper { + // Removing the padding because we don't need hint + padding-bottom: 0; +} + +// Highlights the card with the selected radio button +.selected-card { + border-width: 0.15rem; + border-color: mat.get-color-from-palette($kim-secondary, 2); +} diff --git a/src/app/shared/tool-lister.ts b/src/app/shared/tool-lister.ts index 2b4883620a..14a95a28ce 100644 --- a/src/app/shared/tool-lister.ts +++ b/src/app/shared/tool-lister.ts @@ -14,7 +14,7 @@ * limitations under the License. */ import { AfterViewInit, Directive, ElementRef, OnDestroy, ViewChild } from '@angular/core'; -import { MatPaginator } from '@angular/material/paginator'; +import { MatLegacyPaginator as MatPaginator } from '@angular/material/legacy-paginator'; import { MatSort } from '@angular/material/sort'; import { fromEvent, merge, Observable, Subject } from 'rxjs'; import { debounceTime, distinctUntilChanged, takeUntil, tap } from 'rxjs/operators'; diff --git a/src/app/shared/track-login.service.ts b/src/app/shared/track-login.service.ts index d6073e8161..fc5ed30ed1 100644 --- a/src/app/shared/track-login.service.ts +++ b/src/app/shared/track-login.service.ts @@ -15,8 +15,8 @@ */ import { Injectable } from '@angular/core'; -import { AuthService } from 'ng2-ui-auth'; import { BehaviorSubject, Subject } from 'rxjs'; +import { AuthService } from '../ng2-ui-auth/public_api'; @Injectable() export class TrackLoginService { diff --git a/src/app/shared/url-resolver.service.ts b/src/app/shared/url-resolver.service.ts index e1a9b1bca5..3fee55b299 100644 --- a/src/app/shared/url-resolver.service.ts +++ b/src/app/shared/url-resolver.service.ts @@ -74,6 +74,10 @@ export class UrlResolverService { } } + public showPageNotFound(): void { + this.router.navigate(['page-not-found'], { skipLocationChange: true }); + } + private isEncoded(uri: string): boolean { if (uri) { return uri !== decodeURIComponent(uri); diff --git a/src/app/shared/user/user.query.ts b/src/app/shared/user/user.query.ts index 5a2f117041..239b54a6dd 100644 --- a/src/app/shared/user/user.query.ts +++ b/src/app/shared/user/user.query.ts @@ -12,6 +12,7 @@ export class UserQuery extends Query { noUser$ = this.user$.pipe(map((user) => !user)); isCurator$: Observable = this.select((state) => (state.user ? state.user.curator : null)); isAdmin$: Observable = this.select((state) => (state.user ? state.user.isAdmin : null)); + isPlatformPartner$: Observable = this.select((state) => (state.user ? (state.user.platformPartner ? true : false) : null)); isAdminOrCurator$: Observable = this.select((state) => (state.user ? state.user.curator || state.user.isAdmin : null)); extendedUserData$: Observable = this.select((state) => state.extendedUserData); userId$: Observable = this.select((state) => (state.user ? state.user.id : null)); diff --git a/src/app/shared/user/user.service.ts b/src/app/shared/user/user.service.ts index a9022a25fa..38fdbf5079 100644 --- a/src/app/shared/user/user.service.ts +++ b/src/app/shared/user/user.service.ts @@ -1,17 +1,20 @@ import { Injectable } from '@angular/core'; import { Router } from '@angular/router'; import { transaction } from '@datorama/akita'; -import { AuthService } from 'ng2-ui-auth'; import { GravatarService } from '../../gravatar/gravatar.service'; +import { AuthService } from '../../ng2-ui-auth/public_api'; import { AlertService } from '../alert/state/alert.service'; import { TokenService } from '../state/token.service'; -import { WorkflowService } from '../state/workflow.service'; +import { MyWorkflowsService } from '../../myworkflows/myworkflows.service'; +import { MytoolsService } from '../../mytools/mytools.service'; +import { EntryType } from '../enum/entry-type'; import { Configuration, ExtendedUserData, User, UsersService, Workflow } from '../openapi'; import { TrackLoginService } from '../track-login.service'; import { UserStore } from './user.store'; @Injectable({ providedIn: 'root' }) export class UserService { + EntryType = EntryType; constructor( private userStore: UserStore, private authService: AuthService, @@ -19,7 +22,8 @@ export class UserService { private configuration: Configuration, private tokenService: TokenService, private alertService: AlertService, - private workflowService: WorkflowService, + private myWorkflowsService: MyWorkflowsService, + private mytoolsService: MytoolsService, private trackLoginService: TrackLoginService, private router: Router, private gravatarService: GravatarService @@ -50,12 +54,18 @@ export class UserService { * * @param userId */ - addUserToWorkflows(userId: number): void { + addUserToWorkflows(userId: number, entryType: EntryType): void { this.alertService.start('Adding user to existing workflows and tools on Dockstore'); this.usersService.addUserToDockstoreWorkflows(userId).subscribe( (workflows: Array) => { this.alertService.detailedSuccess(); - this.workflowService.setWorkflows(workflows); + // This endpoint currently only returns the user's BioWorkflows, and not workflows of all types. + // For consistency, ignoring the workflows response and re-requesting entries of the desired type. + if (entryType === EntryType.Tool) { + this.mytoolsService.getMyEntries(userId, entryType); + } else { + this.myWorkflowsService.getMyEntries(userId, entryType); + } }, (error) => this.alertService.detailedError(error) ); diff --git a/src/app/shared/validationMessages.model.ts b/src/app/shared/validationMessages.model.ts index ed5dc99607..306fe4ba9d 100644 --- a/src/app/shared/validationMessages.model.ts +++ b/src/app/shared/validationMessages.model.ts @@ -67,29 +67,29 @@ export const exampleDescriptorPatterns = { }; export const validationDescriptorPatterns = { - gitPath: '^([a-zA-Z0-9]+([-_.][a-zA-Z0-9]+)*)/([a-zA-Z0-9]+([-_.][a-zA-Z0-9]+)*)$', - smkPath: '^/([^/?:*|<>]++/)*(Snakefile|[^./?:*|<>]++.smk))$', - cwlPath: '^/([^/?:*|<>]+/)*[^/?:*|<>]+.(cwl|yaml|yml)', - wdlPath: '^/([^/?:*|<>]+/)*[^/?:*|<>]+.wdl$', - nflPath: '^/([^/?:*|<>]+/)*[^/?:*|<>]+.(config)', - dockerfilePath: '^/([^/?:*|<>]+/)*(([a-zA-Z]+[.])?Dockerfile|Dockerfile([.][a-zA-Z]+)?)$', - testFilePath: '^/([^/?:*|<>]+/)*[^/?:*|<>]+.(json|yml|yaml)$', - imagePath: '^(([a-zA-Z0-9]+([-_.][a-zA-Z0-9]+)*)|_)/([a-zA-Z0-9]+([-_.][a-zA-Z0-9]+)*)$', - repoNameWithSlashesImagePath: '^(([a-zA-Z0-9]+([-_.][a-zA-Z0-9]+)*)|_)/([a-zA-Z0-9]+([-_./][a-zA-Z0-9]+)*)$', - privateAmazonImagePath: '^_/([a-zA-Z0-9]+([-_./][a-zA-Z0-9]+)*)$', // Has an empty namespace. Allows for slashes in repo name - toolName: '^[a-zA-Z0-9]+([-_][a-zA-Z0-9]+)*$', - label: '^(| *([a-zA-Z0-9]+(-[a-zA-Z0-9]+)*)( *, *([a-zA-Z0-9]+(-[a-zA-Z0-9]+)*))* *)$', - versionTag: '^[a-zA-Z0-9]+([-_.]*[a-zA-Z0-9]+)*$', - reference: '[\\w-]+((/|.)[\\w-]+)*', - workflowDescriptorPath: '^/([^\\/?:*|<>]+/)*(Snakefile|[^\\/?:*|<>]+.(smk|cwl|wdl|yaml|yml|config|ga))', - workflowName: '[a-zA-Z0-9]+([-_][a-zA-Z0-9]+)*', - cwlTestParameterFilePath: '^/([^/?:*|<>]+/)*[^/?:*|<>]+.(json|yml|yaml)$', - wdlTestParameterFilePath: '^/([^/?:*|<>]+/)*[^/?:*|<>]+.(json|yml|yaml)$', - testParameterFilePath: '^/([^/?:*|<>]+/)*[^/?:*|<>]+.(json|yml|yaml)$', + gitPath: '^([a-zA-Z0-9]+([\\-_.][a-zA-Z0-9]+)*)\\/([a-zA-Z0-9]+([\\-_.][a-zA-Z0-9]+)*)$', + smkPath: '^\\/([^\\/?:*\\|<>]+\\/)*(Snakefile|[^.\\/?:*\\|<>]+.smk)$', + cwlPath: '^\\/([^\\/?:*\\|<>]+\\/)*[^\\/?:*\\|<>]+.(cwl|yaml|yml)', + wdlPath: '^\\/([^\\/?:*\\|<>]+\\/)*[^\\/?:*\\|<>]+.wdl$', + nflPath: '^\\/([^\\/?:*\\|<>]+\\/)*[^\\/?:*\\|<>]+.(config)', + dockerfilePath: '^\\/([^\\/?:*\\|<>]+\\/)*(([a-zA-Z]+[.])?Dockerfile|Dockerfile([.][a-zA-Z]+)?)$', + testFilePath: '^\\/([^\\/?:*\\|<>]+\\/)*[^\\/?:*\\|<>]+.(json|yml|yaml)$', + imagePath: '^(([a-zA-Z0-9]+([\\-_.][a-zA-Z0-9]+)*)|_)\\/([a-zA-Z0-9]+([\\-_.][a-zA-Z0-9]+)*)$', + repoNameWithSlashesImagePath: '^(([a-zA-Z0-9]+([\\-_.][a-zA-Z0-9]+)*)|_)\\/([a-zA-Z0-9]+([\\-_.\\/][a-zA-Z0-9]+)*)$', + privateAmazonImagePath: '^_\\/([a-zA-Z0-9]+([\\-_.\\/][a-zA-Z0-9]+)*)$', // Has an empty namespace. Allows for slashes in repo name + toolName: '^[a-zA-Z0-9]+([\\-_][a-zA-Z0-9]+)*$', + label: '^(\\| *([a-zA-Z0-9]+(-[a-zA-Z0-9]+)*)( *, *([a-zA-Z0-9]+(-[a-zA-Z0-9]+)*))* *)$', + versionTag: '^[a-zA-Z0-9]+([\\-_.]*[a-zA-Z0-9]+)*$', + reference: '[\\w\\-]+((\\/|.)[\\w\\-]+)*', + workflowDescriptorPath: '^\\/([^\\/?:*\\|<>]+\\/)*(Snakefile|[^\\/?:*\\|<>]+.(smk|cwl|wdl|yaml|yml|config|ga))', + workflowName: '[a-zA-Z0-9]+([\\-_][a-zA-Z0-9]+)*', + cwlTestParameterFilePath: '^\\/([^\\/?:*\\|<>]+\\/)*[^\\/?:*\\|<>]+.(json|yml|yaml)$', + wdlTestParameterFilePath: '^\\/([^\\/?:*\\|<>]+\\/)*[^\\/?:*\\|<>]+.(json|yml|yaml)$', + testParameterFilePath: '^\\/([^\\/?:*\\|<>]+\\/)*[^\\/?:*\\|<>]+.(json|yml|yaml)$', // This should be used for all validation patterns that are alphanumeric with internal underscores, hyphens, and periods. - alphanumericInternalUHP: '^[a-zA-Z0-9]+([-_.]*[a-zA-Z0-9]+)*$', - amazonDockerRegistryPath: '(^[a-zA-Z0-9]+([-_][a-zA-Z0-9]+)*.dkr.ecr.[a-zA-Z0-9]+([-_][a-zA-Z0-9]+)*.amazonaws.com)|(public.ecr.aws)', // public and private path - privateAmazonDockerRegistryPath: '^[a-zA-Z0-9]+([-_][a-zA-Z0-9]+)*.dkr.ecr.[a-zA-Z0-9]+([-_][a-zA-Z0-9]+)*.amazonaws.com', + alphanumericInternalUHP: '^[a-zA-Z0-9]+([\\-_.]*[a-zA-Z0-9]+)*$', + amazonDockerRegistryPath: '(^[a-zA-Z0-9]+([\\-_][a-zA-Z0-9]+)*.dkr.ecr.[a-zA-Z0-9]+([\\-_][a-zA-Z0-9]+)*.amazonaws.com)|(public.ecr.aws)', // public and private path + privateAmazonDockerRegistryPath: '^[a-zA-Z0-9]+([\\-_][a-zA-Z0-9]+)*.dkr.ecr.[a-zA-Z0-9]+([\\-_][a-zA-Z0-9]+)*.amazonaws.com', sevenBridgesDockerRegistryPath: '^([a-zA-Z0-9]+-)?images.sbgenomics.com', }; diff --git a/src/app/shared/view.ts b/src/app/shared/view.ts index 35573134f4..67812b19d7 100644 --- a/src/app/shared/view.ts +++ b/src/app/shared/view.ts @@ -13,8 +13,8 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { Directive, Input, OnDestroy } from '@angular/core'; -import { Observable, Subject } from 'rxjs'; +import { Directive, Input } from '@angular/core'; +import { Observable } from 'rxjs'; import { AlertQuery } from './alert/state/alert.query'; import { Base } from './base'; import { DateService } from './date.service'; diff --git a/src/app/sitemap/sitemap.component.html b/src/app/sitemap/sitemap.component.html index 7e4ab9db6e..2e48062f63 100644 --- a/src/app/sitemap/sitemap.component.html +++ b/src/app/sitemap/sitemap.component.html @@ -43,7 +43,7 @@

    Using Dockstore

    News and Events
  • - + Advanced Features
  • diff --git a/src/app/sitemap/sitemap.component.spec.ts b/src/app/sitemap/sitemap.component.spec.ts index 1b6c97fd3b..5c707d75f4 100644 --- a/src/app/sitemap/sitemap.component.spec.ts +++ b/src/app/sitemap/sitemap.component.spec.ts @@ -9,8 +9,7 @@ describe('SitemapComponent', () => { beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [SitemapComponent], - imports: [RouterTestingModule], + imports: [RouterTestingModule, SitemapComponent], }).compileComponents(); }) ); diff --git a/src/app/sitemap/sitemap.component.ts b/src/app/sitemap/sitemap.component.ts index 4aaa14c016..1282ef3863 100644 --- a/src/app/sitemap/sitemap.component.ts +++ b/src/app/sitemap/sitemap.component.ts @@ -1,10 +1,14 @@ import { Component } from '@angular/core'; import { Dockstore } from '../shared/dockstore.model'; +import { RouterLink } from '@angular/router'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; @Component({ selector: 'app-sitemap', templateUrl: './sitemap.component.html', styleUrls: ['./sitemap.component.css'], + standalone: true, + imports: [FlexModule, RouterLink], }) export class SitemapComponent { Dockstore = Dockstore; diff --git a/src/app/source-file-tabs/source-file-tabs.component.html b/src/app/source-file-tabs/source-file-tabs.component.html index bcbc518aa1..b2aec3ba1a 100644 --- a/src/app/source-file-tabs/source-file-tabs.component.html +++ b/src/app/source-file-tabs/source-file-tabs.component.html @@ -21,7 +21,12 @@ page.
    - +
    + + warningCould not find the specified file.
    Other files are displayed below. +
    +
    +
    diff --git a/src/app/source-file-tabs/source-file-tabs.component.spec.ts b/src/app/source-file-tabs/source-file-tabs.component.spec.ts index 31c35ea5d1..61f165c16d 100644 --- a/src/app/source-file-tabs/source-file-tabs.component.spec.ts +++ b/src/app/source-file-tabs/source-file-tabs.component.spec.ts @@ -1,13 +1,14 @@ import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { RouterTestingModule } from '@angular/router/testing'; import { NO_ERRORS_SCHEMA } from '@angular/core'; import { MapFriendlyValuesPipe } from 'app/search/map-friendly-values.pipe'; import { FileService } from 'app/shared/file.service'; import { FileStubService, SourceFileTabsStubService } from 'app/test/service-stubs'; import { SourceFileTabsComponent } from './source-file-tabs.component'; import { SourceFileTabsService } from './source-file-tabs.service'; -import { MatDialogModule } from '@angular/material/dialog'; +import { MatLegacyDialogModule as MatDialogModule } from '@angular/material/legacy-dialog'; import { DescriptorLanguageService } from '../shared/entry/descriptor-language.service'; describe('SourceFileTabsComponent', () => { @@ -17,8 +18,7 @@ describe('SourceFileTabsComponent', () => { beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [SourceFileTabsComponent, MapFriendlyValuesPipe], - imports: [HttpClientTestingModule, MatDialogModule, HttpClientTestingModule], + imports: [HttpClientTestingModule, MatDialogModule, RouterTestingModule, SourceFileTabsComponent, MapFriendlyValuesPipe], providers: [ { provide: SourceFileTabsService, useClass: SourceFileTabsStubService }, { provide: FileService, useClass: FileStubService }, diff --git a/src/app/source-file-tabs/source-file-tabs.component.ts b/src/app/source-file-tabs/source-file-tabs.component.ts index c5ce601828..2ee7876504 100644 --- a/src/app/source-file-tabs/source-file-tabs.component.ts +++ b/src/app/source-file-tabs/source-file-tabs.component.ts @@ -1,8 +1,9 @@ -import { KeyValue } from '@angular/common'; +import { KeyValue, Location, NgIf, NgFor, AsyncPipe, KeyValuePipe } from '@angular/common'; import { Component, Input, OnChanges } from '@angular/core'; -import { MatDialog } from '@angular/material/dialog'; -import { MatSelectChange } from '@angular/material/select'; -import { MatTabChangeEvent } from '@angular/material/tabs'; +import { ActivatedRoute } from '@angular/router'; +import { MatLegacyDialog as MatDialog } from '@angular/material/legacy-dialog'; +import { MatLegacySelectChange as MatSelectChange, MatLegacySelectModule } from '@angular/material/legacy-select'; +import { MatLegacyTabChangeEvent as MatTabChangeEvent, MatLegacyTabsModule } from '@angular/material/legacy-tabs'; import { FileTreeComponent } from 'app/file-tree/file-tree.component'; import { bootstrap4largeModalSize } from 'app/shared/constants'; import { FileService } from 'app/shared/file.service'; @@ -11,18 +12,51 @@ import { Observable } from 'rxjs'; import { finalize } from 'rxjs/operators'; import { WorkflowQuery } from '../shared/state/workflow.query'; import { SourceFileTabsService } from './source-file-tabs.service'; +import { CodeEditorComponent } from '../shared/code-editor/code-editor.component'; +import { ClipboardModule } from '@angular/cdk/clipboard'; +import { MatLegacyOptionModule } from '@angular/material/legacy-core'; +import { MatLegacyFormFieldModule } from '@angular/material/legacy-form-field'; +import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { MatToolbarModule } from '@angular/material/toolbar'; +import { MatIconModule } from '@angular/material/icon'; +import { MatLegacyCardModule } from '@angular/material/legacy-card'; +import { LoadingComponent } from '../shared/loading/loading.component'; @Component({ selector: 'app-source-file-tabs', templateUrl: './source-file-tabs.component.html', styleUrls: ['./source-file-tabs.component.scss'], + standalone: true, + imports: [ + LoadingComponent, + NgIf, + MatLegacyCardModule, + MatIconModule, + NgFor, + MatLegacyTabsModule, + MatToolbarModule, + FlexModule, + MatLegacyButtonModule, + MatLegacyTooltipModule, + MatLegacyFormFieldModule, + MatLegacySelectModule, + MatLegacyOptionModule, + ClipboardModule, + CodeEditorComponent, + AsyncPipe, + KeyValuePipe, + ], }) export class SourceFileTabsComponent implements OnChanges { constructor( private fileService: FileService, private sourceFileTabsService: SourceFileTabsService, private matDialog: MatDialog, - private workflowQuery: WorkflowQuery + private workflowQuery: WorkflowQuery, + private activatedRoute: ActivatedRoute, + private location: Location ) { this.isPublished$ = this.workflowQuery.workflowIsPublished$; this.primaryDescriptors = []; @@ -34,12 +68,14 @@ export class SourceFileTabsComponent implements OnChanges { @Input() version: WorkflowVersion; loading = true; displayError = false; + notFoundError = false; currentFile: SourceFile | null; validationMessage: Map; fileName: string; relativePath: string; downloadFilePath: string; fileTabs: Map; + selectedTabIndex: number = 0; primaryDescriptors: SourceFile[] | null; primaryDescriptorPath: string; isCurrentFilePrimary: boolean | null; @@ -55,6 +91,12 @@ export class SourceFileTabsComponent implements OnChanges { this.setupVersionFileTabs(); } + ngOnInit() { + this.activatedRoute.queryParams.subscribe((params) => { + this.findFile(); + }); + } + setupVersionFileTabs() { this.loading = true; this.displayError = false; @@ -72,15 +114,13 @@ export class SourceFileTabsComponent implements OnChanges { this.version.workflow_path, this.descriptorType ); - if (this.fileTabs.size > 0) { - this.changeFileType(this.fileTabs.values().next().value); - } sourceFiles.forEach((sourceFile) => { if (this.isPrimaryDescriptor(sourceFile.path)) { this.primaryDescriptors.push(sourceFile); this.primaryDescriptorPath = sourceFile.path; } }); + this.findFile(); }, () => { this.displayError = true; @@ -88,12 +128,43 @@ export class SourceFileTabsComponent implements OnChanges { ); } + findFile() { + const queryFilePath = this.activatedRoute.snapshot.queryParams['file']; + if (this.fileTabs?.size > 0) { + // Attempt to find the file that is indicated by the 'file' query parameter. + // If we are successful, select the file, change the tab, and return. + if (queryFilePath) { + for (let tabIndex = 0; tabIndex < this.fileTabs.size; tabIndex++) { + const sourceFiles = Array.from(this.fileTabs.values())[tabIndex]; + for (let sourceFile of sourceFiles) { + if (sourceFile.absolutePath === queryFilePath) { + this.selectFile(sourceFile); + this.changeTab(tabIndex); + return; + } + } + } + } + // Otherwise, select the first file in the first tab. + const files = this.fileTabs.values().next().value; + this.selectFile(files[0]); + this.changeTab(0); + } + // If there was a 'file' query parameter and we've gotten to this point, we couldn't find a matching file. + if (queryFilePath) { + this.notFoundError = true; + } + } + + changeTab(tabIndex: number) { + this.selectedTabIndex = tabIndex; + } + /** * Sets the validation message and new default selected file * @param fileType */ changeFileType(files: SourceFile[]) { - this.selectFile(files[0]); this.validationMessage = this.sourceFileTabsService.getValidationMessage(files, this.version); } @@ -107,17 +178,42 @@ export class SourceFileTabsComponent implements OnChanges { this.version.name, this.relativePath ); + this.isCurrentFilePrimary = this.isPrimaryDescriptor(file.path); } else { this.fileName = null; this.relativePath = null; this.downloadFilePath = null; + this.isCurrentFilePrimary = false; } this.currentFile = file; - this.isCurrentFilePrimary = this.isPrimaryDescriptor(this.currentFile.path); + this.setFilePathInLocation(file); + this.notFoundError = false; + } + + setFilePathInLocation(file: SourceFile) { + const url = this.location.path(); + const root = url.split('?')[0]; + const params = new URLSearchParams(url.split('?')[1] ?? ''); + // Don't modify the URL if it's not tracking the current tab. + if (!params.has('tab')) { + return; + } + // Add the sourcefile's absolute path as the 'file' query parameter. + if (file) { + params.set('file', file.absolutePath); + } else { + params.delete('file'); + } + this.location.replaceState(root, params.toString()); } matTabChange(event: MatTabChangeEvent) { - this.changeFileType(this.fileTabs.get(event.tab.textLabel)); + const files = this.fileTabs.get(event.tab.textLabel); + // If the new tab has files, select the first one. + if (files.indexOf(this.currentFile) < 0) { + this.selectFile(files[0]); + } + this.changeFileType(files); } matSelectChange(event: MatSelectChange) { diff --git a/src/app/source-file-tabs/source-file-tabs.service.spec.ts b/src/app/source-file-tabs/source-file-tabs.service.spec.ts index a316411665..13d4324d95 100644 --- a/src/app/source-file-tabs/source-file-tabs.service.spec.ts +++ b/src/app/source-file-tabs/source-file-tabs.service.spec.ts @@ -8,12 +8,11 @@ import { DescriptorTypeCompatStubService, FileStubService, ProviderStubService, import { ProviderService } from '../shared/provider.service'; import { SourceFileTabsService } from './source-file-tabs.service'; import { DescriptorLanguageService } from '../shared/entry/descriptor-language.service'; -import { WorkflowModule } from '../shared/modules/workflow.module'; describe('SourceFileTabsService', () => { beforeEach(() => TestBed.configureTestingModule({ - imports: [HttpClientTestingModule, WorkflowModule], + imports: [HttpClientTestingModule], providers: [ { provide: FileService, useClass: FileStubService }, { provide: WorkflowsService, useClass: WorkflowsStubService }, diff --git a/src/app/stargazers/stargazers.component.spec.ts b/src/app/stargazers/stargazers.component.spec.ts index 2007f582d9..1502dfebb3 100644 --- a/src/app/stargazers/stargazers.component.spec.ts +++ b/src/app/stargazers/stargazers.component.spec.ts @@ -15,7 +15,7 @@ */ import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { MatCardModule } from '@angular/material/card'; +import { MatLegacyCardModule as MatCardModule } from '@angular/material/legacy-card'; import { MatIconModule } from '@angular/material/icon'; import { StarentryService } from '../shared/starentry.service'; import { UserService } from '../shared/user/user.service'; @@ -30,8 +30,7 @@ describe('StargazersComponent', () => { beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [StargazersComponent], - imports: [MatIconModule, MatCardModule], + imports: [MatIconModule, MatCardModule, StargazersComponent], providers: [ { provide: UserService, useClass: UserStubService }, { provide: StarringService, useClass: StarringStubService }, diff --git a/src/app/stargazers/stargazers.component.ts b/src/app/stargazers/stargazers.component.ts index 7555bc52ff..ef3e73bce5 100644 --- a/src/app/stargazers/stargazers.component.ts +++ b/src/app/stargazers/stargazers.component.ts @@ -22,11 +22,18 @@ import { User } from '../shared/openapi'; import { StarentryService } from '../shared/starentry.service'; import { UserService } from '../shared/user/user.service'; import { StarringService } from '../starring/starring.service'; +import { RouterLink } from '@angular/router'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { MatIconModule } from '@angular/material/icon'; +import { MatLegacyCardModule } from '@angular/material/legacy-card'; +import { NgIf, NgFor } from '@angular/common'; @Component({ selector: 'app-stargazers', templateUrl: './stargazers.component.html', styleUrls: ['./stargazers.component.css'], + standalone: true, + imports: [NgIf, MatLegacyCardModule, MatIconModule, FlexModule, NgFor, RouterLink], }) export class StargazersComponent extends Base implements OnInit { starGazers: User[]; diff --git a/src/app/stargazers/stargazers.module.ts b/src/app/stargazers/stargazers.module.ts index eb2d1dd75e..96cb830a3f 100644 --- a/src/app/stargazers/stargazers.module.ts +++ b/src/app/stargazers/stargazers.module.ts @@ -15,18 +15,17 @@ */ import { CommonModule } from '@angular/common'; import { NgModule } from '@angular/core'; -import { FlexLayoutModule } from '@angular/flex-layout'; +import { FlexLayoutModule } from '@ngbracket/ngx-layout'; import { MatIconModule } from '@angular/material/icon'; import { RouterModule } from '@angular/router'; import { StarentryService } from '../shared/starentry.service'; import { StarringService } from '../starring/starring.service'; -import { CustomMaterialModule } from './../shared/modules/material.module'; + import { StargazersComponent } from './stargazers.component'; @NgModule({ - imports: [CommonModule, FlexLayoutModule, MatIconModule, CustomMaterialModule, RouterModule], - declarations: [StargazersComponent], + imports: [CommonModule, FlexLayoutModule, MatIconModule, RouterModule, StargazersComponent], exports: [StargazersComponent], providers: [StarringService, StarentryService], }) diff --git a/src/app/starredentries/starredentries.component.spec.ts b/src/app/starredentries/starredentries.component.spec.ts index 4c03dcab30..cabd65bd1b 100644 --- a/src/app/starredentries/starredentries.component.spec.ts +++ b/src/app/starredentries/starredentries.component.spec.ts @@ -1,7 +1,22 @@ +import { HttpClientTestingModule } from '@angular/common/http/testing'; import { NO_ERRORS_SCHEMA } from '@angular/core'; import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { MatLegacyDialogModule } from '@angular/material/legacy-dialog'; +import { MatLegacySnackBarModule } from '@angular/material/legacy-snack-bar'; +import { NoopAnimationsModule } from '@angular/platform-browser/animations'; import { RouterTestingModule } from '@angular/router/testing'; +import { MytoolsService } from '../mytools/mytools.service'; +import { MyWorkflowsService } from '../myworkflows/myworkflows.service'; +import { AuthService } from '../ng2-ui-auth/public_api'; +import { ContainerService } from '../shared/container.service'; +import { DateService } from '../shared/date.service'; +import { DescriptorLanguageService } from '../shared/entry/descriptor-language.service'; import { ImageProviderService } from '../shared/image-provider.service'; +import { Configuration } from '../shared/openapi'; +import { MyEntriesStateService } from '../shared/state/my-entries.service'; +import { MyEntriesStore } from '../shared/state/my-entries.store'; +import { TrackLoginService } from '../shared/track-login.service'; +import { UrlResolverService } from '../shared/url-resolver.service'; import { ProviderService } from './../shared/provider.service'; import { StarentryService } from './../shared/starentry.service'; import { UsersService } from './../shared/openapi/api/users.service'; @@ -13,6 +28,13 @@ import { StarringStubService, UsersStubService, OrgLogoStubService, + AuthStubService, + DescriptorLanguageStubService, + UrlResolverStubService, + ContainerStubService, + TrackLoginStubService, + ConfigurationStub, + DateStubService, } from './../test/service-stubs'; import { StarredEntriesComponent } from './starredentries.component'; @@ -23,16 +45,33 @@ describe('StarredEntriesComponent', () => { beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - imports: [RouterTestingModule], - declarations: [StarredEntriesComponent], + imports: [ + RouterTestingModule, + StarredEntriesComponent, + MatLegacySnackBarModule, + NoopAnimationsModule, + HttpClientTestingModule, + MatLegacyDialogModule, + ], schemas: [NO_ERRORS_SCHEMA], providers: [ { provide: StarringService, useClass: StarringStubService }, { provide: ImageProviderService, useClass: ImageProviderStubService }, + { provide: DateService, useClass: DateStubService }, + MyEntriesStateService, + MyEntriesStore, + MytoolsService, + MyWorkflowsService, ProviderService, + { provide: Configuration, useClass: ConfigurationStub }, + { provide: AuthService, useClass: AuthStubService }, + { provide: ContainerService, useClass: ContainerStubService }, { provide: StarentryService, useClass: StarEntryStubService }, { provide: UsersService, useClass: UsersStubService }, { provide: OrgLogoService, useClass: OrgLogoStubService }, + { provide: DescriptorLanguageService, useClass: DescriptorLanguageStubService }, + { provide: UrlResolverService, useClass: UrlResolverStubService }, + { provide: TrackLoginService, useClass: TrackLoginStubService }, ], }).compileComponents(); }) diff --git a/src/app/starredentries/starredentries.component.ts b/src/app/starredentries/starredentries.component.ts index c4edb00327..a2d4efd1df 100644 --- a/src/app/starredentries/starredentries.component.ts +++ b/src/app/starredentries/starredentries.component.ts @@ -2,23 +2,72 @@ import { Component, OnInit } from '@angular/core'; import { Base } from '../shared/base'; import { ImageProviderService } from '../shared/image-provider.service'; import { ProviderService } from '../shared/provider.service'; -import { DockstoreTool, Entry, Organization, Workflow, EntryType as OpenApiEntryType } from '../shared/openapi'; +import { Entry, Organization, Workflow, EntryType as OpenApiEntryType } from '../shared/openapi'; import { UserQuery } from '../shared/user/user.query'; import { UsersService } from './../shared/openapi/api/users.service'; -import { MatTabChangeEvent } from '@angular/material/tabs'; +import { MatLegacyTabChangeEvent as MatTabChangeEvent, MatLegacyTabsModule } from '@angular/material/legacy-tabs'; import { UntypedFormControl } from '@angular/forms'; import { ExtendedDockstoreTool } from 'app/shared/models/ExtendedDockstoreTool'; import { ExtendedWorkflow } from 'app/shared/models/ExtendedWorkflow'; import { OrgLogoService } from '../shared/org-logo.service'; import { EntryType } from '../shared/enum/entry-type'; -import { ActivatedRoute } from '@angular/router'; -import { Location } from '@angular/common'; +import { ActivatedRoute, RouterLink } from '@angular/router'; +import { Location, NgIf, NgClass, NgFor, NgTemplateOutlet, SlicePipe, DatePipe } from '@angular/common'; import { Dockstore } from 'app/shared/dockstore.model'; +import { DescriptorLanguagePipe } from '../shared/entry/descriptor-language.pipe'; +import { BaseUrlPipe } from '../shared/entry/base-url.pipe'; +import { RouterLinkPipe } from '../entry/router-link.pipe'; +import { GravatarPipe } from '../gravatar/gravatar.pipe'; +import { OrganizationStarringComponent } from '../organizations/organization/organization-starring/organization-starring.component'; +import { ImgFallbackDirective } from '../shared/img-fallback.directive'; +import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; +import { MatLegacyChipsModule } from '@angular/material/legacy-chips'; +import { MarkdownWrapperComponent } from '../shared/markdown-wrapper/markdown-wrapper.component'; +import { StarringComponent } from '../starring/starring.component'; +import { MatLegacyCardModule } from '@angular/material/legacy-card'; +import { ExtendedModule } from '@ngbracket/ngx-layout/extended'; +import { OrganizationStargazersComponent } from '../organizations/organization/organization-stargazers/organization-stargazers.component'; +import { MatIconModule } from '@angular/material/icon'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { StargazersComponent } from '../stargazers/stargazers.component'; +import { HeaderComponent } from '../header/header.component'; +import { MySidebarComponent } from '../my-sidebar/my-sidebar.component'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; @Component({ selector: 'app-starredentries', templateUrl: './starredentries.component.html', styleUrls: ['./starredentries.component.scss'], + standalone: true, + imports: [ + FlexModule, + MySidebarComponent, + HeaderComponent, + NgIf, + StargazersComponent, + MatLegacyButtonModule, + MatIconModule, + OrganizationStargazersComponent, + MatLegacyTabsModule, + NgClass, + ExtendedModule, + MatLegacyCardModule, + NgFor, + NgTemplateOutlet, + RouterLink, + StarringComponent, + MarkdownWrapperComponent, + MatLegacyChipsModule, + MatLegacyTooltipModule, + ImgFallbackDirective, + OrganizationStarringComponent, + SlicePipe, + DatePipe, + GravatarPipe, + RouterLinkPipe, + BaseUrlPipe, + DescriptorLanguagePipe, + ], }) export class StarredEntriesComponent extends Base implements OnInit { Dockstore = Dockstore; diff --git a/src/app/starring/starring.component.spec.ts b/src/app/starring/starring.component.spec.ts index 834844bed8..5425b5df18 100644 --- a/src/app/starring/starring.component.spec.ts +++ b/src/app/starring/starring.component.spec.ts @@ -15,7 +15,8 @@ */ import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; import { MatIconModule } from '@angular/material/icon'; -import { MatSnackBarModule } from '@angular/material/snack-bar'; +import { MatLegacySnackBarModule as MatSnackBarModule } from '@angular/material/legacy-snack-bar'; +import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; import { ContainerService } from '../shared/container.service'; import { StarentryService } from '../shared/starentry.service'; @@ -38,8 +39,7 @@ describe('StarringComponent', () => { beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [StarringComponent], - imports: [MatIconModule, MatSnackBarModule], + imports: [MatIconModule, MatSnackBarModule, MatLegacyTooltipModule, StarringComponent], providers: [ { provide: StarringService, useClass: StarringStubService }, { provide: TrackLoginService, useClass: TrackLoginStubService }, diff --git a/src/app/starring/starring.component.ts b/src/app/starring/starring.component.ts index 1b8a43217b..50f21753c7 100644 --- a/src/app/starring/starring.component.ts +++ b/src/app/starring/starring.component.ts @@ -25,11 +25,16 @@ import { TrackLoginService } from '../shared/track-login.service'; import { UserQuery } from '../shared/user/user.query'; import { StarEntry } from './StarEntry'; import { StarringService } from './starring.service'; +import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; +import { MatIconModule } from '@angular/material/icon'; +import { NgClass, NgIf } from '@angular/common'; @Component({ selector: 'app-starring', templateUrl: './starring.component.html', styleUrls: ['./starring.component.scss'], + standalone: true, + imports: [NgClass, NgIf, MatIconModule, MatLegacyTooltipModule], }) export class StarringComponent implements OnInit, OnDestroy, OnChanges { @Input() tool: any; diff --git a/src/app/starring/starring.module.ts b/src/app/starring/starring.module.ts index 0644fd9e66..6d25960310 100644 --- a/src/app/starring/starring.module.ts +++ b/src/app/starring/starring.module.ts @@ -16,15 +16,14 @@ import { CommonModule } from '@angular/common'; import { NgModule } from '@angular/core'; import { MatIconModule } from '@angular/material/icon'; -import { MatTooltipModule } from '@angular/material/tooltip'; +import { MatLegacyTooltipModule as MatTooltipModule } from '@angular/material/legacy-tooltip'; import { StarentryService } from '../shared/starentry.service'; import { StarringComponent } from './starring.component'; import { StarringService } from './starring.service'; @NgModule({ - imports: [CommonModule, MatIconModule, MatTooltipModule], - declarations: [StarringComponent], + imports: [CommonModule, MatIconModule, MatTooltipModule, StarringComponent], exports: [StarringComponent], providers: [StarringService, StarentryService], }) diff --git a/src/app/test/mocked-objects.ts b/src/app/test/mocked-objects.ts index 9fb8b42348..9ddc2a1a8e 100644 --- a/src/app/test/mocked-objects.ts +++ b/src/app/test/mocked-objects.ts @@ -18,7 +18,7 @@ import { OrgToolObject } from '../mytools/my-tool/my-tool.component'; import { Hit } from '../search/state/search.service'; import { ExtendedDockstoreTool } from '../shared/models/ExtendedDockstoreTool'; import { ExtendedWorkflow } from '../shared/models/ExtendedWorkflow'; -import { VersionVerifiedPlatform, Tag, WorkflowVersion, Author } from '../shared/openapi'; +import { VersionVerifiedPlatform, Tag, WorkflowVersion, Author, EntryTypeMetadata } from '../shared/openapi'; import { Notification } from '../shared/openapi/model/notification'; import { DockstoreTool } from './../shared/openapi/model/dockstoreTool'; import { SourceFile } from './../shared/openapi/model/sourceFile'; @@ -27,6 +27,61 @@ import { Workflow } from './../shared/openapi/model/workflow'; const DescriptorTypeEnum = Workflow.DescriptorTypeEnum; +export const toolEntryTypeMetadata: EntryTypeMetadata = { + searchEntryType: 'tools', + searchSupported: true, + sitePath: 'containers', + term: 'tool', + termPlural: 'tools', + trsPrefix: '', + trsSupported: true, + type: 'TOOL', +}; + +export const workflowEntryTypeMetadata: EntryTypeMetadata = { + searchEntryType: 'workflows', + searchSupported: true, + sitePath: 'workflows', + term: 'workflow', + termPlural: 'workflows', + trsPrefix: '#workflow/', + trsSupported: true, + type: 'WORKFLOW', +}; + +export const serviceEntryTypeMetadata: EntryTypeMetadata = { + searchEntryType: '', + searchSupported: false, + sitePath: 'services', + term: 'service', + termPlural: 'services', + trsPrefix: '#service/', + trsSupported: true, + type: 'SERVICE', +}; + +export const appToolEntryTypeMetadata: EntryTypeMetadata = { + searchEntryType: 'tools', + searchSupported: true, + sitePath: 'containers', + term: 'tool', + termPlural: 'tools', + trsPrefix: '', + trsSupported: true, + type: 'APPTOOL', +}; + +export const notebookEntryTypeMetadata: EntryTypeMetadata = { + searchEntryType: '', + searchSupported: false, + sitePath: 'notebooks', + term: 'notebook', + termPlural: 'notebooks', + trsPrefix: '#notebook/', + trsSupported: true, + type: 'NOTEBOOK', +}; + export const updatedWorkflow: Workflow = { type: '', descriptorType: DescriptorTypeEnum.CWL, @@ -40,6 +95,7 @@ export const updatedWorkflow: Workflow = { sourceControl: 'github.com', source_control_provider: 'GITHUB', descriptorTypeSubclass: 'n/a', + entryTypeMetadata: workflowEntryTypeMetadata, }; export const sampleWorkflow1: Workflow = { @@ -56,6 +112,7 @@ export const sampleWorkflow1: Workflow = { sourceControl: 'github.com', source_control_provider: 'GITHUB', descriptorTypeSubclass: 'n/a', + entryTypeMetadata: workflowEntryTypeMetadata, }; export const sampleWorkflow2: Workflow = { @@ -72,6 +129,7 @@ export const sampleWorkflow2: Workflow = { sourceControl: 'github.com', source_control_provider: 'GITHUB', descriptorTypeSubclass: 'n/a', + entryTypeMetadata: workflowEntryTypeMetadata, }; export const sampleWorkflow3: Workflow = { @@ -89,6 +147,7 @@ export const sampleWorkflow3: Workflow = { source_control_provider: 'GITHUB', full_workflow_path: 'github.com/sampleWorkflowPath', descriptorTypeSubclass: 'n/a', + entryTypeMetadata: workflowEntryTypeMetadata, }; export const sampleWdlWorkflow1: Workflow = { @@ -106,6 +165,7 @@ export const sampleWdlWorkflow1: Workflow = { source_control_provider: 'GITHUB', full_workflow_path: 'github.com/DataBiosphere/topmed-workflows/Functional_Equivalence', descriptorTypeSubclass: 'n/a', + entryTypeMetadata: workflowEntryTypeMetadata, }; export const sampleCwlExtendedWorkflow: ExtendedWorkflow = { @@ -123,6 +183,7 @@ export const sampleCwlExtendedWorkflow: ExtendedWorkflow = { source_control_provider: 'GITHUB', full_workflow_path: 'github.com/dockstore-testing/md5sum-checker', descriptorTypeSubclass: 'n/a', + entryTypeMetadata: workflowEntryTypeMetadata, }; export const sampleWdlWorkflow2: Workflow = { @@ -140,6 +201,7 @@ export const sampleWdlWorkflow2: Workflow = { source_control_provider: 'GITHUB', full_workflow_path: 'github.com/DataBiosphere/topmed-workflows/UM_aligner_wdl', descriptorTypeSubclass: 'n/a', + entryTypeMetadata: workflowEntryTypeMetadata, }; export const sampleWorkflowVersion: WorkflowVersion = { @@ -179,6 +241,7 @@ export const sampleTool1: DockstoreTool = { defaultCWLTestParameterFile: 'sampleDefaultCWLTestParameterFile', defaultWDLTestParameterFile: 'sampleDefaultWDLTestParameterFile', tool_path: '', + entryTypeMetadata: toolEntryTypeMetadata, }; export const sampleTool2: DockstoreTool = { @@ -196,6 +259,7 @@ export const sampleTool2: DockstoreTool = { toolname: 'sampleToolname', defaultCWLTestParameterFile: 'sampleDefaultCWLTestParameterFile', defaultWDLTestParameterFile: 'sampleDefaultWDLTestParameterFile', + entryTypeMetadata: toolEntryTypeMetadata, }; export const sampleTool3: DockstoreTool = { @@ -213,6 +277,7 @@ export const sampleTool3: DockstoreTool = { toolname: 'sampleToolname', defaultCWLTestParameterFile: 'sampleDefaultCWLTestParameterFile', defaultWDLTestParameterFile: 'sampleDefaultWDLTestParameterFile', + entryTypeMetadata: toolEntryTypeMetadata, }; // Case 1: sampleTool1 in published entries, unpublished doesn't matter @@ -294,6 +359,7 @@ export const wdlSourceFile: SourceFile = { path: '', absolutePath: '', type: 'DOCKSTORE_WDL', + state: SourceFile.StateEnum.COMPLETE, }; export const emptyWdlSourceFile: SourceFile = { @@ -302,6 +368,7 @@ export const emptyWdlSourceFile: SourceFile = { path: '/foo.wdl', absolutePath: '', type: 'DOCKSTORE_WDL', + state: SourceFile.StateEnum.COMPLETE, }; export const wdlSourceFileWithHttpImport: SourceFile = { @@ -310,6 +377,7 @@ export const wdlSourceFileWithHttpImport: SourceFile = { path: '/goo.wdl', absolutePath: '', type: 'DOCKSTORE_WDL', + state: SourceFile.StateEnum.COMPLETE, }; export const wdlSourceFileWithCommentedHttpImport: SourceFile = { @@ -318,6 +386,7 @@ export const wdlSourceFileWithCommentedHttpImport: SourceFile = { path: '/goo.wdl', absolutePath: '', type: 'DOCKSTORE_WDL', + state: SourceFile.StateEnum.COMPLETE, }; const cwlWithNoImport = `#!/usr/bin/env cwl-runner @@ -427,6 +496,7 @@ export const cwlSourceFileWithNoImport: SourceFile = { path: '/fubar.cwl', absolutePath: '', type: 'DOCKSTORE_CWL', + state: SourceFile.StateEnum.COMPLETE, }; export const cwlSourceFileWithHttpsImport: SourceFile = { @@ -435,6 +505,7 @@ export const cwlSourceFileWithHttpsImport: SourceFile = { path: '/fubar.cwl', absolutePath: '', type: 'DOCKSTORE_CWL', + state: SourceFile.StateEnum.COMPLETE, }; export const cwlSourceFileWithMixinImport: SourceFile = { @@ -443,6 +514,7 @@ export const cwlSourceFileWithMixinImport: SourceFile = { path: '/fubar.cwl', absolutePath: '', type: 'DOCKSTORE_CWL', + state: SourceFile.StateEnum.COMPLETE, }; export const cwlSourceFileWithCommentedMixinImport: SourceFile = { @@ -451,6 +523,7 @@ export const cwlSourceFileWithCommentedMixinImport: SourceFile = { path: '/fubar.cwl', absolutePath: '', type: 'DOCKSTORE_CWL', + state: SourceFile.StateEnum.COMPLETE, }; export const cwlSourceFileWithIncludeImport: SourceFile = { @@ -459,6 +532,7 @@ export const cwlSourceFileWithIncludeImport: SourceFile = { path: '/fubar.cwl', absolutePath: '', type: 'DOCKSTORE_CWL', + state: SourceFile.StateEnum.COMPLETE, }; export const cwlSourceFileWithSomeHttpLinks: SourceFile = { @@ -467,6 +541,7 @@ export const cwlSourceFileWithSomeHttpLinks: SourceFile = { path: '/fubar.cwl', absolutePath: '', type: 'DOCKSTORE_CWL', + state: SourceFile.StateEnum.COMPLETE, }; export const cwlSourceFileWithHttpRun: SourceFile = { @@ -475,6 +550,7 @@ export const cwlSourceFileWithHttpRun: SourceFile = { path: '/checker.cwl', absolutePath: '', type: 'DOCKSTORE_CWL', + state: SourceFile.StateEnum.COMPLETE, }; export const sampleSourceFile: SourceFile = { @@ -483,6 +559,7 @@ export const sampleSourceFile: SourceFile = { path: '/cwl.json', absolutePath: '', type: SourceFile.TypeEnum.CWLTESTJSON, + state: SourceFile.StateEnum.COMPLETE, }; export const versionVerifiedPlatform: Array = [ @@ -511,6 +588,7 @@ export const testSourceFiles: Array = [ path: '/Dockerfile', absolutePath: '', type: SourceFile.TypeEnum.DOCKERFILE, + state: SourceFile.StateEnum.COMPLETE, verifiedBySource: {}, }, { @@ -519,6 +597,7 @@ export const testSourceFiles: Array = [ path: '/Dockstore-BTCA-SG.json', absolutePath: '', type: SourceFile.TypeEnum.CWLTESTJSON, + state: SourceFile.StateEnum.COMPLETE, verifiedBySource: { 'Dockstore CLI': { metadata: 'Docktesters group', @@ -533,6 +612,7 @@ export const testSourceFiles: Array = [ path: '/Dockstore.cwl', absolutePath: '', type: SourceFile.TypeEnum.DOCKSTORECWL, + state: SourceFile.StateEnum.COMPLETE, verifiedBySource: {}, }, { @@ -541,6 +621,7 @@ export const testSourceFiles: Array = [ path: '/Dockstore.json', absolutePath: '', type: SourceFile.TypeEnum.CWLTESTJSON, + state: SourceFile.StateEnum.COMPLETE, verifiedBySource: { 'Dockstore CLI': { metadata: 'Docktesters group', @@ -575,6 +656,7 @@ export const elasticSearchResponse: Hit[] = [ workflowVersions: [ { doiURL: null, + dois: {}, dbUpdateDate: null, versionEditor: null, verifiedSource: null, @@ -594,6 +676,7 @@ export const elasticSearchResponse: Hit[] = [ }, { doiURL: null, + dois: {}, dbUpdateDate: null, versionEditor: null, verifiedSource: null, @@ -655,6 +738,7 @@ export const elasticSearchResponse: Hit[] = [ workflowVersions: [ { doiURL: null, + dois: {}, dbUpdateDate: null, subClass: null, versionEditor: null, @@ -693,6 +777,7 @@ export const exampleEntry: Version = { dirtyBit: true, doiStatus: 'NOT_REQUESTED', doiURL: null, + dois: {}, frozen: false, hidden: false, id: 25247, diff --git a/src/app/test/router-stubs.ts b/src/app/test/router-stubs.ts index 398f560dd3..305a6b3f78 100644 --- a/src/app/test/router-stubs.ts +++ b/src/app/test/router-stubs.ts @@ -57,7 +57,6 @@ import { convertToParamMap, ParamMap } from '@angular/router'; @Injectable() export class ActivatedRouteStub { - private params = new BehaviorSubject(convertToParamMap(this.testParamMap)); // ActivatedRoute.paramMap is Observable private subject = new BehaviorSubject(convertToParamMap(this.testParamMap)); paramMap = this.subject.asObservable(); diff --git a/src/app/test/service-stubs.ts b/src/app/test/service-stubs.ts index fe735af383..b13914a67d 100644 --- a/src/app/test/service-stubs.ts +++ b/src/app/test/service-stubs.ts @@ -38,7 +38,20 @@ import { TokenUser } from './../shared/openapi/model/tokenUser'; import { User } from './../shared/openapi/model/user'; import { Workflow } from './../shared/openapi/model/workflow'; import { WorkflowVersion } from './../shared/openapi/model/workflowVersion'; -import { bitbucketToken, gitHubToken, gitLabToken, quayToken, sampleTag, sampleWorkflow1, updatedWorkflow } from './mocked-objects'; +import { + appToolEntryTypeMetadata, + bitbucketToken, + gitHubToken, + gitLabToken, + notebookEntryTypeMetadata, + quayToken, + sampleTag, + sampleWorkflow1, + serviceEntryTypeMetadata, + toolEntryTypeMetadata, + updatedWorkflow, + workflowEntryTypeMetadata, +} from './mocked-objects'; import RoleEnum = Permission.RoleEnum; import DescriptorTypeEnum = Workflow.DescriptorTypeEnum; @@ -876,6 +889,12 @@ export class WorkflowsStubService { updateWorkflowDefaultVersion(workflowId: number, tag: string) { return observableOf([]); } + primaryDescriptor1(workflowId, descriptorType, versionName) { + return observableOf({}); + } + secondaryDescriptors1(workflowId, descriptorType, versionName) { + return observableOf([]); + } } export class ContainersStubService { @@ -935,64 +954,19 @@ export class EntryTypeMetadataStubService { get(type: newEntryType): EntryTypeMetadata { switch (type) { case newEntryType.WORKFLOW: { - return { - searchEntryType: 'workflows', - searchSupported: true, - sitePath: 'workflows', - term: 'workflow', - termPlural: 'workflows', - trsPrefix: '#workflow/', - trsSupported: true, - type: 'WORKFLOW', - }; + return workflowEntryTypeMetadata; } case newEntryType.TOOL: { - return { - searchEntryType: 'tools', - searchSupported: true, - sitePath: 'containers', - term: 'tool', - termPlural: 'tools', - trsPrefix: '', - trsSupported: true, - type: 'TOOL', - }; + return toolEntryTypeMetadata; } case newEntryType.SERVICE: { - return { - searchEntryType: '', - searchSupported: false, - sitePath: 'services', - term: 'service', - termPlural: 'services', - trsPrefix: '#service/', - trsSupported: true, - type: 'SERVICE', - }; + return serviceEntryTypeMetadata; } case newEntryType.APPTOOL: { - return { - searchEntryType: 'tools', - searchSupported: true, - sitePath: 'containers', - term: 'tool', - termPlural: 'tools', - trsPrefix: '', - trsSupported: true, - type: 'APPTOOL', - }; + return appToolEntryTypeMetadata; } case newEntryType.NOTEBOOK: { - return { - searchEntryType: '', - searchSupported: false, - sitePath: 'notebooks', - term: 'notebook', - termPlural: 'notebooks', - trsPrefix: '#notebook/', - trsSupported: true, - type: 'NOTEBOOK', - }; + return notebookEntryTypeMetadata; } } return null; @@ -1010,4 +984,9 @@ export class MarkdownWrapperStubService { export class EntryActionsStubService { updateBackingEntry(entry) {} + isEntryHosted(entry) {} +} + +export class EditTopicDialogStubService { + saveTopicChanges(entry: Workflow | DockstoreTool, topicManual: string, topicSelection: Workflow.TopicSelectionEnum) {} } diff --git a/src/app/tosBanner/tos-banner.component.ts b/src/app/tosBanner/tos-banner.component.ts index bf1a5608f1..665c390f26 100644 --- a/src/app/tosBanner/tos-banner.component.ts +++ b/src/app/tosBanner/tos-banner.component.ts @@ -1,10 +1,16 @@ import { Component, Input } from '@angular/core'; import { TosBannerService } from './state/tos-banner.service'; +import { MatIconModule } from '@angular/material/icon'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { NgIf } from '@angular/common'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; @Component({ selector: 'app-tos-banner', templateUrl: './tos-banner.component.html', styleUrls: ['./tos-banner.component.css'], + standalone: true, + imports: [FlexModule, NgIf, MatLegacyButtonModule, MatIconModule], }) export class TosBannerComponent { @Input() diff --git a/src/app/user-page/user-page.component.ts b/src/app/user-page/user-page.component.ts index c77164e26c..de7fe085cf 100644 --- a/src/app/user-page/user-page.component.ts +++ b/src/app/user-page/user-page.component.ts @@ -3,21 +3,50 @@ import { TokenSource } from '../shared/enum/token-source.enum'; import { Profile, TokenUser, User } from '../shared/openapi'; import { UsersService } from '../shared/openapi/api/users.service'; import { UserService } from '../shared/user/user.service'; -import { ActivatedRoute, Router } from '@angular/router'; +import { ActivatedRoute } from '@angular/router'; import { takeUntil } from 'rxjs/operators'; import { HttpErrorResponse } from '@angular/common/http'; import { AlertService } from '../shared/alert/state/alert.service'; import { GithubAppsLogsComponent } from '../myworkflows/sidebar-accordion/github-apps-logs/github-apps-logs.component'; import { accountInfo, bootstrap4extraLargeModalSize } from '../shared/constants'; -import { MatDialog } from '@angular/material/dialog'; +import { MatLegacyDialog as MatDialog } from '@angular/material/legacy-dialog'; import { UserQuery } from '../shared/user/user.query'; import { Base } from '../shared/base'; import { AccountInfo } from '../loginComponents/accounts/external/accounts.component'; +import { UrlResolverService } from '../shared/url-resolver.service'; +import { RecentEventsComponent } from '../home-page/recent-events/recent-events.component'; +import { MatLegacyTabsModule } from '@angular/material/legacy-tabs'; +import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { MatBadgeModule } from '@angular/material/badge'; +import { MatLineModule } from '@angular/material/core'; +import { MatLegacyCardModule } from '@angular/material/legacy-card'; +import { NgIf, NgFor } from '@angular/common'; +import { MatIconModule } from '@angular/material/icon'; +import { ExtendedModule } from '@ngbracket/ngx-layout/extended'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { HeaderComponent } from '../header/header.component'; @Component({ selector: 'app-user-page', templateUrl: './user-page.component.html', styleUrls: ['./user-page.component.scss'], + standalone: true, + imports: [ + HeaderComponent, + FlexModule, + ExtendedModule, + MatIconModule, + NgIf, + MatLegacyCardModule, + MatLineModule, + MatBadgeModule, + MatLegacyButtonModule, + MatLegacyTooltipModule, + MatLegacyTabsModule, + RecentEventsComponent, + NgFor, + ], }) export class UserPageComponent extends Base implements OnInit { public user: User; @@ -35,9 +64,9 @@ export class UserPageComponent extends Base implements OnInit { private userService: UserService, private usersService: UsersService, private activatedRoute: ActivatedRoute, - private router: Router, private alertService: AlertService, - private userQuery: UserQuery + private userQuery: UserQuery, + public urlResolverService: UrlResolverService ) { super(); } @@ -67,7 +96,8 @@ export class UserPageComponent extends Base implements OnInit { }, (error: HttpErrorResponse) => { this.alertService.detailedError(error); - this.router.navigateByUrl('/page-not-found'); //redirects to Page Not Found if user doesn't exist or another error occurs; + // Redirects to Page Not Found if user doesn't exist or another error occurs + this.urlResolverService.showPageNotFound(); } ); } diff --git a/src/app/user-page/user-page.module.ts b/src/app/user-page/user-page.module.ts deleted file mode 100644 index 4c69c3f517..0000000000 --- a/src/app/user-page/user-page.module.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { NgModule } from '@angular/core'; -import { UserPageComponent } from './user-page.component'; -import { RecentEventsModule } from '../home-page/recent-events/recent-events.module'; -import { FlexLayoutModule } from '@angular/flex-layout'; -import { CommonModule } from '@angular/common'; -import { CustomMaterialModule } from '../shared/modules/material.module'; -import { HeaderModule } from '../shared/modules/header.module'; -import { RouterModule } from '@angular/router'; -import { UserPageRouting } from './user-page.routing'; - -@NgModule({ - declarations: [UserPageComponent], - imports: [RecentEventsModule, FlexLayoutModule, CommonModule, CustomMaterialModule, HeaderModule, RouterModule, UserPageRouting], - exports: [UserPageComponent], -}) -export class UserPageModule {} diff --git a/src/app/user-page/user-page.routing.ts b/src/app/user-page/user-page.routing.ts index 6fbce8be18..c5ec5e8ed7 100644 --- a/src/app/user-page/user-page.routing.ts +++ b/src/app/user-page/user-page.routing.ts @@ -1,4 +1,4 @@ -import { RouterModule, Routes } from '@angular/router'; +import { Routes } from '@angular/router'; import { UserPageComponent } from './user-page.component'; const USERPAGE_ROUTES: Routes = [ @@ -6,4 +6,4 @@ const USERPAGE_ROUTES: Routes = [ { path: '**', redirectTo: '' }, ]; -export const UserPageRouting = RouterModule.forChild(USERPAGE_ROUTES); +export const UserPageRouting = USERPAGE_ROUTES; diff --git a/src/app/workflow/dag/cwl-viewer/cwl-viewer.component.spec.ts b/src/app/workflow/dag/cwl-viewer/cwl-viewer.component.spec.ts index fea66361ca..e6d7426bf7 100644 --- a/src/app/workflow/dag/cwl-viewer/cwl-viewer.component.spec.ts +++ b/src/app/workflow/dag/cwl-viewer/cwl-viewer.component.spec.ts @@ -17,8 +17,7 @@ describe('cwl-viewerComponent', () => { beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [CwlViewerComponent], - imports: [HttpClientTestingModule, FormsModule, HttpClientTestingModule], + imports: [HttpClientTestingModule, FormsModule, HttpClientTestingModule, CwlViewerComponent], schemas: [NO_ERRORS_SCHEMA], providers: [DockstoreService, DateService, ProviderService, WorkflowService, DescriptorLanguageService], }).compileComponents(); diff --git a/src/app/workflow/dag/cwl-viewer/cwl-viewer.component.ts b/src/app/workflow/dag/cwl-viewer/cwl-viewer.component.ts index 57efb1c3c4..a5acd293fd 100644 --- a/src/app/workflow/dag/cwl-viewer/cwl-viewer.component.ts +++ b/src/app/workflow/dag/cwl-viewer/cwl-viewer.component.ts @@ -21,12 +21,18 @@ import { ExtendedWorkflow } from '../../../shared/models/ExtendedWorkflow'; import { ExtendedWorkflowQuery } from '../../../shared/state/extended-workflow.query'; import { WorkflowVersion } from '../../../shared/openapi/model/workflowVersion'; import { CwlViewerDescriptor, CwlViewerService } from './cwl-viewer.service'; +import { MatLegacyProgressBarModule } from '@angular/material/legacy-progress-bar'; +import { MatIconModule } from '@angular/material/icon'; +import { MatLegacyCardModule } from '@angular/material/legacy-card'; +import { NgIf } from '@angular/common'; @Component({ selector: 'app-cwl-viewer', templateUrl: './cwl-viewer.html', providers: [CwlViewerService], styleUrls: ['./cwl-viewer.scss'], + standalone: true, + imports: [NgIf, MatLegacyCardModule, MatIconModule, MatLegacyProgressBarModule], }) export class CwlViewerComponent implements OnInit, OnChanges, OnDestroy { @Input() selectedVersion: WorkflowVersion; diff --git a/src/app/workflow/dag/dag.component.spec.ts b/src/app/workflow/dag/dag.component.spec.ts index 5ddb4ef495..fac028c0b0 100644 --- a/src/app/workflow/dag/dag.component.spec.ts +++ b/src/app/workflow/dag/dag.component.spec.ts @@ -33,8 +33,7 @@ describe('DagComponent', () => { beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [DagComponent, CwlViewerComponent], - imports: [HttpClientTestingModule, FormsModule], + imports: [HttpClientTestingModule, FormsModule, DagComponent, CwlViewerComponent], schemas: [NO_ERRORS_SCHEMA], providers: [ DagStore, diff --git a/src/app/workflow/dag/dag.component.ts b/src/app/workflow/dag/dag.component.ts index 5c34b152bd..bdef651b01 100644 --- a/src/app/workflow/dag/dag.component.ts +++ b/src/app/workflow/dag/dag.component.ts @@ -27,6 +27,16 @@ import { WorkflowVersion } from './../../shared/openapi/model/workflowVersion'; import { DagQuery } from './state/dag.query'; import { DagService } from './state/dag.service'; import { DagStore } from './state/dag.store'; +import { CwlViewerComponent } from './cwl-viewer/cwl-viewer.component'; +import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { FormsModule } from '@angular/forms'; +import { ExtendedModule } from '@ngbracket/ngx-layout/extended'; +import { MatIconModule } from '@angular/material/icon'; +import { MatLegacyCardModule } from '@angular/material/legacy-card'; +import { NgIf, NgClass, AsyncPipe } from '@angular/common'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { LoadingComponent } from '../../shared/loading/loading.component'; /** * This is the DAG tab @@ -45,6 +55,21 @@ import { DagStore } from './state/dag.store'; templateUrl: './dag.component.html', styleUrls: ['./dag.component.scss'], providers: [DagStore, DagQuery, DagService], + standalone: true, + imports: [ + LoadingComponent, + FlexModule, + NgIf, + MatLegacyCardModule, + MatIconModule, + NgClass, + ExtendedModule, + FormsModule, + MatLegacyButtonModule, + MatLegacyTooltipModule, + CwlViewerComponent, + AsyncPipe, + ], }) export class DagComponent extends EntryTab implements OnInit, OnChanges, AfterViewInit { @Input() id: number; diff --git a/src/app/workflow/dag/dag.module.ts b/src/app/workflow/dag/dag.module.ts index 8b6942f761..e5429193ec 100644 --- a/src/app/workflow/dag/dag.module.ts +++ b/src/app/workflow/dag/dag.module.ts @@ -16,13 +16,12 @@ import { FullscreenOverlayContainer, OverlayContainer } from '@angular/cdk/overlay'; import { CommonModule } from '@angular/common'; import { NgModule } from '@angular/core'; -import { FlexLayoutModule } from '@angular/flex-layout'; +import { FlexLayoutModule } from '@ngbracket/ngx-layout'; import { FormsModule } from '@angular/forms'; import { MatIconModule } from '@angular/material/icon'; -import { MatProgressBarModule } from '@angular/material/progress-bar'; -import { MatTooltipModule } from '@angular/material/tooltip'; -import { RefreshAlertModule } from 'app/shared/alert/alert.module'; -import { CustomMaterialModule } from './../../shared/modules/material.module'; +import { MatLegacyProgressBarModule as MatProgressBarModule } from '@angular/material/legacy-progress-bar'; +import { MatLegacyTooltipModule as MatTooltipModule } from '@angular/material/legacy-tooltip'; + import { CwlViewerComponent } from './cwl-viewer/cwl-viewer.component'; import { DagComponent } from './dag.component'; @@ -35,10 +34,9 @@ import { DagComponent } from './dag.component'; MatIconModule, MatProgressBarModule, MatTooltipModule, - CustomMaterialModule, - RefreshAlertModule, + DagComponent, + CwlViewerComponent, ], - declarations: [DagComponent, CwlViewerComponent], exports: [DagComponent], }) export class DagModule {} diff --git a/src/app/workflow/executions/executions-tab.component.html b/src/app/workflow/executions/executions-tab.component.html index 32c6b3f8c5..aabdca3158 100644 --- a/src/app/workflow/executions/executions-tab.component.html +++ b/src/app/workflow/executions/executions-tab.component.html @@ -32,11 +32,11 @@ >
    Total executions: {{ totalExecutions | number }}
    - Successful executions: {{ successfulExecutions | number + Successful: {{ successfulExecutions | number }} ({{ successfulExecutionRate | number: '1.0-2' }}%)
    -
    Failed executions: {{ failedExecutions | number }}
    -
    Aborted executions: {{ abortedExecutions | number }}
    +
    Failed: {{ failedExecutions | number }}
    +
    Aborted: {{ abortedExecutions | number }}
    Select an Execution Status @@ -59,7 +59,17 @@ > Metric - {{ executionMetric.metric }} + + {{ executionMetric.metric }} + info_outline + diff --git a/src/app/workflow/executions/executions-tab.component.spec.ts b/src/app/workflow/executions/executions-tab.component.spec.ts index 39460560f0..3981aa8980 100644 --- a/src/app/workflow/executions/executions-tab.component.spec.ts +++ b/src/app/workflow/executions/executions-tab.component.spec.ts @@ -13,17 +13,17 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +import { HttpClientTestingModule } from '@angular/common/http/testing'; import { NO_ERRORS_SCHEMA } from '@angular/core'; import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; - -import { DescriptorLanguageStubService } from '../../test/service-stubs'; -import { ExecutionsTabComponent } from './executions-tab.component'; -import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { MatLegacySnackBarModule } from '@angular/material/legacy-snack-bar'; import { AlertService } from '../../shared/alert/state/alert.service'; import { DescriptorLanguageService } from '../../shared/entry/descriptor-language.service'; -import { CustomMaterialModule } from '../../shared/modules/material.module'; import { PipeModule } from '../../shared/pipe/pipe.module'; +import { DescriptorLanguageStubService } from '../../test/service-stubs'; +import { ExecutionsTabComponent } from './executions-tab.component'; + describe('ExecutionsTabComponent', () => { let component: ExecutionsTabComponent; let fixture: ComponentFixture; @@ -31,9 +31,8 @@ describe('ExecutionsTabComponent', () => { beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [ExecutionsTabComponent], schemas: [NO_ERRORS_SCHEMA], - imports: [HttpClientTestingModule, CustomMaterialModule, PipeModule], + imports: [HttpClientTestingModule, PipeModule, ExecutionsTabComponent, MatLegacySnackBarModule], providers: [{ provide: DescriptorLanguageService, useClass: DescriptorLanguageStubService }, AlertService], }).compileComponents(); }) diff --git a/src/app/workflow/executions/executions-tab.component.ts b/src/app/workflow/executions/executions-tab.component.ts index 3ac088ec05..dc5a23bf68 100644 --- a/src/app/workflow/executions/executions-tab.component.ts +++ b/src/app/workflow/executions/executions-tab.component.ts @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { Component, Input, OnChanges } from '@angular/core'; +import { Component, Input, OnChanges, OnInit } from '@angular/core'; import { EntryTab } from '../../shared/entry/entry-tab'; import { CloudInstance, @@ -32,8 +32,23 @@ import { SessionQuery } from '../../shared/session/session.query'; import { takeUntil } from 'rxjs/operators'; import PartnerEnum = CloudInstance.PartnerEnum; import ExecutionStatusEnum = RunExecution.ExecutionStatusEnum; -import { MatSelectChange } from '@angular/material/select'; +import { MatLegacySelectChange as MatSelectChange, MatLegacySelectModule } from '@angular/material/legacy-select'; import { AlertService } from '../../shared/alert/state/alert.service'; +import { UserQuery } from 'app/shared/user/user.query'; +import { combineLatest } from 'rxjs'; +import { ExecutionStatusPipe } from '../../shared/entry/execution-status.pipe'; +import { SecondsToHoursMinutesSecondsPipe } from 'app/workflow/executions/seconds-to-hours-minutes-seconds.pipe'; +import { PlatformPartnerPipe } from '../../shared/entry/platform-partner.pipe'; +import { ExtendedModule } from '@ngbracket/ngx-layout/extended'; +import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; +import { MatLegacyTableModule } from '@angular/material/legacy-table'; +import { MatDividerModule } from '@angular/material/divider'; +import { MatLegacyOptionModule } from '@angular/material/legacy-core'; +import { MatLegacyFormFieldModule } from '@angular/material/legacy-form-field'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { MatIconModule } from '@angular/material/icon'; +import { MatLegacyCardModule } from '@angular/material/legacy-card'; +import { NgIf, NgFor, NgClass, NgTemplateOutlet, DecimalPipe, DatePipe } from '@angular/common'; interface ExecutionMetricsTableObject { metric: string; // Name of the execution metric @@ -46,8 +61,30 @@ interface ExecutionMetricsTableObject { @Component({ selector: 'app-executions-tab', templateUrl: './executions-tab.component.html', + standalone: true, + imports: [ + NgIf, + MatLegacyCardModule, + MatIconModule, + FlexModule, + MatLegacyFormFieldModule, + MatLegacySelectModule, + NgFor, + MatLegacyOptionModule, + MatDividerModule, + MatLegacyTableModule, + MatLegacyTooltipModule, + NgClass, + ExtendedModule, + NgTemplateOutlet, + DecimalPipe, + DatePipe, + PlatformPartnerPipe, + SecondsToHoursMinutesSecondsPipe, + ExecutionStatusPipe, + ], }) -export class ExecutionsTabComponent extends EntryTab implements OnChanges { +export class ExecutionsTabComponent extends EntryTab implements OnInit, OnChanges { metrics: Map; trsID: string; currentPartner: PartnerEnum; @@ -80,6 +117,7 @@ export class ExecutionsTabComponent extends EntryTab implements OnChanges { currentValidatorTool: string; validatorTools: string[]; validatorToolMetricsExist: boolean; + isAdminCuratorOrPlatformPartner: boolean; @Input() entry: BioWorkflow | Service | Notebook; @Input() version: WorkflowVersion; @@ -87,11 +125,20 @@ export class ExecutionsTabComponent extends EntryTab implements OnChanges { constructor( private extendedGA4GHService: ExtendedGA4GHService, private alertService: AlertService, + private userQuery: UserQuery, protected sessionQuery: SessionQuery ) { super(); } + ngOnInit(): void { + combineLatest([this.userQuery.isAdminOrCurator$, this.userQuery.isPlatformPartner$]) + .pipe(takeUntil(this.ngUnsubscribe)) + .subscribe(([isAdminOrCurator, isPlatformPartner]) => { + this.isAdminCuratorOrPlatformPartner = isAdminOrCurator || isPlatformPartner; + }); + } + ngOnChanges() { this.resetMetricsData(); if (this.version) { diff --git a/src/app/workflow/executions/seconds-to-hours-minutes-seconds.pipe.ts b/src/app/workflow/executions/seconds-to-hours-minutes-seconds.pipe.ts index 138eb0a264..adb09061dc 100644 --- a/src/app/workflow/executions/seconds-to-hours-minutes-seconds.pipe.ts +++ b/src/app/workflow/executions/seconds-to-hours-minutes-seconds.pipe.ts @@ -3,6 +3,7 @@ import { Pipe, PipeTransform } from '@angular/core'; @Pipe({ name: 'secondsToHoursMinutesSeconds', + standalone: true, }) export class SecondsToHoursMinutesSecondsPipe implements PipeTransform { transform(totalSeconds: number): string { diff --git a/src/app/workflow/info-tab/info-tab.component.css b/src/app/workflow/info-tab/info-tab.component.css index efe631b0b2..71b2c025d5 100644 --- a/src/app/workflow/info-tab/info-tab.component.css +++ b/src/app/workflow/info-tab/info-tab.component.css @@ -27,19 +27,3 @@ .mat-column-orcid_id { width: 20rem; } - -/* Bootstrap adds a 5px bottom margin, this counteracts it. Remove once Bootstrap is removed */ -::ng-deep label { - margin-bottom: 0px; -} - -/* Better alignment for "save" icon instead of vertical-align: middle */ -.mat-icon-sm { - vertical-align: text-bottom; -} - -/* Disabled state for "edit" buttons */ -.mat-raised-button.mat-button-disabled.mat-button-disabled { - background-color: white; - filter: opacity(0.3); -} diff --git a/src/app/workflow/info-tab/info-tab.component.html b/src/app/workflow/info-tab/info-tab.component.html index 6ab12580e9..73c1dd9395 100644 --- a/src/app/workflow/info-tab/info-tab.component.html +++ b/src/app/workflow/info-tab/info-tab.component.html @@ -193,106 +193,12 @@ -
    - Topic - {{ - workflow?.topicSelection === TopicSelectionEnum.AUTOMATIC ? workflow?.topicAutomatic : workflow?.topicManual - }} -
    -
    - Topic Automatic - {{ workflow?.topicAutomatic }} -
    -
    - Topic Manual - {{ workflow?.topicManual }} - - - - - - -
    - -
  • -
    - Topic Selection - - - Automatic - Manual - - -
    +
  • -
    - DOI: - {{ workflow.conceptDoi }} - {{ workflow?.conceptDoi ? '' : 'n/a' }} -
    @@ -444,7 +338,7 @@ - +
    warning This version is snapshotted but contains HTTP imports. HTTP imports may @@ -498,19 +392,6 @@ Engine Versions: {{ selectedVersion.versionMetadata.engineVersions }}
    -
    - DOI: - {{ selectedVersion.doiURL }} - {{ selectedVersion?.doiURL ? '' : 'n/a' }} -
    Open (this.defaultTestFilePathEditing = editing)); - this.entryType$ - .pipe(takeUntil(this.ngUnsubscribe)) - .subscribe((entryType) => (this.displayTextForButton = this.infoTabService.getTRSId(this.workflow, entryType))); this.infoTabService.forumUrlEditing$.pipe(takeUntil(this.ngUnsubscribe)).subscribe((editing) => (this.forumUrlEditing = editing)); - this.infoTabService.topicEditing$.pipe(takeUntil(this.ngUnsubscribe)).subscribe((topicEditing) => (this.topicEditing = topicEditing)); } /** * Handle restubbing a workflow @@ -197,13 +241,6 @@ export class InfoTabComponent extends EntryTab implements OnInit, OnChanges { this.infoTabService.setWorkflowPathEditing(!this.workflowPathEditing); } - toggleEditTopic() { - if (this.topicEditing) { - this.infoTabService.saveTopic(this.workflow, this.revertTopic.bind(this)); - } - this.infoTabService.setTopicEditing(!this.topicEditing); - } - toggleEditDefaultTestFilePath() { if (this.defaultTestFilePathEditing) { this.save(); @@ -218,18 +255,6 @@ export class InfoTabComponent extends EntryTab implements OnInit, OnChanges { this.infoTabService.setForumUrlEditing(!this.forumUrlEditing); } - revertTopic() { - this.workflow.topicManual = this.extendedWorkflow.topicManual; - } - - revertTopicSelection() { - this.workflow.topicSelection = this.extendedWorkflow.topicSelection; - } - - radioChange(event: MatRadioChange) { - this.infoTabService.saveTopicSelection(this.workflow, this.revertTopicSelection.bind(this)); - } - save() { this.infoTabService.updateAndRefresh(this.workflow); } diff --git a/src/app/workflow/info-tab/info-tab.service.spec.ts b/src/app/workflow/info-tab/info-tab.service.spec.ts index c7654032d5..a0e7a6c0e0 100644 --- a/src/app/workflow/info-tab/info-tab.service.spec.ts +++ b/src/app/workflow/info-tab/info-tab.service.spec.ts @@ -1,16 +1,16 @@ import { HttpClientTestingModule } from '@angular/common/http/testing'; import { TestBed } from '@angular/core/testing'; +import { MatLegacySnackBarModule } from '@angular/material/legacy-snack-bar'; import { AlertService } from 'app/shared/alert/state/alert.service'; import { ga4ghPath } from 'app/shared/constants'; import { DescriptorTypeCompatService } from 'app/shared/descriptor-type-compat.service'; import { DescriptorLanguageService } from 'app/shared/entry/descriptor-language.service'; import { EntryType } from 'app/shared/enum/entry-type'; -import { CustomMaterialModule } from 'app/shared/modules/material.module'; +import { WorkflowsService } from 'app/shared/openapi'; import { ExtendedWorkflowQuery } from 'app/shared/state/extended-workflow.query'; import { WorkflowService } from 'app/shared/state/workflow.service'; -import { WorkflowsService } from 'app/shared/openapi'; import { WorkflowsStubService, WorkflowStubService } from 'app/test/service-stubs'; -import { sampleWorkflow3 } from '../../test/mocked-objects'; +import { sampleWorkflow3, appToolEntryTypeMetadata, serviceEntryTypeMetadata, notebookEntryTypeMetadata } from '../../test/mocked-objects'; import { InfoTabService } from './info-tab.service'; describe('ValueService', () => { @@ -32,7 +32,7 @@ describe('ValueService', () => { DescriptorTypeCompatService, DescriptorLanguageService, ], - imports: [CustomMaterialModule, HttpClientTestingModule], + imports: [HttpClientTestingModule, MatLegacySnackBarModule], }); }); @@ -54,10 +54,15 @@ describe('ValueService', () => { it(`getTRSId should work for tools and workflows`, () => { service = TestBed.inject(InfoTabService); const fullWorkflowPath = sampleWorkflow3.full_workflow_path; - expect(service.getTRSId(sampleWorkflow3, EntryType.BioWorkflow)).toBe(`#workflow/${fullWorkflowPath}`); - expect(service.getTRSId(sampleWorkflow3, EntryType.AppTool)).toBe(fullWorkflowPath); - expect(service.getTRSId(sampleWorkflow3, EntryType.Service)).toBe(`#service/${fullWorkflowPath}`); - expect(service.getTRSId(null, EntryType.BioWorkflow)).toBe(''); + const clone = Object.assign({}, sampleWorkflow3); + expect(service.getTRSId(clone)).toBe(`#workflow/${fullWorkflowPath}`); + clone.entryTypeMetadata = appToolEntryTypeMetadata; + expect(service.getTRSId(clone)).toBe(fullWorkflowPath); + clone.entryTypeMetadata = serviceEntryTypeMetadata; + expect(service.getTRSId(clone)).toBe(`#service/${fullWorkflowPath}`); + clone.entryTypeMetadata = notebookEntryTypeMetadata; + expect(service.getTRSId(clone)).toBe(`#notebook/${fullWorkflowPath}`); + expect(service.getTRSId(null)).toBe(''); }); it(`getTRSPlainType should work for various descriptor types`, () => { diff --git a/src/app/workflow/info-tab/info-tab.service.ts b/src/app/workflow/info-tab/info-tab.service.ts index ad6e57d798..85d3c93930 100644 --- a/src/app/workflow/info-tab/info-tab.service.ts +++ b/src/app/workflow/info-tab/info-tab.service.ts @@ -34,7 +34,6 @@ export class InfoTabService { public workflowPathEditing$: BehaviorSubject = new BehaviorSubject(false); public defaultTestFilePathEditing$: BehaviorSubject = new BehaviorSubject(false); public forumUrlEditing$: BehaviorSubject = new BehaviorSubject(false); - public topicEditing$: BehaviorSubject = new BehaviorSubject(false); public descriptorLanguageMap = []; constructor( @@ -54,10 +53,6 @@ export class InfoTabService { this.workflowPathEditing$.next(editing); } - setTopicEditing(editing: boolean) { - this.topicEditing$.next(editing); - } - setDefaultTestFilePathEditing(editing: boolean) { this.defaultTestFilePathEditing$.next(editing); } @@ -66,46 +61,6 @@ export class InfoTabService { this.forumUrlEditing$.next(editing); } - /** - * Warning, this could potentially update a few other properties - * @param workflow - */ - saveTopic(workflow: Workflow, errorCallback: () => void) { - this.alertService.start('Updating topic'); - const partialEntryForUpdate = this.getPartialEntryForUpdate(workflow); - this.workflowsService.updateWorkflow(workflow.id, partialEntryForUpdate).subscribe( - (response) => { - this.alertService.detailedSuccess(); - const newTopic = response.topicManual; - this.workflowService.updateActiveTopic(newTopic); - }, - (error) => { - this.alertService.detailedError(error); - errorCallback(); - } - ); - } - - /** - * Warning, this could potentially update a few other properties - * @param workflow - */ - saveTopicSelection(workflow: Workflow, errorCallback: () => void) { - this.alertService.start('Updating topic selection'); - const partialEntryForUpdate = this.getPartialEntryForUpdate(workflow); - this.workflowsService.updateWorkflow(workflow.id, partialEntryForUpdate).subscribe( - (response) => { - this.alertService.detailedSuccess(); - const newTopicSelection = response.topicSelection; - this.workflowService.updateActiveTopicSelection(newTopicSelection); - }, - (error) => { - this.alertService.detailedError(error); - errorCallback(); - } - ); - } - updateAndRefresh(workflow: Workflow) { const message = 'Workflow Info'; const partialEntryForUpdate = this.getPartialEntryForUpdate(workflow); @@ -130,7 +85,7 @@ export class InfoTabService { * Additionally, the webservice does not appear to understand starredUsers which causes an error. * Ideally this implementation should be similar to the tool counterpart */ - private getPartialEntryForUpdate(entry: Workflow): Workflow { + getPartialEntryForUpdate(entry: Workflow): Workflow { entry.workflowVersions = []; entry.starredUsers = []; entry.users = []; @@ -201,7 +156,6 @@ export class InfoTabService { this.workflowPathEditing$.next(false); this.defaultTestFilePathEditing$.next(false); this.forumUrlEditing$.next(false); - this.topicEditing$.next(false); } /** @@ -233,11 +187,12 @@ export class InfoTabService { ); } - getTRSId(workflow: Workflow | undefined, entryType: EntryType): string { - if (!workflow) { + getTRSId(workflow: Workflow | undefined): string { + if (workflow) { + return workflow.entryTypeMetadata.trsPrefix + workflow.full_workflow_path; + } else { return ''; } - return this.getTRSIDFromPath(workflow.full_workflow_path, entryType); } private getTRSIDFromPath(fullWorkflowPath: string, entryType: EntryType): string { diff --git a/src/app/workflow/launch-third-party/dialog/launch-to-codespace-dialog.component.ts b/src/app/workflow/launch-third-party/dialog/launch-to-codespace-dialog.component.ts index 2e438fec1b..baacadc6b0 100644 --- a/src/app/workflow/launch-third-party/dialog/launch-to-codespace-dialog.component.ts +++ b/src/app/workflow/launch-third-party/dialog/launch-to-codespace-dialog.component.ts @@ -14,16 +14,26 @@ * limitations under the License. */ import { Component, Inject } from '@angular/core'; -import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog'; -import { MatSnackBar } from '@angular/material/snack-bar'; +import { + MatLegacyDialogRef as MatDialogRef, + MAT_LEGACY_DIALOG_DATA as MAT_DIALOG_DATA, + MatLegacyDialogModule, +} from '@angular/material/legacy-dialog'; +import { MatLegacySnackBar as MatSnackBar } from '@angular/material/legacy-snack-bar'; import { Router } from '@angular/router'; import { Dockstore } from '../../../shared/dockstore.model'; import { DockstoreTool, Entry, Workflow } from '../../../shared/openapi'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { NgIf, TitleCasePipe } from '@angular/common'; +import { AlertComponent } from '../../../shared/alert/alert.component'; @Component({ selector: 'app-launch-to-codespace-dialog', templateUrl: './launch-to-codespace-dialog.component.html', styleUrls: ['./launch-to-codespace-dialog.component.scss'], + standalone: true, + imports: [MatLegacyDialogModule, AlertComponent, NgIf, FlexModule, MatLegacyButtonModule, TitleCasePipe], }) export class LaunchToCodespaceDialogComponent { clicked: boolean; diff --git a/src/app/workflow/launch-third-party/filterCloudInstances.pipe.ts b/src/app/workflow/launch-third-party/filterCloudInstances.pipe.ts index a5a92d25a0..e9c717578d 100644 --- a/src/app/workflow/launch-third-party/filterCloudInstances.pipe.ts +++ b/src/app/workflow/launch-third-party/filterCloudInstances.pipe.ts @@ -3,6 +3,7 @@ import { CloudInstance } from '../../shared/openapi'; @Pipe({ name: 'filterCloudInstances', + standalone: true, }) export class FilterCloudInstancesPipe implements PipeTransform { transform(cloudInstances: Array, filterFor: string): Array | null { diff --git a/src/app/workflow/launch-third-party/launch-third-party.component.spec.ts b/src/app/workflow/launch-third-party/launch-third-party.component.spec.ts index 7e3b85f4ad..6ed9cec4b0 100644 --- a/src/app/workflow/launch-third-party/launch-third-party.component.spec.ts +++ b/src/app/workflow/launch-third-party/launch-third-party.component.spec.ts @@ -1,19 +1,17 @@ -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; - import { HttpClientModule } from '@angular/common/http'; +import { HttpClientTestingModule } from '@angular/common/http/testing'; import { CUSTOM_ELEMENTS_SCHEMA, SimpleChange } from '@angular/core'; +import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; import { ga4ghPath } from '../../shared/constants'; import { Dockstore } from '../../shared/dockstore.model'; +import { DescriptorLanguageService } from '../../shared/entry/descriptor-language.service'; import { GA4GHFilesService } from '../../shared/ga4gh-files/ga4gh-files.service'; import { GA4GHFilesStore } from '../../shared/ga4gh-files/ga4gh-files.store'; -import { CustomMaterialModule } from '../../shared/modules/material.module'; import { CloudInstancesService, GA4GHV20Service, UsersService } from '../../shared/openapi'; import { WorkflowsService } from '../../shared/openapi/api/workflows.service'; import { sampleWdlWorkflow2, sampleWorkflowVersion } from '../../test/mocked-objects'; import { CloudInstancesStubService, UsersStubService, WorkflowsStubService } from '../../test/service-stubs'; import { LaunchThirdPartyComponent } from './launch-third-party.component'; -import { DescriptorLanguageService } from '../../shared/entry/descriptor-language.service'; -import { HttpClientTestingModule } from '@angular/common/http/testing'; describe('LaunchThirdPartyComponent', () => { let component: LaunchThirdPartyComponent; @@ -22,8 +20,7 @@ describe('LaunchThirdPartyComponent', () => { beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [LaunchThirdPartyComponent], - imports: [CustomMaterialModule, HttpClientModule, HttpClientTestingModule], + imports: [HttpClientModule, HttpClientTestingModule, LaunchThirdPartyComponent], providers: [ GA4GHFilesService, GA4GHV20Service, diff --git a/src/app/workflow/launch-third-party/launch-third-party.component.ts b/src/app/workflow/launch-third-party/launch-third-party.component.ts index 1fc39f9732..8ecbdf9301 100644 --- a/src/app/workflow/launch-third-party/launch-third-party.component.ts +++ b/src/app/workflow/launch-third-party/launch-third-party.component.ts @@ -1,14 +1,12 @@ import { HttpUrlEncodingCodec } from '@angular/common/http'; import { Component, Input, OnChanges, OnInit, SimpleChanges } from '@angular/core'; -import { MatDialog } from '@angular/material/dialog'; +import { MatLegacyDialog as MatDialog, MatLegacyDialogModule } from '@angular/material/legacy-dialog'; import { DescriptorLanguageService } from 'app/shared/entry/descriptor-language.service'; -import { combineLatest, Observable } from 'rxjs'; +import { combineLatest, Observable, Subscription } from 'rxjs'; import { map, shareReplay, takeUntil } from 'rxjs/operators'; import { Base } from '../../shared/base'; -import { DescriptorTypeCompatService } from '../../shared/descriptor-type-compat.service'; import { Dockstore } from '../../shared/dockstore.model'; -import { GA4GHFilesQuery } from '../../shared/ga4gh-files/ga4gh-files.query'; -import { CloudInstance, CloudInstancesService, User, UsersService, ToolFile, Workflow, WorkflowVersion } from '../../shared/openapi'; +import { CloudInstance, CloudInstancesService, User, Workflow, WorkflowVersion } from '../../shared/openapi'; import { WorkflowsService } from '../../shared/openapi/api/workflows.service'; import { SourceFile } from '../../shared/openapi/model/sourceFile'; import { UserQuery } from '../../shared/user/user.query'; @@ -17,7 +15,13 @@ import { DescriptorsStore } from './state/descriptors-store'; import { DescriptorsService } from './state/descriptors.service'; import { LaunchToCodespaceDialogComponent } from './dialog/launch-to-codespace-dialog.component'; import { bootstrap4largeModalSize } from '../../shared/constants'; -import FileTypeEnum = ToolFile.FileTypeEnum; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; +import { MultiCloudLaunchComponent } from './multi-cloud-launch/multi-cloud-launch.component'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { MatDividerModule } from '@angular/material/divider'; +import { MatLegacyCardModule } from '@angular/material/legacy-card'; +import { NgIf, AsyncPipe } from '@angular/common'; /* eslint-disable max-len */ /** @@ -96,6 +100,18 @@ import FileTypeEnum = ToolFile.FileTypeEnum; templateUrl: './launch-third-party.component.html', styleUrls: ['./launch-third-party.component.scss'], providers: [DescriptorsService, DescriptorsQuery, DescriptorsStore], + standalone: true, + imports: [ + NgIf, + MatLegacyCardModule, + MatDividerModule, + FlexModule, + MultiCloudLaunchComponent, + MatLegacyTooltipModule, + MatLegacyButtonModule, + MatLegacyDialogModule, + AsyncPipe, + ], }) export class LaunchThirdPartyComponent extends Base implements OnChanges, OnInit { /** @@ -235,14 +251,14 @@ export class LaunchThirdPartyComponent extends Base implements OnChanges, OnInit map(([hasContent]) => (hasContent ? 'Run this notebook at mybinder.org' : 'The notebook has no content.')) ); + private primaryDescriptorSubscription: Subscription | null = null; + private secondaryDescriptorsSubscription: Subscription | null = null; + constructor( private workflowsService: WorkflowsService, - private descriptorTypeCompatService: DescriptorTypeCompatService, - private gA4GHFilesQuery: GA4GHFilesQuery, private descriptorsQuery: DescriptorsQuery, private descriptorsService: DescriptorsService, private cloudInstanceService: CloudInstancesService, - private usersService: UsersService, private userQuery: UserQuery, private descriptorLanguageService: DescriptorLanguageService, private dialog: MatDialog @@ -261,37 +277,12 @@ export class LaunchThirdPartyComponent extends Base implements OnChanges, OnInit // this.usersCloudInstances = cloudInstances; // }); // } - - this.gA4GHFilesQuery - .getToolFiles(this.descriptorTypeCompatService.stringToDescriptorType(this.workflow.descriptorType), [ - FileTypeEnum.PRIMARYDESCRIPTOR, - FileTypeEnum.SECONDARYDESCRIPTOR, - ]) - .pipe(takeUntil(this.ngUnsubscribe)) - .subscribe((fileDescriptors) => { - if (fileDescriptors && fileDescriptors.length) { - // No idea if this.workflow.descriptorType is the one that's required or if it's some other enum - const descriptorType = this.workflow.descriptorType; - const descriptorLanguageEnum = - this.descriptorLanguageService.workflowDescriptorTypeEnumToExtendedDescriptorLanguageBean( - descriptorType - ).descriptorLanguageEnum; - this.workflowsService.primaryDescriptor1(this.workflow.id, this.selectedVersion.name, descriptorType).subscribe((sourceFile) => { - this.descriptorsService.updatePrimaryDescriptor(sourceFile); - if (fileDescriptors.some((file) => file.file_type === FileTypeEnum.SECONDARYDESCRIPTOR)) { - this.workflowsService - .secondaryDescriptors1(this.workflow.id, this.selectedVersion.name, descriptorLanguageEnum) - .subscribe((sourceFiles: Array) => { - this.descriptorsService.updateSecondaryDescriptors(sourceFiles); - }); - } - }); - } - }); } ngOnChanges(changes: SimpleChanges): void { this.descriptorsQuery.clear(); + this.primaryDescriptorSubscription?.unsubscribe(); + this.secondaryDescriptorsSubscription?.unsubscribe(); this.trsUrl = this.trsUrlAsQueryValue = this.workflowPathAsQueryValue = null; if (this.workflow && this.selectedVersion) { this.trsUrl = this.descriptorsService.trsUrl(this.workflow.full_workflow_path, this.selectedVersion.name); @@ -301,6 +292,21 @@ export class LaunchThirdPartyComponent extends Base implements OnChanges, OnInit this.workflowRepositoryAsQueryValue = this.encode(this.workflow.repository); this.selectedVersionNameAsQueryValue = this.encode(this.selectedVersion.name); this.selectedVersionWorkflowPathAsQueryValue = this.encode(this.prependIfNotPrefix('/', this.selectedVersion.workflow_path)); + const descriptorType = this.workflow.descriptorType; + const descriptorLanguageEnum = + this.descriptorLanguageService.workflowDescriptorTypeEnumToExtendedDescriptorLanguageBean(descriptorType).descriptorLanguageEnum; + this.primaryDescriptorSubscription = this.workflowsService + .primaryDescriptor1(this.workflow.id, descriptorType, this.selectedVersion.name) + .pipe(takeUntil(this.ngUnsubscribe)) + .subscribe((sourceFile) => { + this.descriptorsService.updatePrimaryDescriptor(sourceFile); + }); + this.secondaryDescriptorsSubscription = this.workflowsService + .secondaryDescriptors1(this.workflow.id, descriptorLanguageEnum, this.selectedVersion.name) + .pipe(takeUntil(this.ngUnsubscribe)) + .subscribe((sourceFiles: Array) => { + this.descriptorsService.updateSecondaryDescriptors(sourceFiles); + }); this.devcontainers = undefined; if (this.workflow.descriptorType === Workflow.DescriptorTypeEnum.Jupyter) { const workflowId = this.workflow.id; diff --git a/src/app/workflow/launch-third-party/multi-cloud-launch/multi-cloud-launch.component.spec.ts b/src/app/workflow/launch-third-party/multi-cloud-launch/multi-cloud-launch.component.spec.ts index caf29eb39b..f331e0c9bb 100644 --- a/src/app/workflow/launch-third-party/multi-cloud-launch/multi-cloud-launch.component.spec.ts +++ b/src/app/workflow/launch-third-party/multi-cloud-launch/multi-cloud-launch.component.spec.ts @@ -1,6 +1,6 @@ import { HttpClientModule } from '@angular/common/http'; import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { CustomMaterialModule } from '../../../shared/modules/material.module'; +import { MatLegacySnackBarModule } from '@angular/material/legacy-snack-bar'; import { UsersService } from '../../../shared/openapi'; import { UserStubService } from '../../../test/service-stubs'; import { FilterCloudInstancesPipe } from '../filterCloudInstances.pipe'; @@ -13,8 +13,7 @@ describe('MultiCloudLaunchComponent', () => { beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [MultiCloudLaunchComponent, FilterCloudInstancesPipe], - imports: [CustomMaterialModule, HttpClientModule], + imports: [HttpClientModule, MultiCloudLaunchComponent, FilterCloudInstancesPipe, MatLegacySnackBarModule], providers: [{ provider: UsersService, useClass: UserStubService }], }); }) diff --git a/src/app/workflow/launch-third-party/multi-cloud-launch/multi-cloud-launch.component.ts b/src/app/workflow/launch-third-party/multi-cloud-launch/multi-cloud-launch.component.ts index eee27891b7..fcfcd16dba 100644 --- a/src/app/workflow/launch-third-party/multi-cloud-launch/multi-cloud-launch.component.ts +++ b/src/app/workflow/launch-third-party/multi-cloud-launch/multi-cloud-launch.component.ts @@ -1,14 +1,38 @@ import { HttpErrorResponse } from '@angular/common/http'; import { Component, EventEmitter, Input, OnInit, Output, ViewChild } from '@angular/core'; -import { MatMenuTrigger } from '@angular/material/menu'; +import { MatLegacyMenuTrigger as MatMenuTrigger, MatLegacyMenuModule } from '@angular/material/legacy-menu'; import { AlertService } from '../../../shared/alert/state/alert.service'; import { Base } from '../../../shared/base'; import { CloudInstance, Language, User, UsersService } from '../../../shared/openapi'; +import { FilterCloudInstancesPipe } from '../filterCloudInstances.pipe'; +import { MatLegacyInputModule } from '@angular/material/legacy-input'; +import { MatLegacyFormFieldModule } from '@angular/material/legacy-form-field'; +import { NgFor } from '@angular/common'; +import { FormsModule } from '@angular/forms'; +import { MatLegacyRadioModule } from '@angular/material/legacy-radio'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { MatIconModule } from '@angular/material/icon'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; @Component({ selector: 'app-multi-cloud-launch', templateUrl: './multi-cloud-launch.component.html', styleUrls: ['./multi-cloud-launch.component.scss', '../launch-third-party.component.scss'], + standalone: true, + imports: [ + MatLegacyTooltipModule, + MatLegacyButtonModule, + MatLegacyMenuModule, + MatIconModule, + FlexModule, + MatLegacyRadioModule, + FormsModule, + NgFor, + MatLegacyFormFieldModule, + MatLegacyInputModule, + FilterCloudInstancesPipe, + ], }) export class MultiCloudLaunchComponent extends Base implements OnInit { @ViewChild(MatMenuTrigger) trigger: MatMenuTrigger; diff --git a/src/app/workflow/launch/launch.component.html b/src/app/workflow/launch/launch.component.html index da4913ed95..93b1a4dda3 100644 --- a/src/app/workflow/launch/launch.component.html +++ b/src/app/workflow/launch/launch.component.html @@ -30,7 +30,10 @@ info GitHub App Tools are launched in workflow mode with the Dockstore CLI - + Make a runtime JSON template and fill in desired inputs, outputs, and other parameters +
    {{ planemoSharedZipString }}
    + + Then, create a runtime parameter template with Planemo and fill in desired inputs, outputs, and other parameters + +
    {{ planemoLocalInitString }}
    + + or grab one that the workflow author has provided (if applicable) + +
    {{ wgetTestJsonDescription }}
    +
    +
    Run locally with the Dockstore CLI @@ -71,6 +94,16 @@
    + +
    + Run with Planemo + +
    {{ planemoLocalLaunchString }}
    +
    +
    +
    Download the workflow files diff --git a/src/app/workflow/launch/launch.component.spec.ts b/src/app/workflow/launch/launch.component.spec.ts index 77a1d5e9cc..546f4d0a53 100644 --- a/src/app/workflow/launch/launch.component.spec.ts +++ b/src/app/workflow/launch/launch.component.spec.ts @@ -40,9 +40,8 @@ describe('LaunchWorkflowComponent', () => { beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [LaunchWorkflowComponent], schemas: [NO_ERRORS_SCHEMA], - imports: [HttpClientTestingModule], + imports: [HttpClientTestingModule, LaunchWorkflowComponent], providers: [ WorkflowLaunchService, { provide: ContainerService, useClass: ContainerStubService }, diff --git a/src/app/workflow/launch/launch.component.ts b/src/app/workflow/launch/launch.component.ts index 5ec3ee162c..8c25bb7737 100644 --- a/src/app/workflow/launch/launch.component.ts +++ b/src/app/workflow/launch/launch.component.ts @@ -14,7 +14,7 @@ * limitations under the License. */ import { Component, Input, OnChanges, OnInit, SimpleChanges } from '@angular/core'; -import { Observable, Subject } from 'rxjs'; +import { combineLatest, Observable, Subject } from 'rxjs'; import { takeUntil } from 'rxjs/operators'; import { ga4ghWorkflowIdPrefix } from '../../shared/constants'; @@ -29,11 +29,33 @@ import { Workflow } from '../../shared/openapi/model/workflow'; import { WorkflowVersion } from '../../shared/openapi/model/workflowVersion'; import { WorkflowLaunchService } from '../launch/workflow-launch.service'; import { EntryType } from '../../shared/enum/entry-type'; +import { LaunchCheckerWorkflowComponent } from '../../shared/entry/launch-checker-workflow/launch-checker-workflow.component'; +import { ClipboardModule } from '@angular/cdk/clipboard'; +import { SnackbarDirective } from '../../shared/snackbar.directive'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { MatIconModule } from '@angular/material/icon'; +import { MatLegacyCardModule } from '@angular/material/legacy-card'; +import { NgIf, AsyncPipe } from '@angular/common'; @Component({ selector: 'app-launch', templateUrl: './launch.component.html', styleUrls: ['./launch.component.css'], + standalone: true, + imports: [ + NgIf, + MatLegacyCardModule, + MatIconModule, + FlexModule, + MatLegacyTooltipModule, + MatLegacyButtonModule, + SnackbarDirective, + ClipboardModule, + LaunchCheckerWorkflowComponent, + AsyncPipe, + ], }) export class LaunchWorkflowComponent extends EntryTab implements OnInit, OnChanges { @Input() basePath; @@ -59,13 +81,18 @@ export class LaunchWorkflowComponent extends EntryTab implements OnInit, OnChang nextflowNativeLaunchDescription: string; nextflowLocalLaunchDescription: string; nextflowDownloadFileDescription: string; + planemoSharedZipString: string; + planemoLocalInitString: string; + planemoLocalLaunchString: string; descriptors: Array; cwlrunnerDescription = this.launchService.cwlrunnerDescription; cwlrunnerTooltip = this.launchService.cwlrunnerTooltip; cwltoolTooltip = this.launchService.cwltoolTooltip; + primaryDescriptorPath: string; testParameterPath: string; descriptorType$: Observable; isNFL$: Observable; + isGalaxy$: Observable; ToolDescriptor = ToolDescriptor; EntryType = EntryType; protected published$: Observable; @@ -86,10 +113,12 @@ export class LaunchWorkflowComponent extends EntryTab implements OnInit, OnChang ngOnInit(): void { this.published$ = this.workflowQuery.workflowIsPublished$; this.descriptorType$ = this.workflowQuery.descriptorType$; - this.descriptorType$ - .pipe(takeUntil(this.ngUnsubscribe)) - .subscribe((descriptorType: ToolDescriptor.TypeEnum) => (this.currentDescriptor = descriptorType)); + this.descriptorType$.pipe(takeUntil(this.ngUnsubscribe)).subscribe((descriptorType: ToolDescriptor.TypeEnum) => { + this.currentDescriptor = descriptorType; + this.reactToDescriptor(); + }); this.isNFL$ = this.workflowQuery.isNFL$; + this.isGalaxy$ = this.workflowQuery.isGalaxy$; } ngOnChanges(changes: SimpleChanges): void { @@ -101,6 +130,9 @@ export class LaunchWorkflowComponent extends EntryTab implements OnInit, OnChang this.changeMessages(this.basePath, this.path, this._selectedVersion.name, this.currentDescriptor); } private changeMessages(basePath: string, workflowPath: string, versionName: string, descriptorType: ToolDescriptor.TypeEnum) { + if (descriptorType === undefined) { + return; + } this.params = this.launchService.getParamsString(workflowPath, versionName, descriptorType); this.cli = this.launchService.getCliString(workflowPath, versionName, descriptorType); this.cwl = this.launchService.getCwlString(workflowPath, versionName, encodeURIComponent(this._selectedVersion.workflow_path)); @@ -126,20 +158,46 @@ export class LaunchWorkflowComponent extends EntryTab implements OnInit, OnChang * @param versionName */ updateWgetTestJsonString(workflowPath: string, versionName: string, descriptorType: ToolDescriptor.TypeEnum): void { - let toolFiles$: Observable>; - toolFiles$ = this.gA4GHFilesQuery.getToolFiles(descriptorType, [ToolFile.FileTypeEnum.TESTFILE]); - toolFiles$.pipe(takeUntil(this.ngUnsubscribe)).subscribe((toolFiles: Array) => { - if (toolFiles && toolFiles.length > 0) { - this.testParameterPath = toolFiles[0].path; - } else { - this.testParameterPath = null; + combineLatest([ + this.gA4GHFilesQuery.getToolFiles(descriptorType, [ToolFile.FileTypeEnum.TESTFILE]), + this.gA4GHFilesQuery.getToolFiles(descriptorType, [ToolFile.FileTypeEnum.PRIMARYDESCRIPTOR]), + ]).subscribe( + ([toolFiles, descriptorFiles]) => { + // test parameter file is optional ... + if (toolFiles) { + if (toolFiles.length > 0) { + this.testParameterPath = toolFiles[0].path; + } else { + this.testParameterPath = undefined; + } + this.wgetTestJsonDescription = this.launchService.getTestJsonString( + ga4ghWorkflowIdPrefix + workflowPath, + versionName, + descriptorType, + this.testParameterPath + ); + } else { + this.testParameterPath = undefined; + } + if (descriptorFiles?.length > 0) { + // ... but primary descriptor is mandatory + this.primaryDescriptorPath = descriptorFiles[0].path; + this.planemoSharedZipString = this.launchService.getSharedZipString(workflowPath, versionName); + this.planemoLocalInitString = this.launchService.getPlanemoLocalInitString(workflowPath, versionName, this.primaryDescriptorPath); + this.planemoLocalLaunchString = this.launchService.getPlanemoLocalLaunchString( + workflowPath, + versionName, + this.primaryDescriptorPath + ); + } else { + this.primaryDescriptorPath = undefined; + this.planemoLocalInitString = undefined; + this.planemoLocalLaunchString = undefined; + } + }, + (err) => { + console.log(err); } - this.wgetTestJsonDescription = this.launchService.getTestJsonString( - ga4ghWorkflowIdPrefix + workflowPath, - versionName, - descriptorType, - this.testParameterPath - ); - }); + ); } } diff --git a/src/app/workflow/permissions/permissions.component.spec.ts b/src/app/workflow/permissions/permissions.component.spec.ts index 967f2720d0..61fb0151e0 100644 --- a/src/app/workflow/permissions/permissions.component.spec.ts +++ b/src/app/workflow/permissions/permissions.component.spec.ts @@ -1,8 +1,8 @@ import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { MatLegacySnackBarModule } from '@angular/material/legacy-snack-bar'; import { RefreshService } from '../../shared/refresh.service'; import { TokenService } from '../../shared/state/token.service'; -import { CustomMaterialModule } from './../../shared/modules/material.module'; import { WorkflowsService } from './../../shared/openapi/api/workflows.service'; import { RefreshStubService, TokenStubService, WorkflowsStubService } from './../../test/service-stubs'; import { PermissionsComponent } from './permissions.component'; @@ -14,8 +14,7 @@ describe('PermissionsComponent', () => { beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [PermissionsComponent], - imports: [CustomMaterialModule], + imports: [PermissionsComponent, MatLegacySnackBarModule], providers: [ { provide: WorkflowsService, useClass: WorkflowsStubService }, { provide: TokenService, useClass: TokenStubService }, diff --git a/src/app/workflow/permissions/permissions.component.ts b/src/app/workflow/permissions/permissions.component.ts index 6bb07781be..39caef1c75 100644 --- a/src/app/workflow/permissions/permissions.component.ts +++ b/src/app/workflow/permissions/permissions.component.ts @@ -1,7 +1,7 @@ import { COMMA, ENTER } from '@angular/cdk/keycodes'; import { HttpErrorResponse } from '@angular/common/http'; import { Component, Input, OnInit } from '@angular/core'; -import { MatChipInputEvent } from '@angular/material/chips'; +import { MatLegacyChipInputEvent as MatChipInputEvent, MatLegacyChipsModule } from '@angular/material/legacy-chips'; import { Subject } from 'rxjs'; import { takeUntil } from 'rxjs/operators'; import { AlertService } from '../../shared/alert/state/alert.service'; @@ -9,12 +9,18 @@ import { Dockstore } from '../../shared/dockstore.model'; import { TokenSource } from '../../shared/enum/token-source.enum'; import { TokenQuery } from '../../shared/state/token.query'; import { Permission, Workflow, WorkflowsService, WorkflowSubClass } from '../../shared/openapi'; +import { MatIconModule } from '@angular/material/icon'; +import { MatLegacyFormFieldModule } from '@angular/material/legacy-form-field'; +import { MatLegacyProgressBarModule } from '@angular/material/legacy-progress-bar'; +import { NgIf, NgFor } from '@angular/common'; import RoleEnum = Permission.RoleEnum; @Component({ selector: 'app-permissions', templateUrl: './permissions.component.html', styleUrls: ['./permissions.component.scss'], + standalone: true, + imports: [NgIf, MatLegacyProgressBarModule, MatLegacyFormFieldModule, MatLegacyChipsModule, NgFor, MatIconModule], }) export class PermissionsComponent implements OnInit { public Role = RoleEnum; diff --git a/src/app/workflow/refresh-workflow-organization/refresh-workflow-organization.component.spec.ts b/src/app/workflow/refresh-workflow-organization/refresh-workflow-organization.component.spec.ts index 9e5042544e..d52b8e1ea0 100644 --- a/src/app/workflow/refresh-workflow-organization/refresh-workflow-organization.component.spec.ts +++ b/src/app/workflow/refresh-workflow-organization/refresh-workflow-organization.component.spec.ts @@ -15,12 +15,12 @@ */ import { HttpClientTestingModule } from '@angular/common/http/testing'; import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { MatButtonModule } from '@angular/material/button'; -import { MatDialog } from '@angular/material/dialog'; +import { MatLegacyButtonModule as MatButtonModule } from '@angular/material/legacy-button'; +import { MatLegacyDialog as MatDialog } from '@angular/material/legacy-dialog'; import { MatIconModule } from '@angular/material/icon'; -import { MatSnackBarModule } from '@angular/material/snack-bar'; +import { MatLegacySnackBarModule as MatSnackBarModule } from '@angular/material/legacy-snack-bar'; import { MatToolbarModule } from '@angular/material/toolbar'; -import { MatTooltipModule } from '@angular/material/tooltip'; +import { MatLegacyTooltipModule as MatTooltipModule } from '@angular/material/legacy-tooltip'; import { DateService } from '../../shared/date.service'; import { ExtendedDockstoreToolService } from '../../shared/extended-dockstoreTool/extended-dockstoreTool.service'; import { ProviderService } from '../../shared/provider.service'; @@ -46,8 +46,15 @@ describe('RefreshWorkflowOrganizationComponent', () => { beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [RefreshWorkflowOrganizationComponent], - imports: [MatToolbarModule, MatIconModule, MatButtonModule, MatTooltipModule, MatSnackBarModule, HttpClientTestingModule], + imports: [ + MatToolbarModule, + MatIconModule, + MatButtonModule, + MatTooltipModule, + MatSnackBarModule, + HttpClientTestingModule, + RefreshWorkflowOrganizationComponent, + ], providers: [ { provide: UsersService, useClass: UsersStubService }, { provide: WorkflowService, useClass: WorkflowStubService }, diff --git a/src/app/workflow/refresh-workflow-organization/refresh-workflow-organization.component.ts b/src/app/workflow/refresh-workflow-organization/refresh-workflow-organization.component.ts index fc9b9f12c2..4dfd510918 100644 --- a/src/app/workflow/refresh-workflow-organization/refresh-workflow-organization.component.ts +++ b/src/app/workflow/refresh-workflow-organization/refresh-workflow-organization.component.ts @@ -29,12 +29,16 @@ import { WorkflowService } from '../../shared/state/workflow.service'; import { WorkflowsService } from '../../shared/openapi'; import { Workflow } from '../../shared/openapi/model/workflow'; import { UserQuery } from '../../shared/user/user.query'; +import { AsyncPipe } from '@angular/common'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; @Component({ selector: 'app-refresh-workflow-organization', // Note that the template and style is actually from the shared one (used by both my-workflows and my-tools) templateUrl: './../../shared/refresh-organization/refresh-organization.component.html', styleUrls: ['./../../shared/refresh-organization/refresh-organization.component.css'], + standalone: true, + imports: [MatLegacyButtonModule, AsyncPipe], }) export class RefreshWorkflowOrganizationComponent extends RefreshOrganizationComponent implements OnInit, OnChanges { @Input() protected orgWorkflowObject: OrgWorkflowObject; diff --git a/src/app/workflow/register-workflow-modal/register-github-app-modal/register-github-app-modal.component.html b/src/app/workflow/register-workflow-modal/register-github-app-modal/register-github-app-modal.component.html index cc689f7c2f..db7dc9eaa7 100644 --- a/src/app/workflow/register-workflow-modal/register-github-app-modal/register-github-app-modal.component.html +++ b/src/app/workflow/register-workflow-modal/register-github-app-modal/register-github-app-modal.component.html @@ -1,5 +1,5 @@

    Register {{ entryType | titlecase }}

    - + - +
    @@ -61,22 +63,16 @@

    -
    - Are you sure you want to snapshot this version, making it uneditable? This cannot be undone. + Are you sure you want to snapshot this version, making it uneditable? This cannot be undone.
    +

    +
    @@ -134,6 +154,29 @@

    +
    + + Version DOI: + + n/a + + + Concept DOI: + + n/a + + +
    Categories @@ -145,7 +188,9 @@

    - Labels + + Labels:{{ workflowEditData?.labels.length === 0 ? ' n/a' : '' }} +

    + +
    Cite this {{ workflow.entryTypeMetadata.term }}
    + + +

    + Cite version {{ selectedVersion.name }} using DOI + . +

    +

    + Version {{ selectedVersion.name }} has no DOI. +

    +

    + Cite all versions using the DOI + . This DOI represents all versions, and + will always resolve to the latest one. +

    +
    +
    Recent Versions
    diff --git a/src/app/workflow/workflow.component.ts b/src/app/workflow/workflow.component.ts index 7e63546330..6b7c0a8367 100644 --- a/src/app/workflow/workflow.component.ts +++ b/src/app/workflow/workflow.component.ts @@ -14,20 +14,33 @@ * limitations under the License. */ import { COMMA, ENTER } from '@angular/cdk/keycodes'; -import { Location } from '@angular/common'; +import { + Location, + NgIf, + NgFor, + NgClass, + NgSwitch, + NgSwitchCase, + NgSwitchDefault, + NgTemplateOutlet, + AsyncPipe, + DatePipe, +} from '@angular/common'; import { AfterViewInit, Component, Input, OnInit } from '@angular/core'; -import { MatChipInputEvent } from '@angular/material/chips'; -import { MatDialog } from '@angular/material/dialog'; +import { MatLegacyChipInputEvent as MatChipInputEvent, MatLegacyChipsModule } from '@angular/material/legacy-chips'; +import { MatLegacyDialog as MatDialog } from '@angular/material/legacy-dialog'; import { ActivatedRoute, Router } from '@angular/router'; import { AlertService } from 'app/shared/alert/state/alert.service'; import { BioWorkflow } from 'app/shared/openapi/model/bioWorkflow'; import { Service } from 'app/shared/openapi/model/service'; import { Notebook } from 'app/shared/openapi/model/notebook'; +import { ShareIconsModule } from 'ngx-sharebuttons/icons'; import { Observable, ReplaySubject } from 'rxjs'; import { finalize, takeUntil } from 'rxjs/operators'; import { AlertQuery } from '../shared/alert/state/alert.query'; import { BioschemaService } from '../shared/bioschema.service'; import { + bootstrap4largeModalSize, ga4ghNotebookIdPrefix, ga4ghServiceIdPrefix, ga4ghWorkflowIdPrefix, @@ -42,6 +55,7 @@ import { import { DateService } from '../shared/date.service'; import { DescriptorTypeCompatService } from '../shared/descriptor-type-compat.service'; import { DockstoreService } from '../shared/dockstore.service'; +import { Dockstore } from '../shared/dockstore.model'; import { Entry } from '../shared/entry'; import { EntryType } from '../shared/enum/entry-type'; import { GA4GHFilesService } from '../shared/ga4gh-files/ga4gh-files.service'; @@ -52,7 +66,8 @@ import { SessionService } from '../shared/session/session.service'; import { ExtendedWorkflowQuery } from '../shared/state/extended-workflow.query'; import { WorkflowQuery } from '../shared/state/workflow.query'; import { WorkflowService } from '../shared/state/workflow.service'; -import { Permission, ToolDescriptor, WorkflowsService, EntriesService, WorkflowSubClass } from '../shared/openapi'; +import { Permission, ToolDescriptor, WorkflowsService, EntriesService, WorkflowSubClass, Doi } from '../shared/openapi'; +import { SyncStatus } from '../shared/openapi/model/syncStatus'; import { Tag } from '../shared/openapi/model/tag'; import { Workflow } from '../shared/openapi/model/workflow'; import { WorkflowVersion } from '../shared/openapi/model/workflowVersion'; @@ -61,14 +76,98 @@ import { UrlResolverService } from '../shared/url-resolver.service'; import { Title } from '@angular/platform-browser'; import { EntryCategoriesService } from '../categories/state/entry-categories.service'; import RoleEnum = Permission.RoleEnum; -import { FormControl } from '@angular/forms'; +import { FormControl, FormsModule, ReactiveFormsModule } from '@angular/forms'; +import { BaseUrlPipe } from '../shared/entry/base-url.pipe'; +import { ShareButtonsModule } from 'ngx-sharebuttons/buttons'; +import { VerifiedByComponent } from '../shared/entry/verified-by/verified-by.component'; +import { CurrentCollectionsComponent } from '../entry/current-collections/current-collections.component'; +import { MatDividerModule } from '@angular/material/divider'; +import { LaunchThirdPartyComponent } from './launch-third-party/launch-third-party.component'; +import { PermissionsComponent } from './permissions/permissions.component'; +import { ExecutionsTabComponent } from './executions/executions-tab.component'; +import { DagComponent } from './dag/dag.component'; +import { ToolTabComponent } from './tool-tab/tool-tab.component'; +import { WorkflowFileEditorComponent } from './workflow-file-editor/workflow-file-editor.component'; +import { SourceFileTabsComponent } from '../source-file-tabs/source-file-tabs.component'; +import { VersionsWorkflowComponent } from './versions/versions.component'; +import { LaunchWorkflowComponent } from './launch/launch.component'; +import { NotebookComponent } from '../notebook/notebook.component'; +import { InfoTabComponent } from './info-tab/info-tab.component'; +import { MatLegacyTabsModule } from '@angular/material/legacy-tabs'; +import { StargazersComponent } from '../stargazers/stargazers.component'; +import { CategoryButtonComponent } from '../categories/button/category-button.component'; +import { WorkflowActionsComponent } from '../shared/entry-actions/workflow-actions.component'; +import { StarringComponent } from '../starring/starring.component'; +import { NgxMatSelectSearchModule } from 'ngx-mat-select-search'; +import { MatLegacyOptionModule } from '@angular/material/legacy-core'; +import { MatLegacySelectModule } from '@angular/material/legacy-select'; +import { MatLegacyFormFieldModule } from '@angular/material/legacy-form-field'; +import { ExtendedModule } from '@ngbracket/ngx-layout/extended'; +import { JsonLdComponent } from '../shared/json-ld/json-ld.component'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { MatIconModule } from '@angular/material/icon'; +import { MatLegacyCardModule } from '@angular/material/legacy-card'; +import { ManageDoisDialogComponent } from 'app/shared/entry/doi/manage-dois/manage-dois-dialog.component'; +import { DoiBadgeComponent } from 'app/shared/entry/doi/doi-badge/doi-badge.component'; @Component({ selector: 'app-workflow', templateUrl: './workflow.component.html', styleUrls: ['../shared/styles/workflow-container.component.scss'], + standalone: true, + imports: [ + NgIf, + MatLegacyCardModule, + MatIconModule, + MatLegacyButtonModule, + MatLegacyTooltipModule, + FlexModule, + JsonLdComponent, + ExtendedModule, + MatLegacyChipsModule, + MatLegacyFormFieldModule, + MatLegacySelectModule, + FormsModule, + ReactiveFormsModule, + MatLegacyOptionModule, + NgxMatSelectSearchModule, + NgFor, + StarringComponent, + WorkflowActionsComponent, + CategoryButtonComponent, + StargazersComponent, + NgClass, + MatLegacyTabsModule, + InfoTabComponent, + NotebookComponent, + LaunchWorkflowComponent, + VersionsWorkflowComponent, + NgSwitch, + NgSwitchCase, + NgSwitchDefault, + NgTemplateOutlet, + SourceFileTabsComponent, + WorkflowFileEditorComponent, + ToolTabComponent, + DagComponent, + ExecutionsTabComponent, + PermissionsComponent, + LaunchThirdPartyComponent, + MatDividerModule, + CurrentCollectionsComponent, + VerifiedByComponent, + ShareButtonsModule, + ShareIconsModule, + AsyncPipe, + DatePipe, + BaseUrlPipe, + DoiBadgeComponent, + ], }) export class WorkflowComponent extends Entry implements AfterViewInit, OnInit { + DoiInitiatorEnum = Doi.InitiatorEnum; workflowEditData: any; public isRefreshing$: Observable; public workflow: BioWorkflow | Service | Notebook; @@ -77,6 +176,7 @@ export class WorkflowComponent extends Entry implements AfterVi public sortedVersions: Array = []; private resourcePath: string; public showRedirect = false; + public gitHubAppInstalled: boolean | null; public githubPath = 'github.com/'; public gitlabPath = 'gitlab.com/'; public bitbucketPath = 'bitbucket.org/'; @@ -105,6 +205,8 @@ export class WorkflowComponent extends Entry implements AfterVi public workflowVersionsCtrl: FormControl = new FormControl(null); //control for the selected version public versionFilterCtrl: FormControl = new FormControl(''); // control for the MatSelect filter keyword public filteredVersions: ReplaySubject> = new ReplaySubject>(1); + public selectedVersionDoi: Doi | undefined; + public selectedConceptDoi: Doi | undefined; @Input() user; @Input() selectedVersion: WorkflowVersion; @@ -297,6 +399,12 @@ export class WorkflowComponent extends Entry implements AfterVi }); } }); + this.entryService + .syncStatus(this.workflow.id) + .pipe(takeUntil(this.ngUnsubscribe)) + .subscribe((syncStatus: SyncStatus) => { + this.gitHubAppInstalled = syncStatus.gitHubAppInstalled; + }); } this.updateVerifiedPlatforms(this.workflow.id); this.updateCategories(this.workflow.id, this.workflow.is_published); @@ -309,6 +417,7 @@ export class WorkflowComponent extends Entry implements AfterVi if (workflow) { this.published = this.workflow.is_published; this.selectedVersion = this.selectWorkflowVersion(this.workflow.workflowVersions, this.urlVersion, this.workflow.defaultVersion); + this.selectedConceptDoi = this.workflow.conceptDois[this.workflow.doiSelection]; if (this.selectedVersion) { this.workflowService.setWorkflowVersion(this.selectedVersion); this.updateVersionsFileTypes(this.workflow.id, this.selectedVersion.id); @@ -319,6 +428,7 @@ export class WorkflowComponent extends Entry implements AfterVi } else { this.gA4GHFilesService.updateFiles(trsID, this.selectedVersion.name, [this.workflow.descriptorType]); } + this.selectedVersionDoi = this.selectedVersion.dois[this.workflow.doiSelection]; } this.workflowVersionAlphabetical = this.workflow.workflowVersions.slice().sort((a, b) => { return a.name.localeCompare(b.name); @@ -398,15 +508,8 @@ export class WorkflowComponent extends Entry implements AfterVi this.updateWorkflowUrl(this.workflow); }, (error) => { - const workflowOrgRegex = /\/workflows\/.+/; - const workflowRegex = /\/workflows\/(github.com)|(gitlab.com)|(bitbucket.org)\/.+/; - const gitHubAppToolRegex = /\/containers\/(github.com)\/.+/; - if ( - workflowOrgRegex.test(this.resourcePath) || - workflowRegex.test(this.resourcePath) || - gitHubAppToolRegex.test(this.resourcePath) - ) { - this.router.navigate(['page-not-found']); + if (!this.workflow) { + this.urlResolverService.showPageNotFound(); } else { this.showRedirect = true; // Retrieve the workflow path from the URL @@ -434,7 +537,7 @@ export class WorkflowComponent extends Entry implements AfterVi const entryPath = workflow.full_workflow_path; if (this.entryType === EntryType.BioWorkflow) { this.updateUrl(entryPath, myBioWorkflowsURLSegment, 'workflows', this.selectedVersion); - } else if (this.entryType === EntryType.Tool) { + } else if (this.entryType === EntryType.Tool || this.entryType === EntryType.AppTool) { this.updateUrl(entryPath, myToolsURLSegment, 'containers', this.selectedVersion); } else if (this.entryType === EntryType.Notebook) { this.updateUrl(entryPath, myNotebooksURLSegment, 'notebooks', this.selectedVersion); @@ -513,6 +616,7 @@ export class WorkflowComponent extends Entry implements AfterVi ]); this.updateVersionsFileTypes(this.workflow.id, this.selectedVersion.id); this.versionAgoMessage = this.dateService.getAgoMessage((this.selectedVersion as WorkflowVersion).last_modified); + this.selectedVersionDoi = this.selectedVersion.dois[this.workflow.doiSelection]; } this.workflowService.setWorkflowVersion(version); this.updateWorkflowUrl(this.workflow); @@ -524,11 +628,6 @@ export class WorkflowComponent extends Entry implements AfterVi this.updateWorkflowUrl(this.workflow); } - getPageIndex(): number { - const pageIndex = this.getIndexInURL('/workflows'); - return pageIndex; - } - addToLabels(event: MatChipInputEvent): void { const input = event.input; const value = event.value; @@ -549,4 +648,15 @@ export class WorkflowComponent extends Entry implements AfterVi this.workflowEditData.labels.splice(index, 1); } } + + openGitHubApp(): void { + window.open(Dockstore.GITHUB_APP_INSTALLATION_URL + '/installations/new', '_blank', 'noopener,noreferrer'); + } + + manageDois() { + this.dialog.open(ManageDoisDialogComponent, { + width: bootstrap4largeModalSize, + data: { entry: this.workflow, version: this.selectedVersion }, + }); + } } diff --git a/src/app/workflows/apptools/apptools.module.ts b/src/app/workflows/apptools/apptools.module.ts deleted file mode 100644 index ce73a1809e..0000000000 --- a/src/app/workflows/apptools/apptools.module.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { NgModule } from '@angular/core'; -import { WorkflowsPageModule } from '../../shared/modules/workflowsPage.module'; -import { AppToolsRoutes } from './apptools.routing'; - -@NgModule({ - declarations: [], - imports: [WorkflowsPageModule, AppToolsRoutes], -}) -export class AppToolsModule {} diff --git a/src/app/workflows/apptools/apptools.routing.ts b/src/app/workflows/apptools/apptools.routing.ts index 33cbe7699a..58d54ff7d4 100644 --- a/src/app/workflows/apptools/apptools.routing.ts +++ b/src/app/workflows/apptools/apptools.routing.ts @@ -1,4 +1,4 @@ -import { RouterModule, Routes } from '@angular/router'; +import { Routes } from '@angular/router'; import { EntryType } from 'app/shared/enum/entry-type'; import { WorkflowComponent } from 'app/workflow/workflow.component'; import { SearchWorkflowsComponent } from '../search/search.component'; @@ -16,4 +16,4 @@ const routes: Routes = [ }, ]; -export const AppToolsRoutes = RouterModule.forChild(routes); +export const AppToolsRoutes = routes; diff --git a/src/app/workflows/list/list.component.ts b/src/app/workflows/list/list.component.ts index bd2d32312b..740ae3cbd9 100644 --- a/src/app/workflows/list/list.component.ts +++ b/src/app/workflows/list/list.component.ts @@ -26,20 +26,56 @@ import { PaginatorService } from '../../shared/state/paginator.service'; import { Workflow, WorkflowsService } from '../../shared/openapi'; import { ToolLister } from '../../shared/tool-lister'; import { PublishedWorkflowsDataSource } from './published-workflows.datasource'; +import { DescriptorLanguagePipe } from '../../shared/entry/descriptor-language.pipe'; +import { RouterLinkPipe } from '../../entry/router-link.pipe'; +import { MatLegacyPaginatorModule } from '@angular/material/legacy-paginator'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { FontAwesomeModule } from '@fortawesome/angular-fontawesome'; +import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; +import { MatIconModule } from '@angular/material/icon'; +import { ExtendedModule } from '@ngbracket/ngx-layout/extended'; +import { RouterLink } from '@angular/router'; +import { MatSortModule } from '@angular/material/sort'; +import { MatLegacyTableModule } from '@angular/material/legacy-table'; +import { MatLegacyInputModule } from '@angular/material/legacy-input'; +import { MatLegacyFormFieldModule } from '@angular/material/legacy-form-field'; +import { MatLegacyProgressBarModule } from '@angular/material/legacy-progress-bar'; +import { NgIf, AsyncPipe, TitleCasePipe } from '@angular/common'; @Component({ selector: 'app-list-workflows', templateUrl: './list.component.html', styleUrls: ['../../shared/styles/entry-table.scss', './list.component.scss'], + standalone: true, + imports: [ + NgIf, + MatLegacyProgressBarModule, + MatLegacyFormFieldModule, + MatLegacyInputModule, + MatLegacyTableModule, + MatSortModule, + RouterLink, + ExtendedModule, + MatIconModule, + MatLegacyTooltipModule, + FontAwesomeModule, + MatLegacyButtonModule, + MatLegacyPaginatorModule, + AsyncPipe, + TitleCasePipe, + RouterLinkPipe, + DescriptorLanguagePipe, + ], }) export class ListWorkflowsComponent extends ToolLister implements OnInit { @Input() previewMode: boolean; public workflowColumns = ['repository', 'verified', 'author', 'descriptorType', 'projectLinks', 'stars']; public notebookColumns = ['repository', 'author', 'descriptorType', 'descriptorTypeSubclass', 'projectLinks', 'stars']; + public serviceColumns = ['repository', 'verified', 'author', 'projectLinks', 'stars']; public typeToDisplayedColumns = { workflow: this.workflowColumns, - service: this.workflowColumns, + service: this.serviceColumns, appTool: this.workflowColumns, notebook: this.notebookColumns, }; diff --git a/src/app/workflows/notebooks/notebooks.module.ts b/src/app/workflows/notebooks/notebooks.module.ts deleted file mode 100644 index 525c8e3b60..0000000000 --- a/src/app/workflows/notebooks/notebooks.module.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { NgModule } from '@angular/core'; -import { WorkflowsPageModule } from 'app/shared/modules/workflowsPage.module'; -import { NotebooksRoutes } from './notebooks.routing'; - -@NgModule({ - imports: [WorkflowsPageModule, NotebooksRoutes], -}) -export class NotebooksModule {} diff --git a/src/app/workflows/notebooks/notebooks.routing.ts b/src/app/workflows/notebooks/notebooks.routing.ts index f3ed2517c7..cef8bc98eb 100644 --- a/src/app/workflows/notebooks/notebooks.routing.ts +++ b/src/app/workflows/notebooks/notebooks.routing.ts @@ -1,4 +1,4 @@ -import { RouterModule, Routes } from '@angular/router'; +import { Routes } from '@angular/router'; import { EntryType } from 'app/shared/enum/entry-type'; import { WorkflowComponent } from 'app/workflow/workflow.component'; import { SearchWorkflowsComponent } from '../search/search.component'; @@ -16,4 +16,4 @@ const routes: Routes = [ }, ]; -export const NotebooksRoutes = RouterModule.forChild(routes); +export const NotebooksRoutes = routes; diff --git a/src/app/workflows/search/search.component.ts b/src/app/workflows/search/search.component.ts index 12865a062a..12cbdef6fa 100644 --- a/src/app/workflows/search/search.component.ts +++ b/src/app/workflows/search/search.component.ts @@ -15,9 +15,12 @@ */ import { Component } from '@angular/core'; +import { ListWorkflowsComponent } from '../list/list.component'; @Component({ selector: 'app-search-workflows', templateUrl: './search.component.html', + standalone: true, + imports: [ListWorkflowsComponent], }) export class SearchWorkflowsComponent {} diff --git a/src/app/workflows/services/services.module.ts b/src/app/workflows/services/services.module.ts deleted file mode 100644 index 62ea7d73dc..0000000000 --- a/src/app/workflows/services/services.module.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { NgModule } from '@angular/core'; -import { WorkflowsPageModule } from 'app/shared/modules/workflowsPage.module'; -import { ServicesRoutes } from './services.routing'; - -@NgModule({ - imports: [WorkflowsPageModule, ServicesRoutes], -}) -export class ServicesModule {} diff --git a/src/app/workflows/services/services.routing.ts b/src/app/workflows/services/services.routing.ts index abb605ac7a..5b539e41bc 100644 --- a/src/app/workflows/services/services.routing.ts +++ b/src/app/workflows/services/services.routing.ts @@ -1,4 +1,4 @@ -import { RouterModule, Routes } from '@angular/router'; +import { Routes } from '@angular/router'; import { EntryType } from 'app/shared/enum/entry-type'; import { WorkflowComponent } from 'app/workflow/workflow.component'; import { SearchWorkflowsComponent } from '../search/search.component'; @@ -16,4 +16,4 @@ const routes: Routes = [ }, ]; -export const ServicesRoutes = RouterModule.forChild(routes); +export const ServicesRoutes = routes; diff --git a/src/app/workflows/workflows.component.ts b/src/app/workflows/workflows.component.ts index 98f2536bf1..88869493a8 100644 --- a/src/app/workflows/workflows.component.ts +++ b/src/app/workflows/workflows.component.ts @@ -15,17 +15,23 @@ */ import { Component } from '@angular/core'; -import { ActivatedRoute, Router } from '@angular/router'; +import { ActivatedRoute, Router, RouterLink, RouterOutlet } from '@angular/router'; import { SessionQuery } from 'app/shared/session/session.query'; import { SessionService } from 'app/shared/session/session.service'; import { Observable } from 'rxjs'; import { EntryType } from '../shared/enum/entry-type'; import { EntryTypeMetadata } from 'app/shared/openapi'; import { UrlResolverService } from '../shared/url-resolver.service'; +import { ExtendedModule } from '@ngbracket/ngx-layout/extended'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { NgIf, AsyncPipe, TitleCasePipe } from '@angular/common'; +import { HeaderComponent } from '../header/header.component'; @Component({ selector: 'app-workflows', templateUrl: './workflows.component.html', + standalone: true, + imports: [HeaderComponent, NgIf, FlexModule, RouterLink, ExtendedModule, RouterOutlet, AsyncPipe, TitleCasePipe], }) export class WorkflowsComponent { public entryName: string; diff --git a/src/app/workflows/workflows.module.ts b/src/app/workflows/workflows.module.ts deleted file mode 100644 index 4f40c05836..0000000000 --- a/src/app/workflows/workflows.module.ts +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright 2017 OICR - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import { NgModule } from '@angular/core'; -import { WorkflowsPageModule } from 'app/shared/modules/workflowsPage.module'; -import { workflowsRouting } from './workflows.routing'; -import { PlatformPartnerPipe } from '../shared/entry/platform-partner.pipe'; - -@NgModule({ - declarations: [], - imports: [workflowsRouting, WorkflowsPageModule], - providers: [PlatformPartnerPipe], -}) -export class WorkflowsModule {} diff --git a/src/app/workflows/workflows.routing.ts b/src/app/workflows/workflows.routing.ts index 93b6df554d..0df9786c27 100644 --- a/src/app/workflows/workflows.routing.ts +++ b/src/app/workflows/workflows.routing.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { RouterModule, Routes } from '@angular/router'; +import { Routes } from '@angular/router'; import { EntryType } from 'app/shared/enum/entry-type'; import { WorkflowComponent } from '../workflow/workflow.component'; import { SearchWorkflowsComponent } from './search/search.component'; @@ -32,4 +32,4 @@ const WORKFLOWS_ROUTES: Routes = [ }, ]; -export const workflowsRouting = RouterModule.forChild(WORKFLOWS_ROUTES); +export const workflowsRouting = WORKFLOWS_ROUTES; diff --git a/src/assets/svg/ai-icon.svg b/src/assets/svg/ai-icon.svg new file mode 100644 index 0000000000..12f3023f25 --- /dev/null +++ b/src/assets/svg/ai-icon.svg @@ -0,0 +1 @@ + diff --git a/src/assets/text/sample-notebook-dockstore.yml b/src/assets/text/sample-notebook-dockstore.yml new file mode 100644 index 0000000000..ddd0281f4a --- /dev/null +++ b/src/assets/text/sample-notebook-dockstore.yml @@ -0,0 +1,11 @@ +version: 1.2 # The .dockstore.yml schema version +notebooks: + - format: + language: + path: + kernel: + otherFiles: + readMePath: + authors: + - orcid: + topic: \ No newline at end of file diff --git a/src/assets/text/sample-service-dockstore.yml b/src/assets/text/sample-service-dockstore.yml new file mode 100644 index 0000000000..d080dba0a1 --- /dev/null +++ b/src/assets/text/sample-service-dockstore.yml @@ -0,0 +1,22 @@ +version: 1.2 # The .dockstore.yml schema version +service: + subclass: + name: + authors: + - orcid: + topic: + description: + publish: + files: + scripts: + start: + environment: + : + default: + description: + data: + : + targetDirectory: + files: + : + description: \ No newline at end of file diff --git a/src/assets/text/sample-tool-dockstore.yml b/src/assets/text/sample-tool-dockstore.yml new file mode 100644 index 0000000000..7737eb40f5 --- /dev/null +++ b/src/assets/text/sample-tool-dockstore.yml @@ -0,0 +1,10 @@ +version: 1.2 # The .dockstore.yml schema version +tools: + - subclass: CWL + primaryDescriptorPath: + testParameterFiles: # + - + - + authors: + - orcid: + topic: \ No newline at end of file diff --git a/src/assets/text/sample-workflow-dockstore.yml b/src/assets/text/sample-workflow-dockstore.yml new file mode 100644 index 0000000000..09ccfa1ccc --- /dev/null +++ b/src/assets/text/sample-workflow-dockstore.yml @@ -0,0 +1,10 @@ +version: 1.2 # The .dockstore.yml schema version +workflows: + - subclass: + primaryDescriptorPath: + testParameterFiles: # + - + - + readMePath: + authors: + - orcid: diff --git a/src/index.html b/src/index.html index dde2b797b3..4a182b8da4 100644 --- a/src/index.html +++ b/src/index.html @@ -11,7 +11,7 @@ diff --git a/src/main.ts b/src/main.ts index 8a5aa7abe3..5639fd2418 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,13 +1,178 @@ -import { enableProdMode } from '@angular/core'; -import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; +import { ClipboardModule } from '@angular/cdk/clipboard'; +import { HTTP_INTERCEPTORS, HttpClient, provideHttpClient, withInterceptorsFromDi } from '@angular/common/http'; +import { APP_INITIALIZER, enableProdMode, importProvidersFrom } from '@angular/core'; +import { FormsModule, ReactiveFormsModule } from '@angular/forms'; +import { MatLegacyDialogModule } from '@angular/material/legacy-dialog'; +import { + MAT_LEGACY_SNACK_BAR_DEFAULT_OPTIONS as MAT_SNACK_BAR_DEFAULT_OPTIONS, + MatLegacySnackBarModule, +} from '@angular/material/legacy-snack-bar'; +import { MAT_LEGACY_TOOLTIP_DEFAULT_OPTIONS as MAT_TOOLTIP_DEFAULT_OPTIONS } from '@angular/material/legacy-tooltip'; +import { bootstrapApplication, BrowserModule, Title } from '@angular/platform-browser'; +import { provideAnimations } from '@angular/platform-browser/animations'; import { enableAkitaProdMode } from '@datorama/akita'; +import { AkitaNgDevtools } from '@datorama/akita-ngdevtools'; +import { FontAwesomeModule } from '@fortawesome/angular-fontawesome'; +import { FlexLayoutModule } from '@ngbracket/ngx-layout'; +import { MarkdownModule } from 'ngx-markdown'; +import { NgxMatSelectSearchModule } from 'ngx-mat-select-search'; +import { AppComponent } from './app/app.component'; -import { AppModule } from './app/app.module'; +import { getApiConfig, initializerFactory, myCustomSnackbarDefaults, myCustomTooltipDefaults } from './app/app.module'; +import { CLIENT_ROUTER_PROVIDERS, routing } from './app/app.routing'; +import { ConfigurationService } from './app/configuration.service'; +import { EmailService } from './app/container/email.service'; +import { InfoTabService as ContainerInfoTabService } from './app/container/info-tab/info-tab.service'; +import { ToolLaunchService } from './app/container/launch/tool-launch.service'; +import { ParamfilesService } from './app/container/paramfiles/paramfiles.service'; +import { RegisterToolService } from './app/container/register-tool/register-tool.service'; +import { VersionModalService as ContainerVersionModalService } from './app/container/version-modal/version-modal.service'; +import { ListContainersService } from './app/containers/list/list.service'; +import { EntryTypeMetadataService } from './app/entry/type-metadata/entry-type-metadata.service'; +import { CustomHeaderInterceptor } from './app/interceptors/custom-header.interceptor'; +import { WorkflowVersionsInterceptor } from './app/interceptors/workflow-versions.interceptor'; +import { LoginService } from './app/login/login.service'; +import { AccountsService } from './app/loginComponents/accounts/external/accounts.service'; +import { MytoolsService } from './app/mytools/mytools.service'; +import { MyWorkflowsService } from './app/myworkflows/myworkflows.service'; +import { Ng2UiAuthModule } from './app/ng2-ui-auth/public_api'; +import { OrganizationStargazersModule } from './app/organizations/organization/organization-stargazers/organization-stargazers.module'; +import { OrganizationStarringModule } from './app/organizations/organization/organization-starring/organization-starring.module'; +import { RegisterService } from './app/register/register.service'; +import { QueryBuilderService } from './app/search/query-builder.service'; +import { SearchAuthorsHtmlPipe } from './app/search/search-authors-html.pipe'; +import { SearchService } from './app/search/state/search.service'; +import { ServiceInfoService } from './app/service-info/service-info.service'; +import { AuthConfig } from './app/shared/auth.model'; +import { BioschemaService } from './app/shared/bioschema.service'; +import { ContainerService } from './app/shared/container.service'; +import { DateService } from './app/shared/date.service'; +import { EntryActionsService } from './app/shared/entry-actions/entry-actions.service'; +import { DescriptorLanguageService } from './app/shared/entry/descriptor-language.service'; +import { RegisterCheckerWorkflowService } from './app/shared/entry/register-checker-workflow/register-checker-workflow.service'; +import { ExtendedToolsService } from './app/shared/extended-tools.service'; +import { ExtendedWorkflowsService } from './app/shared/extended-workflows.service'; +import { ImageProviderService } from './app/shared/image-provider.service'; +import { ListService } from './app/shared/list.service'; +import { LogoutService } from './app/shared/logout.service'; +import { ApiModule, ApiModule as ApiModule2 } from './app/shared/openapi/api.module'; +import { GA4GHV20Service } from './app/shared/openapi/api/gA4GHV20.service'; +import { OrgLogoService } from './app/shared/org-logo.service'; +import { PagenumberService } from './app/shared/pagenumber.service'; +import { PipeModule } from './app/shared/pipe/pipe.module'; +import { ProviderService } from './app/shared/provider.service'; +import { RefreshService } from './app/shared/refresh.service'; +import { MyEntriesQuery } from './app/shared/state/my-entries.query'; +import { MyEntriesStateService } from './app/shared/state/my-entries.service'; +import { MyEntriesStore } from './app/shared/state/my-entries.store'; +import { TrackLoginService } from './app/shared/track-login.service'; +import { UrlResolverService } from './app/shared/url-resolver.service'; +import { VerifiedByService } from './app/shared/verified-by.service'; +import { StargazersModule } from './app/stargazers/stargazers.module'; +import { StarringModule } from './app/starring/starring.module'; +import { TosBannerService } from './app/tosBanner/state/tos-banner.service'; +import { InfoTabService } from './app/workflow/info-tab/info-tab.service'; +import { WorkflowLaunchService } from './app/workflow/launch/workflow-launch.service'; +import { RegisterWorkflowModalService } from './app/workflow/register-workflow-modal/register-workflow-modal.service'; +import { VersionModalService } from './app/workflow/version-modal/version-modal.service'; +import { ViewService } from './app/workflow/view/view.service'; import { environment } from './environments/environment'; +import { EditTopicDialogService } from 'app/shared/entry/info-tab-topic/edit-topic/edit-topic-dialog.service'; +import { ManageDoisDialogService } from 'app/shared/entry/doi/manage-dois/manage-dois-dialog.service'; if (environment.production) { enableProdMode(); enableAkitaProdMode(); } -platformBrowserDynamic().bootstrapModule(AppModule); +bootstrapApplication(AppComponent, { + providers: [ + importProvidersFrom( + environment.production ? [] : AkitaNgDevtools.forRoot(), + FontAwesomeModule, + BrowserModule, + FormsModule, + MatLegacyDialogModule, + MatLegacySnackBarModule, + ClipboardModule, + FlexLayoutModule, + StarringModule, + OrganizationStarringModule, + OrganizationStargazersModule, + NgxMatSelectSearchModule, + routing, + StargazersModule, + MarkdownModule.forRoot(), + ReactiveFormsModule, + ApiModule.forRoot(getApiConfig), + ApiModule2.forRoot(getApiConfig), + PipeModule, + Ng2UiAuthModule.forRoot(AuthConfig) + ), + AccountsService, + BioschemaService, + CLIENT_ROUTER_PROVIDERS, + ConfigurationService, + ContainerInfoTabService, + ContainerService, + ContainerVersionModalService, + DateService, + DescriptorLanguageService, + EditTopicDialogService, + EmailService, + EntryActionsService, + EntryTypeMetadataService, + ExtendedToolsService, + ExtendedWorkflowsService, + GA4GHV20Service, + HttpClient, + ImageProviderService, + InfoTabService, + InfoTabService, + ListContainersService, + ListService, + LoginService, + LogoutService, + ManageDoisDialogService, + MyEntriesQuery, + MyEntriesStateService, + MyEntriesStore, + MyWorkflowsService, + MytoolsService, + OrgLogoService, + PagenumberService, + ParamfilesService, + ProviderService, + QueryBuilderService, + RefreshService, + RegisterCheckerWorkflowService, + RegisterService, + RegisterToolService, + RegisterWorkflowModalService, + SearchAuthorsHtmlPipe, + SearchService, + ServiceInfoService, + Title, + ToolLaunchService, + TosBannerService, + TrackLoginService, + UrlResolverService, + VerifiedByService, + VersionModalService, + ViewService, + WorkflowLaunchService, + { + provide: APP_INITIALIZER, + useFactory: initializerFactory, + deps: [ConfigurationService, EntryTypeMetadataService], + multi: true, + }, + { provide: MAT_TOOLTIP_DEFAULT_OPTIONS, useValue: myCustomTooltipDefaults }, + { provide: MAT_SNACK_BAR_DEFAULT_OPTIONS, useValue: myCustomSnackbarDefaults }, + { provide: HTTP_INTERCEPTORS, useClass: WorkflowVersionsInterceptor, multi: true }, + { provide: HTTP_INTERCEPTORS, useClass: CustomHeaderInterceptor, multi: true }, + { provide: Window, useValue: window }, + provideAnimations(), + provideHttpClient(withInterceptorsFromDi()), + ], +}); diff --git a/src/material.scss b/src/material.scss index eeaee3591f..03cfbef679 100644 --- a/src/material.scss +++ b/src/material.scss @@ -20,9 +20,18 @@ // Include the common styles for Angular Material. We include this here so that you only // have to load a single css file for Angular Material in your app. // Be sure that you only ever include this mixin once! -@include mat.core(); +// As of v15 mat.legacy-core no longer includes default typography styles. +// The following line adds: +// 1. Default typography styles for all components +// 2. Styles for typography hierarchy classes (e.g. .mat-headline-1) +// If you specify typography styles for the components you use elsewhere, you should delete this line. +// If you don't need the default component typographies but still want the hierarchy styles, +// you can delete this line and instead use: +// `@include mat.legacy-typography-hierarchy(mat.define-legacy-typography-config());` +@include mat.all-legacy-component-typographies(); +@include mat.legacy-core(); // Include theme styles for core and each component used in your app. // Alternatively, you can import and @include the theme mixins for each component // that you are using. -@include mat.all-component-themes($dockstore-app-theme); +@include mat.all-legacy-component-themes($dockstore-app-theme); diff --git a/src/styles.scss b/src/styles.scss index 2267a5e820..b33eb0b5e4 100644 --- a/src/styles.scss +++ b/src/styles.scss @@ -1420,3 +1420,23 @@ div.mat-menu-panel { align-items: center; justify-content: space-between; } + +app-ai-bubble { + margin: 0 0.5rem; +} + +.ai-bubble:hover { + background-color: mat.get-color-from-palette($dockstore-app-gray, 7); +} + +.primary-3 { + color: mat.get-color-from-palette($dockstore-app-primary, 3); +} + +.gray-caption { + color: mat.get-color-from-palette($kim-gray, 2); +} + +.mr-2_5 { + margin-right: 0.75rem; +} diff --git a/src/test.ts b/src/test.ts index d77de9c296..c15fcefff3 100644 --- a/src/test.ts +++ b/src/test.ts @@ -6,7 +6,6 @@ import { getTestBed } from '@angular/core/testing'; import { BrowserDynamicTestingModule, platformBrowserDynamicTesting } from '@angular/platform-browser-dynamic/testing'; // Unfortunately there's no typing for the `__karma__` variable. Just declare it as any. declare var __karma__: any; -declare var require: any; // Prevent Karma from running prematurely. __karma__.loaded = function () {}; @@ -15,9 +14,5 @@ __karma__.loaded = function () {}; getTestBed().initTestEnvironment(BrowserDynamicTestingModule, platformBrowserDynamicTesting(), { teardown: { destroyAfterEach: false }, }); -// Then we find all the tests. -const context = require.context('./', true, /\.spec\.ts$/); -// And load the modules. -context.keys().map(context); // Finally, start Karma to run the tests. __karma__.start(); diff --git a/src/tsconfig.spec.json b/src/tsconfig.spec.json index 2cea88361a..c7bf5a2549 100644 --- a/src/tsconfig.spec.json +++ b/src/tsconfig.spec.json @@ -5,6 +5,5 @@ "baseUrl": "./", "types": ["jasmine", "node"] }, - "files": ["test.ts", "polyfills.ts"], "include": ["**/*.spec.ts", "**/*.d.ts"] } diff --git a/test/github_app_tool_db_dump.sql b/test/github_app_tool_db_dump.sql index 6f01320b09..4d374496ad 100644 --- a/test/github_app_tool_db_dump.sql +++ b/test/github_app_tool_db_dump.sql @@ -1,4 +1,4 @@ -INSERT INTO public.sourcefile (id, content, type, path, dbcreatedate, dbupdatedate, absolutepath, frozen) VALUES (50, '#!/usr/bin/env cwl-runner +INSERT INTO public.sourcefile (id, content, type, state, path, dbcreatedate, dbupdatedate, absolutepath, frozen) VALUES (50, '#!/usr/bin/env cwl-runner class: Workflow id: Md5sum @@ -43,9 +43,9 @@ outputs: glob: md5sum.txt doc: A text file that contains a single line that is the md5sum of the input file. baseCommand: [/bin/my_md5sum] -', 'DOCKSTORE_CWL', '/tools/Dockstore.cwl', '2022-01-14 10:04:44.460000', '2022-01-14 10:04:44.460000', '/tools/Dockstore.cwl', false); +', 'DOCKSTORE_CWL', 'COMPLETE', '/tools/Dockstore.cwl', '2022-01-14 10:04:44.460000', '2022-01-14 10:04:44.460000', '/tools/Dockstore.cwl', false); -INSERT INTO public.sourcefile (id, content, type, path, dbcreatedate, dbupdatedate, absolutepath, frozen) VALUES (51, 'version: 1.2 +INSERT INTO public.sourcefile (id, content, type, state, path, dbcreatedate, dbupdatedate, absolutepath, frozen) VALUES (51, 'version: 1.2 tools: - subclass: cwl primaryDescriptorPath: /tools/Dockstore.cwl @@ -53,10 +53,10 @@ tools: workflows: - subclass: cwl primaryDescriptorPath: /workflows/HelloWorld.cwl -', 'DOCKSTORE_YML', '/.dockstore.yml', '2022-01-14 10:04:44.458000', '2022-01-14 10:04:44.458000', '/.dockstore.yml', false); +', 'DOCKSTORE_YML', 'COMPLETE', '/.dockstore.yml', '2022-01-14 10:04:44.458000', '2022-01-14 10:04:44.458000', '/.dockstore.yml', false); -INSERT INTO public.sourcefile (id, content, type, path, dbcreatedate, dbupdatedate, absolutepath, frozen) VALUES (54, '#!/usr/bin/env cwl-runner +INSERT INTO public.sourcefile (id, content, type, state, path, dbcreatedate, dbupdatedate, absolutepath, frozen) VALUES (54, '#!/usr/bin/env cwl-runner class: CommandLineTool id: Md5sum @@ -101,9 +101,9 @@ outputs: glob: md5sum.txt doc: A text file that contains a single line that is the md5sum of the input file. baseCommand: [/bin/my_md5sum] -', 'DOCKSTORE_CWL', '/tools/Dockstore.cwl', '2022-01-14 09:13:37.403000', '2022-01-14 09:13:37.403000', '/tools/Dockstore.cwl', false); +', 'DOCKSTORE_CWL', 'COMPLETE', '/tools/Dockstore.cwl', '2022-01-14 09:13:37.403000', '2022-01-14 09:13:37.403000', '/tools/Dockstore.cwl', false); -INSERT INTO public.sourcefile (id, content, type, path, dbcreatedate, dbupdatedate, absolutepath, frozen) VALUES (55, 'version: 1.2 +INSERT INTO public.sourcefile (id, content, type, state, path, dbcreatedate, dbupdatedate, absolutepath, frozen) VALUES (55, 'version: 1.2 tools: - subclass: cwl primaryDescriptorPath: /tools/Dockstore.cwl @@ -111,9 +111,9 @@ tools: workflows: - subclass: cwl primaryDescriptorPath: /workflows/HelloWorld.cwl -', 'DOCKSTORE_YML', '/.dockstore.yml', '2022-01-14 10:04:44.458000', '2022-01-14 10:04:44.458000', '/.dockstore.yml', false); +', 'DOCKSTORE_YML', 'COMPLETE', '/.dockstore.yml', '2022-01-14 10:04:44.458000', '2022-01-14 10:04:44.458000', '/.dockstore.yml', false); -INSERT INTO public.sourcefile (id, content, type, path, dbcreatedate, dbupdatedate, absolutepath, frozen) VALUES (56, '#!/usr/bin/env cwl-runner +INSERT INTO public.sourcefile (id, content, type, state, path, dbcreatedate, dbupdatedate, absolutepath, frozen) VALUES (56, '#!/usr/bin/env cwl-runner class: CommandLineTool id: Md5sum @@ -158,9 +158,9 @@ outputs: glob: md5sum.txt doc: A text file that contains a single line that is the md5sum of the input file. baseCommand: [/bin/my_md5sum] -', 'DOCKSTORE_CWL', '/tools/Dockstore.cwl', '2022-01-14 09:13:37.403000', '2022-01-14 09:13:37.403000', '/tools/Dockstore.cwl', false); +', 'DOCKSTORE_CWL', 'COMPLETE', '/tools/Dockstore.cwl', '2022-01-14 09:13:37.403000', '2022-01-14 09:13:37.403000', '/tools/Dockstore.cwl', false); -INSERT INTO public.sourcefile (id, content, type, path, dbcreatedate, dbupdatedate, absolutepath, frozen) VALUES (57, 'version: 1.2 +INSERT INTO public.sourcefile (id, content, type, state, path, dbcreatedate, dbupdatedate, absolutepath, frozen) VALUES (57, 'version: 1.2 tools: - subclass: cwl primaryDescriptorPath: /tools/Dockstore.cwl @@ -168,7 +168,7 @@ tools: workflows: - subclass: cwl primaryDescriptorPath: /workflows/HelloWorld.cwl -', 'DOCKSTORE_YML', '/.dockstore.yml', '2022-01-14 10:04:44.458000', '2022-01-14 10:04:44.458000', '/.dockstore.yml', false); +', 'DOCKSTORE_YML', 'COMPLETE', '/.dockstore.yml', '2022-01-14 10:04:44.458000', '2022-01-14 10:04:44.458000', '/.dockstore.yml', false); INSERT INTO public.apptool (id, conceptdoi, dbcreatedate, dbupdatedate, description, giturl, ispublished, lastmodified, lastupdated, licensename, topicid, checkerid, descriptortype, descriptortypesubclass, forumurl, mode, organization, repository, sourcecontrol, workflowname, actualdefaultversion, topicautomatic, topicmanual, topicselection, waseverpublic) VALUES (50, null, '2022-01-12 14:51:23.656000', '2022-01-12 14:51:23.689000', null, 'git@github.com:C/github-app-tools.git', true, '2022-01-12 14:48:20.000000', '2022-01-12 14:51:22.707000', null, null, null, 'cwl', 'n/a', null, 'DOCKSTORE_YML', 'C', 'test-github-app-tools', 'github.com', 'testing', null, null, null, 'AUTOMATIC', true); INSERT INTO public.apptool (id, conceptdoi, dbcreatedate, dbupdatedate, description, giturl, ispublished, lastmodified, lastupdated, licensename, topicid, checkerid, descriptortype, descriptortypesubclass, forumurl, mode, organization, repository, sourcecontrol, workflowname, actualdefaultversion, topicautomatic, topicmanual, topicselection, waseverpublic) VALUES (51, null, '2022-01-12 14:45:55.370000', '2022-01-14 10:05:15.491000', 'test description...', 'git@github.com:C/github-app-tools.git', false, '2022-01-14 09:13:50.000000', '2022-01-12 14:45:54.113000', null, null, null, 'cwl', 'n/a', null, 'DOCKSTORE_YML', 'C', 'test-github-app-tools', 'github.com', 'md5sum', null, null, null, 'AUTOMATIC', true); diff --git a/test/github_notebook_db_dump.sql b/test/github_notebook_db_dump.sql index 67629afaf7..c58c984819 100644 --- a/test/github_notebook_db_dump.sql +++ b/test/github_notebook_db_dump.sql @@ -39,9 +39,9 @@ COPY public.notebook (id, conceptdoi, dbcreatedate, dbupdatedate, description, g -- Data for Name: sourcefile; Type: TABLE DATA; Schema: public; Owner: dockstore -- -COPY public.sourcefile (id, content, path, type, dbcreatedate, dbupdatedate, absolutepath, frozen) FROM stdin; -1000 version: 1.2\nnotebooks:\n - path: /notebook.ipynb\n publish: true\n /.dockstore.yml DOCKSTORE_YML 2023-03-16 16:38:14.982 2023-03-16 16:38:14.982 /.dockstore.yml f -1001 {\n "nbformat": 4,\n "nbformat_minor": 0,\n "metadata": {\n "colab": {\n "provenance": [],\n "authorship_tag": "ABX9TyOvihAxHYcHRNfCqilp5Zgg",\n "include_colab_link": true\n },\n "kernelspec": {\n "name": "python3",\n "display_name": "Python 3"\n },\n "language_info": {\n "name": "python"\n },\n "authors": [\n { "name": "Author Two" },\n { "name": "Author One" }\n ]\n },\n "cells": [\n {\n "cell_type": "markdown",\n "source": [\n "A simple notebook."\n ],\n "metadata": {\n "id": "PSOLAGuMMaYg"\n }\n },\n {\n "cell_type": "code",\n "execution_count": null,\n "metadata": {\n "colab": {\n "base_uri": "https://localhost:8080/"\n },\n "id": "z9GVmXMWFnWV",\n "outputId": "f33dda6a-d0fd-40ee-de84-e726fafab5b9"\n },\n "outputs": [\n {\n "output_type": "stream",\n "name": "stdout",\n "text": [\n "Hello world!\\n"\n ]\n }\n ],\n "source": [\n "print(\\"Hello world!\\")"\n ]\n }\n ]\n}\n /notebook.ipynb DOCKSTORE_JUPYTER 2023-03-16 16:38:14.982 2023-03-16 16:38:14.982 /notebook.ipynb f +COPY public.sourcefile (id, content, path, type, state, dbcreatedate, dbupdatedate, absolutepath, frozen) FROM stdin; +1000 version: 1.2\nnotebooks:\n - path: /notebook.ipynb\n publish: true\n /.dockstore.yml DOCKSTORE_YML COMPLETE 2023-03-16 16:38:14.982 2023-03-16 16:38:14.982 /.dockstore.yml f +1001 {\n "nbformat": 4,\n "nbformat_minor": 0,\n "metadata": {\n "colab": {\n "provenance": [],\n "authorship_tag": "ABX9TyOvihAxHYcHRNfCqilp5Zgg",\n "include_colab_link": true\n },\n "kernelspec": {\n "name": "python3",\n "display_name": "Python 3"\n },\n "language_info": {\n "name": "python"\n },\n "authors": [\n { "name": "Author Two" },\n { "name": "Author One" }\n ]\n },\n "cells": [\n {\n "cell_type": "markdown",\n "source": [\n "A simple notebook."\n ],\n "metadata": {\n "id": "PSOLAGuMMaYg"\n }\n },\n {\n "cell_type": "code",\n "execution_count": null,\n "metadata": {\n "colab": {\n "base_uri": "https://localhost:8080/"\n },\n "id": "z9GVmXMWFnWV",\n "outputId": "f33dda6a-d0fd-40ee-de84-e726fafab5b9"\n },\n "outputs": [\n {\n "output_type": "stream",\n "name": "stdout",\n "text": [\n "Hello world!\\n"\n ]\n }\n ],\n "source": [\n "print(\\"Hello world!\\")"\n ]\n }\n ]\n}\n /notebook.ipynb DOCKSTORE_JUPYTER COMPLETE 2023-03-16 16:38:14.982 2023-03-16 16:38:14.982 /notebook.ipynb f \. -- diff --git a/test/web.yml b/test/web.yml index 4d1890aeb4..efca30755e 100644 --- a/test/web.yml +++ b/test/web.yml @@ -113,3 +113,5 @@ uiConfig: featuredContentUrl: https://content.dockstore.org/develop/feat-content.html featuredNewsUrl: https://content.dockstore.org/develop/news.html + + documentationUrl: https://docs.dockstore.org/en/latest diff --git a/tsconfig.json b/tsconfig.json index 4f2c17478f..eb2648585d 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -7,9 +7,10 @@ "sourceMap": true, "declaration": false, "moduleResolution": "node", + "noUnusedLocals": true, "emitDecoratorMetadata": true, "experimentalDecorators": true, - "target": "es2020", + "target": "ES2020", "typeRoots": [ "node_modules/@types" ], @@ -22,7 +23,8 @@ "jszip": [ "../node_modules/jszip/dist/jszip.min.js" ] - } + }, + "useDefineForClassFields": false }, "angularCompilerOptions": { "skipTemplateCodegen": false,