From 9f8f256186169a839d28b34d2c559dc1f9e8e9ef Mon Sep 17 00:00:00 2001 From: shyallegro <52773084+shyallegro@users.noreply.github.com> Date: Tue, 7 Jun 2022 17:48:29 +0300 Subject: [PATCH] Release v1.5 (#27) --- package-lock.json | 4475 ++++++++++++----- package.json | 6 +- .../api-services/auth.service.ts | 80 +- .../auth/authCreateCredentialsRequest.ts | 20 + .../auth/authCreateCredentialsResponse.ts | 2 +- .../model/auth/authCreateUserRequest.ts | 2 +- .../model/auth/authCreateUserResponse.ts | 2 +- .../model/auth/authEditCredentialsRequest.ts | 24 + .../model/auth/authEditCredentialsResponse.ts | 20 + .../model/auth/authEditUserRequest.ts | 2 +- .../model/auth/authEditUserResponse.ts | 2 +- .../model/auth/authFixedUsersModeResponse.ts | 2 +- .../model/auth/authGetCredentialsResponse.ts | 2 +- .../model/auth/authGetTokenForUserRequest.ts | 2 +- .../model/auth/authGetTokenForUserResponse.ts | 2 +- .../model/auth/authLoginRequest.ts | 2 +- .../model/auth/authLoginResponse.ts | 2 +- .../auth/authRevokeCredentialsRequest.ts | 2 +- .../auth/authRevokeCredentialsResponse.ts | 2 +- .../model/auth/authValidateTokenRequest.ts | 2 +- .../model/auth/authValidateTokenResponse.ts | 2 +- .../model/auth/credentialKey.ts | 19 +- .../business-logic/model/auth/credentials.ts | 6 +- src/app/business-logic/model/auth/models.ts | 1 + src/app/business-logic/model/auth/role.ts | 2 +- src/app/core/effects/projects.effects.ts | 26 +- src/app/core/reducers/users.reducer.ts | 2 + .../dashboard-search.component.html | 5 +- .../dashboard-search.component.ts | 11 +- .../dashboard-search.module.ts | 19 +- .../features/dashboard/dashboard.module.ts | 13 +- .../search-results-page.component.html | 51 +- .../search-results-page.component.ts | 34 +- .../experiment-info-navbar.component.html | 58 + .../experiment-info-navbar.component.scss | 32 + .../experiment-info-navbar.component.ts | 38 + .../experiment-info.component.html | 41 - .../experiment-info.component.scss | 38 - .../experiment-info.component.ts | 131 - .../experiment-menu-extended.component.ts | 3 +- .../experiment-output.component.html | 64 +- .../experiments/experiments-routing.module.ts | 1 - .../experiments/experiments.module.ts | 4 +- .../features/projects/projects-page.utils.ts | 16 +- .../projects/shared/projects-shared.module.ts | 12 +- .../create-credential-dialog.component.html | 6 +- .../create-credential-dialog.component.ts | 6 +- .../user-credentials.component.html | 8 +- .../user-credentials.component.scss | 4 +- .../user-credentials.component.ts | 10 +- .../layout/breadcrumbs/breadcrumbs.utils.ts | 14 +- .../assets/fonts/trains-icons.scss | 6 +- src/app/webapp-common/assets/fonts/trains.ttf | Bin 57704 -> 57620 bytes .../webapp-common/assets/fonts/variables.scss | 2 +- src/app/webapp-common/common-styles.scss | 7 +- .../core/actions/common-auth.actions.ts | 14 + .../core/actions/layout.actions.ts | 4 + .../core/actions/projects.actions.ts | 24 +- .../core/effects/common-auth.effects.ts | 17 +- .../core/effects/projects.effects.ts | 118 +- .../core/reducers/common-auth-reducer.ts | 23 +- .../core/reducers/projects.reducer.ts | 21 +- .../core/reducers/view.reducer.ts | 6 +- .../dashboard-search.actions.ts | 16 +- .../dashboard-search.consts.ts | 1 + .../dashboard-search.effects.ts | 38 +- .../dashboard-search.reducer.ts | 31 +- .../experiments-search-results.component.html | 7 - .../experiments-search-results.component.scss | 0 .../experiments-search-results.component.ts | 18 - .../models-search-results.component.html | 7 - .../models-search-results.component.scss | 0 .../models-search-results.component.ts | 17 - .../projects-search-results.component.html | 8 - .../projects-search-results.component.scss | 0 .../projects-search-results.component.ts | 17 - .../search-results.component.html | 7 + .../search-results.component.scss | 15 + .../search-results.component.ts | 54 + .../dashboard/common-dashboard.effects.ts | 3 +- .../dashboard-search.component.base.ts | 20 +- .../recent-experiment-table.component.html | 2 +- .../debug-image-snippet.component.html | 2 +- .../debug-image-snippet.component.scss | 27 +- .../debug-image-snippet.component.ts | 2 +- .../debug-images-view.component.html | 6 +- .../debug-images-view.component.scss | 8 +- .../debug-images-view.component.ts | 14 +- .../debug-images/debug-images.component.html | 4 +- .../debug-images/debug-images.component.ts | 20 +- .../experiment-compare-base.component.scss | 22 +- .../containers/experiment-compare-base.ts | 8 +- .../experiment-compare-details.component.html | 16 +- ...iment-compare-scalar-charts.component.scss | 2 +- ...eriment-compare-scalar-charts.component.ts | 5 +- ...iment-compare-metric-values.component.html | 21 +- ...iment-compare-metric-values.component.scss | 39 +- ...eriment-compare-metric-values.component.ts | 8 + .../experiment-compare-params.component.html | 8 +- .../experiment-compare-params.component.scss | 2 + .../experiment-compare-plots.component.ts | 4 +- ...elect-experiments-for-compare.component.ts | 6 +- .../experiment-compare-header.component.scss | 8 + .../experiment-compare-header.component.ts | 2 +- .../parallel-coordinates-graph.component.ts | 8 +- ...-experiment-for-compare-effects.service.ts | 17 +- .../experiments-compare.constants.ts | 14 +- .../experiment-details-reverter.service.ts | 46 +- .../common-experiments-view.actions.ts | 11 +- .../experiments/common-experiments.module.ts | 4 +- .../base-experiment-output.component.scss | 58 +- .../base-experiment-output.component.ts | 34 +- .../experiment-output-plots.component.ts | 19 +- .../experiment-output-scalars.component.html | 2 +- .../experiment-output-scalars.component.scss | 2 +- .../experiment-output-scalars.component.ts | 5 +- ...iment-execution-source-code.component.html | 9 +- .../experiment-general-info.component.html | 5 + .../experiment-info-header.component.html | 171 +- .../experiment-info-header.component.scss | 31 +- .../experiment-info-header.component.ts | 8 +- .../experiment-table-card.component.html | 25 - .../experiment-table-card.component.scss | 12 - .../experiment-table-card.component.ts | 29 - .../experiment-type-icon-label.component.ts | 8 +- .../experiments-table.component.html | 10 +- .../experiments-table.component.scss | 6 +- .../common-experiments-menu.effects.ts | 32 +- .../common-experiments-view.effects.ts | 222 +- .../experiments/experiment-routes.ts | 4 +- .../experiments/experiment.consts.ts | 5 +- .../experiments/experiments.component.ts | 14 +- .../common-experiments-view.reducer.ts | 6 +- .../experiments/reducers/index.ts | 1 - .../shared/common-experiment-shared.module.ts | 14 +- .../shared/common-experiments.utils.ts | 2 +- .../clone-dialog/clone-dialog.component.scss | 1 + .../experiment-menu.component.html | 2 +- .../experiment-menu.component.ts | 17 +- ...xperiment-status-icon-label.component.html | 9 +- ...xperiment-status-icon-label.component.scss | 12 +- .../experiment-status-icon-label.component.ts | 32 +- .../select-queue/select-queue.component.html | 42 +- .../select-queue/select-queue.component.ts | 16 +- .../breadcrumbs/breadcrumbs.component.ts | 11 +- .../layout/header/header.component.html | 2 +- .../layout/header/header.component.ts | 11 +- src/app/webapp-common/layout/layout.scss | 2 +- .../welcome-message.component.html | 10 +- .../welcome-message.component.scss | 4 - .../welcome-message.component.ts | 6 + .../models/actions/models-menu.actions.ts | 2 +- .../models/actions/models-view.actions.ts | 11 +- .../model-info/model-info.component.html | 34 +- .../model-info/model-info.component.scss | 9 +- .../model-menu/model-menu.component.html | 2 +- .../model-menu/model-menu.component.scss | 5 +- .../model-menu/model-menu.component.ts | 4 +- .../model-info-header.component.html | 64 +- .../model-info-header.component.scss | 67 +- .../model-info-header.component.ts | 18 +- .../models/effects/models-menu.effects.ts | 16 +- .../models/effects/models-view.effects.ts | 97 +- .../webapp-common/models/models.component.ts | 10 +- .../webapp-common/models/reducers/index.ts | 1 - .../models/reducers/models-view.reducer.ts | 4 - .../models-table/models-table.component.scss | 2 +- .../models-table/models-table.component.ts | 6 +- .../pipeline-controller-info.component.html | 22 +- .../pipeline-controller-info.component.scss | 31 +- .../pipeline-card-menu.component.html | 4 + .../pipeline-card-menu.component.ts | 1 + .../pipeline-card.component.html | 12 +- .../pipeline-card/pipeline-card.component.ts | 1 + .../pipelines-page.component.html | 54 +- .../pipelines-page.component.scss | 74 +- .../pipelines-page.component.ts | 49 +- .../pipelines/pipelines.module.ts | 42 +- .../projects/common-projects.actions.ts | 1 + .../projects/common-projects.effects.ts | 21 +- .../projects/common-projects.reducer.ts | 12 +- .../common-projects-page.component.html | 13 +- .../common-projects-page.component.ts | 47 +- .../projects-header.component.html | 5 +- .../projects-header.component.ts | 4 +- .../select-model/select-model.actions.ts | 4 +- .../select-model/select-model.component.ts | 18 +- .../select-model/select-model.reducer.ts | 9 +- .../admin/admin-credential-table.base.ts | 37 +- .../admin-credential-table.component.html | 7 +- .../admin-credential-table.component.scss | 31 +- .../admin-credential-table.component.ts | 2 +- .../admin-dialog-template.component.html | 45 +- .../admin-dialog-template.component.scss | 35 +- .../admin-dialog-template.component.ts | 24 +- .../charts/donut/donut.component.scss | 15 +- .../charts/donut/donut.component.ts | 36 +- .../experiment-settings.html | 6 +- .../scroll-textarea.component.scss | 1 + .../show-only-user-work.component.html | 5 +- .../show-only-user-work.component.ts | 12 +- .../shared/entity-page/base-entity-page.ts | 12 +- .../base-delete-dialog.effects.ts | 2 +- .../common-delete-dialog.component.ts | 10 +- .../experiment-graphs.component.html | 7 +- .../experiment-graphs.component.ts | 16 +- .../experiment-graphs.module.ts | 6 +- .../graph-plot-data-to-metric.pipe.ts | 2 +- .../single-graph/plotly-graph-base.ts | 23 +- .../single-graph/single-graph.component.html | 1 + .../single-graph/single-graph.component.scss | 74 +- .../single-graph/single-graph.component.ts | 146 +- ...fo-header-status-icon-label.component.html | 30 +- ...fo-header-status-icon-label.component.scss | 130 +- ...info-header-status-icon-label.component.ts | 6 +- ...-header-status-progress-bar.component.html | 3 - .../shared/pipes/test-conditional.pipe.ts | 25 +- .../project-dialog.component.ts | 2 +- .../project-move-to-form.component.html | 3 +- .../project-move-to-form.component.ts | 24 +- .../loading-button.component.scss | 1 - .../labeled-row/labeled-row.component.scss | 3 + .../data/table-card/table-card.component.scss | 6 +- .../data/table-diff/table-diff.component.html | 39 +- .../data/table-diff/table-diff.component.scss | 8 + .../data/table-diff/table-diff.component.ts | 12 +- .../data/table/base-table-view.ts | 7 +- .../table-filter-sort-template.component.scss | 3 +- .../data/table/table.component.html | 6 +- .../data/table/table.component.scss | 58 +- .../data/table/table.component.ts | 10 +- .../directives/overflows.directive.ts | 29 +- .../copy-clipboard.component.scss | 6 +- .../button-toggle.component.html | 5 +- .../button-toggle.component.scss | 13 +- .../confirm-dialog.component.html | 5 +- .../confirm-dialog.component.scss | 1 + .../confirm-dialog.component.ts | 10 +- .../confirm-dialog/confirm-dialog.model.ts | 3 + ...dit-credential-label-dialog.component.html | 8 + ...dit-credential-label-dialog.component.scss | 10 + .../edit-credential-label-dialog.component.ts | 34 + .../panel/drawer/drawer.component.scss | 14 +- .../editable-section.component.html | 5 +- .../editable-section.component.scss | 6 +- .../panel/menu-item/menu-item.component.html | 4 +- .../panel/menu-item/menu-item.component.scss | 26 +- .../panel/menu-item/menu-item.component.ts | 3 +- .../navbar-item/navbar-item.component.html | 2 +- .../navbar-item/navbar-item.component.scss | 2 +- .../navbar-item/navbar-item.component.ts | 1 + .../project-card-menu.component.html | 4 - .../styles/bootstrap-settings.scss | 7 +- .../shared/ui-components/styles/icons.scss | 9 + .../styles/mixins/button-toggle-group.scss | 5 - .../styles/mixins/navbar-item.scss | 15 +- .../tags/tag-list/tag-list.component.html | 5 +- .../tags/tag-list/tag-list.component.scss | 4 +- .../tags/tag-list/tag-list.component.ts | 9 +- .../tags/user-tag/user-tag.component.scss | 4 + .../ui-components/ui-components.module.ts | 4 +- .../shared/utils/shared-utils.ts | 26 +- src/app/webapp-common/tasks/tasks.utils.ts | 89 +- .../actions/queues.actions.ts | 5 +- .../dumb/queue-info/queue-info.component.html | 9 +- .../queues-table/queues-table.component.ts | 7 + .../effects/queues.effects.ts | 42 +- .../effects/workers.effects.ts | 25 +- .../workers-and-queues.consts.ts | 3 +- .../workers-and-queues.utils.ts | 15 + src/assets/version.json | 2 +- src/environments/base.ts | 1 + src/environments/environment.demo.ts | 10 - src/environments/environment.dev.ts | 8 - src/index.html | 3 +- src/version.json | 4 +- 276 files changed, 5943 insertions(+), 3344 deletions(-) create mode 100644 src/app/business-logic/model/auth/authCreateCredentialsRequest.ts create mode 100644 src/app/business-logic/model/auth/authEditCredentialsRequest.ts create mode 100644 src/app/business-logic/model/auth/authEditCredentialsResponse.ts create mode 100644 src/app/features/experiments/containers/experiment-info-navbar/experiment-info-navbar.component.html create mode 100644 src/app/features/experiments/containers/experiment-info-navbar/experiment-info-navbar.component.scss create mode 100644 src/app/features/experiments/containers/experiment-info-navbar/experiment-info-navbar.component.ts delete mode 100644 src/app/features/experiments/containers/experiment-info/experiment-info.component.html delete mode 100644 src/app/features/experiments/containers/experiment-info/experiment-info.component.scss delete mode 100644 src/app/features/experiments/containers/experiment-info/experiment-info.component.ts delete mode 100644 src/app/webapp-common/dashboard-search/dumb/experiments-search-results/experiments-search-results.component.html delete mode 100644 src/app/webapp-common/dashboard-search/dumb/experiments-search-results/experiments-search-results.component.scss delete mode 100644 src/app/webapp-common/dashboard-search/dumb/experiments-search-results/experiments-search-results.component.ts delete mode 100644 src/app/webapp-common/dashboard-search/dumb/models-search-results/models-search-results.component.html delete mode 100644 src/app/webapp-common/dashboard-search/dumb/models-search-results/models-search-results.component.scss delete mode 100644 src/app/webapp-common/dashboard-search/dumb/models-search-results/models-search-results.component.ts delete mode 100644 src/app/webapp-common/dashboard-search/dumb/projects-search-results/projects-search-results.component.html delete mode 100644 src/app/webapp-common/dashboard-search/dumb/projects-search-results/projects-search-results.component.scss delete mode 100644 src/app/webapp-common/dashboard-search/dumb/projects-search-results/projects-search-results.component.ts create mode 100644 src/app/webapp-common/dashboard-search/dumb/search-results/search-results.component.html create mode 100644 src/app/webapp-common/dashboard-search/dumb/search-results/search-results.component.scss create mode 100644 src/app/webapp-common/dashboard-search/dumb/search-results/search-results.component.ts delete mode 100644 src/app/webapp-common/experiments/dumb/experiment-table-card/experiment-table-card.component.html delete mode 100644 src/app/webapp-common/experiments/dumb/experiment-table-card/experiment-table-card.component.scss delete mode 100644 src/app/webapp-common/experiments/dumb/experiment-table-card/experiment-table-card.component.ts create mode 100644 src/app/webapp-common/shared/ui-components/overlay/edit-credential-label-dialog/edit-credential-label-dialog.component.html create mode 100644 src/app/webapp-common/shared/ui-components/overlay/edit-credential-label-dialog/edit-credential-label-dialog.component.scss create mode 100644 src/app/webapp-common/shared/ui-components/overlay/edit-credential-label-dialog/edit-credential-label-dialog.component.ts create mode 100644 src/app/webapp-common/workers-and-queues/workers-and-queues.utils.ts delete mode 100644 src/environments/environment.demo.ts delete mode 100644 src/environments/environment.dev.ts diff --git a/package-lock.json b/package-lock.json index 30805e9d..76057cdb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -36,7 +36,7 @@ "bootstrap": "^4.6.1", "britecharts": "^2.18.0", "curved-arrows": "^0.1.0", - "d3-selection": "^1.4.2", + "d3-selection": "^3.0.0", "diff": "^5.0.0", "filesize": "^8.0.7", "has-ansi": "^5.0.1", @@ -75,7 +75,7 @@ "@fortawesome/fontawesome-free": "^6.0.0", "@ngrx/schematics": "^13.0.2", "@ngrx/store-devtools": "^13.0.2", - "@types/d3-selection": "^1.4.3", + "@types/d3-selection": "^3.0.2", "@types/lodash": "^4.14.178", "@types/node": "^16.11.19", "@types/plotly.js": "^1.54.20", @@ -772,9 +772,9 @@ } }, "node_modules/@angular/youtube-player": { - "version": "13.3.4", - "resolved": "https://registry.npmjs.org/@angular/youtube-player/-/youtube-player-13.3.4.tgz", - "integrity": "sha512-f7rVQF/+PqARgKruJBBA0rlbJWbXYAKIYrNVNxLss0W3KifpqNJRl9HVylSlsYPqJh43GhHOLi2oWxWPgNRGEw==", + "version": "13.2.6", + "resolved": "https://registry.npmjs.org/@angular/youtube-player/-/youtube-player-13.2.6.tgz", + "integrity": "sha512-HDgL0QFkKsY8YZH6hhYjYaFEEBotaVUhJV+d53Snz6Ekz8zQ3O3b3swhDFFL/dwweK9bsrXBWwHXOrZmkUIrpQ==", "dependencies": { "@types/youtube": "^0.0.42", "tslib": "^2.3.0" @@ -916,566 +916,567 @@ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, "node_modules/@aws-sdk/abort-controller": { - "version": "3.55.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/abort-controller/-/abort-controller-3.55.0.tgz", - "integrity": "sha512-rCcTxJDEFnmvo/PgbhCRv24/Uv03lEGfRslKZq7SjaMcOubflS/ZXYaMEgsjYHgAT0zlpSsyCIkJXmhFaM7H7w==", + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/abort-controller/-/abort-controller-3.54.0.tgz", + "integrity": "sha512-6N7numECrGwal2NEbJwYXOGjwWsFafz8VuUvCBK5G9SgSL5XAbq1S3lL/4gbme5jhgh9CWh7s+bAY7EpOEH2Xg==", "dependencies": { - "@aws-sdk/types": "3.55.0", - "tslib": "^2.3.1" + "@aws-sdk/types": "3.54.0", + "tslib": "^2.3.0" }, "engines": { "node": ">= 12.0.0" } }, "node_modules/@aws-sdk/chunked-blob-reader": { - "version": "3.55.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/chunked-blob-reader/-/chunked-blob-reader-3.55.0.tgz", - "integrity": "sha512-o/xjMCq81opAjSBjt7YdHJwIJcGVG5XIV9+C2KXcY5QwVimkOKPybWTv0mXPvSwSilSx+EhpLNhkcJuXdzhw4w==", + "version": "3.52.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/chunked-blob-reader/-/chunked-blob-reader-3.52.0.tgz", + "integrity": "sha512-BAZhriHHfvnGOd0P9xcnGu8DGyxOa0lgmEw+Tc6nZpXJzx0P+1Sd76q5gE5d/IZ0r5VTB6rfwwKUoG6iShNCwQ==", "dependencies": { - "tslib": "^2.3.1" + "tslib": "^2.3.0" } }, "node_modules/@aws-sdk/chunked-blob-reader-native": { - "version": "3.58.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/chunked-blob-reader-native/-/chunked-blob-reader-native-3.58.0.tgz", - "integrity": "sha512-+D3xnPD5985iphgAqgUerBDs371a2WzzoEVi7eHJUMMsP/gEnSTdSH0HNxsqhYv6CW4EdKtvDAQdAwA1VtCf2A==", + "version": "3.52.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/chunked-blob-reader-native/-/chunked-blob-reader-native-3.52.0.tgz", + "integrity": "sha512-/hVzC0Q12/mWRMBBQD3v82xsLSxZ4RwG6N44XP7MuJoHy4ui4T7D9RSuvBpzzr/4fqF0w9M7XYv6aM4BD2pFIQ==", "dependencies": { - "@aws-sdk/util-base64-browser": "3.58.0", - "tslib": "^2.3.1" + "@aws-sdk/util-base64-browser": "3.52.0", + "tslib": "^2.3.0" } }, "node_modules/@aws-sdk/client-s3": { - "version": "3.76.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.76.0.tgz", - "integrity": "sha512-1ORpdryxEoF7mMm06SFL3mBytpS6fBug6X/fxLX7HuRRxg1nH+6AY5Y1Jk1mvIMVrLXLLiNk59ovzYxO2KgZew==", + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.54.0.tgz", + "integrity": "sha512-9JdhkTqRCYA3esnjFR7xaFysXMfX5TatKE9H8Sds78eoMQrfgB2Yl6ZcEl8Oy0vpMVpOzqRYmcSmFfaBOhuI/g==", "dependencies": { "@aws-crypto/sha1-browser": "2.0.0", "@aws-crypto/sha256-browser": "2.0.0", "@aws-crypto/sha256-js": "2.0.0", - "@aws-sdk/client-sts": "3.76.0", - "@aws-sdk/config-resolver": "3.75.0", - "@aws-sdk/credential-provider-node": "3.76.0", - "@aws-sdk/eventstream-serde-browser": "3.72.0", - "@aws-sdk/eventstream-serde-config-resolver": "3.55.0", - "@aws-sdk/eventstream-serde-node": "3.72.0", - "@aws-sdk/fetch-http-handler": "3.58.0", - "@aws-sdk/hash-blob-browser": "3.58.0", - "@aws-sdk/hash-node": "3.55.0", - "@aws-sdk/hash-stream-node": "3.58.0", - "@aws-sdk/invalid-dependency": "3.55.0", - "@aws-sdk/md5-js": "3.58.0", - "@aws-sdk/middleware-bucket-endpoint": "3.75.0", - "@aws-sdk/middleware-content-length": "3.58.0", - "@aws-sdk/middleware-expect-continue": "3.58.0", - "@aws-sdk/middleware-flexible-checksums": "3.72.0", - "@aws-sdk/middleware-host-header": "3.58.0", - "@aws-sdk/middleware-location-constraint": "3.55.0", - "@aws-sdk/middleware-logger": "3.55.0", - "@aws-sdk/middleware-retry": "3.75.0", - "@aws-sdk/middleware-sdk-s3": "3.66.0", - "@aws-sdk/middleware-serde": "3.55.0", - "@aws-sdk/middleware-signing": "3.58.0", - "@aws-sdk/middleware-ssec": "3.55.0", - "@aws-sdk/middleware-stack": "3.55.0", - "@aws-sdk/middleware-user-agent": "3.58.0", - "@aws-sdk/node-config-provider": "3.75.0", - "@aws-sdk/node-http-handler": "3.76.0", - "@aws-sdk/protocol-http": "3.58.0", - "@aws-sdk/signature-v4-multi-region": "3.66.0", - "@aws-sdk/smithy-client": "3.72.0", - "@aws-sdk/types": "3.55.0", - "@aws-sdk/url-parser": "3.55.0", - "@aws-sdk/util-base64-browser": "3.58.0", - "@aws-sdk/util-base64-node": "3.55.0", - "@aws-sdk/util-body-length-browser": "3.55.0", - "@aws-sdk/util-body-length-node": "3.55.0", - "@aws-sdk/util-defaults-mode-browser": "3.72.0", - "@aws-sdk/util-defaults-mode-node": "3.75.0", - "@aws-sdk/util-stream-browser": "3.55.0", - "@aws-sdk/util-stream-node": "3.55.0", - "@aws-sdk/util-user-agent-browser": "3.58.0", - "@aws-sdk/util-user-agent-node": "3.75.0", - "@aws-sdk/util-utf8-browser": "3.55.0", - "@aws-sdk/util-utf8-node": "3.55.0", - "@aws-sdk/util-waiter": "3.55.0", - "@aws-sdk/xml-builder": "3.55.0", + "@aws-sdk/client-sts": "3.54.0", + "@aws-sdk/config-resolver": "3.54.0", + "@aws-sdk/credential-provider-node": "3.54.0", + "@aws-sdk/eventstream-serde-browser": "3.54.0", + "@aws-sdk/eventstream-serde-config-resolver": "3.54.0", + "@aws-sdk/eventstream-serde-node": "3.54.0", + "@aws-sdk/fetch-http-handler": "3.54.0", + "@aws-sdk/hash-blob-browser": "3.54.0", + "@aws-sdk/hash-node": "3.54.0", + "@aws-sdk/hash-stream-node": "3.54.0", + "@aws-sdk/invalid-dependency": "3.54.0", + "@aws-sdk/md5-js": "3.54.0", + "@aws-sdk/middleware-bucket-endpoint": "3.54.0", + "@aws-sdk/middleware-content-length": "3.54.0", + "@aws-sdk/middleware-expect-continue": "3.54.0", + "@aws-sdk/middleware-flexible-checksums": "3.54.0", + "@aws-sdk/middleware-host-header": "3.54.0", + "@aws-sdk/middleware-location-constraint": "3.54.0", + "@aws-sdk/middleware-logger": "3.54.0", + "@aws-sdk/middleware-retry": "3.54.0", + "@aws-sdk/middleware-sdk-s3": "3.54.0", + "@aws-sdk/middleware-serde": "3.54.0", + "@aws-sdk/middleware-signing": "3.54.0", + "@aws-sdk/middleware-ssec": "3.54.0", + "@aws-sdk/middleware-stack": "3.54.0", + "@aws-sdk/middleware-user-agent": "3.54.0", + "@aws-sdk/node-config-provider": "3.54.0", + "@aws-sdk/node-http-handler": "3.54.0", + "@aws-sdk/protocol-http": "3.54.0", + "@aws-sdk/smithy-client": "3.54.0", + "@aws-sdk/types": "3.54.0", + "@aws-sdk/url-parser": "3.54.0", + "@aws-sdk/util-base64-browser": "3.52.0", + "@aws-sdk/util-base64-node": "3.52.0", + "@aws-sdk/util-body-length-browser": "3.54.0", + "@aws-sdk/util-body-length-node": "3.54.0", + "@aws-sdk/util-defaults-mode-browser": "3.54.0", + "@aws-sdk/util-defaults-mode-node": "3.54.0", + "@aws-sdk/util-stream-browser": "3.54.0", + "@aws-sdk/util-stream-node": "3.54.0", + "@aws-sdk/util-user-agent-browser": "3.54.0", + "@aws-sdk/util-user-agent-node": "3.54.0", + "@aws-sdk/util-utf8-browser": "3.52.0", + "@aws-sdk/util-utf8-node": "3.52.0", + "@aws-sdk/util-waiter": "3.54.0", + "@aws-sdk/xml-builder": "3.52.0", "entities": "2.2.0", "fast-xml-parser": "3.19.0", - "tslib": "^2.3.1" + "tslib": "^2.3.0" }, "engines": { "node": ">=12.0.0" } }, "node_modules/@aws-sdk/client-sso": { - "version": "3.76.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.76.0.tgz", - "integrity": "sha512-trwzJWGxeagYAzo+1/JgcU/pM1vpKHW5rkbasDO5ZC4zHAlSwVhlU7yxGjYXsnobjkvf7zqTQhAxmOuMNWMFew==", + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.54.0.tgz", + "integrity": "sha512-5ZYYhoMqeaYhOU4kOEM7daKb8D5QhJ+IpwhHHMPhoHqQEwbbhBTFDXRs3ObUP/QYdBUMWS71+pnDoUdyHqPQ0Q==", "dependencies": { "@aws-crypto/sha256-browser": "2.0.0", "@aws-crypto/sha256-js": "2.0.0", - "@aws-sdk/config-resolver": "3.75.0", - "@aws-sdk/fetch-http-handler": "3.58.0", - "@aws-sdk/hash-node": "3.55.0", - "@aws-sdk/invalid-dependency": "3.55.0", - "@aws-sdk/middleware-content-length": "3.58.0", - "@aws-sdk/middleware-host-header": "3.58.0", - "@aws-sdk/middleware-logger": "3.55.0", - "@aws-sdk/middleware-retry": "3.75.0", - "@aws-sdk/middleware-serde": "3.55.0", - "@aws-sdk/middleware-stack": "3.55.0", - "@aws-sdk/middleware-user-agent": "3.58.0", - "@aws-sdk/node-config-provider": "3.75.0", - "@aws-sdk/node-http-handler": "3.76.0", - "@aws-sdk/protocol-http": "3.58.0", - "@aws-sdk/smithy-client": "3.72.0", - "@aws-sdk/types": "3.55.0", - "@aws-sdk/url-parser": "3.55.0", - "@aws-sdk/util-base64-browser": "3.58.0", - "@aws-sdk/util-base64-node": "3.55.0", - "@aws-sdk/util-body-length-browser": "3.55.0", - "@aws-sdk/util-body-length-node": "3.55.0", - "@aws-sdk/util-defaults-mode-browser": "3.72.0", - "@aws-sdk/util-defaults-mode-node": "3.75.0", - "@aws-sdk/util-user-agent-browser": "3.58.0", - "@aws-sdk/util-user-agent-node": "3.75.0", - "@aws-sdk/util-utf8-browser": "3.55.0", - "@aws-sdk/util-utf8-node": "3.55.0", - "tslib": "^2.3.1" + "@aws-sdk/config-resolver": "3.54.0", + "@aws-sdk/fetch-http-handler": "3.54.0", + "@aws-sdk/hash-node": "3.54.0", + "@aws-sdk/invalid-dependency": "3.54.0", + "@aws-sdk/middleware-content-length": "3.54.0", + "@aws-sdk/middleware-host-header": "3.54.0", + "@aws-sdk/middleware-logger": "3.54.0", + "@aws-sdk/middleware-retry": "3.54.0", + "@aws-sdk/middleware-serde": "3.54.0", + "@aws-sdk/middleware-stack": "3.54.0", + "@aws-sdk/middleware-user-agent": "3.54.0", + "@aws-sdk/node-config-provider": "3.54.0", + "@aws-sdk/node-http-handler": "3.54.0", + "@aws-sdk/protocol-http": "3.54.0", + "@aws-sdk/smithy-client": "3.54.0", + "@aws-sdk/types": "3.54.0", + "@aws-sdk/url-parser": "3.54.0", + "@aws-sdk/util-base64-browser": "3.52.0", + "@aws-sdk/util-base64-node": "3.52.0", + "@aws-sdk/util-body-length-browser": "3.54.0", + "@aws-sdk/util-body-length-node": "3.54.0", + "@aws-sdk/util-defaults-mode-browser": "3.54.0", + "@aws-sdk/util-defaults-mode-node": "3.54.0", + "@aws-sdk/util-user-agent-browser": "3.54.0", + "@aws-sdk/util-user-agent-node": "3.54.0", + "@aws-sdk/util-utf8-browser": "3.52.0", + "@aws-sdk/util-utf8-node": "3.52.0", + "tslib": "^2.3.0" }, "engines": { "node": ">=12.0.0" } }, "node_modules/@aws-sdk/client-sts": { - "version": "3.76.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.76.0.tgz", - "integrity": "sha512-rrzau4y7VO9q/F6ZRuJAdZV5oKggjgJuUKGSGssYkLgO2BDblcR1ObUNetSyFsGPoSWnDhg0TjFJnlFFlIBplA==", + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.54.0.tgz", + "integrity": "sha512-UY8fyi1zaWBJm+ZtDZRvSOv1rjHlvJjtJF3MfGQWDwUM10Amwzfh4Hc2JEzyeMJPkoSSvm6CVjSDyqXo8yLGZA==", "dependencies": { "@aws-crypto/sha256-browser": "2.0.0", "@aws-crypto/sha256-js": "2.0.0", - "@aws-sdk/config-resolver": "3.75.0", - "@aws-sdk/credential-provider-node": "3.76.0", - "@aws-sdk/fetch-http-handler": "3.58.0", - "@aws-sdk/hash-node": "3.55.0", - "@aws-sdk/invalid-dependency": "3.55.0", - "@aws-sdk/middleware-content-length": "3.58.0", - "@aws-sdk/middleware-host-header": "3.58.0", - "@aws-sdk/middleware-logger": "3.55.0", - "@aws-sdk/middleware-retry": "3.75.0", - "@aws-sdk/middleware-sdk-sts": "3.58.0", - "@aws-sdk/middleware-serde": "3.55.0", - "@aws-sdk/middleware-signing": "3.58.0", - "@aws-sdk/middleware-stack": "3.55.0", - "@aws-sdk/middleware-user-agent": "3.58.0", - "@aws-sdk/node-config-provider": "3.75.0", - "@aws-sdk/node-http-handler": "3.76.0", - "@aws-sdk/protocol-http": "3.58.0", - "@aws-sdk/smithy-client": "3.72.0", - "@aws-sdk/types": "3.55.0", - "@aws-sdk/url-parser": "3.55.0", - "@aws-sdk/util-base64-browser": "3.58.0", - "@aws-sdk/util-base64-node": "3.55.0", - "@aws-sdk/util-body-length-browser": "3.55.0", - "@aws-sdk/util-body-length-node": "3.55.0", - "@aws-sdk/util-defaults-mode-browser": "3.72.0", - "@aws-sdk/util-defaults-mode-node": "3.75.0", - "@aws-sdk/util-user-agent-browser": "3.58.0", - "@aws-sdk/util-user-agent-node": "3.75.0", - "@aws-sdk/util-utf8-browser": "3.55.0", - "@aws-sdk/util-utf8-node": "3.55.0", + "@aws-sdk/config-resolver": "3.54.0", + "@aws-sdk/credential-provider-node": "3.54.0", + "@aws-sdk/fetch-http-handler": "3.54.0", + "@aws-sdk/hash-node": "3.54.0", + "@aws-sdk/invalid-dependency": "3.54.0", + "@aws-sdk/middleware-content-length": "3.54.0", + "@aws-sdk/middleware-host-header": "3.54.0", + "@aws-sdk/middleware-logger": "3.54.0", + "@aws-sdk/middleware-retry": "3.54.0", + "@aws-sdk/middleware-sdk-sts": "3.54.0", + "@aws-sdk/middleware-serde": "3.54.0", + "@aws-sdk/middleware-signing": "3.54.0", + "@aws-sdk/middleware-stack": "3.54.0", + "@aws-sdk/middleware-user-agent": "3.54.0", + "@aws-sdk/node-config-provider": "3.54.0", + "@aws-sdk/node-http-handler": "3.54.0", + "@aws-sdk/protocol-http": "3.54.0", + "@aws-sdk/smithy-client": "3.54.0", + "@aws-sdk/types": "3.54.0", + "@aws-sdk/url-parser": "3.54.0", + "@aws-sdk/util-base64-browser": "3.52.0", + "@aws-sdk/util-base64-node": "3.52.0", + "@aws-sdk/util-body-length-browser": "3.54.0", + "@aws-sdk/util-body-length-node": "3.54.0", + "@aws-sdk/util-defaults-mode-browser": "3.54.0", + "@aws-sdk/util-defaults-mode-node": "3.54.0", + "@aws-sdk/util-user-agent-browser": "3.54.0", + "@aws-sdk/util-user-agent-node": "3.54.0", + "@aws-sdk/util-utf8-browser": "3.52.0", + "@aws-sdk/util-utf8-node": "3.52.0", "entities": "2.2.0", "fast-xml-parser": "3.19.0", - "tslib": "^2.3.1" + "tslib": "^2.3.0" }, "engines": { "node": ">=12.0.0" } }, "node_modules/@aws-sdk/config-resolver": { - "version": "3.75.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/config-resolver/-/config-resolver-3.75.0.tgz", - "integrity": "sha512-sM1tygyXTEU8+UXAOs9353+lYoaWdtxPtxfC4zQsQUi0zUYCyO8jO7bNBo277uF82jkGwkraUL/F0ZN7KyzjSQ==", + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/config-resolver/-/config-resolver-3.54.0.tgz", + "integrity": "sha512-VaNuvJLMaz3znmBD9BNkoEqNUs5teILU66SnFqBwVqabmOVeOh7M6/f43CcDarkwGklzZB/bn/rx9NOWUtdunA==", "dependencies": { - "@aws-sdk/signature-v4": "3.58.0", - "@aws-sdk/types": "3.55.0", - "@aws-sdk/util-config-provider": "3.55.0", - "@aws-sdk/util-middleware": "3.55.0", - "tslib": "^2.3.1" + "@aws-sdk/signature-v4": "3.54.0", + "@aws-sdk/types": "3.54.0", + "@aws-sdk/util-config-provider": "3.52.0", + "tslib": "^2.3.0" }, "engines": { "node": ">= 12.0.0" } }, "node_modules/@aws-sdk/credential-provider-env": { - "version": "3.55.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.55.0.tgz", - "integrity": "sha512-4AIIXEdvinLlWNFtrUbUgoB7dkuV04RTcTruVWI4Ub4WSsuSCa72ZU1vqyvcEAOgGGLBmcSaGTWByjiD2sGcGA==", + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.54.0.tgz", + "integrity": "sha512-XWfzoUyFVsT4J7iTnXO38FKNdGFyE6ZNBtW9+Yx9EiiLtUlzH09PRv+54KIRQ4uqU+fEdtRh0gOdFajTrnRi3g==", "dependencies": { - "@aws-sdk/property-provider": "3.55.0", - "@aws-sdk/types": "3.55.0", - "tslib": "^2.3.1" + "@aws-sdk/property-provider": "3.54.0", + "@aws-sdk/types": "3.54.0", + "tslib": "^2.3.0" }, "engines": { "node": ">= 12.0.0" } }, "node_modules/@aws-sdk/credential-provider-imds": { - "version": "3.75.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-imds/-/credential-provider-imds-3.75.0.tgz", - "integrity": "sha512-woqM/cZCnPvlel6t5o79CqT8doXe/7tSH5j8RPpfkYUwfdQwQqpjNqcO2QfkVzq4WsKfRZ92U00BhXsWDUZRfg==", + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-imds/-/credential-provider-imds-3.54.0.tgz", + "integrity": "sha512-Chygp8jswdjtCPmNxEMXigX4clgqh5GDaFGopR/gFaaG960hjF88Fx1/CPYD7exvM1FRO67nyfBOS0QKjSqTXg==", "dependencies": { - "@aws-sdk/node-config-provider": "3.75.0", - "@aws-sdk/property-provider": "3.55.0", - "@aws-sdk/types": "3.55.0", - "@aws-sdk/url-parser": "3.55.0", - "tslib": "^2.3.1" + "@aws-sdk/node-config-provider": "3.54.0", + "@aws-sdk/property-provider": "3.54.0", + "@aws-sdk/types": "3.54.0", + "@aws-sdk/url-parser": "3.54.0", + "tslib": "^2.3.0" }, "engines": { "node": ">= 12.0.0" } }, "node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.76.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.76.0.tgz", - "integrity": "sha512-2je7+yjAilgwB/jZwPnhW0P8McmuZoY29A9v45SZxRSW2yABuEUJ3EvcoieUXXNRRnEz96BrldpUHDC8VhXPJw==", + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.54.0.tgz", + "integrity": "sha512-EobK9bJwsUdMKx7vB+tL5eaNaj/NoOPaFJlv0JRL3+5px7d2vF0i9yklj4uT7F3vDlOup6R3b1Gg9GtqxfYt9w==", "dependencies": { - "@aws-sdk/credential-provider-env": "3.55.0", - "@aws-sdk/credential-provider-imds": "3.75.0", - "@aws-sdk/credential-provider-sso": "3.76.0", - "@aws-sdk/credential-provider-web-identity": "3.55.0", - "@aws-sdk/property-provider": "3.55.0", - "@aws-sdk/shared-ini-file-loader": "3.75.0", - "@aws-sdk/types": "3.55.0", - "tslib": "^2.3.1" + "@aws-sdk/credential-provider-env": "3.54.0", + "@aws-sdk/credential-provider-imds": "3.54.0", + "@aws-sdk/credential-provider-sso": "3.54.0", + "@aws-sdk/credential-provider-web-identity": "3.54.0", + "@aws-sdk/property-provider": "3.54.0", + "@aws-sdk/shared-ini-file-loader": "3.52.0", + "@aws-sdk/types": "3.54.0", + "@aws-sdk/util-credentials": "3.53.0", + "tslib": "^2.3.0" }, "engines": { "node": ">= 12.0.0" } }, "node_modules/@aws-sdk/credential-provider-node": { - "version": "3.76.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.76.0.tgz", - "integrity": "sha512-PCBB4sj/t5oatxuqogfB/TANMJWjE8zIAwJJagJdXgyo4vMZ8IsSjnkpMwXdUoyPq+rUx6zFq8XagJF+WW0PBw==", + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.54.0.tgz", + "integrity": "sha512-KsXJG0K7yJg2MCzNW52fSDbCIR5mRobbNnXTMpDRkghlQyHP1gdHsyRedVciMkJhdDILop2lScLw70iQBayP/Q==", "dependencies": { - "@aws-sdk/credential-provider-env": "3.55.0", - "@aws-sdk/credential-provider-imds": "3.75.0", - "@aws-sdk/credential-provider-ini": "3.76.0", - "@aws-sdk/credential-provider-process": "3.75.0", - "@aws-sdk/credential-provider-sso": "3.76.0", - "@aws-sdk/credential-provider-web-identity": "3.55.0", - "@aws-sdk/property-provider": "3.55.0", - "@aws-sdk/shared-ini-file-loader": "3.75.0", - "@aws-sdk/types": "3.55.0", - "tslib": "^2.3.1" + "@aws-sdk/credential-provider-env": "3.54.0", + "@aws-sdk/credential-provider-imds": "3.54.0", + "@aws-sdk/credential-provider-ini": "3.54.0", + "@aws-sdk/credential-provider-process": "3.54.0", + "@aws-sdk/credential-provider-sso": "3.54.0", + "@aws-sdk/credential-provider-web-identity": "3.54.0", + "@aws-sdk/property-provider": "3.54.0", + "@aws-sdk/shared-ini-file-loader": "3.52.0", + "@aws-sdk/types": "3.54.0", + "@aws-sdk/util-credentials": "3.53.0", + "tslib": "^2.3.0" }, "engines": { "node": ">=12.0.0" } }, "node_modules/@aws-sdk/credential-provider-process": { - "version": "3.75.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.75.0.tgz", - "integrity": "sha512-G5dvX37AvS+oLGpka2JXv9wS6uViYQnspJ/56RDmXQElE7ChHBRz89GB4lOOowVQMROzpP96LARr8XNJ4iFq/w==", + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.54.0.tgz", + "integrity": "sha512-hjUQ6FRG3Ihsm77Rgrf1dSfRUVZAFEyAHCuwURePXpYjzMpFYjl12wL6Pwa7MLCqVMyLKQ8HYamznkgBlLQqxw==", "dependencies": { - "@aws-sdk/property-provider": "3.55.0", - "@aws-sdk/shared-ini-file-loader": "3.75.0", - "@aws-sdk/types": "3.55.0", - "tslib": "^2.3.1" + "@aws-sdk/property-provider": "3.54.0", + "@aws-sdk/shared-ini-file-loader": "3.52.0", + "@aws-sdk/types": "3.54.0", + "@aws-sdk/util-credentials": "3.53.0", + "tslib": "^2.3.0" }, "engines": { "node": ">= 12.0.0" } }, "node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.76.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.76.0.tgz", - "integrity": "sha512-i2vD1nrq72dNOhfsNI2iRvmI+eaxZeXQCkE5WUqURT8nHCloEkKDPchWWY2obUCVAnL1EPEoSKHyAETl1uSYew==", + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.54.0.tgz", + "integrity": "sha512-8HfBTdOw+9gbWsXRTr5y+QYq8gK+YYDx7tKbNv7ZWjMfw49SDef0j0W4ZBZH+FYEPepOEAKjBgtjvlUeFxrOaA==", "dependencies": { - "@aws-sdk/client-sso": "3.76.0", - "@aws-sdk/property-provider": "3.55.0", - "@aws-sdk/shared-ini-file-loader": "3.75.0", - "@aws-sdk/types": "3.55.0", - "tslib": "^2.3.1" + "@aws-sdk/client-sso": "3.54.0", + "@aws-sdk/property-provider": "3.54.0", + "@aws-sdk/shared-ini-file-loader": "3.52.0", + "@aws-sdk/types": "3.54.0", + "@aws-sdk/util-credentials": "3.53.0", + "tslib": "^2.3.0" }, "engines": { "node": ">= 12.0.0" } }, "node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.55.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.55.0.tgz", - "integrity": "sha512-aKnXfZNGohTuF9rCGYLg4JEIOvWIZ/sb66XMq7bOUrx13KRPDwL/eUQL8quS5jGRLpjXVNvrS17AFf65GbdUBg==", + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.54.0.tgz", + "integrity": "sha512-Mi87IzpgIi6P3WntumgMJ6rNY8Ay/HtsLFYm4bZ1ZGJH/3QVT4YLm1n8A4xoC+ouhL0i24jmN3X1aNu6amBfEg==", "dependencies": { - "@aws-sdk/property-provider": "3.55.0", - "@aws-sdk/types": "3.55.0", - "tslib": "^2.3.1" + "@aws-sdk/property-provider": "3.54.0", + "@aws-sdk/types": "3.54.0", + "tslib": "^2.3.0" }, "engines": { "node": ">= 12.0.0" } }, "node_modules/@aws-sdk/eventstream-marshaller": { - "version": "3.58.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-marshaller/-/eventstream-marshaller-3.58.0.tgz", - "integrity": "sha512-vTdVFLIHGZTx/Anp9GpkTXVuvwSCNOecTutU5Py4i6fATgefWiSutc5Xc/FLujBSc0EhAXDGZIcTMpZC7jUpeg==", + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-marshaller/-/eventstream-marshaller-3.54.0.tgz", + "integrity": "sha512-blOxssrHCnugxdcudYB3Vmlp7ziG0to9RfnPq+InI98mIDm3G+rt7vW6GtlkgyWu0EYduj6N+aOI7ssRUCOyDQ==", "dependencies": { "@aws-crypto/crc32": "2.0.0", - "@aws-sdk/types": "3.55.0", - "@aws-sdk/util-hex-encoding": "3.58.0", - "tslib": "^2.3.1" + "@aws-sdk/types": "3.54.0", + "@aws-sdk/util-hex-encoding": "3.52.0", + "tslib": "^2.3.0" } }, "node_modules/@aws-sdk/eventstream-serde-browser": { - "version": "3.72.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-serde-browser/-/eventstream-serde-browser-3.72.0.tgz", - "integrity": "sha512-UhMZ4P60mZu7G+craAdkRgR4/n3lWAgrNp1upgN2W8RLEQwhqY3qHiUdn/kp6qvontwHnxZkXNB+5Zm5pcP8bQ==", + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-serde-browser/-/eventstream-serde-browser-3.54.0.tgz", + "integrity": "sha512-XU9+nA7WlO+Rj0hV+C/2ZlB0zfI4eoit/CIlfGaonfx6EFezH3l4ngMZq8lgd8fSuPy1dN25DWQsW/F3AFSRdg==", "dependencies": { - "@aws-sdk/eventstream-marshaller": "3.58.0", - "@aws-sdk/eventstream-serde-universal": "3.72.0", - "@aws-sdk/types": "3.55.0", - "tslib": "^2.3.1" + "@aws-sdk/eventstream-marshaller": "3.54.0", + "@aws-sdk/eventstream-serde-universal": "3.54.0", + "@aws-sdk/types": "3.54.0", + "tslib": "^2.3.0" }, "engines": { "node": ">= 12.0.0" } }, "node_modules/@aws-sdk/eventstream-serde-config-resolver": { - "version": "3.55.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-3.55.0.tgz", - "integrity": "sha512-NTJHLq1sbXyXAaJucKvcdN3Svr/fM2TjHEC3l8P/torFjIsX1+Ykpi8tZt8KsX8RjoUTTfKylh41AjJq0K9X4Q==", + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-3.54.0.tgz", + "integrity": "sha512-fnbwtjaSd05K2+rcEZ3TQfM6YBY6obWqqt/x0qTTt7277wdqvE3+i0dWcvrQLldGD7xY3+oitEmClAeCE0raiA==", "dependencies": { - "@aws-sdk/types": "3.55.0", - "tslib": "^2.3.1" + "@aws-sdk/types": "3.54.0", + "tslib": "^2.3.0" }, "engines": { "node": ">= 12.0.0" } }, "node_modules/@aws-sdk/eventstream-serde-node": { - "version": "3.72.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-serde-node/-/eventstream-serde-node-3.72.0.tgz", - "integrity": "sha512-woemBkQ3O7mTiT3kdJH72s3lQLhr2B7hxRhYeaa1xQf1UjLJkKXL5PEOOrcylmxLdF6rYLsFs8Y/Hr4FZfqAqA==", + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-serde-node/-/eventstream-serde-node-3.54.0.tgz", + "integrity": "sha512-b/EXk+Yb6lspfdEvClDkutif1z7Ggbeg/s2z9ug8Zh32i4/8gc4kcoWHy4ez8GUqsrRuOfD1MScqxkSAmIlPlg==", "dependencies": { - "@aws-sdk/eventstream-marshaller": "3.58.0", - "@aws-sdk/eventstream-serde-universal": "3.72.0", - "@aws-sdk/types": "3.55.0", - "tslib": "^2.3.1" + "@aws-sdk/eventstream-marshaller": "3.54.0", + "@aws-sdk/eventstream-serde-universal": "3.54.0", + "@aws-sdk/types": "3.54.0", + "tslib": "^2.3.0" }, "engines": { "node": ">= 12.0.0" } }, "node_modules/@aws-sdk/eventstream-serde-universal": { - "version": "3.72.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-serde-universal/-/eventstream-serde-universal-3.72.0.tgz", - "integrity": "sha512-iIaDC/2xgK+2kLiOPJv8wMDCCtI2JB8bkeac6cQOfn4hZGQdP6fvRGFWD2R8//VR52H68N2vrhCXHvtjnF4iFg==", + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-serde-universal/-/eventstream-serde-universal-3.54.0.tgz", + "integrity": "sha512-HdFYrLvKHWATev0BCp0I8xH40MhP9cNhxK0h+srdCC9o/Djs3QrI0Nn5rzWdg/hQDyRg8jPSvaGG8P/ekyTn2w==", "dependencies": { - "@aws-sdk/eventstream-marshaller": "3.58.0", - "@aws-sdk/types": "3.55.0", - "tslib": "^2.3.1" + "@aws-sdk/eventstream-marshaller": "3.54.0", + "@aws-sdk/types": "3.54.0", + "tslib": "^2.3.0" }, "engines": { "node": ">= 12.0.0" } }, "node_modules/@aws-sdk/fetch-http-handler": { - "version": "3.58.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/fetch-http-handler/-/fetch-http-handler-3.58.0.tgz", - "integrity": "sha512-timF3FjPV5Bd+Kgph83LIKVlPCFObVYzious1a6doeLAT6YFwZpRrWbfP/HzS+DCoYiwUsH69oVJ91BoV66oyA==", + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/fetch-http-handler/-/fetch-http-handler-3.54.0.tgz", + "integrity": "sha512-TIn2ocem/gpMQ12KoiOu3uTHO86OOrmFITulV9D8xTzvFqHe34JKjHQPqII6lDbTCnU9N5CMv3N1CXxolIhiOQ==", "dependencies": { - "@aws-sdk/protocol-http": "3.58.0", - "@aws-sdk/querystring-builder": "3.55.0", - "@aws-sdk/types": "3.55.0", - "@aws-sdk/util-base64-browser": "3.58.0", - "tslib": "^2.3.1" + "@aws-sdk/protocol-http": "3.54.0", + "@aws-sdk/querystring-builder": "3.54.0", + "@aws-sdk/types": "3.54.0", + "@aws-sdk/util-base64-browser": "3.52.0", + "tslib": "^2.3.0" } }, "node_modules/@aws-sdk/hash-blob-browser": { - "version": "3.58.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/hash-blob-browser/-/hash-blob-browser-3.58.0.tgz", - "integrity": "sha512-fdp12BqypRxwvevbJSl/sUhXJRi4Ghv6JKEXAHI1klkR6xY1GRORO5SHWltVY/xl373ERMol5o/n+ra/7jcx/g==", + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/hash-blob-browser/-/hash-blob-browser-3.54.0.tgz", + "integrity": "sha512-KIflBj2efxy5/z1ffg1HL3CRxqM7hNqel+dtVCYaCfTJ/MQhcfcR5GsodhJYl99pitryorJeB4chhgNv4bbPUA==", "dependencies": { - "@aws-sdk/chunked-blob-reader": "3.55.0", - "@aws-sdk/chunked-blob-reader-native": "3.58.0", - "@aws-sdk/types": "3.55.0", - "tslib": "^2.3.1" + "@aws-sdk/chunked-blob-reader": "3.52.0", + "@aws-sdk/chunked-blob-reader-native": "3.52.0", + "@aws-sdk/types": "3.54.0", + "tslib": "^2.3.0" } }, "node_modules/@aws-sdk/hash-node": { - "version": "3.55.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/hash-node/-/hash-node-3.55.0.tgz", - "integrity": "sha512-2UdYwY/++AlzWEAFaK9wOed2QSxbzV527vmqKjReLHpPKPrSIlooUxlTH3LU6Y6WVDAzDRtLK43KUVXTLgGK1A==", + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/hash-node/-/hash-node-3.54.0.tgz", + "integrity": "sha512-o2XRftfj3Tj2jsZsdvnEY4OtmkT/9OADCWkINQCTcfy+nMuvs1IAS/qruunfaMJ58GntOoI4CVIbRa2lhhJr5w==", "dependencies": { - "@aws-sdk/types": "3.55.0", - "@aws-sdk/util-buffer-from": "3.55.0", - "tslib": "^2.3.1" + "@aws-sdk/types": "3.54.0", + "@aws-sdk/util-buffer-from": "3.52.0", + "tslib": "^2.3.0" }, "engines": { "node": ">= 12.0.0" } }, "node_modules/@aws-sdk/hash-stream-node": { - "version": "3.58.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/hash-stream-node/-/hash-stream-node-3.58.0.tgz", - "integrity": "sha512-y7HEeC3OiuXCRqsHnKDn5yef8UAbnegD9r+OM9bdD+3e6FLAL8Rq7hQTOpwIAiPXuD7HKx8h98s9JLvkwTOBkg==", + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/hash-stream-node/-/hash-stream-node-3.54.0.tgz", + "integrity": "sha512-j936gz9O1ist0Bu2IXCf2DUrYfB9DkwKUMRAN14mTrKB+3PAMRhBazUVDJjIxPbcC9MQJnwIa2tiZWn8QC48UA==", "dependencies": { - "@aws-sdk/types": "3.55.0", - "tslib": "^2.3.1" + "@aws-sdk/types": "3.54.0", + "tslib": "^2.3.0" }, "engines": { "node": ">= 12.0.0" } }, "node_modules/@aws-sdk/invalid-dependency": { - "version": "3.55.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/invalid-dependency/-/invalid-dependency-3.55.0.tgz", - "integrity": "sha512-delH0lV+78fdD/8MXIt9kTLS6IwHvdhqq9dw/ow5VjTUw+xBwUlfPfZplaai+3hKTKWh6a2WZCeDasNItBv9aA==", + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/invalid-dependency/-/invalid-dependency-3.54.0.tgz", + "integrity": "sha512-eeefTPtkb0FQFMBKmwhvmdPqCgGvTcWEiNH8pznAH0hqxLvOLNdNRoKnX5a1WlYoq3eTm0YN9Zh+N1Sj4mbkcg==", "dependencies": { - "@aws-sdk/types": "3.55.0", - "tslib": "^2.3.1" + "@aws-sdk/types": "3.54.0", + "tslib": "^2.3.0" } }, "node_modules/@aws-sdk/is-array-buffer": { - "version": "3.55.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/is-array-buffer/-/is-array-buffer-3.55.0.tgz", - "integrity": "sha512-NbiPHVYuPxdqdFd6FxzzN3H1BQn/iWA3ri3Ry7AyLeP/tGs1yzEWMwf8BN8TSMALI0GXT6Sh0GDWy3Ok5xB6DA==", + "version": "3.52.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/is-array-buffer/-/is-array-buffer-3.52.0.tgz", + "integrity": "sha512-5Pe9QKrOeSZb9Z8gtlx9CDMfxH8EiNdClBfXBbc6CiUM7y6l7UintYHkm133zM5XTqtMRYY1jaD8svVAoRPApA==", "dependencies": { - "tslib": "^2.3.1" + "tslib": "^2.3.0" }, "engines": { "node": ">= 12.0.0" } }, "node_modules/@aws-sdk/md5-js": { - "version": "3.58.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/md5-js/-/md5-js-3.58.0.tgz", - "integrity": "sha512-V5f4Re+CLn3aDF1nrmDqdUtcqBHCyxxD2s2Ot+hZ2JFit+OtJggo1cI03ldTrQpG79rwHG+bHqL2VvNQP7Aj9A==", + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/md5-js/-/md5-js-3.54.0.tgz", + "integrity": "sha512-pMprZD8JBw9WU4Risfd0Clm9SrUpsUS3QriSDeuFnGfRcKHkpw1sDj6HsNsIQ1OCeWuhYqW55Wtzc0pH8U80Mg==", "dependencies": { - "@aws-sdk/types": "3.55.0", - "@aws-sdk/util-utf8-browser": "3.55.0", - "@aws-sdk/util-utf8-node": "3.55.0", - "tslib": "^2.3.1" + "@aws-sdk/types": "3.54.0", + "@aws-sdk/util-utf8-browser": "3.52.0", + "@aws-sdk/util-utf8-node": "3.52.0", + "tslib": "^2.3.0" } }, "node_modules/@aws-sdk/middleware-bucket-endpoint": { - "version": "3.75.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.75.0.tgz", - "integrity": "sha512-9YseY2OKPuZiiM/al8HOnc8eL3mVrvCrncmr2SChdEBJgZ5R51Qy/UrEtw7s6r+a5pgYCHJ6h6TWeOm7NnWpLQ==", + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.54.0.tgz", + "integrity": "sha512-4VC6zxDaveCnQD3eUJezSQ3Ikeq+MxRnvfcNhZytB20tYRy1PnR4jLoqjYkw5U1zstVRABbZdzlsWzZMe308ew==", "dependencies": { - "@aws-sdk/protocol-http": "3.58.0", - "@aws-sdk/types": "3.55.0", - "@aws-sdk/util-arn-parser": "3.55.0", - "@aws-sdk/util-config-provider": "3.55.0", - "tslib": "^2.3.1" + "@aws-sdk/protocol-http": "3.54.0", + "@aws-sdk/types": "3.54.0", + "@aws-sdk/util-arn-parser": "3.52.0", + "@aws-sdk/util-config-provider": "3.52.0", + "tslib": "^2.3.0" }, "engines": { "node": ">= 12.0.0" } }, "node_modules/@aws-sdk/middleware-content-length": { - "version": "3.58.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-content-length/-/middleware-content-length-3.58.0.tgz", - "integrity": "sha512-h/BypPkhjv2CpCUbXA8Fa2s7V2GPiz9l11XhYK+sKSuQvQ7Lbq6VhaKaLqfeD3gLVZHgJZSLGl2btdHV1qHNNA==", + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-content-length/-/middleware-content-length-3.54.0.tgz", + "integrity": "sha512-DTlZo00stFwFHyR+GTXxhYePzNbXm+aX5yYQUsrsY2J2HuSbADVgDDekJXbtOH36QBa0OJf7JKbWP8PZDxk1zg==", "dependencies": { - "@aws-sdk/protocol-http": "3.58.0", - "@aws-sdk/types": "3.55.0", - "tslib": "^2.3.1" + "@aws-sdk/protocol-http": "3.54.0", + "@aws-sdk/types": "3.54.0", + "tslib": "^2.3.0" }, "engines": { "node": ">= 12.0.0" } }, "node_modules/@aws-sdk/middleware-expect-continue": { - "version": "3.58.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.58.0.tgz", - "integrity": "sha512-nx6X6qLPwvbJrGoPxXSu4tsOek2eRnnjk78hhRUDfxFewpHJQLSPlyNKkXAo+C3syVALe6RJRmUYu5bShY6FfA==", + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.54.0.tgz", + "integrity": "sha512-6k4hoD7XqGDA8yq10AzF+iafgc+RyrPxr4kqzv50+hI5CZkPcl/vOAgS7iD+Y33dLITYuh+jzlpn7zlLwdOoqw==", "dependencies": { - "@aws-sdk/middleware-header-default": "3.58.0", - "@aws-sdk/protocol-http": "3.58.0", - "@aws-sdk/types": "3.55.0", - "tslib": "^2.3.1" + "@aws-sdk/middleware-header-default": "3.54.0", + "@aws-sdk/protocol-http": "3.54.0", + "@aws-sdk/types": "3.54.0", + "tslib": "^2.3.0" }, "engines": { "node": ">= 12.0.0" } }, "node_modules/@aws-sdk/middleware-flexible-checksums": { - "version": "3.72.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.72.0.tgz", - "integrity": "sha512-lrwTmpygp6bxGRi6kbMq+EtTW5nsts+B7Wj7MA8PBIQsKU06T2tYxjDBYOyHB1MiVhltlq+vebBvacT64KsbFA==", + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.54.0.tgz", + "integrity": "sha512-4+bUwQyYHtTbaJDaj2F7j2K/JUcYdKg169pKmpefZiXZVdfR2/WWwj7Wx7EI40rpPYHaMpSal9tIxz054LPYnw==", "dependencies": { "@aws-crypto/crc32": "2.0.0", "@aws-crypto/crc32c": "2.0.0", - "@aws-sdk/is-array-buffer": "3.55.0", - "@aws-sdk/protocol-http": "3.58.0", - "@aws-sdk/types": "3.55.0", - "tslib": "^2.3.1" + "@aws-sdk/is-array-buffer": "3.52.0", + "@aws-sdk/protocol-http": "3.54.0", + "@aws-sdk/types": "3.54.0", + "tslib": "^2.3.0" }, "engines": { "node": ">= 12.0.0" } }, "node_modules/@aws-sdk/middleware-header-default": { - "version": "3.58.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-header-default/-/middleware-header-default-3.58.0.tgz", - "integrity": "sha512-7F+CdLLauMmNbwFGYrE2pKsgTKY8G2PgazHmaE9s3FySEFcGPWmiEAG8sVImfZooj8gxGFQMLr97nanWjhSq2Q==", + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-header-default/-/middleware-header-default-3.54.0.tgz", + "integrity": "sha512-DvkdMJRAYrVsu6S92Z/fhSnj7ZFCNE3ertmIiGsukfMuGmzkuVKxqlUfo89xS3sOF3VY2nNOdNTCnVY4VZLSQQ==", "dependencies": { - "@aws-sdk/protocol-http": "3.58.0", - "@aws-sdk/types": "3.55.0", - "tslib": "^2.3.1" + "@aws-sdk/protocol-http": "3.54.0", + "@aws-sdk/types": "3.54.0", + "tslib": "^2.3.0" }, "engines": { "node": ">= 12.0.0" } }, "node_modules/@aws-sdk/middleware-host-header": { - "version": "3.58.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.58.0.tgz", - "integrity": "sha512-q/UKGcanm9e6DBRNN6UKhVqLvpRRdZWbmmPCeDNr4HqhCmgT6i1OvWdhAMOnT++hvCX8DpTsIXzNSlY6zWAxBg==", + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.54.0.tgz", + "integrity": "sha512-X+lvYc2ij1+9tfpvdGGb+/APvH7g/M9RYzIEkI/LvNjVCOA3f3rgzFftZZhD/zccRtrygsvXfeZhoDrHxFKl9g==", "dependencies": { - "@aws-sdk/protocol-http": "3.58.0", - "@aws-sdk/types": "3.55.0", - "tslib": "^2.3.1" + "@aws-sdk/protocol-http": "3.54.0", + "@aws-sdk/types": "3.54.0", + "tslib": "^2.3.0" }, "engines": { "node": ">= 12.0.0" } }, "node_modules/@aws-sdk/middleware-location-constraint": { - "version": "3.55.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.55.0.tgz", - "integrity": "sha512-OvCKwBFbl8Gbfk0HGX00pkdORJN8BPuH/O5l3+mOBWuwILPuckRP5WGnL+1HT/gu4hHS6h1lpxUrPxUOoeKIAg==", + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.54.0.tgz", + "integrity": "sha512-qwZR+GWlRoIFvvCt5ywmX3kV15KxrFbUxyAADCEJ4Q86ebEI3ux9mAHB6niOArRwtA5/wyvjRrOiYo/fTq7eLQ==", "dependencies": { - "@aws-sdk/types": "3.55.0", - "tslib": "^2.3.1" + "@aws-sdk/types": "3.54.0", + "tslib": "^2.3.0" }, "engines": { "node": ">= 12.0.0" } }, "node_modules/@aws-sdk/middleware-logger": { - "version": "3.55.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.55.0.tgz", - "integrity": "sha512-PtRbVrxEzDmeV9prBIP4/9or7R5Dj66mjbFSvNRGZ0n+UBfBFfVRfNrhQPNzQpfV9A3KVl9YyWCVXDSW+/rk9Q==", + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.54.0.tgz", + "integrity": "sha512-bDCQj8IBq1vrXRRrpqD+suJ8hKc4oxUXpRkWdsAD+HnWWRqHjsy0hdq5F8Rj1Abq7CsFtZ+rUXddl+KlmgZ3+A==", "dependencies": { - "@aws-sdk/types": "3.55.0", - "tslib": "^2.3.1" + "@aws-sdk/types": "3.54.0", + "tslib": "^2.3.0" }, "engines": { "node": ">= 12.0.0" } }, "node_modules/@aws-sdk/middleware-retry": { - "version": "3.75.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-retry/-/middleware-retry-3.75.0.tgz", - "integrity": "sha512-6aQqeasv31d3Iu9t5YyrbbG5m8VKvjTJ+Aeio976ImhZZEEHeh6Hl2i6yX1DvOALIZmFjjMFNHwJkNOVuxXrXg==", + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-retry/-/middleware-retry-3.54.0.tgz", + "integrity": "sha512-8kVzwxe0HQajeZWXzAp2XCkbiK8E8AZESfXvLyM34Xy2e8L8gdi1j90QLzpFk6WX6rz7hXBQG7utrCJkwXQxLA==", "dependencies": { - "@aws-sdk/protocol-http": "3.58.0", - "@aws-sdk/service-error-classification": "3.55.0", - "@aws-sdk/types": "3.55.0", - "@aws-sdk/util-middleware": "3.55.0", - "tslib": "^2.3.1", + "@aws-sdk/protocol-http": "3.54.0", + "@aws-sdk/service-error-classification": "3.54.0", + "@aws-sdk/types": "3.54.0", + "tslib": "^2.3.0", "uuid": "^8.3.2" }, "engines": { @@ -1483,540 +1484,539 @@ } }, "node_modules/@aws-sdk/middleware-sdk-s3": { - "version": "3.66.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.66.0.tgz", - "integrity": "sha512-4ACAdKAZkIjEK99UwoaKTrTGhS7qGqyLmjiGHlzR0ggMUUVmlep7EtcluImFtT6pi+ANVLDzuZGa+95MwGY/Qg==", + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.54.0.tgz", + "integrity": "sha512-xESksyOVCuDkMPC8mEqrInnuBeJHLSVOfwIl/pGwzevc+Q5spO9FDUlNfhaEVOEoLqK21TUdZo4z/ElNN94m4w==", "dependencies": { - "@aws-sdk/protocol-http": "3.58.0", - "@aws-sdk/types": "3.55.0", - "@aws-sdk/util-arn-parser": "3.55.0", - "tslib": "^2.3.1" + "@aws-sdk/protocol-http": "3.54.0", + "@aws-sdk/signature-v4": "3.54.0", + "@aws-sdk/types": "3.54.0", + "@aws-sdk/util-arn-parser": "3.52.0", + "tslib": "^2.3.0" }, "engines": { "node": ">= 12.0.0" + }, + "peerDependencies": { + "@aws-sdk/signature-v4-crt": "^3.31.0" } }, "node_modules/@aws-sdk/middleware-sdk-sts": { - "version": "3.58.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.58.0.tgz", - "integrity": "sha512-HUz7MhcsSDDTGygOwL61l4voc0pZco06J3z06JjTX19D5XxcQ7hSCtkHHHz0oMb9M1himVSiEon2tjhjsnB99g==", + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.54.0.tgz", + "integrity": "sha512-4vOlG96fKgqmLMsguoKFdBkk2Fq8JttpgPts9d5Ox73+yQsa0VKrpLiD5OUPqgjGZcX2bilMKCAOBc2v3ESAHw==", "dependencies": { - "@aws-sdk/middleware-signing": "3.58.0", - "@aws-sdk/property-provider": "3.55.0", - "@aws-sdk/protocol-http": "3.58.0", - "@aws-sdk/signature-v4": "3.58.0", - "@aws-sdk/types": "3.55.0", - "tslib": "^2.3.1" + "@aws-sdk/middleware-signing": "3.54.0", + "@aws-sdk/property-provider": "3.54.0", + "@aws-sdk/protocol-http": "3.54.0", + "@aws-sdk/signature-v4": "3.54.0", + "@aws-sdk/types": "3.54.0", + "tslib": "^2.3.0" }, "engines": { "node": ">= 12.0.0" } }, "node_modules/@aws-sdk/middleware-serde": { - "version": "3.55.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-serde/-/middleware-serde-3.55.0.tgz", - "integrity": "sha512-NkEbTDrSZcC2NhuvfjXHKJEl0xgI2B5tMAwi/rMOq/TEnARwVUL9qAy+5lgeiPCqebiNllWatARrFgAaYf0VeA==", + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-serde/-/middleware-serde-3.54.0.tgz", + "integrity": "sha512-O89/5aOiNegBP6Mv+gPr22Zawz2zF2v1o8kwFv2s4PWDzpmvrdF2by6e2Uh9sKzfpcwEW7Wr8kDTwajampVjgA==", "dependencies": { - "@aws-sdk/types": "3.55.0", - "tslib": "^2.3.1" + "@aws-sdk/types": "3.54.0", + "tslib": "^2.3.0" }, "engines": { "node": ">= 12.0.0" } }, "node_modules/@aws-sdk/middleware-signing": { - "version": "3.58.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.58.0.tgz", - "integrity": "sha512-4FXubHB66GbhyZUlo6YPQoWpYfED15GNbEmHbJLSONzrVzZR3IkViSPLasDngVm1a050JqKuqNkFYGJBP4No/Q==", + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.54.0.tgz", + "integrity": "sha512-KYxmRDh7D6ysAezlsDf3cN2h6OjH66x3NUdgUmW+78nkN9tRvvJEjhmu6IOkPd4E1V9P3JOLbq6zVjDVU12WDQ==", "dependencies": { - "@aws-sdk/property-provider": "3.55.0", - "@aws-sdk/protocol-http": "3.58.0", - "@aws-sdk/signature-v4": "3.58.0", - "@aws-sdk/types": "3.55.0", - "tslib": "^2.3.1" + "@aws-sdk/property-provider": "3.54.0", + "@aws-sdk/protocol-http": "3.54.0", + "@aws-sdk/signature-v4": "3.54.0", + "@aws-sdk/types": "3.54.0", + "tslib": "^2.3.0" }, "engines": { "node": ">= 12.0.0" } }, "node_modules/@aws-sdk/middleware-ssec": { - "version": "3.55.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.55.0.tgz", - "integrity": "sha512-HTdA23hksOphQe0TmYORsa/kMNnKRGbdh0VJcsDGHQScJXzJ+C//THwfcoklff0XZfC+vGh93PECBWqixMELZw==", + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.54.0.tgz", + "integrity": "sha512-wNQR5pRoN4wJq2IcFOXhRxvars4uWgdUnBQcJ5UDSJhUPwVDA4m+M83Q/54GWRHT+SVsobuNTmTeFnCbgsIq3A==", "dependencies": { - "@aws-sdk/types": "3.55.0", - "tslib": "^2.3.1" + "@aws-sdk/types": "3.54.0", + "tslib": "^2.3.0" }, "engines": { "node": ">= 12.0.0" } }, "node_modules/@aws-sdk/middleware-stack": { - "version": "3.55.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-stack/-/middleware-stack-3.55.0.tgz", - "integrity": "sha512-ouD+wFz8W2R0ZQ8HrbhgN8tg1jyINEg9lPEEXY79w1Q5sf94LJ90XKAMVk02rw3dJalUWjLHf0OQe1/qxZfHyA==", + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-stack/-/middleware-stack-3.54.0.tgz", + "integrity": "sha512-38iit8VJ7jhFlMdwdDESEJOwbi8wIjF7Q1FOFIoCvURLGkTDQdabGXKwcFVfRuceLO+LJxWP3l0z0c10uZa6gQ==", "dependencies": { - "tslib": "^2.3.1" + "tslib": "^2.3.0" }, "engines": { "node": ">= 12.0.0" } }, "node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.58.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.58.0.tgz", - "integrity": "sha512-1c69bIWM63JwXijXvb9IWwcwQ/gViKMZ1lhxv52NvdG5VSxWXXsFJ2jETEXZoAypwT97Hmf3xo9SYuaHcKoq+g==", + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.54.0.tgz", + "integrity": "sha512-831GP5EBJdDxyq93dpgBZUwBWnZAID2aFvE/VN8c5X8U00ZT7GRt9cy5EL2b6AQN3Z4uWL1ZVDVkYmRAHs33Lg==", "dependencies": { - "@aws-sdk/protocol-http": "3.58.0", - "@aws-sdk/types": "3.55.0", - "tslib": "^2.3.1" + "@aws-sdk/protocol-http": "3.54.0", + "@aws-sdk/types": "3.54.0", + "tslib": "^2.3.0" }, "engines": { "node": ">= 12.0.0" } }, "node_modules/@aws-sdk/node-config-provider": { - "version": "3.75.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/node-config-provider/-/node-config-provider-3.75.0.tgz", - "integrity": "sha512-eSR0HtqBwRp71d7Cp9fWzC+jtM5sDBcnp4vIQDIBPnHVzvMFwo2YPG0eF5SoYUgboHasHW8VGx9dUsKJ/qTcOg==", + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/node-config-provider/-/node-config-provider-3.54.0.tgz", + "integrity": "sha512-Q2a1vyoZa2UX/dItP3cqNdLUoTGdIY4hD5nA+mTg5mKlOWci35v8Rypr40tQz4ZwiDF6QQmK0tvD3bBUULm0wA==", "dependencies": { - "@aws-sdk/property-provider": "3.55.0", - "@aws-sdk/shared-ini-file-loader": "3.75.0", - "@aws-sdk/types": "3.55.0", - "tslib": "^2.3.1" + "@aws-sdk/property-provider": "3.54.0", + "@aws-sdk/shared-ini-file-loader": "3.52.0", + "@aws-sdk/types": "3.54.0", + "tslib": "^2.3.0" }, "engines": { "node": ">= 12.0.0" } }, "node_modules/@aws-sdk/node-http-handler": { - "version": "3.76.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/node-http-handler/-/node-http-handler-3.76.0.tgz", - "integrity": "sha512-zPWPoaFC5n71efREtpSF1seijZ2E+Wsxz56EK3G55BY7WcSlLgdPXtOS1GXCFtq9Ce6gNALhYvaIryITrbtWsw==", + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/node-http-handler/-/node-http-handler-3.54.0.tgz", + "integrity": "sha512-g6+IXe4FCMrx4vrY73yvFNAUsBJ1vhjDshUCihBv5tEXsd45/MqmON/VWYoaQZts0m2wx2fKsdoDKSIZZY7AiQ==", "dependencies": { - "@aws-sdk/abort-controller": "3.55.0", - "@aws-sdk/protocol-http": "3.58.0", - "@aws-sdk/querystring-builder": "3.55.0", - "@aws-sdk/types": "3.55.0", - "tslib": "^2.3.1" + "@aws-sdk/abort-controller": "3.54.0", + "@aws-sdk/protocol-http": "3.54.0", + "@aws-sdk/querystring-builder": "3.54.0", + "@aws-sdk/types": "3.54.0", + "tslib": "^2.3.0" }, "engines": { "node": ">= 12.0.0" } }, "node_modules/@aws-sdk/property-provider": { - "version": "3.55.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/property-provider/-/property-provider-3.55.0.tgz", - "integrity": "sha512-o7cKFJSHq5WOhwPsspYrzNto35oKKZvESZuWDtLxaZKSI6l7zpA366BI4kDG6Tc9i2+teV553MbxyZ9eya5A8g==", + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/property-provider/-/property-provider-3.54.0.tgz", + "integrity": "sha512-8e+KXskwOhXF0MIdIcZLFsOTfMVGp41Y6kywgewQaHkZoMzZ6euRziyWNgnshUE794tjxxol9resudSUehPjIw==", "dependencies": { - "@aws-sdk/types": "3.55.0", - "tslib": "^2.3.1" + "@aws-sdk/types": "3.54.0", + "tslib": "^2.3.0" }, "engines": { "node": ">= 12.0.0" } }, "node_modules/@aws-sdk/protocol-http": { - "version": "3.58.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/protocol-http/-/protocol-http-3.58.0.tgz", - "integrity": "sha512-0yFFRPbR+CCa9eOQBBQ2qtrIDLYqSMN0y7G4iqVM8wQdIw7n3QK1PsTI3RNPGJ3Oi2krFTw5uUKqQQZPZEBuVQ==", + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/protocol-http/-/protocol-http-3.54.0.tgz", + "integrity": "sha512-v4CgQ2mBzEwNubM1duWP3Unu98EPNF2BuKWe4wT1HNG2MTkODS56fsgVT6sGGXS9nB/reEzB+3bXO5FS8+3SUg==", "dependencies": { - "@aws-sdk/types": "3.55.0", - "tslib": "^2.3.1" + "@aws-sdk/types": "3.54.0", + "tslib": "^2.3.0" }, "engines": { "node": ">= 12.0.0" } }, "node_modules/@aws-sdk/querystring-builder": { - "version": "3.55.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-builder/-/querystring-builder-3.55.0.tgz", - "integrity": "sha512-/ZAXNipt9nRR8k+eowwukE/YjXnQ49p5w/MkaQxsBk3IuIf7MAcgVg8glHr0igH84GfUQ7ZVP8v+G2S3tKUG+Q==", + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-builder/-/querystring-builder-3.54.0.tgz", + "integrity": "sha512-7rs2gGPpiIHntbYGPFkxkXQkSK7uVBqlWRl0m6fNngUEz2n8jRxytB6LlALMHbXeXh28+zzq0VxbAwqAAUQ4oQ==", "dependencies": { - "@aws-sdk/types": "3.55.0", - "@aws-sdk/util-uri-escape": "3.55.0", - "tslib": "^2.3.1" + "@aws-sdk/types": "3.54.0", + "@aws-sdk/util-uri-escape": "3.52.0", + "tslib": "^2.3.0" }, "engines": { "node": ">= 12.0.0" } }, "node_modules/@aws-sdk/querystring-parser": { - "version": "3.55.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-parser/-/querystring-parser-3.55.0.tgz", - "integrity": "sha512-e+2FLgo+eDx7oh7ap5HngN9XSVMxredAVztLHxCcSN0lFHHHzMa8b2SpXbaowUxQHh7ziymSqvOrPYFQ71Filg==", + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-parser/-/querystring-parser-3.54.0.tgz", + "integrity": "sha512-OZ4mRJ9rXgBskPBSoXBw8tV4kfNK0f/pP55qE1eZIcQ1z7EvVz4NjldgqMfscT20Cx5VzUbus3q9EPcV+HbR1w==", "dependencies": { - "@aws-sdk/types": "3.55.0", - "tslib": "^2.3.1" + "@aws-sdk/types": "3.54.0", + "tslib": "^2.3.0" }, "engines": { "node": ">= 12.0.0" } }, "node_modules/@aws-sdk/s3-request-presigner": { - "version": "3.76.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/s3-request-presigner/-/s3-request-presigner-3.76.0.tgz", - "integrity": "sha512-dG4JjTtYdrLwLEDznKfKqVG+/KKQY3DRl2E4G3Vi+CsV+Sw5pb3MydphP/is4M+k4TLJVLCj7FYdWBx/C2F1aQ==", + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/s3-request-presigner/-/s3-request-presigner-3.54.0.tgz", + "integrity": "sha512-xPIahWW1brKu3Cnphx/pYAB3nRAyAZH4Zh7n1zm9XUsqqsBc4ZkIKqC5tDvJ/lBOLrqks8oSh2wpckfCwO9EpA==", "dependencies": { - "@aws-sdk/middleware-sdk-s3": "3.66.0", - "@aws-sdk/protocol-http": "3.58.0", - "@aws-sdk/signature-v4-multi-region": "3.66.0", - "@aws-sdk/smithy-client": "3.72.0", - "@aws-sdk/types": "3.55.0", - "@aws-sdk/util-create-request": "3.72.0", - "@aws-sdk/util-format-url": "3.58.0", - "tslib": "^2.3.1" + "@aws-sdk/middleware-sdk-s3": "3.54.0", + "@aws-sdk/protocol-http": "3.54.0", + "@aws-sdk/signature-v4": "3.54.0", + "@aws-sdk/smithy-client": "3.54.0", + "@aws-sdk/types": "3.54.0", + "@aws-sdk/util-create-request": "3.54.0", + "@aws-sdk/util-format-url": "3.54.0", + "tslib": "^2.3.0" }, "engines": { "node": ">= 12.0.0" } }, "node_modules/@aws-sdk/service-error-classification": { - "version": "3.55.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/service-error-classification/-/service-error-classification-3.55.0.tgz", - "integrity": "sha512-HdjnDyarsa1Avq1MJurkLyEe9c3eRa76dPmK4TmRGgwJ+tInEzGHL0rBW7V8xBK+PDF+fJQ71hvm8jPYmzvBwQ==", + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/service-error-classification/-/service-error-classification-3.54.0.tgz", + "integrity": "sha512-XWANvjJJZNqsYhGmccSSuhsvINIUX1KckfDmvYtUR6cKM6nM6QWOg/QJeTFageTEpruJ5TqzW9vY414bIE883w==", "engines": { "node": ">= 12.0.0" } }, "node_modules/@aws-sdk/shared-ini-file-loader": { - "version": "3.75.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/shared-ini-file-loader/-/shared-ini-file-loader-3.75.0.tgz", - "integrity": "sha512-xNeBKoEqBWTdlSNhd0oA0ToA915zvKuAYHppOqJlAHpXQhjZN+Jtz31Rlor/EKZbHSMmZX7YzYMHhYWtY8aeCA==", + "version": "3.52.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/shared-ini-file-loader/-/shared-ini-file-loader-3.52.0.tgz", + "integrity": "sha512-tALb8u8IVcI4pT7yFZpl4O6kgeY5EAXyphZoRPgQSCDhmEyFUIi/sXbCN8HQiHjnHdWfXdaNE1YsZcW3GpcuoQ==", "dependencies": { - "tslib": "^2.3.1" + "tslib": "^2.3.0" }, "engines": { "node": ">= 12.0.0" } }, "node_modules/@aws-sdk/signature-v4": { - "version": "3.58.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4/-/signature-v4-3.58.0.tgz", - "integrity": "sha512-flEo8p3XkzWoBDqnIUQre4jLuT5aLnmfQNI8c2uSjyJ3OBxpJ0iS1cDu3E++d1/pN6Q8o0KOmr2ypHeiyBOujw==", + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4/-/signature-v4-3.54.0.tgz", + "integrity": "sha512-22Bf8uQ0Q/I7WpLFU88G7WVpRw6tWUX9Ggr0Z++81uZF5YCPbWDNtFDHitoERaRc/M4vUMxNuTsX/JWOR3fFPg==", "dependencies": { - "@aws-sdk/is-array-buffer": "3.55.0", - "@aws-sdk/types": "3.55.0", - "@aws-sdk/util-hex-encoding": "3.58.0", - "@aws-sdk/util-middleware": "3.55.0", - "@aws-sdk/util-uri-escape": "3.55.0", - "tslib": "^2.3.1" + "@aws-sdk/is-array-buffer": "3.52.0", + "@aws-sdk/types": "3.54.0", + "@aws-sdk/util-hex-encoding": "3.52.0", + "@aws-sdk/util-uri-escape": "3.52.0", + "tslib": "^2.3.0" }, "engines": { "node": ">= 12.0.0" } }, - "node_modules/@aws-sdk/signature-v4-multi-region": { - "version": "3.66.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.66.0.tgz", - "integrity": "sha512-Akvc8G9Del2+umg0R/5Gc/PWgQwbxxTXdnm6YTHtDzvyPPiYWBs6au6WqJQqcqk07gcQV67MLVqFFhnFuLlcVg==", + "node_modules/@aws-sdk/signature-v4-crt": { + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-crt/-/signature-v4-crt-3.54.0.tgz", + "integrity": "sha512-3qKbc/i9PkBRyADIRm6QYIos/tjaYpVnqLWGngHivzF75yG2ZyWFIVNXD5KGIDm+UWu0ZI41IGfxVEoj5Dgc6A==", + "peer": true, "dependencies": { - "@aws-sdk/protocol-http": "3.58.0", - "@aws-sdk/signature-v4": "3.58.0", - "@aws-sdk/types": "3.55.0", - "@aws-sdk/util-arn-parser": "3.55.0", - "tslib": "^2.3.1" + "@aws-sdk/is-array-buffer": "3.52.0", + "@aws-sdk/querystring-parser": "3.54.0", + "@aws-sdk/signature-v4": "3.54.0", + "@aws-sdk/util-hex-encoding": "3.52.0", + "@aws-sdk/util-uri-escape": "3.52.0", + "aws-crt": "^1.9.7", + "tslib": "^2.3.0" }, "engines": { "node": ">= 12.0.0" - }, - "peerDependencies": { - "@aws-sdk/signature-v4-crt": "^3.66.0" - }, - "peerDependenciesMeta": { - "@aws-sdk/signature-v4-crt": { - "optional": true - } } }, "node_modules/@aws-sdk/smithy-client": { - "version": "3.72.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/smithy-client/-/smithy-client-3.72.0.tgz", - "integrity": "sha512-eQ2pEzxtS1Vz1XyNKzG4Z+mtfwRzcAs4FUQP0wrrYVJMsIdI0X4vvro8gYGoBbQtOz65uY3XqQdLuXX/SabTQg==", + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/smithy-client/-/smithy-client-3.54.0.tgz", + "integrity": "sha512-zdYN5pwhJU7x8qZKWTZPsFD5YQkDt6kyCNRsNjSWJ0ON4R3wUlFIwT3YzeQ5nMOTD86cVIm1n2RaSTYHwelFXg==", "dependencies": { - "@aws-sdk/middleware-stack": "3.55.0", - "@aws-sdk/types": "3.55.0", - "tslib": "^2.3.1" + "@aws-sdk/middleware-stack": "3.54.0", + "@aws-sdk/types": "3.54.0", + "tslib": "^2.3.0" }, "engines": { "node": ">= 12.0.0" } }, "node_modules/@aws-sdk/types": { - "version": "3.55.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.55.0.tgz", - "integrity": "sha512-wrDZjuy1CVAYxDCbm3bWQIKMGfNs7XXmG0eG4858Ixgqmq2avsIn5TORy8ynBxcXn9aekV/+tGEQ7BBSYzIVNQ==", + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.54.0.tgz", + "integrity": "sha512-Jp2MHXnrM0pk0RIoSl5AHFm7TBk+7b8HTIcQ2X/6kGwwwnWw9qlg9ZFziegJTNTLJ4iVgZjz/yMlEvgrp7z9CA==", "engines": { "node": ">= 12.0.0" } }, "node_modules/@aws-sdk/url-parser": { - "version": "3.55.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/url-parser/-/url-parser-3.55.0.tgz", - "integrity": "sha512-qrTwN5xIgTLreqLnZ+x3cAudjNKfxi6srW1H/px2mk4lb2U9B4fpGjZ6VU+XV8U2kR+YlT8J6Jo5iwuVGfC91A==", + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/url-parser/-/url-parser-3.54.0.tgz", + "integrity": "sha512-DJWdlkXq3rsOydxwR9htPUW4QXhmo75Hybg96D3F2uPUvPCm8gJFngXp/9hW1OYcgfNu13HXqUy+t6V23cC7Iw==", "dependencies": { - "@aws-sdk/querystring-parser": "3.55.0", - "@aws-sdk/types": "3.55.0", - "tslib": "^2.3.1" + "@aws-sdk/querystring-parser": "3.54.0", + "@aws-sdk/types": "3.54.0", + "tslib": "^2.3.0" } }, "node_modules/@aws-sdk/util-arn-parser": { - "version": "3.55.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.55.0.tgz", - "integrity": "sha512-76KJxp4MRWufHYWys7DFl64znr5yeJ3AIQNAPCKKw1sP0hzO7p6Kx0PaJnw9x+CPSzOrT4NbuApL6/srYhKDGg==", + "version": "3.52.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.52.0.tgz", + "integrity": "sha512-mMsoYJ70+BGkVpdfQbu942v4fAGzx+pIL8+QnQhzUmcU0HbNkI0vYliMWfzz7ka9CHgbijUI/ANKA319zgKtvA==", "dependencies": { - "tslib": "^2.3.1" + "tslib": "^2.3.0" }, "engines": { "node": ">= 12.0.0" } }, "node_modules/@aws-sdk/util-base64-browser": { - "version": "3.58.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-base64-browser/-/util-base64-browser-3.58.0.tgz", - "integrity": "sha512-0ebsXIZNpu/fup9OgsFPnRKfCFbuuI9PPRzvP6twzLxUB0c/aix6Co7LGHFKcRKHZdaykoJMXArf8eHj2Nzv1Q==", + "version": "3.52.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-base64-browser/-/util-base64-browser-3.52.0.tgz", + "integrity": "sha512-xjv/cQ4goWXAiGEC/AIL/GtlHg4p4RkQKs6/zxn9jOxo1OnbppLMJ0LjCtv4/JVYIVGHrx0VJ8Exyod7Ln+NeA==", "dependencies": { - "tslib": "^2.3.1" + "tslib": "^2.3.0" } }, "node_modules/@aws-sdk/util-base64-node": { - "version": "3.55.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-base64-node/-/util-base64-node-3.55.0.tgz", - "integrity": "sha512-UQ/ZuNoAc8CFMpSiRYmevaTsuRKzLwulZTnM8LNlIt9Wx1tpNvqp80cfvVj7yySKROtEi20wq29h31dZf1eYNQ==", + "version": "3.52.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-base64-node/-/util-base64-node-3.52.0.tgz", + "integrity": "sha512-V96YIXBuIiVu7Zk72Y9dly7Io9cYOT30Hjf77KAkBeizlFgT5gWklWYGcytPY8FxLuEy4dPLeHRmgwQnlDwgPA==", "dependencies": { - "@aws-sdk/util-buffer-from": "3.55.0", - "tslib": "^2.3.1" + "@aws-sdk/util-buffer-from": "3.52.0", + "tslib": "^2.3.0" }, "engines": { "node": ">= 12.0.0" } }, "node_modules/@aws-sdk/util-body-length-browser": { - "version": "3.55.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-browser/-/util-body-length-browser-3.55.0.tgz", - "integrity": "sha512-Ei2OCzXQw5N6ZkTMZbamUzc1z+z1R1Ja5tMEagz5BxuX4vWdBObT+uGlSzL8yvTbjoPjnxWA2aXyEqaUP3JS8Q==", + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-browser/-/util-body-length-browser-3.54.0.tgz", + "integrity": "sha512-hnY9cXbKWJ2Fjb4bK35sFdD4vK+sFe59JtxxI336yYzANulc462LU/J1RgONXYBW60d9iwJ7U+S+9oTJrEH6WQ==", "dependencies": { - "tslib": "^2.3.1" + "tslib": "^2.3.0" } }, "node_modules/@aws-sdk/util-body-length-node": { - "version": "3.55.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-node/-/util-body-length-node-3.55.0.tgz", - "integrity": "sha512-lU1d4I+9wJwydduXs0SxSfd+mHKjxeyd39VwOv6i2KSwWkPbji9UQqpflKLKw+r45jL7+xU/zfeTUg5Tt/3Gew==", + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-node/-/util-body-length-node-3.54.0.tgz", + "integrity": "sha512-BBQB3kqHqHQp2GAINJGuse9JBM7hfU0tMp9rfw0nym4C/VRooiJVrIb28tKseLtd7nihXvsZXPvEc2jQBe1Thg==", "dependencies": { - "tslib": "^2.3.1" + "tslib": "^2.3.0" }, "engines": { "node": ">= 12.0.0" } }, "node_modules/@aws-sdk/util-buffer-from": { - "version": "3.55.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-buffer-from/-/util-buffer-from-3.55.0.tgz", - "integrity": "sha512-uVzKG1UgvnV7XX2FPTylBujYMKBPBaq/qFBxfl0LVNfrty7YjpfieQxAe6yRLD+T0Kir/WDQwGvYC+tOYG3IGA==", + "version": "3.52.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-buffer-from/-/util-buffer-from-3.52.0.tgz", + "integrity": "sha512-hsG0lMlHjJUFoXIy59QLn6x4QU/vp/e0t3EjdD0t8aymB9iuJ43UeLjYTZdrOgtbWb8MXEF747vwg+P6n+4Lxw==", "dependencies": { - "@aws-sdk/is-array-buffer": "3.55.0", - "tslib": "^2.3.1" + "@aws-sdk/is-array-buffer": "3.52.0", + "tslib": "^2.3.0" }, "engines": { "node": ">= 12.0.0" } }, "node_modules/@aws-sdk/util-config-provider": { - "version": "3.55.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-config-provider/-/util-config-provider-3.55.0.tgz", - "integrity": "sha512-30dzofQQfx6tp1jVZkZ0DGRsT0wwC15nEysKRiAcjncM64A0Cm6sra77d0os3vbKiKoPCI/lMsFr4o3533+qvQ==", + "version": "3.52.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-config-provider/-/util-config-provider-3.52.0.tgz", + "integrity": "sha512-1wonBNkOOLJpMZnz2Kn69ToFgSoTTyGzJInir8WC5sME3zpkb5j41kTuEVbImNJhVv9MKjmGYrMeZbBVniLRPw==", "dependencies": { - "tslib": "^2.3.1" + "tslib": "^2.3.0" }, "engines": { "node": ">= 12.0.0" } }, "node_modules/@aws-sdk/util-create-request": { - "version": "3.72.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-create-request/-/util-create-request-3.72.0.tgz", - "integrity": "sha512-SRxo1RWQ9e7QonuIH8oNEiOJTtasOtYNRD5QYwbJKhNkB4Z6AaE00V28AjrdS/+rMOcb0DKugXZ8Nhbd+n+K0g==", + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-create-request/-/util-create-request-3.54.0.tgz", + "integrity": "sha512-Sa+t75YQnMXXcCruLBvKZ6B1DzyGAod1PZT+iDHwDDobDsUVG3Cjov9gJepYAH2EEmvZa9f0IT+W6lvGv3uL4w==", "dependencies": { - "@aws-sdk/middleware-stack": "3.55.0", - "@aws-sdk/smithy-client": "3.72.0", - "@aws-sdk/types": "3.55.0", - "tslib": "^2.3.1" + "@aws-sdk/middleware-stack": "3.54.0", + "@aws-sdk/smithy-client": "3.54.0", + "@aws-sdk/types": "3.54.0", + "tslib": "^2.3.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/@aws-sdk/util-credentials": { + "version": "3.53.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-credentials/-/util-credentials-3.53.0.tgz", + "integrity": "sha512-XP/3mYOmSn5KpWv+PnBTP2UExXb+hx1ugbH4Gkveshdq9KBlVnpV5eVgIwSAnKBsplScfsNMJ5EOtHjz5Cvu5A==", + "dependencies": { + "@aws-sdk/shared-ini-file-loader": "3.52.0", + "tslib": "^2.3.0" }, "engines": { "node": ">= 12.0.0" } }, "node_modules/@aws-sdk/util-defaults-mode-browser": { - "version": "3.72.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-browser/-/util-defaults-mode-browser-3.72.0.tgz", - "integrity": "sha512-xeoh4jdq+tpZWDwGeXeoAQI+rZaCBEicjumBcqfzkRFE3DyaeyPHn3hiKGSR13R+P6Uf86aqaRNmWAeZZjeE0w==", + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-browser/-/util-defaults-mode-browser-3.54.0.tgz", + "integrity": "sha512-9QnRbTsD2MuEr59vaPAbC95ba7druMFRSZjpwc3L7U9zpsJruNDaL5aAmV0gCAIPZg7eSaJmipyWr0AvwwgroQ==", "dependencies": { - "@aws-sdk/property-provider": "3.55.0", - "@aws-sdk/types": "3.55.0", + "@aws-sdk/property-provider": "3.54.0", + "@aws-sdk/types": "3.54.0", "bowser": "^2.11.0", - "tslib": "^2.3.1" + "tslib": "^2.3.0" }, "engines": { "node": ">= 10.0.0" } }, "node_modules/@aws-sdk/util-defaults-mode-node": { - "version": "3.75.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-node/-/util-defaults-mode-node-3.75.0.tgz", - "integrity": "sha512-zR53YinMCSVcdXumxBMdnZANl5ld0riuEoDwgKIivag/5xOAp/r+PziYvaMDbIvdqtkwwMBXf+WAc9jb0/D7sg==", + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-node/-/util-defaults-mode-node-3.54.0.tgz", + "integrity": "sha512-kHFgEyAWCaR5uSmRwyVbWQnjiNib3EJSAG9y7bwMIHSOK/6TVOXGlb1KIoO6ZtLE1FZFlS55FIRFeOPmIFFZbA==", "dependencies": { - "@aws-sdk/config-resolver": "3.75.0", - "@aws-sdk/credential-provider-imds": "3.75.0", - "@aws-sdk/node-config-provider": "3.75.0", - "@aws-sdk/property-provider": "3.55.0", - "@aws-sdk/types": "3.55.0", - "tslib": "^2.3.1" + "@aws-sdk/config-resolver": "3.54.0", + "@aws-sdk/credential-provider-imds": "3.54.0", + "@aws-sdk/node-config-provider": "3.54.0", + "@aws-sdk/property-provider": "3.54.0", + "@aws-sdk/types": "3.54.0", + "tslib": "^2.3.0" }, "engines": { "node": ">= 10.0.0" } }, "node_modules/@aws-sdk/util-format-url": { - "version": "3.58.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-format-url/-/util-format-url-3.58.0.tgz", - "integrity": "sha512-nhxomsG+OIBqpIyc2AU88J3+dTap0H5R1D2lNAsSZk07kuu2B1H4qAXIlWPkXyxTi9uL9aykBMuCosECD062NA==", + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-format-url/-/util-format-url-3.54.0.tgz", + "integrity": "sha512-nnrXT0dQc+eRWJPgkqDK91NEluTFU9Tqs/LhIlIq+6Z8BELTN24lCi9feUKtw1s3a5ucUSs2unYyfHnl35PeeQ==", "dependencies": { - "@aws-sdk/querystring-builder": "3.55.0", - "@aws-sdk/types": "3.55.0", - "tslib": "^2.3.1" + "@aws-sdk/querystring-builder": "3.54.0", + "@aws-sdk/types": "3.54.0", + "tslib": "^2.3.0" }, "engines": { "node": ">= 12.0.0" } }, "node_modules/@aws-sdk/util-hex-encoding": { - "version": "3.58.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-hex-encoding/-/util-hex-encoding-3.58.0.tgz", - "integrity": "sha512-Rl+jXUzk/FJkOLYfUVYPhKa2aUmTpeobRP31l8IatQltSzDgLyRHO35f6UEs7Ztn5s1jbu/POatLAZ2WjbgVyg==", + "version": "3.52.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-hex-encoding/-/util-hex-encoding-3.52.0.tgz", + "integrity": "sha512-YYMZg8odn/hBURgL/w82ay2mvPqXHMdujlSndT1ddUSTRoZX67N3hfYYf36nOalDOjNcanIvFHe4Fe8nw+8JiA==", "dependencies": { - "tslib": "^2.3.1" + "tslib": "^2.3.0" }, "engines": { "node": ">= 12.0.0" } }, "node_modules/@aws-sdk/util-locate-window": { - "version": "3.55.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.55.0.tgz", - "integrity": "sha512-0sPmK2JaJE2BbTcnvybzob/VrFKCXKfN4CUKcvn0yGg/me7Bz+vtzQRB3Xp+YSx+7OtWxzv63wsvHoAnXvgxgg==", + "version": "3.52.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.52.0.tgz", + "integrity": "sha512-l10U2cLko6070A9DYLJG4NMtwYH8JBG2J/E+RH8uY3lad2o6fGEIkJU0jQbWbUeHYLG3IWuCxT47V4gxYrFj7g==", "dependencies": { - "tslib": "^2.3.1" - }, - "engines": { - "node": ">= 12.0.0" - } - }, - "node_modules/@aws-sdk/util-middleware": { - "version": "3.55.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-middleware/-/util-middleware-3.55.0.tgz", - "integrity": "sha512-82fW2XV+rUalv8lkd4VlhpPp6xnXO5n9sckMp1N+TrQ+p8eqxqT0+o8n1/6s9Qsnkw64Y3m6+EfCdc8/uFOY2g==", - "dependencies": { - "tslib": "^2.3.1" + "tslib": "^2.3.0" }, "engines": { "node": ">= 12.0.0" } }, "node_modules/@aws-sdk/util-stream-browser": { - "version": "3.55.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-stream-browser/-/util-stream-browser-3.55.0.tgz", - "integrity": "sha512-3f/zQsAqexJpKssCL0adTjG8WO+NPQ63E3TingyKpnCnHQPEnqPdya5I5OLGzZ0WR0iUWRtpuW0MtuDabyLDWw==", + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-stream-browser/-/util-stream-browser-3.54.0.tgz", + "integrity": "sha512-KVBRQcTie9Q231pdbO4gzGxHG8wNomGic3bHDnwfVdE+tq1Pbi8xNgUelmmd/uZvgMf8awuNN8OHzkex06HAHQ==", "dependencies": { - "@aws-sdk/types": "3.55.0", - "tslib": "^2.3.1" + "@aws-sdk/types": "3.54.0", + "tslib": "^2.3.0" } }, "node_modules/@aws-sdk/util-stream-node": { - "version": "3.55.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-stream-node/-/util-stream-node-3.55.0.tgz", - "integrity": "sha512-brCK3iENvXEL7BK5eDAdkZ2VuBSvXj7DH9EQezxl4Ntrj1lvb+McOk9WoU/o7yzE7A/bzEJEoNQAPi+VPNbb/w==", + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-stream-node/-/util-stream-node-3.54.0.tgz", + "integrity": "sha512-h3kpLMYzGgPkCIq0sLlE70zAt75C6wcbZm4gPh5iN8KRmmhpktqKpBami9J5fY6cBPC5ZlEmv5iDdZrI90Imrw==", "dependencies": { - "@aws-sdk/types": "3.55.0", - "tslib": "^2.3.1" + "@aws-sdk/types": "3.54.0", + "tslib": "^2.3.0" }, "engines": { "node": ">= 12.0.0" } }, "node_modules/@aws-sdk/util-uri-escape": { - "version": "3.55.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-uri-escape/-/util-uri-escape-3.55.0.tgz", - "integrity": "sha512-mmdDLUpFCN2nkfwlLdOM54lTD528GiGSPN1qb8XtGLgZsJUmg3uJSFIN2lPeSbEwJB3NFjVas/rnQC48i7mV8w==", + "version": "3.52.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-uri-escape/-/util-uri-escape-3.52.0.tgz", + "integrity": "sha512-W9zw5tE8syjg17jiCYtyF99F0FgDIekQdLg+tQGobw9EtCxlUdg48UYhifPfnjvVyADRX2ntclHF9NmhusOQaQ==", "dependencies": { - "tslib": "^2.3.1" + "tslib": "^2.3.0" }, "engines": { "node": ">= 12.0.0" } }, "node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.58.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.58.0.tgz", - "integrity": "sha512-aJpqCvT09giJRg5xFTBDBRAVF0k0yq3OEf6UTuiOVf5azlL2MGp6PJ/xkJp9Z06PuQQkwBJ/2nIQZemo02a5Sw==", + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.54.0.tgz", + "integrity": "sha512-pU5KL1Nnlc1igeED2R44k9GEIxlLBhwmUGIw8/Emfm8xAlGOX4NsVSfHK9EpJQth0z5ZJ4Lni6S5+nW4V16yLw==", "dependencies": { - "@aws-sdk/types": "3.55.0", + "@aws-sdk/types": "3.54.0", "bowser": "^2.11.0", - "tslib": "^2.3.1" + "tslib": "^2.3.0" } }, "node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.75.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.75.0.tgz", - "integrity": "sha512-tUKI/WIhPjGwIxFZIApWz64/JwJwwzt55Rxp8kv0cP/rYVjfCZafokUKLRwJaOBWi79luvNKV7V6lXY7RjT61A==", + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.54.0.tgz", + "integrity": "sha512-euKoYk1TfyV9XlJyAlGWdYqhQ5B4COwBxsV9OpwiAINUFm91NSv6uavFC/ZZQBXRks6j9pHDAXeXu7bHVolvlA==", "dependencies": { - "@aws-sdk/node-config-provider": "3.75.0", - "@aws-sdk/types": "3.55.0", - "tslib": "^2.3.1" + "@aws-sdk/node-config-provider": "3.54.0", + "@aws-sdk/types": "3.54.0", + "tslib": "^2.3.0" }, "engines": { "node": ">= 12.0.0" } }, "node_modules/@aws-sdk/util-utf8-browser": { - "version": "3.55.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.55.0.tgz", - "integrity": "sha512-ljzqJcyjfJpEVSIAxwtIS8xMRUly84BdjlBXyp6cu4G8TUufgjNS31LWdhyGhgmW5vYBNr+LTz0Kwf6J+ou7Ug==", + "version": "3.52.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.52.0.tgz", + "integrity": "sha512-LuOMa9ajWu5fQuYkmvTlQZfHaITkSle+tM/vhbU4JquRN44VUKACjRGT7UEhoU3lCL1BD0JFGMQGHI+5Mmuwfg==", "dependencies": { - "tslib": "^2.3.1" + "tslib": "^2.3.0" } }, "node_modules/@aws-sdk/util-utf8-node": { - "version": "3.55.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-node/-/util-utf8-node-3.55.0.tgz", - "integrity": "sha512-FsFm7GFaC7j0tlPEm/ri8bU2QCwFW5WKjxUg8lm1oWaxplCpKGUsmcfPJ4sw58GIoyoGu4QXBK60oCWosZYYdQ==", + "version": "3.52.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-node/-/util-utf8-node-3.52.0.tgz", + "integrity": "sha512-fujr7zeobZ2y5nnOnQZrCPPc+lCAhtNF/LEVslsQfd+AQ0bYWiosrKNetodQVWlfh10E2+i6/5g+1SBJ5kjsLw==", "dependencies": { - "@aws-sdk/util-buffer-from": "3.55.0", - "tslib": "^2.3.1" + "@aws-sdk/util-buffer-from": "3.52.0", + "tslib": "^2.3.0" }, "engines": { "node": ">= 12.0.0" } }, "node_modules/@aws-sdk/util-waiter": { - "version": "3.55.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-waiter/-/util-waiter-3.55.0.tgz", - "integrity": "sha512-Do34MKPFSC/+zVN6vY+FZ+0WN61hzga4nPoAC590AOjs8rW6/H6sDN6Gz1KAZbPnuQUZfvsIJjMxN7lblXHJkQ==", + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-waiter/-/util-waiter-3.54.0.tgz", + "integrity": "sha512-+Gz5R14jWKsQtMCWbzWJe2Ac/CdMV/h5/R8uEZmwM3f6MHICPOftMQd0uDLdGezSBV9PuU3PCwiBZBTFzNSYBg==", "dependencies": { - "@aws-sdk/abort-controller": "3.55.0", - "@aws-sdk/types": "3.55.0", - "tslib": "^2.3.1" + "@aws-sdk/abort-controller": "3.54.0", + "@aws-sdk/types": "3.54.0", + "tslib": "^2.3.0" }, "engines": { "node": ">= 12.0.0" } }, "node_modules/@aws-sdk/xml-builder": { - "version": "3.55.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.55.0.tgz", - "integrity": "sha512-BH+i5S2FLprmfSeIuGy3UbNtEoJPVjh8arl5+LV3i2KY/+TmrS4yT8JtztDlDxHF0cMtNLZNO0KEPtsACS6SOg==", + "version": "3.52.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.52.0.tgz", + "integrity": "sha512-GMdcxdwDZuIMlGnewdB48bpj8eqA3nubs3biy6vRFX8zhv8OqD+m5fMinoEwD8/MGqWE3WD7VZlbbdwYtNVWzQ==", "dependencies": { - "tslib": "^2.3.1" + "tslib": "^2.3.0" }, "engines": { "node": ">= 12.0.0" @@ -3832,9 +3832,9 @@ } }, "node_modules/@fortawesome/fontawesome-free": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-6.1.1.tgz", - "integrity": "sha512-J/3yg2AIXc9wznaVqpHVX3Wa5jwKovVF0AMYSnbmcXTiL3PpRPfF58pzWucCwEiCJBp+hCNRLWClTomD8SseKg==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-6.0.0.tgz", + "integrity": "sha512-6LB4PYBST1Rx40klypw1SmSDArjFOcfBf2LeX9Zg5EKJT2eXiyiJq+CyBYKeXyK0sXS2FsCJWSPr/luyhuvh0Q==", "dev": true, "hasInstallScript": true, "engines": { @@ -3847,6 +3847,22 @@ "integrity": "sha512-82cpyJyKRoQoRi+14ibCeGPu0CwypgtBAdBhq1WfvagpCZNKqwXbKwXllYSMG91DhmG4jt9gN8eP6lGOtozuaw==", "dev": true }, + "node_modules/@httptoolkit/websocket-stream": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@httptoolkit/websocket-stream/-/websocket-stream-6.0.0.tgz", + "integrity": "sha512-EC8m9JbhpGX2okfvLakqrmy4Le0VyNKR7b3IdvFZR/BfFO4ruh/XceBvXhCFHkykchnFxuOSlRwFiqNSXlwcGA==", + "peer": true, + "dependencies": { + "@types/ws": "*", + "duplexify": "^3.5.1", + "inherits": "^2.0.1", + "isomorphic-ws": "^4.0.1", + "readable-stream": "^2.3.3", + "safe-buffer": "^5.1.2", + "ws": "*", + "xtend": "^4.0.0" + } + }, "node_modules/@humanwhocodes/config-array": { "version": "0.9.3", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.3.tgz", @@ -4565,9 +4581,9 @@ "dev": true }, "node_modules/@types/d3-selection": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-1.4.3.tgz", - "integrity": "sha512-GjKQWVZO6Sa96HiKO6R93VBE8DUW+DDkFpIMf9vpY5S78qZTlRRSNUsHr/afDpF7TvLDV7VxrUFOWW7vdIlYkA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.2.tgz", + "integrity": "sha512-d29EDd0iUBrRoKhPndhDY6U/PYxOWqgIZwKTooy2UkBfU7TNZNpRho0yLWPxlatQrFWk2mnTu71IZQ4+LRgKlQ==", "dev": true }, "node_modules/@types/eslint": { @@ -4655,8 +4671,7 @@ "node_modules/@types/node": { "version": "16.11.24", "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.24.tgz", - "integrity": "sha512-Ezv33Rl4mIi6YdSHfIRNBd4Q9kUe5okiaw/ikvJiJDmuQZNW5kfdg7+oQPF8NO6sTcr3woIpj3jANzTXdvEZXA==", - "dev": true + "integrity": "sha512-Ezv33Rl4mIi6YdSHfIRNBd4Q9kUe5okiaw/ikvJiJDmuQZNW5kfdg7+oQPF8NO6sTcr3woIpj3jANzTXdvEZXA==" }, "node_modules/@types/parse-json": { "version": "4.0.0", @@ -4729,7 +4744,6 @@ "version": "8.2.2", "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.2.2.tgz", "integrity": "sha512-NOn5eIcgWLOo6qW8AcuLZ7G8PycXu0xTxxkS6Q18VWFxgPUSOwV0pBj2a/4viNZVu25i7RIB7GttdkAIUUXOOg==", - "dev": true, "dependencies": { "@types/node": "*" } @@ -5435,6 +5449,12 @@ "rxjs": ">=6.0.0" } }, + "node_modules/ansi": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/ansi/-/ansi-0.3.1.tgz", + "integrity": "sha1-DELU+xcWDVqa8eSEus4cZpIsGyE=", + "peer": true + }, "node_modules/ansi-colors": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", @@ -5536,6 +5556,16 @@ "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", "dev": true }, + "node_modules/are-we-there-yet": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.0.6.tgz", + "integrity": "sha1-otKMkxAqpsyWJFomy5VN4G7FPww=", + "peer": true, + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.0 || ^1.1.13" + } + }, "node_modules/argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -5675,6 +5705,32 @@ "postcss": "^8.1.0" } }, + "node_modules/aws-crt": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/aws-crt/-/aws-crt-1.11.1.tgz", + "integrity": "sha512-cWlauv11KD6PNZL3tLj1aM5A+NF8wKT2L8gej1FgyAnN1dL4n1oEm3HwuxmPYk09TRIPgkvXG5aHW2qefiO+fA==", + "hasInstallScript": true, + "peer": true, + "dependencies": { + "@httptoolkit/websocket-stream": "^6.0.0", + "axios": "^0.24.0", + "cmake-js": "6.3.0", + "crypto-js": "^4.0.0", + "fastestsmallesttextencoderdecoder": "^1.0.22", + "mqtt": "^4.3.4", + "tar": "^6.1.11", + "ws": "^7.5.5" + } + }, + "node_modules/axios": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.24.0.tgz", + "integrity": "sha512-Q6cWsys88HoPgAaFAVUb0WpPk0O8iTeisR9IMqy9G8AbO4NlpVknrnQS03zzF9PGAWgO3cgletO3VjV/P7VztA==", + "peer": true, + "dependencies": { + "follow-redirects": "^1.14.4" + } + }, "node_modules/axobject-query": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz", @@ -5802,8 +5858,7 @@ "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "node_modules/base-64": { "version": "0.1.0", @@ -5814,7 +5869,6 @@ "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true, "funding": [ { "type": "github", @@ -5836,6 +5890,15 @@ "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", "dev": true }, + "node_modules/big-integer": { + "version": "1.6.51", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", + "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==", + "peer": true, + "engines": { + "node": ">=0.6" + } + }, "node_modules/big.js": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", @@ -5845,6 +5908,19 @@ "node": "*" } }, + "node_modules/binary": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", + "integrity": "sha1-n2BVO8XOjDOG87VTz/R0Yq3sqnk=", + "peer": true, + "dependencies": { + "buffers": "~0.1.1", + "chainsaw": "~0.1.0" + }, + "engines": { + "node": "*" + } + }, "node_modules/binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", @@ -5858,7 +5934,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dev": true, "dependencies": { "buffer": "^5.5.0", "inherits": "^2.0.4", @@ -5869,7 +5944,6 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -5879,6 +5953,12 @@ "node": ">= 6" } }, + "node_modules/bluebird": { + "version": "3.4.7", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz", + "integrity": "sha1-9y12C+Cbf3bQjtj66Ysomo0F+rM=", + "peer": true + }, "node_modules/body-parser": { "version": "1.19.1", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.1.tgz", @@ -5966,7 +6046,6 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -6021,7 +6100,6 @@ "version": "5.7.1", "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dev": true, "funding": [ { "type": "github", @@ -6044,8 +6122,7 @@ "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" }, "node_modules/buffer-indexof": { "version": "1.1.1", @@ -6053,6 +6130,30 @@ "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", "dev": true }, + "node_modules/buffer-indexof-polyfill": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.2.tgz", + "integrity": "sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A==", + "peer": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/buffer-shims": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz", + "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E=", + "peer": true + }, + "node_modules/buffers": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", + "integrity": "sha1-skV5w77U1tOWru5tmorn9Ugqt7s=", + "peer": true, + "engines": { + "node": ">=0.2.0" + } + }, "node_modules/builtin-modules": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", @@ -6148,6 +6249,18 @@ "url": "https://opencollective.com/browserslist" } }, + "node_modules/chainsaw": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", + "integrity": "sha1-XqtQsor+WAdNDVgpE4iCi15fvJg=", + "peer": true, + "dependencies": { + "traverse": ">=0.3.0 <0.4" + }, + "engines": { + "node": "*" + } + }, "node_modules/chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -6199,7 +6312,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "dev": true, "engines": { "node": ">=10" } @@ -6301,6 +6413,262 @@ "node": ">=6" } }, + "node_modules/cmake-js": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/cmake-js/-/cmake-js-6.3.0.tgz", + "integrity": "sha512-1uqTOmFt6BIqKlrX+39/aewU/JVhyZWDqwAL+6psToUwxj3yWPJiwxiZFmV0XdcoWmqGs7peZTxTbJtAcH8hxw==", + "peer": true, + "dependencies": { + "axios": "^0.21.1", + "debug": "^4", + "fs-extra": "^5.0.0", + "is-iojs": "^1.0.1", + "lodash": "^4", + "memory-stream": "0", + "npmlog": "^1.2.0", + "rc": "^1.2.7", + "semver": "^5.0.3", + "splitargs": "0", + "tar": "^4", + "unzipper": "^0.8.13", + "url-join": "0", + "which": "^1.0.9", + "yargs": "^3.6.0" + }, + "bin": { + "cmake-js": "bin/cmake-js" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/cmake-js/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cmake-js/node_modules/axios": { + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", + "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", + "peer": true, + "dependencies": { + "follow-redirects": "^1.14.0" + } + }, + "node_modules/cmake-js/node_modules/camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cmake-js/node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "peer": true + }, + "node_modules/cmake-js/node_modules/cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "peer": true, + "dependencies": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + } + }, + "node_modules/cmake-js/node_modules/fs-extra": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz", + "integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==", + "peer": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "node_modules/cmake-js/node_modules/fs-minipass": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", + "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", + "peer": true, + "dependencies": { + "minipass": "^2.6.0" + } + }, + "node_modules/cmake-js/node_modules/is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "peer": true, + "dependencies": { + "number-is-nan": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cmake-js/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "peer": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/cmake-js/node_modules/minipass": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", + "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", + "peer": true, + "dependencies": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "node_modules/cmake-js/node_modules/minizlib": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", + "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", + "peer": true, + "dependencies": { + "minipass": "^2.9.0" + } + }, + "node_modules/cmake-js/node_modules/mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "peer": true, + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/cmake-js/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "peer": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/cmake-js/node_modules/string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "peer": true, + "dependencies": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cmake-js/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "peer": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cmake-js/node_modules/tar": { + "version": "4.4.19", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.19.tgz", + "integrity": "sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA==", + "peer": true, + "dependencies": { + "chownr": "^1.1.4", + "fs-minipass": "^1.2.7", + "minipass": "^2.9.0", + "minizlib": "^1.3.3", + "mkdirp": "^0.5.5", + "safe-buffer": "^5.2.1", + "yallist": "^3.1.1" + }, + "engines": { + "node": ">=4.5" + } + }, + "node_modules/cmake-js/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "peer": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/cmake-js/node_modules/wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "peer": true, + "dependencies": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cmake-js/node_modules/y18n": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", + "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==", + "peer": true + }, + "node_modules/cmake-js/node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "peer": true + }, + "node_modules/cmake-js/node_modules/yargs": { + "version": "3.32.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz", + "integrity": "sha1-AwiOnr+edWtpdRYR0qXvWRSCyZU=", + "peer": true, + "dependencies": { + "camelcase": "^2.0.1", + "cliui": "^3.0.3", + "decamelize": "^1.1.1", + "os-locale": "^1.4.0", + "string-width": "^1.0.1", + "window-size": "^0.1.4", + "y18n": "^3.2.0" + } + }, + "node_modules/code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/codelyzer": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/codelyzer/-/codelyzer-6.0.2.tgz", @@ -6449,6 +6817,16 @@ "node": ">= 12.0.0" } }, + "node_modules/commist": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/commist/-/commist-1.1.0.tgz", + "integrity": "sha512-rraC8NXWOEjhADbZe9QBNzLAN5Q3fsTPQtBV+fEVj6xKIgDgNiEVE6ZNfHpZOqfQ21YUzfVNUXLOEZquYvQPPg==", + "peer": true, + "dependencies": { + "leven": "^2.1.0", + "minimist": "^1.1.0" + } + }, "node_modules/commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", @@ -6509,8 +6887,36 @@ "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "node_modules/concat-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", + "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", + "engines": [ + "node >= 6.0" + ], + "peer": true, + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.0.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/concat-stream/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==", + "peer": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } }, "node_modules/connect-history-api-fallback": { "version": "1.6.0", @@ -6737,8 +7143,7 @@ "node_modules/core-util-is": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" }, "node_modules/cosmiconfig": { "version": "7.0.1", @@ -6875,6 +7280,12 @@ "node": ">= 8" } }, + "node_modules/crypto-js": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.1.1.tgz", + "integrity": "sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw==", + "peer": true + }, "node_modules/css": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/css/-/css-3.0.0.tgz", @@ -7105,6 +7516,11 @@ "d3-transition": "1" } }, + "node_modules/d3-brush/node_modules/d3-selection": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-1.4.2.tgz", + "integrity": "sha512-SJ0BqYihzOjDnnlfyeHT0e30k0K1+5sR3d5fNueCNeuhZTnGw4M4o8mqJchSwgKMXCNFo+e2VTChiSJ0vYtXkg==" + }, "node_modules/d3-chord": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-1.0.6.tgz", @@ -7146,6 +7562,11 @@ "d3-selection": "1" } }, + "node_modules/d3-drag/node_modules/d3-selection": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-1.4.2.tgz", + "integrity": "sha512-SJ0BqYihzOjDnnlfyeHT0e30k0K1+5sR3d5fNueCNeuhZTnGw4M4o8mqJchSwgKMXCNFo+e2VTChiSJ0vYtXkg==" + }, "node_modules/d3-dsv": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-1.2.0.tgz", @@ -7260,9 +7681,12 @@ } }, "node_modules/d3-selection": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-1.4.2.tgz", - "integrity": "sha512-SJ0BqYihzOjDnnlfyeHT0e30k0K1+5sR3d5fNueCNeuhZTnGw4M4o8mqJchSwgKMXCNFo+e2VTChiSJ0vYtXkg==" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", + "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", + "engines": { + "node": ">=12" + } }, "node_modules/d3-shape": { "version": "1.3.7", @@ -7303,6 +7727,11 @@ "d3-timer": "1" } }, + "node_modules/d3-transition/node_modules/d3-selection": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-1.4.2.tgz", + "integrity": "sha512-SJ0BqYihzOjDnnlfyeHT0e30k0K1+5sR3d5fNueCNeuhZTnGw4M4o8mqJchSwgKMXCNFo+e2VTChiSJ0vYtXkg==" + }, "node_modules/d3-voronoi": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/d3-voronoi/-/d3-voronoi-1.1.4.tgz", @@ -7320,6 +7749,16 @@ "d3-transition": "1" } }, + "node_modules/d3-zoom/node_modules/d3-selection": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-1.4.2.tgz", + "integrity": "sha512-SJ0BqYihzOjDnnlfyeHT0e30k0K1+5sR3d5fNueCNeuhZTnGw4M4o8mqJchSwgKMXCNFo+e2VTChiSJ0vYtXkg==" + }, + "node_modules/d3/node_modules/d3-selection": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-1.4.2.tgz", + "integrity": "sha512-SJ0BqYihzOjDnnlfyeHT0e30k0K1+5sR3d5fNueCNeuhZTnGw4M4o8mqJchSwgKMXCNFo+e2VTChiSJ0vYtXkg==" + }, "node_modules/damerau-levenshtein": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", @@ -7330,7 +7769,6 @@ "version": "4.3.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", - "dev": true, "dependencies": { "ms": "2.1.2" }, @@ -7343,6 +7781,15 @@ } } }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/decode-uri-component": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", @@ -7369,6 +7816,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "peer": true, + "engines": { + "node": ">=4.0.0" + } + }, "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", @@ -7442,8 +7898,7 @@ "node_modules/delegates": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", - "dev": true + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" }, "node_modules/depd": { "version": "1.1.2", @@ -7592,6 +8047,27 @@ "url": "https://github.com/fb55/domutils?sponsor=1" } }, + "node_modules/duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", + "peer": true, + "dependencies": { + "readable-stream": "^2.0.2" + } + }, + "node_modules/duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "peer": true, + "dependencies": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -7666,6 +8142,15 @@ "node": ">=0.10.0" } }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "peer": true, + "dependencies": { + "once": "^1.4.0" + } + }, "node_modules/enhanced-resolve": { "version": "5.9.0", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.9.0.tgz", @@ -8857,6 +9342,12 @@ "url": "https://paypal.me/naturalintelligence" } }, + "node_modules/fastestsmallesttextencoderdecoder": { + "version": "1.0.22", + "resolved": "https://registry.npmjs.org/fastestsmallesttextencoderdecoder/-/fastestsmallesttextencoderdecoder-1.0.22.tgz", + "integrity": "sha512-Pb8d48e+oIuY4MaM64Cd7OW1gt4nxCHs7/ddPPZ/Ic3sg8yVGM7O9wDvZ7us6ScaUupzM+pfBolwtYhN1IxBIw==", + "peer": true + }, "node_modules/fastparse": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz", @@ -9026,7 +9517,6 @@ "version": "1.14.8", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.8.tgz", "integrity": "sha512-1x0S9UVJHsQprFcEC/qnNzBLcIxsjAV905f/UkQxbclCsoTWlacCNOpQa/anodLl2uaEKFhfWOvM2Qg77+15zA==", - "dev": true, "funding": [ { "type": "individual", @@ -9101,7 +9591,6 @@ "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" }, @@ -9118,8 +9607,7 @@ "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, "node_modules/fsevents": { "version": "2.3.2", @@ -9135,6 +9623,45 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, + "node_modules/fstream": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", + "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", + "peer": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" + }, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/fstream/node_modules/mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "peer": true, + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/fstream/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "peer": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, "node_modules/function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", @@ -9147,6 +9674,19 @@ "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", "dev": true }, + "node_modules/gauge": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-1.2.7.tgz", + "integrity": "sha1-6c7FSD09TuDvRLYKfZnkk14TbZM=", + "peer": true, + "dependencies": { + "ansi": "^0.3.0", + "has-unicode": "^2.0.0", + "lodash.pad": "^4.1.0", + "lodash.padend": "^4.1.0", + "lodash.padstart": "^4.1.0" + } + }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -9220,7 +9760,6 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dev": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -9286,8 +9825,7 @@ "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==", - "dev": true + "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==" }, "node_modules/handle-thing": { "version": "2.0.1", @@ -9369,8 +9907,7 @@ "node_modules/has-unicode": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", - "dev": true + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" }, "node_modules/hdr-histogram-js": { "version": "2.0.3", @@ -9389,6 +9926,30 @@ "integrity": "sha512-7kIufnBqdsBGcSZLPJwqHT3yhk1QTsSlFsVD3kx5ixH/AlgBs9yM1q6DPhXZ8f8gtdqgh7N7/5btRLpQsS2gHw==", "dev": true }, + "node_modules/help-me": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/help-me/-/help-me-3.0.0.tgz", + "integrity": "sha512-hx73jClhyk910sidBB7ERlnhMlFsJJIBqSVMFDwPN8o2v9nmp5KgLq1Xz1Bf1fCMMZ6mPrX159iG0VLy/fPMtQ==", + "peer": true, + "dependencies": { + "glob": "^7.1.6", + "readable-stream": "^3.6.0" + } + }, + "node_modules/help-me/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==", + "peer": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/hex-rgb": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/hex-rgb/-/hex-rgb-4.3.0.tgz", @@ -9579,7 +10140,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true, "funding": [ { "type": "github", @@ -9688,7 +10248,6 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -9697,8 +10256,7 @@ "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "node_modules/ini": { "version": "2.0.0", @@ -9818,6 +10376,15 @@ "node": ">= 0.4" } }, + "node_modules/invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/ip": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", @@ -9988,6 +10555,12 @@ "node": ">=8" } }, + "node_modules/is-iojs": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-iojs/-/is-iojs-1.1.0.tgz", + "integrity": "sha1-TBEDO11dlNbqs3dd7cm+fQCDJfE=", + "peer": true + }, "node_modules/is-lambda": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", @@ -10184,14 +10757,12 @@ "node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" }, "node_modules/isobject": { "version": "3.0.1", @@ -10202,6 +10773,15 @@ "node": ">=0.10.0" } }, + "node_modules/isomorphic-ws": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz", + "integrity": "sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==", + "peer": true, + "peerDependencies": { + "ws": "*" + } + }, "node_modules/istanbul-lib-coverage": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", @@ -10298,6 +10878,12 @@ "integrity": "sha512-JVzAR/AjBvVt2BmYhxRCSYysDsPcssdmTFnzyLEts9qNwmjmu4JTAMYubEfwVOSwpQ1I1sKKFcxhZCI2buerfw==", "peer": true }, + "node_modules/js-sdsl": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-2.1.4.tgz", + "integrity": "sha512-/Ew+CJWHNddr7sjwgxaVeIORIH4AMVC9dy0hPf540ZGMVgS9d3ajwuVdyhDt6/QUvT8ATjR3yuYBKsS79F+H4A==", + "peer": true + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -10436,6 +11022,18 @@ "node": ">= 8" } }, + "node_modules/lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "peer": true, + "dependencies": { + "invert-kv": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/less": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/less/-/less-4.1.2.tgz", @@ -10526,6 +11124,15 @@ "node": ">=0.10.0" } }, + "node_modules/leven": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz", + "integrity": "sha1-wuep93IJTe6dNCAq6KzORoeHVYA=", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -10562,6 +11169,12 @@ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", "dev": true }, + "node_modules/listenercount": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/listenercount/-/listenercount-1.0.1.tgz", + "integrity": "sha1-hMinKrWcRyUyFIDJdeZQg0LnCTc=", + "peer": true + }, "node_modules/loader-runner": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.2.0.tgz", @@ -10614,11 +11227,23 @@ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, + "node_modules/lodash.pad": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/lodash.pad/-/lodash.pad-4.5.1.tgz", + "integrity": "sha1-QzCUmoM6fI2iLMIPaibE1Z3runA=", + "peer": true + }, "node_modules/lodash.padend": { "version": "4.6.1", "resolved": "https://registry.npmjs.org/lodash.padend/-/lodash.padend-4.6.1.tgz", "integrity": "sha1-U8y6BH0G4VjTEfRdpiX05J5vFm4=" }, + "node_modules/lodash.padstart": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/lodash.padstart/-/lodash.padstart-4.6.1.tgz", + "integrity": "sha1-0uPuv/DZ05rVD1y9G1KnvOa7YRs=", + "peer": true + }, "node_modules/lodash.trimstart": { "version": "4.5.1", "resolved": "https://registry.npmjs.org/lodash.trimstart/-/lodash.trimstart-4.5.1.tgz", @@ -10719,7 +11344,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, "dependencies": { "yallist": "^4.0.0" }, @@ -10813,6 +11437,39 @@ "node": ">= 4.0.0" } }, + "node_modules/memory-stream": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/memory-stream/-/memory-stream-0.0.3.tgz", + "integrity": "sha1-6+jdHDuLw4wOeUHp3dWuvmtN6D8=", + "peer": true, + "dependencies": { + "readable-stream": "~1.0.26-2" + } + }, + "node_modules/memory-stream/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "peer": true + }, + "node_modules/memory-stream/node_modules/readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "peer": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "node_modules/memory-stream/node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "peer": true + }, "node_modules/merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", @@ -10946,7 +11603,6 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -10957,14 +11613,12 @@ "node_modules/minimist": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" }, "node_modules/minipass": { "version": "3.1.6", "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz", "integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==", - "dev": true, "dependencies": { "yallist": "^4.0.0" }, @@ -11051,7 +11705,6 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "dev": true, "dependencies": { "minipass": "^3.0.0", "yallist": "^4.0.0" @@ -11064,7 +11717,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true, "bin": { "mkdirp": "bin/cmd.js" }, @@ -11072,11 +11724,80 @@ "node": ">=10" } }, + "node_modules/mqtt": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/mqtt/-/mqtt-4.3.6.tgz", + "integrity": "sha512-1dgQbkbh1Bba9iAGDNIrhSZ4nLDjbhmNHjOEvsmKI1Bb+2orj0gHwjqUKJ5CKUMKBYbkQYRM1fy+N1/2iZOj5w==", + "peer": true, + "dependencies": { + "commist": "^1.0.0", + "concat-stream": "^2.0.0", + "debug": "^4.1.1", + "duplexify": "^4.1.1", + "help-me": "^3.0.0", + "inherits": "^2.0.3", + "lru-cache": "^6.0.0", + "minimist": "^1.2.5", + "mqtt-packet": "^6.8.0", + "number-allocator": "^1.0.9", + "pump": "^3.0.0", + "readable-stream": "^3.6.0", + "reinterval": "^1.1.0", + "rfdc": "^1.3.0", + "split2": "^3.1.0", + "ws": "^7.5.5", + "xtend": "^4.0.2" + }, + "bin": { + "mqtt": "bin/mqtt.js", + "mqtt_pub": "bin/pub.js", + "mqtt_sub": "bin/sub.js" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/mqtt-packet": { + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/mqtt-packet/-/mqtt-packet-6.10.0.tgz", + "integrity": "sha512-ja8+mFKIHdB1Tpl6vac+sktqy3gA8t9Mduom1BA75cI+R9AHnZOiaBQwpGiWnaVJLDGRdNhQmFaAqd7tkKSMGA==", + "peer": true, + "dependencies": { + "bl": "^4.0.2", + "debug": "^4.1.1", + "process-nextick-args": "^2.0.1" + } + }, + "node_modules/mqtt/node_modules/duplexify": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.2.tgz", + "integrity": "sha512-fz3OjcNCHmRP12MJoZMPglx8m4rrFP8rovnk4vT8Fs+aonZoCwGg10dSsQsfP/E62eZcPTMSMP6686fu9Qlqtw==", + "peer": true, + "dependencies": { + "end-of-stream": "^1.4.1", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1", + "stream-shift": "^1.0.0" + } + }, + "node_modules/mqtt/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==", + "peer": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/multicast-dns": { "version": "6.2.3", @@ -11241,9 +11962,9 @@ "optional": true }, "node_modules/node-forge": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", - "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.2.1.tgz", + "integrity": "sha512-Fcvtbb+zBcZXbTTVwqGA5W+MKBj56UjVRevvchv5XrcyXbmNdesfZL37nlcWOfpgHhgmxApw3tQbTr4CqNmX4w==", "dev": true, "engines": { "node": ">= 6.13.0" @@ -11569,6 +12290,17 @@ "node": ">=8" } }, + "node_modules/npmlog": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-1.2.1.tgz", + "integrity": "sha1-KOe+YZYJtT960d0wChDWTXFiaLY=", + "peer": true, + "dependencies": { + "ansi": "~0.3.0", + "are-we-there-yet": "~1.0.0", + "gauge": "~1.2.0" + } + }, "node_modules/nth-check": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz", @@ -11581,6 +12313,25 @@ "url": "https://github.com/fb55/nth-check?sponsor=1" } }, + "node_modules/number-allocator": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/number-allocator/-/number-allocator-1.0.10.tgz", + "integrity": "sha512-K4AvNGKo9lP6HqsZyfSr9KDaqnwFzW203inhQEOwFrmFaYevpdX4VNwdOLk197aHujzbT//z6pCBrCOUYSM5iw==", + "peer": true, + "dependencies": { + "debug": "^4.3.1", + "js-sdsl": "^2.1.2" + } + }, + "node_modules/number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/nx": { "version": "13.1.3", "resolved": "https://registry.npmjs.org/nx/-/nx-13.1.3.tgz", @@ -11701,7 +12452,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, "dependencies": { "wrappy": "1" } @@ -11848,6 +12598,18 @@ "node": ">=8" } }, + "node_modules/os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "peer": true, + "dependencies": { + "lcid": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", @@ -12082,7 +12844,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -12806,8 +13567,7 @@ "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, "node_modules/promise-inflight": { "version": "1.0.1", @@ -12857,6 +13617,16 @@ "dev": true, "optional": true }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "peer": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, "node_modules/punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", @@ -12949,6 +13719,36 @@ "node": ">= 0.8" } }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "peer": true, + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/rc/node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "peer": true + }, + "node_modules/rc/node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/read-cache": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", @@ -12975,7 +13775,6 @@ "version": "2.3.7", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -12989,8 +13788,7 @@ "node_modules/readable-stream/node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "node_modules/readdirp": { "version": "3.6.0", @@ -13130,6 +13928,12 @@ "jsesc": "bin/jsesc" } }, + "node_modules/reinterval": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reinterval/-/reinterval-1.1.0.tgz", + "integrity": "sha1-M2Hs+jymwYKDOA3Qu5VG85D17Oc=", + "peer": true + }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -13251,6 +14055,12 @@ "node": ">=0.10.0" } }, + "node_modules/rfdc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", + "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", + "peer": true + }, "node_modules/rgb-hex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/rgb-hex/-/rgb-hex-3.0.0.tgz", @@ -13323,7 +14133,6 @@ "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, "funding": [ { "type": "github", @@ -13636,6 +14445,12 @@ "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "dev": true }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", + "peer": true + }, "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", @@ -13906,6 +14721,35 @@ "node": ">= 6" } }, + "node_modules/split2": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", + "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", + "peer": true, + "dependencies": { + "readable-stream": "^3.0.0" + } + }, + "node_modules/split2/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==", + "peer": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/splitargs": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/splitargs/-/splitargs-0.0.7.tgz", + "integrity": "sha1-/p965lc3GzOxDLgNoUPPgknPazs=", + "peer": true + }, "node_modules/sprintf-js": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", @@ -13933,11 +14777,16 @@ "node": ">= 0.6" } }, + "node_modules/stream-shift": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", + "peer": true + }, "node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, "dependencies": { "safe-buffer": "~5.1.0" } @@ -13945,8 +14794,7 @@ "node_modules/string_decoder/node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "node_modules/string-to-color": { "version": "2.2.2", @@ -14140,7 +14988,6 @@ "version": "6.1.11", "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", - "dev": true, "dependencies": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", @@ -14344,6 +15191,15 @@ "node": ">=0.6" } }, + "node_modules/traverse": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", + "integrity": "sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk=", + "peer": true, + "engines": { + "node": "*" + } + }, "node_modules/tree-kill": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", @@ -14531,6 +15387,12 @@ "integrity": "sha512-5NkbXZUlmCE73Fs7gvkp1XXJWHYetPkg60QnQ2NXQmBYNFxbBr2zA8GCtaH4K2s2WhOmSlgiSTmrjrcm5tnM5g==", "dev": true }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "peer": true + }, "node_modules/typescript": { "version": "4.5.5", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.5.tgz", @@ -14635,6 +15497,50 @@ "node": ">= 0.8" } }, + "node_modules/unzipper": { + "version": "0.8.14", + "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.8.14.tgz", + "integrity": "sha512-8rFtE7EP5ssOwGpN2dt1Q4njl0N1hUXJ7sSPz0leU2hRdq6+pra57z4YPBlVqm40vcgv6ooKZEAx48fMTv9x4w==", + "peer": true, + "dependencies": { + "big-integer": "^1.6.17", + "binary": "~0.3.0", + "bluebird": "~3.4.1", + "buffer-indexof-polyfill": "~1.0.0", + "duplexer2": "~0.1.4", + "fstream": "~1.0.10", + "listenercount": "~1.0.1", + "readable-stream": "~2.1.5", + "setimmediate": "~1.0.4" + } + }, + "node_modules/unzipper/node_modules/process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", + "peer": true + }, + "node_modules/unzipper/node_modules/readable-stream": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.1.5.tgz", + "integrity": "sha1-ZvqLcg4UOLNkaB8q0aY8YYRIydA=", + "peer": true, + "dependencies": { + "buffer-shims": "^1.0.0", + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "string_decoder": "~0.10.x", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/unzipper/node_modules/string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "peer": true + }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -14653,6 +15559,12 @@ "querystring": "0.2.0" } }, + "node_modules/url-join": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/url-join/-/url-join-0.0.1.tgz", + "integrity": "sha1-HbSK1CLTQCRpqH99l73r/k+x48g=", + "peer": true + }, "node_modules/url/node_modules/punycode": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", @@ -14661,8 +15573,7 @@ "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, "node_modules/utils-merge": { "version": "1.0.1", @@ -15046,6 +15957,18 @@ "node": ">=0.8.0" } }, + "node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "peer": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, "node_modules/which-boxed-primitive": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", @@ -15077,6 +16000,18 @@ "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", "dev": true }, + "node_modules/window-size": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz", + "integrity": "sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY=", + "peer": true, + "bin": { + "window-size": "cli.js" + }, + "engines": { + "node": ">= 0.10.0" + } + }, "node_modules/word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", @@ -15139,8 +16074,28 @@ "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "node_modules/ws": { + "version": "7.5.7", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.7.tgz", + "integrity": "sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A==", + "peer": 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/xhr2": { "version": "0.2.1", @@ -15150,6 +16105,15 @@ "node": ">= 6" } }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "peer": true, + "engines": { + "node": ">=0.4" + } + }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", @@ -15162,8 +16126,7 @@ "node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "node_modules/yaml": { "version": "1.10.2", @@ -15672,9 +16635,9 @@ } }, "@angular/youtube-player": { - "version": "13.3.4", - "resolved": "https://registry.npmjs.org/@angular/youtube-player/-/youtube-player-13.3.4.tgz", - "integrity": "sha512-f7rVQF/+PqARgKruJBBA0rlbJWbXYAKIYrNVNxLss0W3KifpqNJRl9HVylSlsYPqJh43GhHOLi2oWxWPgNRGEw==", + "version": "13.2.6", + "resolved": "https://registry.npmjs.org/@angular/youtube-player/-/youtube-player-13.2.6.tgz", + "integrity": "sha512-HDgL0QFkKsY8YZH6hhYjYaFEEBotaVUhJV+d53Snz6Ekz8zQ3O3b3swhDFFL/dwweK9bsrXBWwHXOrZmkUIrpQ==", "requires": { "@types/youtube": "^0.0.42", "tslib": "^2.3.0" @@ -15827,904 +16790,909 @@ } }, "@aws-sdk/abort-controller": { - "version": "3.55.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/abort-controller/-/abort-controller-3.55.0.tgz", - "integrity": "sha512-rCcTxJDEFnmvo/PgbhCRv24/Uv03lEGfRslKZq7SjaMcOubflS/ZXYaMEgsjYHgAT0zlpSsyCIkJXmhFaM7H7w==", + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/abort-controller/-/abort-controller-3.54.0.tgz", + "integrity": "sha512-6N7numECrGwal2NEbJwYXOGjwWsFafz8VuUvCBK5G9SgSL5XAbq1S3lL/4gbme5jhgh9CWh7s+bAY7EpOEH2Xg==", "requires": { - "@aws-sdk/types": "3.55.0", - "tslib": "^2.3.1" + "@aws-sdk/types": "3.54.0", + "tslib": "^2.3.0" } }, "@aws-sdk/chunked-blob-reader": { - "version": "3.55.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/chunked-blob-reader/-/chunked-blob-reader-3.55.0.tgz", - "integrity": "sha512-o/xjMCq81opAjSBjt7YdHJwIJcGVG5XIV9+C2KXcY5QwVimkOKPybWTv0mXPvSwSilSx+EhpLNhkcJuXdzhw4w==", + "version": "3.52.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/chunked-blob-reader/-/chunked-blob-reader-3.52.0.tgz", + "integrity": "sha512-BAZhriHHfvnGOd0P9xcnGu8DGyxOa0lgmEw+Tc6nZpXJzx0P+1Sd76q5gE5d/IZ0r5VTB6rfwwKUoG6iShNCwQ==", "requires": { - "tslib": "^2.3.1" + "tslib": "^2.3.0" } }, "@aws-sdk/chunked-blob-reader-native": { - "version": "3.58.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/chunked-blob-reader-native/-/chunked-blob-reader-native-3.58.0.tgz", - "integrity": "sha512-+D3xnPD5985iphgAqgUerBDs371a2WzzoEVi7eHJUMMsP/gEnSTdSH0HNxsqhYv6CW4EdKtvDAQdAwA1VtCf2A==", + "version": "3.52.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/chunked-blob-reader-native/-/chunked-blob-reader-native-3.52.0.tgz", + "integrity": "sha512-/hVzC0Q12/mWRMBBQD3v82xsLSxZ4RwG6N44XP7MuJoHy4ui4T7D9RSuvBpzzr/4fqF0w9M7XYv6aM4BD2pFIQ==", "requires": { - "@aws-sdk/util-base64-browser": "3.58.0", - "tslib": "^2.3.1" + "@aws-sdk/util-base64-browser": "3.52.0", + "tslib": "^2.3.0" } }, "@aws-sdk/client-s3": { - "version": "3.76.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.76.0.tgz", - "integrity": "sha512-1ORpdryxEoF7mMm06SFL3mBytpS6fBug6X/fxLX7HuRRxg1nH+6AY5Y1Jk1mvIMVrLXLLiNk59ovzYxO2KgZew==", + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.54.0.tgz", + "integrity": "sha512-9JdhkTqRCYA3esnjFR7xaFysXMfX5TatKE9H8Sds78eoMQrfgB2Yl6ZcEl8Oy0vpMVpOzqRYmcSmFfaBOhuI/g==", "requires": { "@aws-crypto/sha1-browser": "2.0.0", "@aws-crypto/sha256-browser": "2.0.0", "@aws-crypto/sha256-js": "2.0.0", - "@aws-sdk/client-sts": "3.76.0", - "@aws-sdk/config-resolver": "3.75.0", - "@aws-sdk/credential-provider-node": "3.76.0", - "@aws-sdk/eventstream-serde-browser": "3.72.0", - "@aws-sdk/eventstream-serde-config-resolver": "3.55.0", - "@aws-sdk/eventstream-serde-node": "3.72.0", - "@aws-sdk/fetch-http-handler": "3.58.0", - "@aws-sdk/hash-blob-browser": "3.58.0", - "@aws-sdk/hash-node": "3.55.0", - "@aws-sdk/hash-stream-node": "3.58.0", - "@aws-sdk/invalid-dependency": "3.55.0", - "@aws-sdk/md5-js": "3.58.0", - "@aws-sdk/middleware-bucket-endpoint": "3.75.0", - "@aws-sdk/middleware-content-length": "3.58.0", - "@aws-sdk/middleware-expect-continue": "3.58.0", - "@aws-sdk/middleware-flexible-checksums": "3.72.0", - "@aws-sdk/middleware-host-header": "3.58.0", - "@aws-sdk/middleware-location-constraint": "3.55.0", - "@aws-sdk/middleware-logger": "3.55.0", - "@aws-sdk/middleware-retry": "3.75.0", - "@aws-sdk/middleware-sdk-s3": "3.66.0", - "@aws-sdk/middleware-serde": "3.55.0", - "@aws-sdk/middleware-signing": "3.58.0", - "@aws-sdk/middleware-ssec": "3.55.0", - "@aws-sdk/middleware-stack": "3.55.0", - "@aws-sdk/middleware-user-agent": "3.58.0", - "@aws-sdk/node-config-provider": "3.75.0", - "@aws-sdk/node-http-handler": "3.76.0", - "@aws-sdk/protocol-http": "3.58.0", - "@aws-sdk/signature-v4-multi-region": "3.66.0", - "@aws-sdk/smithy-client": "3.72.0", - "@aws-sdk/types": "3.55.0", - "@aws-sdk/url-parser": "3.55.0", - "@aws-sdk/util-base64-browser": "3.58.0", - "@aws-sdk/util-base64-node": "3.55.0", - "@aws-sdk/util-body-length-browser": "3.55.0", - "@aws-sdk/util-body-length-node": "3.55.0", - "@aws-sdk/util-defaults-mode-browser": "3.72.0", - "@aws-sdk/util-defaults-mode-node": "3.75.0", - "@aws-sdk/util-stream-browser": "3.55.0", - "@aws-sdk/util-stream-node": "3.55.0", - "@aws-sdk/util-user-agent-browser": "3.58.0", - "@aws-sdk/util-user-agent-node": "3.75.0", - "@aws-sdk/util-utf8-browser": "3.55.0", - "@aws-sdk/util-utf8-node": "3.55.0", - "@aws-sdk/util-waiter": "3.55.0", - "@aws-sdk/xml-builder": "3.55.0", + "@aws-sdk/client-sts": "3.54.0", + "@aws-sdk/config-resolver": "3.54.0", + "@aws-sdk/credential-provider-node": "3.54.0", + "@aws-sdk/eventstream-serde-browser": "3.54.0", + "@aws-sdk/eventstream-serde-config-resolver": "3.54.0", + "@aws-sdk/eventstream-serde-node": "3.54.0", + "@aws-sdk/fetch-http-handler": "3.54.0", + "@aws-sdk/hash-blob-browser": "3.54.0", + "@aws-sdk/hash-node": "3.54.0", + "@aws-sdk/hash-stream-node": "3.54.0", + "@aws-sdk/invalid-dependency": "3.54.0", + "@aws-sdk/md5-js": "3.54.0", + "@aws-sdk/middleware-bucket-endpoint": "3.54.0", + "@aws-sdk/middleware-content-length": "3.54.0", + "@aws-sdk/middleware-expect-continue": "3.54.0", + "@aws-sdk/middleware-flexible-checksums": "3.54.0", + "@aws-sdk/middleware-host-header": "3.54.0", + "@aws-sdk/middleware-location-constraint": "3.54.0", + "@aws-sdk/middleware-logger": "3.54.0", + "@aws-sdk/middleware-retry": "3.54.0", + "@aws-sdk/middleware-sdk-s3": "3.54.0", + "@aws-sdk/middleware-serde": "3.54.0", + "@aws-sdk/middleware-signing": "3.54.0", + "@aws-sdk/middleware-ssec": "3.54.0", + "@aws-sdk/middleware-stack": "3.54.0", + "@aws-sdk/middleware-user-agent": "3.54.0", + "@aws-sdk/node-config-provider": "3.54.0", + "@aws-sdk/node-http-handler": "3.54.0", + "@aws-sdk/protocol-http": "3.54.0", + "@aws-sdk/smithy-client": "3.54.0", + "@aws-sdk/types": "3.54.0", + "@aws-sdk/url-parser": "3.54.0", + "@aws-sdk/util-base64-browser": "3.52.0", + "@aws-sdk/util-base64-node": "3.52.0", + "@aws-sdk/util-body-length-browser": "3.54.0", + "@aws-sdk/util-body-length-node": "3.54.0", + "@aws-sdk/util-defaults-mode-browser": "3.54.0", + "@aws-sdk/util-defaults-mode-node": "3.54.0", + "@aws-sdk/util-stream-browser": "3.54.0", + "@aws-sdk/util-stream-node": "3.54.0", + "@aws-sdk/util-user-agent-browser": "3.54.0", + "@aws-sdk/util-user-agent-node": "3.54.0", + "@aws-sdk/util-utf8-browser": "3.52.0", + "@aws-sdk/util-utf8-node": "3.52.0", + "@aws-sdk/util-waiter": "3.54.0", + "@aws-sdk/xml-builder": "3.52.0", "entities": "2.2.0", "fast-xml-parser": "3.19.0", - "tslib": "^2.3.1" + "tslib": "^2.3.0" } }, "@aws-sdk/client-sso": { - "version": "3.76.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.76.0.tgz", - "integrity": "sha512-trwzJWGxeagYAzo+1/JgcU/pM1vpKHW5rkbasDO5ZC4zHAlSwVhlU7yxGjYXsnobjkvf7zqTQhAxmOuMNWMFew==", + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.54.0.tgz", + "integrity": "sha512-5ZYYhoMqeaYhOU4kOEM7daKb8D5QhJ+IpwhHHMPhoHqQEwbbhBTFDXRs3ObUP/QYdBUMWS71+pnDoUdyHqPQ0Q==", "requires": { "@aws-crypto/sha256-browser": "2.0.0", "@aws-crypto/sha256-js": "2.0.0", - "@aws-sdk/config-resolver": "3.75.0", - "@aws-sdk/fetch-http-handler": "3.58.0", - "@aws-sdk/hash-node": "3.55.0", - "@aws-sdk/invalid-dependency": "3.55.0", - "@aws-sdk/middleware-content-length": "3.58.0", - "@aws-sdk/middleware-host-header": "3.58.0", - "@aws-sdk/middleware-logger": "3.55.0", - "@aws-sdk/middleware-retry": "3.75.0", - "@aws-sdk/middleware-serde": "3.55.0", - "@aws-sdk/middleware-stack": "3.55.0", - "@aws-sdk/middleware-user-agent": "3.58.0", - "@aws-sdk/node-config-provider": "3.75.0", - "@aws-sdk/node-http-handler": "3.76.0", - "@aws-sdk/protocol-http": "3.58.0", - "@aws-sdk/smithy-client": "3.72.0", - "@aws-sdk/types": "3.55.0", - "@aws-sdk/url-parser": "3.55.0", - "@aws-sdk/util-base64-browser": "3.58.0", - "@aws-sdk/util-base64-node": "3.55.0", - "@aws-sdk/util-body-length-browser": "3.55.0", - "@aws-sdk/util-body-length-node": "3.55.0", - "@aws-sdk/util-defaults-mode-browser": "3.72.0", - "@aws-sdk/util-defaults-mode-node": "3.75.0", - "@aws-sdk/util-user-agent-browser": "3.58.0", - "@aws-sdk/util-user-agent-node": "3.75.0", - "@aws-sdk/util-utf8-browser": "3.55.0", - "@aws-sdk/util-utf8-node": "3.55.0", - "tslib": "^2.3.1" + "@aws-sdk/config-resolver": "3.54.0", + "@aws-sdk/fetch-http-handler": "3.54.0", + "@aws-sdk/hash-node": "3.54.0", + "@aws-sdk/invalid-dependency": "3.54.0", + "@aws-sdk/middleware-content-length": "3.54.0", + "@aws-sdk/middleware-host-header": "3.54.0", + "@aws-sdk/middleware-logger": "3.54.0", + "@aws-sdk/middleware-retry": "3.54.0", + "@aws-sdk/middleware-serde": "3.54.0", + "@aws-sdk/middleware-stack": "3.54.0", + "@aws-sdk/middleware-user-agent": "3.54.0", + "@aws-sdk/node-config-provider": "3.54.0", + "@aws-sdk/node-http-handler": "3.54.0", + "@aws-sdk/protocol-http": "3.54.0", + "@aws-sdk/smithy-client": "3.54.0", + "@aws-sdk/types": "3.54.0", + "@aws-sdk/url-parser": "3.54.0", + "@aws-sdk/util-base64-browser": "3.52.0", + "@aws-sdk/util-base64-node": "3.52.0", + "@aws-sdk/util-body-length-browser": "3.54.0", + "@aws-sdk/util-body-length-node": "3.54.0", + "@aws-sdk/util-defaults-mode-browser": "3.54.0", + "@aws-sdk/util-defaults-mode-node": "3.54.0", + "@aws-sdk/util-user-agent-browser": "3.54.0", + "@aws-sdk/util-user-agent-node": "3.54.0", + "@aws-sdk/util-utf8-browser": "3.52.0", + "@aws-sdk/util-utf8-node": "3.52.0", + "tslib": "^2.3.0" } }, "@aws-sdk/client-sts": { - "version": "3.76.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.76.0.tgz", - "integrity": "sha512-rrzau4y7VO9q/F6ZRuJAdZV5oKggjgJuUKGSGssYkLgO2BDblcR1ObUNetSyFsGPoSWnDhg0TjFJnlFFlIBplA==", + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.54.0.tgz", + "integrity": "sha512-UY8fyi1zaWBJm+ZtDZRvSOv1rjHlvJjtJF3MfGQWDwUM10Amwzfh4Hc2JEzyeMJPkoSSvm6CVjSDyqXo8yLGZA==", "requires": { "@aws-crypto/sha256-browser": "2.0.0", "@aws-crypto/sha256-js": "2.0.0", - "@aws-sdk/config-resolver": "3.75.0", - "@aws-sdk/credential-provider-node": "3.76.0", - "@aws-sdk/fetch-http-handler": "3.58.0", - "@aws-sdk/hash-node": "3.55.0", - "@aws-sdk/invalid-dependency": "3.55.0", - "@aws-sdk/middleware-content-length": "3.58.0", - "@aws-sdk/middleware-host-header": "3.58.0", - "@aws-sdk/middleware-logger": "3.55.0", - "@aws-sdk/middleware-retry": "3.75.0", - "@aws-sdk/middleware-sdk-sts": "3.58.0", - "@aws-sdk/middleware-serde": "3.55.0", - "@aws-sdk/middleware-signing": "3.58.0", - "@aws-sdk/middleware-stack": "3.55.0", - "@aws-sdk/middleware-user-agent": "3.58.0", - "@aws-sdk/node-config-provider": "3.75.0", - "@aws-sdk/node-http-handler": "3.76.0", - "@aws-sdk/protocol-http": "3.58.0", - "@aws-sdk/smithy-client": "3.72.0", - "@aws-sdk/types": "3.55.0", - "@aws-sdk/url-parser": "3.55.0", - "@aws-sdk/util-base64-browser": "3.58.0", - "@aws-sdk/util-base64-node": "3.55.0", - "@aws-sdk/util-body-length-browser": "3.55.0", - "@aws-sdk/util-body-length-node": "3.55.0", - "@aws-sdk/util-defaults-mode-browser": "3.72.0", - "@aws-sdk/util-defaults-mode-node": "3.75.0", - "@aws-sdk/util-user-agent-browser": "3.58.0", - "@aws-sdk/util-user-agent-node": "3.75.0", - "@aws-sdk/util-utf8-browser": "3.55.0", - "@aws-sdk/util-utf8-node": "3.55.0", + "@aws-sdk/config-resolver": "3.54.0", + "@aws-sdk/credential-provider-node": "3.54.0", + "@aws-sdk/fetch-http-handler": "3.54.0", + "@aws-sdk/hash-node": "3.54.0", + "@aws-sdk/invalid-dependency": "3.54.0", + "@aws-sdk/middleware-content-length": "3.54.0", + "@aws-sdk/middleware-host-header": "3.54.0", + "@aws-sdk/middleware-logger": "3.54.0", + "@aws-sdk/middleware-retry": "3.54.0", + "@aws-sdk/middleware-sdk-sts": "3.54.0", + "@aws-sdk/middleware-serde": "3.54.0", + "@aws-sdk/middleware-signing": "3.54.0", + "@aws-sdk/middleware-stack": "3.54.0", + "@aws-sdk/middleware-user-agent": "3.54.0", + "@aws-sdk/node-config-provider": "3.54.0", + "@aws-sdk/node-http-handler": "3.54.0", + "@aws-sdk/protocol-http": "3.54.0", + "@aws-sdk/smithy-client": "3.54.0", + "@aws-sdk/types": "3.54.0", + "@aws-sdk/url-parser": "3.54.0", + "@aws-sdk/util-base64-browser": "3.52.0", + "@aws-sdk/util-base64-node": "3.52.0", + "@aws-sdk/util-body-length-browser": "3.54.0", + "@aws-sdk/util-body-length-node": "3.54.0", + "@aws-sdk/util-defaults-mode-browser": "3.54.0", + "@aws-sdk/util-defaults-mode-node": "3.54.0", + "@aws-sdk/util-user-agent-browser": "3.54.0", + "@aws-sdk/util-user-agent-node": "3.54.0", + "@aws-sdk/util-utf8-browser": "3.52.0", + "@aws-sdk/util-utf8-node": "3.52.0", "entities": "2.2.0", "fast-xml-parser": "3.19.0", - "tslib": "^2.3.1" + "tslib": "^2.3.0" } }, "@aws-sdk/config-resolver": { - "version": "3.75.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/config-resolver/-/config-resolver-3.75.0.tgz", - "integrity": "sha512-sM1tygyXTEU8+UXAOs9353+lYoaWdtxPtxfC4zQsQUi0zUYCyO8jO7bNBo277uF82jkGwkraUL/F0ZN7KyzjSQ==", + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/config-resolver/-/config-resolver-3.54.0.tgz", + "integrity": "sha512-VaNuvJLMaz3znmBD9BNkoEqNUs5teILU66SnFqBwVqabmOVeOh7M6/f43CcDarkwGklzZB/bn/rx9NOWUtdunA==", "requires": { - "@aws-sdk/signature-v4": "3.58.0", - "@aws-sdk/types": "3.55.0", - "@aws-sdk/util-config-provider": "3.55.0", - "@aws-sdk/util-middleware": "3.55.0", - "tslib": "^2.3.1" + "@aws-sdk/signature-v4": "3.54.0", + "@aws-sdk/types": "3.54.0", + "@aws-sdk/util-config-provider": "3.52.0", + "tslib": "^2.3.0" } }, "@aws-sdk/credential-provider-env": { - "version": "3.55.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.55.0.tgz", - "integrity": "sha512-4AIIXEdvinLlWNFtrUbUgoB7dkuV04RTcTruVWI4Ub4WSsuSCa72ZU1vqyvcEAOgGGLBmcSaGTWByjiD2sGcGA==", + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.54.0.tgz", + "integrity": "sha512-XWfzoUyFVsT4J7iTnXO38FKNdGFyE6ZNBtW9+Yx9EiiLtUlzH09PRv+54KIRQ4uqU+fEdtRh0gOdFajTrnRi3g==", "requires": { - "@aws-sdk/property-provider": "3.55.0", - "@aws-sdk/types": "3.55.0", - "tslib": "^2.3.1" + "@aws-sdk/property-provider": "3.54.0", + "@aws-sdk/types": "3.54.0", + "tslib": "^2.3.0" } }, "@aws-sdk/credential-provider-imds": { - "version": "3.75.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-imds/-/credential-provider-imds-3.75.0.tgz", - "integrity": "sha512-woqM/cZCnPvlel6t5o79CqT8doXe/7tSH5j8RPpfkYUwfdQwQqpjNqcO2QfkVzq4WsKfRZ92U00BhXsWDUZRfg==", + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-imds/-/credential-provider-imds-3.54.0.tgz", + "integrity": "sha512-Chygp8jswdjtCPmNxEMXigX4clgqh5GDaFGopR/gFaaG960hjF88Fx1/CPYD7exvM1FRO67nyfBOS0QKjSqTXg==", "requires": { - "@aws-sdk/node-config-provider": "3.75.0", - "@aws-sdk/property-provider": "3.55.0", - "@aws-sdk/types": "3.55.0", - "@aws-sdk/url-parser": "3.55.0", - "tslib": "^2.3.1" + "@aws-sdk/node-config-provider": "3.54.0", + "@aws-sdk/property-provider": "3.54.0", + "@aws-sdk/types": "3.54.0", + "@aws-sdk/url-parser": "3.54.0", + "tslib": "^2.3.0" } }, "@aws-sdk/credential-provider-ini": { - "version": "3.76.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.76.0.tgz", - "integrity": "sha512-2je7+yjAilgwB/jZwPnhW0P8McmuZoY29A9v45SZxRSW2yABuEUJ3EvcoieUXXNRRnEz96BrldpUHDC8VhXPJw==", + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.54.0.tgz", + "integrity": "sha512-EobK9bJwsUdMKx7vB+tL5eaNaj/NoOPaFJlv0JRL3+5px7d2vF0i9yklj4uT7F3vDlOup6R3b1Gg9GtqxfYt9w==", "requires": { - "@aws-sdk/credential-provider-env": "3.55.0", - "@aws-sdk/credential-provider-imds": "3.75.0", - "@aws-sdk/credential-provider-sso": "3.76.0", - "@aws-sdk/credential-provider-web-identity": "3.55.0", - "@aws-sdk/property-provider": "3.55.0", - "@aws-sdk/shared-ini-file-loader": "3.75.0", - "@aws-sdk/types": "3.55.0", - "tslib": "^2.3.1" + "@aws-sdk/credential-provider-env": "3.54.0", + "@aws-sdk/credential-provider-imds": "3.54.0", + "@aws-sdk/credential-provider-sso": "3.54.0", + "@aws-sdk/credential-provider-web-identity": "3.54.0", + "@aws-sdk/property-provider": "3.54.0", + "@aws-sdk/shared-ini-file-loader": "3.52.0", + "@aws-sdk/types": "3.54.0", + "@aws-sdk/util-credentials": "3.53.0", + "tslib": "^2.3.0" } }, "@aws-sdk/credential-provider-node": { - "version": "3.76.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.76.0.tgz", - "integrity": "sha512-PCBB4sj/t5oatxuqogfB/TANMJWjE8zIAwJJagJdXgyo4vMZ8IsSjnkpMwXdUoyPq+rUx6zFq8XagJF+WW0PBw==", + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.54.0.tgz", + "integrity": "sha512-KsXJG0K7yJg2MCzNW52fSDbCIR5mRobbNnXTMpDRkghlQyHP1gdHsyRedVciMkJhdDILop2lScLw70iQBayP/Q==", "requires": { - "@aws-sdk/credential-provider-env": "3.55.0", - "@aws-sdk/credential-provider-imds": "3.75.0", - "@aws-sdk/credential-provider-ini": "3.76.0", - "@aws-sdk/credential-provider-process": "3.75.0", - "@aws-sdk/credential-provider-sso": "3.76.0", - "@aws-sdk/credential-provider-web-identity": "3.55.0", - "@aws-sdk/property-provider": "3.55.0", - "@aws-sdk/shared-ini-file-loader": "3.75.0", - "@aws-sdk/types": "3.55.0", - "tslib": "^2.3.1" + "@aws-sdk/credential-provider-env": "3.54.0", + "@aws-sdk/credential-provider-imds": "3.54.0", + "@aws-sdk/credential-provider-ini": "3.54.0", + "@aws-sdk/credential-provider-process": "3.54.0", + "@aws-sdk/credential-provider-sso": "3.54.0", + "@aws-sdk/credential-provider-web-identity": "3.54.0", + "@aws-sdk/property-provider": "3.54.0", + "@aws-sdk/shared-ini-file-loader": "3.52.0", + "@aws-sdk/types": "3.54.0", + "@aws-sdk/util-credentials": "3.53.0", + "tslib": "^2.3.0" } }, "@aws-sdk/credential-provider-process": { - "version": "3.75.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.75.0.tgz", - "integrity": "sha512-G5dvX37AvS+oLGpka2JXv9wS6uViYQnspJ/56RDmXQElE7ChHBRz89GB4lOOowVQMROzpP96LARr8XNJ4iFq/w==", + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.54.0.tgz", + "integrity": "sha512-hjUQ6FRG3Ihsm77Rgrf1dSfRUVZAFEyAHCuwURePXpYjzMpFYjl12wL6Pwa7MLCqVMyLKQ8HYamznkgBlLQqxw==", "requires": { - "@aws-sdk/property-provider": "3.55.0", - "@aws-sdk/shared-ini-file-loader": "3.75.0", - "@aws-sdk/types": "3.55.0", - "tslib": "^2.3.1" + "@aws-sdk/property-provider": "3.54.0", + "@aws-sdk/shared-ini-file-loader": "3.52.0", + "@aws-sdk/types": "3.54.0", + "@aws-sdk/util-credentials": "3.53.0", + "tslib": "^2.3.0" } }, "@aws-sdk/credential-provider-sso": { - "version": "3.76.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.76.0.tgz", - "integrity": "sha512-i2vD1nrq72dNOhfsNI2iRvmI+eaxZeXQCkE5WUqURT8nHCloEkKDPchWWY2obUCVAnL1EPEoSKHyAETl1uSYew==", + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.54.0.tgz", + "integrity": "sha512-8HfBTdOw+9gbWsXRTr5y+QYq8gK+YYDx7tKbNv7ZWjMfw49SDef0j0W4ZBZH+FYEPepOEAKjBgtjvlUeFxrOaA==", "requires": { - "@aws-sdk/client-sso": "3.76.0", - "@aws-sdk/property-provider": "3.55.0", - "@aws-sdk/shared-ini-file-loader": "3.75.0", - "@aws-sdk/types": "3.55.0", - "tslib": "^2.3.1" + "@aws-sdk/client-sso": "3.54.0", + "@aws-sdk/property-provider": "3.54.0", + "@aws-sdk/shared-ini-file-loader": "3.52.0", + "@aws-sdk/types": "3.54.0", + "@aws-sdk/util-credentials": "3.53.0", + "tslib": "^2.3.0" } }, "@aws-sdk/credential-provider-web-identity": { - "version": "3.55.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.55.0.tgz", - "integrity": "sha512-aKnXfZNGohTuF9rCGYLg4JEIOvWIZ/sb66XMq7bOUrx13KRPDwL/eUQL8quS5jGRLpjXVNvrS17AFf65GbdUBg==", + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.54.0.tgz", + "integrity": "sha512-Mi87IzpgIi6P3WntumgMJ6rNY8Ay/HtsLFYm4bZ1ZGJH/3QVT4YLm1n8A4xoC+ouhL0i24jmN3X1aNu6amBfEg==", "requires": { - "@aws-sdk/property-provider": "3.55.0", - "@aws-sdk/types": "3.55.0", - "tslib": "^2.3.1" + "@aws-sdk/property-provider": "3.54.0", + "@aws-sdk/types": "3.54.0", + "tslib": "^2.3.0" } }, "@aws-sdk/eventstream-marshaller": { - "version": "3.58.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-marshaller/-/eventstream-marshaller-3.58.0.tgz", - "integrity": "sha512-vTdVFLIHGZTx/Anp9GpkTXVuvwSCNOecTutU5Py4i6fATgefWiSutc5Xc/FLujBSc0EhAXDGZIcTMpZC7jUpeg==", + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-marshaller/-/eventstream-marshaller-3.54.0.tgz", + "integrity": "sha512-blOxssrHCnugxdcudYB3Vmlp7ziG0to9RfnPq+InI98mIDm3G+rt7vW6GtlkgyWu0EYduj6N+aOI7ssRUCOyDQ==", "requires": { "@aws-crypto/crc32": "2.0.0", - "@aws-sdk/types": "3.55.0", - "@aws-sdk/util-hex-encoding": "3.58.0", - "tslib": "^2.3.1" + "@aws-sdk/types": "3.54.0", + "@aws-sdk/util-hex-encoding": "3.52.0", + "tslib": "^2.3.0" } }, "@aws-sdk/eventstream-serde-browser": { - "version": "3.72.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-serde-browser/-/eventstream-serde-browser-3.72.0.tgz", - "integrity": "sha512-UhMZ4P60mZu7G+craAdkRgR4/n3lWAgrNp1upgN2W8RLEQwhqY3qHiUdn/kp6qvontwHnxZkXNB+5Zm5pcP8bQ==", + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-serde-browser/-/eventstream-serde-browser-3.54.0.tgz", + "integrity": "sha512-XU9+nA7WlO+Rj0hV+C/2ZlB0zfI4eoit/CIlfGaonfx6EFezH3l4ngMZq8lgd8fSuPy1dN25DWQsW/F3AFSRdg==", "requires": { - "@aws-sdk/eventstream-marshaller": "3.58.0", - "@aws-sdk/eventstream-serde-universal": "3.72.0", - "@aws-sdk/types": "3.55.0", - "tslib": "^2.3.1" + "@aws-sdk/eventstream-marshaller": "3.54.0", + "@aws-sdk/eventstream-serde-universal": "3.54.0", + "@aws-sdk/types": "3.54.0", + "tslib": "^2.3.0" } }, "@aws-sdk/eventstream-serde-config-resolver": { - "version": "3.55.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-3.55.0.tgz", - "integrity": "sha512-NTJHLq1sbXyXAaJucKvcdN3Svr/fM2TjHEC3l8P/torFjIsX1+Ykpi8tZt8KsX8RjoUTTfKylh41AjJq0K9X4Q==", + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-3.54.0.tgz", + "integrity": "sha512-fnbwtjaSd05K2+rcEZ3TQfM6YBY6obWqqt/x0qTTt7277wdqvE3+i0dWcvrQLldGD7xY3+oitEmClAeCE0raiA==", "requires": { - "@aws-sdk/types": "3.55.0", - "tslib": "^2.3.1" + "@aws-sdk/types": "3.54.0", + "tslib": "^2.3.0" } }, "@aws-sdk/eventstream-serde-node": { - "version": "3.72.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-serde-node/-/eventstream-serde-node-3.72.0.tgz", - "integrity": "sha512-woemBkQ3O7mTiT3kdJH72s3lQLhr2B7hxRhYeaa1xQf1UjLJkKXL5PEOOrcylmxLdF6rYLsFs8Y/Hr4FZfqAqA==", + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-serde-node/-/eventstream-serde-node-3.54.0.tgz", + "integrity": "sha512-b/EXk+Yb6lspfdEvClDkutif1z7Ggbeg/s2z9ug8Zh32i4/8gc4kcoWHy4ez8GUqsrRuOfD1MScqxkSAmIlPlg==", "requires": { - "@aws-sdk/eventstream-marshaller": "3.58.0", - "@aws-sdk/eventstream-serde-universal": "3.72.0", - "@aws-sdk/types": "3.55.0", - "tslib": "^2.3.1" + "@aws-sdk/eventstream-marshaller": "3.54.0", + "@aws-sdk/eventstream-serde-universal": "3.54.0", + "@aws-sdk/types": "3.54.0", + "tslib": "^2.3.0" } }, "@aws-sdk/eventstream-serde-universal": { - "version": "3.72.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-serde-universal/-/eventstream-serde-universal-3.72.0.tgz", - "integrity": "sha512-iIaDC/2xgK+2kLiOPJv8wMDCCtI2JB8bkeac6cQOfn4hZGQdP6fvRGFWD2R8//VR52H68N2vrhCXHvtjnF4iFg==", + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-serde-universal/-/eventstream-serde-universal-3.54.0.tgz", + "integrity": "sha512-HdFYrLvKHWATev0BCp0I8xH40MhP9cNhxK0h+srdCC9o/Djs3QrI0Nn5rzWdg/hQDyRg8jPSvaGG8P/ekyTn2w==", "requires": { - "@aws-sdk/eventstream-marshaller": "3.58.0", - "@aws-sdk/types": "3.55.0", - "tslib": "^2.3.1" + "@aws-sdk/eventstream-marshaller": "3.54.0", + "@aws-sdk/types": "3.54.0", + "tslib": "^2.3.0" } }, "@aws-sdk/fetch-http-handler": { - "version": "3.58.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/fetch-http-handler/-/fetch-http-handler-3.58.0.tgz", - "integrity": "sha512-timF3FjPV5Bd+Kgph83LIKVlPCFObVYzious1a6doeLAT6YFwZpRrWbfP/HzS+DCoYiwUsH69oVJ91BoV66oyA==", + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/fetch-http-handler/-/fetch-http-handler-3.54.0.tgz", + "integrity": "sha512-TIn2ocem/gpMQ12KoiOu3uTHO86OOrmFITulV9D8xTzvFqHe34JKjHQPqII6lDbTCnU9N5CMv3N1CXxolIhiOQ==", "requires": { - "@aws-sdk/protocol-http": "3.58.0", - "@aws-sdk/querystring-builder": "3.55.0", - "@aws-sdk/types": "3.55.0", - "@aws-sdk/util-base64-browser": "3.58.0", - "tslib": "^2.3.1" + "@aws-sdk/protocol-http": "3.54.0", + "@aws-sdk/querystring-builder": "3.54.0", + "@aws-sdk/types": "3.54.0", + "@aws-sdk/util-base64-browser": "3.52.0", + "tslib": "^2.3.0" } }, "@aws-sdk/hash-blob-browser": { - "version": "3.58.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/hash-blob-browser/-/hash-blob-browser-3.58.0.tgz", - "integrity": "sha512-fdp12BqypRxwvevbJSl/sUhXJRi4Ghv6JKEXAHI1klkR6xY1GRORO5SHWltVY/xl373ERMol5o/n+ra/7jcx/g==", + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/hash-blob-browser/-/hash-blob-browser-3.54.0.tgz", + "integrity": "sha512-KIflBj2efxy5/z1ffg1HL3CRxqM7hNqel+dtVCYaCfTJ/MQhcfcR5GsodhJYl99pitryorJeB4chhgNv4bbPUA==", "requires": { - "@aws-sdk/chunked-blob-reader": "3.55.0", - "@aws-sdk/chunked-blob-reader-native": "3.58.0", - "@aws-sdk/types": "3.55.0", - "tslib": "^2.3.1" + "@aws-sdk/chunked-blob-reader": "3.52.0", + "@aws-sdk/chunked-blob-reader-native": "3.52.0", + "@aws-sdk/types": "3.54.0", + "tslib": "^2.3.0" } }, "@aws-sdk/hash-node": { - "version": "3.55.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/hash-node/-/hash-node-3.55.0.tgz", - "integrity": "sha512-2UdYwY/++AlzWEAFaK9wOed2QSxbzV527vmqKjReLHpPKPrSIlooUxlTH3LU6Y6WVDAzDRtLK43KUVXTLgGK1A==", + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/hash-node/-/hash-node-3.54.0.tgz", + "integrity": "sha512-o2XRftfj3Tj2jsZsdvnEY4OtmkT/9OADCWkINQCTcfy+nMuvs1IAS/qruunfaMJ58GntOoI4CVIbRa2lhhJr5w==", "requires": { - "@aws-sdk/types": "3.55.0", - "@aws-sdk/util-buffer-from": "3.55.0", - "tslib": "^2.3.1" + "@aws-sdk/types": "3.54.0", + "@aws-sdk/util-buffer-from": "3.52.0", + "tslib": "^2.3.0" } }, "@aws-sdk/hash-stream-node": { - "version": "3.58.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/hash-stream-node/-/hash-stream-node-3.58.0.tgz", - "integrity": "sha512-y7HEeC3OiuXCRqsHnKDn5yef8UAbnegD9r+OM9bdD+3e6FLAL8Rq7hQTOpwIAiPXuD7HKx8h98s9JLvkwTOBkg==", + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/hash-stream-node/-/hash-stream-node-3.54.0.tgz", + "integrity": "sha512-j936gz9O1ist0Bu2IXCf2DUrYfB9DkwKUMRAN14mTrKB+3PAMRhBazUVDJjIxPbcC9MQJnwIa2tiZWn8QC48UA==", "requires": { - "@aws-sdk/types": "3.55.0", - "tslib": "^2.3.1" + "@aws-sdk/types": "3.54.0", + "tslib": "^2.3.0" } }, "@aws-sdk/invalid-dependency": { - "version": "3.55.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/invalid-dependency/-/invalid-dependency-3.55.0.tgz", - "integrity": "sha512-delH0lV+78fdD/8MXIt9kTLS6IwHvdhqq9dw/ow5VjTUw+xBwUlfPfZplaai+3hKTKWh6a2WZCeDasNItBv9aA==", + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/invalid-dependency/-/invalid-dependency-3.54.0.tgz", + "integrity": "sha512-eeefTPtkb0FQFMBKmwhvmdPqCgGvTcWEiNH8pznAH0hqxLvOLNdNRoKnX5a1WlYoq3eTm0YN9Zh+N1Sj4mbkcg==", "requires": { - "@aws-sdk/types": "3.55.0", - "tslib": "^2.3.1" + "@aws-sdk/types": "3.54.0", + "tslib": "^2.3.0" } }, "@aws-sdk/is-array-buffer": { - "version": "3.55.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/is-array-buffer/-/is-array-buffer-3.55.0.tgz", - "integrity": "sha512-NbiPHVYuPxdqdFd6FxzzN3H1BQn/iWA3ri3Ry7AyLeP/tGs1yzEWMwf8BN8TSMALI0GXT6Sh0GDWy3Ok5xB6DA==", + "version": "3.52.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/is-array-buffer/-/is-array-buffer-3.52.0.tgz", + "integrity": "sha512-5Pe9QKrOeSZb9Z8gtlx9CDMfxH8EiNdClBfXBbc6CiUM7y6l7UintYHkm133zM5XTqtMRYY1jaD8svVAoRPApA==", "requires": { - "tslib": "^2.3.1" + "tslib": "^2.3.0" } }, "@aws-sdk/md5-js": { - "version": "3.58.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/md5-js/-/md5-js-3.58.0.tgz", - "integrity": "sha512-V5f4Re+CLn3aDF1nrmDqdUtcqBHCyxxD2s2Ot+hZ2JFit+OtJggo1cI03ldTrQpG79rwHG+bHqL2VvNQP7Aj9A==", + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/md5-js/-/md5-js-3.54.0.tgz", + "integrity": "sha512-pMprZD8JBw9WU4Risfd0Clm9SrUpsUS3QriSDeuFnGfRcKHkpw1sDj6HsNsIQ1OCeWuhYqW55Wtzc0pH8U80Mg==", "requires": { - "@aws-sdk/types": "3.55.0", - "@aws-sdk/util-utf8-browser": "3.55.0", - "@aws-sdk/util-utf8-node": "3.55.0", - "tslib": "^2.3.1" + "@aws-sdk/types": "3.54.0", + "@aws-sdk/util-utf8-browser": "3.52.0", + "@aws-sdk/util-utf8-node": "3.52.0", + "tslib": "^2.3.0" } }, "@aws-sdk/middleware-bucket-endpoint": { - "version": "3.75.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.75.0.tgz", - "integrity": "sha512-9YseY2OKPuZiiM/al8HOnc8eL3mVrvCrncmr2SChdEBJgZ5R51Qy/UrEtw7s6r+a5pgYCHJ6h6TWeOm7NnWpLQ==", + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.54.0.tgz", + "integrity": "sha512-4VC6zxDaveCnQD3eUJezSQ3Ikeq+MxRnvfcNhZytB20tYRy1PnR4jLoqjYkw5U1zstVRABbZdzlsWzZMe308ew==", "requires": { - "@aws-sdk/protocol-http": "3.58.0", - "@aws-sdk/types": "3.55.0", - "@aws-sdk/util-arn-parser": "3.55.0", - "@aws-sdk/util-config-provider": "3.55.0", - "tslib": "^2.3.1" + "@aws-sdk/protocol-http": "3.54.0", + "@aws-sdk/types": "3.54.0", + "@aws-sdk/util-arn-parser": "3.52.0", + "@aws-sdk/util-config-provider": "3.52.0", + "tslib": "^2.3.0" } }, "@aws-sdk/middleware-content-length": { - "version": "3.58.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-content-length/-/middleware-content-length-3.58.0.tgz", - "integrity": "sha512-h/BypPkhjv2CpCUbXA8Fa2s7V2GPiz9l11XhYK+sKSuQvQ7Lbq6VhaKaLqfeD3gLVZHgJZSLGl2btdHV1qHNNA==", + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-content-length/-/middleware-content-length-3.54.0.tgz", + "integrity": "sha512-DTlZo00stFwFHyR+GTXxhYePzNbXm+aX5yYQUsrsY2J2HuSbADVgDDekJXbtOH36QBa0OJf7JKbWP8PZDxk1zg==", "requires": { - "@aws-sdk/protocol-http": "3.58.0", - "@aws-sdk/types": "3.55.0", - "tslib": "^2.3.1" + "@aws-sdk/protocol-http": "3.54.0", + "@aws-sdk/types": "3.54.0", + "tslib": "^2.3.0" } }, "@aws-sdk/middleware-expect-continue": { - "version": "3.58.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.58.0.tgz", - "integrity": "sha512-nx6X6qLPwvbJrGoPxXSu4tsOek2eRnnjk78hhRUDfxFewpHJQLSPlyNKkXAo+C3syVALe6RJRmUYu5bShY6FfA==", + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.54.0.tgz", + "integrity": "sha512-6k4hoD7XqGDA8yq10AzF+iafgc+RyrPxr4kqzv50+hI5CZkPcl/vOAgS7iD+Y33dLITYuh+jzlpn7zlLwdOoqw==", "requires": { - "@aws-sdk/middleware-header-default": "3.58.0", - "@aws-sdk/protocol-http": "3.58.0", - "@aws-sdk/types": "3.55.0", - "tslib": "^2.3.1" + "@aws-sdk/middleware-header-default": "3.54.0", + "@aws-sdk/protocol-http": "3.54.0", + "@aws-sdk/types": "3.54.0", + "tslib": "^2.3.0" } }, "@aws-sdk/middleware-flexible-checksums": { - "version": "3.72.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.72.0.tgz", - "integrity": "sha512-lrwTmpygp6bxGRi6kbMq+EtTW5nsts+B7Wj7MA8PBIQsKU06T2tYxjDBYOyHB1MiVhltlq+vebBvacT64KsbFA==", + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.54.0.tgz", + "integrity": "sha512-4+bUwQyYHtTbaJDaj2F7j2K/JUcYdKg169pKmpefZiXZVdfR2/WWwj7Wx7EI40rpPYHaMpSal9tIxz054LPYnw==", "requires": { "@aws-crypto/crc32": "2.0.0", "@aws-crypto/crc32c": "2.0.0", - "@aws-sdk/is-array-buffer": "3.55.0", - "@aws-sdk/protocol-http": "3.58.0", - "@aws-sdk/types": "3.55.0", - "tslib": "^2.3.1" + "@aws-sdk/is-array-buffer": "3.52.0", + "@aws-sdk/protocol-http": "3.54.0", + "@aws-sdk/types": "3.54.0", + "tslib": "^2.3.0" } }, "@aws-sdk/middleware-header-default": { - "version": "3.58.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-header-default/-/middleware-header-default-3.58.0.tgz", - "integrity": "sha512-7F+CdLLauMmNbwFGYrE2pKsgTKY8G2PgazHmaE9s3FySEFcGPWmiEAG8sVImfZooj8gxGFQMLr97nanWjhSq2Q==", + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-header-default/-/middleware-header-default-3.54.0.tgz", + "integrity": "sha512-DvkdMJRAYrVsu6S92Z/fhSnj7ZFCNE3ertmIiGsukfMuGmzkuVKxqlUfo89xS3sOF3VY2nNOdNTCnVY4VZLSQQ==", "requires": { - "@aws-sdk/protocol-http": "3.58.0", - "@aws-sdk/types": "3.55.0", - "tslib": "^2.3.1" + "@aws-sdk/protocol-http": "3.54.0", + "@aws-sdk/types": "3.54.0", + "tslib": "^2.3.0" } }, "@aws-sdk/middleware-host-header": { - "version": "3.58.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.58.0.tgz", - "integrity": "sha512-q/UKGcanm9e6DBRNN6UKhVqLvpRRdZWbmmPCeDNr4HqhCmgT6i1OvWdhAMOnT++hvCX8DpTsIXzNSlY6zWAxBg==", + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.54.0.tgz", + "integrity": "sha512-X+lvYc2ij1+9tfpvdGGb+/APvH7g/M9RYzIEkI/LvNjVCOA3f3rgzFftZZhD/zccRtrygsvXfeZhoDrHxFKl9g==", "requires": { - "@aws-sdk/protocol-http": "3.58.0", - "@aws-sdk/types": "3.55.0", - "tslib": "^2.3.1" + "@aws-sdk/protocol-http": "3.54.0", + "@aws-sdk/types": "3.54.0", + "tslib": "^2.3.0" } }, "@aws-sdk/middleware-location-constraint": { - "version": "3.55.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.55.0.tgz", - "integrity": "sha512-OvCKwBFbl8Gbfk0HGX00pkdORJN8BPuH/O5l3+mOBWuwILPuckRP5WGnL+1HT/gu4hHS6h1lpxUrPxUOoeKIAg==", + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.54.0.tgz", + "integrity": "sha512-qwZR+GWlRoIFvvCt5ywmX3kV15KxrFbUxyAADCEJ4Q86ebEI3ux9mAHB6niOArRwtA5/wyvjRrOiYo/fTq7eLQ==", "requires": { - "@aws-sdk/types": "3.55.0", - "tslib": "^2.3.1" + "@aws-sdk/types": "3.54.0", + "tslib": "^2.3.0" } }, "@aws-sdk/middleware-logger": { - "version": "3.55.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.55.0.tgz", - "integrity": "sha512-PtRbVrxEzDmeV9prBIP4/9or7R5Dj66mjbFSvNRGZ0n+UBfBFfVRfNrhQPNzQpfV9A3KVl9YyWCVXDSW+/rk9Q==", + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.54.0.tgz", + "integrity": "sha512-bDCQj8IBq1vrXRRrpqD+suJ8hKc4oxUXpRkWdsAD+HnWWRqHjsy0hdq5F8Rj1Abq7CsFtZ+rUXddl+KlmgZ3+A==", "requires": { - "@aws-sdk/types": "3.55.0", - "tslib": "^2.3.1" + "@aws-sdk/types": "3.54.0", + "tslib": "^2.3.0" } }, "@aws-sdk/middleware-retry": { - "version": "3.75.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-retry/-/middleware-retry-3.75.0.tgz", - "integrity": "sha512-6aQqeasv31d3Iu9t5YyrbbG5m8VKvjTJ+Aeio976ImhZZEEHeh6Hl2i6yX1DvOALIZmFjjMFNHwJkNOVuxXrXg==", + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-retry/-/middleware-retry-3.54.0.tgz", + "integrity": "sha512-8kVzwxe0HQajeZWXzAp2XCkbiK8E8AZESfXvLyM34Xy2e8L8gdi1j90QLzpFk6WX6rz7hXBQG7utrCJkwXQxLA==", "requires": { - "@aws-sdk/protocol-http": "3.58.0", - "@aws-sdk/service-error-classification": "3.55.0", - "@aws-sdk/types": "3.55.0", - "@aws-sdk/util-middleware": "3.55.0", - "tslib": "^2.3.1", + "@aws-sdk/protocol-http": "3.54.0", + "@aws-sdk/service-error-classification": "3.54.0", + "@aws-sdk/types": "3.54.0", + "tslib": "^2.3.0", "uuid": "^8.3.2" } }, "@aws-sdk/middleware-sdk-s3": { - "version": "3.66.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.66.0.tgz", - "integrity": "sha512-4ACAdKAZkIjEK99UwoaKTrTGhS7qGqyLmjiGHlzR0ggMUUVmlep7EtcluImFtT6pi+ANVLDzuZGa+95MwGY/Qg==", + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.54.0.tgz", + "integrity": "sha512-xESksyOVCuDkMPC8mEqrInnuBeJHLSVOfwIl/pGwzevc+Q5spO9FDUlNfhaEVOEoLqK21TUdZo4z/ElNN94m4w==", "requires": { - "@aws-sdk/protocol-http": "3.58.0", - "@aws-sdk/types": "3.55.0", - "@aws-sdk/util-arn-parser": "3.55.0", - "tslib": "^2.3.1" + "@aws-sdk/protocol-http": "3.54.0", + "@aws-sdk/signature-v4": "3.54.0", + "@aws-sdk/types": "3.54.0", + "@aws-sdk/util-arn-parser": "3.52.0", + "tslib": "^2.3.0" } }, "@aws-sdk/middleware-sdk-sts": { - "version": "3.58.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.58.0.tgz", - "integrity": "sha512-HUz7MhcsSDDTGygOwL61l4voc0pZco06J3z06JjTX19D5XxcQ7hSCtkHHHz0oMb9M1himVSiEon2tjhjsnB99g==", + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.54.0.tgz", + "integrity": "sha512-4vOlG96fKgqmLMsguoKFdBkk2Fq8JttpgPts9d5Ox73+yQsa0VKrpLiD5OUPqgjGZcX2bilMKCAOBc2v3ESAHw==", "requires": { - "@aws-sdk/middleware-signing": "3.58.0", - "@aws-sdk/property-provider": "3.55.0", - "@aws-sdk/protocol-http": "3.58.0", - "@aws-sdk/signature-v4": "3.58.0", - "@aws-sdk/types": "3.55.0", - "tslib": "^2.3.1" + "@aws-sdk/middleware-signing": "3.54.0", + "@aws-sdk/property-provider": "3.54.0", + "@aws-sdk/protocol-http": "3.54.0", + "@aws-sdk/signature-v4": "3.54.0", + "@aws-sdk/types": "3.54.0", + "tslib": "^2.3.0" } }, "@aws-sdk/middleware-serde": { - "version": "3.55.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-serde/-/middleware-serde-3.55.0.tgz", - "integrity": "sha512-NkEbTDrSZcC2NhuvfjXHKJEl0xgI2B5tMAwi/rMOq/TEnARwVUL9qAy+5lgeiPCqebiNllWatARrFgAaYf0VeA==", + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-serde/-/middleware-serde-3.54.0.tgz", + "integrity": "sha512-O89/5aOiNegBP6Mv+gPr22Zawz2zF2v1o8kwFv2s4PWDzpmvrdF2by6e2Uh9sKzfpcwEW7Wr8kDTwajampVjgA==", "requires": { - "@aws-sdk/types": "3.55.0", - "tslib": "^2.3.1" + "@aws-sdk/types": "3.54.0", + "tslib": "^2.3.0" } }, "@aws-sdk/middleware-signing": { - "version": "3.58.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.58.0.tgz", - "integrity": "sha512-4FXubHB66GbhyZUlo6YPQoWpYfED15GNbEmHbJLSONzrVzZR3IkViSPLasDngVm1a050JqKuqNkFYGJBP4No/Q==", + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.54.0.tgz", + "integrity": "sha512-KYxmRDh7D6ysAezlsDf3cN2h6OjH66x3NUdgUmW+78nkN9tRvvJEjhmu6IOkPd4E1V9P3JOLbq6zVjDVU12WDQ==", "requires": { - "@aws-sdk/property-provider": "3.55.0", - "@aws-sdk/protocol-http": "3.58.0", - "@aws-sdk/signature-v4": "3.58.0", - "@aws-sdk/types": "3.55.0", - "tslib": "^2.3.1" + "@aws-sdk/property-provider": "3.54.0", + "@aws-sdk/protocol-http": "3.54.0", + "@aws-sdk/signature-v4": "3.54.0", + "@aws-sdk/types": "3.54.0", + "tslib": "^2.3.0" } }, "@aws-sdk/middleware-ssec": { - "version": "3.55.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.55.0.tgz", - "integrity": "sha512-HTdA23hksOphQe0TmYORsa/kMNnKRGbdh0VJcsDGHQScJXzJ+C//THwfcoklff0XZfC+vGh93PECBWqixMELZw==", + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.54.0.tgz", + "integrity": "sha512-wNQR5pRoN4wJq2IcFOXhRxvars4uWgdUnBQcJ5UDSJhUPwVDA4m+M83Q/54GWRHT+SVsobuNTmTeFnCbgsIq3A==", "requires": { - "@aws-sdk/types": "3.55.0", - "tslib": "^2.3.1" + "@aws-sdk/types": "3.54.0", + "tslib": "^2.3.0" } }, "@aws-sdk/middleware-stack": { - "version": "3.55.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-stack/-/middleware-stack-3.55.0.tgz", - "integrity": "sha512-ouD+wFz8W2R0ZQ8HrbhgN8tg1jyINEg9lPEEXY79w1Q5sf94LJ90XKAMVk02rw3dJalUWjLHf0OQe1/qxZfHyA==", + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-stack/-/middleware-stack-3.54.0.tgz", + "integrity": "sha512-38iit8VJ7jhFlMdwdDESEJOwbi8wIjF7Q1FOFIoCvURLGkTDQdabGXKwcFVfRuceLO+LJxWP3l0z0c10uZa6gQ==", "requires": { - "tslib": "^2.3.1" + "tslib": "^2.3.0" } }, "@aws-sdk/middleware-user-agent": { - "version": "3.58.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.58.0.tgz", - "integrity": "sha512-1c69bIWM63JwXijXvb9IWwcwQ/gViKMZ1lhxv52NvdG5VSxWXXsFJ2jETEXZoAypwT97Hmf3xo9SYuaHcKoq+g==", + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.54.0.tgz", + "integrity": "sha512-831GP5EBJdDxyq93dpgBZUwBWnZAID2aFvE/VN8c5X8U00ZT7GRt9cy5EL2b6AQN3Z4uWL1ZVDVkYmRAHs33Lg==", "requires": { - "@aws-sdk/protocol-http": "3.58.0", - "@aws-sdk/types": "3.55.0", - "tslib": "^2.3.1" + "@aws-sdk/protocol-http": "3.54.0", + "@aws-sdk/types": "3.54.0", + "tslib": "^2.3.0" } }, "@aws-sdk/node-config-provider": { - "version": "3.75.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/node-config-provider/-/node-config-provider-3.75.0.tgz", - "integrity": "sha512-eSR0HtqBwRp71d7Cp9fWzC+jtM5sDBcnp4vIQDIBPnHVzvMFwo2YPG0eF5SoYUgboHasHW8VGx9dUsKJ/qTcOg==", + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/node-config-provider/-/node-config-provider-3.54.0.tgz", + "integrity": "sha512-Q2a1vyoZa2UX/dItP3cqNdLUoTGdIY4hD5nA+mTg5mKlOWci35v8Rypr40tQz4ZwiDF6QQmK0tvD3bBUULm0wA==", "requires": { - "@aws-sdk/property-provider": "3.55.0", - "@aws-sdk/shared-ini-file-loader": "3.75.0", - "@aws-sdk/types": "3.55.0", - "tslib": "^2.3.1" + "@aws-sdk/property-provider": "3.54.0", + "@aws-sdk/shared-ini-file-loader": "3.52.0", + "@aws-sdk/types": "3.54.0", + "tslib": "^2.3.0" } }, "@aws-sdk/node-http-handler": { - "version": "3.76.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/node-http-handler/-/node-http-handler-3.76.0.tgz", - "integrity": "sha512-zPWPoaFC5n71efREtpSF1seijZ2E+Wsxz56EK3G55BY7WcSlLgdPXtOS1GXCFtq9Ce6gNALhYvaIryITrbtWsw==", + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/node-http-handler/-/node-http-handler-3.54.0.tgz", + "integrity": "sha512-g6+IXe4FCMrx4vrY73yvFNAUsBJ1vhjDshUCihBv5tEXsd45/MqmON/VWYoaQZts0m2wx2fKsdoDKSIZZY7AiQ==", "requires": { - "@aws-sdk/abort-controller": "3.55.0", - "@aws-sdk/protocol-http": "3.58.0", - "@aws-sdk/querystring-builder": "3.55.0", - "@aws-sdk/types": "3.55.0", - "tslib": "^2.3.1" + "@aws-sdk/abort-controller": "3.54.0", + "@aws-sdk/protocol-http": "3.54.0", + "@aws-sdk/querystring-builder": "3.54.0", + "@aws-sdk/types": "3.54.0", + "tslib": "^2.3.0" } }, "@aws-sdk/property-provider": { - "version": "3.55.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/property-provider/-/property-provider-3.55.0.tgz", - "integrity": "sha512-o7cKFJSHq5WOhwPsspYrzNto35oKKZvESZuWDtLxaZKSI6l7zpA366BI4kDG6Tc9i2+teV553MbxyZ9eya5A8g==", + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/property-provider/-/property-provider-3.54.0.tgz", + "integrity": "sha512-8e+KXskwOhXF0MIdIcZLFsOTfMVGp41Y6kywgewQaHkZoMzZ6euRziyWNgnshUE794tjxxol9resudSUehPjIw==", "requires": { - "@aws-sdk/types": "3.55.0", - "tslib": "^2.3.1" + "@aws-sdk/types": "3.54.0", + "tslib": "^2.3.0" } }, "@aws-sdk/protocol-http": { - "version": "3.58.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/protocol-http/-/protocol-http-3.58.0.tgz", - "integrity": "sha512-0yFFRPbR+CCa9eOQBBQ2qtrIDLYqSMN0y7G4iqVM8wQdIw7n3QK1PsTI3RNPGJ3Oi2krFTw5uUKqQQZPZEBuVQ==", + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/protocol-http/-/protocol-http-3.54.0.tgz", + "integrity": "sha512-v4CgQ2mBzEwNubM1duWP3Unu98EPNF2BuKWe4wT1HNG2MTkODS56fsgVT6sGGXS9nB/reEzB+3bXO5FS8+3SUg==", "requires": { - "@aws-sdk/types": "3.55.0", - "tslib": "^2.3.1" + "@aws-sdk/types": "3.54.0", + "tslib": "^2.3.0" } }, "@aws-sdk/querystring-builder": { - "version": "3.55.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-builder/-/querystring-builder-3.55.0.tgz", - "integrity": "sha512-/ZAXNipt9nRR8k+eowwukE/YjXnQ49p5w/MkaQxsBk3IuIf7MAcgVg8glHr0igH84GfUQ7ZVP8v+G2S3tKUG+Q==", + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-builder/-/querystring-builder-3.54.0.tgz", + "integrity": "sha512-7rs2gGPpiIHntbYGPFkxkXQkSK7uVBqlWRl0m6fNngUEz2n8jRxytB6LlALMHbXeXh28+zzq0VxbAwqAAUQ4oQ==", "requires": { - "@aws-sdk/types": "3.55.0", - "@aws-sdk/util-uri-escape": "3.55.0", - "tslib": "^2.3.1" + "@aws-sdk/types": "3.54.0", + "@aws-sdk/util-uri-escape": "3.52.0", + "tslib": "^2.3.0" } }, "@aws-sdk/querystring-parser": { - "version": "3.55.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-parser/-/querystring-parser-3.55.0.tgz", - "integrity": "sha512-e+2FLgo+eDx7oh7ap5HngN9XSVMxredAVztLHxCcSN0lFHHHzMa8b2SpXbaowUxQHh7ziymSqvOrPYFQ71Filg==", + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-parser/-/querystring-parser-3.54.0.tgz", + "integrity": "sha512-OZ4mRJ9rXgBskPBSoXBw8tV4kfNK0f/pP55qE1eZIcQ1z7EvVz4NjldgqMfscT20Cx5VzUbus3q9EPcV+HbR1w==", "requires": { - "@aws-sdk/types": "3.55.0", - "tslib": "^2.3.1" + "@aws-sdk/types": "3.54.0", + "tslib": "^2.3.0" } }, "@aws-sdk/s3-request-presigner": { - "version": "3.76.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/s3-request-presigner/-/s3-request-presigner-3.76.0.tgz", - "integrity": "sha512-dG4JjTtYdrLwLEDznKfKqVG+/KKQY3DRl2E4G3Vi+CsV+Sw5pb3MydphP/is4M+k4TLJVLCj7FYdWBx/C2F1aQ==", + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/s3-request-presigner/-/s3-request-presigner-3.54.0.tgz", + "integrity": "sha512-xPIahWW1brKu3Cnphx/pYAB3nRAyAZH4Zh7n1zm9XUsqqsBc4ZkIKqC5tDvJ/lBOLrqks8oSh2wpckfCwO9EpA==", "requires": { - "@aws-sdk/middleware-sdk-s3": "3.66.0", - "@aws-sdk/protocol-http": "3.58.0", - "@aws-sdk/signature-v4-multi-region": "3.66.0", - "@aws-sdk/smithy-client": "3.72.0", - "@aws-sdk/types": "3.55.0", - "@aws-sdk/util-create-request": "3.72.0", - "@aws-sdk/util-format-url": "3.58.0", - "tslib": "^2.3.1" + "@aws-sdk/middleware-sdk-s3": "3.54.0", + "@aws-sdk/protocol-http": "3.54.0", + "@aws-sdk/signature-v4": "3.54.0", + "@aws-sdk/smithy-client": "3.54.0", + "@aws-sdk/types": "3.54.0", + "@aws-sdk/util-create-request": "3.54.0", + "@aws-sdk/util-format-url": "3.54.0", + "tslib": "^2.3.0" } }, "@aws-sdk/service-error-classification": { - "version": "3.55.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/service-error-classification/-/service-error-classification-3.55.0.tgz", - "integrity": "sha512-HdjnDyarsa1Avq1MJurkLyEe9c3eRa76dPmK4TmRGgwJ+tInEzGHL0rBW7V8xBK+PDF+fJQ71hvm8jPYmzvBwQ==" + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/service-error-classification/-/service-error-classification-3.54.0.tgz", + "integrity": "sha512-XWANvjJJZNqsYhGmccSSuhsvINIUX1KckfDmvYtUR6cKM6nM6QWOg/QJeTFageTEpruJ5TqzW9vY414bIE883w==" }, "@aws-sdk/shared-ini-file-loader": { - "version": "3.75.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/shared-ini-file-loader/-/shared-ini-file-loader-3.75.0.tgz", - "integrity": "sha512-xNeBKoEqBWTdlSNhd0oA0ToA915zvKuAYHppOqJlAHpXQhjZN+Jtz31Rlor/EKZbHSMmZX7YzYMHhYWtY8aeCA==", + "version": "3.52.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/shared-ini-file-loader/-/shared-ini-file-loader-3.52.0.tgz", + "integrity": "sha512-tALb8u8IVcI4pT7yFZpl4O6kgeY5EAXyphZoRPgQSCDhmEyFUIi/sXbCN8HQiHjnHdWfXdaNE1YsZcW3GpcuoQ==", "requires": { - "tslib": "^2.3.1" + "tslib": "^2.3.0" } }, "@aws-sdk/signature-v4": { - "version": "3.58.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4/-/signature-v4-3.58.0.tgz", - "integrity": "sha512-flEo8p3XkzWoBDqnIUQre4jLuT5aLnmfQNI8c2uSjyJ3OBxpJ0iS1cDu3E++d1/pN6Q8o0KOmr2ypHeiyBOujw==", + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4/-/signature-v4-3.54.0.tgz", + "integrity": "sha512-22Bf8uQ0Q/I7WpLFU88G7WVpRw6tWUX9Ggr0Z++81uZF5YCPbWDNtFDHitoERaRc/M4vUMxNuTsX/JWOR3fFPg==", "requires": { - "@aws-sdk/is-array-buffer": "3.55.0", - "@aws-sdk/types": "3.55.0", - "@aws-sdk/util-hex-encoding": "3.58.0", - "@aws-sdk/util-middleware": "3.55.0", - "@aws-sdk/util-uri-escape": "3.55.0", - "tslib": "^2.3.1" + "@aws-sdk/is-array-buffer": "3.52.0", + "@aws-sdk/types": "3.54.0", + "@aws-sdk/util-hex-encoding": "3.52.0", + "@aws-sdk/util-uri-escape": "3.52.0", + "tslib": "^2.3.0" } }, - "@aws-sdk/signature-v4-multi-region": { - "version": "3.66.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.66.0.tgz", - "integrity": "sha512-Akvc8G9Del2+umg0R/5Gc/PWgQwbxxTXdnm6YTHtDzvyPPiYWBs6au6WqJQqcqk07gcQV67MLVqFFhnFuLlcVg==", + "@aws-sdk/signature-v4-crt": { + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-crt/-/signature-v4-crt-3.54.0.tgz", + "integrity": "sha512-3qKbc/i9PkBRyADIRm6QYIos/tjaYpVnqLWGngHivzF75yG2ZyWFIVNXD5KGIDm+UWu0ZI41IGfxVEoj5Dgc6A==", + "peer": true, "requires": { - "@aws-sdk/protocol-http": "3.58.0", - "@aws-sdk/signature-v4": "3.58.0", - "@aws-sdk/types": "3.55.0", - "@aws-sdk/util-arn-parser": "3.55.0", - "tslib": "^2.3.1" + "@aws-sdk/is-array-buffer": "3.52.0", + "@aws-sdk/querystring-parser": "3.54.0", + "@aws-sdk/signature-v4": "3.54.0", + "@aws-sdk/util-hex-encoding": "3.52.0", + "@aws-sdk/util-uri-escape": "3.52.0", + "aws-crt": "^1.9.7", + "tslib": "^2.3.0" } }, "@aws-sdk/smithy-client": { - "version": "3.72.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/smithy-client/-/smithy-client-3.72.0.tgz", - "integrity": "sha512-eQ2pEzxtS1Vz1XyNKzG4Z+mtfwRzcAs4FUQP0wrrYVJMsIdI0X4vvro8gYGoBbQtOz65uY3XqQdLuXX/SabTQg==", + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/smithy-client/-/smithy-client-3.54.0.tgz", + "integrity": "sha512-zdYN5pwhJU7x8qZKWTZPsFD5YQkDt6kyCNRsNjSWJ0ON4R3wUlFIwT3YzeQ5nMOTD86cVIm1n2RaSTYHwelFXg==", "requires": { - "@aws-sdk/middleware-stack": "3.55.0", - "@aws-sdk/types": "3.55.0", - "tslib": "^2.3.1" + "@aws-sdk/middleware-stack": "3.54.0", + "@aws-sdk/types": "3.54.0", + "tslib": "^2.3.0" } }, "@aws-sdk/types": { - "version": "3.55.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.55.0.tgz", - "integrity": "sha512-wrDZjuy1CVAYxDCbm3bWQIKMGfNs7XXmG0eG4858Ixgqmq2avsIn5TORy8ynBxcXn9aekV/+tGEQ7BBSYzIVNQ==" + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.54.0.tgz", + "integrity": "sha512-Jp2MHXnrM0pk0RIoSl5AHFm7TBk+7b8HTIcQ2X/6kGwwwnWw9qlg9ZFziegJTNTLJ4iVgZjz/yMlEvgrp7z9CA==" }, "@aws-sdk/url-parser": { - "version": "3.55.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/url-parser/-/url-parser-3.55.0.tgz", - "integrity": "sha512-qrTwN5xIgTLreqLnZ+x3cAudjNKfxi6srW1H/px2mk4lb2U9B4fpGjZ6VU+XV8U2kR+YlT8J6Jo5iwuVGfC91A==", + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/url-parser/-/url-parser-3.54.0.tgz", + "integrity": "sha512-DJWdlkXq3rsOydxwR9htPUW4QXhmo75Hybg96D3F2uPUvPCm8gJFngXp/9hW1OYcgfNu13HXqUy+t6V23cC7Iw==", "requires": { - "@aws-sdk/querystring-parser": "3.55.0", - "@aws-sdk/types": "3.55.0", - "tslib": "^2.3.1" + "@aws-sdk/querystring-parser": "3.54.0", + "@aws-sdk/types": "3.54.0", + "tslib": "^2.3.0" } }, "@aws-sdk/util-arn-parser": { - "version": "3.55.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.55.0.tgz", - "integrity": "sha512-76KJxp4MRWufHYWys7DFl64znr5yeJ3AIQNAPCKKw1sP0hzO7p6Kx0PaJnw9x+CPSzOrT4NbuApL6/srYhKDGg==", + "version": "3.52.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.52.0.tgz", + "integrity": "sha512-mMsoYJ70+BGkVpdfQbu942v4fAGzx+pIL8+QnQhzUmcU0HbNkI0vYliMWfzz7ka9CHgbijUI/ANKA319zgKtvA==", "requires": { - "tslib": "^2.3.1" + "tslib": "^2.3.0" } }, "@aws-sdk/util-base64-browser": { - "version": "3.58.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-base64-browser/-/util-base64-browser-3.58.0.tgz", - "integrity": "sha512-0ebsXIZNpu/fup9OgsFPnRKfCFbuuI9PPRzvP6twzLxUB0c/aix6Co7LGHFKcRKHZdaykoJMXArf8eHj2Nzv1Q==", + "version": "3.52.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-base64-browser/-/util-base64-browser-3.52.0.tgz", + "integrity": "sha512-xjv/cQ4goWXAiGEC/AIL/GtlHg4p4RkQKs6/zxn9jOxo1OnbppLMJ0LjCtv4/JVYIVGHrx0VJ8Exyod7Ln+NeA==", "requires": { - "tslib": "^2.3.1" + "tslib": "^2.3.0" } }, "@aws-sdk/util-base64-node": { - "version": "3.55.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-base64-node/-/util-base64-node-3.55.0.tgz", - "integrity": "sha512-UQ/ZuNoAc8CFMpSiRYmevaTsuRKzLwulZTnM8LNlIt9Wx1tpNvqp80cfvVj7yySKROtEi20wq29h31dZf1eYNQ==", + "version": "3.52.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-base64-node/-/util-base64-node-3.52.0.tgz", + "integrity": "sha512-V96YIXBuIiVu7Zk72Y9dly7Io9cYOT30Hjf77KAkBeizlFgT5gWklWYGcytPY8FxLuEy4dPLeHRmgwQnlDwgPA==", "requires": { - "@aws-sdk/util-buffer-from": "3.55.0", - "tslib": "^2.3.1" + "@aws-sdk/util-buffer-from": "3.52.0", + "tslib": "^2.3.0" } }, "@aws-sdk/util-body-length-browser": { - "version": "3.55.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-browser/-/util-body-length-browser-3.55.0.tgz", - "integrity": "sha512-Ei2OCzXQw5N6ZkTMZbamUzc1z+z1R1Ja5tMEagz5BxuX4vWdBObT+uGlSzL8yvTbjoPjnxWA2aXyEqaUP3JS8Q==", + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-browser/-/util-body-length-browser-3.54.0.tgz", + "integrity": "sha512-hnY9cXbKWJ2Fjb4bK35sFdD4vK+sFe59JtxxI336yYzANulc462LU/J1RgONXYBW60d9iwJ7U+S+9oTJrEH6WQ==", "requires": { - "tslib": "^2.3.1" + "tslib": "^2.3.0" } }, "@aws-sdk/util-body-length-node": { - "version": "3.55.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-node/-/util-body-length-node-3.55.0.tgz", - "integrity": "sha512-lU1d4I+9wJwydduXs0SxSfd+mHKjxeyd39VwOv6i2KSwWkPbji9UQqpflKLKw+r45jL7+xU/zfeTUg5Tt/3Gew==", + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-body-length-node/-/util-body-length-node-3.54.0.tgz", + "integrity": "sha512-BBQB3kqHqHQp2GAINJGuse9JBM7hfU0tMp9rfw0nym4C/VRooiJVrIb28tKseLtd7nihXvsZXPvEc2jQBe1Thg==", "requires": { - "tslib": "^2.3.1" + "tslib": "^2.3.0" } }, "@aws-sdk/util-buffer-from": { - "version": "3.55.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-buffer-from/-/util-buffer-from-3.55.0.tgz", - "integrity": "sha512-uVzKG1UgvnV7XX2FPTylBujYMKBPBaq/qFBxfl0LVNfrty7YjpfieQxAe6yRLD+T0Kir/WDQwGvYC+tOYG3IGA==", + "version": "3.52.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-buffer-from/-/util-buffer-from-3.52.0.tgz", + "integrity": "sha512-hsG0lMlHjJUFoXIy59QLn6x4QU/vp/e0t3EjdD0t8aymB9iuJ43UeLjYTZdrOgtbWb8MXEF747vwg+P6n+4Lxw==", "requires": { - "@aws-sdk/is-array-buffer": "3.55.0", - "tslib": "^2.3.1" + "@aws-sdk/is-array-buffer": "3.52.0", + "tslib": "^2.3.0" } }, "@aws-sdk/util-config-provider": { - "version": "3.55.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-config-provider/-/util-config-provider-3.55.0.tgz", - "integrity": "sha512-30dzofQQfx6tp1jVZkZ0DGRsT0wwC15nEysKRiAcjncM64A0Cm6sra77d0os3vbKiKoPCI/lMsFr4o3533+qvQ==", + "version": "3.52.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-config-provider/-/util-config-provider-3.52.0.tgz", + "integrity": "sha512-1wonBNkOOLJpMZnz2Kn69ToFgSoTTyGzJInir8WC5sME3zpkb5j41kTuEVbImNJhVv9MKjmGYrMeZbBVniLRPw==", "requires": { - "tslib": "^2.3.1" + "tslib": "^2.3.0" } }, "@aws-sdk/util-create-request": { - "version": "3.72.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-create-request/-/util-create-request-3.72.0.tgz", - "integrity": "sha512-SRxo1RWQ9e7QonuIH8oNEiOJTtasOtYNRD5QYwbJKhNkB4Z6AaE00V28AjrdS/+rMOcb0DKugXZ8Nhbd+n+K0g==", + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-create-request/-/util-create-request-3.54.0.tgz", + "integrity": "sha512-Sa+t75YQnMXXcCruLBvKZ6B1DzyGAod1PZT+iDHwDDobDsUVG3Cjov9gJepYAH2EEmvZa9f0IT+W6lvGv3uL4w==", "requires": { - "@aws-sdk/middleware-stack": "3.55.0", - "@aws-sdk/smithy-client": "3.72.0", - "@aws-sdk/types": "3.55.0", - "tslib": "^2.3.1" + "@aws-sdk/middleware-stack": "3.54.0", + "@aws-sdk/smithy-client": "3.54.0", + "@aws-sdk/types": "3.54.0", + "tslib": "^2.3.0" + } + }, + "@aws-sdk/util-credentials": { + "version": "3.53.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-credentials/-/util-credentials-3.53.0.tgz", + "integrity": "sha512-XP/3mYOmSn5KpWv+PnBTP2UExXb+hx1ugbH4Gkveshdq9KBlVnpV5eVgIwSAnKBsplScfsNMJ5EOtHjz5Cvu5A==", + "requires": { + "@aws-sdk/shared-ini-file-loader": "3.52.0", + "tslib": "^2.3.0" } }, "@aws-sdk/util-defaults-mode-browser": { - "version": "3.72.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-browser/-/util-defaults-mode-browser-3.72.0.tgz", - "integrity": "sha512-xeoh4jdq+tpZWDwGeXeoAQI+rZaCBEicjumBcqfzkRFE3DyaeyPHn3hiKGSR13R+P6Uf86aqaRNmWAeZZjeE0w==", + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-browser/-/util-defaults-mode-browser-3.54.0.tgz", + "integrity": "sha512-9QnRbTsD2MuEr59vaPAbC95ba7druMFRSZjpwc3L7U9zpsJruNDaL5aAmV0gCAIPZg7eSaJmipyWr0AvwwgroQ==", "requires": { - "@aws-sdk/property-provider": "3.55.0", - "@aws-sdk/types": "3.55.0", + "@aws-sdk/property-provider": "3.54.0", + "@aws-sdk/types": "3.54.0", "bowser": "^2.11.0", - "tslib": "^2.3.1" + "tslib": "^2.3.0" } }, "@aws-sdk/util-defaults-mode-node": { - "version": "3.75.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-node/-/util-defaults-mode-node-3.75.0.tgz", - "integrity": "sha512-zR53YinMCSVcdXumxBMdnZANl5ld0riuEoDwgKIivag/5xOAp/r+PziYvaMDbIvdqtkwwMBXf+WAc9jb0/D7sg==", + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-node/-/util-defaults-mode-node-3.54.0.tgz", + "integrity": "sha512-kHFgEyAWCaR5uSmRwyVbWQnjiNib3EJSAG9y7bwMIHSOK/6TVOXGlb1KIoO6ZtLE1FZFlS55FIRFeOPmIFFZbA==", "requires": { - "@aws-sdk/config-resolver": "3.75.0", - "@aws-sdk/credential-provider-imds": "3.75.0", - "@aws-sdk/node-config-provider": "3.75.0", - "@aws-sdk/property-provider": "3.55.0", - "@aws-sdk/types": "3.55.0", - "tslib": "^2.3.1" + "@aws-sdk/config-resolver": "3.54.0", + "@aws-sdk/credential-provider-imds": "3.54.0", + "@aws-sdk/node-config-provider": "3.54.0", + "@aws-sdk/property-provider": "3.54.0", + "@aws-sdk/types": "3.54.0", + "tslib": "^2.3.0" } }, "@aws-sdk/util-format-url": { - "version": "3.58.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-format-url/-/util-format-url-3.58.0.tgz", - "integrity": "sha512-nhxomsG+OIBqpIyc2AU88J3+dTap0H5R1D2lNAsSZk07kuu2B1H4qAXIlWPkXyxTi9uL9aykBMuCosECD062NA==", + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-format-url/-/util-format-url-3.54.0.tgz", + "integrity": "sha512-nnrXT0dQc+eRWJPgkqDK91NEluTFU9Tqs/LhIlIq+6Z8BELTN24lCi9feUKtw1s3a5ucUSs2unYyfHnl35PeeQ==", "requires": { - "@aws-sdk/querystring-builder": "3.55.0", - "@aws-sdk/types": "3.55.0", - "tslib": "^2.3.1" + "@aws-sdk/querystring-builder": "3.54.0", + "@aws-sdk/types": "3.54.0", + "tslib": "^2.3.0" } }, "@aws-sdk/util-hex-encoding": { - "version": "3.58.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-hex-encoding/-/util-hex-encoding-3.58.0.tgz", - "integrity": "sha512-Rl+jXUzk/FJkOLYfUVYPhKa2aUmTpeobRP31l8IatQltSzDgLyRHO35f6UEs7Ztn5s1jbu/POatLAZ2WjbgVyg==", + "version": "3.52.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-hex-encoding/-/util-hex-encoding-3.52.0.tgz", + "integrity": "sha512-YYMZg8odn/hBURgL/w82ay2mvPqXHMdujlSndT1ddUSTRoZX67N3hfYYf36nOalDOjNcanIvFHe4Fe8nw+8JiA==", "requires": { - "tslib": "^2.3.1" + "tslib": "^2.3.0" } }, "@aws-sdk/util-locate-window": { - "version": "3.55.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.55.0.tgz", - "integrity": "sha512-0sPmK2JaJE2BbTcnvybzob/VrFKCXKfN4CUKcvn0yGg/me7Bz+vtzQRB3Xp+YSx+7OtWxzv63wsvHoAnXvgxgg==", + "version": "3.52.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.52.0.tgz", + "integrity": "sha512-l10U2cLko6070A9DYLJG4NMtwYH8JBG2J/E+RH8uY3lad2o6fGEIkJU0jQbWbUeHYLG3IWuCxT47V4gxYrFj7g==", "requires": { - "tslib": "^2.3.1" - } - }, - "@aws-sdk/util-middleware": { - "version": "3.55.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-middleware/-/util-middleware-3.55.0.tgz", - "integrity": "sha512-82fW2XV+rUalv8lkd4VlhpPp6xnXO5n9sckMp1N+TrQ+p8eqxqT0+o8n1/6s9Qsnkw64Y3m6+EfCdc8/uFOY2g==", - "requires": { - "tslib": "^2.3.1" + "tslib": "^2.3.0" } }, "@aws-sdk/util-stream-browser": { - "version": "3.55.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-stream-browser/-/util-stream-browser-3.55.0.tgz", - "integrity": "sha512-3f/zQsAqexJpKssCL0adTjG8WO+NPQ63E3TingyKpnCnHQPEnqPdya5I5OLGzZ0WR0iUWRtpuW0MtuDabyLDWw==", + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-stream-browser/-/util-stream-browser-3.54.0.tgz", + "integrity": "sha512-KVBRQcTie9Q231pdbO4gzGxHG8wNomGic3bHDnwfVdE+tq1Pbi8xNgUelmmd/uZvgMf8awuNN8OHzkex06HAHQ==", "requires": { - "@aws-sdk/types": "3.55.0", - "tslib": "^2.3.1" + "@aws-sdk/types": "3.54.0", + "tslib": "^2.3.0" } }, "@aws-sdk/util-stream-node": { - "version": "3.55.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-stream-node/-/util-stream-node-3.55.0.tgz", - "integrity": "sha512-brCK3iENvXEL7BK5eDAdkZ2VuBSvXj7DH9EQezxl4Ntrj1lvb+McOk9WoU/o7yzE7A/bzEJEoNQAPi+VPNbb/w==", + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-stream-node/-/util-stream-node-3.54.0.tgz", + "integrity": "sha512-h3kpLMYzGgPkCIq0sLlE70zAt75C6wcbZm4gPh5iN8KRmmhpktqKpBami9J5fY6cBPC5ZlEmv5iDdZrI90Imrw==", "requires": { - "@aws-sdk/types": "3.55.0", - "tslib": "^2.3.1" + "@aws-sdk/types": "3.54.0", + "tslib": "^2.3.0" } }, "@aws-sdk/util-uri-escape": { - "version": "3.55.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-uri-escape/-/util-uri-escape-3.55.0.tgz", - "integrity": "sha512-mmdDLUpFCN2nkfwlLdOM54lTD528GiGSPN1qb8XtGLgZsJUmg3uJSFIN2lPeSbEwJB3NFjVas/rnQC48i7mV8w==", + "version": "3.52.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-uri-escape/-/util-uri-escape-3.52.0.tgz", + "integrity": "sha512-W9zw5tE8syjg17jiCYtyF99F0FgDIekQdLg+tQGobw9EtCxlUdg48UYhifPfnjvVyADRX2ntclHF9NmhusOQaQ==", "requires": { - "tslib": "^2.3.1" + "tslib": "^2.3.0" } }, "@aws-sdk/util-user-agent-browser": { - "version": "3.58.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.58.0.tgz", - "integrity": "sha512-aJpqCvT09giJRg5xFTBDBRAVF0k0yq3OEf6UTuiOVf5azlL2MGp6PJ/xkJp9Z06PuQQkwBJ/2nIQZemo02a5Sw==", + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.54.0.tgz", + "integrity": "sha512-pU5KL1Nnlc1igeED2R44k9GEIxlLBhwmUGIw8/Emfm8xAlGOX4NsVSfHK9EpJQth0z5ZJ4Lni6S5+nW4V16yLw==", "requires": { - "@aws-sdk/types": "3.55.0", + "@aws-sdk/types": "3.54.0", "bowser": "^2.11.0", - "tslib": "^2.3.1" + "tslib": "^2.3.0" } }, "@aws-sdk/util-user-agent-node": { - "version": "3.75.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.75.0.tgz", - "integrity": "sha512-tUKI/WIhPjGwIxFZIApWz64/JwJwwzt55Rxp8kv0cP/rYVjfCZafokUKLRwJaOBWi79luvNKV7V6lXY7RjT61A==", + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.54.0.tgz", + "integrity": "sha512-euKoYk1TfyV9XlJyAlGWdYqhQ5B4COwBxsV9OpwiAINUFm91NSv6uavFC/ZZQBXRks6j9pHDAXeXu7bHVolvlA==", "requires": { - "@aws-sdk/node-config-provider": "3.75.0", - "@aws-sdk/types": "3.55.0", - "tslib": "^2.3.1" + "@aws-sdk/node-config-provider": "3.54.0", + "@aws-sdk/types": "3.54.0", + "tslib": "^2.3.0" } }, "@aws-sdk/util-utf8-browser": { - "version": "3.55.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.55.0.tgz", - "integrity": "sha512-ljzqJcyjfJpEVSIAxwtIS8xMRUly84BdjlBXyp6cu4G8TUufgjNS31LWdhyGhgmW5vYBNr+LTz0Kwf6J+ou7Ug==", + "version": "3.52.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.52.0.tgz", + "integrity": "sha512-LuOMa9ajWu5fQuYkmvTlQZfHaITkSle+tM/vhbU4JquRN44VUKACjRGT7UEhoU3lCL1BD0JFGMQGHI+5Mmuwfg==", "requires": { - "tslib": "^2.3.1" + "tslib": "^2.3.0" } }, "@aws-sdk/util-utf8-node": { - "version": "3.55.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-node/-/util-utf8-node-3.55.0.tgz", - "integrity": "sha512-FsFm7GFaC7j0tlPEm/ri8bU2QCwFW5WKjxUg8lm1oWaxplCpKGUsmcfPJ4sw58GIoyoGu4QXBK60oCWosZYYdQ==", + "version": "3.52.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-node/-/util-utf8-node-3.52.0.tgz", + "integrity": "sha512-fujr7zeobZ2y5nnOnQZrCPPc+lCAhtNF/LEVslsQfd+AQ0bYWiosrKNetodQVWlfh10E2+i6/5g+1SBJ5kjsLw==", "requires": { - "@aws-sdk/util-buffer-from": "3.55.0", - "tslib": "^2.3.1" + "@aws-sdk/util-buffer-from": "3.52.0", + "tslib": "^2.3.0" } }, "@aws-sdk/util-waiter": { - "version": "3.55.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-waiter/-/util-waiter-3.55.0.tgz", - "integrity": "sha512-Do34MKPFSC/+zVN6vY+FZ+0WN61hzga4nPoAC590AOjs8rW6/H6sDN6Gz1KAZbPnuQUZfvsIJjMxN7lblXHJkQ==", + "version": "3.54.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-waiter/-/util-waiter-3.54.0.tgz", + "integrity": "sha512-+Gz5R14jWKsQtMCWbzWJe2Ac/CdMV/h5/R8uEZmwM3f6MHICPOftMQd0uDLdGezSBV9PuU3PCwiBZBTFzNSYBg==", "requires": { - "@aws-sdk/abort-controller": "3.55.0", - "@aws-sdk/types": "3.55.0", - "tslib": "^2.3.1" + "@aws-sdk/abort-controller": "3.54.0", + "@aws-sdk/types": "3.54.0", + "tslib": "^2.3.0" } }, "@aws-sdk/xml-builder": { - "version": "3.55.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.55.0.tgz", - "integrity": "sha512-BH+i5S2FLprmfSeIuGy3UbNtEoJPVjh8arl5+LV3i2KY/+TmrS4yT8JtztDlDxHF0cMtNLZNO0KEPtsACS6SOg==", + "version": "3.52.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.52.0.tgz", + "integrity": "sha512-GMdcxdwDZuIMlGnewdB48bpj8eqA3nubs3biy6vRFX8zhv8OqD+m5fMinoEwD8/MGqWE3WD7VZlbbdwYtNVWzQ==", "requires": { - "tslib": "^2.3.1" + "tslib": "^2.3.0" } }, "@babel/code-frame": { @@ -18005,9 +18973,9 @@ } }, "@fortawesome/fontawesome-free": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-6.1.1.tgz", - "integrity": "sha512-J/3yg2AIXc9wznaVqpHVX3Wa5jwKovVF0AMYSnbmcXTiL3PpRPfF58pzWucCwEiCJBp+hCNRLWClTomD8SseKg==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-6.0.0.tgz", + "integrity": "sha512-6LB4PYBST1Rx40klypw1SmSDArjFOcfBf2LeX9Zg5EKJT2eXiyiJq+CyBYKeXyK0sXS2FsCJWSPr/luyhuvh0Q==", "dev": true }, "@gar/promisify": { @@ -18016,6 +18984,22 @@ "integrity": "sha512-82cpyJyKRoQoRi+14ibCeGPu0CwypgtBAdBhq1WfvagpCZNKqwXbKwXllYSMG91DhmG4jt9gN8eP6lGOtozuaw==", "dev": true }, + "@httptoolkit/websocket-stream": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@httptoolkit/websocket-stream/-/websocket-stream-6.0.0.tgz", + "integrity": "sha512-EC8m9JbhpGX2okfvLakqrmy4Le0VyNKR7b3IdvFZR/BfFO4ruh/XceBvXhCFHkykchnFxuOSlRwFiqNSXlwcGA==", + "peer": true, + "requires": { + "@types/ws": "*", + "duplexify": "^3.5.1", + "inherits": "^2.0.1", + "isomorphic-ws": "^4.0.1", + "readable-stream": "^2.3.3", + "safe-buffer": "^5.1.2", + "ws": "*", + "xtend": "^4.0.0" + } + }, "@humanwhocodes/config-array": { "version": "0.9.3", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.3.tgz", @@ -18577,9 +19561,9 @@ "dev": true }, "@types/d3-selection": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-1.4.3.tgz", - "integrity": "sha512-GjKQWVZO6Sa96HiKO6R93VBE8DUW+DDkFpIMf9vpY5S78qZTlRRSNUsHr/afDpF7TvLDV7VxrUFOWW7vdIlYkA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.2.tgz", + "integrity": "sha512-d29EDd0iUBrRoKhPndhDY6U/PYxOWqgIZwKTooy2UkBfU7TNZNpRho0yLWPxlatQrFWk2mnTu71IZQ4+LRgKlQ==", "dev": true }, "@types/eslint": { @@ -18667,8 +19651,7 @@ "@types/node": { "version": "16.11.24", "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.24.tgz", - "integrity": "sha512-Ezv33Rl4mIi6YdSHfIRNBd4Q9kUe5okiaw/ikvJiJDmuQZNW5kfdg7+oQPF8NO6sTcr3woIpj3jANzTXdvEZXA==", - "dev": true + "integrity": "sha512-Ezv33Rl4mIi6YdSHfIRNBd4Q9kUe5okiaw/ikvJiJDmuQZNW5kfdg7+oQPF8NO6sTcr3woIpj3jANzTXdvEZXA==" }, "@types/parse-json": { "version": "4.0.0", @@ -18741,7 +19724,6 @@ "version": "8.2.2", "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.2.2.tgz", "integrity": "sha512-NOn5eIcgWLOo6qW8AcuLZ7G8PycXu0xTxxkS6Q18VWFxgPUSOwV0pBj2a/4viNZVu25i7RIB7GttdkAIUUXOOg==", - "dev": true, "requires": { "@types/node": "*" } @@ -19248,6 +20230,12 @@ "tslib": "^2.0.0" } }, + "ansi": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/ansi/-/ansi-0.3.1.tgz", + "integrity": "sha1-DELU+xcWDVqa8eSEus4cZpIsGyE=", + "peer": true + }, "ansi-colors": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", @@ -19313,6 +20301,16 @@ "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", "dev": true }, + "are-we-there-yet": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.0.6.tgz", + "integrity": "sha1-otKMkxAqpsyWJFomy5VN4G7FPww=", + "peer": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.0 || ^1.1.13" + } + }, "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -19414,6 +20412,31 @@ "postcss-value-parser": "^4.2.0" } }, + "aws-crt": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/aws-crt/-/aws-crt-1.11.1.tgz", + "integrity": "sha512-cWlauv11KD6PNZL3tLj1aM5A+NF8wKT2L8gej1FgyAnN1dL4n1oEm3HwuxmPYk09TRIPgkvXG5aHW2qefiO+fA==", + "peer": true, + "requires": { + "@httptoolkit/websocket-stream": "^6.0.0", + "axios": "^0.24.0", + "cmake-js": "6.3.0", + "crypto-js": "^4.0.0", + "fastestsmallesttextencoderdecoder": "^1.0.22", + "mqtt": "^4.3.4", + "tar": "^6.1.11", + "ws": "^7.5.5" + } + }, + "axios": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.24.0.tgz", + "integrity": "sha512-Q6cWsys88HoPgAaFAVUb0WpPk0O8iTeisR9IMqy9G8AbO4NlpVknrnQS03zzF9PGAWgO3cgletO3VjV/P7VztA==", + "peer": true, + "requires": { + "follow-redirects": "^1.14.4" + } + }, "axobject-query": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.2.0.tgz", @@ -19517,8 +20540,7 @@ "balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "base-64": { "version": "0.1.0", @@ -19528,8 +20550,7 @@ "base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" }, "batch": { "version": "0.6.1", @@ -19537,12 +20558,28 @@ "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", "dev": true }, + "big-integer": { + "version": "1.6.51", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", + "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==", + "peer": true + }, "big.js": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", "dev": true }, + "binary": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", + "integrity": "sha1-n2BVO8XOjDOG87VTz/R0Yq3sqnk=", + "peer": true, + "requires": { + "buffers": "~0.1.1", + "chainsaw": "~0.1.0" + } + }, "binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", @@ -19553,7 +20590,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dev": true, "requires": { "buffer": "^5.5.0", "inherits": "^2.0.4", @@ -19564,7 +20600,6 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, "requires": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -19573,6 +20608,12 @@ } } }, + "bluebird": { + "version": "3.4.7", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz", + "integrity": "sha1-9y12C+Cbf3bQjtj66Ysomo0F+rM=", + "peer": true + }, "body-parser": { "version": "1.19.1", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.1.tgz", @@ -19649,7 +20690,6 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -19691,7 +20731,6 @@ "version": "5.7.1", "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "dev": true, "requires": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" @@ -19700,8 +20739,7 @@ "buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" }, "buffer-indexof": { "version": "1.1.1", @@ -19709,6 +20747,24 @@ "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", "dev": true }, + "buffer-indexof-polyfill": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.2.tgz", + "integrity": "sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A==", + "peer": true + }, + "buffer-shims": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz", + "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E=", + "peer": true + }, + "buffers": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", + "integrity": "sha1-skV5w77U1tOWru5tmorn9Ugqt7s=", + "peer": true + }, "builtin-modules": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", @@ -19782,6 +20838,15 @@ "integrity": "sha512-Wiz1Psk2MEK0pX3rUzWaunLTZzqS2JYZFzNKqAiJGiuxIjRPLgV6+VDPOg6lQOUxmDwhTlh198JsTTi8Hzw6aQ==", "dev": true }, + "chainsaw": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", + "integrity": "sha1-XqtQsor+WAdNDVgpE4iCi15fvJg=", + "peer": true, + "requires": { + "traverse": ">=0.3.0 <0.4" + } + }, "chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -19818,8 +20883,7 @@ "chownr": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "dev": true + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==" }, "chrome-trace-event": { "version": "1.0.3", @@ -19889,6 +20953,225 @@ "shallow-clone": "^3.0.0" } }, + "cmake-js": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/cmake-js/-/cmake-js-6.3.0.tgz", + "integrity": "sha512-1uqTOmFt6BIqKlrX+39/aewU/JVhyZWDqwAL+6psToUwxj3yWPJiwxiZFmV0XdcoWmqGs7peZTxTbJtAcH8hxw==", + "peer": true, + "requires": { + "axios": "^0.21.1", + "debug": "^4", + "fs-extra": "^5.0.0", + "is-iojs": "^1.0.1", + "lodash": "^4", + "memory-stream": "0", + "npmlog": "^1.2.0", + "rc": "^1.2.7", + "semver": "^5.0.3", + "splitargs": "0", + "tar": "^4", + "unzipper": "^0.8.13", + "url-join": "0", + "which": "^1.0.9", + "yargs": "^3.6.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "peer": true + }, + "axios": { + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", + "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", + "peer": true, + "requires": { + "follow-redirects": "^1.14.0" + } + }, + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "peer": true + }, + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "peer": true + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "peer": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + } + }, + "fs-extra": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz", + "integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==", + "peer": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "fs-minipass": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", + "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", + "peer": true, + "requires": { + "minipass": "^2.6.0" + } + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "peer": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "peer": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "minipass": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", + "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", + "peer": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", + "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", + "peer": true, + "requires": { + "minipass": "^2.9.0" + } + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "peer": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "peer": true + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "peer": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "peer": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "tar": { + "version": "4.4.19", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.19.tgz", + "integrity": "sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA==", + "peer": true, + "requires": { + "chownr": "^1.1.4", + "fs-minipass": "^1.2.7", + "minipass": "^2.9.0", + "minizlib": "^1.3.3", + "mkdirp": "^0.5.5", + "safe-buffer": "^5.2.1", + "yallist": "^3.1.1" + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "peer": true + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "peer": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + } + }, + "y18n": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", + "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==", + "peer": true + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "peer": true + }, + "yargs": { + "version": "3.32.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz", + "integrity": "sha1-AwiOnr+edWtpdRYR0qXvWRSCyZU=", + "peer": true, + "requires": { + "camelcase": "^2.0.1", + "cliui": "^3.0.3", + "decamelize": "^1.1.1", + "os-locale": "^1.4.0", + "string-width": "^1.0.1", + "window-size": "^0.1.4", + "y18n": "^3.2.0" + } + } + } + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "peer": true + }, "codelyzer": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/codelyzer/-/codelyzer-6.0.2.tgz", @@ -20016,6 +21299,16 @@ "integrity": "sha512-hRpmWIKgzd81vn0ydoWoyPoALEOnF4wt8yKD35Ib1D6XC2siLiYaiqfGkYrunuKdsXGwpBpHU3+9r+RVw2NZfA==", "dev": true }, + "commist": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/commist/-/commist-1.1.0.tgz", + "integrity": "sha512-rraC8NXWOEjhADbZe9QBNzLAN5Q3fsTPQtBV+fEVj6xKIgDgNiEVE6ZNfHpZOqfQ21YUzfVNUXLOEZquYvQPPg==", + "peer": true, + "requires": { + "leven": "^2.1.0", + "minimist": "^1.1.0" + } + }, "commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", @@ -20072,8 +21365,32 @@ "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "concat-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", + "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", + "peer": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.0.2", + "typedarray": "^0.0.6" + }, + "dependencies": { + "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==", + "peer": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } }, "connect-history-api-fallback": { "version": "1.6.0", @@ -20236,8 +21553,7 @@ "core-util-is": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" }, "cosmiconfig": { "version": "7.0.1", @@ -20345,6 +21661,12 @@ } } }, + "crypto-js": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.1.1.tgz", + "integrity": "sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw==", + "peer": true + }, "css": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/css/-/css-3.0.0.tgz", @@ -20496,6 +21818,13 @@ "d3-transition": "1", "d3-voronoi": "1", "d3-zoom": "1" + }, + "dependencies": { + "d3-selection": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-1.4.2.tgz", + "integrity": "sha512-SJ0BqYihzOjDnnlfyeHT0e30k0K1+5sR3d5fNueCNeuhZTnGw4M4o8mqJchSwgKMXCNFo+e2VTChiSJ0vYtXkg==" + } } }, "d3-array": { @@ -20518,6 +21847,13 @@ "d3-interpolate": "1", "d3-selection": "1", "d3-transition": "1" + }, + "dependencies": { + "d3-selection": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-1.4.2.tgz", + "integrity": "sha512-SJ0BqYihzOjDnnlfyeHT0e30k0K1+5sR3d5fNueCNeuhZTnGw4M4o8mqJchSwgKMXCNFo+e2VTChiSJ0vYtXkg==" + } } }, "d3-chord": { @@ -20559,6 +21895,13 @@ "requires": { "d3-dispatch": "1", "d3-selection": "1" + }, + "dependencies": { + "d3-selection": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-1.4.2.tgz", + "integrity": "sha512-SJ0BqYihzOjDnnlfyeHT0e30k0K1+5sR3d5fNueCNeuhZTnGw4M4o8mqJchSwgKMXCNFo+e2VTChiSJ0vYtXkg==" + } } }, "d3-dsv": { @@ -20664,9 +22007,9 @@ } }, "d3-selection": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-1.4.2.tgz", - "integrity": "sha512-SJ0BqYihzOjDnnlfyeHT0e30k0K1+5sR3d5fNueCNeuhZTnGw4M4o8mqJchSwgKMXCNFo+e2VTChiSJ0vYtXkg==" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", + "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==" }, "d3-shape": { "version": "1.3.7", @@ -20705,6 +22048,13 @@ "d3-interpolate": "1", "d3-selection": "^1.1.0", "d3-timer": "1" + }, + "dependencies": { + "d3-selection": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-1.4.2.tgz", + "integrity": "sha512-SJ0BqYihzOjDnnlfyeHT0e30k0K1+5sR3d5fNueCNeuhZTnGw4M4o8mqJchSwgKMXCNFo+e2VTChiSJ0vYtXkg==" + } } }, "d3-voronoi": { @@ -20722,6 +22072,13 @@ "d3-interpolate": "1", "d3-selection": "1", "d3-transition": "1" + }, + "dependencies": { + "d3-selection": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-1.4.2.tgz", + "integrity": "sha512-SJ0BqYihzOjDnnlfyeHT0e30k0K1+5sR3d5fNueCNeuhZTnGw4M4o8mqJchSwgKMXCNFo+e2VTChiSJ0vYtXkg==" + } } }, "damerau-levenshtein": { @@ -20734,11 +22091,16 @@ "version": "4.3.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", - "dev": true, "requires": { "ms": "2.1.2" } }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "peer": true + }, "decode-uri-component": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", @@ -20759,6 +22121,12 @@ "regexp.prototype.flags": "^1.2.0" } }, + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "peer": true + }, "deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", @@ -20817,8 +22185,7 @@ "delegates": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", - "dev": true + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" }, "depd": { "version": "1.1.2", @@ -20934,6 +22301,27 @@ "domhandler": "^4.2.0" } }, + "duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", + "peer": true, + "requires": { + "readable-stream": "^2.0.2" + } + }, + "duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "peer": true, + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, "ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -20995,6 +22383,15 @@ } } }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "peer": true, + "requires": { + "once": "^1.4.0" + } + }, "enhanced-resolve": { "version": "5.9.0", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.9.0.tgz", @@ -21870,6 +23267,12 @@ "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-3.19.0.tgz", "integrity": "sha512-4pXwmBplsCPv8FOY1WRakF970TjNGnGnfbOnLqjlYvMiF1SR3yOHyxMR/YCXpPTOspNF5gwudqktIP4VsWkvBg==" }, + "fastestsmallesttextencoderdecoder": { + "version": "1.0.22", + "resolved": "https://registry.npmjs.org/fastestsmallesttextencoderdecoder/-/fastestsmallesttextencoderdecoder-1.0.22.tgz", + "integrity": "sha512-Pb8d48e+oIuY4MaM64Cd7OW1gt4nxCHs7/ddPPZ/Ic3sg8yVGM7O9wDvZ7us6ScaUupzM+pfBolwtYhN1IxBIw==", + "peer": true + }, "fastparse": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz", @@ -22007,8 +23410,7 @@ "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==", - "dev": true + "integrity": "sha512-1x0S9UVJHsQprFcEC/qnNzBLcIxsjAV905f/UkQxbclCsoTWlacCNOpQa/anodLl2uaEKFhfWOvM2Qg77+15zA==" }, "font-awesome": { "version": "4.7.0", @@ -22050,7 +23452,6 @@ "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" } @@ -22064,8 +23465,7 @@ "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, "fsevents": { "version": "2.3.2", @@ -22074,6 +23474,38 @@ "dev": true, "optional": true }, + "fstream": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", + "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", + "peer": true, + "requires": { + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" + }, + "dependencies": { + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "peer": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "peer": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", @@ -22086,6 +23518,19 @@ "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", "dev": true }, + "gauge": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-1.2.7.tgz", + "integrity": "sha1-6c7FSD09TuDvRLYKfZnkk14TbZM=", + "peer": true, + "requires": { + "ansi": "^0.3.0", + "has-unicode": "^2.0.0", + "lodash.pad": "^4.1.0", + "lodash.padend": "^4.1.0", + "lodash.padstart": "^4.1.0" + } + }, "gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -22135,7 +23580,6 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -22183,8 +23627,7 @@ "graceful-fs": { "version": "4.2.9", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", - "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==", - "dev": true + "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==" }, "handle-thing": { "version": "2.0.1", @@ -22239,8 +23682,7 @@ "has-unicode": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", - "dev": true + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" }, "hdr-histogram-js": { "version": "2.0.3", @@ -22259,6 +23701,29 @@ "integrity": "sha512-7kIufnBqdsBGcSZLPJwqHT3yhk1QTsSlFsVD3kx5ixH/AlgBs9yM1q6DPhXZ8f8gtdqgh7N7/5btRLpQsS2gHw==", "dev": true }, + "help-me": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/help-me/-/help-me-3.0.0.tgz", + "integrity": "sha512-hx73jClhyk910sidBB7ERlnhMlFsJJIBqSVMFDwPN8o2v9nmp5KgLq1Xz1Bf1fCMMZ6mPrX159iG0VLy/fPMtQ==", + "peer": true, + "requires": { + "glob": "^7.1.6", + "readable-stream": "^3.6.0" + }, + "dependencies": { + "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==", + "peer": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, "hex-rgb": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/hex-rgb/-/hex-rgb-4.3.0.tgz", @@ -22405,8 +23870,7 @@ "ieee754": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" }, "ignore": { "version": "5.2.0", @@ -22476,7 +23940,6 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, "requires": { "once": "^1.3.0", "wrappy": "1" @@ -22485,8 +23948,7 @@ "inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "ini": { "version": "2.0.0", @@ -22578,6 +24040,12 @@ "side-channel": "^1.0.4" } }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", + "peer": true + }, "ip": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", @@ -22691,6 +24159,12 @@ "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", "dev": true }, + "is-iojs": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-iojs/-/is-iojs-1.1.0.tgz", + "integrity": "sha1-TBEDO11dlNbqs3dd7cm+fQCDJfE=", + "peer": true + }, "is-lambda": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", @@ -22818,14 +24292,12 @@ "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" }, "isobject": { "version": "3.0.1", @@ -22833,6 +24305,13 @@ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", "dev": true }, + "isomorphic-ws": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz", + "integrity": "sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==", + "peer": true, + "requires": {} + }, "istanbul-lib-coverage": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", @@ -22906,6 +24385,12 @@ "integrity": "sha512-JVzAR/AjBvVt2BmYhxRCSYysDsPcssdmTFnzyLEts9qNwmjmu4JTAMYubEfwVOSwpQ1I1sKKFcxhZCI2buerfw==", "peer": true }, + "js-sdsl": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-2.1.4.tgz", + "integrity": "sha512-/Ew+CJWHNddr7sjwgxaVeIORIH4AMVC9dy0hPf540ZGMVgS9d3ajwuVdyhDt6/QUvT8ATjR3yuYBKsS79F+H4A==", + "peer": true + }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -23015,6 +24500,15 @@ "integrity": "sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ==", "dev": true }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "peer": true, + "requires": { + "invert-kv": "^1.0.0" + } + }, "less": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/less/-/less-4.1.2.tgz", @@ -23076,6 +24570,12 @@ "klona": "^2.0.4" } }, + "leven": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz", + "integrity": "sha1-wuep93IJTe6dNCAq6KzORoeHVYA=", + "peer": true + }, "levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -23101,6 +24601,12 @@ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", "dev": true }, + "listenercount": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/listenercount/-/listenercount-1.0.1.tgz", + "integrity": "sha1-hMinKrWcRyUyFIDJdeZQg0LnCTc=", + "peer": true + }, "loader-runner": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.2.0.tgz", @@ -23144,11 +24650,23 @@ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, + "lodash.pad": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/lodash.pad/-/lodash.pad-4.5.1.tgz", + "integrity": "sha1-QzCUmoM6fI2iLMIPaibE1Z3runA=", + "peer": true + }, "lodash.padend": { "version": "4.6.1", "resolved": "https://registry.npmjs.org/lodash.padend/-/lodash.padend-4.6.1.tgz", "integrity": "sha1-U8y6BH0G4VjTEfRdpiX05J5vFm4=" }, + "lodash.padstart": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/lodash.padstart/-/lodash.padstart-4.6.1.tgz", + "integrity": "sha1-0uPuv/DZ05rVD1y9G1KnvOa7YRs=", + "peer": true + }, "lodash.trimstart": { "version": "4.5.1", "resolved": "https://registry.npmjs.org/lodash.trimstart/-/lodash.trimstart-4.5.1.tgz", @@ -23224,7 +24742,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, "requires": { "yallist": "^4.0.0" } @@ -23299,6 +24816,41 @@ "fs-monkey": "1.0.3" } }, + "memory-stream": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/memory-stream/-/memory-stream-0.0.3.tgz", + "integrity": "sha1-6+jdHDuLw4wOeUHp3dWuvmtN6D8=", + "peer": true, + "requires": { + "readable-stream": "~1.0.26-2" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "peer": true + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "peer": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "peer": true + } + } + }, "merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", @@ -23393,7 +24945,6 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, "requires": { "brace-expansion": "^1.1.7" } @@ -23401,14 +24952,12 @@ "minimist": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" }, "minipass": { "version": "3.1.6", "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz", "integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==", - "dev": true, "requires": { "yallist": "^4.0.0" } @@ -23475,7 +25024,6 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "dev": true, "requires": { "minipass": "^3.0.0", "yallist": "^4.0.0" @@ -23484,14 +25032,73 @@ "mkdirp": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" + }, + "mqtt": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/mqtt/-/mqtt-4.3.6.tgz", + "integrity": "sha512-1dgQbkbh1Bba9iAGDNIrhSZ4nLDjbhmNHjOEvsmKI1Bb+2orj0gHwjqUKJ5CKUMKBYbkQYRM1fy+N1/2iZOj5w==", + "peer": true, + "requires": { + "commist": "^1.0.0", + "concat-stream": "^2.0.0", + "debug": "^4.1.1", + "duplexify": "^4.1.1", + "help-me": "^3.0.0", + "inherits": "^2.0.3", + "lru-cache": "^6.0.0", + "minimist": "^1.2.5", + "mqtt-packet": "^6.8.0", + "number-allocator": "^1.0.9", + "pump": "^3.0.0", + "readable-stream": "^3.6.0", + "reinterval": "^1.1.0", + "rfdc": "^1.3.0", + "split2": "^3.1.0", + "ws": "^7.5.5", + "xtend": "^4.0.2" + }, + "dependencies": { + "duplexify": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.2.tgz", + "integrity": "sha512-fz3OjcNCHmRP12MJoZMPglx8m4rrFP8rovnk4vT8Fs+aonZoCwGg10dSsQsfP/E62eZcPTMSMP6686fu9Qlqtw==", + "peer": true, + "requires": { + "end-of-stream": "^1.4.1", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1", + "stream-shift": "^1.0.0" + } + }, + "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==", + "peer": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "mqtt-packet": { + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/mqtt-packet/-/mqtt-packet-6.10.0.tgz", + "integrity": "sha512-ja8+mFKIHdB1Tpl6vac+sktqy3gA8t9Mduom1BA75cI+R9AHnZOiaBQwpGiWnaVJLDGRdNhQmFaAqd7tkKSMGA==", + "peer": true, + "requires": { + "bl": "^4.0.2", + "debug": "^4.1.1", + "process-nextick-args": "^2.0.1" + } }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "multicast-dns": { "version": "6.2.3", @@ -23615,9 +25222,9 @@ "optional": true }, "node-forge": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", - "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.2.1.tgz", + "integrity": "sha512-Fcvtbb+zBcZXbTTVwqGA5W+MKBj56UjVRevvchv5XrcyXbmNdesfZL37nlcWOfpgHhgmxApw3tQbTr4CqNmX4w==", "dev": true }, "node-gyp": { @@ -23870,6 +25477,17 @@ "path-key": "^3.0.0" } }, + "npmlog": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-1.2.1.tgz", + "integrity": "sha1-KOe+YZYJtT960d0wChDWTXFiaLY=", + "peer": true, + "requires": { + "ansi": "~0.3.0", + "are-we-there-yet": "~1.0.0", + "gauge": "~1.2.0" + } + }, "nth-check": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz", @@ -23879,6 +25497,22 @@ "boolbase": "^1.0.0" } }, + "number-allocator": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/number-allocator/-/number-allocator-1.0.10.tgz", + "integrity": "sha512-K4AvNGKo9lP6HqsZyfSr9KDaqnwFzW203inhQEOwFrmFaYevpdX4VNwdOLk197aHujzbT//z6pCBrCOUYSM5iw==", + "peer": true, + "requires": { + "debug": "^4.3.1", + "js-sdsl": "^2.1.2" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "peer": true + }, "nx": { "version": "13.1.3", "resolved": "https://registry.npmjs.org/nx/-/nx-13.1.3.tgz", @@ -23963,7 +25597,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, "requires": { "wrappy": "1" } @@ -24070,6 +25703,15 @@ } } }, + "os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "peer": true, + "requires": { + "lcid": "^1.0.0" + } + }, "os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", @@ -24260,8 +25902,7 @@ "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, "path-key": { "version": "3.1.1", @@ -24748,8 +26389,7 @@ "process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, "promise-inflight": { "version": "1.0.1", @@ -24792,6 +26432,16 @@ "dev": true, "optional": true }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "peer": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, "punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", @@ -24850,6 +26500,32 @@ } } }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "peer": true, + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "peer": true + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "peer": true + } + } + }, "read-cache": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", @@ -24873,7 +26549,6 @@ "version": "2.3.7", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -24887,8 +26562,7 @@ "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" } } }, @@ -25002,6 +26676,12 @@ } } }, + "reinterval": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reinterval/-/reinterval-1.1.0.tgz", + "integrity": "sha1-M2Hs+jymwYKDOA3Qu5VG85D17Oc=", + "peer": true + }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -25091,6 +26771,12 @@ "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", "dev": true }, + "rfdc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", + "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", + "peer": true + }, "rgb-hex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/rgb-hex/-/rgb-hex-3.0.0.tgz", @@ -25136,8 +26822,7 @@ "safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" }, "safer-buffer": { "version": "2.1.2", @@ -25379,6 +27064,12 @@ "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "dev": true }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", + "peer": true + }, "setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", @@ -25600,6 +27291,34 @@ } } }, + "split2": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", + "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", + "peer": true, + "requires": { + "readable-stream": "^3.0.0" + }, + "dependencies": { + "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==", + "peer": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "splitargs": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/splitargs/-/splitargs-0.0.7.tgz", + "integrity": "sha1-/p965lc3GzOxDLgNoUPPgknPazs=", + "peer": true + }, "sprintf-js": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", @@ -25621,11 +27340,16 @@ "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", "dev": true }, + "stream-shift": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", + "peer": true + }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, "requires": { "safe-buffer": "~5.1.0" }, @@ -25633,8 +27357,7 @@ "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" } } }, @@ -25773,7 +27496,6 @@ "version": "6.1.11", "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", - "dev": true, "requires": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", @@ -25910,6 +27632,12 @@ "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", "dev": true }, + "traverse": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", + "integrity": "sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk=", + "peer": true + }, "tree-kill": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", @@ -26057,6 +27785,12 @@ "integrity": "sha512-5NkbXZUlmCE73Fs7gvkp1XXJWHYetPkg60QnQ2NXQmBYNFxbBr2zA8GCtaH4K2s2WhOmSlgiSTmrjrcm5tnM5g==", "dev": true }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "peer": true + }, "typescript": { "version": "4.5.5", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.5.tgz", @@ -26133,6 +27867,52 @@ "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", "dev": true }, + "unzipper": { + "version": "0.8.14", + "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.8.14.tgz", + "integrity": "sha512-8rFtE7EP5ssOwGpN2dt1Q4njl0N1hUXJ7sSPz0leU2hRdq6+pra57z4YPBlVqm40vcgv6ooKZEAx48fMTv9x4w==", + "peer": true, + "requires": { + "big-integer": "^1.6.17", + "binary": "~0.3.0", + "bluebird": "~3.4.1", + "buffer-indexof-polyfill": "~1.0.0", + "duplexer2": "~0.1.4", + "fstream": "~1.0.10", + "listenercount": "~1.0.1", + "readable-stream": "~2.1.5", + "setimmediate": "~1.0.4" + }, + "dependencies": { + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", + "peer": true + }, + "readable-stream": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.1.5.tgz", + "integrity": "sha1-ZvqLcg4UOLNkaB8q0aY8YYRIydA=", + "peer": true, + "requires": { + "buffer-shims": "^1.0.0", + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "string_decoder": "~0.10.x", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "peer": true + } + } + }, "uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -26158,11 +27938,16 @@ } } }, + "url-join": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/url-join/-/url-join-0.0.1.tgz", + "integrity": "sha1-HbSK1CLTQCRpqH99l73r/k+x48g=", + "peer": true + }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, "utils-merge": { "version": "1.0.1", @@ -26430,6 +28215,15 @@ "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", "dev": true }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "peer": true, + "requires": { + "isexe": "^2.0.0" + } + }, "which-boxed-primitive": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", @@ -26458,6 +28252,12 @@ "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", "dev": true }, + "window-size": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz", + "integrity": "sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY=", + "peer": true + }, "word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", @@ -26504,14 +28304,26 @@ "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "ws": { + "version": "7.5.7", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.7.tgz", + "integrity": "sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A==", + "peer": true, + "requires": {} }, "xhr2": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/xhr2/-/xhr2-0.2.1.tgz", "integrity": "sha512-sID0rrVCqkVNUn8t6xuv9+6FViXjUVXq8H5rWOH2rz9fDNQEd4g0EA2XlcEdJXRz5BMEn4O1pJFdT+z4YHhoWw==" }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "peer": true + }, "y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", @@ -26521,8 +28333,7 @@ "yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "yaml": { "version": "1.10.2", diff --git a/package.json b/package.json index 6d2920c4..d07b5312 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ClearML-webapp", - "version": "1.4.0", + "version": "1.5.0", "license": "", "scripts": { "ng": "ng", @@ -48,7 +48,7 @@ "bootstrap": "^4.6.1", "britecharts": "^2.18.0", "curved-arrows": "^0.1.0", - "d3-selection": "^1.4.2", + "d3-selection": "^3.0.0", "diff": "^5.0.0", "filesize": "^8.0.7", "has-ansi": "^5.0.1", @@ -87,7 +87,7 @@ "@fortawesome/fontawesome-free": "^6.0.0", "@ngrx/schematics": "^13.0.2", "@ngrx/store-devtools": "^13.0.2", - "@types/d3-selection": "^1.4.3", + "@types/d3-selection": "^3.0.2", "@types/lodash": "^4.14.178", "@types/node": "^16.11.19", "@types/plotly.js": "^1.54.20", diff --git a/src/app/business-logic/api-services/auth.service.ts b/src/app/business-logic/api-services/auth.service.ts index b8801e19..cd6fda1d 100644 --- a/src/app/business-logic/api-services/auth.service.ts +++ b/src/app/business-logic/api-services/auth.service.ts @@ -2,7 +2,7 @@ * auth * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.14 + * OpenAPI spec version: 2.18 * * * NOTE: This class is auto generated by the swagger code generator program. @@ -22,6 +22,7 @@ import { CustomHttpUrlEncodingCodec } from '../encoder'; import { Observable } from 'rxjs'; +import { AuthCreateCredentialsRequest } from '../model/auth/authCreateCredentialsRequest'; import { AuthCreateCredentialsResponse } from '../model/auth/authCreateCredentialsResponse'; import { AuthCreateUserRequest } from '../model/auth/authCreateUserRequest'; import { AuthCreateUserResponse } from '../model/auth/authCreateUserResponse'; @@ -40,6 +41,8 @@ import { AuthValidateTokenResponse } from '../model/auth/authValidateTokenRespon import { BASE_PATH, COLLECTION_FORMATS } from '../variables'; import { Configuration } from '../configuration'; +import {AuthEditCredentialsRequest} from '~/business-logic/model/auth/authEditCredentialsRequest'; +import {AuthEditCredentialsResponse} from '~/business-logic/model/auth/authEditCredentialsResponse'; @Injectable() @@ -75,13 +78,13 @@ export class ApiAuthService { /** - * + * * Internal. Creates a new set of credentials for the authenticated user. New key/secret is returned. Note: Secret will never be returned in any other API call. If a secret is lost or compromised, the key should be revoked and a new set of credentials can be created. * @param request request body * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body. * @param reportProgress flag to report request and response progress. */ - public authCreateCredentials(request: object, options?: any, observe: any = 'body', reportProgress: boolean = false ): Observable { + public authCreateCredentials(request: AuthCreateCredentialsRequest, options?: any, observe: any = 'body', reportProgress: boolean = false ): Observable { if (request === null || request === undefined) { throw new Error('Required parameter request was null or undefined when calling authCreateCredentials.'); } @@ -120,7 +123,7 @@ export class ApiAuthService { } /** - * + * * Internal. Creates a new user auth entry. Intended for internal use. * @param request request body * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body. @@ -165,7 +168,7 @@ export class ApiAuthService { } /** - * + * * Internal. Edit a users\' auth data properties * @param request request body * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body. @@ -210,7 +213,7 @@ export class ApiAuthService { } /** - * + * * Internal. Return fixed users mode status * @param request request body * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body. @@ -255,7 +258,7 @@ export class ApiAuthService { } /** - * + * * Internal. Returns all existing credential keys for the authenticated user. Note: Only credential keys are returned. * @param request request body * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body. @@ -299,11 +302,56 @@ export class ApiAuthService { ); } - /** - * - * Internal. Get a token for the specified user. Intended for internal use. - * @param request request body - * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body. + /** + * + * Internal. Updates the label of the existing credentials for the authenticated user. + * @param request request body + * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body. + * @param reportProgress flag to report request and response progress. + */ + public authEditCredentials(request: AuthEditCredentialsRequest, options?: any, observe: any = 'body', reportProgress: boolean = false ): Observable { + if (request === null || request === undefined) { + throw new Error('Required parameter request was null or undefined when calling authEditCredentials.'); + } + + let headers = this.defaultHeaders; + if (options && options.async_enable) { + headers = headers.set(this.configuration.asyncHeader, '1'); + } + + // to determine the Accept header + const httpHeaderAccepts: string[] = [ + 'application/json' + ]; + const httpHeaderAcceptSelected: string | undefined = this.configuration.selectHeaderAccept(httpHeaderAccepts); + if (httpHeaderAcceptSelected != undefined) { + headers = headers.set("Accept", httpHeaderAcceptSelected); + } + + // to determine the Content-Type header + const consumes: string[] = [ + ]; + const httpContentTypeSelected:string | undefined = this.configuration.selectHeaderContentType(consumes); + if (httpContentTypeSelected != undefined) { + headers = headers.set("Content-Type", httpContentTypeSelected); + } + + return this.apiRequest.post(`${this.basePath}/auth.edit_credentials`, + request, + { + withCredentials: this.configuration.withCredentials, + headers: headers, + observe: observe, + reportProgress: reportProgress + } + ); + } + + /** + * + * Internal. Get a token for the specified user. Intended for internal use. + * @param request request body + * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body. * @param reportProgress flag to report request and response progress. */ public authGetTokenForUser(request: AuthGetTokenForUserRequest, options?: any, observe: any = 'body', reportProgress: boolean = false ): Observable { @@ -345,7 +393,7 @@ export class ApiAuthService { } /** - * + * * Internal. Get a token based on supplied credentials (key/secret). Intended for use by users with key/secret credentials that wish to obtain a token for use with other services. * @param request request body * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body. @@ -390,7 +438,7 @@ export class ApiAuthService { } /** - * + * * Internal. Removes the authentication cookie from the current session * @param request request body * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body. @@ -435,7 +483,7 @@ export class ApiAuthService { } /** - * + * * Internal. Revokes (and deletes) a set (key, secret) of credentials for the authenticated user. * @param request request body * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body. @@ -480,7 +528,7 @@ export class ApiAuthService { } /** - * + * * Internal. Validate a token and return user identity if valid. Intended for internal use. * @param request request body * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body. diff --git a/src/app/business-logic/model/auth/authCreateCredentialsRequest.ts b/src/app/business-logic/model/auth/authCreateCredentialsRequest.ts new file mode 100644 index 00000000..84a479e2 --- /dev/null +++ b/src/app/business-logic/model/auth/authCreateCredentialsRequest.ts @@ -0,0 +1,20 @@ +/** + * auth + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * OpenAPI spec version: 2.18 + * + * + * NOTE: This class is auto generated by the swagger code generator program. + * https://github.com/swagger-api/swagger-codegen.git + * Do not edit the class manually. + */ + + + +export interface AuthCreateCredentialsRequest { + /** + * Optional credentials label + */ + label?: string; +} diff --git a/src/app/business-logic/model/auth/authCreateCredentialsResponse.ts b/src/app/business-logic/model/auth/authCreateCredentialsResponse.ts index a4f259ec..e662bc19 100644 --- a/src/app/business-logic/model/auth/authCreateCredentialsResponse.ts +++ b/src/app/business-logic/model/auth/authCreateCredentialsResponse.ts @@ -2,7 +2,7 @@ * auth * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.14 + * OpenAPI spec version: 2.18 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/auth/authCreateUserRequest.ts b/src/app/business-logic/model/auth/authCreateUserRequest.ts index 26300239..f5bb2ed5 100644 --- a/src/app/business-logic/model/auth/authCreateUserRequest.ts +++ b/src/app/business-logic/model/auth/authCreateUserRequest.ts @@ -2,7 +2,7 @@ * auth * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.14 + * OpenAPI spec version: 2.18 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/auth/authCreateUserResponse.ts b/src/app/business-logic/model/auth/authCreateUserResponse.ts index a9322cda..0f4d65dc 100644 --- a/src/app/business-logic/model/auth/authCreateUserResponse.ts +++ b/src/app/business-logic/model/auth/authCreateUserResponse.ts @@ -2,7 +2,7 @@ * auth * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.14 + * OpenAPI spec version: 2.18 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/auth/authEditCredentialsRequest.ts b/src/app/business-logic/model/auth/authEditCredentialsRequest.ts new file mode 100644 index 00000000..6cd311cb --- /dev/null +++ b/src/app/business-logic/model/auth/authEditCredentialsRequest.ts @@ -0,0 +1,24 @@ +/** + * auth + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * OpenAPI spec version: 999.0 + * + * + * NOTE: This class is auto generated by the swagger code generator program. + * https://github.com/swagger-api/swagger-codegen.git + * Do not edit the class manually. + */ + + + +export interface AuthEditCredentialsRequest { + /** + * Existing credentials key + */ + access_key: string; + /** + * New credentials label + */ + label?: string; +} diff --git a/src/app/business-logic/model/auth/authEditCredentialsResponse.ts b/src/app/business-logic/model/auth/authEditCredentialsResponse.ts new file mode 100644 index 00000000..9c63707e --- /dev/null +++ b/src/app/business-logic/model/auth/authEditCredentialsResponse.ts @@ -0,0 +1,20 @@ +/** + * auth + * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) + * + * OpenAPI spec version: 999.0 + * + * + * NOTE: This class is auto generated by the swagger code generator program. + * https://github.com/swagger-api/swagger-codegen.git + * Do not edit the class manually. + */ + + + +export interface AuthEditCredentialsResponse { + /** + * Number of credentials updated + */ + updated?: number; +} diff --git a/src/app/business-logic/model/auth/authEditUserRequest.ts b/src/app/business-logic/model/auth/authEditUserRequest.ts index a749b82e..c6f5be48 100644 --- a/src/app/business-logic/model/auth/authEditUserRequest.ts +++ b/src/app/business-logic/model/auth/authEditUserRequest.ts @@ -2,7 +2,7 @@ * auth * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.14 + * OpenAPI spec version: 2.18 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/auth/authEditUserResponse.ts b/src/app/business-logic/model/auth/authEditUserResponse.ts index a2630242..d6aaa88a 100644 --- a/src/app/business-logic/model/auth/authEditUserResponse.ts +++ b/src/app/business-logic/model/auth/authEditUserResponse.ts @@ -2,7 +2,7 @@ * auth * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.14 + * OpenAPI spec version: 2.18 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/auth/authFixedUsersModeResponse.ts b/src/app/business-logic/model/auth/authFixedUsersModeResponse.ts index 844584fe..0fdee647 100644 --- a/src/app/business-logic/model/auth/authFixedUsersModeResponse.ts +++ b/src/app/business-logic/model/auth/authFixedUsersModeResponse.ts @@ -2,7 +2,7 @@ * auth * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.14 + * OpenAPI spec version: 2.18 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/auth/authGetCredentialsResponse.ts b/src/app/business-logic/model/auth/authGetCredentialsResponse.ts index 5a577da8..26982948 100644 --- a/src/app/business-logic/model/auth/authGetCredentialsResponse.ts +++ b/src/app/business-logic/model/auth/authGetCredentialsResponse.ts @@ -2,7 +2,7 @@ * auth * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.14 + * OpenAPI spec version: 2.18 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/auth/authGetTokenForUserRequest.ts b/src/app/business-logic/model/auth/authGetTokenForUserRequest.ts index 028a519f..c4f0dacc 100644 --- a/src/app/business-logic/model/auth/authGetTokenForUserRequest.ts +++ b/src/app/business-logic/model/auth/authGetTokenForUserRequest.ts @@ -2,7 +2,7 @@ * auth * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.14 + * OpenAPI spec version: 2.18 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/auth/authGetTokenForUserResponse.ts b/src/app/business-logic/model/auth/authGetTokenForUserResponse.ts index 42d49e87..3804af3b 100644 --- a/src/app/business-logic/model/auth/authGetTokenForUserResponse.ts +++ b/src/app/business-logic/model/auth/authGetTokenForUserResponse.ts @@ -2,7 +2,7 @@ * auth * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.14 + * OpenAPI spec version: 2.18 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/auth/authLoginRequest.ts b/src/app/business-logic/model/auth/authLoginRequest.ts index 79537eb7..b7c7e530 100644 --- a/src/app/business-logic/model/auth/authLoginRequest.ts +++ b/src/app/business-logic/model/auth/authLoginRequest.ts @@ -2,7 +2,7 @@ * auth * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.14 + * OpenAPI spec version: 2.18 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/auth/authLoginResponse.ts b/src/app/business-logic/model/auth/authLoginResponse.ts index 5f04b390..7fc3d245 100644 --- a/src/app/business-logic/model/auth/authLoginResponse.ts +++ b/src/app/business-logic/model/auth/authLoginResponse.ts @@ -2,7 +2,7 @@ * auth * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.14 + * OpenAPI spec version: 2.18 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/auth/authRevokeCredentialsRequest.ts b/src/app/business-logic/model/auth/authRevokeCredentialsRequest.ts index 9843152e..dfb4e873 100644 --- a/src/app/business-logic/model/auth/authRevokeCredentialsRequest.ts +++ b/src/app/business-logic/model/auth/authRevokeCredentialsRequest.ts @@ -2,7 +2,7 @@ * auth * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.14 + * OpenAPI spec version: 2.18 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/auth/authRevokeCredentialsResponse.ts b/src/app/business-logic/model/auth/authRevokeCredentialsResponse.ts index eed18e62..88774167 100644 --- a/src/app/business-logic/model/auth/authRevokeCredentialsResponse.ts +++ b/src/app/business-logic/model/auth/authRevokeCredentialsResponse.ts @@ -2,7 +2,7 @@ * auth * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.14 + * OpenAPI spec version: 2.18 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/auth/authValidateTokenRequest.ts b/src/app/business-logic/model/auth/authValidateTokenRequest.ts index e3f14b36..38580a72 100644 --- a/src/app/business-logic/model/auth/authValidateTokenRequest.ts +++ b/src/app/business-logic/model/auth/authValidateTokenRequest.ts @@ -2,7 +2,7 @@ * auth * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.14 + * OpenAPI spec version: 2.18 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/auth/authValidateTokenResponse.ts b/src/app/business-logic/model/auth/authValidateTokenResponse.ts index 28565d42..6c91e1f4 100644 --- a/src/app/business-logic/model/auth/authValidateTokenResponse.ts +++ b/src/app/business-logic/model/auth/authValidateTokenResponse.ts @@ -2,7 +2,7 @@ * auth * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.14 + * OpenAPI spec version: 2.18 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/business-logic/model/auth/credentialKey.ts b/src/app/business-logic/model/auth/credentialKey.ts index fa3941a7..e667f159 100644 --- a/src/app/business-logic/model/auth/credentialKey.ts +++ b/src/app/business-logic/model/auth/credentialKey.ts @@ -2,7 +2,7 @@ * auth * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.14 + * OpenAPI spec version: 2.18 * * * NOTE: This class is auto generated by the swagger code generator program. @@ -14,16 +14,19 @@ export interface CredentialKey { /** - * + * */ access_key?: string; /** - * + * Optional credentials label + */ + label?: string; + /** + * */ last_used?: string; - /** - * - */ - last_used_from?: string; - label?: string; // (nir) until BE will implement + /** + * + */ + last_used_from?: string; } diff --git a/src/app/business-logic/model/auth/credentials.ts b/src/app/business-logic/model/auth/credentials.ts index 08210a8a..59f2a744 100644 --- a/src/app/business-logic/model/auth/credentials.ts +++ b/src/app/business-logic/model/auth/credentials.ts @@ -2,7 +2,7 @@ * auth * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.14 + * OpenAPI spec version: 2.18 * * * NOTE: This class is auto generated by the swagger code generator program. @@ -21,4 +21,8 @@ export interface Credentials { * Credentials secret key */ secret_key?: string; + /** + * Optional credentials label + */ + label?: string; } diff --git a/src/app/business-logic/model/auth/models.ts b/src/app/business-logic/model/auth/models.ts index 70ff191b..3240b11c 100644 --- a/src/app/business-logic/model/auth/models.ts +++ b/src/app/business-logic/model/auth/models.ts @@ -1,3 +1,4 @@ +export * from '././authCreateCredentialsRequest'; export * from '././authCreateCredentialsResponse'; export * from '././authCreateUserRequest'; export * from '././authCreateUserResponse'; diff --git a/src/app/business-logic/model/auth/role.ts b/src/app/business-logic/model/auth/role.ts index 324c0f4f..21b20698 100644 --- a/src/app/business-logic/model/auth/role.ts +++ b/src/app/business-logic/model/auth/role.ts @@ -2,7 +2,7 @@ * auth * No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator) * - * OpenAPI spec version: 2.14 + * OpenAPI spec version: 2.18 * * * NOTE: This class is auto generated by the swagger code generator program. diff --git a/src/app/core/effects/projects.effects.ts b/src/app/core/effects/projects.effects.ts index 572bd51e..bffee293 100644 --- a/src/app/core/effects/projects.effects.ts +++ b/src/app/core/effects/projects.effects.ts @@ -2,12 +2,12 @@ import { Injectable } from '@angular/core'; import {Actions, createEffect, ofType} from '@ngrx/effects'; import * as actions from '../../webapp-common/core/actions/projects.actions'; import {Store} from '@ngrx/store'; -import {selectSelectedProjectId} from '../../webapp-common/core/reducers/projects.reducer'; +import {selectSelectedProjectId} from '@common/core/reducers/projects.reducer'; import {catchError, finalize, mergeMap, switchMap, withLatestFrom} from 'rxjs/operators'; -import {deactivateLoader} from '../../webapp-common/core/actions/layout.actions'; -import {ALL_PROJECTS_OBJECT} from '../../webapp-common/core/effects/projects.effects'; -import {requestFailed} from '../../webapp-common/core/actions/http.actions'; -import {ApiProjectsService} from '../../business-logic/api-services/projects.service'; +import {deactivateLoader} from '@common/core/actions/layout.actions'; +import {ALL_PROJECTS_OBJECT} from '@common/core/effects/projects.effects'; +import {requestFailed} from '@common/core/actions/http.actions'; +import {ApiProjectsService} from '~/business-logic/api-services/projects.service'; @@ -15,14 +15,21 @@ import {ApiProjectsService} from '../../business-logic/api-services/projects.ser export class ProjectsEffects { private fetchingExampleExperiment: string = null; - constructor(private actions$: Actions, private store: Store, private projectsApi: ApiProjectsService) {} + constructor( + private actions$: Actions, + private store: Store, + private projectsApi: ApiProjectsService + ) {} getSelectedProject = createEffect(() => this.actions$.pipe( ofType(actions.setSelectedProjectId), withLatestFrom(this.store.select(selectSelectedProjectId)), switchMap(([action, selectedProjectId]) => { if (!action.projectId) { - return [actions.setSelectedProject({project: null})]; + return [ + deactivateLoader(action.type), + actions.setSelectedProject({project: null}), + ]; } if (action.projectId === selectedProjectId) { return [deactivateLoader(action.type)]; @@ -30,8 +37,8 @@ export class ProjectsEffects { if (action.projectId === '*') { return [ actions.setSelectedProject({project: ALL_PROJECTS_OBJECT}), - deactivateLoader(action.type) - ]; + actions.getProjectUsers(action), + deactivateLoader(action.type)]; } else { this.fetchingExampleExperiment = action.example && action.projectId; return this.projectsApi.projectsGetAllEx({ @@ -45,6 +52,7 @@ export class ProjectsEffects { finalize(() => this.fetchingExampleExperiment = null), mergeMap(({projects}) => [ actions.setSelectedProject({project: projects[0]}), + actions.getProjectUsers(action), deactivateLoader(action.type), ] ), diff --git a/src/app/core/reducers/users.reducer.ts b/src/app/core/reducers/users.reducer.ts index 986a784d..e251f81c 100644 --- a/src/app/core/reducers/users.reducer.ts +++ b/src/app/core/reducers/users.reducer.ts @@ -2,6 +2,7 @@ import {createReducer, createSelector, on} from '@ngrx/store'; import {initUsers, users, usersReducerFunctions, UsersState} from '@common/core/reducers/users-reducer'; import {setCurrentUser} from '../actions/users.action'; +import {of} from 'rxjs'; export const selectHasDataFeature = createSelector(users, state => false); export const selectHasUserManagement = createSelector(users, () => false); @@ -20,3 +21,4 @@ export const selectFeatures = createSelector(users, (state) => []); // eslint-disable-next-line @typescript-eslint/naming-convention export const selectTermsOfUse = createSelector(users, state => ({accept_required: null})); export const selectInvitesPending = createSelector(users, state => []); +export const userAllowedToCreateQueue$ = store => of(true); diff --git a/src/app/features/dashboard/containers/dashboard-search/dashboard-search.component.html b/src/app/features/dashboard/containers/dashboard-search/dashboard-search.component.html index 33bef068..725b4350 100644 --- a/src/app/features/dashboard/containers/dashboard-search/dashboard-search.component.html +++ b/src/app/features/dashboard/containers/dashboard-search/dashboard-search.component.html @@ -3,8 +3,11 @@ (projectSelected)="projectCardClicked($event)" (experimentSelected)="taskSelected($event)" (modelSelected)="modelSelected($event)" + (pipelineSelected)="pipelineSelected($event)" (activeLinkChanged)="activeLinkChanged($event)" [projectsList]="projectsResults$ | async" + [pipelinesList]="pipelinesResults$ | async" [experimentsList]="experimentsResults$ | async" [modelsList]="modelsResults$ | async" - [activeLink]="activeLink"> + [activeLink]="activeLink"> + diff --git a/src/app/features/dashboard/containers/dashboard-search/dashboard-search.component.ts b/src/app/features/dashboard/containers/dashboard-search/dashboard-search.component.ts index 820a125a..7f780099 100644 --- a/src/app/features/dashboard/containers/dashboard-search/dashboard-search.component.ts +++ b/src/app/features/dashboard/containers/dashboard-search/dashboard-search.component.ts @@ -3,10 +3,13 @@ import {Router} from '@angular/router'; import {combineLatest, Observable, ObservedValueOf, Subscription} from 'rxjs'; import {filter, skip} from 'rxjs/operators'; import {Store} from '@ngrx/store'; -import {Project} from '../../../../business-logic/model/projects/project'; -import {Model} from '../../../../business-logic/model/models/model'; -import {DashboardSearchComponentBase} from '../../../../webapp-common/dashboard/dashboard-search.component.base'; -import {SearchClear} from '../../../../webapp-common/dashboard-search/dashboard-search.actions'; +import {Project} from '~/business-logic/model/projects/project'; +import {Model} from '~/business-logic/model/models/model'; +import {DashboardSearchComponentBase} from '@common/dashboard/dashboard-search.component.base'; +import {SearchClear} from '@common/dashboard-search/dashboard-search.actions'; + +export type ActiveSearchLink = 'projects' | 'experiments' | 'models' | 'pipelines'; + @Component({ selector : ' sm-dashboard-search', diff --git a/src/app/features/dashboard/dashboard-search/dashboard-search.module.ts b/src/app/features/dashboard/dashboard-search/dashboard-search.module.ts index de9b37b9..404f546b 100644 --- a/src/app/features/dashboard/dashboard-search/dashboard-search.module.ts +++ b/src/app/features/dashboard/dashboard-search/dashboard-search.module.ts @@ -1,21 +1,12 @@ import {NgModule} from '@angular/core'; import {CommonModule} from '@angular/common'; -import {SMSharedModule} from '../../../webapp-common/shared/shared.module'; +import {SMSharedModule} from '@common/shared/shared.module'; import {StoreModule} from '@ngrx/store'; import {EffectsModule} from '@ngrx/effects'; -import {DashboardSearchEffects} from '../../../webapp-common/dashboard-search/dashboard-search.effects'; -import {ExperimentsSearchResultsComponent} from '../../../webapp-common/dashboard-search/dumb/experiments-search-results/experiments-search-results.component'; -import {ModelsSearchResultsComponent} from '../../../webapp-common/dashboard-search/dumb/models-search-results/models-search-results.component'; -import {ProjectsSearchResultsComponent} from '../../../webapp-common/dashboard-search/dumb/projects-search-results/projects-search-results.component'; +import {DashboardSearchEffects} from '@common/dashboard-search/dashboard-search.effects'; import {ProjectsSharedModule} from '../../projects/shared/projects-shared.module'; -import {SharedModule} from '../../../shared/shared.module'; -import {dashboardSearchReducer} from '../../../webapp-common/dashboard-search/dashboard-search.reducer'; - -const declarations = [ - ModelsSearchResultsComponent, - ProjectsSearchResultsComponent, - ExperimentsSearchResultsComponent, -]; +import {SharedModule} from '~/shared/shared.module'; +import {dashboardSearchReducer} from '@common/dashboard-search/dashboard-search.reducer'; @NgModule({ imports : [ @@ -26,8 +17,6 @@ const declarations = [ EffectsModule.forFeature([DashboardSearchEffects]), SharedModule ], - declarations: [declarations], - exports : [...declarations] }) export class DashboardSearchModule { } diff --git a/src/app/features/dashboard/dashboard.module.ts b/src/app/features/dashboard/dashboard.module.ts index 3df31029..eb8f306e 100644 --- a/src/app/features/dashboard/dashboard.module.ts +++ b/src/app/features/dashboard/dashboard.module.ts @@ -5,15 +5,16 @@ import {ExperimentSharedModule} from '../experiments/shared/experiment-shared.mo import {DashboardRoutingModule} from './dashboard-routing.module'; import {StoreModule} from '@ngrx/store'; import {GettingStartedCardComponent} from './dumb/getting-started-card/getting-started-card.component'; -import {SMSharedModule} from '../../webapp-common/shared/shared.module'; -import {CommonDashboardModule} from '../../webapp-common/dashboard/common-dashboard.module'; -import {commonDashboardReducer} from '../../webapp-common/dashboard/common-dashboard.reducer'; +import {SMSharedModule} from '@common/shared/shared.module'; +import {CommonDashboardModule} from '@common/dashboard/common-dashboard.module'; +import {commonDashboardReducer} from '@common/dashboard/common-dashboard.reducer'; import {DashboardSearchComponent} from './containers/dashboard-search/dashboard-search.component'; import {SearchResultsPageComponent} from './dumb/search-results-page/search-results-page.component'; -import {SharedModule} from '../../shared/shared.module'; +import {SharedModule} from '~/shared/shared.module'; import {DashboardSearchModule} from './dashboard-search/dashboard-search.module'; -import {ProjectDialogModule} from '../../webapp-common/shared/project-dialog/project-dialog.module'; +import {ProjectDialogModule} from '@common/shared/project-dialog/project-dialog.module'; import {ProjectsSharedModule} from '../projects/shared/projects-shared.module'; +import {SearchResultsComponent} from '@common/dashboard-search/dumb/search-results/search-results.component'; @NgModule({ imports: [ @@ -28,7 +29,7 @@ import {ProjectsSharedModule} from '../projects/shared/projects-shared.module'; SharedModule, DashboardSearchModule ], - declarations : [DashboardComponent, GettingStartedCardComponent, DashboardSearchComponent, SearchResultsPageComponent] + declarations : [DashboardComponent, GettingStartedCardComponent, DashboardSearchComponent, SearchResultsPageComponent, SearchResultsComponent] }) export class DashboardModule { } diff --git a/src/app/features/dashboard/dumb/search-results-page/search-results-page.component.html b/src/app/features/dashboard/dumb/search-results-page/search-results-page.component.html index 142c54e2..3f730323 100644 --- a/src/app/features/dashboard/dumb/search-results-page/search-results-page.component.html +++ b/src/app/features/dashboard/dumb/search-results-page/search-results-page.component.html @@ -7,22 +7,51 @@ (click)="activeLinkChanged.emit('experiments')">EXPERIMENTS {{'(' + experimentsList.length + ')'}} MODELS {{'(' + modelsList.length + ')'}} + PIPELINES ({{pipelinesList?.length}}) -
- +
+ +
+ + + -
- -
+ + + -
- -
+ + + + + +
diff --git a/src/app/features/dashboard/dumb/search-results-page/search-results-page.component.ts b/src/app/features/dashboard/dumb/search-results-page/search-results-page.component.ts index 4f0d11eb..adeabf0c 100644 --- a/src/app/features/dashboard/dumb/search-results-page/search-results-page.component.ts +++ b/src/app/features/dashboard/dumb/search-results-page/search-results-page.component.ts @@ -1,8 +1,9 @@ import {Component, EventEmitter, Input, Output} from '@angular/core'; -import {Project} from '../../../../business-logic/model/projects/project'; -import {Task} from '../../../../business-logic/model/tasks/task'; -import {ITask} from '../../../../business-logic/model/al-task'; -import {Model} from '../../../../business-logic/model/models/model'; +import {Project} from '~/business-logic/model/projects/project'; +import {Task} from '~/business-logic/model/tasks/task'; +import {ITask} from '~/business-logic/model/al-task'; +import {Model} from '~/business-logic/model/models/model'; +import {ActiveSearchLink} from '~/features/dashboard/containers/dashboard-search/dashboard-search.component'; @Component({ selector : 'sm-search-results-page', @@ -13,12 +14,14 @@ export class SearchResultsPageComponent { @Input() projectsList: Array = []; @Input() experimentsList: Array = []; @Input() modelsList: Array = []; - @Input() activeLink = 'projects'; + @Input() pipelinesList: Array = []; + @Input() activeLink: ActiveSearchLink; @Output() projectSelected = new EventEmitter(); @Output() activeLinkChanged = new EventEmitter(); @Output() experimentSelected = new EventEmitter(); @Output() modelSelected = new EventEmitter(); + @Output() pipelineSelected = new EventEmitter(); public projectClicked(project: Project) { this.projectSelected.emit(project); @@ -32,4 +35,25 @@ export class SearchResultsPageComponent { this.modelSelected.emit(model); } + public pipelineClicked(pipeline: Project) { + this.pipelineSelected.emit(pipeline); + } + + getResults() { + return this[`${this.activeLink}List`]; + } + + getCardHeight() { + switch (this.activeLink) { + case 'projects': + return 246; + case 'experiments': + case 'models': + return 264; + case 'pipelines': + return 226; + default: + return 250; + } + } } diff --git a/src/app/features/experiments/containers/experiment-info-navbar/experiment-info-navbar.component.html b/src/app/features/experiments/containers/experiment-info-navbar/experiment-info-navbar.component.html new file mode 100644 index 00000000..d675bc45 --- /dev/null +++ b/src/app/features/experiments/containers/experiment-info-navbar/experiment-info-navbar.component.html @@ -0,0 +1,58 @@ + diff --git a/src/app/features/experiments/containers/experiment-info-navbar/experiment-info-navbar.component.scss b/src/app/features/experiments/containers/experiment-info-navbar/experiment-info-navbar.component.scss new file mode 100644 index 00000000..0d5f5a90 --- /dev/null +++ b/src/app/features/experiments/containers/experiment-info-navbar/experiment-info-navbar.component.scss @@ -0,0 +1,32 @@ +@import "variables"; +$output-tabs-height: 40px; + +nav { + height: $output-tabs-height; + position: relative; + text-align: center; + border-bottom: 1px solid #efefef; + //overflow: hidden; + padding: 0 24px; + + .refresh-position { + position: absolute; + right: 16px; + top: 6px; + display: flex; + align-items: center; + } + .refreshIcon{ + margin-right: 10px; + } + span.disabled { + pointer-events: none; + } +} +.mat-menu-item { + padding-left: 22px; + &.active { + border-left: 6px solid $purple; + padding-left: 16px; + } +} diff --git a/src/app/features/experiments/containers/experiment-info-navbar/experiment-info-navbar.component.ts b/src/app/features/experiments/containers/experiment-info-navbar/experiment-info-navbar.component.ts new file mode 100644 index 00000000..d66411b5 --- /dev/null +++ b/src/app/features/experiments/containers/experiment-info-navbar/experiment-info-navbar.component.ts @@ -0,0 +1,38 @@ +import {Component, Input} from '@angular/core'; +import {FeaturesEnum} from '../../../../business-logic/model/users/featuresEnum'; +import {selectRouterConfig} from '../../../../webapp-common/core/reducers/router-reducer'; +import {Store} from '@ngrx/store'; +import {IExperimentInfoState} from '../../reducers/experiment-info.reducer'; +import {Observable} from 'rxjs'; + + +@Component({ + selector: 'sm-experiment-info-navbar', + templateUrl: './experiment-info-navbar.component.html', + styleUrls: ['./experiment-info-navbar.component.scss'] +}) +export class ExperimentInfoNavbarComponent { + public featuresEnum = FeaturesEnum; + public routerConfig$: Observable; + public baseInfoRoute: string[]; + public overflow: boolean; + private _minimized: boolean; + + @Input() set minimized(minimized: boolean) { + this.baseInfoRoute = minimized ? ['info-output'] : []; + this._minimized = minimized; + } + get minimized(){ + return this._minimized; + } + + @Input() splitSize: number; + + + constructor(private store: Store,) { + this.routerConfig$ = this.store.select(selectRouterConfig); + } + navbarOverflowed($event: boolean) { + this.overflow = $event; + } +} diff --git a/src/app/features/experiments/containers/experiment-info/experiment-info.component.html b/src/app/features/experiments/containers/experiment-info/experiment-info.component.html deleted file mode 100644 index 41660539..00000000 --- a/src/app/features/experiments/containers/experiment-info/experiment-info.component.html +++ /dev/null @@ -1,41 +0,0 @@ - - - -
- - - -
- -
-
- diff --git a/src/app/features/experiments/containers/experiment-info/experiment-info.component.scss b/src/app/features/experiments/containers/experiment-info/experiment-info.component.scss deleted file mode 100644 index 21c89fa0..00000000 --- a/src/app/features/experiments/containers/experiment-info/experiment-info.component.scss +++ /dev/null @@ -1,38 +0,0 @@ -@import "../../../../webapp-common/shared/ui-components/styles/variables"; -@import "../../../../webapp-common/layout/layout.scss"; - -:host { - display: block; - height: 100%; - - .experiment-info-body { - height: calc(100% - #{$experiment-info-header-height + $experiment-info-tabs-height}); - flex-grow: 1; - overflow: auto; - } - - .experiment-info-container { - height: calc(100% - #{$project-info-progress-height}); - padding: 15px 0 0 5px; - display: flex; - flex-direction: column; - - nav { - height: $experiment-info-tabs-height; - border-bottom: 1px solid rgba(2, 2, 2, 0.07); - - span.disabled { - pointer-events: none; - } - } - } - - ::ng-deep nav { - border-bottom: 1px solid rgba(2, 2, 2, 0.07); - } - - ::ng-deep sm-simple-table-2 .headers { - font-size: 12px; - } - -} diff --git a/src/app/features/experiments/containers/experiment-info/experiment-info.component.ts b/src/app/features/experiments/containers/experiment-info/experiment-info.component.ts deleted file mode 100644 index a736023a..00000000 --- a/src/app/features/experiments/containers/experiment-info/experiment-info.component.ts +++ /dev/null @@ -1,131 +0,0 @@ -import {Component, OnDestroy, OnInit} from '@angular/core'; -import {ActivatedRoute, Params, Router} from '@angular/router'; -import {Store} from '@ngrx/store'; -import {get} from 'lodash/fp'; -import {Observable, Subscription} from 'rxjs'; -import {debounceTime, distinctUntilChanged, filter, map, tap} from 'rxjs/operators'; -import {MESSAGES_SEVERITY} from '~/app.constants'; -import {IExperimentInfoState} from '../../reducers/experiment-info.reducer'; -import {selectExperimentInfoData, selectIsExperimentEditable, selectSelectedExperiment} from '../../reducers'; -import {selectBackdropActive} from '@common/core/reducers/view.reducer'; -import {isReadOnly} from '@common/shared/utils/shared-utils'; -import {selectRouterConfig, selectRouterParams, selectRouterQueryParams} from '@common/core/reducers/router-reducer'; -import * as commonInfoActions from '../../../../webapp-common/experiments/actions/common-experiments-info.actions'; -import {ExperimentDetailsUpdated} from '@common/experiments/actions/common-experiments-info.actions'; -import {addMessage} from '@common/core/actions/layout.actions'; -import {IExperimentInfo} from '../../shared/experiment-info.model'; -import {selectSelectedTableExperiment} from '@common/experiments/reducers'; -import {ITableExperiment} from '@common/experiments/shared/common-experiment-model.model'; -import {setTableMode} from '@common/experiments/actions/common-experiments-view.actions'; - - -@Component({ - selector: 'sm-experiment-info', - templateUrl: './experiment-info.component.html', - styleUrls: ['./experiment-info.component.scss'] -}) -export class ExperimentInfoComponent implements OnInit, OnDestroy { - - private paramsSubscription: Subscription; - public selectedExperiment: IExperimentInfo; - private selectedExperimentSubscription: Subscription; - public editable$: Observable; - public infoData$: Observable; - public backdropActive$: Observable; - public isExample: boolean; - private projectId: string; - private experimentId: string; - public resultsTab: boolean; - public queryParams$: Observable; - public routerConfig: string[]; - private routerConfigSubscription: Subscription; - public tableSelectedExperiment$: Observable; - private toMaximize = false; - - constructor( - private router: Router, - private store: Store, - private route: ActivatedRoute - ) { - this.editable$ = this.store.select(selectIsExperimentEditable); - this.infoData$ = this.store.select(selectExperimentInfoData); - this.backdropActive$ = this.store.select(selectBackdropActive); - this.queryParams$ = this.store.select(selectRouterQueryParams); - this.tableSelectedExperiment$ = this.store.select(selectSelectedTableExperiment); - } - - ngOnInit() { - this.selectedExperimentSubscription = this.store.select(selectSelectedExperiment) - .subscribe(experiment => { - this.selectedExperiment = experiment; - this.isExample = isReadOnly(experiment); - }); - this.routerConfigSubscription = this.store.select(selectRouterConfig).subscribe(routerConfig => { - this.routerConfig = routerConfig; - }); - - this.paramsSubscription = this.store.select(selectRouterParams) - .pipe( - tap((params) => { - this.projectId = get('projectId', params); - this.resultsTab = 'info-output' === this.route.firstChild.routeConfig.path; - }), - debounceTime(150), - map(params => get('experimentId', params)), - filter(experimentId => !!experimentId), - distinctUntilChanged() - ) - .subscribe(experimentId => { - this.experimentId = experimentId; - - // We already have GetExperimentInfo in output (results) component - if (!this.resultsTab) { - this.store.dispatch(new commonInfoActions.ResetExperimentInfo()); - this.store.dispatch(new commonInfoActions.GetExperimentInfo(experimentId)); - } - }); - } - - ngOnDestroy(): void { - this.paramsSubscription.unsubscribe(); - this.selectedExperimentSubscription.unsubscribe(); - this.routerConfigSubscription.unsubscribe(); - if (!this.toMaximize) { - this.store.dispatch(new commonInfoActions.SetExperiment(null)); - this.store.dispatch(new commonInfoActions.ResetExperimentInfo()); - } - } - - updateExperimentName(name) { - if (name.trim().length > 2) { - this.store.dispatch(new ExperimentDetailsUpdated({id: this.selectedExperiment.id, changes: {name}})); - } else { - this.store.dispatch(addMessage(MESSAGES_SEVERITY.ERROR, 'Name must be more than three letters long')); - } - } - - deselectExperiment() { - this.navigateAfterExperimentSelectionChanged(); - } - - navigateAfterExperimentSelectionChanged() { - this.store.dispatch(setTableMode({mode: 'table'})); - this.router.navigate([`projects/${this.projectId}/experiments`], {queryParamsHandling: 'merge'}); - } - - onActivate(e, scrollContainer) { - scrollContainer.scrollTop = 0; - } - - maximize() { - if (window.location.pathname.includes('info-output')) { - const resultsPath = this.route.firstChild?.firstChild?.routeConfig?.path || this.route.firstChild.routeConfig.path; - this.router.navigateByUrl(`projects/${this.projectId}/experiments/${this.experimentId}/output/${resultsPath}`); - } else { - const parts = window.location.pathname.split('/'); - parts.splice(5, 0, 'output'); - this.router.navigateByUrl(parts.join('/')); - } - this.toMaximize = true; - } -} diff --git a/src/app/features/experiments/containers/experiment-menu-extended/experiment-menu-extended.component.ts b/src/app/features/experiments/containers/experiment-menu-extended/experiment-menu-extended.component.ts index 9f41a936..4c8f9cc2 100644 --- a/src/app/features/experiments/containers/experiment-menu-extended/experiment-menu-extended.component.ts +++ b/src/app/features/experiments/containers/experiment-menu-extended/experiment-menu-extended.component.ts @@ -1,4 +1,4 @@ -import { Component} from '@angular/core'; +import {Component, Input} from '@angular/core'; import {ExperimentMenuComponent} from '@common/experiments/shared/components/experiment-menu/experiment-menu.component'; @Component({ @@ -7,7 +7,6 @@ import {ExperimentMenuComponent} from '@common/experiments/shared/components/exp styleUrls: ['../../../../webapp-common/experiments/shared/components/experiment-menu/experiment-menu.component.scss'] }) export class ExperimentMenuExtendedComponent extends ExperimentMenuComponent{ - set contextMenu(data) {} get contextMenu() { return this; diff --git a/src/app/features/experiments/containers/experiment-ouptut/experiment-output.component.html b/src/app/features/experiments/containers/experiment-ouptut/experiment-output.component.html index 7839b3a9..21064926 100644 --- a/src/app/features/experiments/containers/experiment-ouptut/experiment-output.component.html +++ b/src/app/features/experiments/containers/experiment-ouptut/experiment-output.component.html @@ -1,60 +1,24 @@ -
+ +
- -
- + +
+
diff --git a/src/app/features/experiments/experiments-routing.module.ts b/src/app/features/experiments/experiments-routing.module.ts index 4174a2b9..dc5bd43f 100644 --- a/src/app/features/experiments/experiments-routing.module.ts +++ b/src/app/features/experiments/experiments-routing.module.ts @@ -13,7 +13,6 @@ export const routes: Routes = [ imports: [ SMSharedModule, RouterModule.forChild(routes), - ], exports: [RouterModule, SelectableListComponent, SelectableFilterListComponent] }) diff --git a/src/app/features/experiments/experiments.module.ts b/src/app/features/experiments/experiments.module.ts index 5030870a..9b21a56b 100644 --- a/src/app/features/experiments/experiments.module.ts +++ b/src/app/features/experiments/experiments.module.ts @@ -21,7 +21,6 @@ import {SMMaterialModule} from '@common/shared/material/material.module'; import {ExperimentsCommonModule} from '@common/experiments/common-experiments.module'; import {CommonLayoutModule} from '@common/layout/layout.module'; import {EXPERIMENTS_STORE_KEY} from '@common/experiments/shared/common-experiments.const'; -import {ExperimentInfoComponent} from './containers/experiment-info/experiment-info.component'; import {DebugImagesModule} from '@common/debug-images/debug-images.module'; import {ExperimentInfoExecutionComponent} from '@common/experiments/containers/experiment-info-execution/experiment-info-execution.component'; import {MatSidenavModule} from '@angular/material/sidenav'; @@ -29,6 +28,7 @@ import {MatListModule} from '@angular/material/list'; import {ExperimentOutputComponent} from './containers/experiment-ouptut/experiment-output.component'; import {merge, pick} from 'lodash/fp'; import {EXPERIMENTS_PREFIX} from '@common/experiments/actions/common-experiments-view.actions'; +import {ExperimentInfoNavbarComponent} from './containers/experiment-info-navbar/experiment-info-navbar.component'; export const experimentSyncedKeys = [ @@ -90,9 +90,9 @@ const getExperimentsConfig = () => ({ ], declarations: [ ExperimentsComponent, - ExperimentInfoComponent, ExperimentInfoExecutionComponent, ExperimentOutputComponent, + ExperimentInfoNavbarComponent ], providers: [ AdminService, diff --git a/src/app/features/projects/projects-page.utils.ts b/src/app/features/projects/projects-page.utils.ts index ecdcd8df..16fea4d4 100644 --- a/src/app/features/projects/projects-page.utils.ts +++ b/src/app/features/projects/projects-page.utils.ts @@ -1,16 +1,8 @@ -export function isDeletableProject(readyForDeletion) { - return (readyForDeletion.experiments.unarchived + readyForDeletion.models.unarchived) === 0; -} +export const isDeletableProject = readyForDeletion => (readyForDeletion.experiments.unarchived + readyForDeletion.models.unarchived) === 0; -export function getDeletePopupEntitiesList(): string { - return 'experiments or models'; -} +export const getDeletePopupEntitiesList = (): string => 'experiments or models'; -export function getDeleteProjectPopupStatsBreakdown(readyForDeletion, statsSubset: 'archived' | 'unarchived' | 'total'): string { - return `${readyForDeletion.experiments[statsSubset] > 0 ? readyForDeletion.experiments[statsSubset] + ' experiments ' : ''} +export const getDeleteProjectPopupStatsBreakdown = (readyForDeletion, statsSubset: 'archived' | 'unarchived' | 'total', experimentCaption): string => `${readyForDeletion.experiments[statsSubset] > 0 ? `${readyForDeletion.experiments[statsSubset]} ${experimentCaption} ` : ''} ${readyForDeletion.models[statsSubset] > 0 ? readyForDeletion.models[statsSubset] + ' models ' : ''}`; -} -export function readyForDeletionFilter(readyForDeletion) { - return !(readyForDeletion.experiments === null || readyForDeletion.models === null); -} +export const readyForDeletionFilter = readyForDeletion => !(readyForDeletion.experiments === null || readyForDeletion.models === null); diff --git a/src/app/features/projects/shared/projects-shared.module.ts b/src/app/features/projects/shared/projects-shared.module.ts index 40776843..9041e752 100644 --- a/src/app/features/projects/shared/projects-shared.module.ts +++ b/src/app/features/projects/shared/projects-shared.module.ts @@ -5,22 +5,26 @@ import {SMSharedModule} from '@common/shared/shared.module'; import {ProjectCardComponent} from '@common/shared/ui-components/panel/project-card/project-card.component'; import {ProjectCardMenuExtendedComponent} from '~/features/projects/containers/project-card-menu-extended/project-card-menu-extended.component'; import {ProjectCardMenuComponent} from '@common/shared/ui-components/panel/project-card-menu/project-card-menu.component'; +import {PipelineCardComponent} from '../../../webapp-common/pipelines/pipeline-card/pipeline-card.component'; +import {PipelineCardMenuComponent} from '../../../webapp-common/pipelines/pipeline-card-menu/pipeline-card-menu.component'; const _declarations = [ ProjectCardComponent, ProjectCardMenuComponent, - ProjectCardMenuExtendedComponent + ProjectCardMenuExtendedComponent, + PipelineCardComponent, + PipelineCardMenuComponent, ]; @NgModule({ - imports : [ + imports: [ CommonModule, FormsModule, ReactiveFormsModule, SMSharedModule ], - declarations : [..._declarations], - exports : [..._declarations] + declarations: [..._declarations], + exports: [..._declarations] }) export class ProjectsSharedModule { } diff --git a/src/app/features/settings/containers/admin/create-credential-dialog/create-credential-dialog.component.html b/src/app/features/settings/containers/admin/create-credential-dialog/create-credential-dialog.component.html index fa8cb087..c5f447e2 100644 --- a/src/app/features/settings/containers/admin/create-credential-dialog/create-credential-dialog.component.html +++ b/src/app/features/settings/containers/admin/create-credential-dialog/create-credential-dialog.component.html @@ -1,6 +1,6 @@ - + diff --git a/src/app/features/settings/containers/admin/create-credential-dialog/create-credential-dialog.component.ts b/src/app/features/settings/containers/admin/create-credential-dialog/create-credential-dialog.component.ts index 6eef3854..dc16b23e 100644 --- a/src/app/features/settings/containers/admin/create-credential-dialog/create-credential-dialog.component.ts +++ b/src/app/features/settings/containers/admin/create-credential-dialog/create-credential-dialog.component.ts @@ -1,7 +1,7 @@ import {Component, Inject} from '@angular/core'; import { MAT_DIALOG_DATA } from '@angular/material/dialog'; import {Store} from '@ngrx/store'; -import {createCredential} from '@common/core/actions/common-auth.actions'; +import {updateCredentialLabel} from '@common/core/actions/common-auth.actions'; import {OrganizationGetUserCompaniesResponseCompanies} from '~/business-logic/model/organization/organizationGetUserCompaniesResponseCompanies'; import {Observable} from 'rxjs'; import {CredentialKeyExt, selectNewCredential} from '@common/core/reducers/common-auth-reducer'; @@ -21,7 +21,7 @@ import {CredentialKeyExt, selectNewCredential} from '@common/core/reducers/commo this.newCredential$ = this.store.select(selectNewCredential); } - onCreateCredentials({label}) { - this.store.dispatch(createCredential({workspace: this.data.workspace, label})); + updateLabel({credential, label}) { + this.store.dispatch(updateCredentialLabel({credential, label})); } } diff --git a/src/app/features/settings/containers/admin/user-credentials/user-credentials.component.html b/src/app/features/settings/containers/admin/user-credentials/user-credentials.component.html index b6c4f210..d495ba9d 100644 --- a/src/app/features/settings/containers/admin/user-credentials/user-credentials.component.html +++ b/src/app/features/settings/containers/admin/user-credentials/user-credentials.component.html @@ -4,9 +4,11 @@ matTooltipPosition="above">
- - + { this.creatingCredentials = false; this.store.dispatch(resetCredential()); }); - // this.store.dispatch(createCredential({workspace: this.user.company, openCredentialsPopup: true})); + this.store.dispatch(createCredential({workspace: this.user.company, openCredentialsPopup: true})); } onCredentialRevoked(accessKey) { this.store.dispatch(credentialRevoked({accessKey, workspaceId: this.user.company.id})); } + updateLabel({credential, label}) { + this.store.dispatch(updateCredentialLabel({credential: {...credential, company: this.user.company.id}, label})); + } + ngOnDestroy(): void { this.newCredentialSub.unsubscribe(); } diff --git a/src/app/layout/breadcrumbs/breadcrumbs.utils.ts b/src/app/layout/breadcrumbs/breadcrumbs.utils.ts index 45008e08..62f319ec 100644 --- a/src/app/layout/breadcrumbs/breadcrumbs.utils.ts +++ b/src/app/layout/breadcrumbs/breadcrumbs.utils.ts @@ -21,12 +21,12 @@ export const selectBreadcrumbsStringsBase = createSelector( (project, experiment, model, projects) => ({project, experiment, model, projects}) as IBreadcrumbs); -export const prepareNames = (data: IBreadcrumbs, noSubProjects?: boolean) => { +export const prepareNames = (data: IBreadcrumbs, isPipeline?: boolean, fullScreen = false) => { const project = prepareLinkData(data.project, true); if (data.project) { const subProjects = []; let subProjectsNames = [data.project?.name]; - if (!noSubProjects) { + if (!isPipeline) { subProjectsNames = data.project?.name?.split('/'); } let currentName = ''; @@ -41,9 +41,11 @@ export const prepareNames = (data: IBreadcrumbs, noSubProjects?: boolean) => { }); const subProjectsLinks = subProjects.map(subProject => ({ name: subProject?.name.substring(subProject?.name.lastIndexOf('/') + 1), - url: (noSubProjects || (subProject?.name === data.project?.name && data.project?.sub_projects?.length === 0)) ? - `projects/${subProject?.id}` : - `projects/${subProject?.id}/projects` + url: isPipeline ? `pipelines/${subProject?.id}/experiments` : + fullScreen ? `projects/${subProject?.id}/experiments/${data.experiment.id}` : + subProject?.name === data.project?.name && data.project?.sub_projects?.length === 0 ? + `projects/${subProject?.id}` : + `projects/${subProject?.id}/projects` })) as { name: string; url: string }[]; project.name = project?.name.substring(project.name.lastIndexOf('/') + 1); project.subCrumbs = subProjectsLinks; @@ -56,7 +58,7 @@ export const prepareNames = (data: IBreadcrumbs, noSubProjects?: boolean) => { const models = formatStaticCrumb('models'); const compare = formatStaticCrumb('compare-experiments'); return { - ...(project.url !=='*' && {':projectId': project}), + ...(project.url !== '*' && {':projectId': project}), ':taskId' : task, ':controllerId': experiment, 'compare-experiments': compare, diff --git a/src/app/webapp-common/assets/fonts/trains-icons.scss b/src/app/webapp-common/assets/fonts/trains-icons.scss index 1953ee5d..7b6fab15 100644 --- a/src/app/webapp-common/assets/fonts/trains-icons.scss +++ b/src/app/webapp-common/assets/fonts/trains-icons.scss @@ -2,7 +2,7 @@ @font-face { font-family: '#{$icomoon-font-family}'; - src: url('./#{$icomoon-font-family}.ttf?medlz4') format('truetype'); + src: url('./#{$icomoon-font-family}.ttf?2i0eh5') format('truetype'); font-weight: normal; font-style: normal; font-display: block; @@ -1166,9 +1166,9 @@ content: $al-ico-greater-than; } } -.al-ico-toogle-graph { +.al-ico-eye-outline { &:before { - content: $al-ico-toogle-graph; + content: $al-ico-eye-outline; } } .al-ico-status-draft { diff --git a/src/app/webapp-common/assets/fonts/trains.ttf b/src/app/webapp-common/assets/fonts/trains.ttf index 8572eba9308dd2f17de342c389741080784665c8..a16dc3021b9b83786c9b6c4821aad81c4442ccfe 100644 GIT binary patch delta 495 zcmaEHhjJW11P{7!{r6!&j9jO zGIC2Qc5g3f1oHPVFfi}Q$xlu^-^BKaf#Gfi(2NJUi4_Hm0&GCN_alJn74i~uQx`mP zUkK!b0gqq>?tqnWuKqq&)}A)^>r-q;Atw`WuX%PT8^ zRr514F_?OLn}TqFhi8?Zz6_&`zJ8UbM*xhQ0p>Md?IMiuQ<(iCz(XCq^T7QtX4csJIpJEb(m#ObH%|CW-%&i&8eF YiKYF>P|0|b#gX+S`^@Gw_xCUY01=~zc>n+a delta 565 zcmbPoi221K<_QkaNVqjoA!N73+O-5>Bit5brRtAQfTNoG^%rbxiyfIu}K>iyb zUnL{Aq+<8>lGO|hw*(j%nD^x5CnsL=;k?GcaQ6(*j0d@i6$Oj}YzYhu_tyZ`E952S zrY?Boz7WU<$yXKR7nd+F17#QQxh{|BQbFic0NXSw#fn8#Ojqz)RdLjL`B4mjm#L$#pM{qjm*p$&D7M@ z*w~rX^%&We*!USCDy$ie%$UInO$C(&g&`URjRl$ZC`(EzgYbJHK~D=yKR-(gPeCDM z_7+zoBUcdq*VGxqCdkDl$i~RP!_3Q9ugrZfflZi;TZnbuej!Oop{v}&CnN=hBtt_b zg#;x-H%q9fNPrAyla+Oll#-HkkdbaP`AJXg)m$;iRZ zsLiXw&BM(1?_UEaCnFc() ); + +export const updateCredentialLabel = createAction( + AUTH_PREFIX + 'UPDATE_CREDENTIAL_LABEL', + props<{credential: CredentialKeyExt; label?: string}>() +); + +export const setCredentialLabel = createAction( + AUTH_PREFIX + 'SET_CREDENTIAL_LABEL', + props<{credential: CredentialKeyExt; label?: string}>() +); export const addCredential = createAction( AUTH_PREFIX + 'ADD_CREDENTIAL', props<{ newCredential: CredentialKeyExt; workspaceId: string }>() @@ -57,3 +67,7 @@ export const setSignedUrl = createAction( props<{url: string; signed: string; expires: number}>() ); +export const removeSignedUrl = createAction( + AUTH_PREFIX + '[remove signed url]', + props<{url: string}>() +); diff --git a/src/app/webapp-common/core/actions/layout.actions.ts b/src/app/webapp-common/core/actions/layout.actions.ts index 270c68b3..bd1f9953 100644 --- a/src/app/webapp-common/core/actions/layout.actions.ts +++ b/src/app/webapp-common/core/actions/layout.actions.ts @@ -82,3 +82,7 @@ export const openAppsAwarenessDialog = createAction(VIEW_PREFIX + '[apps awarene props<{appsYouTubeIntroVideoId}>() ); +export const toggleUserFocus = createAction( + VIEW_PREFIX + '[toggle user focus in header', + props<{show: boolean}>() +); diff --git a/src/app/webapp-common/core/actions/projects.actions.ts b/src/app/webapp-common/core/actions/projects.actions.ts index 40aaf38b..fda1d724 100644 --- a/src/app/webapp-common/core/actions/projects.actions.ts +++ b/src/app/webapp-common/core/actions/projects.actions.ts @@ -13,6 +13,7 @@ import {TasksStopManyResponse} from '~/business-logic/model/tasks/tasksStopManyR import {EntityTypeEnum} from '~/shared/constants/non-common-consts'; import {MetricColumn} from '@common/shared/utils/tableParamEncode'; import {ProjectStatsGraphData} from '@common/core/reducers/projects.reducer'; +import {User} from '~/business-logic/model/users/user'; export const PROJECTS_PREFIX = '[ROOT_PROJECTS] '; @@ -25,8 +26,6 @@ export const getAllSystemProjects = createAction( PROJECTS_PREFIX + 'GET_PROJECTS' ); - - export const updateProject = createAction( PROJECTS_PREFIX + 'UPDATE_PROJECT', props<{ id: string; changes: Partial }>() @@ -136,3 +135,24 @@ export const setGraphData = createAction( PROJECTS_PREFIX + '[set project stats]', props<{ stats: ProjectStatsGraphData[] }>() ); + +export const getProjectUsers = createAction( + PROJECTS_PREFIX + '[get current project users]', + props<{projectId: string}>() +); +export const setProjectUsers = createAction( + PROJECTS_PREFIX + '[set current project users]', + props<{users: User[]}>() +); +export const setAllProjectUsers = createAction( + PROJECTS_PREFIX + '[set all projects users]', + props<{users: User[]}>() +); +export const setProjectExtraUsers = createAction( + PROJECTS_PREFIX + '[set extra users]', + props<{users: User[]}>() +); +export const getFilteredUsers = createAction( + PROJECTS_PREFIX + 'GET_FILTERED_USERS', + props<{filteredUsers: string[]}>() +); diff --git a/src/app/webapp-common/core/effects/common-auth.effects.ts b/src/app/webapp-common/core/effects/common-auth.effects.ts index a8757b40..34475ae9 100644 --- a/src/app/webapp-common/core/effects/common-auth.effects.ts +++ b/src/app/webapp-common/core/effects/common-auth.effects.ts @@ -15,6 +15,7 @@ import {EMPTY, of} from 'rxjs'; import {SignResponse} from '@common/settings/admin/base-admin.service'; import {S3AccessResolverComponent} from '@common/layout/s3-access-resolver/s3-access-resolver.component'; import {MatDialog} from '@angular/material/dialog'; +import {setCredentialLabel} from '../actions/common-auth.actions'; @Injectable() export class CommonAuthEffects { @@ -74,6 +75,20 @@ export class CommonAuthEffects { )) )); + updateCredentialLabel = createEffect(() => this.actions.pipe( + ofType(authActions.updateCredentialLabel), + mergeMap(action => this.credentialsApi.authEditCredentials({access_key: action.credential.access_key, label: action.label}).pipe( + mergeMap(() => [ + setCredentialLabel({credential: action.credential, label: action.label}), + deactivateLoader(action.type) + ]), + catchError(error => [ + requestFailed(error), + setServerError(error, null, 'Unable to update credentials'), + deactivateLoader(action.type)]) + )) + )); + signUrl = createEffect(() => this.actions.pipe( ofType(authActions.getSignedUrl), filter(action => !!action.url), @@ -83,7 +98,7 @@ export class CommonAuthEffects { this.store.select(state => selectSignedUrl(action.url)(state)) ), switchMap(([, signedUrl]) => - (!signedUrl?.expires || signedUrl.expires < (new Date()).getTime()) ? + (!signedUrl?.expires || signedUrl.expires < (new Date()).getTime() || action.config?.disableCache) ? this.adminService.signUrlIfNeeded(action.url, action.config) : of({type: 'none'}) ), filter(res => !!res), diff --git a/src/app/webapp-common/core/effects/projects.effects.ts b/src/app/webapp-common/core/effects/projects.effects.ts index 7428328d..0b78eacd 100644 --- a/src/app/webapp-common/core/effects/projects.effects.ts +++ b/src/app/webapp-common/core/effects/projects.effects.ts @@ -3,18 +3,6 @@ import {Action, Store} from '@ngrx/store'; import {Actions, createEffect, ofType} from '@ngrx/effects'; import {ApiProjectsService} from '~/business-logic/api-services/projects.service'; import * as actions from '../actions/projects.actions'; -import { - fetchGraphData, getAllSystemProjects, - getCompanyTags, getProjectsTags, - getTags, - openMoreInfoPopup, - openTagColorsMenu, refetchProjects, - resetProjects, resetProjectSelection, - setCompanyTags, - setGraphData, setLastUpdate, - setTags -} from '../actions/projects.actions'; - import {catchError, filter, map, mergeMap, switchMap, withLatestFrom} from 'rxjs/operators'; import {requestFailed} from '../actions/http.actions'; import {activeLoader, deactivateLoader, setServerError} from '../actions/layout.actions'; @@ -24,14 +12,18 @@ import {MatDialog} from '@angular/material/dialog'; import {ApiOrganizationService} from '~/business-logic/api-services/organization.service'; import {OrganizationGetTagsResponse} from '~/business-logic/model/organization/organizationGetTagsResponse'; import {selectRouterParams} from '../reducers/router-reducer'; -import {forkJoin} from 'rxjs'; +import {forkJoin, of} from 'rxjs'; import {ProjectsGetTaskTagsResponse} from '~/business-logic/model/projects/projectsGetTaskTagsResponse'; import {ProjectsGetModelTagsResponse} from '~/business-logic/model/projects/projectsGetModelTagsResponse'; -import {selectLastUpdate, selectSelectedMetricVariantForCurrProject, selectSelectedProjectId} from '../reducers/projects.reducer'; +import { + selectAllProjectsUsers, + selectLastUpdate, + selectSelectedMetricVariantForCurrProject, + selectSelectedProjectId +} from '../reducers/projects.reducer'; import {OperationErrorDialogComponent} from '@common/shared/ui-components/overlay/operation-error-dialog/operation-error-dialog.component'; import {ApiTasksService} from '~/business-logic/api-services/tasks.service'; import {createMetricColumn} from '@common/shared/utils/tableParamEncode'; -import {get} from 'lodash/fp'; import {ITask} from '~/business-logic/model/al-task'; import {TasksGetAllExRequest} from '~/business-logic/model/tasks/tasksGetAllExRequest'; import {setSelectedExperiments} from '../../experiments/actions/common-experiments-view.actions'; @@ -39,6 +31,8 @@ import {selectShowHidden} from '~/features/projects/projects.reducer'; import {setActiveWorkspace} from '@common/core/actions/users.actions'; import {ProjectsGetAllExResponse} from '~/business-logic/model/projects/projectsGetAllExResponse'; import {Project} from '~/business-logic/model/projects/project'; +import {ApiUsersService} from '~/business-logic/api-services/users.service'; +import { get } from 'lodash/fp'; export const ALL_PROJECTS_OBJECT = {id: '*', name: 'All Experiments'}; @@ -50,9 +44,9 @@ export class ProjectsEffects { constructor( private actions$: Actions, private projectsApi: ApiProjectsService, private orgApi: ApiOrganizationService, - private store: Store, private dialog: MatDialog, private tasksApi: ApiTasksService - ) { - } + private store: Store, private dialog: MatDialog, private tasksApi: ApiTasksService, + private usersApi: ApiUsersService, + ) {} activeLoader = createEffect(() => this.actions$.pipe( ofType(actions.setSelectedProjectId), @@ -77,9 +71,9 @@ export class ProjectsEffects { if (res.projects.length >= this.pageSize) { this.scrollId = res.scroll_id; this.lastUpdateSoFar = res.projects[res.projects.length - 1].last_update; - resultsActions.push(getAllSystemProjects()); + resultsActions.push(actions.getAllSystemProjects()); } else { - resultsActions.push(setLastUpdate({lastUpdate: res.projects[res.projects.length - 1]?.last_update || this.lastUpdateSoFar || lastUpdate})); + resultsActions.push(actions.setLastUpdate({lastUpdate: res.projects[res.projects.length - 1]?.last_update || this.lastUpdateSoFar || lastUpdate})); this.scrollId = null; this.lastUpdateSoFar = null; } @@ -91,11 +85,11 @@ export class ProjectsEffects { resetProjects$ = createEffect(() => this.actions$.pipe( ofType(actions.resetSelectedProject), - mergeMap(() => [resetProjectSelection()]) + mergeMap(() => [actions.resetProjectSelection()]) )); resetProjectSelections$ = createEffect(() => this.actions$.pipe( - ofType(resetProjectSelection), + ofType(actions.resetProjectSelection), mergeMap(() => [setSelectedExperiments({experiments: []}), setSelectedModels({models: []})]) )); @@ -117,7 +111,7 @@ export class ProjectsEffects { )); openTagColor = createEffect(() => this.actions$.pipe( - ofType(openTagColorsMenu), + ofType(actions.openTagColorsMenu), map(() => { this.dialog.open(TagColorMenuComponent); }) @@ -125,29 +119,29 @@ export class ProjectsEffects { //getAll but not projects' getAllTags = createEffect(() => this.actions$.pipe( - ofType(getCompanyTags), + ofType(actions.getCompanyTags), // eslint-disable-next-line @typescript-eslint/naming-convention switchMap(() => this.orgApi.organizationGetTags({include_system: true}) .pipe( - map((res: OrganizationGetTagsResponse) => setCompanyTags({tags: res.tags, systemTags: res.system_tags})), + map((res: OrganizationGetTagsResponse) => actions.setCompanyTags({tags: res.tags, systemTags: res.system_tags})), catchError(error => [requestFailed(error)]) ) ) )); getProjectsTags = createEffect(() => this.actions$.pipe( - ofType(getProjectsTags), + ofType(actions.getProjectsTags), // eslint-disable-next-line @typescript-eslint/naming-convention switchMap(() => this.projectsApi.projectsGetProjectTags({filter: {system_tags: ['pipeline']}}) .pipe( - map((res: OrganizationGetTagsResponse) => setTags({tags: res.tags})), + map((res: OrganizationGetTagsResponse) => actions.setTags({tags: res.tags})), catchError(error => [requestFailed(error)]) ) ) )); getTagsEffect = createEffect(() => this.actions$.pipe( - ofType(getTags), + ofType(actions.getTags), withLatestFrom(this.store.select(selectRouterParams).pipe( map(params => (params === null || params?.projectId === '*') ? [] : [params.projectId]))), switchMap(([action, projects]) => forkJoin([ @@ -157,7 +151,7 @@ export class ProjectsEffects { map((res: [ProjectsGetTaskTagsResponse, ProjectsGetModelTagsResponse]) => Array.from(new Set(res[0].tags.concat(res[1].tags))).sort()), mergeMap((tags: string[]) => [ - setTags({tags}), + actions.setTags({tags}), deactivateLoader(action.type) ]), catchError(error => [ @@ -169,7 +163,7 @@ export class ProjectsEffects { )); openMoreInfoPopupEffect = createEffect(() => this.actions$.pipe( - ofType(openMoreInfoPopup), + ofType(actions.openMoreInfoPopup), switchMap(action => this.dialog.open(OperationErrorDialogComponent, { data: { title: `${action.operationName} ${action.entityType}`, @@ -181,7 +175,7 @@ export class ProjectsEffects { ), {dispatch: false}); fetchProjectStats = createEffect(() => this.actions$.pipe( - ofType(fetchGraphData), + ofType(actions.fetchGraphData), withLatestFrom( this.store.select(selectSelectedProjectId), this.store.select(selectSelectedMetricVariantForCurrProject) @@ -204,7 +198,7 @@ export class ProjectsEffects { /* eslint-enable @typescript-eslint/naming-convention */ } as unknown as TasksGetAllExRequest).pipe( map((res) => - setGraphData({ + actions.setGraphData({ stats: res.tasks.map((task: ITask) => { const started = new Date(task.started).getTime(); const end = started + (task.active_duration ?? 0) * 1000; @@ -224,12 +218,66 @@ export class ProjectsEffects { )); resetRootProjects = createEffect(() => this.actions$.pipe( - ofType(setActiveWorkspace, refetchProjects), + ofType(setActiveWorkspace, actions.refetchProjects), mergeMap(() => [ - resetProjects(), - getAllSystemProjects() + actions.resetProjects(), + actions.getAllSystemProjects() ]) )); + + getAllProjectsUsersEffect = createEffect(() => this.actions$.pipe( + ofType(actions.getAllSystemProjects), + switchMap(() => this.usersApi.usersGetAllEx({ + order_by: ['name'], + only_fields: ['name'], + }, null, 'body', true).pipe( + mergeMap(res => [actions.setAllProjectUsers(res)]), + catchError(error => [ + requestFailed(error), + setServerError(error, null, 'Fetch all projects users failed')] + ) + )) + )); + + getUsersEffect = createEffect(() => this.actions$.pipe( + ofType(actions.getProjectUsers), + withLatestFrom( + this.store.select(selectAllProjectsUsers) + ), + switchMap(([action, all]) => (!action.projectId || action.projectId === '*' ? + of({users: all}) : + this.usersApi.usersGetAllEx({ + order_by: ['name'], + only_fields: ['name'], + active_in_projects: [action.projectId] + }, null, 'body', true)).pipe( + mergeMap(res => [actions.setProjectUsers(res)]), + catchError(error => [ + requestFailed(error), + setServerError(error, null, 'Fetch users failed')] + ) + )) + )); + + getExtraUsersEffect = createEffect(() => this.actions$.pipe( + ofType(actions.getFilteredUsers), + switchMap(action => this.usersApi.usersGetAllEx({ + order_by: ['name'], + only_fields: ['name'], + id: action.filteredUsers || [] + }, null, 'body', true).pipe( + mergeMap(res => [ + actions.setProjectExtraUsers(res), + deactivateLoader(action.type) + ]), + catchError(error => [ + requestFailed(error), + deactivateLoader(action.type), + setServerError(error, null, 'Fetch users failed')] + ) + )) + )); + } diff --git a/src/app/webapp-common/core/reducers/common-auth-reducer.ts b/src/app/webapp-common/core/reducers/common-auth-reducer.ts index b21a35e8..b4febab8 100644 --- a/src/app/webapp-common/core/reducers/common-auth-reducer.ts +++ b/src/app/webapp-common/core/reducers/common-auth-reducer.ts @@ -2,16 +2,16 @@ import {createSelector, on, ReducerTypes, select, Store} from '@ngrx/store'; import { addCredential, cancelS3Credentials, - removeCredential, resetCredential, + removeCredential, removeSignedUrl, resetCredential, resetDontShowAgainForBucketEndpoint, - saveS3Credentials, setSignedUrl, + saveS3Credentials, setCredentialLabel, setSignedUrl, showLocalFilePopUp, updateAllCredentials, updateS3Credential } from '../actions/common-auth.actions'; import {CredentialKey} from '~/business-logic/model/auth/credentialKey'; import {inBucket} from '@common/settings/admin/base-admin.service'; -import {filter, map, timeoutWith} from 'rxjs/operators'; +import {filter, map, takeWhile, timeoutWith} from 'rxjs/operators'; export interface Credentials { Bucket?: string; @@ -68,7 +68,10 @@ export const getSignedUrlOrOrigin$ = (url: string, store: Store) => store.pipe( filter(signed => !!signed?.signed), map(signed => signed?.signed), timeoutWith(900, store.select(selectSignedUrl(url)) - .pipe(map(signed => signed?.signed || url)) + .pipe( + takeWhile( signed => signed !== null), + map(signed => signed?.signed || url) + ) ), ); @@ -103,7 +106,8 @@ export const commonAuthReducer = [ } }), on(resetCredential, state => ({...state, newCredential: initAuth.newCredential})), - on(addCredential, (state, action) => ({ ...state, + on(addCredential, (state, action) => ({ + ...state, newCredential: {...action.newCredential, company: action.workspaceId}, credentials: { ...state.credentials, @@ -111,6 +115,14 @@ export const commonAuthReducer = [ ...(state.credentials[action.workspaceId] || []), ...(Object.keys(action.newCredential).length > 0 ? [{...action.newCredential, company: action.workspaceId}] : []) ]}})), + on(setCredentialLabel, (state, action) => ({ + ...state, + newCredential: {...state.newCredential, label: action.label}, + credentials: { + ...state.credentials, + [action.credential.company]: state.credentials[action.credential.company]?.map(cred => + cred.access_key === action.credential.access_key ? {...action.credential, label: action.label} : cred) + }})), on(removeCredential, (state, action) => ({ ...state, credentials: { ...state.credentials, [action.workspaceId]: state.credentials[action.workspaceId].filter((cred => cred.access_key !== action.accessKey)) @@ -119,4 +131,5 @@ export const commonAuthReducer = [ ...state, credentials: {[action.credentials[0]?.company || action.workspace]: action.credentials, ...action.extra}, revokeSucceed: false})), on(setSignedUrl, (state, action) => ({...state, signedUrls: {...state.signedUrls, [action.url]: {signed: action.signed, expires: action.expires}}})), + on(removeSignedUrl, (state, action) => ({...state, signedUrls: {...state.signedUrls, [action.url]: null}})), ] as ReducerTypes[]; diff --git a/src/app/webapp-common/core/reducers/projects.reducer.ts b/src/app/webapp-common/core/reducers/projects.reducer.ts index ecc7ad4a..135e3b1f 100644 --- a/src/app/webapp-common/core/reducers/projects.reducer.ts +++ b/src/app/webapp-common/core/reducers/projects.reducer.ts @@ -7,6 +7,7 @@ import {ITableExperiment} from '../../experiments/shared/common-experiment-model import {MetricColumn} from '@common/shared/utils/tableParamEncode'; import {sortByField} from '@common/tasks/tasks.utils'; import {ProjectsGetAllResponseSingle} from '~/business-logic/model/projects/projectsGetAllResponseSingle'; +import {User} from '~/business-logic/model/users/user'; export interface ProjectStatsGraphData { @@ -32,6 +33,9 @@ export interface RootProjects { graphVariant: { [project: string]: MetricColumn }; graphData: ProjectStatsGraphData[]; lastUpdate: string; + users: User[]; + allUsers: User[]; + extraUsers: User[]; } const initRootProjects: RootProjects = { @@ -46,7 +50,10 @@ const initRootProjects: RootProjects = { tagsFilterByProject: true, graphVariant: {}, graphData: null, - lastUpdate: null + lastUpdate: null, + users: [], + allUsers: [], + extraUsers: [], }; export const projects = state => state.rootProjects as RootProjects; @@ -72,6 +79,11 @@ export const selectSelectedMetricVariantForCurrProject = createSelector( selectSelectedProjectsMetricVariant, selectSelectedProjectId, (projectsVariant, projectId) => projectsVariant[projectId]); export const selectGraphData = createSelector(projects, state => state.graphData); +export const selectProjectUsers = createSelector(projects, state => state.extraUsers.length ? + Array.from(new Set([...state.users, ...state.extraUsers])) : + state.users +); +export const selectAllProjectsUsers = createSelector(projects, state => state.allUsers); export const projectsReducer = createReducer( initRootProjects, @@ -101,12 +113,12 @@ export const projectsReducer = createReducer( graphData: initRootProjects.graphData, }; }), - on(projectsActions.setSelectedProject, (state, action) => ({...state, selectedProject: action.project})), + on(projectsActions.setSelectedProject, (state, action) => ({...state, selectedProject: action.project, extraUsers: []})), on(projectsActions.deletedProjectFromRoot, (state, action) => { const projectIdsToDelete = [action.project.id].concat(action.project.sub_projects.map(project=> project.id)) return {...state, projects: state.projects.filter(project=> !projectIdsToDelete.includes(project.id))}; }), - on(projectsActions.resetSelectedProject, state => ({...state, selectedProject: initRootProjects.selectedProject})), + on(projectsActions.resetSelectedProject, state => ({...state, selectedProject: initRootProjects.selectedProject, users: [], extraUsers: []})), on(projectsActions.updateProjectCompleted, (state, action) => ({ ...state, selectedProject: {...state.selectedProject, ...action.changes}, @@ -124,4 +136,7 @@ export const projectsReducer = createReducer( })), on(projectsActions.setGraphData, (state, action) => ({...state, graphData: action.stats})), on(projectsActions.setLastUpdate, (state, action) => ({...state, lastUpdate: action.lastUpdate})), + on(projectsActions.setProjectUsers, (state, action) => ({...state, users: action.users, extraUsers: []})), + on(projectsActions.setAllProjectUsers, (state, action) => ({...state, allUsers: action.users})), + on(projectsActions.setProjectExtraUsers, (state, action) => ({...state, extraUsers: action.users})), ); diff --git a/src/app/webapp-common/core/reducers/view.reducer.ts b/src/app/webapp-common/core/reducers/view.reducer.ts index b7b134ff..5820367d 100644 --- a/src/app/webapp-common/core/reducers/view.reducer.ts +++ b/src/app/webapp-common/core/reducers/view.reducer.ts @@ -18,6 +18,7 @@ export interface ViewState { plotlyReady: boolean; aceReady: boolean; preferencesReady: boolean; + showUserFocus: boolean; } export const initViewState: ViewState = { @@ -36,7 +37,8 @@ export const initViewState: ViewState = { neverShowPopupAgain: [], plotlyReady: false, aceReady: false, - preferencesReady: false + preferencesReady: false, + showUserFocus: false, }; export const views = state => state.views as ViewState; @@ -56,6 +58,7 @@ export const selectFirstLoginAt = createSelector(views, state => state.firstLogi export const selectPlotlyReady = createSelector(views, state => state.plotlyReady); export const selectAceReady = createSelector(views, state => state.aceReady); export const selectNeverShowPopups = createSelector(views, (state): string[] => state.neverShowPopupAgain); +export const selectShowUserFocus = createSelector(views, state => state.showUserFocus); export const viewReducers = [ @@ -90,6 +93,7 @@ export const viewReducers = [ ...state, neverShowPopupAgain: action.reset ? state.neverShowPopupAgain.filter(popups => popups !== action.popupId) : Array.from(new Set([...state.neverShowPopupAgain, action.popupId])) })), + on(layoutActions.toggleUserFocus, (state, action) => ({...state, showUserFocus: action.show})) ] as ReducerTypes[]; export const viewReducer = createReducer( diff --git a/src/app/webapp-common/dashboard-search/dashboard-search.actions.ts b/src/app/webapp-common/dashboard-search/dashboard-search.actions.ts index 84ffe021..eb3ca8ce 100644 --- a/src/app/webapp-common/dashboard-search/dashboard-search.actions.ts +++ b/src/app/webapp-common/dashboard-search/dashboard-search.actions.ts @@ -1,9 +1,9 @@ import {Action, createAction, props} from '@ngrx/store'; import {ISmAction} from '../core/models/actions'; import {SEARCH_ACTIONS} from './dashboard-search.consts'; -import {Project} from '../../business-logic/model/projects/project'; -import {Task} from '../../business-logic/model/tasks/task'; -import {Model} from '../../business-logic/model/models/model'; +import {Project} from '~/business-logic/model/projects/project'; +import {Task} from '~/business-logic/model/tasks/task'; +import {Model} from '~/business-logic/model/models/model'; export const searchSetTerm = createAction( @@ -37,6 +37,16 @@ export const searchProjects = createAction( props<{query: string; regExp?: boolean}>() ); +export const searchPipelines = createAction( + SEARCH_ACTIONS.SEARCH_PIPELINES, + props<{query: string; regExp?: boolean}>() +); + +export const setPipelinesResults = createAction( + 'Set Pipelines Results', + props<{pipelines: Project[]}>() +); + export class SetProjectsResults implements ISmAction { public type = SEARCH_ACTIONS.SET_PROJECTS; public payload: { projects: Array }; diff --git a/src/app/webapp-common/dashboard-search/dashboard-search.consts.ts b/src/app/webapp-common/dashboard-search/dashboard-search.consts.ts index ac676709..375b1304 100644 --- a/src/app/webapp-common/dashboard-search/dashboard-search.consts.ts +++ b/src/app/webapp-common/dashboard-search/dashboard-search.consts.ts @@ -5,6 +5,7 @@ export const SEARCH_ACTIONS = { SET_TERM : SEARCH_PREFIX + 'SET_TERM', SEARCH_START : SEARCH_PREFIX + 'SEARCH_START', SEARCH_PROJECTS : SEARCH_PREFIX + 'SEARCH_PROJECTS', + SEARCH_PIPELINES : SEARCH_PREFIX + 'SEARCH_PIPELINES', SEARCH_EXPERIMENTS: SEARCH_PREFIX + 'SEARCH_EXPERIMENTS', SEARCH_MODELS : SEARCH_PREFIX + 'SEARCH_MODELS', SEARCH_COMPLETE : SEARCH_PREFIX + 'SEARCH_COMPLETE', diff --git a/src/app/webapp-common/dashboard-search/dashboard-search.effects.ts b/src/app/webapp-common/dashboard-search/dashboard-search.effects.ts index ae938e6f..618efd98 100644 --- a/src/app/webapp-common/dashboard-search/dashboard-search.effects.ts +++ b/src/app/webapp-common/dashboard-search/dashboard-search.effects.ts @@ -2,7 +2,17 @@ import {Injectable} from '@angular/core'; import {Actions, createEffect, ofType} from '@ngrx/effects'; import {activeLoader, deactivateLoader} from '../core/actions/layout.actions'; import { - SearchActivate, SearchClear, searchExperiments, searchModels, searchProjects, searchSetTerm, searchStart, SetExperimentsResults, SetModelsResults, SetProjectsResults + SearchActivate, + SearchClear, + searchExperiments, + searchModels, + searchPipelines, + searchProjects, + searchSetTerm, + searchStart, + SetExperimentsResults, + SetModelsResults, setPipelinesResults, + SetProjectsResults } from './dashboard-search.actions'; import {EXPERIMENT_SEARCH_ONLY_FIELDS, SEARCH_ACTIONS, SEARCH_PAGE_SIZE} from './dashboard-search.consts'; import {ApiProjectsService} from '~/business-logic/api-services/projects.service'; @@ -28,7 +38,7 @@ export class DashboardSearchEffects { /* eslint-disable @typescript-eslint/naming-convention */ activeLoader = createEffect(() => this.actions.pipe( - ofType(SEARCH_ACTIONS.SEARCH_PROJECTS, SEARCH_ACTIONS.SEARCH_MODELS, SEARCH_ACTIONS.SEARCH_EXPERIMENTS), + ofType(SEARCH_ACTIONS.SEARCH_PROJECTS, SEARCH_ACTIONS.SEARCH_MODELS, SEARCH_ACTIONS.SEARCH_EXPERIMENTS, SEARCH_ACTIONS.SEARCH_PIPELINES), map(action => activeLoader(action.type)) )); // add actions for each search @@ -43,6 +53,7 @@ export class DashboardSearchEffects { } actionsToFire.push(searchSetTerm(action)); actionsToFire.push(searchProjects(action)); + actionsToFire.push(searchPipelines(action)); actionsToFire.push(searchExperiments(action)); actionsToFire.push(searchModels(action)); return actionsToFire; @@ -56,16 +67,37 @@ export class DashboardSearchEffects { ...(action.query && {pattern: action.regExp ? action.query : escapeRegex(action.query) + '[^/]*$'}), fields: ['name', 'id'] }, + include_stats_filter: {system_tags: ['-pipeline']}, stats_for_state: ProjectsGetAllExRequest.StatsForStateEnum.Active, scroll_id: null, size: SEARCH_PAGE_SIZE, include_stats: true, only_fields: ['name', 'company', 'user', 'created', 'default_output_destination'] - }).pipe( + } as ProjectsGetAllExRequest).pipe( mergeMap(res => [new SetProjectsResults(res.projects), deactivateLoader(action.type)]), catchError(error => [deactivateLoader(action.type), requestFailed(error)]))) )); + searchPipelines = createEffect(() => this.actions.pipe( + ofType(searchPipelines.type), + switchMap((action: ReturnType) => this.projectsApi.projectsGetAllEx({ + _any_: { + ...(action.query && {pattern: action.regExp ? action.query : escapeRegex(action.query) + '[^/]*$'}), + fields: ['name', 'id'] + }, + search_hidden: true, + shallow_search: false, + system_tags: ['pipeline'], + stats_for_state: ProjectsGetAllExRequest.StatsForStateEnum.Active, + scroll_id: null, + size: SEARCH_PAGE_SIZE, + include_stats: true, + only_fields: ['name', 'company', 'user', 'created', 'default_output_destination', 'tags', 'system_tags'] + } as ProjectsGetAllExRequest).pipe( + mergeMap(res => [setPipelinesResults({pipelines:res.projects}), deactivateLoader(action.type)]), + catchError(error => [deactivateLoader(action.type), requestFailed(error)]))) + )); + searchModels = createEffect(() => this.actions.pipe( ofType(searchModels.type), switchMap((action: ReturnType) => this.modelsApi.modelsGetAllEx({ diff --git a/src/app/webapp-common/dashboard-search/dashboard-search.reducer.ts b/src/app/webapp-common/dashboard-search/dashboard-search.reducer.ts index b246db43..4ca238e0 100644 --- a/src/app/webapp-common/dashboard-search/dashboard-search.reducer.ts +++ b/src/app/webapp-common/dashboard-search/dashboard-search.reducer.ts @@ -4,13 +4,14 @@ import {Task} from '../../business-logic/model/tasks/task'; import {createFeatureSelector, createSelector} from '@ngrx/store'; import {SEARCH_ACTIONS} from './dashboard-search.consts'; import {Model} from '../../business-logic/model/models/model'; -import {searchSetTerm} from './dashboard-search.actions'; +import {searchSetTerm, setPipelinesResults} from './dashboard-search.actions'; import {ICommonSearchState} from '../common-search/common-search.reducer'; export interface ISearchState { projects: Project[]; experiments: Task[]; models: Model[]; + pipelines: Project[]; users: User[]; resultsCounter: number; term: ICommonSearchState['searchQuery']; @@ -20,14 +21,15 @@ export interface ISearchState { export const searchInitialState: ISearchState = { - term : null, + term: null, forceSearch: false, - projects : [], - users : [], - experiments : [], - models : [], + projects: [], + pipelines: [], + users: [], + experiments: [], + models: [], resultsCounter: 0, - active : false + active: false }; export function dashboardSearchReducer(state: ISearchState = searchInitialState, action) { @@ -42,6 +44,8 @@ export function dashboardSearchReducer(state: ISearchState = sear } case SEARCH_ACTIONS.SET_PROJECTS: return {...state, projects: action.payload.projects, resultsCounter: state.resultsCounter + 1}; + case setPipelinesResults.type: + return {...state, pipelines: action.pipelines, resultsCounter: state.resultsCounter + 1}; case SEARCH_ACTIONS.SET_EXPERIMENTS: return {...state, experiments: action.payload.experiments, resultsCounter: state.resultsCounter + 1}; case SEARCH_ACTIONS.SET_MODELS: @@ -60,10 +64,11 @@ export function dashboardSearchReducer(state: ISearchState = sear } -export const selectSearch = createFeatureSelector('search'); -export const selectProjectsResults = createSelector(selectSearch, (state: ISearchState): Array => state.projects); +export const selectSearch = createFeatureSelector('search'); +export const selectProjectsResults = createSelector(selectSearch, (state: ISearchState): Array => state.projects); export const selectExperimentsResults = createSelector(selectSearch, (state: ISearchState): Array => state.experiments); -export const selectModelsResults = createSelector(selectSearch, (state: ISearchState): Array => state.models); -export const selectActiveSearch = createSelector(selectSearch, (state: ISearchState): boolean => state.term?.query?.length >= 3 || state.forceSearch); -export const selectSearchTerm = createSelector(selectSearch, (state: ISearchState) => state.term); -export const selectResultsCounter = createSelector(selectSearch, (state: ISearchState): number => state.resultsCounter); +export const selectModelsResults = createSelector(selectSearch, (state: ISearchState): Array => state.models); +export const selectPipelinesResults = createSelector(selectSearch, (state: ISearchState): Array => state.pipelines); +export const selectActiveSearch = createSelector(selectSearch, (state: ISearchState): boolean => state.term?.query?.length >= 3 || state.forceSearch); +export const selectSearchTerm = createSelector(selectSearch, (state: ISearchState) => state.term); +export const selectResultsCounter = createSelector(selectSearch, (state: ISearchState): number => state.resultsCounter); diff --git a/src/app/webapp-common/dashboard-search/dumb/experiments-search-results/experiments-search-results.component.html b/src/app/webapp-common/dashboard-search/dumb/experiments-search-results/experiments-search-results.component.html deleted file mode 100644 index 2569a925..00000000 --- a/src/app/webapp-common/dashboard-search/dumb/experiments-search-results/experiments-search-results.component.html +++ /dev/null @@ -1,7 +0,0 @@ -
- -
diff --git a/src/app/webapp-common/dashboard-search/dumb/experiments-search-results/experiments-search-results.component.scss b/src/app/webapp-common/dashboard-search/dumb/experiments-search-results/experiments-search-results.component.scss deleted file mode 100644 index e69de29b..00000000 diff --git a/src/app/webapp-common/dashboard-search/dumb/experiments-search-results/experiments-search-results.component.ts b/src/app/webapp-common/dashboard-search/dumb/experiments-search-results/experiments-search-results.component.ts deleted file mode 100644 index e3833142..00000000 --- a/src/app/webapp-common/dashboard-search/dumb/experiments-search-results/experiments-search-results.component.ts +++ /dev/null @@ -1,18 +0,0 @@ -import {Component, EventEmitter, Input, Output} from '@angular/core'; -import {Task} from '../../../../business-logic/model/tasks/task'; -import {ITask} from '../../../../business-logic/model/al-task'; - -@Component({ - selector : 'sm-experiments-search-results', - templateUrl: './experiments-search-results.component.html', - styleUrls : ['./experiments-search-results.component.scss'] -}) -export class ExperimentsSearchResultsComponent { - @Input() experimentsList: Array; - @Output() experimentClicked = new EventEmitter(); - - public experimentCardClicked(experiment: ITask) { - this.experimentClicked.emit(experiment); - } - -} diff --git a/src/app/webapp-common/dashboard-search/dumb/models-search-results/models-search-results.component.html b/src/app/webapp-common/dashboard-search/dumb/models-search-results/models-search-results.component.html deleted file mode 100644 index c25d7a33..00000000 --- a/src/app/webapp-common/dashboard-search/dumb/models-search-results/models-search-results.component.html +++ /dev/null @@ -1,7 +0,0 @@ -
- -
diff --git a/src/app/webapp-common/dashboard-search/dumb/models-search-results/models-search-results.component.scss b/src/app/webapp-common/dashboard-search/dumb/models-search-results/models-search-results.component.scss deleted file mode 100644 index e69de29b..00000000 diff --git a/src/app/webapp-common/dashboard-search/dumb/models-search-results/models-search-results.component.ts b/src/app/webapp-common/dashboard-search/dumb/models-search-results/models-search-results.component.ts deleted file mode 100644 index 3579b459..00000000 --- a/src/app/webapp-common/dashboard-search/dumb/models-search-results/models-search-results.component.ts +++ /dev/null @@ -1,17 +0,0 @@ -import {Component, EventEmitter, Input, Output} from '@angular/core'; -import {Model} from '../../../../business-logic/model/models/model'; - -@Component({ - selector : 'sm-models-search-results', - templateUrl: './models-search-results.component.html', - styleUrls : ['./models-search-results.component.scss'] -}) -export class ModelsSearchResultsComponent { - @Input() modelsList: Array; - @Output() modelClicked = new EventEmitter(); - - public modelCardClicked(model: Model) { - this.modelClicked.emit(model); - } - -} diff --git a/src/app/webapp-common/dashboard-search/dumb/projects-search-results/projects-search-results.component.html b/src/app/webapp-common/dashboard-search/dumb/projects-search-results/projects-search-results.component.html deleted file mode 100644 index b6d5c6b8..00000000 --- a/src/app/webapp-common/dashboard-search/dumb/projects-search-results/projects-search-results.component.html +++ /dev/null @@ -1,8 +0,0 @@ -
- -
diff --git a/src/app/webapp-common/dashboard-search/dumb/projects-search-results/projects-search-results.component.scss b/src/app/webapp-common/dashboard-search/dumb/projects-search-results/projects-search-results.component.scss deleted file mode 100644 index e69de29b..00000000 diff --git a/src/app/webapp-common/dashboard-search/dumb/projects-search-results/projects-search-results.component.ts b/src/app/webapp-common/dashboard-search/dumb/projects-search-results/projects-search-results.component.ts deleted file mode 100644 index 09fc0570..00000000 --- a/src/app/webapp-common/dashboard-search/dumb/projects-search-results/projects-search-results.component.ts +++ /dev/null @@ -1,17 +0,0 @@ -import {Component, EventEmitter, Input, Output} from '@angular/core'; -import {Project} from '../../../../business-logic/model/projects/project'; - -@Component({ - selector : 'sm-projects-search-results', - templateUrl: './projects-search-results.component.html', - styleUrls : ['./projects-search-results.component.scss'] -}) -export class ProjectsSearchResultsComponent { - @Input() projectsList: Array; - @Output() projectClicked = new EventEmitter(); - - public projectCardClicked(project: Project) { - this.projectClicked.emit(project); - } - -} diff --git a/src/app/webapp-common/dashboard-search/dumb/search-results/search-results.component.html b/src/app/webapp-common/dashboard-search/dumb/search-results/search-results.component.html new file mode 100644 index 00000000..7146ec27 --- /dev/null +++ b/src/app/webapp-common/dashboard-search/dumb/search-results/search-results.component.html @@ -0,0 +1,7 @@ + +
+ + + +
+
diff --git a/src/app/webapp-common/dashboard-search/dumb/search-results/search-results.component.scss b/src/app/webapp-common/dashboard-search/dumb/search-results/search-results.component.scss new file mode 100644 index 00000000..fe5c60c3 --- /dev/null +++ b/src/app/webapp-common/dashboard-search/dumb/search-results/search-results.component.scss @@ -0,0 +1,15 @@ +:host { + .card-container { + height: 100%; + padding: 0 24px 24px; + + .card-row { + display: grid; + grid-template-columns: repeat(auto-fit, 352px); + grid-gap: 32px 24px; + margin: 0 auto; + + padding: 16px 0; + } + } +} diff --git a/src/app/webapp-common/dashboard-search/dumb/search-results/search-results.component.ts b/src/app/webapp-common/dashboard-search/dumb/search-results/search-results.component.ts new file mode 100644 index 00000000..a3a883c0 --- /dev/null +++ b/src/app/webapp-common/dashboard-search/dumb/search-results/search-results.component.ts @@ -0,0 +1,54 @@ +import {Component, EventEmitter, Input, Output, TemplateRef, ViewChild} from '@angular/core'; +import {BehaviorSubject, combineLatest, Observable} from 'rxjs'; +import {BreakpointObserver, BreakpointState} from '@angular/cdk/layout'; +import {map, take} from 'rxjs/operators'; +import {chunk} from 'lodash/fp'; +import {trackById} from '@common/shared/utils/forms-track-by'; +import {CdkVirtualScrollViewport} from '@angular/cdk/scrolling'; +import {Store} from '@ngrx/store'; +import {selectScaleFactor} from '@common/core/reducers/view.reducer'; + +const SIDE_NAV_PLUS_PAD = 64 + 24 + 24; +const CARD_WIDTH = 352; + +@Component({ + selector: 'sm-search-results', + templateUrl: './search-results.component.html', + styleUrls: ['./search-results.component.scss'] +}) +export class SearchResultsComponent { + private cardLayoutChange$: Observable; + private results$ = new BehaviorSubject(null); + public resultRows$: Observable; + public trackById = trackById; + public rowWidth = 300; + + @Input() cardTemplate: TemplateRef; + @Input() set results(results: any[]) { + this.results$.next(results); + this.viewPort?.scrollToIndex(0); + } + @Input() cardHeight = 246; + @Output() resultClicked = new EventEmitter(); + @ViewChild(CdkVirtualScrollViewport) viewPort : CdkVirtualScrollViewport; + + constructor(private store: Store, private breakpointObserver: BreakpointObserver) { + this.store.select(selectScaleFactor) + .pipe(take(1), map(factor => 100 / factor)) + .subscribe(factor => { + const points = {} as {[point: string]: number}; + [2,3,4,5,6].forEach(num => + points[`(min-width: ${num === 2 ? 0 : ((num - 2) * 24 + (num - 1) * CARD_WIDTH + SIDE_NAV_PLUS_PAD) * factor}px) and ` + + `(max-width: ${num === 6 ? 20000 : ((num - 1) * 24 + num * CARD_WIDTH + SIDE_NAV_PLUS_PAD) * factor}px)`] = num); + this.cardLayoutChange$ = breakpointObserver.observe(Object.keys(points)); + + this.resultRows$ = combineLatest([this.cardLayoutChange$, this.results$]) + .pipe(map(([match, results]) => { + const point = Object.entries(match.breakpoints).find(([, val]) => val); + const cards = point ? points[point[0]] - 1 : 3; + this.rowWidth = cards * CARD_WIDTH + (cards - 1) * 24 + return chunk(cards, results); + })); + }); + } +} diff --git a/src/app/webapp-common/dashboard/common-dashboard.effects.ts b/src/app/webapp-common/dashboard/common-dashboard.effects.ts index 91fb9d8a..f8ce2847 100644 --- a/src/app/webapp-common/dashboard/common-dashboard.effects.ts +++ b/src/app/webapp-common/dashboard/common-dashboard.effects.ts @@ -38,12 +38,13 @@ export class CommonDashboardEffects { this.projectsApi.projectsGetAllEx({ stats_for_state: ProjectsGetAllExRequest.StatsForStateEnum.Active, include_stats: true, + include_stats_filter: {system_tags: ['-pipeline']}, order_by: ['featured', '-last_update'], page: 0, page_size: CARDS_IN_ROW, active_users: (showOnlyUserWork ? [user.id] : null), only_fields: ['name', 'company', 'user', 'created', 'default_output_destination'] - }).pipe( + } as ProjectsGetAllExRequest).pipe( mergeMap(({projects}) => [setRecentProjects({projects}), deactivateLoader(action.type)]), catchError(error => [deactivateLoader(action.type), requestFailed(error)]) ) diff --git a/src/app/webapp-common/dashboard/dashboard-search.component.base.ts b/src/app/webapp-common/dashboard/dashboard-search.component.base.ts index 1387f857..41304282 100644 --- a/src/app/webapp-common/dashboard/dashboard-search.component.base.ts +++ b/src/app/webapp-common/dashboard/dashboard-search.component.base.ts @@ -1,26 +1,26 @@ import {InitSearch, ResetSearch} from '../common-search/common-search.actions'; import {skip} from 'rxjs/operators'; -import {Model} from '../../business-logic/model/models/model'; +import {Model} from '~/business-logic/model/models/model'; import {SearchDeactivate, searchStart} from '../dashboard-search/dashboard-search.actions'; import {IRecentTask} from './common-dashboard.reducer'; -import {ITask} from '../../business-logic/model/al-task'; +import {ITask} from '~/business-logic/model/al-task'; import {Observable} from 'rxjs'; import {ICommonSearchState, selectSearchQuery} from '../common-search/common-search.reducer'; import {Store} from '@ngrx/store'; import { - selectActiveSearch, selectExperimentsResults, selectModelsResults, selectProjectsResults, + selectActiveSearch, selectExperimentsResults, selectModelsResults, selectPipelinesResults, selectProjectsResults, selectResultsCounter, selectSearchTerm } from '../dashboard-search/dashboard-search.reducer'; -import {Project} from '../../business-logic/model/projects/project'; +import {Project} from '~/business-logic/model/projects/project'; import {setSelectedProjectId} from '../core/actions/projects.actions'; import {isExample} from '../shared/utils/shared-utils'; +import {ActiveSearchLink} from '~/features/dashboard/containers/dashboard-search/dashboard-search.component'; export abstract class DashboardSearchComponentBase { - abstract store; abstract router; - public activeLink: string = 'projects'; + public activeLink = 'projects' as ActiveSearchLink; private searchSubs; public searchQuery$: Observable; public activeSearch$: Observable; @@ -29,12 +29,14 @@ export abstract class DashboardSearchComponentBase { public projectsResults$: Observable>; public experimentsResults$: Observable; public searchTerm$: Observable; + public pipelinesResults$: Observable; constructor(store: Store){ this.searchQuery$ = store.select(selectSearchQuery); this.activeSearch$ = store.select(selectActiveSearch); this.resultsCounter$ = store.select(selectResultsCounter); this.modelsResults$ = store.select(selectModelsResults); + this.pipelinesResults$ = store.select(selectPipelinesResults); this.projectsResults$ = store.select(selectProjectsResults); this.experimentsResults$ = store.select(selectExperimentsResults); this.searchTerm$ = store.select(selectSearchTerm); @@ -73,6 +75,10 @@ export abstract class DashboardSearchComponentBase { this.router.navigateByUrl(`projects/${project.id}`); this.store.dispatch(setSelectedProjectId({projectId: project.id, example: isExample(project)})); } + pipelineSelected(project: Project) { + this.router.navigateByUrl(`pipelines/${project.id}/experiments`); + this.store.dispatch(setSelectedProjectId({projectId: project.id, example: isExample(project)})); + } public taskSelected(task: IRecentTask | ITask) { // TODO ADD task.id to route @@ -85,7 +91,7 @@ export abstract class DashboardSearchComponentBase { this.activeLink = activeLink; } - setFirstActiveLink(allResults, tabsIndexes: string[]) { + setFirstActiveLink(allResults, tabsIndexes) { if (!(allResults[tabsIndexes.indexOf(this.activeLink)].length > 0)) { const firstTabIndex = allResults.findIndex(list => list.length > 0); if (firstTabIndex > -1) { diff --git a/src/app/webapp-common/dashboard/dumb/recent-experiment-table/recent-experiment-table.component.html b/src/app/webapp-common/dashboard/dumb/recent-experiment-table/recent-experiment-table.component.html index 1a239dee..15698230 100644 --- a/src/app/webapp-common/dashboard/dumb/recent-experiment-table/recent-experiment-table.component.html +++ b/src/app/webapp-common/dashboard/dumb/recent-experiment-table/recent-experiment-table.component.html @@ -1,7 +1,7 @@ diff --git a/src/app/webapp-common/debug-images/debug-image-snippet/debug-image-snippet.component.html b/src/app/webapp-common/debug-images/debug-image-snippet/debug-image-snippet.component.html index 5156786d..0bf6aa5b 100644 --- a/src/app/webapp-common/debug-images/debug-image-snippet/debug-image-snippet.component.html +++ b/src/app/webapp-common/debug-images/debug-image-snippet/debug-image-snippet.component.html @@ -1,5 +1,5 @@ -
+
{{iteration.iter}} -
+
+ (imageError)="imageUrlError({frame, experimentId})" + (imageClicked)="imageClicked.emit({frame})">
diff --git a/src/app/webapp-common/debug-images/debug-images-view/debug-images-view.component.scss b/src/app/webapp-common/debug-images/debug-images-view/debug-images-view.component.scss index ad2595ac..b658da25 100644 --- a/src/app/webapp-common/debug-images/debug-images-view/debug-images-view.component.scss +++ b/src/app/webapp-common/debug-images/debug-images-view/debug-images-view.component.scss @@ -44,7 +44,7 @@ .mat-expansion-panel { width: 100%; - margin-top: 4px; + margin-bottom: 12px; box-shadow: unset; &:hover{ background:transparent; @@ -53,7 +53,7 @@ ::ng-deep .mat-expansion-panel-content { .mat-expansion-panel-body { - padding: 0 12px 48px 12px; + padding: 0 0 12px 28px; } } @@ -100,4 +100,8 @@ background: transparent; } } + + .sample-row { + gap: 24px; + } } diff --git a/src/app/webapp-common/debug-images/debug-images-view/debug-images-view.component.ts b/src/app/webapp-common/debug-images/debug-images-view/debug-images-view.component.ts index 350cbf38..1eebe4b2 100644 --- a/src/app/webapp-common/debug-images/debug-images-view/debug-images-view.component.ts +++ b/src/app/webapp-common/debug-images/debug-images-view/debug-images-view.component.ts @@ -1,5 +1,6 @@ import {Component, Input, Output} from '@angular/core'; import {EventEmitter} from '@angular/core'; +import {Iteration, Event} from '@common/debug-images/debug-images.component'; @Component({ selector: 'sm-debug-images-view', @@ -10,26 +11,17 @@ export class DebugImagesViewComponent { public trackKey = (index: number, item: any) => item.iter; public trackFrame = (index: number, item: any) => `${item?.key} ${item?.timestamp}`; - public iterationEvents; @Input() experimentId; @Input() isMergeIterations; @Input() title; - private _iterations; - @Input() set iterations(iters) { - this._iterations = iters; - this.iterationEvents = []; - iters.forEach(iteration => this.iterationEvents.push(iteration.events)); - } - get iterations() { - return this._iterations; - } + @Input() iterations: Iteration[]; @Input() isDarkTheme = false; @Output() imageClicked = new EventEmitter(); @Output() refreshClicked = new EventEmitter(); @Output() urlError = new EventEmitter(); - public imageUrlError(data: { frame: string; experimentId: string }) { + public imageUrlError(data: { frame: Event; experimentId: string }) { this.urlError.emit(data); } } diff --git a/src/app/webapp-common/debug-images/debug-images.component.html b/src/app/webapp-common/debug-images/debug-images.component.html index 2579eb9e..202e7c0d 100644 --- a/src/app/webapp-common/debug-images/debug-images.component.html +++ b/src/app/webapp-common/debug-images/debug-images.component.html @@ -59,10 +59,10 @@ [title]="experimentNames && experimentNames[experimentId]" [isMergeIterations]="mergeIterations" [isDarkTheme]="isDarkTheme" - (imageClicked)="imageClicked($event)" + (imageClicked)="imageClicked($event, experimentId)" (urlError)="urlError()" >
-
+
diff --git a/src/app/webapp-common/debug-images/debug-images.component.ts b/src/app/webapp-common/debug-images/debug-images.component.ts index 78e68cf9..8810d175 100644 --- a/src/app/webapp-common/debug-images/debug-images.component.ts +++ b/src/app/webapp-common/debug-images/debug-images.component.ts @@ -8,6 +8,7 @@ import {MatDialog} from '@angular/material/dialog'; import * as debugActions from './debug-images-actions'; import {fetchExperiments, getDebugImagesMetrics, resetDebugImages} from './debug-images-actions'; import { + ITaskOptionalMetrics, selectBeginningOfTime, selectDebugImages, selectNoMore, @@ -30,7 +31,7 @@ import {getSignedUrl} from '../core/actions/common-auth.actions'; import {addMessage} from '../core/actions/layout.actions'; import {RefreshService} from '@common/core/services/refresh.service'; -interface Event { +export interface Event { timestamp: number; type?: string; task?: string; @@ -43,7 +44,7 @@ interface Event { worker?: string; } -interface Iteration { +export interface Iteration { events: Event[]; iter: number; } @@ -85,8 +86,8 @@ export class DebugImagesComponent implements OnInit, OnDestroy { public allowAutorefresh: boolean = false; public noMoreData$: Observable; - public optionalMetrics$: Observable; - public optionalMetrics: any; + public optionalMetrics$: Observable; + public optionalMetrics: {[experimentId: string]: string}; public selectedMetrics: { [taskId: string]: string } = {}; public beginningOfTime: any; private beginningOfTimeSubscription: Subscription; @@ -270,11 +271,8 @@ export class DebugImagesComponent implements OnInit, OnDestroy { // this.adminService.checkImgUrl(frame.oldSrc || frame.src); } - imageClicked({frame, frames}) { - let iterationSnippets = []; - Object.entries(frames).map(iteration => { - iterationSnippets = iterationSnippets.concat(iteration[1]); - }); + imageClicked({frame}, experimentId: string) { + const iterationSnippets = this.debugImages?.[experimentId]?.data.map(iter => iter.events).flat(); const sources = iterationSnippets.map(img => img.url); const index = iterationSnippets.findIndex(img => img.url === frame.url); this.dialog.open(ImageDisplayerComponent, { @@ -326,10 +324,6 @@ export class DebugImagesComponent implements OnInit, OnDestroy { return (this.thereAreNoMetrics(experiment) && this.optionalMetrics && this.optionalMetrics[experiment]) || (this.thereAreNoDebugImages(experiment) && this.debugImages && this.debugImages[experiment]); } - // buildUrl() { - // return ['../../', 'experiments', ]; - // } - copyIdToClipboard() { this.store.dispatch(addMessage('success', 'Copied to clipboard')); } diff --git a/src/app/webapp-common/experiments-compare/containers/experiment-compare-base.component.scss b/src/app/webapp-common/experiments-compare/containers/experiment-compare-base.component.scss index d974e996..cb621ee5 100644 --- a/src/app/webapp-common/experiments-compare/containers/experiment-compare-base.component.scss +++ b/src/app/webapp-common/experiments-compare/containers/experiment-compare-base.component.scss @@ -102,15 +102,15 @@ $extra-header-min-height: 50px; pre { margin-bottom: 0; margin-top: 0; - padding-right: 20px; + padding-right: 30px; padding-left: 6px; .extend-toggle { visibility: hidden; cursor: pointer; position: absolute; - right: 0; - top: 5px; + right: 6px; + top: 6px; color: $blue-500; } } @@ -144,6 +144,14 @@ $extra-header-min-height: 50px; background-color: #f8f9fa; } + &.hovered { + box-shadow: 0 0 0 1px $blue-250 inset; + + &.diff-row { + box-shadow: 0 0 0 1px lighten($strong-red, 20%) inset, 0 0 0 2px white inset; + } + } + &.selected-diff { background-color: $faint-gray; position: relative; @@ -197,6 +205,14 @@ $extra-header-min-height: 50px; cursor: default; } + &.hovered { + box-shadow: 0 0 0 1px $blue-250 inset; + + &.al-danger { + box-shadow: 0 0 0 1px lighten($strong-red, 20%) inset, 0 0 0 2px white inset; + } + } + &.selected-diff { background-color: $faint-gray; position: relative; diff --git a/src/app/webapp-common/experiments-compare/containers/experiment-compare-base.ts b/src/app/webapp-common/experiments-compare/containers/experiment-compare-base.ts index 58cde8ce..25df296c 100644 --- a/src/app/webapp-common/experiments-compare/containers/experiment-compare-base.ts +++ b/src/app/webapp-common/experiments-compare/containers/experiment-compare-base.ts @@ -54,6 +54,7 @@ export abstract class ExperimentCompareBase extends ExperimentCompareDetailsBase public originalExperiments: { [id: string]: IExperimentDetail | ExperimentParams } = {}; public allPathsDiffs: any = {}; public selectedPath: string = null; + public hoveredPath: string = null; private selectedPathIndex: number = -1; public onlyDiffsPaths: string[]; @@ -462,12 +463,17 @@ export abstract class ExperimentCompareBase extends ExperimentCompareDetailsBase } } + rowHovered(path) { + this.hoveredPath = path; + } + keyClicked(data) { const path = data.path; this.selectedPathClicked(path); } - checkIfSelectedPath = (data: any) => this.selectedPath === (data.path); + checkIfSelectedPath = (data: any) => this.selectedPath === data.path; + checkIfHoveredPath = (data: any) => this.hoveredPath === data.path; // checkIfFoundPathPath = (data: any) => this.foundPath === (data.path); diff --git a/src/app/webapp-common/experiments-compare/containers/experiment-compare-details/experiment-compare-details.component.html b/src/app/webapp-common/experiments-compare/containers/experiment-compare-details/experiment-compare-details.component.html index 952db00c..3250c44b 100644 --- a/src/app/webapp-common/experiments-compare/containers/experiment-compare-details/experiment-compare-details.component.html +++ b/src/app/webapp-common/experiments-compare/containers/experiment-compare-details/experiment-compare-details.component.html @@ -23,26 +23,32 @@
-
+
{{(renameMap[node.data.key] || node.data.key) | hideHashTitle}}
-
+
{{node.data.key | hideHash}}{{node.data.value}}
                     
diff --git a/src/app/webapp-common/experiments-compare/containers/experiment-compare-metric-charts/experiment-compare-scalar-charts.component.scss b/src/app/webapp-common/experiments-compare/containers/experiment-compare-metric-charts/experiment-compare-scalar-charts.component.scss index 54394877..8eaa5ad9 100644 --- a/src/app/webapp-common/experiments-compare/containers/experiment-compare-metric-charts/experiment-compare-scalar-charts.component.scss +++ b/src/app/webapp-common/experiments-compare/containers/experiment-compare-metric-charts/experiment-compare-scalar-charts.component.scss @@ -45,6 +45,6 @@ $list-width: 300px; } sm-experiment-graphs { - height: calc(100% - 64px); + height: 100%; } } diff --git a/src/app/webapp-common/experiments-compare/containers/experiment-compare-metric-charts/experiment-compare-scalar-charts.component.ts b/src/app/webapp-common/experiments-compare/containers/experiment-compare-metric-charts/experiment-compare-scalar-charts.component.ts index 219c7f53..d0200941 100644 --- a/src/app/webapp-common/experiments-compare/containers/experiment-compare-metric-charts/experiment-compare-scalar-charts.component.ts +++ b/src/app/webapp-common/experiments-compare/containers/experiment-compare-metric-charts/experiment-compare-scalar-charts.component.ts @@ -63,7 +63,8 @@ export class ExperimentCompareScalarChartsComponent implements OnInit, OnDestroy private changeDetection: ChangeDetectorRef, private refresh: RefreshService ) { - this.listOfHidden = this.store.pipe(select(selectSelectedSettingsHiddenScalar)); + this.listOfHidden = this.store.select(selectSelectedSettingsHiddenScalar) + .pipe(distinctUntilChanged(isEqual)); this.searchTerm$ = this.store.pipe(select(selectExperimentMetricsSearchTerm)); this.smoothWeight$ = this.store.select(selectCompareSelectedSettingsSmoothWeight); this.xAxisType$ = this.store.select(selectCompareSelectedSettingsxAxisType); @@ -161,7 +162,7 @@ export class ExperimentCompareScalarChartsComponent implements OnInit, OnDestroy } searchTermChanged(searchTerm: string) { - this.store.dispatch(new SetExperimentMetricsSearchTerm({searchTerm: searchTerm})); + this.store.dispatch(new SetExperimentMetricsSearchTerm({searchTerm})); } resetMetrics() { diff --git a/src/app/webapp-common/experiments-compare/containers/experiment-compare-metric-values/experiment-compare-metric-values.component.html b/src/app/webapp-common/experiments-compare/containers/experiment-compare-metric-values/experiment-compare-metric-values.component.html index 4646d0fa..4b8a73f5 100644 --- a/src/app/webapp-common/experiments-compare/containers/experiment-compare-metric-values/experiment-compare-metric-values.component.html +++ b/src/app/webapp-common/experiments-compare/containers/experiment-compare-metric-values/experiment-compare-metric-values.component.html @@ -9,17 +9,26 @@
-
-
- - {{node.data.key}} +
+
+ + {{node.data.key}}
+ [keyValueArray]="node.data | getKeyValueArrayPipe:allKeysEmptyObject:(sortOrder$| async)[node.data.key]:valuesMode.key" + [hoveredRow]="hoveredTable === node.data.key && hoveredRow" + (sortByChanged)="metricSortChanged($event,node.data)" + (rowHovered)="onRowHovered($event, node.data.key)" + > {{metricValue}} diff --git a/src/app/webapp-common/experiments-compare/containers/experiment-compare-metric-values/experiment-compare-metric-values.component.scss b/src/app/webapp-common/experiments-compare/containers/experiment-compare-metric-values/experiment-compare-metric-values.component.scss index 61f0c2d2..56566319 100644 --- a/src/app/webapp-common/experiments-compare/containers/experiment-compare-metric-values/experiment-compare-metric-values.component.scss +++ b/src/app/webapp-common/experiments-compare/containers/experiment-compare-metric-values/experiment-compare-metric-values.component.scss @@ -40,14 +40,39 @@ position: relative; display: block; - &:after { - position: absolute; - content: " "; - width: 100%; - height: 100%; - top: 0; - left: 0; + .content { background: #f2f3f6; + pointer-events: none; + + .node-key, .node-chevron { + visibility: hidden; + } + } + + al-table-diff { + display: block; + position: relative; + pointer-events: none; + + &:after { + position: absolute; + content: " "; + width: 100%; + height: 100%; + top: 0; + left: 0; + background: #f2f3f6; + } + } + } + &.hovered { + .content, &:after { + + box-shadow: 0 0 0 1px $blue-250 inset; + + &.diff-row { + box-shadow: 0 0 0 1px lighten($strong-red, 20%) inset, 0 0 0 2px white inset; + } } } } diff --git a/src/app/webapp-common/experiments-compare/containers/experiment-compare-metric-values/experiment-compare-metric-values.component.ts b/src/app/webapp-common/experiments-compare/containers/experiment-compare-metric-values/experiment-compare-metric-values.component.ts index 776e2276..bdf7d1a5 100644 --- a/src/app/webapp-common/experiments-compare/containers/experiment-compare-metric-values/experiment-compare-metric-values.component.ts +++ b/src/app/webapp-common/experiments-compare/containers/experiment-compare-metric-values/experiment-compare-metric-values.component.ts @@ -53,6 +53,8 @@ export class ExperimentCompareMetricValuesComponent implements OnInit, OnDestroy public experiments = []; private taskIds: string; public valuesMode: ValueMode; + public hoveredRow: string; + public hoveredTable: string; constructor( private router: Router, @@ -149,6 +151,7 @@ export class ExperimentCompareMetricValuesComponent implements OnInit, OnDestroy } else { this.paths = this.paths.filter(path => path !== node.data.key); } + this.hoveredRow = node.data.key; } metricSortChanged(event, nodeData) { @@ -194,4 +197,9 @@ export class ExperimentCompareMetricValuesComponent implements OnInit, OnDestroy copyIdToClipboard() { this.store.dispatch(addMessage('success', 'Copied to clipboard')); } + + onRowHovered(tableKey: string, tableName: string) { + this.hoveredRow = tableKey; + this.hoveredTable = tableName; + } } diff --git a/src/app/webapp-common/experiments-compare/containers/experiment-compare-params/experiment-compare-params.component.html b/src/app/webapp-common/experiments-compare/containers/experiment-compare-params/experiment-compare-params.component.html index 1907834f..bb170b8b 100644 --- a/src/app/webapp-common/experiments-compare/containers/experiment-compare-params/experiment-compare-params.component.html +++ b/src/app/webapp-common/experiments-compare/containers/experiment-compare-params/experiment-compare-params.component.html @@ -22,21 +22,23 @@
-
+
{{(renameMap[node.data.key] || node.data.key)}}
-
+
{{node.data.value}}
                     
diff --git a/src/app/webapp-common/experiments-compare/containers/experiment-compare-params/experiment-compare-params.component.scss b/src/app/webapp-common/experiments-compare/containers/experiment-compare-params/experiment-compare-params.component.scss index 68bb9143..fa86c418 100644 --- a/src/app/webapp-common/experiments-compare/containers/experiment-compare-params/experiment-compare-params.component.scss +++ b/src/app/webapp-common/experiments-compare/containers/experiment-compare-params/experiment-compare-params.component.scss @@ -16,6 +16,7 @@ justify-content: flex-start; .node-key { + flex: 1; position: relative; cursor: pointer; white-space: nowrap; @@ -33,6 +34,7 @@ } .node-val { + flex: 1; position: relative; cursor: pointer; white-space: nowrap; diff --git a/src/app/webapp-common/experiments-compare/containers/experiment-compare-plots/experiment-compare-plots.component.ts b/src/app/webapp-common/experiments-compare/containers/experiment-compare-plots/experiment-compare-plots.component.ts index 27a10e9b..884099e7 100644 --- a/src/app/webapp-common/experiments-compare/containers/experiment-compare-plots/experiment-compare-plots.component.ts +++ b/src/app/webapp-common/experiments-compare/containers/experiment-compare-plots/experiment-compare-plots.component.ts @@ -12,6 +12,7 @@ import {GetMultiPlotCharts, ResetExperimentMetrics, SetExperimentMetricsSearchTe import {selectCompareTasksPlotCharts, selectExperimentMetricsSearchTerm, selectSelectedExperimentSettings, selectSelectedSettingsHiddenPlot} from '../../reducers'; import {ExtFrame} from '@common/shared/experiment-graphs/single-graph/plotly-graph-base'; import {RefreshService} from '@common/core/services/refresh.service'; +import {addMessage} from '@common/core/actions/layout.actions'; @Component({ selector: 'sm-experiment-compare-plots', @@ -66,13 +67,14 @@ export class ExperimentComparePlotsComponent implements OnInit, OnDestroy { this.plotsSubscription = this.plots$ .subscribe((metricsPlots) => { this.refreshDisabled = false; - const merged = prepareMultiPlots(metricsPlots); + const {merged, parsingError} = prepareMultiPlots(metricsPlots); this.graphList = this.prepareList(merged); const newGraphs = convertMultiPlots(merged); if (!this.graphs || !isEqual(newGraphs, this.graphs)) { this.graphs = newGraphs; } this.changeDetection.detectChanges(); + parsingError && this.store.dispatch(addMessage('warn', `Couldn't read all plots. Please make sure all plots are properly formatted (NaN & Inf aren't supported).`, [], true)) }); this.settingsSubscription = this.experimentSettings$ diff --git a/src/app/webapp-common/experiments-compare/containers/select-experiments-for-compare/select-experiments-for-compare.component.ts b/src/app/webapp-common/experiments-compare/containers/select-experiments-for-compare/select-experiments-for-compare.component.ts index 4a811782..0c3616ee 100644 --- a/src/app/webapp-common/experiments-compare/containers/select-experiments-for-compare/select-experiments-for-compare.component.ts +++ b/src/app/webapp-common/experiments-compare/containers/select-experiments-for-compare/select-experiments-for-compare.component.ts @@ -30,7 +30,6 @@ import { selectExperimentsTableColsOrder, selectExperimentsTags, selectExperimentsTypes, - selectExperimentsUsers, selectHyperParamsOptions, selectNoMoreExperiments, selectTableFilters, selectTableSortFields @@ -42,7 +41,7 @@ import {InitSearch} from '@common/common-search/common-search.actions'; import * as experimentsActions from '../../../experiments/actions/common-experiments-view.actions'; import {resetExperiments, resetGlobalFilter} from '@common/experiments/actions/common-experiments-view.actions'; import {User} from '~/business-logic/model/users/user'; -import {selectProjectSystemTags, selectRootProjects} from '@common/core/reducers/projects.reducer'; +import {selectProjectSystemTags, selectProjectUsers, selectRootProjects} from '@common/core/reducers/projects.reducer'; import {SortMeta} from 'primeng/api'; import {Project} from '~/business-logic/model/projects/project'; import {addMessage} from '@common/core/actions/layout.actions'; @@ -116,7 +115,7 @@ export class SelectExperimentsForCompareComponent implements OnInit, OnDestroy { this.tableColsOrder$ = this.store.select(selectExperimentsTableColsOrder); this.columns$ = this.store.select(selectExperimentsTableCols); this.metricTableCols$ = this.store.select(selectExperimentsMetricsColsForProject); - this.users$ = this.store.select(selectExperimentsUsers); + this.users$ = this.store.select(selectProjectUsers); this.tableFilters$ = this.store.select(selectTableFilters); this.parent$ = this.store.select(selectExperimentsParents); this.projects$ = this.store.select(selectRootProjects); @@ -201,7 +200,6 @@ export class SelectExperimentsForCompareComponent implements OnInit, OnDestroy { this.changedDetectRef.detectChanges(); }); this.allowAddExperiment$ = allowAddExperiment$(this.store.select(selectRouterParams)); - this.store.dispatch(experimentsActions.getUsers()); this.store.dispatch(experimentsActions.getTags()); this.store.dispatch(experimentsActions.getProjectTypes()); this.store.dispatch(experimentsActions.getParents()); diff --git a/src/app/webapp-common/experiments-compare/dumbs/experiment-compare-header/experiment-compare-header.component.scss b/src/app/webapp-common/experiments-compare/dumbs/experiment-compare-header/experiment-compare-header.component.scss index 8965c5d4..569f7dd9 100644 --- a/src/app/webapp-common/experiments-compare/dumbs/experiment-compare-header/experiment-compare-header.component.scss +++ b/src/app/webapp-common/experiments-compare/dumbs/experiment-compare-header/experiment-compare-header.component.scss @@ -9,6 +9,7 @@ transform: translateX(-50%); z-index: 10; background-color: white; + transition: transform 0.5s; button { font-size: 13px; @@ -23,6 +24,13 @@ } } + @media(max-width: 1620px) { + #searchDiff { + position: static; + transform: unset; + } + } + ::ng-deep .btn-arrow { display: inline-flex; align-items: center; diff --git a/src/app/webapp-common/experiments-compare/dumbs/experiment-compare-header/experiment-compare-header.component.ts b/src/app/webapp-common/experiments-compare/dumbs/experiment-compare-header/experiment-compare-header.component.ts index 193d8a6e..def4e9cf 100644 --- a/src/app/webapp-common/experiments-compare/dumbs/experiment-compare-header/experiment-compare-header.component.ts +++ b/src/app/webapp-common/experiments-compare/dumbs/experiment-compare-header/experiment-compare-header.component.ts @@ -29,7 +29,7 @@ import { allowAddExperiment$, SelectExperimentsForCompareComponent } from '../../containers/select-experiments-for-compare/select-experiments-for-compare.component'; -import {MatDialog} from "@angular/material/dialog"; +import {MatDialog} from '@angular/material/dialog'; import {RefreshService} from '@common/core/services/refresh.service'; @Component({ diff --git a/src/app/webapp-common/experiments-compare/dumbs/parallel-coordinates-graph/parallel-coordinates-graph.component.ts b/src/app/webapp-common/experiments-compare/dumbs/parallel-coordinates-graph/parallel-coordinates-graph.component.ts index a33091e7..eab18527 100644 --- a/src/app/webapp-common/experiments-compare/dumbs/parallel-coordinates-graph/parallel-coordinates-graph.component.ts +++ b/src/app/webapp-common/experiments-compare/dumbs/parallel-coordinates-graph/parallel-coordinates-graph.component.ts @@ -1,5 +1,5 @@ import {Component, ElementRef, HostListener, Input, OnInit, ViewChild} from '@angular/core'; -import {PlotlyGraphBase} from '@common/shared/experiment-graphs/single-graph/plotly-graph-base'; +import {PlotlyGraphBaseComponent} from '@common/shared/experiment-graphs/single-graph/plotly-graph-base'; import {debounceTime, filter} from 'rxjs/operators'; import {ColorHashService} from '@common/shared/services/color-hash/color-hash.service'; import {get, getOr, isEqual, max, min, uniq, cloneDeep} from 'lodash/fp'; @@ -38,7 +38,7 @@ interface ParaPlotData { templateUrl: './parallel-coordinates-graph.component.html', styleUrls: ['./parallel-coordinates-graph.component.scss'] }) -export class ParallelCoordinatesGraphComponent extends PlotlyGraphBase implements OnInit { +export class ParallelCoordinatesGraphComponent extends PlotlyGraphBaseComponent implements OnInit { private data: ParaPlotData[]; private _experiments: ExtraTask[]; @@ -273,8 +273,8 @@ export class ParallelCoordinatesGraphComponent extends PlotlyGraphBase implement height: 500, width: this.parallelGraph.nativeElement.offsetWidth }, { - 'displaylogo': false, - 'displayModeBar': false, + displaylogo: false, + displayModeBar: false, modeBarButtonsToRemove: ['toggleHover'] }); this.postRenderingGraphManipulation(); diff --git a/src/app/webapp-common/experiments-compare/effects/select-experiment-for-compare-effects.service.ts b/src/app/webapp-common/experiments-compare/effects/select-experiment-for-compare-effects.service.ts index bea01b91..00cea1d2 100644 --- a/src/app/webapp-common/experiments-compare/effects/select-experiment-for-compare-effects.service.ts +++ b/src/app/webapp-common/experiments-compare/effects/select-experiment-for-compare-effects.service.ts @@ -1,5 +1,5 @@ import {Injectable} from '@angular/core'; -import {Actions, createEffect, Effect, ofType} from '@ngrx/effects'; +import {Actions, createEffect, ofType} from '@ngrx/effects'; import {debounceTime, filter, map, mergeMap, switchMap, withLatestFrom} from 'rxjs/operators'; import {activeLoader, deactivateLoader} from '../../core/actions/layout.actions'; import {ApiTasksService} from '~/business-logic/api-services/tasks.service'; @@ -34,14 +34,12 @@ export class SelectCompareHeaderEffects { private refresh: RefreshService ) {} - @Effect() - activeLoader = this.actions.pipe( + activeLoader = createEffect(() => this.actions.pipe( ofType(GET_SELECTED_EXPERIMENTS_FOR_COMPARE), map(action => activeLoader(action.type)) - ); + )); - @Effect() - refreshIfNeeded = this.actions.pipe( + refreshIfNeeded = createEffect(() => this.actions.pipe( ofType(refreshIfNeeded), withLatestFrom( this.store.select(selectAppVisible), @@ -67,7 +65,7 @@ export class SelectCompareHeaderEffects { setExperimentsUpdateTime({payload: updatedExperimentsUpdateTime})]; })) ) - ); + )); tableSortChange = createEffect(() => this.actions.pipe( ofType(compareAddDialogTableSortChanged), @@ -84,8 +82,7 @@ export class SelectCompareHeaderEffects { }) )); - @Effect() - searchExperimentsForCompare = this.actions.pipe( + searchExperimentsForCompare = createEffect(() => this.actions.pipe( ofType(getSelectedExperimentsForCompareAddDialog), withLatestFrom(this.store.select(selectRouterParams).pipe(map(params => get('ids', params)?.split(','))), this.store.select(exSelectors.selectExperimentsTableCols), @@ -99,5 +96,5 @@ export class SelectCompareHeaderEffects { }).pipe( mergeMap((res) => [setSearchExperimentsForCompareResults({payload: [...res?.tasks]}), deactivateLoader(action.type)]), ) - )); + ))); } diff --git a/src/app/webapp-common/experiments-compare/experiments-compare.constants.ts b/src/app/webapp-common/experiments-compare/experiments-compare.constants.ts index 4712dd85..cb07ae0e 100644 --- a/src/app/webapp-common/experiments-compare/experiments-compare.constants.ts +++ b/src/app/webapp-common/experiments-compare/experiments-compare.constants.ts @@ -42,9 +42,21 @@ export const COMPARE_DETAILS_ONLY_FIELDS_BASE = [ 'container', 'script', 'tags', + 'system_tags', 'published', 'last_iteration', - 'configuration' + 'configuration', + 'last_change', + 'completed', + 'created', + 'user.name', + 'parent.name', + 'execution.queue.name', + 'active_duration', + 'started', + 'status_message', + 'status_reason', + 'last_worker' ]; export const COMPARE_DEBUG_IMAGES_ONLY_FIELDS = [ diff --git a/src/app/webapp-common/experiments-compare/services/experiment-details-reverter.service.ts b/src/app/webapp-common/experiments-compare/services/experiment-details-reverter.service.ts index b1dde7c8..857cfca9 100644 --- a/src/app/webapp-common/experiments-compare/services/experiment-details-reverter.service.ts +++ b/src/app/webapp-common/experiments-compare/services/experiment-details-reverter.service.ts @@ -1,23 +1,51 @@ -import {Injectable} from '@angular/core'; -import {ExperimentReverterService} from '../../../features/experiments/shared/services/experiment-reverter.service'; +import {Inject, Injectable, LOCALE_ID} from '@angular/core'; +import {ExperimentReverterService} from '~/features/experiments/shared/services/experiment-reverter.service'; import {get} from 'lodash/fp'; import {ExecutionDetails, ModelDetails} from '../shared/experiments-compare-details.model'; -import {Task} from '../../../business-logic/model/tasks/task'; -import {ExperimentDetailsReverterServiceBase} from '../../../features/experiments-compare/experiment-details-reverter-service.base'; -import {ARTIFACTS_TYPES} from '../../tasks/tasks.constants'; -import {Artifact} from '../../../business-logic/model/tasks/artifact'; +import {Task} from '~/business-logic/model/tasks/task'; +import {ExperimentDetailsReverterServiceBase} from '~/features/experiments-compare/experiment-details-reverter-service.base'; +import {ARTIFACTS_TYPES, TAGS} from '../../tasks/tasks.constants'; +import {Artifact} from '~/business-logic/model/tasks/artifact'; import {crc32} from '../../shared/utils/shared-utils'; -import {TaskModelItem} from '../../../business-logic/model/tasks/taskModelItem'; +import {TaskModelItem} from '~/business-logic/model/tasks/taskModelItem'; import {IModelInfo} from '../../experiments/shared/common-experiment-model.model'; -import {ITask} from '../../../business-logic/model/al-task'; +import {ITask} from '~/business-logic/model/al-task'; +import {formatDate} from '@angular/common'; +import {TIME_FORMAT_STRING} from '@common/constants'; +import {NA} from '~/app.constants'; +import {DurationPipe} from '@common/shared/pipes/duration.pipe'; @Injectable({ providedIn: 'root' }) export class ExperimentDetailsReverterService extends ExperimentDetailsReverterServiceBase { - constructor(public experimentReverter: ExperimentReverterService) { + private durationPipe: DurationPipe; + + constructor(public experimentReverter: ExperimentReverterService, @Inject(LOCALE_ID) public locale: string) { super(experimentReverter); + this.durationPipe = new DurationPipe(); + this.locale = locale; + } + + public revertInfo(experiment: ITask) { + return { + archive: experiment.system_tags.includes(TAGS.HIDDEN) ? 'Yes' : 'No', + 'changed at': experiment.last_change && formatDate(experiment.last_change, TIME_FORMAT_STRING, this.locale) || NA, + 'last iteration': experiment.last_iteration || NA, + 'status message': experiment.status_message || NA, + 'status reason': experiment.status_reason || NA, + 'created at': experiment.created && formatDate(experiment.created, TIME_FORMAT_STRING, this.locale) || NA, + 'started at': experiment.started && formatDate(experiment.started, TIME_FORMAT_STRING, this.locale) || NA, + 'last update at': experiment.last_update && formatDate(experiment.last_update, TIME_FORMAT_STRING, this.locale) || NA, + 'completed at': experiment.completed && formatDate(experiment.completed, TIME_FORMAT_STRING, this.locale) || NA, + 'run time': this.durationPipe.transform(experiment.active_duration) || NA, + 'queue': experiment.execution.queue?.name || NA, + 'worker': experiment.last_worker || NA, + 'created by': experiment.user.name || NA, + 'parent task': (experiment.parent as ITask)?.name || NA, + 'project': experiment.project.name || NA, + }; } revertArtifacts(experiment: ITask): any { diff --git a/src/app/webapp-common/experiments/actions/common-experiments-view.actions.ts b/src/app/webapp-common/experiments/actions/common-experiments-view.actions.ts index eebaeae1..b093e849 100644 --- a/src/app/webapp-common/experiments/actions/common-experiments-view.actions.ts +++ b/src/app/webapp-common/experiments/actions/common-experiments-view.actions.ts @@ -3,7 +3,6 @@ import {ITableExperiment} from '../shared/common-experiment-model.model'; import {ISmCol} from '../../shared/ui-components/data/table/table.consts'; import {MetricVariantResult} from '~/business-logic/model/projects/metricVariantResult'; import {TableFilter} from '../../shared/utils/tableParamEncode'; -import {User} from '~/business-logic/model/users/user'; import {ProjectsGetTaskParentsResponseParents} from '~/business-logic/model/projects/projectsGetTaskParentsResponseParents'; import {SortMeta} from 'primeng/api'; import {CountAvailableAndIsDisableSelectedFiltered} from '@common/shared/entity-page/items.utils'; @@ -14,6 +13,8 @@ export const EXPERIMENTS_PREFIX = 'EXPERIMENTS_'; // COMMANDS: export const getExperiments = createAction(EXPERIMENTS_PREFIX + ' [get experiments]'); +export const selectNextExperiment = createAction(EXPERIMENTS_PREFIX + ' [select next experiment]'); + export const getExperimentsWithPageSize = createAction(EXPERIMENTS_PREFIX + ' [get experiments with size]', props<{pageSize: number}>()); export const getNextExperiments = createAction(EXPERIMENTS_PREFIX + '[get next experiments]'); @@ -100,12 +101,6 @@ export const setHiddenCols = createAction( props<{ hiddenCols: { [key: string]: boolean } }>() ); -export const setUsers = createAction( - EXPERIMENTS_PREFIX + 'SET_USERS', - props<{ users: User[] }>() -); - - export const setParents = createAction( EXPERIMENTS_PREFIX + '[set project experiment parents]', props<{ parents: ProjectsGetTaskParentsResponseParents[]}>() @@ -116,9 +111,7 @@ export const setActiveParentsFilter = createAction( props<{ parents: ProjectsGetTaskParentsResponseParents[]}>() ); -export const getUsers = createAction(EXPERIMENTS_PREFIX + 'GET_USERS'); export const getParents = createAction(EXPERIMENTS_PREFIX + '[get project experiments parents]'); -export const getFilteredUsers = createAction(EXPERIMENTS_PREFIX + 'GET_FILTERED_USERS'); export const tableFilterChanged = createAction( EXPERIMENTS_PREFIX + '[table filter changed]', diff --git a/src/app/webapp-common/experiments/common-experiments.module.ts b/src/app/webapp-common/experiments/common-experiments.module.ts index 60d9c853..a2703492 100644 --- a/src/app/webapp-common/experiments/common-experiments.module.ts +++ b/src/app/webapp-common/experiments/common-experiments.module.ts @@ -17,7 +17,6 @@ import {ExperimentExecutionParametersComponent} from './dumb/experiment-executio import {ExperimentOutputPlotsComponent} from './containers/experiment-output-plots/experiment-output-plots.component'; import {ExperimentOutputScalarsComponent} from './containers/experiment-output-scalars/experiment-output-scalars.component'; import {ModelAutoPopulateDialogComponent} from './dumb/model-auto-populate-dialog/model-auto-populate-dialog.component'; -import {ExperimentTableCardComponent} from './dumb/experiment-table-card/experiment-table-card.component'; import {SMSharedModule} from '../shared/shared.module'; import {CommonLayoutModule} from '../layout/layout.module'; import {ExperimentSharedModule} from '~/features/experiments/shared/experiment-shared.module'; @@ -78,7 +77,6 @@ import { GetVariantWithoutRoundPipe } from './dumb/experiments-table/hyper-param ExperimentOutputScalarsComponent, ModelAutoPopulateDialogComponent, ExperimentCustomColsMenuComponent, - ExperimentTableCardComponent, ExperimentInfoHyperParametersComponent, ExperimentInfoHyperParametersFormContainerComponent, ExperimentArtifactsNavbarComponent, @@ -119,7 +117,7 @@ import { GetVariantWithoutRoundPipe } from './dumb/experiments-table/hyper-param ExperimentOutputLogModule, MatRadioModule ], - providers: [ExperimentTableCardComponent, NoUnderscorePipe, TitleCasePipe] + providers: [NoUnderscorePipe, TitleCasePipe] }) export class ExperimentsCommonModule { } diff --git a/src/app/webapp-common/experiments/containers/experiment-ouptut/base-experiment-output.component.scss b/src/app/webapp-common/experiments/containers/experiment-ouptut/base-experiment-output.component.scss index de478f48..98771375 100644 --- a/src/app/webapp-common/experiments/containers/experiment-ouptut/base-experiment-output.component.scss +++ b/src/app/webapp-common/experiments/containers/experiment-ouptut/base-experiment-output.component.scss @@ -6,6 +6,9 @@ $output-tabs-height: 64px; :host { .experiment-output-container { height: 100%; + &.minimized{ + height: calc(100% - 32px); + } } ::ng-deep .no-output { @@ -25,63 +28,30 @@ $output-tabs-height: 64px; margin-bottom: 10px; } - sm-experiment-info-header { - display: block; - padding: 7px 0 0 10px; - border-bottom: 1px solid $blue-100; - } sm-experiment-settings.maximized { display: block; - height: 50px; padding-top: 6px; } - nav { - height: $output-tabs-height; - position: relative; - text-align: center; - border-bottom: 1px solid #efefef; - overflow: hidden; - padding: 0 24px; + .refresh-position { + position: absolute; + right: 28px; + top: 0px; + display: flex; + align-items: center; + } - .refresh-position { - position: absolute; - right: 16px; - top: 6px; - display: flex; - align-items: center; - } - .refreshIcon{ - margin-right: 10px; - } - - &.minimized{ - text-align: left; - - .refresh-position { - top: 12px; - } - } - span.disabled { - pointer-events: none; - } + .refreshIcon { + margin-right: 10px; } .output-body { position: relative; - height: calc(100% - #{$output-tabs-height + $experiment-info-header-height}); - + height: calc(100% - #{$output-tabs-height + $experiment-info-header-height + 36px}); &.minimized { - height: calc(100% - #{$output-tabs-height}); + height: calc(100% - #{$experiment-info-header-height + $experiment-info-tabs-height + 5px}); } } } -.mat-menu-item { - padding-left: 22px; - &.active { - border-left: 6px solid $purple; - padding-left: 16px; - } -} diff --git a/src/app/webapp-common/experiments/containers/experiment-ouptut/base-experiment-output.component.ts b/src/app/webapp-common/experiments/containers/experiment-ouptut/base-experiment-output.component.ts index 9b0b4540..9d950498 100644 --- a/src/app/webapp-common/experiments/containers/experiment-ouptut/base-experiment-output.component.ts +++ b/src/app/webapp-common/experiments/containers/experiment-ouptut/base-experiment-output.component.ts @@ -1,6 +1,6 @@ import {Component, OnDestroy, OnInit} from '@angular/core'; import {selectRouterConfig, selectRouterParams} from '@common/core/reducers/router-reducer'; -import {get, getOr} from 'lodash/fp'; +import {get} from 'lodash/fp'; import {select, Store} from '@ngrx/store'; import {Observable, Subscription} from 'rxjs'; import {ActivatedRoute, Router} from '@angular/router'; @@ -18,10 +18,12 @@ import * as infoActions from '../../actions/common-experiments-info.actions'; import {selectAppVisible, selectBackdropActive} from '@common/core/reducers/view.reducer'; import {addMessage, setAutoRefresh} from '@common/core/actions/layout.actions'; import {MESSAGES_SEVERITY} from '~/app.constants'; -import {selectIsExperimentInEditMode, selectSelectedExperiments} from '../../reducers'; +import {selectIsExperimentInEditMode, selectSelectedExperiments, selectSplitSize} from '../../reducers'; import {isReadOnly} from '@common/shared/utils/shared-utils'; import {ExperimentDetailsUpdated} from '../../actions/common-experiments-info.actions'; import {RefreshService} from '@common/core/services/refresh.service'; +import { isDevelopment } from '~/features/experiments/shared/experiments.utils'; +import * as experimentsActions from '../../actions/common-experiments-view.actions'; @Component({ selector: 'sm-base-experiment-output', @@ -43,6 +45,10 @@ export abstract class BaseExperimentOutputComponent implements OnInit, OnDestroy private isAppVisible$: Observable; isSharedAndNotOwner$: Observable; public isExample: boolean; + public isDevelopment: boolean; + private toMaximize = false; + public selectSplitSize$: Observable; + constructor( private store: Store, @@ -55,12 +61,14 @@ export abstract class BaseExperimentOutputComponent implements OnInit, OnDestroy this.isExperimentInEditMode$ = this.store.select(selectIsExperimentInEditMode); this.isAppVisible$ = this.store.select(selectAppVisible); this.backdropActive$ = this.store.select(selectBackdropActive); + this.selectSplitSize$ = this.store.select(selectSplitSize); + } ngOnInit() { - this.minimized = getOr(false, 'data.minimized', this.route.snapshot.routeConfig); this.subs.add(this.store.select(selectRouterConfig).subscribe(routerConfig => { + this.minimized = !routerConfig.includes('output'); this.routerConfig = routerConfig; })); @@ -75,6 +83,7 @@ export abstract class BaseExperimentOutputComponent implements OnInit, OnDestroy ).subscribe(([experimentId, selectedExperiments]) => { this.selectedExperiment = selectedExperiments.find(experiment => experiment.id === experimentId); this.isExample = isReadOnly( this.selectedExperiment); + this.isDevelopment = isDevelopment(this.selectedExperiment); this.store.dispatch(new ResetExperimentMetrics()); this.store.dispatch(new infoActions.ResetExperimentInfo()); this.store.dispatch(new infoActions.GetExperimentInfo(experimentId)); @@ -99,6 +108,7 @@ export abstract class BaseExperimentOutputComponent implements OnInit, OnDestroy .subscribe(experiment => { this.selectedExperiment = experiment; this.isExample = isReadOnly( this.selectedExperiment); + this.isDevelopment = isDevelopment(this.selectedExperiment); }) ); } @@ -132,4 +142,22 @@ export abstract class BaseExperimentOutputComponent implements OnInit, OnDestroy this.store.dispatch(addMessage(MESSAGES_SEVERITY.ERROR, 'Name must be more than three letters long')); } } + maximize() { + if (window.location.pathname.includes('info-output')) { + const resultsPath = this.route.firstChild?.firstChild?.routeConfig?.path || this.route.firstChild.routeConfig.path; + this.router.navigateByUrl(`projects/${this.projectId}/experiments/${this.experimentId}/output/${resultsPath}`); + } else { + const parts = this.router.url.split('/'); + parts.splice(5, 0, 'output'); + this.router.navigateByUrl(parts.join('/')); + } + this.toMaximize = true; + } + onActivate(e, scrollContainer) { + scrollContainer.scrollTop = 0; + } + closePanel() { + this.store.dispatch(experimentsActions.setTableMode({mode: 'table'})) + return this.router.navigate(['..'], {relativeTo: this.route, queryParamsHandling: 'merge'}); + } } diff --git a/src/app/webapp-common/experiments/containers/experiment-output-plots/experiment-output-plots.component.ts b/src/app/webapp-common/experiments/containers/experiment-output-plots/experiment-output-plots.component.ts index 0723cee7..83fd27f8 100644 --- a/src/app/webapp-common/experiments/containers/experiment-output-plots/experiment-output-plots.component.ts +++ b/src/app/webapp-common/experiments/containers/experiment-output-plots/experiment-output-plots.component.ts @@ -6,20 +6,21 @@ import { } from '../../reducers'; import {Observable, of, Subscription} from 'rxjs'; import {select, Store} from '@ngrx/store'; -import {SelectableListItem} from '../../../shared/ui-components/data/selectable-list/selectable-list.model'; +import {SelectableListItem} from '@common/shared/ui-components/data/selectable-list/selectable-list.model'; import {distinctUntilChanged, filter, map} from 'rxjs/operators'; -import {selectRouterParams} from '../../../core/reducers/router-reducer'; -import {scrollToElement} from '../../../shared/utils/shared-utils'; +import {selectRouterParams} from '@common/core/reducers/router-reducer'; +import {scrollToElement} from '@common/shared/utils/shared-utils'; import {ActivatedRoute, Router} from '@angular/router'; -import {IExperimentInfoState} from '../../../../features/experiments/reducers/experiment-info.reducer'; +import {IExperimentInfoState} from '~/features/experiments/reducers/experiment-info.reducer'; import { experimentPlotsRequested, ResetExperimentMetrics, SetExperimentMetricsSearchTerm, SetExperimentSettings } from '../../actions/common-experiment-output.actions'; -import {convertPlots, groupIterations, sortMetricsList} from '../../../tasks/tasks.utils'; -import {selectSelectedExperiment} from '../../../../features/experiments/reducers'; +import {convertPlots, groupIterations, sortMetricsList} from '@common/tasks/tasks.utils'; +import {selectSelectedExperiment} from '~/features/experiments/reducers'; import {ExtFrame} from '@common/shared/experiment-graphs/single-graph/plotly-graph-base'; -import {MetricsPlotEvent} from '../../../../business-logic/model/events/metricsPlotEvent'; +import {MetricsPlotEvent} from '~/business-logic/model/events/metricsPlotEvent'; +import {addMessage} from '@common/core/actions/layout.actions'; @Component({ selector: 'sm-experiment-output-plots', @@ -84,7 +85,9 @@ export class ExperimentOutputPlotsComponent implements OnInit, OnDestroy { this.refreshDisabled = false; const groupedPlots = groupIterations(metricsPlots); this.plotsList = this.preparePlotsList(groupedPlots); - this.graphs = convertPlots({plots: groupedPlots, experimentId: this.experimentId}); + const {graphs, parsingError} = convertPlots({plots: groupedPlots, experimentId: this.experimentId}); + this.graphs = graphs; + parsingError && this.store.dispatch(addMessage('warn', `Couldn't read all plots. Please make sure all plots are properly formatted (NaN & Inf aren't supported).`, [], true)) this.changeDetection.detectChanges(); }); diff --git a/src/app/webapp-common/experiments/containers/experiment-output-scalars/experiment-output-scalars.component.html b/src/app/webapp-common/experiments/containers/experiment-output-scalars/experiment-output-scalars.component.html index 7068e82e..51185b19 100644 --- a/src/app/webapp-common/experiments/containers/experiment-output-scalars/experiment-output-scalars.component.html +++ b/src/app/webapp-common/experiments/containers/experiment-output-scalars/experiment-output-scalars.component.html @@ -48,7 +48,7 @@ smTooltip="Toggle Graphs" matTooltipPosition="above" > - +
Object.keys(metricsScalar || []).reduce((acc, curr) => { @@ -129,8 +130,8 @@ export class ExperimentOutputScalarsComponent implements OnInit, OnDestroy { ngOnInit() { this.minimized = this.activeRoute.snapshot.routeConfig.data.minimized; - this.listOfHidden = this.store.pipe(select(selectSelectedSettingsHiddenScalar)) - .pipe(distinctUntilChanged()); + this.listOfHidden = this.store.select(selectSelectedSettingsHiddenScalar) + .pipe(distinctUntilChanged(isEqual)); this.subs.add(this.store.select(selectSelectedExperiment) .pipe( diff --git a/src/app/webapp-common/experiments/dumb/experiment-execution-source-code/experiment-execution-source-code.component.html b/src/app/webapp-common/experiments/dumb/experiment-execution-source-code/experiment-execution-source-code.component.html index f9b36861..c950f3d7 100644 --- a/src/app/webapp-common/experiments/dumb/experiment-execution-source-code/experiment-execution-source-code.component.html +++ b/src/app/webapp-common/experiments/dumb/experiment-execution-source-code/experiment-execution-source-code.component.html @@ -16,7 +16,8 @@ {{formData?.branch ? 'Latest in branch ' + formData?.branch : '' }}
- {{formData?.version_num ? 'Tag ' + formData?.tag + ' (commit id ' + formData?.version_num + ')' : 'Tag ' + formData?.tag }} + {{formData?.tag}} (commit id {{formData?.version_num}}) + {{formData?.tag}}
@@ -36,7 +37,7 @@ name="version_num" (blur)="resetOtherScriptParameters(sourceTypesEnum.VersionNum)" [ngModel]="formData?.version_num" - [required]="(!!formData?.repository) && scriptType.value == sourceTypesEnum.VersionNum" + [required]="(!!formData?.repository) && scriptType.value === sourceTypesEnum.VersionNum" [placeholder]="scriptPlaceHolders[sourceTypesEnum.VersionNum]"> @@ -47,7 +48,7 @@ name="branch" (blur)="resetOtherScriptParameters(sourceTypesEnum.Branch)" [ngModel]="formData?.branch" - [required]="(!!formData?.repository) && scriptType.value == sourceTypesEnum.Branch" + [required]="(!!formData?.repository) && scriptType.value === sourceTypesEnum.Branch" [placeholder]="scriptPlaceHolders[sourceTypesEnum.Branch]"> @@ -58,7 +59,7 @@ name="tag" (blur)="resetOtherScriptParameters(sourceTypesEnum.Tag)" [ngModel]="formData?.tag" - [required]="(!!formData?.repository) && scriptType.value == sourceTypesEnum.Tag" + [required]="(!!formData?.repository) && scriptType.value === sourceTypesEnum.Tag" [placeholder]="scriptPlaceHolders[sourceTypesEnum.Tag]"> diff --git a/src/app/webapp-common/experiments/dumb/experiment-general-info/experiment-general-info.component.html b/src/app/webapp-common/experiments/dumb/experiment-general-info/experiment-general-info.component.html index 032eaa82..8caac3e8 100644 --- a/src/app/webapp-common/experiments/dumb/experiment-general-info/experiment-general-info.component.html +++ b/src/app/webapp-common/experiments/dumb/experiment-general-info/experiment-general-info.component.html @@ -91,6 +91,11 @@ {{experiment?.project?.name | NA}} + + + {{experiment?.id | NA}} + + {{runtimeItem.value}} diff --git a/src/app/webapp-common/experiments/dumb/experiment-info-header/experiment-info-header.component.html b/src/app/webapp-common/experiments/dumb/experiment-info-header/experiment-info-header.component.html index 0915bfa5..44fcde7e 100644 --- a/src/app/webapp-common/experiments/dumb/experiment-info-header/experiment-info-header.component.html +++ b/src/app/webapp-common/experiments/dumb/experiment-info-header/experiment-info-header.component.html @@ -1,28 +1,27 @@ -
- - -
-
- -
- {{experiment?.name}} -
-
- -
- +
+
+ + + +
+ {{experiment?.name}} +
+
+
+
+
+ - - - - - - - {{experiment.id}} -
{{getStatusLabel()}}
+ + + + +
+
-
- {{ experiment?.type | noUnderscore | titlecase }} - - - - - - - -
-
-
- - +
+ +
+ +
+
+
+
+
+ + + + + + +
diff --git a/src/app/webapp-common/experiments/dumb/experiment-info-header/experiment-info-header.component.scss b/src/app/webapp-common/experiments/dumb/experiment-info-header/experiment-info-header.component.scss index aee56b4d..ee5e5f9f 100644 --- a/src/app/webapp-common/experiments/dumb/experiment-info-header/experiment-info-header.component.scss +++ b/src/app/webapp-common/experiments/dumb/experiment-info-header/experiment-info-header.component.scss @@ -3,19 +3,34 @@ :host { display: block; position: relative; - height: $experiment-info-header-height; + padding: 0 24px; + .tags{ + grid-area: tags; + overflow: hidden; + } + .line-item{ + margin-right: 21px; + height: 24px; + &:last-child{ + margin-right: 6px; + margin-left: 10px; + } + } .experiment-icon { - margin: 0px 20px 0 5px; + margin: 0 20px 0 0; } .comment { height: 24px; - margin: 0 12px 0 24px; } .middle-col { + height: 28px; flex-grow: 1; + display: flex; + align-items: center; overflow: hidden; + padding-left: 60px; } .experiment-name { @@ -42,11 +57,15 @@ .experiment-id { margin-right: 6px; } - - .edit-name { - max-width: 80%; + .experiment-name-cont{ + max-width: calc(100% - 220px); + .edit-name { + overflow: hidden; + } } + + .menu-button, .menu-button &:hover, .menu-button &:focus { cursor: pointer; font-weight: bold; diff --git a/src/app/webapp-common/experiments/dumb/experiment-info-header/experiment-info-header.component.ts b/src/app/webapp-common/experiments/dumb/experiment-info-header/experiment-info-header.component.ts index c14dba6a..7a4e3bec 100644 --- a/src/app/webapp-common/experiments/dumb/experiment-info-header/experiment-info-header.component.ts +++ b/src/app/webapp-common/experiments/dumb/experiment-info-header/experiment-info-header.component.ts @@ -26,6 +26,7 @@ import { selectionDisabledReset, selectionDisabledViewWorker } from '@common/shared/entity-page/items.utils'; +import {addMessage} from '../../../core/actions/layout.actions'; @Component({ selector: 'sm-experiment-info-header', @@ -51,10 +52,12 @@ export class ExperimentInfoHeaderComponent implements OnDestroy { @Input() infoData; @Input() backdropActive = false; @Input() showMenu: boolean; - @Input() showMinimize: boolean; + @Input() minimized: boolean; @Input() isSharedAndNotOwner: boolean; @Output() experimentNameChanged = new EventEmitter(); @Output() minimizeClicked = new EventEmitter(); + @Output() closeInfoClicked = new EventEmitter(); + @Output() maximizedClicked = new EventEmitter(); @ViewChild('tagMenu') tagMenu: MenuComponent; @ViewChild('tagsMenuContent') tagMenuContent: TagsMenuComponent; @@ -150,4 +153,7 @@ export class ExperimentInfoHeaderComponent implements OnDestroy { this.store.dispatch(new ActivateEdit(EXPERIMENT_COMMENT)); } + copyToClipboard() { + this.store.dispatch(addMessage('success', 'Copied to clipboard')); + } } diff --git a/src/app/webapp-common/experiments/dumb/experiment-table-card/experiment-table-card.component.html b/src/app/webapp-common/experiments/dumb/experiment-table-card/experiment-table-card.component.html deleted file mode 100644 index 8a45c884..00000000 --- a/src/app/webapp-common/experiments/dumb/experiment-table-card/experiment-table-card.component.html +++ /dev/null @@ -1,25 +0,0 @@ -
-
- -
-
-
-
- {{experiment.name}} -
- - -
-
- {{experiment?.user?.name}} -
-
-
- {{experiment.created | date : TIME_FORMAT_STRING}} -
-
- {{experiment.completed | date : TIME_FORMAT_STRING}} {{experimentDuration(experiment.created, experiment.completed) | msToHours}} -
-
-
-
diff --git a/src/app/webapp-common/experiments/dumb/experiment-table-card/experiment-table-card.component.scss b/src/app/webapp-common/experiments/dumb/experiment-table-card/experiment-table-card.component.scss deleted file mode 100644 index 82f76e1b..00000000 --- a/src/app/webapp-common/experiments/dumb/experiment-table-card/experiment-table-card.component.scss +++ /dev/null @@ -1,12 +0,0 @@ -@import "../../../shared/ui-components/styles/variables"; - -.content-row { - padding: 5px; - color: #ced1db; - .name { - font-weight: bold; - color: $faint-gray; - max-width: 62%; - } - -} diff --git a/src/app/webapp-common/experiments/dumb/experiment-table-card/experiment-table-card.component.ts b/src/app/webapp-common/experiments/dumb/experiment-table-card/experiment-table-card.component.ts deleted file mode 100644 index 0a54417d..00000000 --- a/src/app/webapp-common/experiments/dumb/experiment-table-card/experiment-table-card.component.ts +++ /dev/null @@ -1,29 +0,0 @@ -import {Component, Input, OnInit} from '@angular/core'; -import {ITask} from '../../../../business-logic/model/al-task'; -import {TIME_FORMAT_STRING} from '../../../constants'; - -@Component({ - selector : 'sm-experiment-table-card', - templateUrl: './experiment-table-card.component.html', - styleUrls : ['./experiment-table-card.component.scss'] -}) -export class ExperimentTableCardComponent implements OnInit { - @Input() experiment: ITask; - TIME_FORMAT_STRING = TIME_FORMAT_STRING; - - constructor() { - } - - ngOnInit() { - } - - experimentDuration(created, completed) { - - const createdDate = new Date(created).getTime(); - const completedDate = new Date(completed).getTime(); - - return completed ? (completedDate - createdDate) : ''; - } - - -} diff --git a/src/app/webapp-common/experiments/dumb/experiment-type-icon-label/experiment-type-icon-label.component.ts b/src/app/webapp-common/experiments/dumb/experiment-type-icon-label/experiment-type-icon-label.component.ts index bcf44ccc..0175d836 100644 --- a/src/app/webapp-common/experiments/dumb/experiment-type-icon-label/experiment-type-icon-label.component.ts +++ b/src/app/webapp-common/experiments/dumb/experiment-type-icon-label/experiment-type-icon-label.component.ts @@ -1,4 +1,4 @@ -import {Component, Input, OnInit} from '@angular/core'; +import {Component, Input} from '@angular/core'; import {TaskTypeEnum} from '../../../../business-logic/model/tasks/taskTypeEnum'; @@ -7,13 +7,9 @@ import {TaskTypeEnum} from '../../../../business-logic/model/tasks/taskTypeEnum' templateUrl: './experiment-type-icon-label.component.html', styleUrls: ['./experiment-type-icon-label.component.scss'] }) -export class ExperimentTypeIconLabelComponent implements OnInit { +export class ExperimentTypeIconLabelComponent{ @Input() type: TaskTypeEnum; @Input() iconClass = 'md'; @Input() showLabel = true; constructor() { } - - ngOnInit() { - } - } diff --git a/src/app/webapp-common/experiments/dumb/experiments-table/experiments-table.component.html b/src/app/webapp-common/experiments/dumb/experiments-table/experiments-table.component.html index f2731463..3297d8bc 100644 --- a/src/app/webapp-common/experiments/dumb/experiments-table/experiments-table.component.html +++ b/src/app/webapp-common/experiments/dumb/experiments-table/experiments-table.component.html @@ -147,7 +147,10 @@ - +
- + diff --git a/src/app/webapp-common/experiments/dumb/experiments-table/experiments-table.component.scss b/src/app/webapp-common/experiments/dumb/experiments-table/experiments-table.component.scss index 50b2a985..14f972fb 100644 --- a/src/app/webapp-common/experiments/dumb/experiments-table/experiments-table.component.scss +++ b/src/app/webapp-common/experiments/dumb/experiments-table/experiments-table.component.scss @@ -49,7 +49,7 @@ } &.header.minimised { - padding-left: 24px; + padding-left: 33px; } } @@ -90,3 +90,7 @@ sm-table-card-filter-template { color: $blue-500; padding: 0 6px; } + +sm-experiment-status-icon-label { + min-width: 90px; +} diff --git a/src/app/webapp-common/experiments/effects/common-experiments-menu.effects.ts b/src/app/webapp-common/experiments/effects/common-experiments-menu.effects.ts index de9c3b2f..f0b29c8b 100644 --- a/src/app/webapp-common/experiments/effects/common-experiments-menu.effects.ts +++ b/src/app/webapp-common/experiments/effects/common-experiments-menu.effects.ts @@ -15,7 +15,7 @@ import {requestFailed} from '../../core/actions/http.actions'; import {IExperimentInfoState} from '~/features/experiments/reducers/experiment-info.reducer'; import {ExperimentConverterService} from '~/features/experiments/shared/services/experiment-converter.service'; import * as exSelectors from '../reducers'; -import {selectSelectedExperiments} from '../reducers'; +import {selectSelectedExperiments, selectTableMode} from '../reducers'; import {selectSelectedExperiment} from '~/features/experiments/reducers'; import * as infoActions from '../actions/common-experiments-info.actions'; import {AutoRefreshExperimentInfo, ExperimentDetailsUpdated} from '../actions/common-experiments-info.actions'; @@ -94,7 +94,7 @@ export class CommonExperimentsMenuEffects { withLatestFrom(this.store.select(selectSelectedExperiment)), switchMap(([action, selectedEntity]: [ReturnType, IExperimentInfo]) => { const ids = action.selectedEntities.map(exp => exp.id); - return this.apiTasks.tasksEnqueueMany({ids, queue: action.queue.id, validate_tasks: true}) + return this.apiTasks.tasksEnqueueMany({ids, queue: action.queue.id, ...((!action.queue.id) && {queue_name: action.queue.name}) ,validate_tasks: true}) .pipe( mergeMap(res => this.updateExperimentsSuccess(action, MenuItems.enqueue, ids, selectedEntity, res)), catchError(error => this.updateExperimentFailed(action.type, error)) @@ -170,7 +170,8 @@ export class CommonExperimentsMenuEffects { cloneExperimentRequested$ = createEffect(() => this.actions$.pipe( ofType(menuActions.CLONE_EXPERIMENT_CLICKED), - switchMap(action => this.apiTasks.tasksClone({ + withLatestFrom(this.store.select(selectTableMode)), + switchMap(([action, tableMode]) => this.apiTasks.tasksClone({ task: action.payload.originExperiment.id, new_task_project: action.payload.cloneData.project, new_task_comment: action.payload.cloneData.comment, @@ -180,13 +181,15 @@ export class CommonExperimentsMenuEffects { .pipe( mergeMap(res => [ viewActions.getExperiments(), - viewActions.setSelectedExperiments({experiments: []}), - deactivateLoader(action.type), - ...action.payload.cloneData.newProjectName ? [getAllSystemProjects()] : [], - viewActions.experimentSelectionChanged({ + viewActions.setSelectedExperiments({experiments: (tableMode ==='info' ? [] : + [{id: res?.id} + ])}), + ...(tableMode === 'info') ? [viewActions.experimentSelectionChanged({ experiment: {id: res.id}, project: action.payload.cloneData.project ? action.payload.cloneData.project : res?.new_project?.id - }), + })] : [], + deactivateLoader(action.type), + ...action.payload.cloneData.newProjectName ? [getAllSystemProjects()] : [], ]), catchError(error => [ deactivateLoader(action.type), @@ -278,7 +281,7 @@ export class CommonExperimentsMenuEffects { deactivateLoader(action.type), viewActions.getExperiments() ]), - catchError(error => [requestFailed(error), deactivateLoader(action.type)]) + catchError(error => [requestFailed(error), deactivateLoader(action.type), setServerError(error, null, 'Failed to move experiments')]) ) ) )); @@ -357,13 +360,7 @@ export class CommonExperimentsMenuEffects { this.store.select(exSelectors.selectSelectedTableExperiment), this.store.select(selectRouterConfig), ), - tap(([action, routerParams, selectedExperiment, routeConfig]) => { - if (this.isSelectedExpInCheckedExps(action.selectedEntities, selectedExperiment)) { - const module = routeConfig.includes('pipelines')? 'pipelines': 'projects' - this.router.navigate([`${module}/${routerParams.projectId}/experiments/`]); - } - }), - switchMap(([action, routerParams]) => this.apiTasks.tasksArchiveMany({ids: action.selectedEntities.map(exp => exp.id)}) + switchMap(([action, routerParams, selectedExperiment]) => this.apiTasks.tasksArchiveMany({ids: action.selectedEntities.map(exp => exp.id)}) .pipe( withLatestFrom(this.store.select(selectRouterConfig)), mergeMap(([res, routerConfig]: [TasksArchiveManyResponse, RouterState['config']]) => { @@ -400,6 +397,9 @@ export class CommonExperimentsMenuEffects { changes: {system_tags: [...experiments[0]?.system_tags.filter(t => t !== 'shared'), 'archived'].sort()} })); } + if (this.isSelectedExpInCheckedExps(action.selectedEntities, selectedExperiment)) { + actions.push(viewActions.selectNextExperiment()); + } return actions; }), catchError(error => [ diff --git a/src/app/webapp-common/experiments/effects/common-experiments-view.effects.ts b/src/app/webapp-common/experiments/effects/common-experiments-view.effects.ts index b75897cc..0cc45713 100644 --- a/src/app/webapp-common/experiments/effects/common-experiments-view.effects.ts +++ b/src/app/webapp-common/experiments/effects/common-experiments-view.effects.ts @@ -2,7 +2,7 @@ import {Injectable} from '@angular/core'; import {ActivatedRoute, Router} from '@angular/router'; import {Actions, createEffect, ofType} from '@ngrx/effects'; import {Action, Store} from '@ngrx/store'; -import {cloneDeep, flatten, get, getOr, isEqual, uniq} from 'lodash/fp'; +import {cloneDeep, flatten, get, getOr, isEqual} from 'lodash/fp'; import {EMPTY, Observable, of} from 'rxjs'; import { auditTime, @@ -46,11 +46,10 @@ import * as exSelectors from '../reducers/index'; import {ITableExperiment} from '../shared/common-experiment-model.model'; import {EXPERIMENTS_PAGE_SIZE} from '../shared/common-experiments.const'; import {convertDurationFilter, convertStopToComplete} from '../shared/common-experiments.utils'; -import {ApiUsersService} from '~/business-logic/api-services/users.service'; import {sortByField} from '../../tasks/tasks.utils'; import {MODEL_TAGS} from '../../models/shared/models.const'; import {EmptyAction, MESSAGES_SEVERITY} from '~/app.constants'; -import {selectExperimentsList, selectExperimentsUsers, selectTableFilters} from '../reducers'; +import {selectExperimentsList, selectTableFilters, selectTableMode} from '../reducers'; import {ProjectsGetTaskParentsResponse} from '~/business-logic/model/projects/projectsGetTaskParentsResponse'; import {ProjectsGetTaskParentsRequest} from '~/business-logic/model/projects/projectsGetTaskParentsRequest'; import {ICommonSearchState} from '../../common-search/common-search.reducer'; @@ -87,25 +86,26 @@ import { compareAddTableFilterInit } from '../../experiments-compare/actions/compare-header.actions'; import {TaskTypeEnum} from '~/business-logic/model/tasks/taskTypeEnum'; +import {getFilteredUsers, setProjectUsers} from '@common/core/actions/projects.actions'; @Injectable() export class CommonExperimentsViewEffects { /* eslint-disable @typescript-eslint/naming-convention */ constructor( - private actions$: Actions, private store: Store, - private apiTasks: ApiTasksService, private projectsApi: ApiProjectsService, private usersApi: ApiUsersService, - private taskBl: BlTasksService, private router: Router, private route: ActivatedRoute + private actions$: Actions, private store: Store, private apiTasks: ApiTasksService, + private projectsApi: ApiProjectsService, private taskBl: BlTasksService, private router: Router, + private route: ActivatedRoute ) { } activeLoader = createEffect(() => this.actions$.pipe( ofType( - exActions.getNextExperiments, exActions.getExperiments, exActions.globalFilterChanged, compareAddDialogTableSortChanged, compareAddTableFilterChanged, compareAddTableFilterInit, + exActions.getNextExperiments, exActions.getExperiments, exActions.globalFilterChanged, compareAddDialogTableSortChanged, compareAddTableFilterChanged, compareAddTableClearAllFilters, exActions.selectAllExperiments ), filter((action) => !(action as ReturnType).hideLoader), - map(() => activeLoader('EXPERIMENTS_LIST')) + map(action => activeLoader(action.type)) )); tableSortChange = createEffect(() => this.actions$.pipe( @@ -121,16 +121,20 @@ export class CommonExperimentsViewEffects { ofType(exActions.tableFilterChanged), withLatestFrom(this.store.select(exSelectors.selectTableFilters)), switchMap(([action, oldFilters]) => - [setURLParams({filters: { + [setURLParams({ + filters: { ...oldFilters, ...action.filters.reduce((acc, updatedFilter) => { acc[updatedFilter.col] = {value: updatedFilter.value, matchMode: updatedFilter.filterMatchMode}; return acc; - }, {} as {[col: string]: FilterMetadata}) - }, update: true})] + }, {} as { [col: string]: FilterMetadata }) + }, update: true + })] ) )); + private refreshActions = []; + reFetchExperiment = createEffect(() => this.actions$.pipe( ofType( exActions.getExperiments, exActions.getExperimentsWithPageSize, exActions.globalFilterChanged, exActions.setTableSort, @@ -138,21 +142,24 @@ export class CommonExperimentsViewEffects { exActions.tableFilterChanged, exActions.setTableFilters, exActions.showOnlySelected ), + tap(action => this.refreshActions.push(action.type)), auditTime(50), switchMap((action) => this.fetchExperiments$(null, false, (action as any).pageSize as number) .pipe( mergeMap(res => { res.tasks = convertStopToComplete(res.tasks); + const deactivate = this.refreshActions.map(a => deactivateLoader(a)); + this.refreshActions = []; return [ exActions.setNoMoreExperiments({payload: (res.tasks.length < EXPERIMENTS_PAGE_SIZE)}), exActions.setExperiments({experiments: res.tasks as ITableExperiment[]}), exActions.setCurrentScrollId({scrollId: res.scroll_id}), - deactivateLoader('EXPERIMENTS_LIST') + ...deactivate ]; }), catchError(error => [ requestFailed(error), - deactivateLoader('EXPERIMENTS_LIST'), + deactivateLoader(action.type), setServerError(error, null, 'Fetch Experiments failed', getOr(false, 'payload.autoRefresh', action)) ]) ) @@ -170,7 +177,7 @@ export class CommonExperimentsViewEffects { .pipe( mergeMap(res => { res.tasks = convertStopToComplete(res.tasks); - const actions: Action[] = [deactivateLoader('EXPERIMENTS_LIST')]; + const actions: Action[] = [deactivateLoader(action.type)]; if (selectedExperiment && action.autoRefresh && isEqual(experiments.map(exp => exp.id).sort(), res.tasks.map(exp => exp.id).sort())) { actions.push(exActions.setExperimentInPlace({experiments: res.tasks as ITableExperiment[]})); } else { @@ -189,7 +196,7 @@ export class CommonExperimentsViewEffects { }), catchError(error => [ requestFailed(error), - deactivateLoader('EXPERIMENTS_LIST'), + deactivateLoader(action.type), setServerError(error, null, 'Fetch Experiments failed', action.autoRefresh) ]) ) @@ -202,7 +209,7 @@ export class CommonExperimentsViewEffects { this.store.select(exSelectors.selectCurrentScrollId), this.store.select(selectExperimentsList) ), - switchMap(([, scrollId, tasks]) => this.fetchExperiments$(scrollId) + switchMap(([action, scrollId, tasks]) => this.fetchExperiments$(scrollId) .pipe( mergeMap(res => { res.tasks = convertStopToComplete(res.tasks); @@ -214,11 +221,11 @@ export class CommonExperimentsViewEffects { exActions.setNoMoreExperiments({payload: (res.tasks.length < EXPERIMENTS_PAGE_SIZE)}), ...addTasksAction, exActions.setCurrentScrollId({scrollId: res.scroll_id}), - deactivateLoader('EXPERIMENTS_LIST'), + deactivateLoader(action.type), ]; }), catchError(error => [ - requestFailed(error), deactivateLoader('EXPERIMENTS_LIST'), setServerError(error, null, 'Fetch Experiments failed')]) + requestFailed(error), deactivateLoader(action.type), setServerError(error, null, 'Fetch Experiments failed')]) ) ) )); @@ -231,6 +238,18 @@ export class CommonExperimentsViewEffects { // map(action => new exActions.SetSelectedExperiment(action.payload.experiment)) )); + selectNextExperimentEffect = createEffect(() => this.actions$.pipe( + ofType(exActions.selectNextExperiment), + withLatestFrom(this.store.select(selectRouterConfig), + this.store.select(selectExperimentsList), + this.store.select(selectRouterParams).pipe(map(params => get('projectId', params))), + this.store.select(selectTableMode) + ), + filter(([action, routeConfig, tasks, projectId, tableMode]) => tableMode === 'info'), + tap(([action, routeConfig, tasks, projectId]) => this.navigateAfterExperimentSelectionChanged(tasks[0] as ITableExperiment, projectId, routeConfig)), + mergeMap(() => [exActions.setTableMode({mode: 'info'})]) + )); + getTypesEffect = createEffect(() => this.actions$.pipe( ofType(exActions.getProjectTypes), @@ -263,50 +282,19 @@ export class CommonExperimentsViewEffects { ) )))); - getFilteredUsersEffect = createEffect(() => this.actions$.pipe( - ofType(exActions.getFilteredUsers), - withLatestFrom(this.store.select(selectExperimentsUsers), this.store.select(selectTableFilters)), - switchMap(([action, users, filters]) => this.usersApi.usersGetAllEx({ - order_by: ['name'], - only_fields: ['name'], - id: getOr([], ['user.name', 'value'], filters) - }, null, 'body', true).pipe( - mergeMap(res => [ - exActions.setUsers({users: uniq(res.users.concat(users))}), - deactivateLoader(action.type) - ]), - catchError(error => [ - requestFailed(error), - deactivateLoader(action.type), - setServerError(error, null, 'Fetch users failed')] - ) - )) - )); - getUsersEffect = createEffect(() => this.actions$.pipe( - ofType(exActions.getUsers), - withLatestFrom( - this.store.select(selectRouterParams).pipe(map(params => get('projectId', params))), - this.store.select(selectTableFilters)), - switchMap(([, projectId, filters]) => this.usersApi.usersGetAllEx({ - order_by: ['name'], - only_fields: ['name'], - active_in_projects: projectId !== '*' ? [projectId] : [] - }, null, 'body', true).pipe( - mergeMap(res => { - const userFiltersValue = get([EXPERIMENTS_TABLE_COL_FIELDS.USER, 'value'], filters) || []; - const resIds = res.users.map(user => user.id); - const shouldGetFilteredUsersNames = !(userFiltersValue.every(id => resIds.includes(id))); - return [ - exActions.setUsers(res), - shouldGetFilteredUsersNames ? exActions.getFilteredUsers() : new EmptyAction(), - ]; - }), - catchError(error => [ - requestFailed(error), - setServerError(error, null, 'Fetch users failed')] - ) - )) + ofType(setProjectUsers), + withLatestFrom(this.store.select(selectTableFilters)), + map(([action, filters]) => { + const userFiltersValue = get([EXPERIMENTS_TABLE_COL_FIELDS.USER, 'value'], filters) || []; + const resIds = action.users.map(user => user.id); + const shouldGetFilteredUsersNames = !(userFiltersValue.every(id => resIds.includes(id))); + return shouldGetFilteredUsersNames ? getFilteredUsers({filteredUsers: userFiltersValue}) : new EmptyAction(); + }), + catchError(error => [ + requestFailed(error), + setServerError(error, null, 'Fetch users failed')] + ) )); getParentsEffect = createEffect(() => this.actions$.pipe( @@ -421,21 +409,32 @@ export class CommonExperimentsViewEffects { this.store.select(selectIsPipelines), ), switchMap(([action, projectId, archived, globalSearch, tableFilters, deep, showHidden, isPipeline]) => { - const pageSize = 1000; + const pageSize = 5000; const query = this.getGetAllQuery({ - projectId, searchQuery: globalSearch, archived, tableFilters: action.filtered ? tableFilters : {}, - deep, showHidden, pageSize, isPipeline}); + projectId, + searchQuery: globalSearch, + archived, + tableFilters: action.filtered ? tableFilters : {}, + orderFields: [{order: -1, field: EXPERIMENTS_TABLE_COL_FIELDS.LAST_UPDATE}], + deep, + showHidden, + pageSize, + isPipeline + }); query.only_fields = [EXPERIMENTS_TABLE_COL_FIELDS.NAME, EXPERIMENTS_TABLE_COL_FIELDS.PARENT, EXPERIMENTS_TABLE_COL_FIELDS.STATUS, EXPERIMENTS_TABLE_COL_FIELDS.TYPE, 'company.id', 'system_tags']; return this.apiTasks.tasksGetAllEx(query).pipe( - expand((res: TasksGetAllExResponse) => res.tasks.length === pageSize ? this.apiTasks.tasksGetAllEx({...query, scroll_id: res.scroll_id}): EMPTY), + expand((res: TasksGetAllExResponse) => res.tasks.length === pageSize ? this.apiTasks.tasksGetAllEx({ + ...query, + scroll_id: res.scroll_id + }) : EMPTY), reduce((acc, res) => acc.concat(res.tasks), []) ); }), - switchMap(experiments => [exActions.setSelectedExperiments({experiments}), deactivateLoader('EXPERIMENTS_LIST')]), + switchMap(experiments => [exActions.setSelectedExperiments({experiments}), deactivateLoader(exActions.selectAllExperiments.type)]), catchError(error => [ requestFailed(error), - deactivateLoader('EXPERIMENTS_LIST'), + deactivateLoader(exActions.selectAllExperiments.type), setServerError(error, null, 'Fetch experiments for selection failed'), ]) )); @@ -470,7 +469,7 @@ export class CommonExperimentsViewEffects { )); navigateAfterExperimentSelectionChanged(selectedExperiment: ITableExperiment, experimentProject: string, routeConfig: string[]) { - const module = routeConfig.includes('pipelines')? 'pipelines': 'projects' + const module = routeConfig.includes('pipelines') ? 'pipelines' : 'projects'; // wow angular really suck... const activeChild = get('firstChild.firstChild.firstChild.firstChild.firstChild.firstChild', this.route); const activeChildUrl = activeChild ? getRouteFullUrl(activeChild) : ''; @@ -482,9 +481,23 @@ export class CommonExperimentsViewEffects { this.router.navigate([module, experimentProject, 'experiments'], {queryParamsHandling: 'preserve'}); } - getGetAllQuery({refreshScroll = false, scrollId = null, projectId, searchQuery, archived, orderFields = [], - tableFilters, selectedIds = [], cols = [], metricCols = [], deep = false, showHidden = false, isCompare, - isPipeline = false, pageSize = EXPERIMENTS_PAGE_SIZE}: { + getGetAllQuery({ + refreshScroll = false, + scrollId = null, + projectId, + searchQuery, + archived, + orderFields = [], + tableFilters, + selectedIds = [], + cols = [], + metricCols = [], + deep = false, + showHidden = false, + isCompare, + isPipeline = false, + pageSize = EXPERIMENTS_PAGE_SIZE + }: { refreshScroll?: boolean; scrollId?: string; projectId: string; @@ -509,8 +522,8 @@ export class CommonExperimentsViewEffects { const tagsFilterAnd = tableFilters?.[EXPERIMENTS_TABLE_COL_FIELDS.TAGS]?.matchMode === 'AND'; const parentFilter = get([EXPERIMENTS_TABLE_COL_FIELDS.PARENT, 'value'], tableFilters); const systemTags = get(['system_tags', 'value'], tableFilters); - const systemTagsFilter = (archived ? [MODEL_TAGS.HIDDEN] : ['-' + MODEL_TAGS.HIDDEN]) - .concat(systemTags ? systemTags : []); + const systemTagsFilter = (archived ? ['__$and', MODEL_TAGS.HIDDEN] : ['__$and', '__$not', MODEL_TAGS.HIDDEN]) + .concat(systemTags ? systemTags : []).concat((isPipeline || showHidden) ? [] : ['__$not', 'pipeline']); let filters = createFiltersFromStore(tableFilters, true); filters = Object.keys(filters).reduce((acc, colId) => { @@ -523,7 +536,7 @@ export class CommonExperimentsViewEffects { return acc; }, {}); - if(filters[EXPERIMENTS_TABLE_COL_FIELDS.LAST_UPDATE]) { + if (filters[EXPERIMENTS_TABLE_COL_FIELDS.LAST_UPDATE]) { filters[EXPERIMENTS_TABLE_COL_FIELDS.LAST_UPDATE] = convertDurationFilter(filters[EXPERIMENTS_TABLE_COL_FIELDS.LAST_UPDATE]); } @@ -535,7 +548,8 @@ export class CommonExperimentsViewEffects { const colsFilters = flatten(cols.filter(col => col.id !== 'selected' && !col.hidden).map(col => col.getter || col.id)); const metricColsFilters = metricCols ? flatten(metricCols.map(col => col.getter || col.id)) : []; - const only_fields = [...new Set([...MINIMUM_ONLY_FIELDS, ...colsFilters, ...metricColsFilters].concat(isPipeline ? ['runtime._pipeline_hash', 'execution.queue', 'type', 'hyperparams.properties.version'] : []))]; + const only_fields = [...new Set([...MINIMUM_ONLY_FIELDS, ...colsFilters, ...metricColsFilters] + .concat(isPipeline ? ['runtime._pipeline_hash', 'execution.queue', 'type', 'hyperparams.properties.version'] : []))]; return { ...filters, id: selectedIds, @@ -545,7 +559,7 @@ export class CommonExperimentsViewEffects { fields: GET_ALL_QUERY_ANY_FIELDS } }), - project: ((!filters['project.name'] && (!projectId || projectId === '*'))) ? undefined : isCompare ? ((filters['project.name'] || undefined)): (filters['project.name'] || [projectId]), + project: ((!filters['project.name'] && (!projectId || projectId === '*'))) ? undefined : isCompare ? ((filters['project.name'] || undefined)) : (filters['project.name'] || [projectId]), scroll_id: scrollId || null, // null to create new scroll (undefined doesn't generate scroll) refresh_scroll: refreshScroll, size: pageSize, @@ -554,8 +568,8 @@ export class CommonExperimentsViewEffects { type: isPipeline ? [TaskTypeEnum.Controller] : (typeFilter?.length > 0) ? typeFilter : excludeTypes, user: (userFilter?.length > 0) ? userFilter : [], ...(parentFilter?.length > 0 && {parent: parentFilter}), - system_tags: (systemTagsFilter && systemTagsFilter.length > 0) ? systemTagsFilter : [], - ...(tagsFilter?.length > 0 && {tags: [(tagsFilterAnd ? '__$and' : '__$or'), ...addExcludeFilters(tagsFilter)] }), + ...(systemTagsFilter?.length > 0 && {system_tags: systemTagsFilter}), + ...(tagsFilter?.length > 0 && {tags: [(tagsFilterAnd ? '__$and' : '__$or'), ...addExcludeFilters(tagsFilter)]}), include_subprojects: deep && !projectFilter, search_hidden: showHidden, only_fields @@ -620,32 +634,32 @@ export class CommonExperimentsViewEffects { )); setSelectedExperiments = createEffect(() => this.actions$.pipe( - ofType(exActions.setSelectedExperiments, exActions.updateExperiment, updateManyExperiment.type), - withLatestFrom( - this.store.select(exSelectors.selectSelectedExperiments), - ), - switchMap(([action, selectSelectedExperiments]) => { - const payload = action.type === exActions.setSelectedExperiments.type ? - (action as ReturnType).experiments : selectSelectedExperiments; - const selectedExperimentsDisableAvailable: Record = { - [MenuItems.abort]: selectionDisabledAbort(payload), - [MenuItems.abortAllChildren]: selectionDisabledAbortAllChildren(payload), - [MenuItems.publish]: selectionDisabledPublishExperiments(payload), - [MenuItems.reset]: selectionDisabledReset(payload), - [MenuItems.delete]: selectionDisabledDelete(payload), - [MenuItems.moveTo]: selectionDisabledMoveTo(payload), - [MenuItems.continue]: selectionDisabledContinue(payload), - [MenuItems.enqueue]: selectionDisabledEnqueue(payload), - [MenuItems.dequeue]: selectionDisabledDequeue(payload), - [MenuItems.queue]: selectionDisabledQueue(payload), - [MenuItems.viewWorker]: selectionDisabledViewWorker(payload), - [MenuItems.archive]: selectionDisabledArchive(payload), - [MenuItems.tags]: selectionDisabledTags(payload), - }; - //allHasExamples: selectionAllExamples(action.payload), - // allArchive: selectionAllIsArchive(action.payload), - return [exActions.setSelectedExperimentsDisableAvailable({selectedExperimentsDisableAvailable})]; - }) + ofType(exActions.setSelectedExperiments, exActions.updateExperiment, updateManyExperiment.type), + withLatestFrom( + this.store.select(exSelectors.selectSelectedExperiments), + ), + switchMap(([action, selectSelectedExperiments]) => { + const payload = action.type === exActions.setSelectedExperiments.type ? + (action as ReturnType).experiments : selectSelectedExperiments; + const selectedExperimentsDisableAvailable: Record = { + [MenuItems.abort]: selectionDisabledAbort(payload), + [MenuItems.abortAllChildren]: selectionDisabledAbortAllChildren(payload), + [MenuItems.publish]: selectionDisabledPublishExperiments(payload), + [MenuItems.reset]: selectionDisabledReset(payload), + [MenuItems.delete]: selectionDisabledDelete(payload), + [MenuItems.moveTo]: selectionDisabledMoveTo(payload), + [MenuItems.continue]: selectionDisabledContinue(payload), + [MenuItems.enqueue]: selectionDisabledEnqueue(payload), + [MenuItems.dequeue]: selectionDisabledDequeue(payload), + [MenuItems.queue]: selectionDisabledQueue(payload), + [MenuItems.viewWorker]: selectionDisabledViewWorker(payload), + [MenuItems.archive]: selectionDisabledArchive(payload), + [MenuItems.tags]: selectionDisabledTags(payload), + }; + //allHasExamples: selectionAllExamples(action.payload), + // allArchive: selectionAllIsArchive(action.payload), + return [exActions.setSelectedExperimentsDisableAvailable({selectedExperimentsDisableAvailable})]; + }) ) ); } diff --git a/src/app/webapp-common/experiments/experiment-routes.ts b/src/app/webapp-common/experiments/experiment-routes.ts index 069d8ae2..686b8084 100644 --- a/src/app/webapp-common/experiments/experiment-routes.ts +++ b/src/app/webapp-common/experiments/experiment-routes.ts @@ -1,6 +1,5 @@ import {Routes} from '@angular/router'; import {ExperimentsComponent} from '@common/experiments/experiments.component'; -import {ExperimentInfoComponent} from '../../features/experiments/containers/experiment-info/experiment-info.component'; import {ExperimentInfoExecutionComponent} from './containers/experiment-info-execution/experiment-info-execution.component'; import {LeavingBeforeSaveAlertGuard} from '../shared/guards/leaving-before-save-alert.guard'; import {ExperimentInfoArtifactsComponent} from './containers/experiment-info-aritfacts/experiment-info-artifacts.component'; @@ -22,7 +21,7 @@ export const routes: Routes = [ component: ExperimentsComponent, children: [ { - path: ':experimentId', component: ExperimentInfoComponent, + path: ':experimentId', component: ExperimentOutputComponent, children: [ {path: '', redirectTo: 'execution', pathMatch: 'full'}, { @@ -60,7 +59,6 @@ export const routes: Routes = [ {path: 'general', component: ExperimentInfoGeneralComponent, data: {minimized: true}}, { path: 'info-output', - component: ExperimentOutputComponent, data: {minimized: true}, children: [ {path: 'metrics/scalar', component: ExperimentOutputScalarsComponent, data: {minimized: true}}, diff --git a/src/app/webapp-common/experiments/experiment.consts.ts b/src/app/webapp-common/experiments/experiment.consts.ts index 1b743ad2..babe2995 100644 --- a/src/app/webapp-common/experiments/experiment.consts.ts +++ b/src/app/webapp-common/experiments/experiment.consts.ts @@ -187,7 +187,10 @@ export const EXPERIMENT_INFO_ONLY_FIELDS_BASE = [ 'runtime' ]; -export const MINIMUM_ONLY_FIELDS = ['name', 'status', 'system_tags', 'project', 'company', 'last_change', 'started', 'last_iteration', 'tags', 'user.name']; +export const MINIMUM_ONLY_FIELDS = [ + 'name', 'status', 'system_tags', 'project', 'company', 'last_change', 'started', 'last_iteration', 'tags', + 'user.name', 'runtime.progress' +]; export const ARTIFACTS_ONLY_FIELDS = [ 'execution.artifacts', diff --git a/src/app/webapp-common/experiments/experiments.component.ts b/src/app/webapp-common/experiments/experiments.component.ts index 8b1b555e..0cae793b 100644 --- a/src/app/webapp-common/experiments/experiments.component.ts +++ b/src/app/webapp-common/experiments/experiments.component.ts @@ -10,7 +10,6 @@ import { selectExperimentsTableColsOrder, selectExperimentsTags, selectExperimentsTypes, - selectExperimentsUsers, selectHyperParamsOptions, selectHyperParamsVariants, selectIsExperimentInEditMode, @@ -26,7 +25,7 @@ import { selectCompanyTags, selectIsArchivedMode, selectIsDeepMode, selectProjectSystemTags, - selectProjectTags, + selectProjectTags, selectProjectUsers, selectSelectedProject, selectTagsFilterByProject } from '../core/reducers/projects.reducer'; @@ -51,7 +50,7 @@ import { } from '~/features/experiments/reducers'; import {EXPERIMENTS_TABLE_COL_FIELDS} from '~/features/experiments/shared/experiments.const'; import * as experimentsActions from './actions/common-experiments-view.actions'; -import {setTableCols, setTags, tableFilterChanged} from './actions/common-experiments-view.actions'; +import {setTableCols, setTableMode, setTags, tableFilterChanged} from './actions/common-experiments-view.actions'; import {MetricVariantResult} from '~/business-logic/model/projects/metricVariantResult'; import {setAutoRefresh} from '../core/actions/layout.actions'; import {setArchive as setProjectArchive, setDeep} from '../core/actions/projects.actions'; @@ -210,7 +209,7 @@ export class ExperimentsComponent extends BaseEntityPageComponent implements OnI this.isAppVisible$ = this.store.select(selectAppVisible); this.inEditMode$ = this.store.select(selectIsExperimentInEditMode); this.isSharedAndNotOwner$ = this.store.select(selectIsSharedAndNotOwner); - this.users$ = this.store.select(selectExperimentsUsers); + this.users$ = this.store.select(selectProjectUsers); this.parent$ = this.store.select(selectExperimentsParents); this.activeParentsFilter$ = this.store.select(selectActiveParentsFilter); this.types$ = this.store.select(selectExperimentsTypes); @@ -328,7 +327,6 @@ export class ExperimentsComponent extends BaseEntityPageComponent implements OnI }); this.selectExperimentFromUrl(); - this.store.dispatch(experimentsActions.getUsers()); this.store.dispatch(experimentsActions.getParents()); this.store.dispatch(experimentsActions.getTags()); this.store.dispatch(experimentsActions.getProjectTypes()); @@ -467,7 +465,9 @@ export class ExperimentsComponent extends BaseEntityPageComponent implements OnI withLatestFrom(this.store.select(selectTableMode)), map(([[experimentId, experiments], mode]) => { this.firstExperiment = experiments?.[0]; - if (!experimentId && this.shouldOpenDetails && this.firstExperiment && mode === 'info') { + if (!this.shouldOpenDetails) { + this.store.dispatch(setTableMode({mode: !!experimentId ? 'info' : 'table'})); + } else if (!experimentId && this.shouldOpenDetails && this.firstExperiment && mode === 'info') { this.shouldOpenDetails = false; this.store.dispatch(experimentsActions.experimentSelectionChanged({ experiment: this.firstExperiment, @@ -662,7 +662,7 @@ export class ExperimentsComponent extends BaseEntityPageComponent implements OnI modeChanged(mode: 'info' | 'table') { if (mode === 'info') { - this.store.dispatch(experimentsActions.setTableMode({mode})) + this.store.dispatch(experimentsActions.setTableMode({mode})); this.store.dispatch(experimentsActions.experimentSelectionChanged({ experiment: this.selectedExperiments?.[0] || this.firstExperiment, project: this.selectedProject diff --git a/src/app/webapp-common/experiments/reducers/common-experiments-view.reducer.ts b/src/app/webapp-common/experiments/reducers/common-experiments-view.reducer.ts index 8e5eddc2..0580283f 100644 --- a/src/app/webapp-common/experiments/reducers/common-experiments-view.reducer.ts +++ b/src/app/webapp-common/experiments/reducers/common-experiments-view.reducer.ts @@ -3,7 +3,6 @@ import {ISmCol} from '../../shared/ui-components/data/table/table.consts'; import * as actions from '../actions/common-experiments-view.actions'; import {MetricVariantResult} from '~/business-logic/model/projects/metricVariantResult'; import {TableFilter} from '../../shared/utils/tableParamEncode'; -import {User} from '~/business-logic/model/users/user'; import {ProjectsGetTaskParentsResponseParents} from '~/business-logic/model/projects/projectsGetTaskParentsResponseParents'; import {ICommonSearchState} from '../../common-search/common-search.reducer'; import {SortMeta} from 'primeng/api'; @@ -39,7 +38,6 @@ export interface ICommonExperimentsViewState { hyperParams: Array; hyperParamsOptions: Record; metricsLoading: boolean; - users: User[]; projectTags: string[]; parents: ProjectsGetTaskParentsResponseParents[]; activeParentsFilter: ProjectsGetTaskParentsResponseParents[]; @@ -75,11 +73,10 @@ export const commonExperimentsInitialState: ICommonExperimentsViewState = { hyperParamsOptions: {}, metricsLoading: false, projectTags: [], - users: [], parents: [], activeParentsFilter: [], types: [], - splitSize: 75, + splitSize: 70, tableMode: 'table' }; @@ -233,7 +230,6 @@ export const commonExperimentsViewReducer = createReducer( }; }), on(actions.setTags, (state, action) => ({...state, projectTags: action.tags})), - on(actions.setUsers, (state, action) => ({...state, users: action.users})), on(actions.setParents, (state, action) => ({...state, parents: action.parents})), on(actions.setActiveParentsFilter, (state, action) => ({...state, activeParentsFilter: action.parents})), on(actions.setProjectsTypes, (state, action) => ({...state, types: action.types})), diff --git a/src/app/webapp-common/experiments/reducers/index.ts b/src/app/webapp-common/experiments/reducers/index.ts index 73be8e85..c171c8f0 100644 --- a/src/app/webapp-common/experiments/reducers/index.ts +++ b/src/app/webapp-common/experiments/reducers/index.ts @@ -44,7 +44,6 @@ export const selectExperimentsTableCols = createSelector(selectRawExperimentsTab style: {...col.style, ...(col.id !== EXPERIMENTS_TABLE_COL_FIELDS.SELECTED && colWidth[col.id] && {width: `${colWidth[col.id]}px`})} } as ISmCol))); export const selectExperimentsTags = createSelector(experimentsView, (state) => state.projectTags); -export const selectExperimentsUsers = createSelector(experimentsView, (state) => state.users); export const selectExperimentsParents = createSelector(experimentsView, (state) => state.parents); export const selectActiveParentsFilter = createSelector(experimentsView, (state) => state.activeParentsFilter); export const selectExperimentsTypes = createSelector(experimentsView, (state) => state.types); diff --git a/src/app/webapp-common/experiments/shared/common-experiment-shared.module.ts b/src/app/webapp-common/experiments/shared/common-experiment-shared.module.ts index 3fd32e27..4cb199ed 100644 --- a/src/app/webapp-common/experiments/shared/common-experiment-shared.module.ts +++ b/src/app/webapp-common/experiments/shared/common-experiment-shared.module.ts @@ -9,17 +9,19 @@ import {CloneDialogComponent} from './components/clone-dialog/clone-dialog.compo import {SelectQueueModule} from './components/select-queue/select-queue.module'; import {FormsModule} from '@angular/forms'; import {AbortAllChildrenDialogComponent} from './components/abort-all-children-dialog/abort-all-children-dialog.component'; +import {MatProgressSpinnerModule} from '@angular/material/progress-spinner'; const DECLARATIONS = [ExperimentStatusIconLabelComponent, ExperimentSystemTagsComponent, ChangeProjectDialogComponent, CloneDialogComponent,AbortAllChildrenDialogComponent ]; @NgModule({ - imports: [ - SMSharedModule, - CommonModule, - SelectQueueModule, - FormsModule, - ], + imports: [ + SMSharedModule, + CommonModule, + SelectQueueModule, + FormsModule, + MatProgressSpinnerModule, + ], declarations : [...DECLARATIONS], providers : [CommonExperimentConverterService], exports : [...DECLARATIONS] diff --git a/src/app/webapp-common/experiments/shared/common-experiments.utils.ts b/src/app/webapp-common/experiments/shared/common-experiments.utils.ts index e2af9566..f08f3b27 100644 --- a/src/app/webapp-common/experiments/shared/common-experiments.utils.ts +++ b/src/app/webapp-common/experiments/shared/common-experiments.utils.ts @@ -1,4 +1,4 @@ -import {DIGITS_AFTER_DECIMAL, EXPERIMENTS_TABLE_COL_FIELDS} from '../../../features/experiments/shared/experiments.const'; +import {DIGITS_AFTER_DECIMAL} from '~/features/experiments/shared/experiments.const'; export const convertStopToComplete = (tasks) => tasks.map(task => { if (task.status === 'closed') { diff --git a/src/app/webapp-common/experiments/shared/components/clone-dialog/clone-dialog.component.scss b/src/app/webapp-common/experiments/shared/components/clone-dialog/clone-dialog.component.scss index 3227025f..d65c68f1 100644 --- a/src/app/webapp-common/experiments/shared/components/clone-dialog/clone-dialog.component.scss +++ b/src/app/webapp-common/experiments/shared/components/clone-dialog/clone-dialog.component.scss @@ -32,6 +32,7 @@ } .buttons { + margin-top: 32px; display: flex; flex-direction: row-reverse; align-items: center; diff --git a/src/app/webapp-common/experiments/shared/components/experiment-menu/experiment-menu.component.html b/src/app/webapp-common/experiments/shared/components/experiment-menu/experiment-menu.component.html index 4f8ec7f3..6e023aa4 100644 --- a/src/app/webapp-common/experiments/shared/components/experiment-menu/experiment-menu.component.html +++ b/src/app/webapp-common/experiments/shared/components/experiment-menu/experiment-menu.component.html @@ -1,5 +1,5 @@
= this.dialog.open(WelcomeMessageComponent, { data: { queue: res.queue, @@ -185,7 +174,6 @@ export class ExperimentMenuComponent extends BaseContextMenuComponent implements dequeuePopup() { const selectedExperiments = this.selectedExperiments ? selectionDisabledDequeue(this.selectedExperiments).selectedFiltered : [this._experiment]; - const getBody = (queueName: string) => `${selectedExperiments.length === 1 ? htmlTextShorte(this._experiment.name) : selectedExperiments.length + 'experiments'} will be removed from the ${queueName ? '' + queueName + ' ' : ''}execution queue.`; this.store.dispatch(new GetQueuesForEnqueue()); const confirmDialogRef = this.dialog.open(ConfirmDialogComponent, { @@ -429,6 +417,7 @@ To avoid this, clone the experiment and work with the cloned experiment.` } toggleDetails () { + this.store.dispatch(experimentsActions.setTableMode({mode:'info'})); this.store.dispatch(experimentsActions.experimentSelectionChanged({ experiment: this._experiment, project: this.projectId diff --git a/src/app/webapp-common/experiments/shared/components/experiment-status-icon-label/experiment-status-icon-label.component.html b/src/app/webapp-common/experiments/shared/components/experiment-status-icon-label/experiment-status-icon-label.component.html index 503b6a36..be0baebc 100644 --- a/src/app/webapp-common/experiments/shared/components/experiment-status-icon-label/experiment-status-icon-label.component.html +++ b/src/app/webapp-common/experiments/shared/components/experiment-status-icon-label/experiment-status-icon-label.component.html @@ -1,4 +1,11 @@
-
{{EXPERIMENTS_STATUS_LABELS[status]}}
+
{{EXPERIMENTS_STATUS_LABELS[status]}}
+
diff --git a/src/app/webapp-common/experiments/shared/components/experiment-status-icon-label/experiment-status-icon-label.component.scss b/src/app/webapp-common/experiments/shared/components/experiment-status-icon-label/experiment-status-icon-label.component.scss index bd51df74..e030e769 100644 --- a/src/app/webapp-common/experiments/shared/components/experiment-status-icon-label/experiment-status-icon-label.component.scss +++ b/src/app/webapp-common/experiments/shared/components/experiment-status-icon-label/experiment-status-icon-label.component.scss @@ -1,13 +1,16 @@ -@import "../../../../../webapp-common/shared/ui-components/styles/variables"; +@import "variables"; .icon { min-width: 10px; } .label { - align-items: center; - justify-content: center; + line-height: 18px; margin-left: 5px; + + &.with-spinner { + min-width: 50px; + } } .created, .queued { @@ -76,3 +79,6 @@ margin-top: 2px } +.spinner { + margin: -2px 0 0 6px; +} diff --git a/src/app/webapp-common/experiments/shared/components/experiment-status-icon-label/experiment-status-icon-label.component.ts b/src/app/webapp-common/experiments/shared/components/experiment-status-icon-label/experiment-status-icon-label.component.ts index 3634d836..29ca1c91 100644 --- a/src/app/webapp-common/experiments/shared/components/experiment-status-icon-label/experiment-status-icon-label.component.ts +++ b/src/app/webapp-common/experiments/shared/components/experiment-status-icon-label/experiment-status-icon-label.component.ts @@ -1,22 +1,30 @@ -import {Component, Input, OnInit} from '@angular/core'; -import {EXPERIMENTS_STATUS_LABELS} from '../../../../../features/experiments/shared/experiments.const'; +import {Component, Input} from '@angular/core'; +import {EXPERIMENTS_STATUS_LABELS} from '~/features/experiments/shared/experiments.const'; +import {TASKS_STATUS} from '@common/tasks/tasks.constants'; @Component({ selector : 'sm-experiment-status-icon-label', templateUrl: './experiment-status-icon-label.component.html', styleUrls : ['./experiment-status-icon-label.component.scss'] }) -export class ExperimentStatusIconLabelComponent implements OnInit { +export class ExperimentStatusIconLabelComponent { + public showSpinner: boolean; + public EXPERIMENTS_STATUS_LABELS = EXPERIMENTS_STATUS_LABELS; + private _status: string; + @Input() showLabel = true; @Input() showIcon = true; - @Input() status; + @Input() set status(status) { + this._status = status; + this.showSpinner = [ + TASKS_STATUS.IN_PROGRESS, + TASKS_STATUS.FAILED, + TASKS_STATUS.STOPPED + ].includes(status) + } + get status() { + return this._status; + } @Input() type; - public EXPERIMENTS_STATUS_LABELS = EXPERIMENTS_STATUS_LABELS; - - constructor() { - } - - ngOnInit() { - } - + @Input() progress; } diff --git a/src/app/webapp-common/experiments/shared/components/select-queue/select-queue.component.html b/src/app/webapp-common/experiments/shared/components/select-queue/select-queue.component.html index c9be4fb3..56a17a0d 100644 --- a/src/app/webapp-common/experiments/shared/components/select-queue/select-queue.component.html +++ b/src/app/webapp-common/experiments/shared/components/select-queue/select-queue.component.html @@ -9,14 +9,42 @@ Note: Some experiments seems to not contain any executable code.
If enqueued to run, they might produce no results.

- - Queue - - - {{queue.name}} - - + + + Queue + + + "{{autoComplete.value}}" (Create New) + + + + Please provide a value + +
, @@ -113,6 +118,7 @@ export class WelcomeMessageComponent implements OnInit, OnDestroy { ngOnInit(): void { this.community = this.configService.getStaticEnvironment().communityServer; + this.displayedServerUrls = this.configService.getStaticEnvironment().displayedServerUrls; this.newCredentialSub = this.store.select(selectNewCredential) .pipe( diff --git a/src/app/webapp-common/models/actions/models-menu.actions.ts b/src/app/webapp-common/models/actions/models-menu.actions.ts index 9765336d..1af92a36 100644 --- a/src/app/webapp-common/models/actions/models-menu.actions.ts +++ b/src/app/webapp-common/models/actions/models-menu.actions.ts @@ -6,7 +6,7 @@ const MODELS_PREFIX = 'MODELS_MENU_'; export const publishModelClicked = createAction( MODELS_PREFIX + '[publish model]', - props<{selectedModels: SelectedModel[]}>() + props<{selectedEntities: SelectedModel[]}>() ); export const changeProjectRequested = createAction( diff --git a/src/app/webapp-common/models/actions/models-view.actions.ts b/src/app/webapp-common/models/actions/models-view.actions.ts index bf90c82d..90e5b613 100644 --- a/src/app/webapp-common/models/actions/models-view.actions.ts +++ b/src/app/webapp-common/models/actions/models-view.actions.ts @@ -2,7 +2,6 @@ import {createAction, props} from '@ngrx/store'; import {ISmCol} from '../../shared/ui-components/data/table/table.consts'; import {SelectedModel} from '../shared/models.model'; import {TableFilter} from '../../shared/utils/tableParamEncode'; -import {User} from '~/business-logic/model/users/user'; import {SortMeta} from 'primeng/api'; import {CountAvailableAndIsDisableSelectedFiltered} from '@common/shared/entity-page/items.utils'; @@ -16,6 +15,7 @@ export const refreshModels = createAction( ); export const getNextModels = createAction(MODELS_PREFIX + '[get next model]'); +export const selectNextModel = createAction(MODELS_PREFIX + '[select next model]'); export const getNextModelsWithPageSize = createAction(MODELS_PREFIX + '[get next model with page size]', props<{ pageSize: number }>()); export const setModels = createAction( @@ -86,15 +86,6 @@ export const removeCol = createAction( props<{ id: string; projectId: string }>() ); -export const setUsers = createAction( - MODELS_PREFIX + 'SET_USERS', - props<{ users: User[] }>() -); - -export const getUsers = createAction(MODELS_PREFIX + 'GET_USERS'); -export const getUsersForAllProjects = createAction( MODELS_PREFIX +'GET_ALL_PROJECTS_USERS'); - - export const setFrameworks = createAction( MODELS_PREFIX + 'SET_FRAMEWORKS', props<{ frameworks: string[] }>() diff --git a/src/app/webapp-common/models/containers/model-info/model-info.component.html b/src/app/webapp-common/models/containers/model-info/model-info.component.html index c76e19b8..9d1d7ba4 100644 --- a/src/app/webapp-common/models/containers/model-info/model-info.component.html +++ b/src/app/webapp-common/models/containers/model-info/model-info.component.html @@ -1,29 +1,29 @@ - - +
-
diff --git a/src/app/webapp-common/models/containers/model-info/model-info.component.scss b/src/app/webapp-common/models/containers/model-info/model-info.component.scss index 9621ae11..79d3e746 100644 --- a/src/app/webapp-common/models/containers/model-info/model-info.component.scss +++ b/src/app/webapp-common/models/containers/model-info/model-info.component.scss @@ -4,18 +4,19 @@ sm-model-info-header { display: block; - height: 45px; } .model-info-container { - height: calc(100% - 46px); + height: calc(100% - 56px); padding-left: 10px; - padding-top: 24px; nav { - height: 65px; border-bottom: 1px solid rgba(2, 2, 2, 0.07); + position: relative; + text-align: center; + padding: 0 24px; } + } .model-info-body { diff --git a/src/app/webapp-common/models/containers/model-menu/model-menu.component.html b/src/app/webapp-common/models/containers/model-menu/model-menu.component.html index 2e9a3a12..2846b562 100644 --- a/src/app/webapp-common/models/containers/model-menu/model-menu.component.html +++ b/src/app/webapp-common/models/containers/model-menu/model-menu.component.html @@ -1,4 +1,4 @@ - +
-
-
-
- -
- {{model?.name}} +
+
+
+ +
+ {{model?.name}} +
+
+
+
+ + + +
+
- - - - {{model.id}} - +
-
- - -
diff --git a/src/app/webapp-common/models/dumbs/model-info-header/model-info-header.component.scss b/src/app/webapp-common/models/dumbs/model-info-header/model-info-header.component.scss index c2973b0a..6dde4a5a 100644 --- a/src/app/webapp-common/models/dumbs/model-info-header/model-info-header.component.scss +++ b/src/app/webapp-common/models/dumbs/model-info-header/model-info-header.component.scss @@ -1,6 +1,7 @@ @import "../../../shared/ui-components/styles/variables"; :host { + padding: 0 24px; .model-icon { margin-right: 9px; } @@ -29,44 +30,34 @@ font-size: 11px; color: $blue-300; } - - .model-id { - top: 4px; - position: relative; - } - - .menu-button, .menu-button &:hover, .menu-button &:focus { - cursor: pointer; - font-weight: bold; - font-size: 12px; - text-decoration: none; - } - - .tags-list { - display: flex; - align-items: center; - padding-top: 2px; - } - - .edit-name { - max-width: 80%; - padding-right: 24px; - } - - .right-buttons { - display: flex; - align-items: center; - margin-right: 24px; - margin-left: auto; - align-self: start; - margin-top: 4px; - - sm-model-menu { - display: flex; - align-items: center; - justify-content: center; - width: 24px; - height: 24px; + .line-item{ + margin-right: 21px; + height: 24px; + &:last-child{ + margin-right: 6px; + margin-left: 10px; } } + + + + + .tags-list { + height: 28px; + flex-grow: 1; + display: flex; + align-items: end; + padding-left: 50px; + grid-area: tags; + overflow: hidden; + } + .model-name-cont{ + max-width: calc(100% - 140px); + .edit-name { + overflow: hidden; + } + } + + + } diff --git a/src/app/webapp-common/models/dumbs/model-info-header/model-info-header.component.ts b/src/app/webapp-common/models/dumbs/model-info-header/model-info-header.component.ts index e4a74d3a..af7b0520 100644 --- a/src/app/webapp-common/models/dumbs/model-info-header/model-info-header.component.ts +++ b/src/app/webapp-common/models/dumbs/model-info-header/model-info-header.component.ts @@ -1,11 +1,11 @@ import {Component, EventEmitter, Input, Output, ViewChild} from '@angular/core'; -import {TagsMenuComponent} from '../../../shared/ui-components/tags/tags-menu/tags-menu.component'; +import {TagsMenuComponent} from '@common/shared/ui-components/tags/tags-menu/tags-menu.component'; import {Store} from '@ngrx/store'; -import {selectCompanyTags, selectProjectTags, selectTagsFilterByProject} from '../../../core/reducers/projects.reducer'; +import {selectCompanyTags, selectProjectTags, selectTagsFilterByProject} from '@common/core/reducers/projects.reducer'; import {Observable} from 'rxjs'; import {addTag, removeTag} from '../../actions/models-menu.actions'; import {SelectedModel, TableModel} from '../../shared/models.model'; -import {MenuComponent} from '../../../shared/ui-components/panel/menu/menu.component'; +import {MenuComponent} from '@common/shared/ui-components/panel/menu/menu.component'; import {getSysTags} from '../../model.utils'; import {ActivateModelEdit, CancelModelEdit} from '../../actions/models-info.actions'; import { @@ -15,7 +15,8 @@ import { selectionDisabledDelete, selectionDisabledMoveTo, selectionDisabledPublishModels -} from '../../../shared/entity-page/items.utils'; +} from '@common/shared/entity-page/items.utils'; +import {addMessage} from '@common/core/actions/layout.actions'; @Component({ selector : 'sm-model-info-header', @@ -33,8 +34,8 @@ export class ModelInfoHeaderComponent { @Input() editable: boolean; @Input() backdropActive: boolean; - @Output() deselectModel = new EventEmitter(); @Output() modelNameChanged = new EventEmitter(); + @Output() closeInfoClicked = new EventEmitter(); @ViewChild('tagMenu') tagMenu: MenuComponent; @ViewChild('tagsMenuContent') tagMenuContent: TagsMenuComponent; @@ -57,13 +58,12 @@ export class ModelInfoHeaderComponent { } this._model = model; this.sysTags = getSysTags(model as TableModel); - const selectedModelsDisableAvailable: Record = { + this.selectedDisableAvailable = { [MenuItems.publish]: selectionDisabledPublishModels([model]), [MenuItems.moveTo]: selectionDisabledMoveTo([model]), [MenuItems.delete]: selectionDisabledDelete([model]), [MenuItems.archive]: selectionDisabledArchive([model]) }; - this.selectedDisableAvailable = selectedModelsDisableAvailable; } public onNameChanged(name) { @@ -102,4 +102,8 @@ export class ModelInfoHeaderComponent { this.store.dispatch(new CancelModelEdit()); } } + + copyToClipboard() { + this.store.dispatch(addMessage('success', 'Copied to clipboard')); + } } diff --git a/src/app/webapp-common/models/effects/models-menu.effects.ts b/src/app/webapp-common/models/effects/models-menu.effects.ts index 931b7a40..47bccb4c 100644 --- a/src/app/webapp-common/models/effects/models-menu.effects.ts +++ b/src/app/webapp-common/models/effects/models-menu.effects.ts @@ -44,11 +44,11 @@ export class ModelsMenuEffects { ofType(menuActions.publishModelClicked), withLatestFrom(this.store.select(selectSelectedModel)), switchMap(([action, selectedModel]) => { - const ids = action.selectedModels.map(model => model.id); + const ids = action.selectedEntities.map(model => model.id); return this.apiModels.modelsPublishMany({ids}) .pipe( mergeMap(res => this.updateModelsSuccess(action, MenuItems.publish, ids, selectedModel, res, {ready: true})), - catchError(error => this.publishModelFailedText(error, action.selectedModels).pipe( + catchError(error => this.publishModelFailedText(error, action.selectedEntities).pipe( mergeMap(errorMessage => [ requestFailed(error), deactivateLoader(action.type), @@ -79,7 +79,7 @@ export class ModelsMenuEffects { selectedModel ? new infoActions.SetModel(selectedModel) : new EmptyAction(), deactivateLoader(action.type) ]), - catchError(error => [requestFailed(error), deactivateLoader(action.type)]) + catchError(error => [requestFailed(error), deactivateLoader(action.type), setServerError(error, null, 'Failed to Move model')]) ) } ) @@ -153,12 +153,7 @@ export class ModelsMenuEffects { this.store.select(selectRouterParams), this.store.select(selectSelectedTableModel) ), - tap(([action, routerParams, selectedModel]) => { - if (this.isSelectedModelInCheckedModels(action.selectedEntities, selectedModel)) { - this.router.navigate([`projects/${routerParams.projectId}/models/`]); - } - }), - switchMap(([action, routerParams]) => this.apiModels.modelsArchiveMany({ids: action.selectedEntities.map((model) => model.id)}) + switchMap(([action, routerParams, selectedTableModel]) => this.apiModels.modelsArchiveMany({ids: action.selectedEntities.map((model) => model.id)}) .pipe( withLatestFrom(this.store.select(selectRouterConfig)), mergeMap(([res, routerConfig]: [ModelsArchiveManyResponse, RouterState['config']]) => { @@ -185,6 +180,9 @@ export class ModelsMenuEffects { viewActions.fetchModelsRequested() ]); } + if (this.isSelectedModelInCheckedModels(action.selectedEntities, selectedTableModel)) { + actions.push(viewActions.selectNextModel()); + } return actions; }), catchError(error => [ diff --git a/src/app/webapp-common/models/effects/models-view.effects.ts b/src/app/webapp-common/models/effects/models-view.effects.ts index ec7f12d5..c1e1d25c 100644 --- a/src/app/webapp-common/models/effects/models-view.effects.ts +++ b/src/app/webapp-common/models/effects/models-view.effects.ts @@ -2,7 +2,7 @@ import {Injectable} from '@angular/core'; import {ActivatedRoute, Router} from '@angular/router'; import {Actions, createEffect, ofType} from '@ngrx/effects'; import {Action, Store} from '@ngrx/store'; -import {flatten, get, isEqual, uniq} from 'lodash/fp'; +import {flatten, get, isEqual} from 'lodash/fp'; import {EMPTY, of} from 'rxjs'; import { auditTime, @@ -20,10 +20,14 @@ import {ApiModelsService} from '~/business-logic/api-services/models.service'; import {BlModelsService} from '~/business-logic/services/models.service'; import {requestFailed} from '../../core/actions/http.actions'; import {activeLoader, addMessage, deactivateLoader, setServerError} from '../../core/actions/layout.actions'; -import {setArchive as setProjectArchive} from '../../core/actions/projects.actions'; +import { + getFilteredUsers, + setArchive as setProjectArchive, + setProjectUsers +} from '../../core/actions/projects.actions'; import {setURLParams} from '../../core/actions/router.actions'; import {selectIsArchivedMode, selectIsDeepMode, selectSelectedProject} from '../../core/reducers/projects.reducer'; -import {selectRouterParams} from '../../core/reducers/router-reducer'; +import {selectRouterConfig, selectRouterParams} from '../../core/reducers/router-reducer'; import {selectAppVisible} from '../../core/reducers/view.reducer'; import {addMultipleSortColumns, escapeRegex, getRouteFullUrl} from '../../shared/utils/shared-utils'; import {GetModelInfo, RefreshModelInfo} from '../actions/models-info.actions'; @@ -31,11 +35,10 @@ import * as actions from '../actions/models-view.actions'; import {setMetadataKeys, setSelectedModelsDisableAvailable} from '../actions/models-view.actions'; import {MODELS_PAGE_SIZE, MODELS_TABLE_COLS} from '../models.consts'; import * as modelsSelectors from '../reducers'; -import {selectSelectedModels, selectTableFilters, selectTableSortFields} from '../reducers'; +import {selectModelsList, selectSelectedModels, selectTableFilters, selectTableSortFields} from '../reducers'; import {IModelsViewState} from '../reducers/models-view.reducer'; import {MODEL_TAGS, MODELS_ONLY_FIELDS, MODELS_TABLE_COL_FIELDS} from '../shared/models.const'; import {SelectedModel} from '../shared/models.model'; -import {ApiUsersService} from '~/business-logic/api-services/users.service'; import {ModelsGetAllExRequest} from '~/business-logic/model/models/modelsGetAllExRequest'; import { addExcludeFilters, @@ -61,15 +64,18 @@ import {ModelsGetAllExResponse} from '~/business-logic/model/models/modelsGetAll import {ISmCol} from '../../shared/ui-components/data/table/table.consts'; import {hasValue} from '../../shared/utils/helpers.util'; import {ProjectsGetModelMetadataValuesResponse} from '~/business-logic/model/projects/projectsGetModelMetadataValuesResponse'; +import * as exActions from '../../experiments/actions/common-experiments-view.actions'; +import {selectExperimentsList, selectTableMode} from '../../experiments/reducers'; +import {ITableExperiment} from '../../experiments/shared/common-experiment-model.model'; @Injectable() export class ModelsViewEffects { - constructor(private actions$: Actions, private store: Store, - private apiModels: ApiModelsService, private projectsApi: ApiProjectsService, private modelBl: BlModelsService, private usersApi: ApiUsersService, - private router: Router, private route: ActivatedRoute - ) { - } + constructor( + private actions$: Actions, private store: Store, private apiModels: ApiModelsService, + private projectsApi: ApiProjectsService, private modelBl: BlModelsService, private router: Router, + private route: ActivatedRoute + ) {} /* eslint-disable @typescript-eslint/naming-convention */ @@ -167,51 +173,15 @@ export class ModelsViewEffects { ) )); - getFilteredUsersEffect = createEffect(() => this.actions$.pipe( - ofType(actions.getFilteredUsers), - withLatestFrom(this.store.select(modelsSelectors.selectModelsUsers), this.store.select(modelsSelectors.selectTableFilters)), - switchMap(([, users, filters]) => this.usersApi.usersGetAllEx({ - order_by: ['name'], - only_fields: ['name'], - id: get(['user.name', 'value'], filters) || [] - }, null, 'body', true).pipe( - mergeMap(res => [ - actions.setUsers({users: uniq(res.users.concat(users))}), - ]), - catchError(error => [ - requestFailed(error), - setServerError(error, null, 'Fetch users failed')] - ) - )) - )); - getUsersEffect = createEffect(() => this.actions$.pipe( - ofType(actions.getUsers, actions.getUsersForAllProjects), - withLatestFrom( - this.store.select(selectRouterParams).pipe(map(params => get('projectId', params))), - this.store.select(modelsSelectors.selectTableFilters) - ), - switchMap(([action, projectId, filters]) => this.usersApi.usersGetAllEx({ - order_by: ['name'], - only_fields: ['name'], - active_in_projects: (projectId !== '*' && action.type!== actions.getUsersForAllProjects.type ) ? [projectId] : [] - }, null, 'body', true).pipe( - mergeMap(res => { - const userFiltersValue = get([MODELS_TABLE_COL_FIELDS.USER, 'value'], filters) || []; - const resIds = res.users.map(user => user.id); - const shouldGetFilteredUsersNames = !(userFiltersValue.every(id => resIds.includes(id))); - return [ - actions.setUsers(res), - shouldGetFilteredUsersNames ? actions.getFilteredUsers() : new EmptyAction(), - deactivateLoader('Fetch Models') - ]; - }), - catchError(error => [ - requestFailed(error), - deactivateLoader('Fetch Models'), - setServerError(error, null, 'Fetch users failed') - ]) - )) + ofType(setProjectUsers), + withLatestFrom(this.store.select(modelsSelectors.selectTableFilters)), + map(([action, filters]) => { + const userFiltersValue = get([MODELS_TABLE_COL_FIELDS.USER, 'value'], filters) || []; + const resIds = action.users.map(user => user.id); + const shouldGetFilteredUsersNames = !(userFiltersValue.every(id => resIds.includes(id))); + return shouldGetFilteredUsersNames ? getFilteredUsers({filteredUsers: userFiltersValue}) : new EmptyAction(); + }) )); getTagsEffect = createEffect(() => this.actions$.pipe( @@ -323,7 +293,7 @@ export class ModelsViewEffects { switchMap(([action, projectId, archived, globalSearch, tableFilters, deep]) => { const pageSize = 1000; const query = this.getGetAllQuery({ - projectId, searchQuery: action.filtered && globalSearch, archived, orderFields: [], + projectId, searchQuery: action.filtered && globalSearch, archived, orderFields: [{order: -1, field: MODELS_TABLE_COL_FIELDS.LAST_UPDATE}], filters: action.filtered ? tableFilters : {}, selectedIds: [], deep, pageSize }); query.only_fields = [MODELS_TABLE_COL_FIELDS.NAME, MODELS_TABLE_COL_FIELDS.READY, 'company.id']; @@ -368,6 +338,17 @@ export class ModelsViewEffects { mergeMap(() => [actions.setTableMode({mode: 'info'})]) // map(action => actions.setSelectedModel({model: action.model})) )); + selectNextModelEffect = createEffect(() => this.actions$.pipe( + ofType(actions.selectNextModel), + withLatestFrom( + this.store.select(selectModelsList), + this.store.select(selectRouterParams).pipe(map(params => get('projectId', params))), + this.store.select(selectTableMode) + ), + filter(([action, models, projectId, tableMode])=>tableMode==='info'), + tap(([action, models, projectId]) => this.navigateAfterModelSelectionChanged(models[0] as SelectedModel, projectId)), + mergeMap(() => [actions.setTableMode({mode: 'info'})]) + )); setArchiveMode = createEffect(() => this.actions$.pipe( ofType(actions.setArchive), @@ -405,7 +386,7 @@ export class ModelsViewEffects { metaCols?: ISmCol[]; }): ModelsGetAllExRequest { const userFilter = filters?.[MODELS_TABLE_COL_FIELDS.USER]?.value; - const projectFilter = filters?.[MODELS_TABLE_COL_FIELDS.PROJECT]?.value + const projectFilter = filters?.[MODELS_TABLE_COL_FIELDS.PROJECT]?.value; const tagsFilter = filters?.[MODELS_TABLE_COL_FIELDS.TAGS]?.value; const tagsFilterAnd = filters?.[MODELS_TABLE_COL_FIELDS.TAGS]?.matchMode === 'AND'; const systemTags = get(['system_tags', 'value'], filters); @@ -416,7 +397,7 @@ export class ModelsViewEffects { const colsFilters = flatten(cols.filter(col => col.id !== 'selected' && !col.hidden).map(col => col.getter || col.id)); const metaColsFilters = metaCols ? flatten(metaCols.map(col => col.getter || col.id)) : []; const only_fields = [...new Set([...MODELS_ONLY_FIELDS, ...colsFilters, ...metaColsFilters])]; - let tableFilters = createFiltersFromStore(filters, true); + const tableFilters = createFiltersFromStore(filters, true); return { id: selectedIds, @@ -438,7 +419,7 @@ export class ModelsViewEffects { ...(tagsFilter?.length > 0 && {tags: addExcludeFilters(tagsFilterAnd ? ['__$and', ...tagsFilter] : tagsFilter)}), ...(frameworkFilter?.length > 0 && {framework: frameworkFilter}), ...(userFilter?.length > 0 && {user: userFilter}), - ...(ready !== null && {ready}) + ready: ready !== null ? ready : null }; } diff --git a/src/app/webapp-common/models/models.component.ts b/src/app/webapp-common/models/models.component.ts index bfb3dc2b..cbde3aac 100644 --- a/src/app/webapp-common/models/models.component.ts +++ b/src/app/webapp-common/models/models.component.ts @@ -13,7 +13,7 @@ import { selectCompanyTags, selectIsArchivedMode, selectProjectSystemTags, - selectProjectTags, + selectProjectTags, selectProjectUsers, selectTagsFilterByProject } from '../core/reducers/projects.reducer'; import {selectRouterParams} from '../core/reducers/router-reducer'; @@ -31,7 +31,6 @@ import { selectMetadataKeys, selectModelsFrameworks, selectModelsTags, - selectModelsUsers, selectModelTableColumns, selectTableMode } from './reducers'; import {IModelsViewState} from './reducers/models-view.reducer'; @@ -134,7 +133,7 @@ export class ModelsComponent extends BaseEntityPageComponent implements OnInit, this.projectTags$ = this.store.select(selectProjectTags); this.companyTags$ = this.store.select(selectCompanyTags); this.systemTags$ = this.store.select(selectProjectSystemTags); - this.users$ = this.store.select(selectModelsUsers); + this.users$ = this.store.select(selectProjectUsers); this.frameworks$ = this.store.select(selectModelsFrameworks); this.tableMode$ = this.store.select(selectTableMode); this.filteredTableCols$ = combineLatest([this.store.select(selectModelTableColumns), this.store.select(selectMetadataColsForProject)]) @@ -234,7 +233,6 @@ export class ModelsComponent extends BaseEntityPageComponent implements OnInit, this.sub.add(this.selectedModels$.subscribe(selectedModels => this.selectedModels = selectedModels)); this.selectModelFromUrl(); - this.store.dispatch(modelsActions.getUsers()); this.store.dispatch(modelsActions.getFrameworks()); this.store.dispatch(modelsActions.getTags()); this.store.dispatch(getTags()); @@ -280,7 +278,9 @@ export class ModelsComponent extends BaseEntityPageComponent implements OnInit, withLatestFrom(this.store.select(selectTableMode)), map(([[id, models], mode]) => { this.firstModel = models?.[0]; - if (!id && this.shouldOpenDetails && this.firstModel && mode === 'info') { + if (!this.shouldOpenDetails) { + this.store.dispatch(modelsActions.setTableMode({mode: !!id ? 'info' : 'table'})); + } else if (!id && this.shouldOpenDetails && this.firstModel && mode === 'info') { this.shouldOpenDetails = false; this.store.dispatch(modelsActions.modelSelectionChanged({ model: this.firstModel, diff --git a/src/app/webapp-common/models/reducers/index.ts b/src/app/webapp-common/models/reducers/index.ts index bdf001cb..3e8ea501 100644 --- a/src/app/webapp-common/models/reducers/index.ts +++ b/src/app/webapp-common/models/reducers/index.ts @@ -35,7 +35,6 @@ export const selectNoMoreModels = createSelector(modelsView, (state): boolean => export const selectShowAllSelectedIsActive = createSelector(modelsView, (state): boolean => state.showAllSelectedIsActive); export const selectModelsTableColsOrder = createSelector(modelsView, selectRouterParams, (state, params): string[] => (state.colsOrder && params?.projectId) ? state.colsOrder[params?.projectId] : undefined); -export const selectModelsUsers = createSelector(modelsView, (state): Array => state.users); export const selectModelsFrameworks = createSelector(modelsView, (state): Array => state.frameworks); export const selectModelsTags = createSelector(modelsView, (state): Array => state.projectTags); export const selectMetadataKeys = createSelector(modelsView, (state): Array => state.projectMetadataKeys); diff --git a/src/app/webapp-common/models/reducers/models-view.reducer.ts b/src/app/webapp-common/models/reducers/models-view.reducer.ts index 26ef40ae..9e883b79 100644 --- a/src/app/webapp-common/models/reducers/models-view.reducer.ts +++ b/src/app/webapp-common/models/reducers/models-view.reducer.ts @@ -4,7 +4,6 @@ import * as actions from '../actions/models-view.actions'; import {TableModel, SelectedModel} from '../shared/models.model'; import {MODELS_TABLE_COL_FIELDS} from '../shared/models.const'; import {TableFilter} from '../../shared/utils/tableParamEncode'; -import {User} from '~/business-logic/model/users/user'; import {ICommonSearchState} from '../../common-search/common-search.reducer'; import {SortMeta} from 'primeng/api'; import {CountAvailableAndIsDisableSelectedFiltered} from '@common/shared/entity-page/items.utils'; @@ -30,7 +29,6 @@ export interface IModelsViewState { scrollId: string; globalFilter: ICommonSearchState['searchQuery']; showAllSelectedIsActive: boolean; - users: User[]; frameworks: string[]; projectTags: string[]; projectMetadataKeys: string[]; @@ -65,7 +63,6 @@ export const modelsInitialState: IModelsViewState = { globalFilter: null, showAllSelectedIsActive: false, metadataColsOptions: {}, - users: [], projectTags: [], tableMode: 'table', }; @@ -149,7 +146,6 @@ export const modelsViewReducer = createReducer( ...state, metadataCols: [...state.metadataCols.filter(tableCol => !(tableCol.projectId === action['projectId'])), ...action['columns']] })), - on(actions.setUsers, (state, action) => ({...state, users: action.users})), on(actions.setFrameworks, (state, action) => ({...state, frameworks: action.frameworks})), on(actions.setTags, (state, action) => ({...state, projectTags: action.tags})), on(actions.setMetadataKeys, (state, action) => ({...state, projectMetadataKeys: action.keys})), diff --git a/src/app/webapp-common/models/shared/models-table/models-table.component.scss b/src/app/webapp-common/models/shared/models-table/models-table.component.scss index 417bdd2b..bba49d68 100644 --- a/src/app/webapp-common/models/shared/models-table/models-table.component.scss +++ b/src/app/webapp-common/models/shared/models-table/models-table.component.scss @@ -38,7 +38,7 @@ } &.header.minimised { - padding-left: 24px; + padding-left: 33px; } } diff --git a/src/app/webapp-common/models/shared/models-table/models-table.component.ts b/src/app/webapp-common/models/shared/models-table/models-table.component.ts index d352b45d..020bd2b4 100644 --- a/src/app/webapp-common/models/shared/models-table/models-table.component.ts +++ b/src/app/webapp-common/models/shared/models-table/models-table.component.ts @@ -199,7 +199,7 @@ export class ModelsTableComponent extends BaseTableView { @Input() set tags(tags) { const tagsAndActiveFilter = Array.from(new Set(tags.concat(this.filtersValues[MODELS_TABLE_COL_FIELDS.TAGS]))); this.filtersOptions[MODELS_TABLE_COL_FIELDS.TAGS] = tagsAndActiveFilter.map(tag => ({ - label: tag === null ? 'No tag' : tag, + label: tag === null ? '(No tags)' : tag, value: tag }) as IOption); this.sortOptionsList(MODELS_TABLE_COL_FIELDS.TAGS); @@ -299,7 +299,7 @@ export class ModelsTableComponent extends BaseTableView { } } - openContextMenu(data: {e: MouseEvent, rowData; single?: boolean; backdrop?: boolean}) { + openContextMenu(data: {e: MouseEvent; rowData; single?: boolean; backdrop?: boolean}) { if (!this.modelsSelectionChanged.observed) { return; } @@ -334,5 +334,5 @@ export class ModelsTableComponent extends BaseTableView { [MenuItems.moveTo]: selectionDisabledMoveTo([model]), [MenuItems.delete]: selectionDisabledDelete([model]), [MenuItems.archive]: selectionDisabledArchive([model]) - }) + }); } diff --git a/src/app/webapp-common/pipelines-controller/pipeline-controller-info/pipeline-controller-info.component.html b/src/app/webapp-common/pipelines-controller/pipeline-controller-info/pipeline-controller-info.component.html index 8bbbf686..b42ce0c9 100644 --- a/src/app/webapp-common/pipelines-controller/pipeline-controller-info/pipeline-controller-info.component.html +++ b/src/app/webapp-common/pipelines-controller/pipeline-controller-info/pipeline-controller-info.component.html @@ -41,25 +41,17 @@
-
- +
{{(selected$ | async)?.name}}
- - -
- - -
- +
diff --git a/src/app/webapp-common/pipelines-controller/pipeline-controller-info/pipeline-controller-info.component.scss b/src/app/webapp-common/pipelines-controller/pipeline-controller-info/pipeline-controller-info.component.scss index d3ea49fd..99af2081 100644 --- a/src/app/webapp-common/pipelines-controller/pipeline-controller-info/pipeline-controller-info.component.scss +++ b/src/app/webapp-common/pipelines-controller/pipeline-controller-info/pipeline-controller-info.component.scss @@ -127,13 +127,17 @@ sm-pipeline-controller-step { height: $log-header-height; display: grid; align-items: center; - grid-template-columns: 1fr auto 1fr; + grid-template-columns: 1fr 1fr; column-gap: 24px; padding: 0 16px; background-color: $blue-800; border-bottom: 1px solid #303443; color: $blue-100; box-shadow: 0 -2px 6px rgb(0 0 0 / 40%); + + &.toggle { + grid-template-columns: 1fr auto 1fr; + } } .log-name { @@ -148,31 +152,6 @@ sm-pipeline-controller-step { } } -.g-btn { - display: flex; - .btn { - min-width: 80px; - &:first-child {border-radius:4px 0 0 4px; margin-right: 1px;} - &:last-child {border-radius:0 4px 4px 0;} - } - .btn-primary { - &:hover { - border-color: $blue-570; - background-color: $blue-570; - } - &:focus { - box-shadow: none; - background-color: $blue-500; - border-color: $blue-500; - } - &.selected { - color: $blue-100 !important; - background-color: $blue-500; - border-color: $blue-500; - } - } -} - .close { display: flex; align-items: center; diff --git a/src/app/webapp-common/pipelines/pipeline-card-menu/pipeline-card-menu.component.html b/src/app/webapp-common/pipelines/pipeline-card-menu/pipeline-card-menu.component.html index 2f377459..f7ca2e22 100644 --- a/src/app/webapp-common/pipelines/pipeline-card-menu/pipeline-card-menu.component.html +++ b/src/app/webapp-common/pipelines/pipeline-card-menu/pipeline-card-menu.component.html @@ -8,6 +8,10 @@ +
+ (); @Output() rename = new EventEmitter(); + @Output() delete = new EventEmitter(); } diff --git a/src/app/webapp-common/pipelines/pipeline-card/pipeline-card.component.html b/src/app/webapp-common/pipelines/pipeline-card/pipeline-card.component.html index c9ac2929..24b71ec3 100644 --- a/src/app/webapp-common/pipelines/pipeline-card/pipeline-card.component.html +++ b/src/app/webapp-common/pipelines/pipeline-card/pipeline-card.component.html @@ -42,6 +42,7 @@ (run)="run.emit()" (rename)="editName.inlineActivated()" (addTag)="addTag.emit($event)" + (delete)="delete.emit()" >
Last run {{project.stats?.active?.last_task_run | timeAgo}}
@@ -71,6 +72,15 @@ >
diff --git a/src/app/webapp-common/pipelines/pipeline-card/pipeline-card.component.ts b/src/app/webapp-common/pipelines/pipeline-card/pipeline-card.component.ts index f9634fa8..6835e818 100644 --- a/src/app/webapp-common/pipelines/pipeline-card/pipeline-card.component.ts +++ b/src/app/webapp-common/pipelines/pipeline-card/pipeline-card.component.ts @@ -12,5 +12,6 @@ export class PipelineCardComponent extends ProjectCardComponent { @Output() run = new EventEmitter(); @Output() addTag = new EventEmitter(); @Output() removeTag = new EventEmitter(); + @Output() delete = new EventEmitter(); trackById = trackById; } diff --git a/src/app/webapp-common/pipelines/pipelines-page/pipelines-page.component.html b/src/app/webapp-common/pipelines/pipelines-page/pipelines-page.component.html index 3039cd59..de2f954c 100644 --- a/src/app/webapp-common/pipelines/pipelines-page/pipelines-page.component.html +++ b/src/app/webapp-common/pipelines/pipelines-page/pipelines-page.component.html @@ -1,26 +1,16 @@ - -
-
-
NO PIPELINES TO SHOW
-
Run your first pipeline to see it displayed here
-
-
- Run this code for a quick example (Requires ClearML 1.3 or above)
- For more details see the documentation - -
-
-
-
-
- +
+ > + + @@ -37,4 +28,31 @@
+ + +
+
+
NO PIPELINES TO SHOW
+
Run your first pipeline to see it displayed here or generate example +
+ + +
+
+ + +
+
+
+
+ Run this code for a quick example (Requires ClearML 1.3 or above)
+ For more details see the documentation +
+
+ +
+
+
diff --git a/src/app/webapp-common/pipelines/pipelines-page/pipelines-page.component.scss b/src/app/webapp-common/pipelines/pipelines-page/pipelines-page.component.scss index 99a76379..cfbd9b04 100644 --- a/src/app/webapp-common/pipelines/pipelines-page/pipelines-page.component.scss +++ b/src/app/webapp-common/pipelines/pipelines-page/pipelines-page.component.scss @@ -26,7 +26,7 @@ .title-icon { color: $blue-600; text-align: center; - margin: 48px 0 24px; + margin: 24px 0; } .title { font-size: 20px; @@ -39,45 +39,51 @@ .sub-title { text-align: center; margin-bottom: 64px; + + .link { + color: $neon-yellow; + } } - .content { + } +} + +.content { + width: 100%; + display: flex; + flex-wrap: wrap; + gap: 24px; + padding-bottom: 24px; + + .code { + min-width: 400px; + display: flex; + flex: 1; + flex-direction: column; + + a.dark { + color: white; + } + + sm-code-editor { + display: block; width: 100%; - display: flex; - flex-wrap: wrap; - gap: 24px; - padding-bottom: 24px; + height: 490px; + margin-top: 6px; + border-radius: 6px; + overflow: hidden; } + } - .code { - min-width: 400px; - display: flex; - flex: 1; - flex-direction: column; + .diagram { + display: flex; + flex: 1; + justify-content: center; + padding-top: 48px; - a { - color: white; - } - - sm-code-editor { - display: block; - width: 100%; - height: 490px; - margin-top: 6px; - border-radius: 6px; - overflow: hidden; - } - } - - .diagram { - display: flex; - flex: 1; - justify-content: center; - - i { - width: 490px; - height: 440px; - } + i { + width: 490px; + height: 440px; } } } diff --git a/src/app/webapp-common/pipelines/pipelines-page/pipelines-page.component.ts b/src/app/webapp-common/pipelines/pipelines-page/pipelines-page.component.ts index 65c93e7d..70d6c6ac 100644 --- a/src/app/webapp-common/pipelines/pipelines-page/pipelines-page.component.ts +++ b/src/app/webapp-common/pipelines/pipelines-page/pipelines-page.component.ts @@ -1,14 +1,19 @@ -import {Component, OnDestroy, OnInit} from '@angular/core'; +import {Component, OnDestroy, OnInit, TemplateRef, ViewChild} from '@angular/core'; import { pageSize } from '@common/projects/common-projects.consts'; import {CommonProjectsPageComponent} from '@common/projects/containers/projects-page/common-projects-page.component'; -import { isExample } from '@common/shared/utils/shared-utils'; +import {isExample} from '@common/shared/utils/shared-utils'; import {trackById} from '@common/shared/utils/forms-track-by'; import {addProjectTags, getProjectsTags, setSelectedProjectId, setTags} from '@common/core/actions/projects.actions'; import {selectProjectTags} from '@common/core/reducers/projects.reducer'; -import {Observable} from 'rxjs'; +import {Observable, Subscription} from 'rxjs'; import {Project} from '~/business-logic/model/projects/project'; -import { updateProject } from '@common/projects/common-projects.actions'; +import {showExamplePipelines, updateProject} from '@common/projects/common-projects.actions'; import {ProjectsGetAllResponseSingle} from '~/business-logic/model/projects/projectsGetAllResponseSingle'; +import {ConfirmDialogComponent} from '@common/shared/ui-components/overlay/confirm-dialog/confirm-dialog.component'; +import {selectShowPipelineExamples} from '@common/projects/common-projects.reducer'; +import {toggleUserFocus} from '@common/core/actions/layout.actions'; +import {combineLatest} from 'rxjs'; +import {selectShowOnlyUserWork} from '@common/core/reducers/users-reducer'; @Component({ selector: 'sm-pipelines-page', @@ -43,17 +48,28 @@ if __name__ == '__main__': isExample = isExample; trackById = trackById; public projectsTags$: Observable; + public showExamples$: Observable; + + @ViewChild('emptyStateContent') emptyStateRef: TemplateRef; + private headerUserFocusSub: Subscription; ngOnInit() { super.ngOnInit(); - this.store.dispatch(getProjectsTags()) + this.showExamples$ = this.store.select(selectShowPipelineExamples); + this.store.dispatch(getProjectsTags()); this.projectsTags$ = this.store.select(selectProjectTags); + + this.headerUserFocusSub = combineLatest([this.projectsList$, this.showExamples$, this.store.select(selectShowOnlyUserWork)]) + .subscribe(([projects, examplesGenerated, userOnly]) => + this.store.dispatch(toggleUserFocus({show: userOnly && (projects?.length === 0 || this.allExamples && !examplesGenerated)}))); } ngOnDestroy() { super.ngOnDestroy(); + this.headerUserFocusSub?.unsubscribe(); this.store.dispatch(setTags({tags: []})); + this.store.dispatch(toggleUserFocus({show: false})); } addTag(project: Project, newTag: string) { @@ -78,6 +94,27 @@ if __name__ == '__main__': } protected getName() { - return 'pipelines'; + return 'pipeline'; + } + + protected getDeletePopupEntitiesList() { + return 'runs'; + } + + createPipeline() { + this.dialog.open(ConfirmDialogComponent, { + data: { + title: 'CREATE NEW PIPELINE', + template: this.emptyStateRef, + iconClass: 'al-icon al-ico-pipelines al-color blue-300', + width: 1200 + }, + maxWidth: '95vw' + }); + +} + + createExamples() { + this.store.dispatch(showExamplePipelines()); } } diff --git a/src/app/webapp-common/pipelines/pipelines.module.ts b/src/app/webapp-common/pipelines/pipelines.module.ts index 1bb8c83a..4332b2ff 100644 --- a/src/app/webapp-common/pipelines/pipelines.module.ts +++ b/src/app/webapp-common/pipelines/pipelines.module.ts @@ -1,33 +1,59 @@ -import {NgModule} from '@angular/core'; +import {InjectionToken, NgModule} from '@angular/core'; import {CommonModule} from '@angular/common'; import {PipelinesPageComponent} from './pipelines-page/pipelines-page.component'; -import {PipelineCardComponent} from './pipeline-card/pipeline-card.component'; import {UiComponentsModule} from '@common/shared/ui-components/ui-components.module'; import {SMSharedModule} from '@common/shared/shared.module'; -import {PipelineCardMenuComponent} from './pipeline-card-menu/pipeline-card-menu.component'; import {CommonProjectsModule} from '@common/projects/common-projects.module'; -import {StoreModule} from '@ngrx/store'; -import {projectsReducer} from '~/features/projects/projects.reducer'; +import {StoreConfig, StoreModule} from '@ngrx/store'; +import {IProjectsState, projectsReducer} from '~/features/projects/projects.reducer'; import {RouterModule, Routes} from '@angular/router'; +import {ProjectsSharedModule} from '~/features/projects/shared/projects-shared.module'; +import {merge} from 'lodash/fp'; export const routes: Routes = [ { path: '', component: PipelinesPageComponent } ]; +export const pipelinesSyncedKeys = [ + 'projects.showPipelineExamples', +]; + +export const PIPELINES_CONFIG_TOKEN = + new InjectionToken>('PipelineConfigToken'); + +const localStorageKey = '_saved_pipeline_state_'; + +const getPipelineConfig = () => ({ + metaReducers: [reducer => { + let onInit = true; + return (state, action) => { + const nextState = reducer(state, action); + if (onInit) { + onInit = false; + const savedState = JSON.parse(localStorage.getItem(localStorageKey)); + return merge(nextState, savedState); + } + return nextState; + }; + }] +}); + @NgModule({ declarations: [ PipelinesPageComponent, - PipelineCardComponent, - PipelineCardMenuComponent, ], imports: [ CommonModule, UiComponentsModule, SMSharedModule, CommonProjectsModule, - StoreModule.forFeature('projects', projectsReducer), + ProjectsSharedModule, + StoreModule.forFeature('projects', projectsReducer, PIPELINES_CONFIG_TOKEN), RouterModule.forChild(routes) + ], + providers: [ + {provide: PIPELINES_CONFIG_TOKEN, useFactory: getPipelineConfig} ] }) export class PipelinesModule { } diff --git a/src/app/webapp-common/projects/common-projects.actions.ts b/src/app/webapp-common/projects/common-projects.actions.ts index fcf61d21..8ad76d59 100644 --- a/src/app/webapp-common/projects/common-projects.actions.ts +++ b/src/app/webapp-common/projects/common-projects.actions.ts @@ -52,3 +52,4 @@ export const setTableModeAwareness = createAction( PROJECTS_PREFIX + '[set table mode awareness]', props<{awareness: boolean}>() ); +export const showExamplePipelines = createAction(PROJECTS_PREFIX + '[show pipelines examples]') diff --git a/src/app/webapp-common/projects/common-projects.effects.ts b/src/app/webapp-common/projects/common-projects.effects.ts index 9949bb4e..5f23f6d5 100644 --- a/src/app/webapp-common/projects/common-projects.effects.ts +++ b/src/app/webapp-common/projects/common-projects.effects.ts @@ -6,7 +6,7 @@ import {activeLoader, deactivateLoader, setServerError} from '../core/actions/la import { addToProjectsList, getAllProjectsPageProjects, updateProject, setCurrentScrollId, setNoMoreProjects, setProjectsOrderBy, - setProjectsSearchQuery, updateProjectSuccess + setProjectsSearchQuery, updateProjectSuccess, showExamplePipelines } from './common-projects.actions'; import { selectProjectsOrderBy, selectProjectsScrollId, selectProjectsSearchQuery, selectProjectsSortOrder @@ -17,8 +17,6 @@ import {ProjectsGetAllExRequest} from '~/business-logic/model/projects/projectsG import {escapeRegex, isExample} from '../shared/utils/shared-utils'; import {catchError, debounceTime, map, mergeMap, switchMap, withLatestFrom} from 'rxjs/operators'; import {get} from 'lodash/fp'; -import {ApiTasksService} from '~/business-logic/api-services/tasks.service'; -import {ApiModelsService} from '~/business-logic/api-services/models.service'; import {pageSize} from './common-projects.consts'; import {selectRouterParams} from '../core/reducers/router-reducer'; import {selectCurrentUser, selectShowOnlyUserWork} from '../core/reducers/users-reducer'; @@ -36,10 +34,8 @@ export class CommonProjectsEffects { constructor( private actions: Actions, public projectsApi: ApiProjectsService, - public experimentsApi: ApiTasksService, public modelsApi: ApiModelsService, - private store: Store, private route: ActivatedRoute - ) { - } + private store: Store, private route: ActivatedRoute, + ) {} activeLoader = createEffect(() => this.actions.pipe( ofType(updateProject, getAllProjectsPageProjects), @@ -76,7 +72,6 @@ export class CommonProjectsEffects { getAllProjects = createEffect(() => this.actions.pipe( ofType(getAllProjectsPageProjects), - debounceTime(10), withLatestFrom( this.store.select(selectProjectsOrderBy), this.store.select(selectProjectsSortOrder), @@ -98,7 +93,8 @@ export class CommonProjectsEffects { return forkJoin([ this.projectsApi.projectsGetAllEx({ stats_for_state: ProjectsGetAllExRequest.StatsForStateEnum.Active, - ...(pipelines && {include_stats_filter: {system_tags: ['pipeline', '-archive']}}), + ...((!showHidden && !pipelines) && {include_stats_filter: {system_tags: ['-pipeline']}}), + ...((pipelines) && {include_stats_filter: {system_tags: ['pipeline'], type:['controller']}}), include_stats: true, shallow_search: !pipelines && !searchQuery?.query, ...(selectedProjectId && {parent: [selectedProjectId]}), @@ -155,8 +151,13 @@ export class CommonProjectsEffects { mergeMap(() => [getAllProjectsPageProjects({})]) )); + showExamplePipeline = createEffect(() => this.actions.pipe( + ofType(showExamplePipelines), + map(() => localStorage.setItem('_saved_pipeline_state_', JSON.stringify({showPipelineExamples: true}))) + ), {dispatch: false}); + setProjectsSearchQuery = createEffect(() => this.actions.pipe( - ofType(setProjectsSearchQuery.type), + ofType(setProjectsSearchQuery), mergeMap(() => [getAllProjectsPageProjects({})]) )); diff --git a/src/app/webapp-common/projects/common-projects.reducer.ts b/src/app/webapp-common/projects/common-projects.reducer.ts index d02fe452..ed37920f 100644 --- a/src/app/webapp-common/projects/common-projects.reducer.ts +++ b/src/app/webapp-common/projects/common-projects.reducer.ts @@ -6,7 +6,7 @@ import { resetProjectsSearchQuery, resetReadyToDelete, setCurrentScrollId, setNoMoreProjects, setProjectReadyForDeletion, setProjectsOrderBy, setProjectsSearchQuery, - setTableModeAwareness, + setTableModeAwareness, showExamplePipelines, updateProjectSuccess } from './common-projects.actions'; import {ICommonSearchState} from '../common-search/common-search.reducer'; @@ -29,6 +29,7 @@ export interface ICommonProjectsState { noMoreProjects: boolean; scrollId: string; tableModeAwareness: boolean; + showPipelineExamples: boolean; } export const commonProjectsInitState: ICommonProjectsState = { @@ -47,6 +48,7 @@ export const commonProjectsInitState: ICommonProjectsState = { noMoreProjects: true, scrollId: null, tableModeAwareness: true, + showPipelineExamples: false, }; const getCorrectSortingOrder = (currentSortOrder: TableSortOrderEnum, currentOrderField: string, nextOrderField: string) => { @@ -91,8 +93,11 @@ export const commonProjectsReducers = [ } })), on(resetReadyToDelete, state => ({...state, projectReadyForDeletion: commonProjectsInitState.projectReadyForDeletion})), - on(setProjectReadyForDeletion, (state, action) => ({...state, projectReadyForDeletion: {...state.projectReadyForDeletion, ...action.readyForDeletion}})), - on(setTableModeAwareness, (state, action) => ({...state, tableModeAwareness: (action as ReturnType).awareness})), + on(setProjectReadyForDeletion, (state, action) => + ({...state, projectReadyForDeletion: {...state.projectReadyForDeletion, ...action.readyForDeletion}})), + on(setTableModeAwareness, (state, action) => + ({...state, tableModeAwareness: (action as ReturnType).awareness})), + on(showExamplePipelines, state => ({...state, showPipelineExamples: true})), ] as ReducerTypes[]; export const commonProjectsReducer = createReducer(commonProjectsInitState, ...commonProjectsReducers); @@ -110,3 +115,4 @@ export const selectProjectForDelete = createSelector(projects, state => [state?. export const selectNoMoreProjects = createSelector(projects, state => state.noMoreProjects); export const selectProjectsScrollId = createSelector(projects, (state): string => state?.scrollId || null); export const selectTableModeAwareness = createSelector(projects, state => state?.tableModeAwareness); +export const selectShowPipelineExamples = createSelector(projects, state => state?.showPipelineExamples); diff --git a/src/app/webapp-common/projects/containers/projects-page/common-projects-page.component.html b/src/app/webapp-common/projects/containers/projects-page/common-projects-page.component.html index c09b54bd..a904061f 100644 --- a/src/app/webapp-common/projects/containers/projects-page/common-projects-page.component.html +++ b/src/app/webapp-common/projects/containers/projects-page/common-projects-page.component.html @@ -3,16 +3,19 @@ (loadMore)="loadMore()" (projectCardClicked)="projectCardClicked($event)" (projectNameChanged)="projectNameChanged($event)" - (createNewProjectClicked)="openProjectDialog($event, 'create')" - (moveToClicked)="openProjectDialog($event, 'move')" + (createNewProjectClicked)="openProjectDialog('create', $event)" + (moveToClicked)="openProjectDialog('move', $event)" [noMoreProjects]="noMoreProjects$ | async" [projects]="projectsList$ | async" > + > + + diff --git a/src/app/webapp-common/projects/containers/projects-page/common-projects-page.component.ts b/src/app/webapp-common/projects/containers/projects-page/common-projects-page.component.ts index 7dd20c08..967b11f2 100644 --- a/src/app/webapp-common/projects/containers/projects-page/common-projects-page.component.ts +++ b/src/app/webapp-common/projects/containers/projects-page/common-projects-page.component.ts @@ -28,7 +28,7 @@ import { distinctUntilKeyChanged, filter, map, - skip, + skip, tap, withLatestFrom } from 'rxjs/operators'; import {ConfirmDialogComponent} from '@common/shared/ui-components/overlay/confirm-dialog/confirm-dialog.component'; @@ -86,22 +86,24 @@ export class CommonProjectsPageComponent implements OnInit, OnDestroy { public projectsSortOrder$: Observable<1 | -1>; public searching: boolean; public selectedProjectId$: Observable; + public allExamples: boolean; /* eslint-enable @typescript-eslint/naming-convention */ private searchSubs: Subscription; private projectReadyForDeletion$: Observable; private projectReadyForDeletionSub: Subscription; private readonly searchQuery$: Observable; private projectDialog: MatDialogRef; - private showOnlyUserWorkSub$: Subscription; + private showOnlyUserWorkSub: Subscription; private selectedProjectSub: Subscription; private selectedProject$: Observable; private selectedProjectIdSub: Subscription; + private projectId: string; constructor( protected store: Store, protected router: Router, protected route: ActivatedRoute, - private dialog: MatDialog + protected dialog: MatDialog ) { this.searchQuery$ = this.store.select(selectSearchQuery); this.projectsOrderBy$ = this.store.select(selectProjectsOrderBy); @@ -122,6 +124,7 @@ export class CommonProjectsPageComponent implements OnInit, OnDestroy { withLatestFrom(this.selectedProjectId$, this.searchQuery$), map(([[projectsList, selectedProject], selectedProjectId, searchQuery]) => { this.searching = searchQuery?.query.length > 0; + this.allExamples = projectsList?.length > 0 && projectsList?.every(project => isExample(project)); if (projectsList === null) { return null; } @@ -155,6 +158,7 @@ export class CommonProjectsPageComponent implements OnInit, OnDestroy { this.store.dispatch(getAllProjectsPageProjects({})); this.selectedProjectIdSub = this.selectedProjectId$.pipe( + tap(projectId => this.projectId = projectId), filter(projectId => !projectId), distinctUntilChanged(), ).subscribe(() => { @@ -170,10 +174,12 @@ export class CommonProjectsPageComponent implements OnInit, OnDestroy { this.store.dispatch(resetProjectsSearchQuery()); this.store.dispatch(getAllProjectsPageProjects({})); }); - this.showOnlyUserWorkSub$ = this.store.select(selectShowOnlyUserWork).pipe(skip(1)).subscribe(() => { - this.store.dispatch(resetProjectsSearchQuery()); - this.store.dispatch(getAllProjectsPageProjects({})); - }); + this.showOnlyUserWorkSub = this.store.select(selectShowOnlyUserWork) + .pipe(skip(1)) + .subscribe(() => { + this.store.dispatch(resetProjectsSearchQuery()); + this.store.dispatch(getAllProjectsPageProjects({})); + }); this.projectReadyForDeletionSub = this.projectReadyForDeletion$.subscribe(readyForDeletion => { if (isDeletableProject(readyForDeletion)) { @@ -184,13 +190,22 @@ export class CommonProjectsPageComponent implements OnInit, OnDestroy { }); } + protected getDeletePopupEntitiesList() { + return getDeletePopupEntitiesList(); + } + private showConfirmDialog(readyForDeletion: CommonProjectReadyForDeletion) { + const name = this.getName(); const confirmDialogRef: MatDialogRef = this.dialog.open(ConfirmDialogComponent, { data: { - title: `Unable to Delete Project`, - body: `You cannot delete project "${readyForDeletion.project.name}" with un-archived ${getDeletePopupEntitiesList()}.
- You have: ${getDeleteProjectPopupStatsBreakdown(readyForDeletion, 'unarchived')} in this project.
- If you wish to delete this project, you must archive, delete, or move these items to another project.`, + title: `Unable to Delete ${name[0].toUpperCase()}${name.slice(1)}`, + body: `You cannot delete ${name} "${readyForDeletion.project.name}" with un-archived ${this.getDeletePopupEntitiesList()}.
+ You have: ${getDeleteProjectPopupStatsBreakdown( + readyForDeletion, + 'unarchived', + name === 'project' ? 'experiments' : 'runs' + )} in this ${name}.
+ If you wish to delete this ${name}, you must archive${name === 'project' ? ', delete, or move': ' or delete'} these items to another ${name}.`, no: 'OK', iconClass: 'i-alert', } @@ -223,7 +238,7 @@ export class CommonProjectsPageComponent implements OnInit, OnDestroy { ngOnDestroy() { this.stopSyncSearch(); this.projectReadyForDeletionSub.unsubscribe(); - this.showOnlyUserWorkSub$.unsubscribe(); + this.showOnlyUserWorkSub.unsubscribe(); this.selectedProjectSub.unsubscribe(); this.selectedProjectIdSub.unsubscribe(); this.store.dispatch(resetReadyToDelete()); @@ -237,7 +252,7 @@ export class CommonProjectsPageComponent implements OnInit, OnDestroy { syncAppSearch() { - this.store.dispatch(new InitSearch(`Search for ${this.getName()}`)); + this.store.dispatch(new InitSearch(`Search for ${this.getName()}s`)); this.searchSubs = this.searchQuery$.pipe(skip(1)).subscribe(query => this.search(query)); } @@ -272,7 +287,7 @@ export class CommonProjectsPageComponent implements OnInit, OnDestroy { } - openProjectDialog(projectId?: string, mode?: string) { + openProjectDialog(mode?: string, projectId?: string) { this.projectDialog = this.dialog.open(ProjectDialogComponent, { data: { mode, @@ -288,7 +303,7 @@ export class CommonProjectsPageComponent implements OnInit, OnDestroy { }); } - protected getName() { - return 'projects'; + protected getName(): string { + return 'project'; } } diff --git a/src/app/webapp-common/projects/dumb/projects-header/projects-header.component.html b/src/app/webapp-common/projects/dumb/projects-header/projects-header.component.html index 6e4c54b3..c3f58609 100644 --- a/src/app/webapp-common/projects/dumb/projects-header/projects-header.component.html +++ b/src/app/webapp-common/projects/dumb/projects-header/projects-header.component.html @@ -7,9 +7,6 @@
- +
diff --git a/src/app/webapp-common/projects/dumb/projects-header/projects-header.component.ts b/src/app/webapp-common/projects/dumb/projects-header/projects-header.component.ts index decf7c46..3334ad3e 100644 --- a/src/app/webapp-common/projects/dumb/projects-header/projects-header.component.ts +++ b/src/app/webapp-common/projects/dumb/projects-header/projects-header.component.ts @@ -1,5 +1,5 @@ import {Component, EventEmitter, Input, Output, ViewChild} from '@angular/core'; -import {TableSortOrderEnum} from '../../../shared/ui-components/data/table/table.consts'; +import {TableSortOrderEnum} from '@common/shared/ui-components/data/table/table.consts'; @Component({ selector: 'sm-projects-header', @@ -9,7 +9,6 @@ import {TableSortOrderEnum} from '../../../shared/ui-components/data/table/table export class ProjectsHeaderComponent { @Input() searchQuery: string; @Input() sortOrder: TableSortOrderEnum; - @Input() selectedProject; @Input() set sortByField(sortByField: string) { this.sortByTitle = sortByField.includes('name') ? 'NAME' : 'RECENT'; @@ -17,7 +16,6 @@ export class ProjectsHeaderComponent { @Output() orderByChanged = new EventEmitter(); @Output() searchChanged = new EventEmitter(); - @Output() createProjectClicked = new EventEmitter(); @ViewChild('menu') vcDropDownMenu; public sortByTitle: string; } diff --git a/src/app/webapp-common/select-model/select-model.actions.ts b/src/app/webapp-common/select-model/select-model.actions.ts index ed00167b..477c7f1b 100644 --- a/src/app/webapp-common/select-model/select-model.actions.ts +++ b/src/app/webapp-common/select-model/select-model.actions.ts @@ -61,7 +61,7 @@ export class RemoveModels implements Action { export class UpdateModel implements Action { readonly type = UPDATE_ONE_MODELS; - constructor(public payload: { id: TableModel['id'], changes: Partial }) { + constructor(public payload: { id: TableModel['id']; changes: Partial }) { } } @@ -101,7 +101,7 @@ export const setCurrentScrollId = createAction( props<{scrollId: string}>() ); -export class ArchivAllProjectsdModeChanged implements Action { +export class AllProjectsModeChanged implements Action { public type = ALL_PROJECTS_MODE_CHANGED; constructor(public payload: boolean) { diff --git a/src/app/webapp-common/select-model/select-model.component.ts b/src/app/webapp-common/select-model/select-model.component.ts index 6793003b..7fd095d8 100644 --- a/src/app/webapp-common/select-model/select-model.component.ts +++ b/src/app/webapp-common/select-model/select-model.component.ts @@ -19,13 +19,13 @@ import {SelectedModel} from '../models/shared/models.model'; import {MODELS_TABLE_COLS, ModelsViewModesEnum} from '../models/models.consts'; import {FilterMetadata} from 'primeng/api/filtermetadata'; import { + selectAllProjectsUsers, selectProjectSystemTags, - selectProjectTags, + selectProjectUsers, selectRootProjects, selectSelectedProject } from '../core/reducers/projects.reducer'; -import {getTags} from '../core/actions/projects.actions'; -import {selectModelsFrameworks, selectModelsTags, selectModelsUsers} from '../models/reducers'; +import {selectModelsFrameworks, selectModelsTags} from '../models/reducers'; import {User} from '~/business-logic/model/users/user'; import * as modelsActions from '../models/actions/models-view.actions'; import {SortMeta} from 'primeng/api'; @@ -66,7 +66,11 @@ export class SelectModelComponent implements OnInit, OnDestroy { this.searchValue$ = this.store.select(selectGlobalFilter); this.noMoreModels$ = this.store.select(selectNoMoreModels); this.isAllProjects$ = this.store.select(selectIsAllProjectsMode); - this.users$ = this.store.select(selectModelsUsers); + this.users$ = combineLatest([ + this.isAllProjects$, + this.store.select(selectProjectUsers), + this.store.select(selectAllProjectsUsers), + ]).pipe(map(([all, projUsers, allUsers]) => all ? allUsers : projUsers)); this.tags$ = this.store.select(selectModelsTags); this.systemTags$ = this.store.select(selectProjectSystemTags); this.selectedProject$ = this.store.select(selectSelectedProject); @@ -77,7 +81,7 @@ export class SelectModelComponent implements OnInit, OnDestroy { if (isAllProjectsMode) { return rootProjects; } else { - return [selectedProject].concat(selectedProject?.sub_projects ?? []) + return [selectedProject].concat(selectedProject?.sub_projects ?? []); } } else { return []; @@ -89,7 +93,6 @@ export class SelectModelComponent implements OnInit, OnDestroy { ngOnInit() { this.store.dispatch(new actions.GetNextModels()); - this.store.dispatch(modelsActions.getUsersForAllProjects()); this.store.dispatch(modelsActions.getAllProjectsFrameworks()); this.store.dispatch(modelsActions.getTagsForAllProjects()); window.setTimeout(() => this.table.table.rowRightClick = new EventEmitter()); @@ -127,8 +130,7 @@ export class SelectModelComponent implements OnInit, OnDestroy { } onIsAllProjectsChanged(isAllProjects: boolean) { - this.store.dispatch(new actions.ArchivAllProjectsdModeChanged(isAllProjects)); - isAllProjects? this.store.dispatch(modelsActions.getUsersForAllProjects()): this.store.dispatch(modelsActions.getUsers()); + this.store.dispatch(new actions.AllProjectsModeChanged(isAllProjects)); isAllProjects? this.store.dispatch(modelsActions.getTagsForAllProjects()): this.store.dispatch(modelsActions.getTags()); isAllProjects? this.store.dispatch(modelsActions.getAllProjectsFrameworks()): this.store.dispatch(modelsActions.getFrameworks()); } diff --git a/src/app/webapp-common/select-model/select-model.reducer.ts b/src/app/webapp-common/select-model/select-model.reducer.ts index 6281d2f7..8374b2bf 100644 --- a/src/app/webapp-common/select-model/select-model.reducer.ts +++ b/src/app/webapp-common/select-model/select-model.reducer.ts @@ -1,13 +1,12 @@ import {createFeatureSelector, createSelector} from '@ngrx/store'; -import {MODELS_VIEW_MODES, ModelsViewModesEnum} from '../../webapp-common/models/models.consts'; -import {TABLE_SORT_ORDER} from '../../webapp-common/shared/ui-components/data/table/table.consts'; -import {SelectedModel} from '../../webapp-common/models/shared/models.model'; -import {MODELS_TABLE_COL_FIELDS} from '../../webapp-common/models/shared/models.const'; +import {MODELS_VIEW_MODES, ModelsViewModesEnum} from '@common/models/models.consts'; +import {TABLE_SORT_ORDER} from '@common/shared/ui-components/data/table/table.consts'; +import {SelectedModel} from '@common/models/shared/models.model'; +import {MODELS_TABLE_COL_FIELDS} from '@common/models/shared/models.const'; import * as actions from './select-model.actions'; import {FilterMetadata} from 'primeng/api/filtermetadata'; import {SortMeta} from 'primeng/api'; -import {setCurrentScrollId} from './select-model.actions'; export interface SelectModelState { models: SelectedModel[]; diff --git a/src/app/webapp-common/settings/admin/admin-credential-table.base.ts b/src/app/webapp-common/settings/admin/admin-credential-table.base.ts index ea9ff338..57cb0b93 100644 --- a/src/app/webapp-common/settings/admin/admin-credential-table.base.ts +++ b/src/app/webapp-common/settings/admin/admin-credential-table.base.ts @@ -1,14 +1,17 @@ -import { EventEmitter, Input, Output, Directive } from '@angular/core'; -import { MatDialog, MatDialogRef } from '@angular/material/dialog'; +import {EventEmitter, Input, Output, Directive} from '@angular/core'; +import {MatDialog, MatDialogRef} from '@angular/material/dialog'; import {ConfirmDialogComponent} from '../../shared/ui-components/overlay/confirm-dialog/confirm-dialog.component'; -import { ICONS } from '../../constants'; +import {ICONS} from '../../constants'; import {CredentialKey} from '../../../business-logic/model/auth/credentialKey'; +import {EditCredentialLabelDialogComponent} from '@common/shared/ui-components/overlay/edit-credential-label-dialog/edit-credential-label-dialog.component'; +import {CredentialKeyExt} from '@common/core/reducers/common-auth-reducer'; @Directive() export class AdminCredentialTableBaseDirective { @Input() credentials: CredentialKey[]; @Output() credentialRevoked = new EventEmitter(); - public ICONS = ICONS; + @Output() updateCredentialLabel = new EventEmitter<{ credential: CredentialKeyExt, label: string }>(); + public ICONS = ICONS; public dialog: MatDialog; constructor(dialog: MatDialog) { @@ -18,11 +21,11 @@ export class AdminCredentialTableBaseDirective { confirmPopUp(credential) { const confirmDialogRef: MatDialogRef = this.dialog.open(ConfirmDialogComponent, { data: { - title : 'Are you sure?', - body : `Are you sure you want to revoke the ${credential.label || ''} credentials (${credential.access_key})?
\n + title: 'Are you sure?', + body: `Are you sure you want to revoke the ${credential.label || ''} credentials (${credential.access_key})?
\n Once revoked, these credentials cannot be recovered.`, - yes : 'Revoke', - no : 'Cancel', + yes: 'Revoke', + no: 'Cancel', iconClass: 'i-alert', } }); @@ -34,4 +37,22 @@ export class AdminCredentialTableBaseDirective { }); } + editLabel(credential: CredentialKey) { + this.dialog.open(EditCredentialLabelDialogComponent, { + data: { + label: credential.label, + title: 'EDIT LABEL', + yes: ' SAVE ', + no: 'CANCEL', + iconClass: 'al-icon al-ico-access-key', + width: '200px', + 'max-width': '200px' + } + }).afterClosed().subscribe((label) => { + if (label !== null) { + this.updateCredentialLabel.emit({credential, label: label || null}); + } + }); + } + } diff --git a/src/app/webapp-common/settings/admin/admin-credential-table/admin-credential-table.component.html b/src/app/webapp-common/settings/admin/admin-credential-table/admin-credential-table.component.html index ffef396d..6b0c74bd 100644 --- a/src/app/webapp-common/settings/admin/admin-credential-table/admin-credential-table.component.html +++ b/src/app/webapp-common/settings/admin/admin-credential-table/admin-credential-table.component.html @@ -14,8 +14,11 @@ {{credential.access_key}} {{credential?.last_used ? (credential.last_used | date : TIME_FORMAT_STRING): 'Never'}} {{credential?.last_used_from ? credential?.last_used_from : 'Not available'}} - -
+ +
+ +
+
diff --git a/src/app/webapp-common/settings/admin/admin-credential-table/admin-credential-table.component.scss b/src/app/webapp-common/settings/admin/admin-credential-table/admin-credential-table.component.scss index 26f59335..14ed0a58 100644 --- a/src/app/webapp-common/settings/admin/admin-credential-table/admin-credential-table.component.scss +++ b/src/app/webapp-common/settings/admin/admin-credential-table/admin-credential-table.component.scss @@ -5,6 +5,22 @@ table.admin-table { margin-top: 10px; } +.actions { + width: 102px; +} + +.action-button { + color: $blue-200; + visibility: hidden; + opacity: 0; + transition: opacity 0.2s, visibility 0.2s; + + &:hover { + color: #ffffff; + transition: color 0.2s; + } +} + thead { font-size: 12px; color: $blue-400; @@ -38,6 +54,13 @@ thead { tbody { tr { border-bottom: solid 1px $blue-500; + &:hover { + background-color: $blue-650; + .action-button { + visibility: visible; + opacity: 1; + } + } td { color: $blue-250; @@ -52,13 +75,5 @@ tbody { max-width: 400px; } } - } } - -.delete-button { - display: flex; - align-items: center; - color: $light-grey-blue; -} - diff --git a/src/app/webapp-common/settings/admin/admin-credential-table/admin-credential-table.component.ts b/src/app/webapp-common/settings/admin/admin-credential-table/admin-credential-table.component.ts index 6312300b..7fc1661b 100644 --- a/src/app/webapp-common/settings/admin/admin-credential-table/admin-credential-table.component.ts +++ b/src/app/webapp-common/settings/admin/admin-credential-table/admin-credential-table.component.ts @@ -1,7 +1,7 @@ import {Component} from '@angular/core'; import {MatDialog} from '@angular/material/dialog'; import {AdminCredentialTableBaseDirective} from '../admin-credential-table.base'; -import {TIME_FORMAT_STRING} from '../../../constants'; +import {TIME_FORMAT_STRING} from '@common/constants'; @Component({ diff --git a/src/app/webapp-common/settings/admin/admin-dialog-template/admin-dialog-template.component.html b/src/app/webapp-common/settings/admin/admin-dialog-template/admin-dialog-template.component.html index 79444cc3..ce2c54d9 100644 --- a/src/app/webapp-common/settings/admin/admin-dialog-template/admin-dialog-template.component.html +++ b/src/app/webapp-common/settings/admin/admin-dialog-template/admin-dialog-template.component.html @@ -1,30 +1,12 @@ -
-
- - Label (optional) - - -
-
-
- +
-
- Label - {{newCredential.label}} -
Access key - {{newCredential.access_key}} + {{newCredential?.access_key}}
Secret key - {{newCredential.secret_key}} + {{newCredential?.secret_key}}
@@ -33,16 +15,16 @@
api {{ '{' }} web_server: {{WEB_SERVER_URL}} - api_server: {{API_BASE_URL}} - files_server: {{fileBaseUrl}} - {{'# ' + label}} + api_server: {{displayedServerUrls?.apiServer || API_BASE_URL}} + files_server: {{displayedServerUrls?.filesServer || fileBaseUrl}} + {{'# ' + newCredential?.label}} credentials {{ '{' }} - "access_key" = "{{newCredential.access_key}}" - "secret_key" = "{{newCredential.secret_key}}" + "access_key" = "{{newCredential?.access_key}}" + "secret_key" = "{{newCredential?.secret_key}}" } }
- +
+ + + + +
diff --git a/src/app/webapp-common/settings/admin/admin-dialog-template/admin-dialog-template.component.scss b/src/app/webapp-common/settings/admin/admin-dialog-template/admin-dialog-template.component.scss index 43fc82b6..543bad00 100644 --- a/src/app/webapp-common/settings/admin/admin-dialog-template/admin-dialog-template.component.scss +++ b/src/app/webapp-common/settings/admin/admin-dialog-template/admin-dialog-template.component.scss @@ -26,23 +26,12 @@ } .credentials-and-code { - height: 384px; + max-height: 384px; overflow: hidden; - transition: height 1s ease; + transition: max-height 1s ease; &.small-popup { - height: 0; - } - } - - .cred-visible { - visibility: visible; - opacity: 1; - transition: height 1s ease, opacity 1s ease; - - &.invisible { - visibility: hidden; - opacity: 0; + max-height: 0; } } @@ -56,7 +45,7 @@ position: relative; line-height: 1.5; padding: 16px 16px; - margin-bottom: 12px; + margin-bottom: 24px; width: 530px; color: $blue-100; background-color: $blue-700; @@ -110,3 +99,19 @@ } } } + +form { + display: flex; +} + +.label-input { + display: inline-block; + width: 452px; + margin-right: 12px; +} + +.label-button { + height: 38px; + flex: 1 0 152px; + margin-top: 3px; +} diff --git a/src/app/webapp-common/settings/admin/admin-dialog-template/admin-dialog-template.component.ts b/src/app/webapp-common/settings/admin/admin-dialog-template/admin-dialog-template.component.ts index fcb1dddc..5f122a08 100644 --- a/src/app/webapp-common/settings/admin/admin-dialog-template/admin-dialog-template.component.ts +++ b/src/app/webapp-common/settings/admin/admin-dialog-template/admin-dialog-template.component.ts @@ -1,8 +1,8 @@ -import {ChangeDetectionStrategy, Component, EventEmitter, Input, Output} from '@angular/core'; +import {ChangeDetectionStrategy, Component, EventEmitter, Input, OnInit, Output} from '@angular/core'; import {guessAPIServerURL, HTTP} from '../../../../app.constants'; import {CredentialKeyExt} from '../../../core/reducers/common-auth-reducer'; -import {MatDialogRef} from '@angular/material/dialog'; -import {CreateCredentialDialogComponent} from '../../../../features/settings/containers/admin/create-credential-dialog/create-credential-dialog.component'; +import {ConfigurationService} from '../../../shared/services/configuration.service'; + @Component({ selector: 'sm-admin-dialog-template', @@ -10,10 +10,9 @@ import {CreateCredentialDialogComponent} from '../../../../features/settings/con styleUrls: ['./admin-dialog-template.component.scss'], changeDetection: ChangeDetectionStrategy.OnPush }) -export class AdminDialogTemplateComponent { +export class AdminDialogTemplateComponent implements OnInit{ public clipboardText: string; public label: string; - public credentialsCreated: boolean; API_BASE_URL = HTTP.API_BASE_URL_NO_VERSION; fileBaseUrl = HTTP.FILE_BASE_URL; @@ -21,20 +20,21 @@ export class AdminDialogTemplateComponent { @Input() newCredential: CredentialKeyExt; - @Output() onCreateCredentials = new EventEmitter<{label: string}>(); + @Output() updateLabel = new EventEmitter<{ credential: CredentialKeyExt; label: string }>(); + public displayedServerUrls: { apiServer?: string; filesServer?: string }; - constructor(private dialog: MatDialogRef) { + constructor(private configService: ConfigurationService) { if (this.API_BASE_URL === '/api') { this.API_BASE_URL = guessAPIServerURL(); } } - createCredentials() { - this.credentialsCreated = true; - this.onCreateCredentials.emit({label: this.label}); + onUpdateLabel() { + this.updateLabel.emit({credential: this.newCredential, label: this.label}); } - close() { - this.dialog.close(); + ngOnInit(): void { + this.displayedServerUrls = this.configService.getStaticEnvironment().displayedServerUrls; + } } diff --git a/src/app/webapp-common/shared/components/charts/donut/donut.component.scss b/src/app/webapp-common/shared/components/charts/donut/donut.component.scss index 50228bf4..ec6a64d4 100644 --- a/src/app/webapp-common/shared/components/charts/donut/donut.component.scss +++ b/src/app/webapp-common/shared/components/charts/donut/donut.component.scss @@ -10,7 +10,9 @@ tspan:nth-child(3) { stroke: $blue-800; - stroke-width: 0.3px; + stroke-width: 0.5px; + font-weight: 500; + pointer-events: none; } } } @@ -22,8 +24,15 @@ } .donut-legend { - height: 673px; - overflow: auto; + width: 260px; + height: calc(100% - 24px); + overflow-x: hidden; + overflow-y: auto; + margin: 12px 0 0 -16px; +} + +.donut-container { + flex: 1; } ::ng-deep .britechart-legend .legend-entry.is-faded .legend-entry-name { diff --git a/src/app/webapp-common/shared/components/charts/donut/donut.component.ts b/src/app/webapp-common/shared/components/charts/donut/donut.component.ts index e51ceeb1..d929f991 100644 --- a/src/app/webapp-common/shared/components/charts/donut/donut.component.ts +++ b/src/app/webapp-common/shared/components/charts/donut/donut.component.ts @@ -16,9 +16,9 @@ export interface DonutChartData { @Component({ selector : 'sm-donut', template : `
-
-
-
+
+
+
`, styleUrls : ['./donut.component.scss'], changeDetection: ChangeDetectionStrategy.OnPush @@ -65,19 +65,25 @@ export class DonutComponent implements OnInit { } initLegendChart() { - const rect = this.legendContainer.node().getBoundingClientRect(); - const {width} = rect; - this.legendWidth = width * 0.8; + const {width} = this.legendContainer.node().getBoundingClientRect(); + this.legendWidth = width - 10; - if (rect) { + if (width) { this.legendChart .width(this.legendWidth) + .margin({ + top: 0, + right: 0, + bottom: 0, + left: 0 + }) + .markerSize(12) .numberFormat('l'); } } updateLegend() { - this.legendChart.height(30 + this.donutData?.length * 20); + this.legendChart.height(30 + this.donutData?.length * 24); this.legendContainer.datum(this.donutData).call(this.legendChart); selectAll('.legend-entry').nodes().forEach((node: HTMLElement) => { const text = node.querySelector('.legend-entry-name').textContent; @@ -92,12 +98,24 @@ export class DonutComponent implements OnInit { .attr('id', 'clip-rect') .attr('x', '0') .attr('y', '-10') - .attr('width', this.legendWidth - 100) + .attr('width', this.legendWidth - 80) .attr('height', 20); this.legendContainer.selectAll('.legend-entry-name') + .on('mouseenter', (event, data: DonutChartData) => { + this.donutChart.highlightSliceById(data.id); + this.donutContainer.datum(this.donutData).call(this.donutChart); + }) + .on('mouseleave', (event, data: DonutChartData) => { + if (this.donutChart.highlightSliceById() === data.id) { + this.donutChart.highlightSliceById(null); + this.donutContainer.datum(this.donutData).call(this.donutChart); + } + }) .attr('clip-path', 'url(#legend-label-clip)') .append('title') .text((d: DonutChartData) => d.name); + + } initDonutChart() { diff --git a/src/app/webapp-common/shared/components/experiment-settings/experiment-settings.html b/src/app/webapp-common/shared/components/experiment-settings/experiment-settings.html index 5172b518..e41fc9d6 100644 --- a/src/app/webapp-common/shared/components/experiment-settings/experiment-settings.html +++ b/src/app/webapp-common/shared/components/experiment-settings/experiment-settings.html @@ -1,3 +1,3 @@ - +
+ +
diff --git a/src/app/webapp-common/shared/components/scroll-textarea/scroll-textarea.component.scss b/src/app/webapp-common/shared/components/scroll-textarea/scroll-textarea.component.scss index 16491bd1..48aabc13 100644 --- a/src/app/webapp-common/shared/components/scroll-textarea/scroll-textarea.component.scss +++ b/src/app/webapp-common/shared/components/scroll-textarea/scroll-textarea.component.scss @@ -14,6 +14,7 @@ top: 8px; right: 11px; display: none; + background-color: $blue-900; * { margin: 0 6px; diff --git a/src/app/webapp-common/shared/components/show-only-user-work/show-only-user-work.component.html b/src/app/webapp-common/shared/components/show-only-user-work/show-only-user-work.component.html index 51975558..9866c943 100644 --- a/src/app/webapp-common/shared/components/show-only-user-work/show-only-user-work.component.html +++ b/src/app/webapp-common/shared/components/show-only-user-work/show-only-user-work.component.html @@ -4,8 +4,7 @@ [header]="(showOnlyUserWork$ | async) ? 'My Work': 'Team\`s work'" [prefixIconClass]="'mr-1 al-icon ' + ((showOnlyUserWork$ | async)? 'al-ico-me': 'al-ico-team')" [iconClass]="isUserMenuOpened?'fa fa-caret-up': 'fa fa-caret-down'" class="menu"> - + + iconClass="al-icon al-ico-team"> diff --git a/src/app/webapp-common/shared/components/show-only-user-work/show-only-user-work.component.ts b/src/app/webapp-common/shared/components/show-only-user-work/show-only-user-work.component.ts index 70b89d69..5e61f565 100644 --- a/src/app/webapp-common/shared/components/show-only-user-work/show-only-user-work.component.ts +++ b/src/app/webapp-common/shared/components/show-only-user-work/show-only-user-work.component.ts @@ -1,25 +1,21 @@ -import {Component, OnInit} from '@angular/core'; -import {setFilterByUser} from '../../../core/actions/users.actions'; +import {Component} from '@angular/core'; +import {setFilterByUser} from '@common/core/actions/users.actions'; import {Store} from '@ngrx/store'; import {Observable} from 'rxjs/internal/Observable'; -import {selectShowOnlyUserWork} from '../../../core/reducers/users-reducer'; +import {selectShowOnlyUserWork} from '@common/core/reducers/users-reducer'; @Component({ selector: 'sm-show-only-user-work', templateUrl: './show-only-user-work.component.html', styleUrls: ['./show-only-user-work.component.scss'] }) -export class ShowOnlyUserWorkComponent implements OnInit { +export class ShowOnlyUserWorkComponent { public isUserMenuOpened: boolean; public showOnlyUserWork$: Observable; constructor(private store: Store) { this.showOnlyUserWork$ = this.store.select(selectShowOnlyUserWork); } - - - ngOnInit(): void { - } userFilterChanged(userFiltered: boolean) { this.store.dispatch(setFilterByUser({showOnlyUserWork: userFiltered})); } diff --git a/src/app/webapp-common/shared/entity-page/base-entity-page.ts b/src/app/webapp-common/shared/entity-page/base-entity-page.ts index 44a17e49..2e6971ec 100644 --- a/src/app/webapp-common/shared/entity-page/base-entity-page.ts +++ b/src/app/webapp-common/shared/entity-page/base-entity-page.ts @@ -82,7 +82,7 @@ export abstract class BaseEntityPageComponent implements OnInit, AfterViewInit, if (selectedProject?.id === '*') { return rootProjects; } else { - return [selectedProject].concat(selectedProject?.sub_projects ?? []) + return [selectedProject].concat(selectedProject?.sub_projects ?? []); } } else { return []; @@ -93,7 +93,7 @@ export abstract class BaseEntityPageComponent implements OnInit, AfterViewInit, .pipe( filter(featuresAwareness => featuresAwareness !== null && featuresAwareness !== undefined), tap(aware => this.tableModeAwareness = aware) - ) + ); } ngOnInit() { @@ -145,7 +145,7 @@ export abstract class BaseEntityPageComponent implements OnInit, AfterViewInit, closePanel(queryParams?: Params) { window.setTimeout(() => this.infoDisabled = false); - this.store.dispatch(this.setTableModeAction({mode: 'table'})) + this.store.dispatch(this.setTableModeAction({mode: 'table'})); return this.router.navigate(this.minimizedView ? [{}] : [], { relativeTo: this.route, queryParamsHandling: 'merge', @@ -251,12 +251,10 @@ export abstract class BaseEntityPageComponent implements OnInit, AfterViewInit, } archivedChanged(isArchived: boolean) { - const navigate = () => { - return this.closePanel({archive: isArchived || null}).then(() => { + const navigate = () => this.closePanel({archive: isArchived || null}).then(() => { this.afterArchiveChanged(); this.store.dispatch(resetProjectSelection()); }); - }; if (this.getSelectedEntities().length > 0) { const archiveDialog: MatDialogRef = this.dialog.open(ConfirmDialogComponent, { @@ -284,6 +282,6 @@ export abstract class BaseEntityPageComponent implements OnInit, AfterViewInit, relativeTo: this.route, queryParamsHandling: 'merge', queryParams - }) + }); } } diff --git a/src/app/webapp-common/shared/entity-page/entity-delete/base-delete-dialog.effects.ts b/src/app/webapp-common/shared/entity-page/entity-delete/base-delete-dialog.effects.ts index 6c9e1ff0..e9dbe816 100644 --- a/src/app/webapp-common/shared/entity-page/entity-delete/base-delete-dialog.effects.ts +++ b/src/app/webapp-common/shared/entity-page/entity-delete/base-delete-dialog.effects.ts @@ -201,7 +201,7 @@ export class DeleteDialogEffectsBase { return commutativeUrls.reduce((acc, url) => { const sourceType = this.getSourceType(url); - acc[sourceType].push(url); + url && acc[sourceType].push(url); return acc; }, {fs: [], gc: [], s3: [], azure: [], misc: []}); } diff --git a/src/app/webapp-common/shared/entity-page/entity-delete/common-delete-dialog.component.ts b/src/app/webapp-common/shared/entity-page/entity-delete/common-delete-dialog.component.ts index b68ac2cd..5909324d 100644 --- a/src/app/webapp-common/shared/entity-page/entity-delete/common-delete-dialog.component.ts +++ b/src/app/webapp-common/shared/entity-page/entity-delete/common-delete-dialog.component.ts @@ -2,15 +2,15 @@ import {MAT_DIALOG_DATA, MatDialogRef} from '@angular/material/dialog'; import {Component, Inject, OnDestroy, OnInit} from '@angular/core'; import {Store} from '@ngrx/store'; import {htmlTextShorte} from '../../utils/shared-utils'; -import {Task} from '../../../../business-logic/model/tasks/task'; +import {Task} from '~/business-logic/model/tasks/task'; import {selectEntitiesFailedToDelete, selectFilesFailedToDelete, selectNumberOfSourcesToDelete} from './common-delete-dialog.reducer'; import {Observable} from 'rxjs/internal/Observable'; import {Subject} from 'rxjs'; import {deleteEntities, resetDeleteState} from './common-delete-dialog.actions'; -import {getDeleteProjectPopupStatsBreakdown} from '../../../../features/projects/projects-page.utils'; -import {EntityTypeEnum} from '../../../../shared/constants/non-common-consts'; +import {getDeleteProjectPopupStatsBreakdown} from '~/features/projects/projects-page.utils'; +import {EntityTypeEnum} from '~/shared/constants/non-common-consts'; import {takeUntil, tap} from 'rxjs/operators'; -import {CommonProjectReadyForDeletion} from '../../../projects/common-projects.reducer'; +import {CommonProjectReadyForDeletion} from '@common/projects/common-projects.reducer'; @Component({ @@ -122,7 +122,7 @@ export class CommonDeleteDialogComponent implements OnInit, OnDestroy { return 'This will also remove the model weights file. Note: Experiments using deleted models will no longer be able to run.'; case EntityTypeEnum.project: // eslint-disable-next-line no-case-declarations - const entitiesBreakDown = getDeleteProjectPopupStatsBreakdown(stats, 'total'); + const entitiesBreakDown = getDeleteProjectPopupStatsBreakdown(stats, 'total', 'experiments'); return entitiesBreakDown.trim().length > 0 ? `${entitiesBreakDown} will be deleted, including their artifacts. This may take a few minutes.` : ''; } } diff --git a/src/app/webapp-common/shared/experiment-graphs/experiment-graphs.component.html b/src/app/webapp-common/shared/experiment-graphs/experiment-graphs.component.html index 5e790c1e..d546e929 100644 --- a/src/app/webapp-common/shared/experiment-graphs/experiment-graphs.component.html +++ b/src/app/webapp-common/shared/experiment-graphs/experiment-graphs.component.html @@ -2,11 +2,8 @@

NO CHART DATA

-
-
+
+
chart.layout?.height || 0)); + this.maxUserWidth = Math.max(...Object.values(this.graphsData).flat().map( (chart: ExtFrame) => chart.layout?.width || 0)); + if (this.maxUserHeight) { + this.height = this.maxUserHeight; + } this.calculateGraphsLayout(); Object.values(this.graphsData).forEach((graphs: ExtFrame[]) => { @@ -189,7 +196,7 @@ export class ExperimentGraphsComponent implements OnDestroy { }; this.observer = new IntersectionObserver(this.graphInView.bind(this), options); - // window.setTimeout(() => this.prepareRedraw()); + window.setTimeout(() => this.observeGraphs(), 50); } observeGraphs() { @@ -255,7 +262,7 @@ export class ExperimentGraphsComponent implements OnDestroy { trackByFn = (index: number, item) => item + this.xAxisType; trackByIdFn = (metric: string, index: number, item: ExtFrame) => - metric + item.layout.title + item.iter; + metric + item.layout.title + (this.isDarkTheme ? '' : item.iter); isWidthBigEnough() { return this.el.nativeElement.clientWidth > this.breakPoint; @@ -272,15 +279,18 @@ export class ExperimentGraphsComponent implements OnDestroy { this.timer = window.setTimeout(() => { if (this.allGraphs) { const containerWidth = this.el.nativeElement.clientWidth; - while (containerWidth / this.graphsPerRow < this.minWidth && this.graphsPerRow > 1) { + while (containerWidth / this.graphsPerRow < this.minWidth && this.graphsPerRow > 1 || containerWidth / this.graphsPerRow < this.maxUserWidth) { this.graphsPerRow -= 1; } const width = Math.floor(containerWidth / this.graphsPerRow); this.width = width - 16 / this.graphsPerRow; + this.height = this.maxUserHeight || this.height; if (!this.isGroupGraphs) { this.allMetricGroups.forEach(metricGroup => this.renderer.setStyle(metricGroup.nativeElement, 'width', `${this.width}px`)); + this.allMetricGroups.forEach(metricGroup => this.renderer.setStyle(metricGroup.nativeElement, 'height', `${this.height}px`)); } else { this.allGraphs.forEach(singleGraph => this.renderer.setStyle(singleGraph.elementRef.nativeElement, 'width', `${this.width}px`)); + this.allGraphs.forEach(singleGraph => this.renderer.setStyle(singleGraph.elementRef.nativeElement, 'height', `${this.height}px`)); } } this.prepareRedraw(); diff --git a/src/app/webapp-common/shared/experiment-graphs/experiment-graphs.module.ts b/src/app/webapp-common/shared/experiment-graphs/experiment-graphs.module.ts index 0d43b377..1a09302b 100644 --- a/src/app/webapp-common/shared/experiment-graphs/experiment-graphs.module.ts +++ b/src/app/webapp-common/shared/experiment-graphs/experiment-graphs.module.ts @@ -1,11 +1,10 @@ -import { NgModule } from '@angular/core'; +import {NgModule} from '@angular/core'; import { CommonModule } from '@angular/common'; import {ExperimentGraphsComponent} from './experiment-graphs.component'; import {UiComponentsModule} from '../ui-components/ui-components.module'; import {SingleGraphComponent} from './single-graph/single-graph.component'; import {GraphSettingsBarComponent} from './graph-settings-bar/graph-settings-bar.component'; import { MatSliderModule } from '@angular/material/slider'; -import {PlotlyGraphBase} from './single-graph/plotly-graph-base'; import {FormsModule} from '@angular/forms'; import {ResizableModule} from 'angular-resizable-element'; import {GraphDisplayerComponent} from './graph-displayer/graph-displayer.component'; @@ -15,7 +14,6 @@ import {SharedPipesModule} from '../pipes/shared-pipes.module'; const declarations= [ ExperimentGraphsComponent, - PlotlyGraphBase, SingleGraphComponent, GraphSettingsBarComponent, GraphDisplayerComponent, @@ -23,7 +21,7 @@ const declarations= [ GraphPlotDataToMetric, ]; @NgModule({ - declarations: declarations, + declarations, exports: declarations, imports: [ CommonModule, diff --git a/src/app/webapp-common/shared/experiment-graphs/graph-plot-data-to-metric.pipe.ts b/src/app/webapp-common/shared/experiment-graphs/graph-plot-data-to-metric.pipe.ts index 7f10ddd8..ddf43105 100644 --- a/src/app/webapp-common/shared/experiment-graphs/graph-plot-data-to-metric.pipe.ts +++ b/src/app/webapp-common/shared/experiment-graphs/graph-plot-data-to-metric.pipe.ts @@ -12,7 +12,7 @@ export class GraphPlotDataToMetric implements PipeTransform { transform(metricsPlots: MetricsPlotEvent[], taskId: ITask['id']) { if (metricsPlots) { const groupedPlots = groupIterations(metricsPlots); - return convertPlots({plots: groupedPlots, experimentId: taskId}); + return convertPlots({plots: groupedPlots, experimentId: taskId}).graphs; } return {} as { [title: string]: ExtFrame[] }; } diff --git a/src/app/webapp-common/shared/experiment-graphs/single-graph/plotly-graph-base.ts b/src/app/webapp-common/shared/experiment-graphs/single-graph/plotly-graph-base.ts index 9a973166..b87360d2 100644 --- a/src/app/webapp-common/shared/experiment-graphs/single-graph/plotly-graph-base.ts +++ b/src/app/webapp-common/shared/experiment-graphs/single-graph/plotly-graph-base.ts @@ -1,6 +1,6 @@ import {hslToRgb, rgbToHsl} from '../../services/color-hash/color-hash.utils'; import {Subscription} from 'rxjs'; -import {Input, OnDestroy, Directive} from '@angular/core'; +import {Input, OnDestroy, Component} from '@angular/core'; import {Config, Frame, Layout, LayoutAxis, Legend, PlotData} from 'plotly.js'; import {selectScaleFactor} from '@common/core/reducers/view.reducer'; import {Store} from '@ngrx/store'; @@ -44,20 +44,21 @@ export interface ExtData extends PlotData { colorHash: string; } -@Directive({ - selector: 'base-plotly-graph' +@Component({ + selector: 'sm-base-plotly-graph', + template: '' }) -export class PlotlyGraphBase implements OnDestroy { +export abstract class PlotlyGraphBaseComponent implements OnDestroy { + protected sub = new Subscription(); + protected colorSub: Subscription; public isSmooth = false; - public colorSub: Subscription; public scaleFactor: number; @Input() isCompare: boolean = false; - private scaleSub: Subscription; - constructor(protected store: Store) { - this.scaleSub = store.select(selectScaleFactor).subscribe(scaleFactor => this.scaleFactor = scaleFactor); + protected constructor(protected store: Store) { + this.sub.add(store.select(selectScaleFactor).subscribe(scaleFactor => this.scaleFactor = scaleFactor)); } public _reColorTrace(trace: ExtData, newColor: number[]): void { @@ -109,10 +110,8 @@ export class PlotlyGraphBase implements OnDestroy { const duplicateIndexes = filtered.reduce((acc, entry: any) => acc.concat(entry[1]), []); const merged = [...duplicateIndexes]; - for (let i = 0; i < merged.length; i++) { - const key = merged[i]; + for (const key of merged) { data[key].colorHash = data[key].name; - // Warning: "data[key].task" in compare case. taskId in subplots (multiple plots with same name) if (data[key].task || taskId) { data[key].name = `${data[key].name}.${(data[key].task || taskId).substring(0, 7)}`; @@ -129,8 +128,8 @@ export class PlotlyGraphBase implements OnDestroy { } ngOnDestroy(): void { + this.sub.unsubscribe(); this.colorSub?.unsubscribe(); - this.scaleSub?.unsubscribe(); } } diff --git a/src/app/webapp-common/shared/experiment-graphs/single-graph/single-graph.component.html b/src/app/webapp-common/shared/experiment-graphs/single-graph/single-graph.component.html index 878fee48..4faafbcb 100644 --- a/src/app/webapp-common/shared/experiment-graphs/single-graph/single-graph.component.html +++ b/src/app/webapp-common/shared/experiment-graphs/single-graph/single-graph.component.html @@ -14,6 +14,7 @@ [class.move-title]="type !== 'parcoords'" (scroll)="repositionModeBar($event.target)" > +
{{title}}
= {}; - @Input() height: number = 450; - public loading: boolean; - private modeBar: HTMLElement; - + @Input() height: number; @Input() set chart(chart: ExtFrame) { + this.ratioEnable = !!chart.layout.width && !!chart.layout.height; + this.ratio = this.ratioEnable? chart.layout.width / chart.layout.height : null; + this.height = chart.layout.height || 450; this.originalChart = cloneDeep(chart); this._chart = chart; } @@ -86,15 +95,11 @@ export class SingleGraphComponent extends PlotlyGraphBase { @Input() xAxisType: ScalarKeyEnum; @Input() set smoothWeight(ratio: number) { + this._smoothWeight = ratio; this.isSmooth = ratio > 0; if (this.alreadyDrawn) { - clearTimeout(this.smoothnessTimeout); - this.smoothnessTimeout = window.setTimeout(() => { - this._chart = cloneDeep(this.originalChart); - this.drawGraph(true); - }, 400); + this.smooth$.next(ratio); } - this._smoothWeight = ratio; } get smoothWeight() { @@ -113,16 +118,23 @@ export class SingleGraphComponent extends PlotlyGraphBase { constructor( protected renderer: Renderer2, private colorHash: ColorHashService, - private changeDetector: ChangeDetectorRef, + public changeDetector: ChangeDetectorRef, public elementRef: ElementRef, protected store: Store, private dialog: MatDialog, private readonly zone: NgZone ) { super(store); + this.sub.add(this.smooth$ + .pipe(debounceTime(50)) + .subscribe(() => { + this._chart = cloneDeep(this.originalChart); + this.drawGraph(true); + }) + ); } - drawGraph(forceRedraw = false) { + drawGraph(forceRedraw = false, forceSkipReact = false) { if (this.showLoaderOnDraw) { this.loading = true; this.changeDetector.detectChanges(); @@ -139,10 +151,11 @@ export class SingleGraphComponent extends PlotlyGraphBase { } let skipReact = false; // root.height > 0 to avoid rare plotly exception - if (this.singleGraphContainer.nativeElement.offsetWidth !== this.previousOffsetWidth && (root as HTMLElement).offsetHeight > 0) { + if ((this.singleGraphContainer.nativeElement.offsetWidth !== this.previousOffsetWidth || forceSkipReact) && (root as HTMLElement).offsetHeight > 0) { skipReact = true; this.zone.runOutsideAngular(() => Plotly.relayout(root, { - width: Math.max(getOr(0, 'data[0].cells.values.length', data) * 100, this.singleGraphContainer.nativeElement.offsetWidth - 3) + width: this.ratio ? this.height * this.ratio + RATIO_OFFSET_FIX: Math.max(getOr(0, 'data[0].cells.values.length', data) * 100, this.singleGraphContainer.nativeElement.offsetWidth - 3), + height: this.height }).then(() => { this.loading = false; this.changeDetector.detectChanges(); @@ -150,6 +163,7 @@ export class SingleGraphComponent extends PlotlyGraphBase { })); } this.previousOffsetWidth = this.singleGraphContainer.nativeElement.offsetWidth; + this.previousHeight = this.height; if (!skipReact) { this.zone.runOutsideAngular(() => Plotly.react(root, data, layout, config).then(() => { @@ -178,7 +192,8 @@ export class SingleGraphComponent extends PlotlyGraphBase { const graph = this.formatChartLines() as ExtFrame; this.type = getOr(graph.layout.type, 'data[0].type', graph); - let layout = { + this.title = this.isDarkTheme ? '' : this.addIterationString(graph.layout.title as string, graph.iter) || (graph.layout.title as Record).text; + let layout = { ...this.addParametersIfDarkTheme({ font: { color: '#FFFFFF', @@ -189,6 +204,7 @@ export class SingleGraphComponent extends PlotlyGraphBase { // eslint-disable-next-line @typescript-eslint/naming-convention ...this.addParametersIfDarkTheme({plot_bgcolor: 'transparent'}), height: this.height, + width: this.ratio ? (this.height * this.ratio) + RATIO_OFFSET_FIX : undefined, modebar: { color: '#8F9DC9', activecolor: '#4D66FF', @@ -198,7 +214,6 @@ export class SingleGraphComponent extends PlotlyGraphBase { }), }, title: { - ...(!this.hideTitle && {text: this.addIterationString(graph.layout.title as string, graph.iter)}), ...this.addParametersIfDarkTheme({ font: { color: this.isDarkTheme ? PALLET.blue100 : 'dce0ee' @@ -276,10 +291,11 @@ export class SingleGraphComponent extends PlotlyGraphBase { }; // override cells design + const isFireFox = navigator.userAgent.toLowerCase().indexOf('firefox') > -1; graph.data[0].cells = { ...graph.data[0].cells, align: 'left', - height: 30, + height: (isFireFox && this.isDarkTheme) ? 'auto' : 30, font: { color: [this.isDarkTheme ? PALLET.blue200 : PALLET.blue400], size: 12 @@ -290,7 +306,6 @@ export class SingleGraphComponent extends PlotlyGraphBase { layout.width = Math.max(getOr(0, 'data[0].cells.values.length', graph) * 100, this.singleGraphContainer.nativeElement.offsetWidth - 3); layout.title = { ...layout.title as Record, - text: this.addIterationString(layout.name, graph.iter) || (layout.title as Record).text, xanchor: 'left', xref: 'paper', x: 0 @@ -401,8 +416,8 @@ export class SingleGraphComponent extends PlotlyGraphBase { name: 'Hide legend', title: this.getHideButtonTitle(), icon: this.getToggleLegendIcon(), - click: (element, ev: any) => { - const pathElement = ev.target.tagName === 'path' ? ev.target : (ev.target as HTMLElement).querySelector('path'); + click: (element, ev: MouseEvent) => { + const pathElement = (ev.target as HTMLElement).tagName === 'path' ? (ev.target as HTMLElement) : (ev.target as HTMLElement).querySelector('path'); const svg = pathElement.parentElement; pathElement.style.fill = this.chartElm.layout?.showlegend ? 'rgb(77, 102, 255)' : 'rgb(143, 157, 201)'; svg.parentElement.attributes['data-title'].value = this.getHideButtonTitle(); @@ -417,6 +432,21 @@ export class SingleGraphComponent extends PlotlyGraphBase { } }); } + if (!['table', 'parcoords'].includes(get('data[0].type', graph)) && this.ratioEnable && !this.moveLegendToTitle) { + modeBarButtonsToAdd.push({ + name: 'Auto Layout', + title: 'Auto Layout', + icon: this.getToggleRatioIcon(), + click: (element, ev: MouseEvent) => { + const pathElement = (ev.target as HTMLElement).tagName === 'path' ? (ev.target as HTMLElement) : (ev.target as HTMLElement).querySelector('path'); + const svg = pathElement.parentElement; + pathElement.style.fill = this.ratio ? 'rgb(77, 102, 255)' : 'rgb(143, 157, 201)'; + svg.parentElement.attributes['data-title'].value = this.getLockRatioTitle(); + this.ratio = this.ratio ? null : this.originalChart.layout.width / this.originalChart.layout.height; + this.drawGraph(true, true); + } + }); + } modeBarButtonsToAdd.push({ name: 'Download JSON', title: 'Download JSON', @@ -466,7 +496,7 @@ export class SingleGraphComponent extends PlotlyGraphBase { } private formatChartLines() { - if (this.alreadyDrawn) { + if (this.alreadyDrawn || !this.chart) { return this.chart; } @@ -531,32 +561,29 @@ export class SingleGraphComponent extends PlotlyGraphBase { } } - private resmoothDataset(line: ExtData, color) { - const newLine = cloneDeep(line); + private resmoothDataset(data: ExtData, color) { + let last = data.y?.[0] as number ?? NaN; - const data = newLine.y; - let last = data.length > 0 ? data[0] as number : NaN; - newLine.legendgroup = line.name; - newLine.name = `${line.name} (Smoothed)`; - newLine.showlegend = true; - newLine.isSmoothed = true; - newLine.hovertext = newLine.hovertext ? newLine.hovertext + '(Smoothed)' : '(Smoothed)'; - newLine.hoverinfo = 'all'; - - this._reColorTrace(newLine, color); - let smoothed; - data.forEach((d, index) => { - if (!isFinite(last)) { - smoothed = d; - } else { - // 1st-order IIR low-pass filter to attenuate the higher- - // frequency components of the time-series. - smoothed = last * this.smoothWeight + (1 - this.smoothWeight) * d; - newLine.y[index] = smoothed; - } - last = smoothed; - }); - return newLine; + return { + ...data, + line: {...data.line, color: `rgb(${color[0]},${color[1]},${color[2]})`}, + legendgroup: data.name, + name: `${data.name} (Smoothed)`, + showlegend: true, + isSmoothed: true, + hovertext: data.hovertext ? data.hovertext + '(Smoothed)' : '(Smoothed)', + hoverinfo: 'all', + y: data.y.map((d ) => { + if (!isFinite(last)) { + return null; + } else { + // 1st-order IIR low-pass filter to attenuate the higher- + // frequency components of the time-series. + last = last * this.smoothWeight + (1 - this.smoothWeight) * d; + return last; + } + }) + } as ExtData; } private initColorSubscription(forceRedraw = false) { @@ -692,6 +719,17 @@ export class SingleGraphComponent extends PlotlyGraphBase { }; } + getToggleRatioIcon() { + return { + width:500, + height: 500, + fill: 'rgb(77, 102, 255)', + path: 'M419.3,256.4H373v69.9h-69.9v46.3h116.2V256.4z M139.8,186.5h69.9v-46.3h-117v116.2H139v-69.9H139.8z M465.7,46.7H46.3C20.6,46.7,0,68,0,93.1V419c0,25.7,20.6,46.3,46.3,46.3h419.3c25.7,0,46.3-21.3,46.3-46.3V93.1C512,68,491.4,46.7,465.7,46.7z M465.7,419.7H46.3V93.1h419.3v326.6H465.7z', + ascent: 300, + descent: 0, + transform: 'translate(0, -50)' + }; + } getMaximizeIcon() { return { width: 1000, @@ -744,6 +782,10 @@ export class SingleGraphComponent extends PlotlyGraphBase { return this.chartElm.layout?.showlegend ? 'Show legend' : 'Hide legend'; } + private getLockRatioTitle() { + return this.ratio ? 'Original Layout' : 'Auto Layout'; + } + validateResize($event: ResizeEvent): boolean { return $event.rectangle.width > 400 && $event.rectangle.height > 250; } diff --git a/src/app/webapp-common/shared/experiment-info-header-status-icon-label/experiment-info-header-status-icon-label.component.html b/src/app/webapp-common/shared/experiment-info-header-status-icon-label/experiment-info-header-status-icon-label.component.html index 07174af6..476e3ebd 100644 --- a/src/app/webapp-common/shared/experiment-info-header-status-icon-label/experiment-info-header-status-icon-label.component.html +++ b/src/app/webapp-common/shared/experiment-info-header-status-icon-label/experiment-info-header-status-icon-label.component.html @@ -1,24 +1,10 @@ -
-
-
-
- -
+
+ + {{' ' + (EXPERIMENTS_STATUS_LABELS[status] ? EXPERIMENTS_STATUS_LABELS[status] : '') | uppercase}} -
- (view only) - - (note: changes will be overridden if re-run locally) - -
-
-
- -
-
- -
-
-
+ + +
diff --git a/src/app/webapp-common/shared/experiment-info-header-status-icon-label/experiment-info-header-status-icon-label.component.scss b/src/app/webapp-common/shared/experiment-info-header-status-icon-label/experiment-info-header-status-icon-label.component.scss index ed24ed8e..ad4dc36b 100644 --- a/src/app/webapp-common/shared/experiment-info-header-status-icon-label/experiment-info-header-status-icon-label.component.scss +++ b/src/app/webapp-common/shared/experiment-info-header-status-icon-label/experiment-info-header-status-icon-label.component.scss @@ -1,67 +1,85 @@ @import "../ui-components/styles/variables"; :host { - .label { - display: flex; - justify-content: center; - margin-left: 5px; - } - .fullscreen { - margin-right: 29px; - } - - .icon { - margin: auto 0; - } - - .status-icon-container { - padding: 0 24px; - width: 100%; - } - - .failed, - .completed, - .stopped - { - font-size: 11px; - font-weight: 500; - filter: brightness(0) invert(1); - } - - .created, - .running, - .queued, - .in_progress, - .published { - color: $blue-600; - opacity: 0.8; - font-family: Heebo; - font-size: 11px; - font-weight: 500; - .al-icon{ - &:hover{ - color: $blue-800; - }; + .status-line { + background: white; + height:32px; + position: relative; + .label { + display: flex; + justify-content: center; + padding: 2px 12px 0 12px; + letter-spacing: 0.03em; } - } + .view-only { + padding-left: 4px; + margin-top: 0; + margin-bottom: 0; + } + &::before { + content: ""; + border-top: 6px solid; + display: block; + position: relative; + z-index: 2; + } + > span { + display: inline-flex; + align-items: center; + position: absolute; z-index: 1; top: 0; left: 50%; + transform: translateX(-50%); + height: inherit; + font-size: 12px; font-weight: 500; + letter-spacing: 0.05em; + color: $blue-600; + &::before, &::after { + content:""; + display: block; + position: relative; + width: 0; + height: 0; + border-bottom: 32px solid white; + } + &::before { + left: -1px; + border-right: 16px solid transparent; + } + &::after { + right: -1px; + border-left: 16px solid transparent; + } - .middle { - height: 14px; - margin-top: 2px - } + } - .view-only { - padding-left: 4px; - margin-top: 0; - margin-bottom: 0; - } + &.published { + &::before {border-color: $neon-yellow;} + span {background-color: $neon-yellow;} + } - .maximize{ - font-size: 18px; - color: $blue-300; - &:hover{ - color: $blue-200; + &.in_progress { + &::before {border-color: #50e3c2;} + span {background-color: #50e3c2;} + } + + &.queued { + &::before {border-color: #c4f0e4;} + span {background-color: #c4f0e4;} + } + + &.created { + &::before {border-color: #dbdee6;} + span {background-color: #dbdee6;} + } + + &.failed { + &::before {border-color: $strong-red} + span {background-color: $strong-red; color: $blue-25;} + } + + &.completed, &.stopped { + &::before {border-color: $completed-blue} + span {background-color: $completed-blue; color: $blue-25;} } } } diff --git a/src/app/webapp-common/shared/experiment-info-header-status-icon-label/experiment-info-header-status-icon-label.component.ts b/src/app/webapp-common/shared/experiment-info-header-status-icon-label/experiment-info-header-status-icon-label.component.ts index 71e4c93a..8d0f5583 100644 --- a/src/app/webapp-common/shared/experiment-info-header-status-icon-label/experiment-info-header-status-icon-label.component.ts +++ b/src/app/webapp-common/shared/experiment-info-header-status-icon-label/experiment-info-header-status-icon-label.component.ts @@ -1,4 +1,4 @@ -import {Component, EventEmitter, Input, Output} from '@angular/core'; +import {Component, Input} from '@angular/core'; import {EXPERIMENTS_STATUS_LABELS} from '../../../features/experiments/shared/experiments.const'; @Component({ @@ -11,9 +11,7 @@ export class ExperimentInfoHeaderStatusIconLabelComponent { @Input() status = ''; @Input() viewOnly = false; @Input() development = false; - @Input() showMaximize: boolean; - @Output() closeInfoClicked = new EventEmitter(); - @Output() maximizedClicked = new EventEmitter(); + public EXPERIMENTS_STATUS_LABELS = EXPERIMENTS_STATUS_LABELS; diff --git a/src/app/webapp-common/shared/experiment-info-header-status-progress-bar/experiment-info-header-status-progress-bar.component.html b/src/app/webapp-common/shared/experiment-info-header-status-progress-bar/experiment-info-header-status-progress-bar.component.html index 65a1e570..2ae6b95c 100644 --- a/src/app/webapp-common/shared/experiment-info-header-status-progress-bar/experiment-info-header-status-progress-bar.component.html +++ b/src/app/webapp-common/shared/experiment-info-header-status-progress-bar/experiment-info-header-status-progress-bar.component.html @@ -1,8 +1,5 @@
{ + group[1].forEach(groupInst => { + acc.push(groupInst.fields); + }); + return acc; + }, []); + const flatForm1Level = flatForm2Levels.flat(1); conditional?.entries?.forEach(ent => { - const fieldVal = groupName ? - groupedApplicationForm.filter(group => group[0] === groupName)[0][1][groupIndex].fields.filter(field => field.name === ent.name)[0].val : - groupedApplicationForm.filter(field => field[0] === ent.name)[0][1][0].fields[0].val + const fieldVal = flatForm1Level.filter((field) => field.name === ent.name)[groupIndex].val; const r = new RegExp(ent.value); conditions.push(r.test(fieldVal)); } - ) + ); if (conditional?.op === 'or') { return conditions.some(con => con); } else { diff --git a/src/app/webapp-common/shared/project-dialog/project-dialog.component.ts b/src/app/webapp-common/shared/project-dialog/project-dialog.component.ts index 17216476..77d48acc 100644 --- a/src/app/webapp-common/shared/project-dialog/project-dialog.component.ts +++ b/src/app/webapp-common/shared/project-dialog/project-dialog.component.ts @@ -32,7 +32,7 @@ export class ProjectDialogComponent implements OnInit, OnDestroy { }; - constructor(private store: Store, private matDialogRef: MatDialogRef, @Inject(MAT_DIALOG_DATA) data: { projectId: string, mode: string }) { + constructor(private store: Store, private matDialogRef: MatDialogRef, @Inject(MAT_DIALOG_DATA) data: { projectId: string; mode: string }) { this.baseProjectId = data.projectId; this.mode = data.mode; this.projects$ = this.store.select(createProjectSelectors.selectProjects); diff --git a/src/app/webapp-common/shared/project-dialog/project-move-to-form/project-move-to-form.component.html b/src/app/webapp-common/shared/project-dialog/project-move-to-form/project-move-to-form.component.html index 3e6d3a27..b8422449 100644 --- a/src/app/webapp-common/shared/project-dialog/project-move-to-form/project-move-to-form.component.html +++ b/src/app/webapp-common/shared/project-dialog/project-move-to-form/project-move-to-form.component.html @@ -51,8 +51,9 @@ class="item" *ngIf="(projectInput.value && !(projectInput.value | stringIncludedInArray:projectsNames))" [value]="projectInput.value" + (onSelectionChange)="createNewSelected($event)" >"{{projectInput.value}}" (Create New) - +
diff --git a/src/app/webapp-common/shared/project-dialog/project-move-to-form/project-move-to-form.component.ts b/src/app/webapp-common/shared/project-dialog/project-move-to-form/project-move-to-form.component.ts index 6abd6ab6..0b1ed9d0 100644 --- a/src/app/webapp-common/shared/project-dialog/project-move-to-form/project-move-to-form.component.ts +++ b/src/app/webapp-common/shared/project-dialog/project-move-to-form/project-move-to-form.component.ts @@ -1,7 +1,18 @@ -import {ChangeDetectorRef, Component, EventEmitter, Input, OnChanges, OnInit, Output, SimpleChanges, ViewChild} from '@angular/core'; +import { + ChangeDetectorRef, + Component, + EventEmitter, + Input, + OnChanges, + OnInit, + Output, + SimpleChanges, + ViewChild +} from '@angular/core'; import {Project} from '../../../../business-logic/model/projects/project'; import {NgForm} from '@angular/forms'; import {MatAutocompleteSelectedEvent} from "@angular/material/autocomplete"; +import {MatOptionSelectionChange} from '@angular/material/core'; @Component({ @@ -20,6 +31,7 @@ export class ProjectMoveToFormComponent implements OnChanges, OnInit { private _projects: Project[]; @ViewChild('moveToForm', {static: true}) moveToForm: NgForm; + private newProjectName: string; constructor(private changeDetection: ChangeDetectorRef) { } @@ -44,7 +56,7 @@ export class ProjectMoveToFormComponent implements OnChanges, OnInit { @ViewChild('projectForm') public form: NgForm; send() { - this.moveProject.emit({location: this.project.parent, name: this.projectName}); + this.moveProject.emit({location: this.project.parent, name: this.newProjectName}); } ngOnChanges(changes: SimpleChanges): void { @@ -74,5 +86,13 @@ export class ProjectMoveToFormComponent implements OnChanges, OnInit { closeDialog() { this.dismissDialog.emit(); } + + createNewSelected($event: MatOptionSelectionChange) { + this.newProjectName = $event.source.value; + } + + optionSelected($event: MatOptionSelectionChange) { + this.newProjectName = null; + } } diff --git a/src/app/webapp-common/shared/ui-components/buttons/loading-button/loading-button.component.scss b/src/app/webapp-common/shared/ui-components/buttons/loading-button/loading-button.component.scss index 10170b8b..fb68519d 100644 --- a/src/app/webapp-common/shared/ui-components/buttons/loading-button/loading-button.component.scss +++ b/src/app/webapp-common/shared/ui-components/buttons/loading-button/loading-button.component.scss @@ -122,6 +122,5 @@ .button-label { display: inline-block; - font-size: 11px; text-align: center; } diff --git a/src/app/webapp-common/shared/ui-components/data/labeled-row/labeled-row.component.scss b/src/app/webapp-common/shared/ui-components/data/labeled-row/labeled-row.component.scss index 4d717e5c..3f4e2835 100644 --- a/src/app/webapp-common/shared/ui-components/data/labeled-row/labeled-row.component.scss +++ b/src/app/webapp-common/shared/ui-components/data/labeled-row/labeled-row.component.scss @@ -11,6 +11,9 @@ font-weight: 500; color: #71758A; font-size: 11px; + padding-right: 24px; + text-overflow: ellipsis; + overflow: hidden; } .content { diff --git a/src/app/webapp-common/shared/ui-components/data/table-card/table-card.component.scss b/src/app/webapp-common/shared/ui-components/data/table-card/table-card.component.scss index 80146e86..5ffae048 100644 --- a/src/app/webapp-common/shared/ui-components/data/table-card/table-card.component.scss +++ b/src/app/webapp-common/shared/ui-components/data/table-card/table-card.component.scss @@ -1,11 +1,11 @@ @import "../../styles/variables"; -.table-card { +.table-card { display: grid; grid-template-columns: 20px 32px 1fr; align-items: center; - gap: 4px 12px; - margin: 0 24px; + gap: 8px 12px; + margin: 0 16px; grid-template-areas: "cbx type-icon card-name" ". . tags" diff --git a/src/app/webapp-common/shared/ui-components/data/table-diff/table-diff.component.html b/src/app/webapp-common/shared/ui-components/data/table-diff/table-diff.component.html index e0488d76..f92895c0 100644 --- a/src/app/webapp-common/shared/ui-components/data/table-diff/table-diff.component.html +++ b/src/app/webapp-common/shared/ui-components/data/table-diff/table-diff.component.html @@ -1,25 +1,30 @@ -
-
{{keyTitle}} - +
+
{{keyTitle}} + -
-
{{valueTitle}} - {{valueTitle}} + -
-
-
-
{{data.key}}
-
- - +
+
+
+
{{data.key}}
+
+ + +
diff --git a/src/app/webapp-common/shared/ui-components/data/table-diff/table-diff.component.scss b/src/app/webapp-common/shared/ui-components/data/table-diff/table-diff.component.scss index 2ec54128..49f6bba8 100644 --- a/src/app/webapp-common/shared/ui-components/data/table-diff/table-diff.component.scss +++ b/src/app/webapp-common/shared/ui-components/data/table-diff/table-diff.component.scss @@ -32,5 +32,13 @@ } } } + + &.hovered { + box-shadow: 0 0 0 1px $blue-250 inset; + } + .table-key { + max-width: 450px; + padding-right: 24px; + } } diff --git a/src/app/webapp-common/shared/ui-components/data/table-diff/table-diff.component.ts b/src/app/webapp-common/shared/ui-components/data/table-diff/table-diff.component.ts index bed13a7c..7c7e5133 100644 --- a/src/app/webapp-common/shared/ui-components/data/table-diff/table-diff.component.ts +++ b/src/app/webapp-common/shared/ui-components/data/table-diff/table-diff.component.ts @@ -4,10 +4,10 @@ import { ContentChild, EventEmitter, Input, - OnInit, Output, TemplateRef } from '@angular/core'; +import { trackByIndex } from '@common/shared/utils/forms-track-by'; export interface IKeyValue { key: string; @@ -28,21 +28,19 @@ export interface ITableDiffSortBy { changeDetection: ChangeDetectionStrategy.OnPush }) -export class TableDiffComponent implements OnInit { +export class TableDiffComponent { @Input() keyTitle: string; @Input() valueTitle: string; @Input() keyValueArray: Array; @Input() isOrigin = false; @Input() sortConfig: ITableDiffSortBy; + @Input() hoveredRow: string; + @Output() rowHovered = new EventEmitter(); @Output() sortByChanged = new EventEmitter(); @ContentChild(TemplateRef) templateRef: TemplateRef; - constructor() { - } - - ngOnInit() { - } + trackByIndex = trackByIndex; sortByClicked(sortBy) { this.sortByChanged.emit({ keyOrValue: sortBy, order: this.toggleSortOrder(this.sortConfig.order), keyValueArray: this.keyValueArray }); diff --git a/src/app/webapp-common/shared/ui-components/data/table/base-table-view.ts b/src/app/webapp-common/shared/ui-components/data/table/base-table-view.ts index 7dc586d8..2299cb42 100644 --- a/src/app/webapp-common/shared/ui-components/data/table/base-table-view.ts +++ b/src/app/webapp-common/shared/ui-components/data/table/base-table-view.ts @@ -115,8 +115,11 @@ export abstract class BaseTableView implements AfterViewInit, OnDestroy{ } sortOptionsList(columnId: string) { - this.filtersOptions[columnId] - .sort((a, b) => sortByArr(a.value, b.value, [null, ...(this.filtersValues[columnId] || [])])); + if(!this.filtersOptions[columnId]) { + return; + } + this.filtersOptions[columnId].sort((a, b) => + sortByArr(a.value, b.value, [null, ...(this.filtersValues[columnId] || [])])); this.filtersOptions = {...this.filtersOptions, [columnId]: [...this.filtersOptions[columnId]]}; } searchValueChanged($event: string, colId: string) { diff --git a/src/app/webapp-common/shared/ui-components/data/table/table-filter-sort-template/table-filter-sort-template.component.scss b/src/app/webapp-common/shared/ui-components/data/table/table-filter-sort-template/table-filter-sort-template.component.scss index eddc752a..dc584f5a 100644 --- a/src/app/webapp-common/shared/ui-components/data/table/table-filter-sort-template/table-filter-sort-template.component.scss +++ b/src/app/webapp-common/shared/ui-components/data/table/table-filter-sort-template/table-filter-sort-template.component.scss @@ -8,8 +8,7 @@ //height: 45px; - ::ng-deep .menu-button { - color: $blue-400; + .menu-button { font-weight: 500; font-size: 12px; diff --git a/src/app/webapp-common/shared/ui-components/data/table/table.component.html b/src/app/webapp-common/shared/ui-components/data/table/table.component.html index c644cb21..f969bf17 100644 --- a/src/app/webapp-common/shared/ui-components/data/table/table.component.html +++ b/src/app/webapp-common/shared/ui-components/data/table/table.component.html @@ -29,8 +29,8 @@ (onColResize)="colResize($event)" > - -
+ +
{{noDataMessage}}
@@ -135,7 +135,7 @@ [style.padding.px]="rowHeight < 42 ? 2 : 3" >
- +
+
diff --git a/src/app/webapp-common/shared/ui-components/panel/editable-section/editable-section.component.scss b/src/app/webapp-common/shared/ui-components/panel/editable-section/editable-section.component.scss index d79081b6..48591d7b 100644 --- a/src/app/webapp-common/shared/ui-components/panel/editable-section/editable-section.component.scss +++ b/src/app/webapp-common/shared/ui-components/panel/editable-section/editable-section.component.scss @@ -43,7 +43,7 @@ border-radius: 4px; &:hover { - background-color: $purple; + background-color: $blue-500; } } @@ -70,8 +70,8 @@ transition: all ease-in-out 0.15s, border ease-in-out 0.15s; &:hover { - border: 1px solid $purple; - background-color: $purple; + border: 1px solid $blue-500; + background-color: $blue-500; color: #FFFFFF; } } diff --git a/src/app/webapp-common/shared/ui-components/panel/menu-item/menu-item.component.html b/src/app/webapp-common/shared/ui-components/panel/menu-item/menu-item.component.html index 728b1536..b88424db 100644 --- a/src/app/webapp-common/shared/ui-components/panel/menu-item/menu-item.component.html +++ b/src/app/webapp-common/shared/ui-components/panel/menu-item/menu-item.component.html @@ -5,10 +5,10 @@ (formDataChanged)="itemClickedEvent()" > - +
{{itemLabel}}
-
+
diff --git a/src/app/webapp-common/shared/ui-components/panel/menu-item/menu-item.component.scss b/src/app/webapp-common/shared/ui-components/panel/menu-item/menu-item.component.scss index a1f2c691..0f64d9b9 100644 --- a/src/app/webapp-common/shared/ui-components/panel/menu-item/menu-item.component.scss +++ b/src/app/webapp-common/shared/ui-components/panel/menu-item/menu-item.component.scss @@ -1,3 +1,6 @@ +.al-icon { + margin-right: 12px; +} .item-label { display: flex; font-size: 14px; @@ -9,25 +12,8 @@ width: 85%; } -.item-icon { - margin-right: 12px; - - &.icon { - width: 18px; - height: 18px; - margin-right: 10px; - margin-left: 5px; - padding: 0; - } - - &.fa:before { - width: 20px; - display: block; - } -} - .mat-menu-item { - font-family: Heebo; + font-family: "Heebo", sans-serif; height: 40px; line-height: normal; } @@ -39,6 +25,10 @@ transform: translateX(12px); } +sm-checkbox-control { + margin-right: 12px; +} + :host { &:hover { diff --git a/src/app/webapp-common/shared/ui-components/panel/menu-item/menu-item.component.ts b/src/app/webapp-common/shared/ui-components/panel/menu-item/menu-item.component.ts index 175052f5..658e525e 100644 --- a/src/app/webapp-common/shared/ui-components/panel/menu-item/menu-item.component.ts +++ b/src/app/webapp-common/shared/ui-components/panel/menu-item/menu-item.component.ts @@ -7,13 +7,12 @@ import {TABLE_SORT_ORDER} from '../../data/table/table.consts'; styleUrls : ['./menu-item.component.scss'] }) export class MenuItemComponent { - @Input() iconFontSize: number = 14; @Input() removable: boolean = false; @Input() disabled: boolean = false; @Input() itemLabel: string; @Input() itemValue: string; @Input() itemTooltip: string; - @Input() iconClass: string; + @Input() iconClass: string = ''; @Input() enableIcon: boolean = true; @Input() selectable: boolean = false; @Input() checked: boolean = false; diff --git a/src/app/webapp-common/shared/ui-components/panel/navbar-item/navbar-item.component.html b/src/app/webapp-common/shared/ui-components/panel/navbar-item/navbar-item.component.html index dd774b4f..097fc5ae 100644 --- a/src/app/webapp-common/shared/ui-components/panel/navbar-item/navbar-item.component.html +++ b/src/app/webapp-common/shared/ui-components/panel/navbar-item/navbar-item.component.html @@ -1,4 +1,4 @@ -
+
{{header?.toUpperCase()}}
{{subHeader? subHeader: ''}}
diff --git a/src/app/webapp-common/shared/ui-components/panel/navbar-item/navbar-item.component.scss b/src/app/webapp-common/shared/ui-components/panel/navbar-item/navbar-item.component.scss index 6c1bde36..438aada2 100644 --- a/src/app/webapp-common/shared/ui-components/panel/navbar-item/navbar-item.component.scss +++ b/src/app/webapp-common/shared/ui-components/panel/navbar-item/navbar-item.component.scss @@ -1,6 +1,7 @@ @import "../../styles/mixins/navbar-item"; @import '../../styles/variables'; + .navbar-item { font-size: 13px; font-weight: 500; @@ -16,5 +17,4 @@ } - @include generate-navbar-item(); diff --git a/src/app/webapp-common/shared/ui-components/panel/navbar-item/navbar-item.component.ts b/src/app/webapp-common/shared/ui-components/panel/navbar-item/navbar-item.component.ts index 4f3bc0c9..6c255734 100644 --- a/src/app/webapp-common/shared/ui-components/panel/navbar-item/navbar-item.component.ts +++ b/src/app/webapp-common/shared/ui-components/panel/navbar-item/navbar-item.component.ts @@ -12,6 +12,7 @@ export class NavbarItemComponent implements OnInit { @Input() direction: 'bottom' | 'top' = 'bottom'; @Input() subHeader: string; @Input() multi: boolean = false; + @Input() large: boolean = true; @Output() itemSelected = new EventEmitter(); diff --git a/src/app/webapp-common/shared/ui-components/panel/project-card-menu/project-card-menu.component.html b/src/app/webapp-common/shared/ui-components/panel/project-card-menu/project-card-menu.component.html index 4e47b1c7..87bc40ab 100644 --- a/src/app/webapp-common/shared/ui-components/panel/project-card-menu/project-card-menu.component.html +++ b/src/app/webapp-common/shared/ui-components/panel/project-card-menu/project-card-menu.component.html @@ -2,18 +2,14 @@ diff --git a/src/app/webapp-common/shared/ui-components/styles/bootstrap-settings.scss b/src/app/webapp-common/shared/ui-components/styles/bootstrap-settings.scss index f9b036ef..35777229 100644 --- a/src/app/webapp-common/shared/ui-components/styles/bootstrap-settings.scss +++ b/src/app/webapp-common/shared/ui-components/styles/bootstrap-settings.scss @@ -307,7 +307,7 @@ $btn-font-family: $font-family-base; font-size: 12px; font-weight: 500; text-align: center; - color: #ffffff; + color: $white; transition: background-color ease-in-out 0.3s; &.terminal { @@ -315,10 +315,13 @@ $btn-font-family: $font-family-base; color: $blue-280; margin: 0 6px !important; padding: 0 12px; + &:hover:enabled { + color: $blue-200; + } } &:hover:enabled { - background-color: $purple; + background-color: $blue-500; color: white; } diff --git a/src/app/webapp-common/shared/ui-components/styles/icons.scss b/src/app/webapp-common/shared/ui-components/styles/icons.scss index 0e569f3d..7bd1f79e 100644 --- a/src/app/webapp-common/shared/ui-components/styles/icons.scss +++ b/src/app/webapp-common/shared/ui-components/styles/icons.scss @@ -34,6 +34,10 @@ color: $blue-570; } + &.blue-800 { + color: $blue-800; + } + &.error-dark{ color: $error-dark } @@ -94,6 +98,11 @@ height: 32px; font-size: 32px; } + &.l-40{ + width: 40px; + height: 40px; + font-size: 40px; + } &.xl { width: 48px; diff --git a/src/app/webapp-common/shared/ui-components/styles/mixins/button-toggle-group.scss b/src/app/webapp-common/shared/ui-components/styles/mixins/button-toggle-group.scss index 42b37d74..13725bcc 100644 --- a/src/app/webapp-common/shared/ui-components/styles/mixins/button-toggle-group.scss +++ b/src/app/webapp-common/shared/ui-components/styles/mixins/button-toggle-group.scss @@ -4,11 +4,6 @@ @each $theme, $map in $themes { $button: map-get($map, button-toggle-group); :host-context(.#{$theme}-theme) mat-button-toggle-group { - ::ng-deep .mat-button-toggle-label-content { - font-family: heebo; - font-size: 1rem; - } - .mat-button-toggle-appearance-standard { background-color: map_get($button, background-color); color: map_get($button, color); diff --git a/src/app/webapp-common/shared/ui-components/styles/mixins/navbar-item.scss b/src/app/webapp-common/shared/ui-components/styles/mixins/navbar-item.scss index 4d825789..12acd916 100644 --- a/src/app/webapp-common/shared/ui-components/styles/mixins/navbar-item.scss +++ b/src/app/webapp-common/shared/ui-components/styles/mixins/navbar-item.scss @@ -34,6 +34,16 @@ } @else { border-bottom: solid 6px $active-color; padding-bottom: 16px; + :host-context(.small-nav) { + .navbar-item { + font-size: 12px; + padding: 11px 18px; + &.active.bottom { + border-bottom: solid 3px; + padding-bottom: 8px; + } + } + } } } @@ -44,11 +54,13 @@ &:hover { color: $active-color } + @if $direction == 'bottom' { + :host-context(.small-nav) &:not(.active)::after {height: 3px} &:not(.active)::after { content: ""; - background: $active-color; height: 6px; + background: $active-color; position: absolute; bottom: 0; //transition: .16s all 0.025s; @@ -83,7 +95,6 @@ position: absolute; top: 0; //transition: .16s all 0.025s; - } } } diff --git a/src/app/webapp-common/shared/ui-components/tags/tag-list/tag-list.component.html b/src/app/webapp-common/shared/ui-components/tags/tag-list/tag-list.component.html index 085c3410..248f8049 100644 --- a/src/app/webapp-common/shared/ui-components/tags/tag-list/tag-list.component.html +++ b/src/app/webapp-common/shared/ui-components/tags/tag-list/tag-list.component.html @@ -1,7 +1,8 @@ {{tag}} - + (); - constructor(private colorService: TagColorService) { } - - ngOnInit(): void { - } + constructor(private colorService: TagColorService, public ref: ElementRef) { } public trackFn(index: number, tag: Tag) { return tag.caption; diff --git a/src/app/webapp-common/shared/ui-components/tags/user-tag/user-tag.component.scss b/src/app/webapp-common/shared/ui-components/tags/user-tag/user-tag.component.scss index 0ced363b..f01a83d7 100644 --- a/src/app/webapp-common/shared/ui-components/tags/user-tag/user-tag.component.scss +++ b/src/app/webapp-common/shared/ui-components/tags/user-tag/user-tag.component.scss @@ -8,6 +8,10 @@ overflow: hidden; padding-right: 20px; + &:hover { + max-width: var(--max-hover-width); + } + .content { border-radius: 3px 0 0 3px; display: inline-block; diff --git a/src/app/webapp-common/shared/ui-components/ui-components.module.ts b/src/app/webapp-common/shared/ui-components/ui-components.module.ts index 7b091752..1384df0a 100644 --- a/src/app/webapp-common/shared/ui-components/ui-components.module.ts +++ b/src/app/webapp-common/shared/ui-components/ui-components.module.ts @@ -108,8 +108,9 @@ import {CheckboxThreeStateListComponent} from './panel/checkbox-three-state-list import {TemplateAliasDirective} from './directives/template-alias.directive'; import {ShowTooltipIfEllipsisDirective} from './indicators/tooltip/show-tooltip-if-ellipsis.directive'; import {MatTooltipModule} from '@angular/material/tooltip'; -import { CodeEditorComponent } from './data/code-editor/code-editor.component'; +import {CodeEditorComponent} from './data/code-editor/code-editor.component'; import {AppendComponentOnTopElementDirective} from '@common/shared/directive/append-component-on-top-element.directive'; +import {EditCredentialLabelDialogComponent} from '@common/shared/ui-components/overlay/edit-credential-label-dialog/edit-credential-label-dialog.component'; const declarations = [ DurationInputComponent, @@ -187,6 +188,7 @@ const declarations = [ CirclesInRowComponent, OverflowsDirective, AppendComponentOnTopElementDirective, + EditCredentialLabelDialogComponent ]; @NgModule({ diff --git a/src/app/webapp-common/shared/utils/shared-utils.ts b/src/app/webapp-common/shared/utils/shared-utils.ts index 456ca857..39a88af8 100644 --- a/src/app/webapp-common/shared/utils/shared-utils.ts +++ b/src/app/webapp-common/shared/utils/shared-utils.ts @@ -1,9 +1,9 @@ -import {MEDIA_VIDEO_EXTENSIONS, MediaContentTypeEnum} from '../../../app.constants'; +import {MEDIA_VIDEO_EXTENSIONS, MediaContentTypeEnum} from '~/app.constants'; import {ActivatedRoute} from '@angular/router'; import {EXPERIMENT_GRAPH_ID_PREFIX} from '../../experiments/shared/common-experiments.const'; import {get, last} from 'lodash/fp'; -import {User} from '../../../business-logic/model/users/user'; -import {GetCurrentUserResponseUserObjectCompany} from '../../../business-logic/model/users/getCurrentUserResponseUserObjectCompany'; +import {User} from '~/business-logic/model/users/user'; +import {GetCurrentUserResponseUserObjectCompany} from '~/business-logic/model/users/getCurrentUserResponseUserObjectCompany'; import {TABLE_SORT_ORDER} from '../ui-components/data/table/table.consts'; import {CloseScrollStrategy, Overlay} from '@angular/cdk/overlay'; import {Store} from '@ngrx/store'; @@ -42,8 +42,13 @@ export const isVideo = (contentType: MediaContentTypeEnum, uri: string) => { if (contentType) { return (contentType.indexOf('video') > -1); } else { - const extension = uri && uri.split('.').pop().split('?')[0]; - return MEDIA_VIDEO_EXTENSIONS.includes(extension); + try { + const url = new URL(uri); + const extension = url.pathname.split('.').pop(); + return MEDIA_VIDEO_EXTENSIONS.includes(extension); + } catch { + return false; + } } }; @@ -131,8 +136,7 @@ export const isScrolledIntoView = el => { // Only completely visible elements return true: // const isVisible = (elemTop >= 0) && (elemBottom <= window.innerHeight); // Partially visible elements return true: - const isVisible = elemTop < window.innerHeight && elemBottom >= 0; - return isVisible; + return elemTop < window.innerHeight && elemBottom >= 0; }; export const getRouteFullUrl = (route: ActivatedRoute) => { @@ -160,10 +164,8 @@ export const isReadOnly = item => { export const isExample = item => item?.company && !item.company?.id; -export const isSharedAndNotOwner = (item, activeWorkSpace: GetCurrentUserResponseUserObjectCompany): boolean => { - const isSharedandNot = item?.system_tags.includes('shared') && item?.company?.id !== activeWorkSpace?.id && (!!item?.company.id); - return isSharedandNot; -}; +export const isSharedAndNotOwner = (item, activeWorkSpace: GetCurrentUserResponseUserObjectCompany): boolean => + item?.system_tags?.includes('shared') && item?.company?.id !== activeWorkSpace?.id && (!!item?.company.id); export const isAnnotationTask = entity => entity.system_tags && entity.system_tags.includes('Annotation'); @@ -201,7 +203,7 @@ export function crc32(str /* , polynomial = 0x04C11DB7, initialValue = 0xFFFFFFF } export const htmlTextShorte = (name: string, limit = 80) => { - if (name.length > limit) { + if (name?.length > limit) { return `${name.slice(0, limit - 3)}...`; } return name; diff --git a/src/app/webapp-common/tasks/tasks.utils.ts b/src/app/webapp-common/tasks/tasks.utils.ts index 6cea4d4e..b50b084e 100644 --- a/src/app/webapp-common/tasks/tasks.utils.ts +++ b/src/app/webapp-common/tasks/tasks.utils.ts @@ -25,7 +25,7 @@ export const mergeTasks = (tableTask, task) => { return task; }; -export const _mergeVariants = (base: Array, variant) => base.slice().concat(variant); +export const _mergeVariants = (base: Array, variant) => base.slice().concat(variant); export const _mergePlotsData = (base: any, toMerge: any) => JSON.stringify({...base, data: _mergeVariants(base.data, toMerge.data)}); @@ -58,22 +58,25 @@ export const prepareGraph = (data: ExtData[], layout: Partial, config type: graph.type as unknown as string, variant: graph.variant, worker: graph['worker'], -}); - -export const convertPlots = ({plots, experimentId}: {plots: {[title: string]: MetricsPlotEvent[]}; experimentId: string}): { [title: string]: ExtFrame[] } => - Object.entries(plots).reduce((acc, [key, graphs]) => { - acc[key] = graphs?.map(graph => { - let json: {data: any; layout: any; config?: any}; - try { - json = JSON.parse(graph.plot_str) as ExtFrame; - json.data.task = json.data.task || experimentId; - } catch (e) { - json = {data: [], layout: {title: 'Unknown data'}}; - } - return prepareGraph(json.data, json.layout, json.config, graph); }); - return acc; -}, {}); + +export const convertPlots = ({plots, experimentId}: { plots: { [title: string]: MetricsPlotEvent[] }; experimentId: string }): { graphs: { [title: string]: ExtFrame[] }, parsingError } => { + let parsingError: boolean; + return { + graphs: Object.entries(plots).reduce((acc, [key, graphs]) => { + acc[key] = graphs?.map(graph => { + let json = tryParseJson(graph.plot_str); + if (json.data.length === 0 && json.layout.title === 'Unknown data') { + parsingError = true; + } + json.data.task = json.data?.task || experimentId; + return prepareGraph(json.data, json.layout, json.config, graph); + }); + return acc; + }, {}), + parsingError + }; +}; export const convertScalars = (scalars: GroupedList, experimentId: string): { [key: string]: ExtFrame[] } => Object.entries(scalars).reduce((acc, graphGroup) => { @@ -81,17 +84,17 @@ export const convertScalars = (scalars: GroupedList, experimentId: string): { [k const graph = graphGroup[1]; const chartData = Object.entries(graph).sort((a, b) => a[0] > b[0] ? 1 : -1) - .map(([, data]: [string, any]) => ({ - task: experimentId, - ...data, - type: 'scatter' - })); + .map(([, data]: [string, any]) => ({ + task: experimentId, + ...data, + type: 'scatter' + })); acc[key] = [prepareGraph(chartData, {type: 'scalar', title: key, xaxis: {title: 'Iterations'}}, {}, {metric: key})]; return acc; }, {}); -export const groupIterations = (plots: MetricsPlotEvent[]): {[title: string]: MetricsPlotEvent[]} => { +export const groupIterations = (plots: MetricsPlotEvent[]): { [title: string]: MetricsPlotEvent[] } => { if (!plots.length) { return {}; } @@ -101,9 +104,9 @@ export const groupIterations = (plots: MetricsPlotEvent[]): {[title: string]: Me const metric = plot.metric; groupedPlots[metric] = cloneDeep(groupedPlots[metric]) || []; const index = groupedPlots[metric].findIndex((existingGraph) => plot.iter === existingGraph.iter); - const plotParsed = index > -1 && JSON.parse(plot.plot_str); + const plotParsed = index > -1 && tryParseJson(plot.plot_str); if (index > -1 && plotParsed.data && plotParsed.data[0] && ['scatter', 'bar'].includes(plotParsed.data[0].type)) { - const basePlotParsed = JSON.parse(groupedPlots[metric][index].plot_str); + const basePlotParsed = tryParseJson(groupedPlots[metric][index].plot_str); groupedPlots[metric][index].plot_str = _mergePlotsData(basePlotParsed, plotParsed); } else { groupedPlots[metric].push(plot); @@ -116,7 +119,7 @@ export const prepareScalarList = (metricsScalar): GroupedList => Object.keys(metricsScalar || []).reduce((acc, curr) => { acc[curr] = {}; return acc; -}, {}); + }, {}); export const sortMetricsList = (list: string[]) => list ? sortBy(item => item.replace(':', '~').toLowerCase(), list) : list; @@ -180,11 +183,12 @@ export const convertMultiPlots = (plots): { [key: string]: ExtFrame[] } => return acc; }, {}); -export const seperateMultiplotsVariants = (mixedPlot: IMultiplot, isMultipleVarients) => { +export const seperateMultiplotsVariants = (mixedPlot: IMultiplot, isMultipleVarients): {charts: any; parsingError: boolean} => { let charts = {}; + let parsingError: boolean; const values = Object.values(mixedPlot); if (!values || values.length === 0) { - return mixedPlot; + return {charts: mixedPlot, parsingError: false}; } for (const variant of values) { const duplicateNamesObject = Object.values(variant).reduce((acc, experiment) => { @@ -202,27 +206,34 @@ export const seperateMultiplotsVariants = (mixedPlot: IMultiplot, isMultipleVari const iteration = (experimentData[iterationKey] as any); const experimentName = duplicateNamesObject[iteration.name] ? iteration.name + '.' + shortExpId : iteration.name; const plot = iteration.plots[0]; - const parsed = JSON.parse(plot.plot_str); + const parsed = tryParseJson(plot.plot_str); + if (parsed.data.length === 0 && parsed.layout.title === 'Unknown data') { + parsingError = true; + } const metric = isMultipleVarients ? plot.metric + '-' + plot.variant : plot.metric; charts = multiplotsAddChartToGroup(charts, parsed, metric, experimentName, experimentId); }); } - return charts; + return {charts, parsingError}; }; -export const prepareMultiPlots = (multiPlots: MetricsPlotEvent) => { +export const prepareMultiPlots = (multiPlots: MetricsPlotEvent): {merged: any; parsingError: boolean} => { + let hadParsingError = false; if (!multiPlots) { - return multiPlots; + return {merged: multiPlots, parsingError: false}; } - return Object.entries(multiPlots).reduce((acc, graph) => { + const merged = Object.entries(multiPlots).reduce((acc, graph) => { if (!graph[1]) { return acc; } const isMultipleVarients = Object.keys(graph[1]).length > 1; - const graphsPerVariant = seperateMultiplotsVariants(graph[1] as IMultiplot, isMultipleVarients); + const {charts, parsingError} = seperateMultiplotsVariants(graph[1] as IMultiplot, isMultipleVarients); + const graphsPerVariant = charts; + hadParsingError = hadParsingError || parsingError; return {...acc, ...graphsPerVariant}; }, {}); + return {merged, parsingError: hadParsingError} }; export const multiplotsAddChartToGroup = (charts, parsed, metric, experiment, experimentId) => { @@ -261,7 +272,7 @@ export const multiplotsAddChartToGroup = (charts, parsed, metric, experiment, ex } charts[metricName][fullName].layout = Object.assign({}, {...charts[metricName][fullName].layout}); charts[metricName][fullName].layout.title = fullName; - charts[metricName][fullName].layout.name = charts[metricName][fullName].layout.name ? `${charts[metricName][fullName].layout.name} - ${experiment}`: fullName; + charts[metricName][fullName].layout.name = charts[metricName][fullName].layout.name ? `${charts[metricName][fullName].layout.name} - ${experiment}` : fullName; charts[metricName][fullName].layout.barmode = isMultipleTasks ? 'group' : 'stack'; } return charts; @@ -349,3 +360,13 @@ export const chooseTimeUnit = (data) => { const lastIndex = timesConst.length - 1; return {time: timesConst[lastIndex] * 1000, str: timeStringPlural[lastIndex]}; }; + +const tryParseJson = (plotString: string): { data: any; layout: any; config?: any } => { + let parsed: { data: any; layout: any; config?: any }; + try { + parsed = JSON.parse(plotString); + } catch (e) { + parsed = {data: [], layout: {title: 'Unknown data'}}; + } + return parsed; +}; diff --git a/src/app/webapp-common/workers-and-queues/actions/queues.actions.ts b/src/app/webapp-common/workers-and-queues/actions/queues.actions.ts index 7801f17e..42097721 100644 --- a/src/app/webapp-common/workers-and-queues/actions/queues.actions.ts +++ b/src/app/webapp-common/workers-and-queues/actions/queues.actions.ts @@ -1,5 +1,5 @@ import {createAction, props} from '@ngrx/store'; -import {Queue} from '../../../business-logic/model/queues/queue'; +import {Queue} from '~/business-logic/model/queues/queue'; import {Topic} from '../../shared/utils/statistics'; import {SortMeta} from 'primeng/api'; @@ -16,7 +16,6 @@ export const REMOVE_EXPERIMENT_FROM_QUEUE = queuesPrefix + 'REMOVE_EXPERIMENT_FR export const MOVE_EXPERIMENT_TO_OTHER_QUEUE = queuesPrefix + 'MOVE_EXPERIMENT_TO_OTHER_QUEUE'; export const ADD_EXPERIMENT_TO_QUEUE = queuesPrefix + 'ADD_EXPERIMENT_TO_QUEUE'; export const SET_SELECTED_QUEUE = queuesPrefix + 'SET_SELECTED_QUEUE'; -export const QUEUES_TABLE_SORT_CHANGED = queuesPrefix + 'QUEUES_TABLE_SORT_CHANGED'; export const QUEUES_TABLE_SET_SORT = queuesPrefix + 'QUEUES_TABLE_SET_SORT'; export const CLEAR_QUEUE = queuesPrefix + 'CLEAR_QUEUE'; export const REFRESH_SELECTED_QUEUE = queuesPrefix + 'REFRESH_SELECTED_QUEUE'; @@ -35,7 +34,7 @@ export const setQueues = createAction( ); export const queuesTableSortChanged = createAction( - QUEUES_TABLE_SORT_CHANGED, + queuesPrefix + 'QUEUES_TABLE_SORT_CHANGED', props<{ colId: string; isShift: boolean }>() ); diff --git a/src/app/webapp-common/workers-and-queues/dumb/queue-info/queue-info.component.html b/src/app/webapp-common/workers-and-queues/dumb/queue-info/queue-info.component.html index 149b2073..fe58bddf 100644 --- a/src/app/webapp-common/workers-and-queues/dumb/queue-info/queue-info.component.html +++ b/src/app/webapp-common/workers-and-queues/dumb/queue-info/queue-info.component.html @@ -53,23 +53,22 @@ + iconClass="al-icon al-ico-arrow-to-top al-color light-periwinkle-two"> + iconClass="al-icon al-ico-arrow-to-bottom al-color light-periwinkle-two"> + iconClass="al-icon al-ico-arrow-from-left al-color light-periwinkle-two"> + iconClass="al-icon al-ico-trash"> diff --git a/src/app/webapp-common/workers-and-queues/dumb/queues-table/queues-table.component.ts b/src/app/webapp-common/workers-and-queues/dumb/queues-table/queues-table.component.ts index 2abb86b4..33efa211 100644 --- a/src/app/webapp-common/workers-and-queues/dumb/queues-table/queues-table.component.ts +++ b/src/app/webapp-common/workers-and-queues/dumb/queues-table/queues-table.component.ts @@ -55,6 +55,13 @@ export class QueuesTableComponent extends BaseTableView { style: {width: '35%'}, sortable: true, }, + { + id: QUEUES_TABLE_COL_FIELDS.WORKERS, + headerType: ColHeaderTypeEnum.sortFilter, + header: 'WORKERS', + style: {width: '80px'}, + sortable: true, + }, { id: QUEUES_TABLE_COL_FIELDS.TASK, headerType: ColHeaderTypeEnum.sortFilter, diff --git a/src/app/webapp-common/workers-and-queues/effects/queues.effects.ts b/src/app/webapp-common/workers-and-queues/effects/queues.effects.ts index 7aff049f..608c16c9 100644 --- a/src/app/webapp-common/workers-and-queues/effects/queues.effects.ts +++ b/src/app/webapp-common/workers-and-queues/effects/queues.effects.ts @@ -2,11 +2,12 @@ import {Injectable} from '@angular/core'; import {catchError, filter, map, mergeMap, switchMap, tap, withLatestFrom} from 'rxjs/operators'; import {Store} from '@ngrx/store'; import {Actions, createEffect, ofType} from '@ngrx/effects'; -import {ApiQueuesService} from '../../../business-logic/api-services/queues.service'; -import {QueuesGetQueueMetricsRequest} from '../../../business-logic/model/queues/queuesGetQueueMetricsRequest'; -import {QueuesGetQueueMetricsResponse} from '../../../business-logic/model/queues/queuesGetQueueMetricsResponse'; -import {Queue} from '../../../business-logic/model/queues/queue'; +import {ApiQueuesService} from '~/business-logic/api-services/queues.service'; +import {QueuesGetQueueMetricsRequest} from '~/business-logic/model/queues/queuesGetQueueMetricsRequest'; +import {QueuesGetQueueMetricsResponse} from '~/business-logic/model/queues/queuesGetQueueMetricsResponse'; +import {Queue} from '~/business-logic/model/queues/queue'; import { + selectQueues, selectQueuesStatsTimeFrame, selectQueuesTableSortFields, selectQueueStats, selectSelectedQueue @@ -33,14 +34,15 @@ import { setStats, clearQueue } from '../actions/queues.actions'; -import {EmptyAction, MESSAGES_SEVERITY} from '../../../app.constants'; -import {QueueMetrics} from '../../../business-logic/model/queues/queueMetrics'; -import {ApiTasksService} from '../../../business-logic/api-services/tasks.service'; -import {cloneDeep, orderBy} from 'lodash/fp'; +import {EmptyAction, MESSAGES_SEVERITY} from '~/app.constants'; +import {QueueMetrics} from '~/business-logic/model/queues/queueMetrics'; +import {ApiTasksService} from '~/business-logic/api-services/tasks.service'; +import {cloneDeep} from 'lodash/fp'; import {addFullRangeMarkers, addStats, removeFullRangeMarkers} from '../../shared/utils/statistics'; import {hideNoStatsNotice, showStatsErrorNotice} from '../actions/stats.actions'; import {encodeOrder} from '../../shared/utils/tableParamEncode'; import {addMultipleSortColumns} from '../../shared/utils/shared-utils'; +import {sortTable} from '@common/workers-and-queues/workers-and-queues.utils'; @Injectable() export class QueuesEffect { @@ -56,7 +58,7 @@ export class QueuesEffect { )); getQueues = createEffect(() => this.actions.pipe( - ofType(getQueues, queuesTableSetSort), + ofType(getQueues), withLatestFrom( this.store.select(selectQueuesTableSortFields)), switchMap(([action, orderFields]) => this.queuesApi.queuesGetAllEx({ @@ -65,11 +67,23 @@ export class QueuesEffect { order_by: encodeOrder(orderFields) /* eslint-enable @typescript-eslint/naming-convention */ }).pipe( - mergeMap(res => [setQueues({queues: this.sortQueues(orderFields, res.queues)}), deactivateLoader(action.type)]), + mergeMap(res => [setQueues({queues: sortTable(orderFields, res.queues)}), deactivateLoader(action.type)]), catchError(err => [deactivateLoader(action.type), requestFailed(err)]) )) )); + setQueuesSort = createEffect(() => this.actions.pipe( + ofType(queuesTableSetSort), + withLatestFrom( + this.store.select(selectQueuesTableSortFields), + this.store.select(selectQueues) + ), + switchMap(([action, orderFields, queues]) => + [setQueues({queues: sortTable(orderFields, queues)}), deactivateLoader(action.type)] + ), + catchError(err => [deactivateLoader(queuesTableSetSort.type), requestFailed(err)]) + )); + getSelectedQueue = createEffect(() => this.actions.pipe( ofType(setSelectedQueue), filter(action => !!action.queue), @@ -118,7 +132,7 @@ export class QueuesEffect { ofType(clearQueue), switchMap(action => this.tasksApi.tasksDequeueMany({ids: action.queue.entries.map(ent => ent.task?.id)}).pipe( withLatestFrom(this.store.select(selectSelectedQueue)), - mergeMap(([res,selectedQueue]) => [ + mergeMap(([, selectedQueue]) => [ getQueues(), selectedQueue ? refreshSelectedQueue() : new EmptyAction(), deactivateLoader(action.type) @@ -287,10 +301,4 @@ export class QueuesEffect { return [queuesTableSetSort({orders})]; }) )); - - private sortQueues(sortFields, queues): Queue[] { - const srtByFields = sortFields.map(f => f.field); - const srtByOrders = sortFields.map(f => f.order > 0 ? 'asc' : 'desc'); - return orderBy(srtByFields, srtByOrders, queues) as any; - } } diff --git a/src/app/webapp-common/workers-and-queues/effects/workers.effects.ts b/src/app/webapp-common/workers-and-queues/effects/workers.effects.ts index 65268782..d8969ea1 100644 --- a/src/app/webapp-common/workers-and-queues/effects/workers.effects.ts +++ b/src/app/webapp-common/workers-and-queues/effects/workers.effects.ts @@ -3,22 +3,20 @@ import {Actions, createEffect, ofType} from '@ngrx/effects'; import {Action, Store} from '@ngrx/store'; import {castArray, cloneDeep} from 'lodash/fp'; import {catchError, mergeMap, switchMap, withLatestFrom} from 'rxjs/operators'; -import {MESSAGES_SEVERITY} from '../../../app.constants'; -import {ApiWorkersService} from '../../../business-logic/api-services/workers.service'; -import {Worker} from '../../../business-logic/model/workers/worker'; +import {MESSAGES_SEVERITY} from '~/app.constants'; +import {ApiWorkersService} from '~/business-logic/api-services/workers.service'; import {WORKER_STATS_PARAM_INFO} from '../workers-and-queues.consts'; -import {WorkersGetActivityReportRequest} from '../../../business-logic/model/workers/workersGetActivityReportRequest'; -import {WorkersGetActivityReportResponse} from '../../../business-logic/model/workers/workersGetActivityReportResponse'; -import {WorkersGetStatsRequest} from '../../../business-logic/model/workers/workersGetStatsRequest'; +import {WorkersGetActivityReportRequest} from '~/business-logic/model/workers/workersGetActivityReportRequest'; +import {WorkersGetActivityReportResponse} from '~/business-logic/model/workers/workersGetActivityReportResponse'; +import {WorkersGetStatsRequest} from '~/business-logic/model/workers/workersGetStatsRequest'; import {requestFailed} from '../../core/actions/http.actions'; import {addMessage, deactivateLoader} from '../../core/actions/layout.actions'; import * as workersActions from '../actions/workers.actions'; import {selectSelectedWorker, selectStats, selectStatsParams, selectStatsTimeFrame, selectWorkers, selectWorkersTableSortFields} from '../reducers/index.reducer'; -import {orderBy} from 'lodash/fp'; import {addFullRangeMarkers, addStats, getLastTimestamp, removeFullRangeMarkers} from '../../shared/utils/statistics'; import {showStatsErrorNotice, hideNoStatsNotice} from '../actions/stats.actions'; import {addMultipleSortColumns} from '../../shared/utils/shared-utils'; -import {WorkerExt} from '../actions/workers.actions'; +import {transformAndSortWorkers} from '@common/workers-and-queues/workers-and-queues.utils'; const prepareStatsQuery = (entitie: string, keys: { key: string }[], range: number, granularity: number): WorkersGetStatsRequest => { const now = Math.floor((new Date()).getTime() / 1000); @@ -49,7 +47,7 @@ export class WorkersEffects { ), switchMap(([action, selectedWorker, sortFields]) => this.workersApi.workersGetAll({}).pipe( mergeMap(res => { - const workers = this.transformAndSortWorkers(sortFields, res.workers); + const workers = transformAndSortWorkers(sortFields, res.workers); const actionsToFire = [ workersActions.setWorkers({workers}), deactivateLoader(action.type)] as Action[]; @@ -72,7 +70,7 @@ export class WorkersEffects { this.store.select(selectWorkersTableSortFields), this.store.select(selectWorkers) ), - mergeMap(([, sortFields, workers]) => [workersActions.setWorkers({workers: this.transformAndSortWorkers(sortFields, workers)})]), + mergeMap(([, sortFields, workers]) => [workersActions.setWorkers({workers: transformAndSortWorkers(sortFields, workers)})]), )); getStats$ = createEffect(() => this.actions.pipe( @@ -172,11 +170,4 @@ export class WorkersEffects { return [workersActions.workersTableSetSort({orders})]; }) )); - - private transformAndSortWorkers(sortFields, workers: Worker[]): WorkerExt[] { - workers = workers.map(worker => ({...worker, id: worker.key || worker.id, name: worker.id})); - const srtByFields = sortFields.map(f => f.field); - const srtByOrders = sortFields.map(f => f.order > 0 ? 'asc' : 'desc'); - return orderBy(srtByFields, srtByOrders, workers) as any; - } } diff --git a/src/app/webapp-common/workers-and-queues/workers-and-queues.consts.ts b/src/app/webapp-common/workers-and-queues/workers-and-queues.consts.ts index 3cd050fc..139b6beb 100644 --- a/src/app/webapp-common/workers-and-queues/workers-and-queues.consts.ts +++ b/src/app/webapp-common/workers-and-queues/workers-and-queues.consts.ts @@ -5,7 +5,8 @@ export const QUEUES_TABLE_COL_FIELDS = { QUEUED : 'status_changed', TASK : 'entries[0].task.name', IN_QUEUE : 'entries.length', - LAST_UPDATED: 'last_update' + LAST_UPDATED: 'last_update', + WORKERS : 'workers.length' }; export const WORKERS_TABLE_COL_FIELDS = { diff --git a/src/app/webapp-common/workers-and-queues/workers-and-queues.utils.ts b/src/app/webapp-common/workers-and-queues/workers-and-queues.utils.ts new file mode 100644 index 00000000..19338110 --- /dev/null +++ b/src/app/webapp-common/workers-and-queues/workers-and-queues.utils.ts @@ -0,0 +1,15 @@ +import {orderBy} from 'lodash/fp'; +import {Worker} from '~/business-logic/model/workers/worker'; +import {WorkerExt} from '@common/workers-and-queues/actions/workers.actions'; +import {SortMeta} from 'primeng/api'; + +export const sortTable = (sortFields: SortMeta[], entities: T[]): T[] => { + const srtByFields = sortFields.map(f => f.field); + const srtByOrders = sortFields.map(f => f.order > 0 ? 'asc' : 'desc'); + return orderBy(srtByFields, srtByOrders)(entities); +}; + +export const transformAndSortWorkers = (sortFields, workers: Worker[]): WorkerExt[] => { + return sortTable(sortFields, workers.map(worker => ({...worker, id: worker.key || worker.id, name: worker.id}))); +} + diff --git a/src/assets/version.json b/src/assets/version.json index eac682ba..25a66f07 100644 --- a/src/assets/version.json +++ b/src/assets/version.json @@ -1,5 +1,5 @@ { - "version": "1.4.0-000", + "version": "1.5.0-000", "trains-server-treeish": "master", "trains-server-commit": "master", "webapp-treeish": "master", diff --git a/src/environments/base.ts b/src/environments/base.ts index 2f3eb8e2..b57b3a17 100644 --- a/src/environments/base.ts +++ b/src/environments/base.ts @@ -23,6 +23,7 @@ export interface Environment { production: boolean; apiBaseUrl: string; fileBaseUrl: string; + displayedServerUrls?: {apiServer?: string, filesServer?: string}; productName: string; demo: boolean; headerPrefix: string; diff --git a/src/environments/environment.demo.ts b/src/environments/environment.demo.ts deleted file mode 100644 index 7a3cd647..00000000 --- a/src/environments/environment.demo.ts +++ /dev/null @@ -1,10 +0,0 @@ -import {BASE_ENV} from './base'; - -export let environment = { - ...BASE_ENV, - production: true, - loginNotice: 'Enter name to access TRAINS demo server', - demo: true, - autoLogin: true, - loginBanner: 'This is a demo server. Any experiment you connect can be viewed by anyone. The server will reset every week on Sunday night (midnight PST), at which time all user data will be deleted. Running experiments may not be logged.' -}; diff --git a/src/environments/environment.dev.ts b/src/environments/environment.dev.ts deleted file mode 100644 index d39cabca..00000000 --- a/src/environments/environment.dev.ts +++ /dev/null @@ -1,8 +0,0 @@ -import {BASE_ENV} from './base'; - -export let environment = { - ...BASE_ENV, - production : true, - apiBaseUrl: 'api' -}; - diff --git a/src/index.html b/src/index.html index 79006bcc..a307916d 100644 --- a/src/index.html +++ b/src/index.html @@ -1,6 +1,5 @@ - ClearML @@ -12,7 +11,7 @@ var global = window; } - + diff --git a/src/version.json b/src/version.json index 3afcb7a8..25a66f07 100644 --- a/src/version.json +++ b/src/version.json @@ -1,10 +1,10 @@ { - "version": "1.4.0-000", + "version": "1.5.0-000", "trains-server-treeish": "master", "trains-server-commit": "master", "webapp-treeish": "master", "webapp-commit": "master", "webapp-common-treeish": "master", "webapp-common-commit": "master", - "date": "Sun Mar 6 12:44:21 UTC 2022" + "date": "Sun Mar 16 12:44:21 UTC 2022" }